Annotation For xvfs-create-c.c

Origin for each line in xvfs-create-c.c from check-in 20809b08ce:

20809b08ce 2019-12-01    1: #include <string.h>
20809b08ce 2019-12-01    2: #include <stdio.h>
20809b08ce 2019-12-01    3: #include <ctype.h>
20809b08ce 2019-12-01    4: 
20809b08ce 2019-12-01    5: struct options {
20809b08ce 2019-12-01    6: 	char *name;
20809b08ce 2019-12-01    7: 	char *directory;
20809b08ce 2019-12-01    8: };
20809b08ce 2019-12-01    9: 
20809b08ce 2019-12-01   10: enum xvfs_minirivet_mode {
20809b08ce 2019-12-01   11: 	XVFS_MINIRIVET_MODE_COPY,
20809b08ce 2019-12-01   12: 	XVFS_MINIRIVET_MODE_TCL,
20809b08ce 2019-12-01   13: 	XVFS_MINIRIVET_MODE_TCL_PRINT
20809b08ce 2019-12-01   14: };
20809b08ce 2019-12-01   15: 
20809b08ce 2019-12-01   16: static int parse_options(int argc, char **argv, struct options *options) {
20809b08ce 2019-12-01   17: 	char *arg;
20809b08ce 2019-12-01   18: 	char **option;
20809b08ce 2019-12-01   19: 	int idx;
20809b08ce 2019-12-01   20: 	int retval;
20809b08ce 2019-12-01   21: 
20809b08ce 2019-12-01   22: 	for (idx = 0; idx < argc; idx++) {
20809b08ce 2019-12-01   23: 		arg = argv[idx];
20809b08ce 2019-12-01   24: 
20809b08ce 2019-12-01   25: 		if (strcmp(arg, "--directory") == 0) {
20809b08ce 2019-12-01   26: 			option = &options->directory;
20809b08ce 2019-12-01   27: 		} else if (strcmp(arg, "--name") == 0) {
20809b08ce 2019-12-01   28: 			option = &options->name;
20809b08ce 2019-12-01   29: 		} else {
20809b08ce 2019-12-01   30: 			fprintf(stderr, "Invalid argument %s\n", arg);
20809b08ce 2019-12-01   31: 
20809b08ce 2019-12-01   32: 			return(0);
20809b08ce 2019-12-01   33: 		}
20809b08ce 2019-12-01   34: 
20809b08ce 2019-12-01   35: 		idx++;
20809b08ce 2019-12-01   36: 		arg = argv[idx];
20809b08ce 2019-12-01   37: 		*option = arg;
20809b08ce 2019-12-01   38: 	}
20809b08ce 2019-12-01   39: 
20809b08ce 2019-12-01   40: 	retval = 1;
20809b08ce 2019-12-01   41: 	if (!options->directory) {		
20809b08ce 2019-12-01   42: 		fprintf(stderr, "error: --directory must be specified\n");
20809b08ce 2019-12-01   43: 		retval = 0;
20809b08ce 2019-12-01   44: 	}
20809b08ce 2019-12-01   45: 
20809b08ce 2019-12-01   46: 	if (!options->name) {
20809b08ce 2019-12-01   47: 		fprintf(stderr, "error: --name must be specified\n");
20809b08ce 2019-12-01   48: 		retval = 0;
20809b08ce 2019-12-01   49: 	}
20809b08ce 2019-12-01   50: 
20809b08ce 2019-12-01   51: 	return(retval);
20809b08ce 2019-12-01   52: }
20809b08ce 2019-12-01   53: 
20809b08ce 2019-12-01   54: static void parse_xvfs_minirivet_directory(FILE *outfp, const char * const directory) {
20809b08ce 2019-12-01   55: 	fprintf(outfp, "\t...\n");
20809b08ce 2019-12-01   56: }
20809b08ce 2019-12-01   57: 
20809b08ce 2019-12-01   58: static int parse_xvfs_minirivet(FILE *outfp, const char * const file, const char * const name, const char * const directory) {
20809b08ce 2019-12-01   59: 	FILE *fp;
20809b08ce 2019-12-01   60: 	int ch, ch_buf[3];
20809b08ce 2019-12-01   61: 	char tcl_buffer[8192], *tcl_buffer_p, *tcl_buffer_e;
20809b08ce 2019-12-01   62: 	enum xvfs_minirivet_mode mode;
20809b08ce 2019-12-01   63: 
20809b08ce 2019-12-01   64: 	fp = fopen(file, "r");
20809b08ce 2019-12-01   65: 	if (!fp) {
20809b08ce 2019-12-01   66: 		return(0);
20809b08ce 2019-12-01   67: 	}
20809b08ce 2019-12-01   68: 
20809b08ce 2019-12-01   69: #define parse_xvfs_minirivet_getbyte(var) var = fgetc(fp); if (var == EOF) { break; }
20809b08ce 2019-12-01   70: 
20809b08ce 2019-12-01   71: 	mode = XVFS_MINIRIVET_MODE_COPY;
20809b08ce 2019-12-01   72: 	while (1) {
20809b08ce 2019-12-01   73: 		parse_xvfs_minirivet_getbyte(ch);
20809b08ce 2019-12-01   74: 
20809b08ce 2019-12-01   75: 		switch (mode) {
20809b08ce 2019-12-01   76: 			case XVFS_MINIRIVET_MODE_COPY:
20809b08ce 2019-12-01   77: 				if (ch == '<') {
20809b08ce 2019-12-01   78: 					parse_xvfs_minirivet_getbyte(ch_buf[0]);
20809b08ce 2019-12-01   79: 					if (ch_buf[0] != '?') {
20809b08ce 2019-12-01   80: 						fputc('<', outfp);
20809b08ce 2019-12-01   81: 						ch = ch_buf[0];
20809b08ce 2019-12-01   82: 
20809b08ce 2019-12-01   83: 						break;
20809b08ce 2019-12-01   84: 					}
20809b08ce 2019-12-01   85: 
20809b08ce 2019-12-01   86: 					tcl_buffer_p = tcl_buffer;
20809b08ce 2019-12-01   87: 					parse_xvfs_minirivet_getbyte(ch_buf[0]);
20809b08ce 2019-12-01   88: 					if (ch_buf[0] == '=') {
20809b08ce 2019-12-01   89: 						mode = XVFS_MINIRIVET_MODE_TCL_PRINT;
20809b08ce 2019-12-01   90: 					} else {
20809b08ce 2019-12-01   91: 						mode = XVFS_MINIRIVET_MODE_TCL;
20809b08ce 2019-12-01   92: 						*tcl_buffer_p = ch_buf[0];
20809b08ce 2019-12-01   93: 						tcl_buffer_p++;
20809b08ce 2019-12-01   94: 					}
20809b08ce 2019-12-01   95: 					*tcl_buffer_p = '\0';
20809b08ce 2019-12-01   96: 					continue;
20809b08ce 2019-12-01   97: 				}
20809b08ce 2019-12-01   98: 				break;
20809b08ce 2019-12-01   99: 			case XVFS_MINIRIVET_MODE_TCL:
20809b08ce 2019-12-01  100: 			case XVFS_MINIRIVET_MODE_TCL_PRINT:
20809b08ce 2019-12-01  101: 				if (ch == '?') {
20809b08ce 2019-12-01  102: 					parse_xvfs_minirivet_getbyte(ch_buf[0]);
20809b08ce 2019-12-01  103: 					if (ch_buf[0] != '>') {
20809b08ce 2019-12-01  104: 						*tcl_buffer_p = ch;
20809b08ce 2019-12-01  105: 						tcl_buffer_p++;
20809b08ce 2019-12-01  106: 
20809b08ce 2019-12-01  107: 						ch = ch_buf[0];
20809b08ce 2019-12-01  108: 						
20809b08ce 2019-12-01  109: 						break;
20809b08ce 2019-12-01  110: 					}
20809b08ce 2019-12-01  111: 
20809b08ce 2019-12-01  112: 					*tcl_buffer_p = '\0';
20809b08ce 2019-12-01  113: 
20809b08ce 2019-12-01  114: 					if (mode == XVFS_MINIRIVET_MODE_TCL_PRINT) {
20809b08ce 2019-12-01  115: 						tcl_buffer_p = tcl_buffer;
20809b08ce 2019-12-01  116: 						while (*tcl_buffer_p && isspace(*tcl_buffer_p)) {
20809b08ce 2019-12-01  117: 							tcl_buffer_p++;
20809b08ce 2019-12-01  118: 						}
20809b08ce 2019-12-01  119: 						tcl_buffer_e = tcl_buffer_p + strlen(tcl_buffer_p) - 1;
20809b08ce 2019-12-01  120: 						while (tcl_buffer_e >= tcl_buffer_p && isspace(*tcl_buffer_e)) {
20809b08ce 2019-12-01  121: 							*tcl_buffer_e = '\0';
20809b08ce 2019-12-01  122: 							tcl_buffer_e--;
20809b08ce 2019-12-01  123: 						}
20809b08ce 2019-12-01  124: 
20809b08ce 2019-12-01  125: 						if (strcmp(tcl_buffer_p, "$::xvfs::fsName") == 0) {
20809b08ce 2019-12-01  126: 							fprintf(outfp, name);
20809b08ce 2019-12-01  127: 						} else if (strcmp(tcl_buffer_p, "$::xvfs::fileInfoStruct") == 0) {
20809b08ce 2019-12-01  128: 							fprintf(outfp, "static const struct xvfs_file_data xvfs_");
20809b08ce 2019-12-01  129: 							fprintf(outfp, name);
20809b08ce 2019-12-01  130: 							fprintf(outfp, "_data[] = {\n");
20809b08ce 2019-12-01  131: 							parse_xvfs_minirivet_directory(outfp, directory);
20809b08ce 2019-12-01  132: 							fprintf(outfp, "};\n");
20809b08ce 2019-12-01  133: 						} else if (strcmp(tcl_buffer_p, "[zlib adler32 $::xvfs::fsName]") == 0) {
20809b08ce 2019-12-01  134: 							fprintf(outfp, "0");
20809b08ce 2019-12-01  135: 						} else {
20809b08ce 2019-12-01  136: 							fprintf(outfp, "@INVALID@%s@INVALID@", tcl_buffer_p);
20809b08ce 2019-12-01  137: 						}
20809b08ce 2019-12-01  138: 					}
20809b08ce 2019-12-01  139: 
20809b08ce 2019-12-01  140: 					mode = XVFS_MINIRIVET_MODE_COPY;
20809b08ce 2019-12-01  141: 					continue;
20809b08ce 2019-12-01  142: 				}
20809b08ce 2019-12-01  143: 				break;
20809b08ce 2019-12-01  144: 		}
20809b08ce 2019-12-01  145: 
20809b08ce 2019-12-01  146: 		switch (mode) {
20809b08ce 2019-12-01  147: 			case XVFS_MINIRIVET_MODE_COPY:
20809b08ce 2019-12-01  148: 				fputc(ch, outfp);
20809b08ce 2019-12-01  149: 				break;
20809b08ce 2019-12-01  150: 			case XVFS_MINIRIVET_MODE_TCL:
20809b08ce 2019-12-01  151: 			case XVFS_MINIRIVET_MODE_TCL_PRINT:
20809b08ce 2019-12-01  152: 				*tcl_buffer_p = ch;
20809b08ce 2019-12-01  153: 				tcl_buffer_p++;
20809b08ce 2019-12-01  154: 				break;
20809b08ce 2019-12-01  155: 		}
20809b08ce 2019-12-01  156: 	}
20809b08ce 2019-12-01  157: 
20809b08ce 2019-12-01  158: #undef parse_xvfs_minirivet_getbyte
20809b08ce 2019-12-01  159: 
20809b08ce 2019-12-01  160: 	return(1);
20809b08ce 2019-12-01  161: }
20809b08ce 2019-12-01  162: 
20809b08ce 2019-12-01  163: static int xvfs_create(FILE *outfp, const char * const name, const char * const directory) {
20809b08ce 2019-12-01  164: 	return(parse_xvfs_minirivet(outfp, "lib/xvfs/xvfs.c.rvt", name, directory));
20809b08ce 2019-12-01  165: }
20809b08ce 2019-12-01  166: 
20809b08ce 2019-12-01  167: int main(int argc, char **argv) {
20809b08ce 2019-12-01  168: 	struct options options = {0};
20809b08ce 2019-12-01  169: 	int parse_options_ret, xvfs_create_ret;
20809b08ce 2019-12-01  170: 
20809b08ce 2019-12-01  171: 	argc--;
20809b08ce 2019-12-01  172: 	argv++;
20809b08ce 2019-12-01  173: 
20809b08ce 2019-12-01  174: 	parse_options_ret = parse_options(argc, argv, &options);
20809b08ce 2019-12-01  175: 	if (!parse_options_ret) {
20809b08ce 2019-12-01  176: 		return(1);
20809b08ce 2019-12-01  177: 	}
20809b08ce 2019-12-01  178: 
20809b08ce 2019-12-01  179: 	xvfs_create_ret = xvfs_create(stdout, options.name, options.directory);
20809b08ce 2019-12-01  180: 	if (!xvfs_create_ret) {
20809b08ce 2019-12-01  181: 		return(1);
20809b08ce 2019-12-01  182: 	}
20809b08ce 2019-12-01  183: 
20809b08ce 2019-12-01  184: 	return(0);
20809b08ce 2019-12-01  185: }