commit: 6d37c7d61114da9b668fdad400c48dc7c737732c
parent 5e3962357625458ab6fef8f4f2eed510369a8411
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date: Tue, 8 Jun 2021 04:45:51 +0200
xcd: Add ability to read files
Diffstat:
3 files changed, 59 insertions(+), 9 deletions(-)
diff --git a/bin/xcd.c b/bin/xcd.c
@@ -4,10 +4,11 @@
#define _POSIX_C_SOURCE 200809L
#include <ctype.h> /* isprint() */
+#include <errno.h> /* errno */
#include <math.h> /* sin() */
#include <stdint.h> /* uint8_t */
-#include <stdio.h> /* printf(), fread() */
-#include <string.h> /* memset() */
+#include <stdio.h> /* printf(), fread(), fopen(), fclose() */
+#include <string.h> /* memset(), strerror() */
#define LANODAN_XCD_RESET printf("[0m[48;2;0;0;0m");
@@ -55,7 +56,7 @@ print_plain_rgb(unsigned char *line, size_t len)
for(size_t i = 0; i < len; i++)
{
- c = line[i];
+ c = line[i];
struct rgb color = rgb_char(c);
printf("[38;2;%d;%d;%dm%c", color.red, color.green, color.blue, isprint(c) ? c : '.');
}
@@ -67,13 +68,14 @@ print_plain_rgb(unsigned char *line, size_t len)
#define WIDTH 16
int
-main(void)
+concat(FILE *stream)
{
- int cols = 0;
+ int cols = 0;
char line[WIDTH];
unsigned char c;
unsigned int bytes = 0;
struct rgb pos_rgb;
+ errno = 0;
memset(&line, 0, WIDTH);
@@ -81,7 +83,7 @@ main(void)
pos_rgb = rgb_char(bytes);
printf("[38;2;%d;%d;%dm%06x ", pos_rgb.red, pos_rgb.green, pos_rgb.blue, bytes);
- while(fread(&c, 1, 1, stdin) > 0)
+ while(fread(&c, 1, 1, stream) > 0)
{
if(cols >= WIDTH)
{
@@ -102,7 +104,7 @@ main(void)
}
// Fill the rest of the hex space with spaces
- for(;cols < WIDTH; cols++)
+ for(; cols < WIDTH; cols++)
printf(" ");
LANODAN_XCD_RESET
@@ -114,3 +116,45 @@ main(void)
return 0;
}
+
+int
+main(int argc, char *argv[])
+{
+ int err = 0;
+
+ if(argc <= 1)
+ {
+ err += concat(stdin);
+ }
+ else
+ {
+ for(int argi = 1; err == 0, argi < argc; argi++)
+ {
+ if(strncmp(argv[argi], "-", 2) == 0)
+ {
+ err += concat(stdin);
+ }
+ else
+ {
+ FILE *file = fopen(argv[argi], "r");
+ if(!file)
+ {
+ printf("\n[0mError opening ā%sā: %s\n", argv[argi], strerror(errno));
+ }
+ else
+ {
+ err += concat(file);
+
+ if((err += fclose(file)) != 0)
+ {
+ printf("\n[0mError closing ā%sā: %s\n", argv[argi], strerror(errno));
+ }
+ }
+ }
+ }
+ }
+
+ printf("[0m");
+
+ return err;
+}
diff --git a/test-bin/xcd b/test-bin/xcd
@@ -1,4 +1,9 @@
#!/usr/bin/env atf-sh
+atf_test_case openfile
+openfile_body() {
+ atf_check -o file:xcd_all_bytes.fixture ../bin/xcd all_bytes
+}
+
atf_test_case stdinput
stdinput_body() {
atf_check -o file:xcd_all_bytes.fixture ../bin/xcd <all_bytes
@@ -6,5 +11,6 @@ stdinput_body() {
atf_init_test_cases() {
cd "$(atf_get_srcdir)"
+ atf_add_test_case openfile
atf_add_test_case stdinput
}
diff --git a/test-bin/xcd_all_bytes.fixture b/test-bin/xcd_all_bytes.fixture
@@ -15,4 +15,4 @@
[38;2;29;108;246m0000e0 [38;2;29;108;246me0 [38;2;27;110;245me1 [38;2;26;112;244me2 [38;2;25;114;243me3 [38;2;23;117;242me4 [38;2;22;119;241me5 [38;2;21;121;240me6 [38;2;20;124;239me7 [38;2;18;126;238me8 [38;2;17;128;237me9 [38;2;16;130;236mea [38;2;15;133;235meb [38;2;14;135;234mec [38;2;13;137;232med [38;2;12;140;231mee [38;2;11;142;230mef [0m[48;2;0;0;0m >[38;2;29;108;246m.[38;2;27;110;245m.[38;2;26;112;244m.[38;2;25;114;243m.[38;2;23;117;242m.[38;2;22;119;241m.[38;2;21;121;240m.[38;2;20;124;239m.[38;2;18;126;238m.[38;2;17;128;237m.[38;2;16;130;236m.[38;2;15;133;235m.[38;2;14;135;234m.[38;2;13;137;232m.[38;2;12;140;231m.[38;2;11;142;230m.[0m[48;2;0;0;0m<
[38;2;10;144;228m0000f0 [38;2;10;144;228mf0 [38;2;9;146;227mf1 [38;2;8;149;225mf2 [38;2;8;151;224mf3 [38;2;7;153;222mf4 [38;2;6;155;221mf5 [38;2;6;158;219mf6 [38;2;5;160;218mf7 [38;2;4;162;216mf8 [38;2;4;164;214mf9 [38;2;3;166;213mfa [38;2;3;169;211mfb [38;2;2;171;209mfc [38;2;2;173;208mfd [38;2;2;175;206mfe [38;2;1;177;204mff [0m[48;2;0;0;0m[0m[48;2;0;0;0m >[38;2;10;144;228m.[38;2;9;146;227m.[38;2;8;149;225m.[38;2;8;151;224m.[38;2;7;153;222m.[38;2;6;155;221m.[38;2;6;158;219m.[38;2;5;160;218m.[38;2;4;162;216m.[38;2;4;164;214m.[38;2;3;166;213m.[38;2;3;169;211m.[38;2;2;171;209m.[38;2;2;173;208m.[38;2;2;175;206m.[38;2;1;177;204m.[0m[48;2;0;0;0m<
[38;2;64;64;64m000100
-[0m[48;2;0;0;0m-
\ No newline at end of file
+[0m[48;2;0;0;0m[0m+
\ No newline at end of file