Add support for parsing install and remove commands
authorMichael Spang <mspang@csclub.uwaterloo.ca>
Thu, 19 Nov 2009 06:46:06 +0000 (01:46 -0500)
committerMichael Spang <mspang@csclub.uwaterloo.ca>
Tue, 22 Dec 2009 03:09:49 +0000 (22:09 -0500)
Signed-off-by: Michael Spang <mspang@csclub.uwaterloo.ca>
awesome.rl
magic.cc

index 4b04c7d..bfcd20a 100644 (file)
@@ -1,40 +1,62 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <vector>
+
+using namespace std;
+
+#define xstrndup strndup
 
 %%{
     machine inapt;
 
-    action pkgstart {
-      ts = p;
-    }
+    action pkgstart { ts = p; }
+    action pkgend { te = p; }
 
-    action pkgend {
-      te = p;
+    action add_list {
+      tmp_list.push_back(xstrndup(ts, te-ts+1));
+    }
 
-      char *q;
-      printf("package: ");
-      for (q = ts; q <= te; q++) {
-        putchar(*q);
+    action clear_list {
+      while (tmp_list.size()) {
+        free(tmp_list.back());
+        tmp_list.pop_back();
       }
-      printf("\n");
     }
 
-    package = ((lower | digit) (lower | digit | '+' | '-' | '.')+) >pkgstart %pkgend;
-    main := (package space+)*;
+    action install {
+      for (vector<char *>::iterator i = tmp_list.begin(); i < tmp_list.end(); i++)
+        add_list.push_back(*i);
+      tmp_list.clear();
+    }
+
+    action remove {
+      for (vector<char *>::iterator i = tmp_list.begin(); i < tmp_list.end(); i++)
+        del_list.push_back(*i);
+      tmp_list.clear();
+    }
+
+    package_name = ((lower | digit) (lower | digit | '+' | '-' | '.')+) >pkgstart @pkgend;
+    package_list = ((space+ package_name)+ %add_list space*) >clear_list;
+    cmd_install = 'install' package_list ';' @install;
+    cmd_remove = 'remove' package_list ';' @remove;
+
+    main := (cmd_install | cmd_remove | space)*;
 }%%
 
 %% write data nofinal;
 
 #define BUFSIZE 128
 
-void scanner()
+void scanner(vector<char *> &add_list, vector<char *> &del_list)
 {
     static char buf[BUFSIZE];
     int cs, have = 0;
     int done = 0;
     char *ts = 0, *te = 0;
 
+    vector<char *> tmp_list;
+
     %% write init;
 
     while ( !done ) {
@@ -48,7 +70,7 @@ void scanner()
             exit(1);
         }
 
-        len = fread( p, 1, space, stdin );
+        len = fread(p, 1, space, stdin);
         pe = p + len;
 
         /* Check if this is the end of file. */
@@ -77,6 +99,12 @@ void scanner()
 
 int main()
 {
-    scanner();
+    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;
 }
index 556c810..4965a3a 100644 (file)
--- a/magic.cc
+++ b/magic.cc
@@ -201,6 +201,8 @@ int main(int argc, char *argv[]) {
     DCache->MarkInstall(cache->FindPkg("postfix"), true);
     DCache->MarkDelete(cache->FindPkg("network-manager"), false);
     DCache->MarkDelete(cache->FindPkg("gnome-games"), false);
+    DCache->MarkInstall(cache->FindPkg("ssmtp"), false);
+    DCache->MarkInstall(cache->FindPkg("postfix"), false);
 
     fprintf(stderr, "\n");
     fprintf(stderr, "inst %lu del %lu keep %lu broken %lu bad %lu\n",