From 0383d9494ff83bb41fb953f5c1f1a8000d414c73 Mon Sep 17 00:00:00 2001 From: cozis Date: Thu, 5 May 2022 18:36:36 +0200 Subject: [PATCH] cleaned up the cli --- BUGS | 1 + README.md | 2 +- cli.c | 145 +++++++++++++++++++++++++++++++++++++++++------------- example.c | 6 ++- style.css | 15 ++++-- 5 files changed, 128 insertions(+), 41 deletions(-) create mode 100644 BUGS diff --git a/BUGS b/BUGS new file mode 100644 index 0000000..df777bb --- /dev/null +++ b/BUGS @@ -0,0 +1 @@ +- Newlines in multi-line comments arent converted into
s \ No newline at end of file diff --git a/README.md b/README.md index 2d64c3b..b24a291 100644 --- a/README.md +++ b/README.md @@ -66,4 +66,4 @@ if `table_mode` were `1`, then the output would have been: ``` the color doesn't come with the generated HTML, you need to add it yourself using CSS. There's an example CSS style provided in `style.css`, inspired by the Sublime Text color theme I use. -Since the generated class names of the HTML tags are pretty generic (`identifier`, `operator`, `comment`, ..), you can specify a prefix to be prepented to these names. \ No newline at end of file +Since the generated class names of the HTML tags are pretty generic (`identifier`, `operator`, `comment`, ..) they may conflict with your own CSS code. To avoid this problem you can specify a prefix to be prepented to these names. The command-line interface `c2h` uses the `c2h-` previx. diff --git a/cli.c b/cli.c index dbd6cf4..04aac38 100644 --- a/cli.c +++ b/cli.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -29,45 +30,119 @@ static char *load_file(const char *file, long *size) return data; } +static int fileconv(const char *input_file, const char *output_file, + const char *style_file, const char *prefix, bool notable) +{ + if(input_file == NULL || output_file == NULL) { + fprintf(stderr, + "Error: You must specify both input and output " + "files using the --input and --output options\n"); + return -1; + } + + /* Load the input string */ + long input_size; + char *input = load_file(input_file, &input_size); + if(input == NULL) { + fprintf(stderr, "Error: Failed to open file %s\n", input_file); + return -1; + } + + /* Convert it */ + const char *error; + char *output = c2html(input, input_size, + !notable, prefix, &error); + if(output == NULL) { + fprintf(stderr, "Error: %s\n", error); + free(input); + return -1; + } + + /* Open the output file */ + FILE *fp = fopen(output_file, "wb"); + if(fp == NULL) { + fprintf(stderr, "ERROR: Failed to write to file %s\n", + output_file); + free(output); + free(input); + return -1; + } + + if(style_file != NULL) { + char *style_data = load_file(style_file, NULL); + if(style_data == NULL) { + fprintf(stderr, "Error: Failed to open file %s\n", + style_file); + free(output); + free(input); + return -1; + } + fputs("", fp); + free(style_data); + } + + /* ..and write the converted string to it */ + fwrite(output, 1, strlen(output), fp); + fclose(fp); + fprintf(stderr, "OK\n"); + + /* All done! :^) */ + free(output); + free(input); + return 0; +} + int main(int argc, char **argv) { - if(argc < 3) { - fprintf(stderr, "ERROR: Missing input and output file\n"); - return -1; - } - char *src_file = argv[1]; - char *dst_file = argv[2]; - long src_size; - char *src_data = load_file(src_file, &src_size); - - if(src_data == NULL) { - fprintf(stderr, "ERROR: Failed to open \"%s\"\n", src_file); - return -1; - } - - _Bool table_mode = 0; - const char *class_prefix = "c2h-"; - - const char *error; - char *dst_data = c2html(src_data, src_size, table_mode, class_prefix, &error); - - if(dst_data == NULL) - fprintf(stderr, "ERROR: %s\n", error); - else { - - FILE *fp = fopen(dst_file, "wb"); - if(fp == NULL) - fprintf(stderr, "ERROR: Failed to open \"%s\"\n", dst_file); - else { - fwrite(dst_data, 1, strlen(dst_data), fp); - fclose(fp); - fprintf(stderr, "OK\n"); + /* Parse command-line arguments */ + char *input_file = NULL, + *output_file = NULL, + *style_file = NULL, + *prefix = NULL; + bool notable = 0; + bool http = 0; + for(int i = 1; i < argc; i += 1) { + if(!strcmp(argv[i], "-i") || !strcmp(argv[i], "--input")) { + i += 1; + if(i == argc || argv[i][0] == '-') { + fprintf(stderr, "Error: Missing argument after %s\n", argv[i-1]); + return -1; + } + input_file = argv[i]; + } else if(!strcmp(argv[i], "-o") || !strcmp(argv[i], "--output")) { + i += 1; + if(i == argc || argv[i][0] == '-') { + fprintf(stderr, "Error: Missing argument after %s\n", argv[i-1]); + return -1; + } + output_file = argv[i]; + } else if(!strcmp(argv[i], "-p") || !strcmp(argv[i], "--prefix")) { + i += 1; + if(i == argc || argv[i][0] == '-') { + fprintf(stderr, "Error: Missing argument after %s\n", argv[i-1]); + return -1; + } + prefix = argv[i]; + } else if(!strcmp(argv[i], "--no-table")) { + notable = 1; + } else if(!strcmp(argv[i], "--style")) { + i += 1; + if(i == argc || argv[i][0] == '-') { + fprintf(stderr, "Error: Missing argument after %s\n", argv[i-1]); + return -1; + } + style_file = argv[i]; + } else if(!strcmp(argv[i], "--http")) { + http = 1; + } else { + fprintf(stderr, "Error: Unknown option %s\n", argv[i]); + return -1; } - - free(dst_data); } - free(src_data); - return 0; + return fileconv(input_file, output_file, + style_file, prefix, notable); } \ No newline at end of file diff --git a/example.c b/example.c index c3e8c3e..6fb86be 100644 --- a/example.c +++ b/example.c @@ -22,7 +22,11 @@ int main() "}\n"; char *html = c2html(c, strlen(c), table_mode, prefix, NULL); + + /* .. check for errors .. */ + printf("%s\n", html); + free(html); return 0; -} \ No newline at end of file +} diff --git a/style.css b/style.css index 7f09964..e9a4421 100644 --- a/style.css +++ b/style.css @@ -1,13 +1,18 @@ + div.c2h-main { + } + div.c2h-code { - max-height: 80vh; - margin: 50px; + max-height: 600px; + + padding: 10px; border-radius: 3px; - color: white; + font-family: monospace; font-size: 16px; + + color: white; background: hsl(210, 15%, 22%); - padding: 10px; } div.c2h-code-inner::-webkit-scrollbar { @@ -21,6 +26,7 @@ div.c2h-code-inner { overflow: auto; + height: inherit; max-height: inherit; scrollbar-color: hsla(210, 13%, 40%, 0.7) transparent; } @@ -32,6 +38,7 @@ div.c2h-code table td { color: white; + vertical-align: top; } div.c2h-code table td:first-child {