summaryrefslogtreecommitdiff
path: root/src/repc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/repc.c')
-rw-r--r--src/repc.c192
1 files changed, 192 insertions, 0 deletions
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: <nielsen@memberwebs.com>
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#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;
+}