Take input filename on the command line
authorMichael Spang <mspang@csclub.uwaterloo.ca>
Fri, 4 Dec 2009 23:00:46 +0000 (18:00 -0500)
committerMichael Spang <mspang@csclub.uwaterloo.ca>
Tue, 22 Dec 2009 03:09:50 +0000 (22:09 -0500)
Signed-off-by: Michael Spang <mspang@csclub.uwaterloo.ca>
Makefile
inapt.cc
inapt.h
parser.rl

index 4aaf2ee..d4edd59 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -8,6 +8,8 @@ all: inapt parser.png
 inapt: inapt.o parser.o acqprogress.o util.o
        g++ -o inapt -g3 -Wall -Werror -lapt-pkg -lapt-inst $^
 
+inapt.o: inapt.h
+
 parser.cc: parser.rl
        ragel parser.rl -o parser.cc
 
index 92e9c15..3734a5b 100644 (file)
--- a/inapt.cc
+++ b/inapt.cc
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <getopt.h>
 #include <iostream>
 #include <cstdio>
 #include <fstream>
 
 using namespace std;
 
+char *prog = NULL;
+
+static struct option opts[] = {
+    { NULL, 0, NULL, '\0' },
+};
+
 bool InstallPackages(pkgCacheFile &Cache,bool ShwKept = false,bool Ask = true,
                      bool Safety = true)
 {
@@ -170,7 +177,31 @@ bool InstallPackages(pkgCacheFile &Cache,bool ShwKept = false,bool Ask = true,
    }
 }
 
+static void usage() {
+    fprintf(stderr, "Usage: %s [filename]\n", prog);
+    exit(2);
+}
+
+
 int main(int argc, char *argv[]) {
+    int opt;
+    char *filename = NULL;
+
+    prog = xstrdup(basename(argv[0]));
+    while ((opt = getopt_long(argc, argv, "", opts, NULL)) != -1) {
+        switch (opt) {
+            case '?':
+                usage();
+                break;
+            default:
+                fatal("error parsing arguments");
+        }
+    }
+
+    if (argc - optind == 1)
+        filename = argv[optind++];
+    else if (argc - optind > 0)
+        usage();
 
     vector<inapt_action> actions;
 
@@ -190,7 +221,7 @@ int main(int argc, char *argv[]) {
     pkgCache *cache = cachef;
     pkgDepCache *DCache = cachef;
 
-    scanner(&actions);
+    parser(filename, &actions);
 
     for (vector<inapt_action>::iterator i = actions.begin(); i < actions.end(); i++) {
         debug("finding %s", i->package);
diff --git a/inapt.h b/inapt.h
index d695613..9c80d54 100644 (file)
--- a/inapt.h
+++ b/inapt.h
@@ -8,4 +8,4 @@ struct inapt_action {
     void *obj;
 };
 
-void scanner(std::vector<inapt_action> *actions);
+void parser(const char *filename, std::vector<inapt_action> *actions);
index 9a2ee72..5c05e85 100644 (file)
--- a/parser.rl
+++ b/parser.rl
@@ -1,9 +1,12 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
 #include <vector>
 
 #include "inapt.h"
+#include "util.h"
 
 using namespace std;
 
@@ -48,18 +51,28 @@ using namespace std;
 
 #define BUFSIZE 128
 
-void scanner(vector<inapt_action> *actions)
+void parser(const char *filename, vector<inapt_action> *actions)
 {
     static char buf[BUFSIZE];
+    int fd;
     int cs, have = 0;
     int done = 0;
     int curline = 1;
     char *ts = 0, *te = 0;
 
     inapt_action tmp_action;
-    const char *curfile = "stdin";
+    const char *curfile = filename;
     enum inapt_action::action_t curaction = inapt_action::UNSET;
 
+    if (filename) {
+        fd = open(filename, O_RDONLY);
+        if (fd < 0)
+            fatalpe("open: %s", filename);
+    } else {
+        curfile = "stdin";
+        fd = 0;
+    }
+
     %% write init;
 
     while ( !done ) {
@@ -71,10 +84,14 @@ void scanner(vector<inapt_action> *actions)
             exit(1);
         }
 
-        len = fread(p, 1, space, stdin);
+        len = read(fd, p, space);
+        if (len < 0) {
+            fprintf(stderr, "IO ERROR\n");
+            exit(1);
+        }
         pe = p + len;
 
-        if (len < space) {
+        if (!len) {
             eof = pe;
             done = 1;
         }