Make the parser output include line numbers
authorMichael Spang <mspang@csclub.uwaterloo.ca>
Thu, 3 Dec 2009 23:19:07 +0000 (18:19 -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>
inapt.cc
inapt.h [new file with mode: 0644]
parser.h [deleted file]
parser.rl

index 3d9e5bc..f11ddc3 100644 (file)
--- a/inapt.cc
+++ b/inapt.cc
 #include <apt-pkg/sptr.h>
 #include <apt-pkg/acquire-item.h>
 
+#include "inapt.h"
 #include "acqprogress.h"
-#include "parser.h"
 
 using namespace std;
 
-
 bool InstallPackages(pkgCacheFile &Cache,bool ShwKept = false,bool Ask = true,
                      bool Safety = true)
 {
@@ -170,11 +169,9 @@ bool InstallPackages(pkgCacheFile &Cache,bool ShwKept = false,bool Ask = true,
    }
 }
 
-
 int main(int argc, char *argv[]) {
 
-    vector<char *> add_list;
-    vector<char *> del_list;
+    vector<inapt_action> actions;
 
     pkgInitConfig(*_config);
     pkgInitSystem(*_config, _system);
@@ -192,18 +189,29 @@ int main(int argc, char *argv[]) {
     pkgCache *cache = cachef;
     pkgDepCache *DCache = cachef;
 
-    scanner(add_list, del_list);
+    scanner(&actions);
 
-    for (vector<char *>::iterator i = add_list.begin(); i < add_list.end(); i++) {
-      printf("install %s\n", *i);
-      DCache->MarkInstall(cache->FindPkg(*i), true);
+    for (vector<inapt_action>::iterator i = actions.begin(); i < actions.end(); i++) {
+        switch(i->action) {
+            case inapt_action::INSTALL:
+                DCache->MarkInstall(cache->FindPkg(i->package), true);
+                break;
+            case inapt_action::REMOVE:
+                break;
+        }
     }
-    for (vector<char *>::iterator i = del_list.begin(); i < del_list.end(); i++) {
-      printf("remove %s\n", *i);
-      DCache->MarkDelete(cache->FindPkg(*i), false);
-    }
-    for (vector<char *>::iterator i = add_list.begin(); i < add_list.end(); i++) {
-      DCache->MarkInstall(cache->FindPkg(*i), false);
+
+    for (vector<inapt_action>::iterator i = actions.begin(); i < actions.end(); i++) {
+        switch(i->action) {
+            case inapt_action::INSTALL:
+                printf("install %s %s:%d\n", i->package, i->filename, i->linenum);
+                DCache->MarkInstall(cache->FindPkg(i->package), false);
+                break;
+            case inapt_action::REMOVE:
+                printf("remove %s %s:%d\n", i->package, i->filename, i->linenum);
+                DCache->MarkDelete(cache->FindPkg(i->package), false);
+                break;
+        }
     }
 
     fprintf(stderr, "\n");
@@ -233,10 +241,10 @@ int main(int argc, char *argv[]) {
 
     pkgProblemResolver fix (DCache);
 
-    for (vector<char *>::iterator i = add_list.begin(); i < add_list.end(); i++)
-           fix.Protect(cache->FindPkg(*i));
-    for (vector<char *>::iterator i = del_list.begin(); i < del_list.end(); i++)
-           fix.Protect(cache->FindPkg(*i));
+    for (vector<inapt_action>::iterator i = actions.begin(); i < actions.end(); i++)
+           fix.Protect(cache->FindPkg(i->package));
+    for (vector<inapt_action>::iterator i = actions.begin(); i < actions.end(); i++)
+           fix.Protect(cache->FindPkg(i->package));
     fix.Resolve();
 
     fprintf(stderr, "\n");
diff --git a/inapt.h b/inapt.h
new file mode 100644 (file)
index 0000000..2e6b043
--- /dev/null
+++ b/inapt.h
@@ -0,0 +1,10 @@
+#include <vector>
+
+struct inapt_action {
+    const char *package;
+    enum action_t { INSTALL, REMOVE } action;
+    const char *filename;
+    int linenum;
+};
+
+void scanner(std::vector<inapt_action> *actions);
diff --git a/parser.h b/parser.h
deleted file mode 100644 (file)
index 1aefca3..0000000
--- a/parser.h
+++ /dev/null
@@ -1 +0,0 @@
-void scanner(vector<char *> &add_list, vector<char *> &del_list);
index 8e9b5b1..007bbd3 100644 (file)
--- a/parser.rl
+++ b/parser.rl
@@ -3,6 +3,8 @@
 #include <stdlib.h>
 #include <vector>
 
+#include "inapt.h"
+
 using namespace std;
 
 #define xstrndup strndup
@@ -11,42 +13,33 @@ using namespace std;
     machine inapt;
 
     action pkgstart { ts = p; }
-    action pkgend { te = p; }
 
     action add_list {
-      tmp_list.push_back(xstrndup(ts, te - ts + 1));
-    }
-
-    action clear_list {
-      while (tmp_list.size()) {
-        free(tmp_list.back());
-        tmp_list.pop_back();
-      }
+      tmp_action.package = xstrndup(ts, p - ts);
+      tmp_action.linenum = curline;
+      tmp_action.filename = curfile;
+      actions->push_back(tmp_action);
     }
 
     action install {
-      for (vector<char *>::iterator i = tmp_list.begin(); i < tmp_list.end(); i++)
-        add_list.push_back(*i);
-      tmp_list.clear();
+        tmp_action.action = inapt_action::INSTALL;
     }
 
     action remove {
-      for (vector<char *>::iterator i = tmp_list.begin(); i < tmp_list.end(); i++)
-        del_list.push_back(*i);
-      tmp_list.clear();
+        tmp_action.action = inapt_action::REMOVE;
     }
 
     action misc_error {
-        fprintf(stderr, "%s: %d: Syntax Error\n", "stdin", curline);
+        fprintf(stderr, "%s: %d: Syntax Error\n", curfile, curline);
     }
 
-    newline = '\n' @{ curline += 1; };
+    newline = '\n' %{ curline += 1; };
     comment = '#' (any - newline)* newline;
     whitespace = [\t\v\f\r ] | comment | newline;
-    package_name = ((lower | digit) (lower | digit | '+' | '-' | '.')+) >pkgstart @pkgend;
-    package_list = ((whitespace+ package_name)+ %add_list whitespace*) >clear_list;
-    cmd_install = ('install' package_list ';') @install;
-    cmd_remove = ('remove' package_list ';') @remove;
+    package_name = ((lower | digit) (lower | digit | '+' | '-' | '.')+) >pkgstart;
+    package_list = ((whitespace+ package_name)+ %add_list whitespace*);
+    cmd_install = ('install' package_list ';') >install;
+    cmd_remove = ('remove' package_list ';') >remove;
     main := (cmd_install | cmd_remove | whitespace)* $err(misc_error);
 }%%
 
@@ -54,15 +47,18 @@ using namespace std;
 
 #define BUFSIZE 128
 
-void scanner(vector<char *> &add_list, vector<char *> &del_list)
+void scanner(vector<inapt_action> *actions)
 {
     static char buf[BUFSIZE];
     int cs, have = 0;
     int done = 0;
     int curline = 1;
     char *ts = 0, *te = 0;
+    //int tl = 0;
 
     vector<char *> tmp_list;
+    inapt_action tmp_action;
+    const char *curfile = "stdin";
 
     %% write init;
 
@@ -105,17 +101,3 @@ void scanner(vector<char *> &add_list, vector<char *> &del_list)
        exit(1);
     }
 }
-
-/*
-int main()
-{
-    vector<char *> add_list;
-    vector<char *> del_list;
-    scanner(add_list, del_list);
-    for (vector<char *>::iterator i = add_list.begin(); i < add_list.end(); i++)
-      printf("install %s\n", *i);
-    for (vector<char *>::iterator i = del_list.begin(); i < del_list.end(); i++)
-      printf("remove %s\n", *i);
-    return 0;
-}
-*/