Add support for parsing install and remove commands
[mspang/inapt.git] / awesome.rl
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;
 }