From b49d8ebefe9b10c53a6a09ad564e22111b7b25c6 Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Sat, 20 Sep 2003 07:12:49 +0000 Subject: Initial Import --- src/repc.c | 192 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 src/repc.c (limited to 'src/repc.c') diff --git a/src/repc.c b/src/repc.c new file mode 100644 index 0000000..8cd5f9b --- /dev/null +++ b/src/repc.c @@ -0,0 +1,192 @@ +/* + * 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; +} -- cgit v1.2.3