Add support for simple conditionals
authorMichael Spang <mspang@csclub.uwaterloo.ca>
Tue, 8 Dec 2009 02:09:06 +0000 (21:09 -0500)
committerMichael Spang <mspang@csclub.uwaterloo.ca>
Tue, 22 Dec 2009 03:11:44 +0000 (22:11 -0500)
Signed-off-by: Michael Spang <mspang@csclub.uwaterloo.ca>
Makefile
inapt.cc
inapt.h
parser.rl

index d4edd59..b6bc46f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -14,7 +14,7 @@ parser.cc: parser.rl
        ragel parser.rl -o parser.cc
 
 parser.dot: parser.rl
-       ragel -V parser.rl -o parser.dot
+       ragel -pV parser.rl -o parser.dot
 
 parser.png: parser.dot
        dot -Tpng -o parser.png parser.dot
index 1617c6f..e04b3e1 100644 (file)
--- a/inapt.cc
+++ b/inapt.cc
@@ -202,7 +202,7 @@ int main(int argc, char *argv[]) {
     else if (argc - optind > 0)
         usage();
 
-    vector<inapt_action> actions;
+    inapt_context context;
 
     pkgInitConfig(*_config);
     pkgInitSystem(*_config, _system);
@@ -220,21 +220,21 @@ int main(int argc, char *argv[]) {
     pkgCache *cache = cachef;
     pkgDepCache *DCache = cachef;
 
-    parser(filename, &actions);
+    parser(filename, &context);
 
-    for (vector<inapt_action>::iterator i = actions.begin(); i < actions.end(); i++) {
-        pkgCache::PkgIterator pkg = cache->FindPkg(i->package);
+    for (vector<inapt_action *>::iterator i = context.actions.begin(); i < context.actions.end(); i++) {
+        pkgCache::PkgIterator pkg = cache->FindPkg((*i)->package);
         if (pkg.end())
-            fatal("%s:%d: No such package: %s", i->filename, i->linenum, i->package);
-        i->obj = &pkg;
+            fatal("%s:%d: No such package: %s", (*i)->filename, (*i)->linenum, (*i)->package);
+        (*i)->obj = &pkg;
     }
 
-    for (vector<inapt_action>::iterator i = actions.begin(); i < actions.end(); i++) {
-        pkgCache::PkgIterator j = *(pkgCache::PkgIterator *)i->obj;
-        switch (i->action) {
+    for (vector<inapt_action *>::iterator i = context.actions.begin(); i < context.actions.end(); i++) {
+        pkgCache::PkgIterator j = *(pkgCache::PkgIterator *)(*i)->obj;
+        switch ((*i)->action) {
             case inapt_action::INSTALL:
                 if (!cachef[j].InstallVer || cachef[j].Delete()) {
-                    printf("preinstall %s %s:%d\n", i->package, i->filename, i->linenum);
+                    printf("preinstall %s %s:%d\n", (*i)->package, (*i)->filename, (*i)->linenum);
                     DCache->MarkInstall(j, true);
                 }
                 break;
@@ -245,18 +245,20 @@ int main(int argc, char *argv[]) {
         }
     }
 
-    for (vector<inapt_action>::iterator i = actions.begin(); i < actions.end(); i++) {
-        pkgCache::PkgIterator j = *(pkgCache::PkgIterator *)i->obj;
-        switch (i->action) {
+    for (vector<inapt_action *>::iterator i = context.actions.begin(); i < context.actions.end(); i++) {
+        pkgCache::PkgIterator j = *(pkgCache::PkgIterator *)(*i)->obj;
+        switch ((*i)->action) {
             case inapt_action::INSTALL:
                 if (!cachef[j].InstallVer || cachef[j].Delete()) {
-                    printf("install %s %s:%d\n", i->package, i->filename, i->linenum);
+                    printf("install %s %s:%d\n", (*i)->package, (*i)->filename, (*i)->linenum);
                     DCache->MarkInstall(j, false);
+                } else {
+                    printf("install %s %s:%d\n", (*i)->package, (*i)->filename, (*i)->linenum);
                 }
                 break;
             case inapt_action::REMOVE:
                 if (cachef[j].InstallVer || cachef[j].Delete()) {
-                    printf("remove %s %s:%d\n", i->package, i->filename, i->linenum);
+                    printf("remove %s %s:%d\n", (*i)->package, (*i)->filename, (*i)->linenum);
                     DCache->MarkDelete(j, false);
                 }
                 break;
@@ -292,10 +294,10 @@ int main(int argc, char *argv[]) {
 
     pkgProblemResolver fix (DCache);
 
-    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));
+    for (vector<inapt_action *>::iterator i = context.actions.begin(); i < context.actions.end(); i++)
+           fix.Protect(cache->FindPkg((*i)->package));
+    for (vector<inapt_action *>::iterator i = context.actions.begin(); i < context.actions.end(); i++)
+           fix.Protect(cache->FindPkg((*i)->package));
     fix.Resolve();
 
     fprintf(stderr, "\n");
diff --git a/inapt.h b/inapt.h
index 9c80d54..2b24a38 100644 (file)
--- a/inapt.h
+++ b/inapt.h
@@ -8,4 +8,10 @@ struct inapt_action {
     void *obj;
 };
 
-void parser(const char *filename, std::vector<inapt_action> *actions);
+struct inapt_context {
+    const char *condition;
+    std::vector<inapt_action *> actions;
+    std::vector<inapt_context *> children;
+};
+
+void parser(const char *filename, inapt_context *context);
index 5c05e85..ef45a8c 100644 (file)
--- a/parser.rl
+++ b/parser.rl
@@ -18,11 +18,12 @@ using namespace std;
     action pkgstart { ts = p; }
 
     action add_list {
-      tmp_action.package = xstrndup(ts, p - ts);
-      tmp_action.action = curaction;
-      tmp_action.linenum = curline;
-      tmp_action.filename = curfile;
-      actions->push_back(tmp_action);
+        inapt_action *tmp_action = new inapt_action;
+        tmp_action->package = xstrndup(ts, p - ts);
+        tmp_action->action = curaction;
+        tmp_action->linenum = curline;
+        tmp_action->filename = curfile;
+        cur_context->actions.push_back(tmp_action);
     }
 
     action install {
@@ -33,25 +34,33 @@ using namespace std;
         curaction = inapt_action::REMOVE;
     }
 
+    action newline {
+        curline += 1;
+    }
+
     action misc_error {
         fprintf(stderr, "%s: %d: Syntax Error\n", curfile, curline);
     }
 
-    newline = '\n' %{ curline += 1; };
+    newline = '\n' %newline;
     comment = '#' (any - newline)* newline;
     whitespace = [\t\v\f\r ] | comment | newline;
     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);
+    cmd_install = ('install' @install package_list ';');
+    cmd_remove = ('remove' @remove package_list ';');
+    simple_cmd = cmd_install | cmd_remove;
+    cmd_if = 'if' whitespace+ alpha+ whitespace+ simple_cmd whitespace* ('else' whitespace+ simple_cmd)?;
+    statement = simple_cmd | cmd_if;
+    cmd_list = (statement | whitespace)* ; #$err(misc_error);
+    main := cmd_list;
 }%%
 
 %% write data;
 
 #define BUFSIZE 128
 
-void parser(const char *filename, vector<inapt_action> *actions)
+void parser(const char *filename, inapt_context *top_context)
 {
     static char buf[BUFSIZE];
     int fd;
@@ -59,8 +68,10 @@ void parser(const char *filename, vector<inapt_action> *actions)
     int done = 0;
     int curline = 1;
     char *ts = 0, *te = 0;
+    inapt_context *cur_context = top_context;
+    //int stack[100];
+    //int top = 0; /* TODO: resize */
 
-    inapt_action tmp_action;
     const char *curfile = filename;
     enum inapt_action::action_t curaction = inapt_action::UNSET;