20809b08ce 2019-12-01 rkeene: #include <string.h>
20809b08ce 2019-12-01 rkeene: #include <stdio.h>
20809b08ce 2019-12-01 rkeene: #include <ctype.h>
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: struct options {
20809b08ce 2019-12-01 rkeene: char *name;
20809b08ce 2019-12-01 rkeene: char *directory;
20809b08ce 2019-12-01 rkeene: };
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: enum xvfs_minirivet_mode {
20809b08ce 2019-12-01 rkeene: XVFS_MINIRIVET_MODE_COPY,
20809b08ce 2019-12-01 rkeene: XVFS_MINIRIVET_MODE_TCL,
20809b08ce 2019-12-01 rkeene: XVFS_MINIRIVET_MODE_TCL_PRINT
20809b08ce 2019-12-01 rkeene: };
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: static int parse_options(int argc, char **argv, struct options *options) {
20809b08ce 2019-12-01 rkeene: char *arg;
20809b08ce 2019-12-01 rkeene: char **option;
20809b08ce 2019-12-01 rkeene: int idx;
20809b08ce 2019-12-01 rkeene: int retval;
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: for (idx = 0; idx < argc; idx++) {
20809b08ce 2019-12-01 rkeene: arg = argv[idx];
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: if (strcmp(arg, "--directory") == 0) {
20809b08ce 2019-12-01 rkeene: option = &options->directory;
20809b08ce 2019-12-01 rkeene: } else if (strcmp(arg, "--name") == 0) {
20809b08ce 2019-12-01 rkeene: option = &options->name;
20809b08ce 2019-12-01 rkeene: } else {
20809b08ce 2019-12-01 rkeene: fprintf(stderr, "Invalid argument %s\n", arg);
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: return(0);
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: idx++;
20809b08ce 2019-12-01 rkeene: arg = argv[idx];
20809b08ce 2019-12-01 rkeene: *option = arg;
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: retval = 1;
20809b08ce 2019-12-01 rkeene: if (!options->directory) {
20809b08ce 2019-12-01 rkeene: fprintf(stderr, "error: --directory must be specified\n");
20809b08ce 2019-12-01 rkeene: retval = 0;
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: if (!options->name) {
20809b08ce 2019-12-01 rkeene: fprintf(stderr, "error: --name must be specified\n");
20809b08ce 2019-12-01 rkeene: retval = 0;
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: return(retval);
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: static void parse_xvfs_minirivet_directory(FILE *outfp, const char * const directory) {
20809b08ce 2019-12-01 rkeene: fprintf(outfp, "\t...\n");
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: static int parse_xvfs_minirivet(FILE *outfp, const char * const file, const char * const name, const char * const directory) {
20809b08ce 2019-12-01 rkeene: FILE *fp;
20809b08ce 2019-12-01 rkeene: int ch, ch_buf[3];
20809b08ce 2019-12-01 rkeene: char tcl_buffer[8192], *tcl_buffer_p, *tcl_buffer_e;
20809b08ce 2019-12-01 rkeene: enum xvfs_minirivet_mode mode;
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: fp = fopen(file, "r");
20809b08ce 2019-12-01 rkeene: if (!fp) {
20809b08ce 2019-12-01 rkeene: return(0);
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: #define parse_xvfs_minirivet_getbyte(var) var = fgetc(fp); if (var == EOF) { break; }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: mode = XVFS_MINIRIVET_MODE_COPY;
20809b08ce 2019-12-01 rkeene: while (1) {
20809b08ce 2019-12-01 rkeene: parse_xvfs_minirivet_getbyte(ch);
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: switch (mode) {
20809b08ce 2019-12-01 rkeene: case XVFS_MINIRIVET_MODE_COPY:
20809b08ce 2019-12-01 rkeene: if (ch == '<') {
20809b08ce 2019-12-01 rkeene: parse_xvfs_minirivet_getbyte(ch_buf[0]);
20809b08ce 2019-12-01 rkeene: if (ch_buf[0] != '?') {
20809b08ce 2019-12-01 rkeene: fputc('<', outfp);
20809b08ce 2019-12-01 rkeene: ch = ch_buf[0];
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: break;
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: tcl_buffer_p = tcl_buffer;
20809b08ce 2019-12-01 rkeene: parse_xvfs_minirivet_getbyte(ch_buf[0]);
20809b08ce 2019-12-01 rkeene: if (ch_buf[0] == '=') {
20809b08ce 2019-12-01 rkeene: mode = XVFS_MINIRIVET_MODE_TCL_PRINT;
20809b08ce 2019-12-01 rkeene: } else {
20809b08ce 2019-12-01 rkeene: mode = XVFS_MINIRIVET_MODE_TCL;
20809b08ce 2019-12-01 rkeene: *tcl_buffer_p = ch_buf[0];
20809b08ce 2019-12-01 rkeene: tcl_buffer_p++;
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene: *tcl_buffer_p = '\0';
20809b08ce 2019-12-01 rkeene: continue;
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene: break;
20809b08ce 2019-12-01 rkeene: case XVFS_MINIRIVET_MODE_TCL:
20809b08ce 2019-12-01 rkeene: case XVFS_MINIRIVET_MODE_TCL_PRINT:
20809b08ce 2019-12-01 rkeene: if (ch == '?') {
20809b08ce 2019-12-01 rkeene: parse_xvfs_minirivet_getbyte(ch_buf[0]);
20809b08ce 2019-12-01 rkeene: if (ch_buf[0] != '>') {
20809b08ce 2019-12-01 rkeene: *tcl_buffer_p = ch;
20809b08ce 2019-12-01 rkeene: tcl_buffer_p++;
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: ch = ch_buf[0];
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: break;
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: *tcl_buffer_p = '\0';
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: if (mode == XVFS_MINIRIVET_MODE_TCL_PRINT) {
20809b08ce 2019-12-01 rkeene: tcl_buffer_p = tcl_buffer;
20809b08ce 2019-12-01 rkeene: while (*tcl_buffer_p && isspace(*tcl_buffer_p)) {
20809b08ce 2019-12-01 rkeene: tcl_buffer_p++;
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene: tcl_buffer_e = tcl_buffer_p + strlen(tcl_buffer_p) - 1;
20809b08ce 2019-12-01 rkeene: while (tcl_buffer_e >= tcl_buffer_p && isspace(*tcl_buffer_e)) {
20809b08ce 2019-12-01 rkeene: *tcl_buffer_e = '\0';
20809b08ce 2019-12-01 rkeene: tcl_buffer_e--;
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: if (strcmp(tcl_buffer_p, "$::xvfs::fsName") == 0) {
20809b08ce 2019-12-01 rkeene: fprintf(outfp, name);
20809b08ce 2019-12-01 rkeene: } else if (strcmp(tcl_buffer_p, "$::xvfs::fileInfoStruct") == 0) {
20809b08ce 2019-12-01 rkeene: fprintf(outfp, "static const struct xvfs_file_data xvfs_");
20809b08ce 2019-12-01 rkeene: fprintf(outfp, name);
20809b08ce 2019-12-01 rkeene: fprintf(outfp, "_data[] = {\n");
20809b08ce 2019-12-01 rkeene: parse_xvfs_minirivet_directory(outfp, directory);
20809b08ce 2019-12-01 rkeene: fprintf(outfp, "};\n");
20809b08ce 2019-12-01 rkeene: } else if (strcmp(tcl_buffer_p, "[zlib adler32 $::xvfs::fsName]") == 0) {
20809b08ce 2019-12-01 rkeene: fprintf(outfp, "0");
20809b08ce 2019-12-01 rkeene: } else {
20809b08ce 2019-12-01 rkeene: fprintf(outfp, "@INVALID@%s@INVALID@", tcl_buffer_p);
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: mode = XVFS_MINIRIVET_MODE_COPY;
20809b08ce 2019-12-01 rkeene: continue;
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene: break;
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: switch (mode) {
20809b08ce 2019-12-01 rkeene: case XVFS_MINIRIVET_MODE_COPY:
20809b08ce 2019-12-01 rkeene: fputc(ch, outfp);
20809b08ce 2019-12-01 rkeene: break;
20809b08ce 2019-12-01 rkeene: case XVFS_MINIRIVET_MODE_TCL:
20809b08ce 2019-12-01 rkeene: case XVFS_MINIRIVET_MODE_TCL_PRINT:
20809b08ce 2019-12-01 rkeene: *tcl_buffer_p = ch;
20809b08ce 2019-12-01 rkeene: tcl_buffer_p++;
20809b08ce 2019-12-01 rkeene: break;
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: #undef parse_xvfs_minirivet_getbyte
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: return(1);
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: static int xvfs_create(FILE *outfp, const char * const name, const char * const directory) {
20809b08ce 2019-12-01 rkeene: return(parse_xvfs_minirivet(outfp, "lib/xvfs/xvfs.c.rvt", name, directory));
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: int main(int argc, char **argv) {
20809b08ce 2019-12-01 rkeene: struct options options = {0};
20809b08ce 2019-12-01 rkeene: int parse_options_ret, xvfs_create_ret;
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: argc--;
20809b08ce 2019-12-01 rkeene: argv++;
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: parse_options_ret = parse_options(argc, argv, &options);
20809b08ce 2019-12-01 rkeene: if (!parse_options_ret) {
20809b08ce 2019-12-01 rkeene: return(1);
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: xvfs_create_ret = xvfs_create(stdout, options.name, options.directory);
20809b08ce 2019-12-01 rkeene: if (!xvfs_create_ret) {
20809b08ce 2019-12-01 rkeene: return(1);
20809b08ce 2019-12-01 rkeene: }
20809b08ce 2019-12-01 rkeene:
20809b08ce 2019-12-01 rkeene: return(0);
20809b08ce 2019-12-01 rkeene: }