/* * AUTHOR * N. Nielsen * * LICENSE * This software is in the public domain. * * The software is provided "as is", without warranty of any kind, * express or implied, including but not limited to the warranties * of merchantability, fitness for a particular purpose, and * noninfringement. In no event shall the author(s) be liable for any * claim, damages, or other liability, whether in an action of * contract, tort, or otherwise, arising from, out of, or in connection * with the software or the use or other dealings in the software. * * SUPPORT * Send bug reports to: */ #include #include #include #include #include #include #include #include #include "common/usuals.h" #include "common/compat.h" #include "lib/rlib.h" #include "lib/rep.h" #include "common/binfile.h" #include "common/repfile.h" int usage(); int help(); /* --------------------------------------------------------------------------- */ int main(int argc, char* argv[]) { r_context ctx; int ch = 0; int r = R_OK; bool dump = false; /* Do we dump the ops to the display */ bool raw = false; /* Output raw script data or rep file */ memset(&ctx, 0, sizeof(ctx)); /* Enough params? */ if(argc < 2) return usage(); /* Parse the arguments */ while((ch = getopt(argc, argv, "dprz:")) != -1) { switch(ch) { /* Output raw script ops to file instead of rep file*/ case 'r': raw = true; break; /* Dump rep script ops to stdout */ case 'd': dump = true; break; /* Set parse mode option in rep file */ case 'p': ctx.options |= RLIB_MODE_PARSER; break; /* Set the buffer size in rep file */ case 'z': ctx.block = atoi(optarg); if(ctx.block <= 0x20) errx(2, "invalid argument. specify block size greater than 32."); break; case '?': default: return usage(); break; } } argc -= optind; argv += optind; /* Okay now compile */ /* Make sure we have a valid amount of file names */ if(argc < 1) return usage(); /* * The next param should be the script file * so read it... */ { FILE* file = fopen(argv[0], "rb"); if(!file) err(1, "couldn't open rep script file: %s", argv[0]); r = repLoad(&ctx, file); fclose(file); if(r < 0) exit(errmsg(r, &(ctx.script))); } argc--; argv++; /* Now if we were asked to dump then output the file */ if(dump) { if(argc != 0) return usage(); rlibDump(&(ctx.script), stdout); } /* Otherwise we write it out to a file */ else { FILE* file; char* output = argv[0]; if(argc < 1) return usage(); /* Opet the output file */ if(!(file = fopen(output, "wb"))) err(1, "couldn't open output file for compiled script: %s\n", output); /* Write a full rep file if not in raw mode */ if(!raw) { bfval val; BFILE h; if(!(h = bfStartFile(file))) errx(1, "couldn't open output file for compiled script: %s\n", output); repfWriteHeader(h); bfWriteInt(h, REPVAL_PARSEMODE, ctx.options & RLIB_MODE_PARSER ? 1 : 0); if(ctx.block != 0) bfWriteInt(h, REPVAL_BUFSIZE, ctx.block); val.id = REPVAL_SCRIPT; val.len = ctx.script.len; val.type = BINTYPE_DATA; bfWriteValue(h, &val, ctx.script.ops); bfWriteEnd(h); bfClose(h); } else { /* Just write out the raw script */ fwrite(ctx.script.ops, 1, ctx.script.len, file); } if(ferror(file)) err(1, "couldn't write to file: %s", output); fclose(file); } repFree(&ctx); return 0; } /* usage: ---------------------------------------------------------------- */ int usage() { fprintf(stderr, "usage: repc [-rp] [ -z buffsize ] script output\n"); fprintf(stderr, " repc -d script\n"); return 2; }