Use proper names for source files
authorMichael Spang <mspang@csclub.uwaterloo.ca>
Sun, 29 Nov 2009 04:46:17 +0000 (23:46 -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>
.gitignore
Makefile
awesome.h [deleted file]
awesome.rl [deleted file]
inapt.cc [new file with mode: 0644]
magic.cc [deleted file]
parser.h [new file with mode: 0644]
parser.rl [new file with mode: 0644]

index f0180c2..e436381 100644 (file)
@@ -1,7 +1,8 @@
+*.o
 *.aux
 *.log
 *.pdf
-magic
-/awesome.c
-/awesome.dot
-/awesome.png
+inapt
+/parser.cc
+/parser.dot
+/parser.png
index 996b4fe..419e53b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,15 +1,22 @@
-all: magic awesome.png
-magic: magic.cc awesome.c acqprogress.cc
-       g++ -o magic -g3 -Wall -Werror -lapt-pkg -lapt-inst magic.cc acqprogress.cc awesome.c
-awesome: awesome.c
-       g++ -o awesome -g3 -Wall -Werror -lapt-pkg -lapt-inst awesome.c
-awesome.c: awesome.rl
-       ragel awesome.rl
-awesome.dot: awesome.rl
-       ragel -V awesome.rl -o awesome.dot
-awesome.png: awesome.dot
-       dot -Tpng -o awesome.png awesome.dot
+CPPFLAGS := -g3 -O2 -Wall -Werror
+LDFLAGS  := -Wl,--as-needed
+INCLUDES := $(shell krb5-config --cflags)
+override CFLAGS  += -std=gnu99 $(INCLUDES)
+
+all: inapt parser.png
+
+inapt: inapt.o parser.o acqprogress.o
+       g++ -o inapt -g3 -Wall -Werror -lapt-pkg -lapt-inst $^
+
+parser.cc: parser.rl
+       ragel parser.rl -o parser.cc
+
+parser.dot: parser.rl
+       ragel -V parser.rl -o parser.dot
+
+parser.png: parser.dot
+       dot -Tpng -o parser.png parser.dot
 
 clean:
-       rm -f magic
+       rm -f *.o inapt parser.png parser.dot
 
diff --git a/awesome.h b/awesome.h
deleted file mode 100644 (file)
index 1aefca3..0000000
--- a/awesome.h
+++ /dev/null
@@ -1 +0,0 @@
-void scanner(vector<char *> &add_list, vector<char *> &del_list);
diff --git a/awesome.rl b/awesome.rl
deleted file mode 100644 (file)
index 8e9b5b1..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <vector>
-
-using namespace std;
-
-#define xstrndup strndup
-
-%%{
-    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();
-      }
-    }
-
-    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();
-    }
-
-    action misc_error {
-        fprintf(stderr, "%s: %d: Syntax Error\n", "stdin", curline);
-    }
-
-    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;
-    main := (cmd_install | cmd_remove | whitespace)* $err(misc_error);
-}%%
-
-%% write data;
-
-#define BUFSIZE 128
-
-void scanner(vector<char *> &add_list, vector<char *> &del_list)
-{
-    static char buf[BUFSIZE];
-    int cs, have = 0;
-    int done = 0;
-    int curline = 1;
-    char *ts = 0, *te = 0;
-
-    vector<char *> tmp_list;
-
-    %% write init;
-
-    while ( !done ) {
-        char *p = buf + have, *pe, *eof = 0;
-        int len, space = BUFSIZE - have;
-
-        if (space == 0) {
-            fprintf(stderr, "OUT OF BUFFER SPACE\n");
-            exit(1);
-        }
-
-        len = fread(p, 1, space, stdin);
-        pe = p + len;
-
-        if (len < space) {
-            eof = pe;
-            done = 1;
-        }
-
-        %% write exec;
-
-        if (cs == inapt_error) {
-            fprintf(stderr, "PARSE ERROR\n");
-           exit(1);
-        }
-
-        have = 0;
-
-        if (ts) {
-            have = pe - ts;
-            memmove(buf, ts, have);
-            te = buf + (te - ts);
-            ts = buf;
-        }
-    }
-
-    if (cs < inapt_first_final) {
-       fprintf(stderr, "UNEXPECTED EOF\n");
-       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;
-}
-*/
diff --git a/inapt.cc b/inapt.cc
new file mode 100644 (file)
index 0000000..3d9e5bc
--- /dev/null
+++ b/inapt.cc
@@ -0,0 +1,260 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <iostream>
+#include <cstdio>
+#include <fstream>
+#include <apt-pkg/pkgcache.h>
+#include <apt-pkg/cachefile.h>
+#include <apt-pkg/dpkgdb.h>
+#include <apt-pkg/progress.h>
+#include <apt-pkg/init.h>
+#include <apt-pkg/error.h>
+#include <apt-pkg/algorithms.h>
+#include <apt-pkg/sptr.h>
+#include <apt-pkg/acquire-item.h>
+
+#include "acqprogress.h"
+#include "parser.h"
+
+using namespace std;
+
+
+bool InstallPackages(pkgCacheFile &Cache,bool ShwKept = false,bool Ask = true,
+                     bool Safety = true)
+{
+   if (_config->FindB("APT::Get::Purge",false) == true)
+   {
+      pkgCache::PkgIterator I = Cache->PkgBegin();
+      for (; I.end() == false; I++)
+      {
+         if (I.Purge() == false && Cache[I].Mode == pkgDepCache::ModeDelete)
+            Cache->MarkDelete(I,true);
+      }
+   }
+
+   if (Cache->BrokenCount() != 0)
+   {
+      return _error->Error("Internal error, InstallPackages was called with broken packages!");
+   }
+
+   if (Cache->DelCount() == 0 && Cache->InstCount() == 0 &&
+       Cache->BadCount() == 0)
+      return true;
+
+   if (Cache->DelCount() != 0 && _config->FindB("APT::Get::Remove",true) == false)
+      return _error->Error(("Packages need to be removed but remove is disabled."));
+
+   pkgRecords Recs(Cache);
+   if (_error->PendingError() == true)
+      return false;
+
+   FileFd Lock;
+   if (_config->FindB("Debug::NoLocking",false) == false &&
+       _config->FindB("APT::Get::Print-URIs") == false)
+   {
+      Lock.Fd(GetLock(_config->FindDir("Dir::Cache::Archives") + "lock"));
+      if (_error->PendingError() == true)
+         return _error->Error(("Unable to lock the download directory"));
+   }
+
+   unsigned int width = 80;
+   AcqTextStatus status (width, 0);
+   pkgAcquire Fetcher (&status);
+
+   pkgSourceList List;
+   if (List.ReadMainList() == false)
+      return _error->Error(("The list of sources could not be read."));
+
+   SPtr<pkgPackageManager> PM= _system->CreatePM(Cache);
+   if (PM->GetArchives(&Fetcher, &List, &Recs) == false ||
+       _error->PendingError() == true)
+      return false;
+
+   if (_error->PendingError() == true)
+      return false;
+
+   while (1)
+   {
+      bool Transient = false;
+      if (_config->FindB("APT::Get::Download",true) == false)
+      {
+         for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin(); I < Fetcher.ItemsEnd();)
+         {
+            if ((*I)->Local == true)
+            {
+               I++;
+               continue;
+            }
+
+            // Close the item and check if it was found in cache
+            (*I)->Finished();
+            if ((*I)->Complete == false)
+               Transient = true;
+
+            // Clear it out of the fetch list
+            delete *I;
+            I = Fetcher.ItemsBegin();
+         }
+      }
+
+      if (Fetcher.Run() == pkgAcquire::Failed)
+         return false;
+
+      // Print out errors
+      bool Failed = false;
+      for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin(); I != Fetcher.ItemsEnd(); I++)
+      {
+         if ((*I)->Status == pkgAcquire::Item::StatDone &&
+             (*I)->Complete == true)
+            continue;
+
+         if ((*I)->Status == pkgAcquire::Item::StatIdle)
+         {
+            Transient = true;
+            // Failed = true;
+            continue;
+         }
+
+         fprintf(stderr,("Failed to fetch %s  %s\n"),(*I)->DescURI().c_str(),
+                 (*I)->ErrorText.c_str());
+         Failed = true;
+      }
+
+      /* If we are in no download mode and missing files and there were
+         'failures' then the user must specify -m. Furthermore, there
+         is no such thing as a transient error in no-download mode! */
+      if (Transient == true &&
+          _config->FindB("APT::Get::Download",true) == false)
+      {
+         Transient = false;
+         Failed = true;
+      }
+
+      if (_config->FindB("APT::Get::Download-Only",false) == true)
+      {
+         if (Failed == true && _config->FindB("APT::Get::Fix-Missing",false) == false)
+            return _error->Error(("Some files failed to download"));
+         //c1out << _("Download complete and in download only mode") << endl;
+         return true;
+      }
+
+      if (Failed == true && _config->FindB("APT::Get::Fix-Missing",false) == false)
+      {
+         return _error->Error(("Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?"));
+      }
+
+      if (Transient == true && Failed == true)
+         return _error->Error(("--fix-missing and media swapping is not currently supported"));
+
+      // Try to deal with missing package files
+      if (Failed == true && PM->FixMissing() == false)
+      {
+         cerr << ("Unable to correct missing packages.") << endl;
+         return _error->Error(("Aborting install."));
+      }
+
+      _system->UnLock();
+      int status_fd = _config->FindI("APT::Status-Fd",-1);
+      pkgPackageManager::OrderResult Res = PM->DoInstall(status_fd);
+      if (Res == pkgPackageManager::Failed || _error->PendingError() == true)
+         return false;
+      if (Res == pkgPackageManager::Completed)
+         return true;
+
+      // Reload the fetcher object and loop again for media swapping
+      Fetcher.Shutdown();
+      if (PM->GetArchives(&Fetcher,&List,&Recs) == false)
+         return false;
+
+      _system->Lock();
+   }
+}
+
+
+int main(int argc, char *argv[]) {
+
+    vector<char *> add_list;
+    vector<char *> del_list;
+
+    pkgInitConfig(*_config);
+    pkgInitSystem(*_config, _system);
+
+     _config->Set("Debug::pkgProblemResolver", true);
+
+    OpTextProgress prog;
+    pkgCacheFile cachef;
+
+    if (cachef.Open(prog) == false) {
+       _error->DumpErrors();
+        exit(1);
+    }
+
+    pkgCache *cache = cachef;
+    pkgDepCache *DCache = cachef;
+
+    scanner(add_list, del_list);
+
+    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<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);
+    }
+
+    fprintf(stderr, "\n");
+    fprintf(stderr, "nondownloadable packages:\n");
+    for (pkgCache::PkgIterator i = cache->PkgBegin(); !i.end(); i++) {
+       if (i.CurrentVer() && !i.CurrentVer().Downloadable()) {
+              fprintf(stderr, "%s ", i.Name());
+              fprintf(stderr, "%s\n", DCache->GetCandidateVer(i).VerStr());
+       }
+    }
+
+    fprintf(stderr, "\n");
+    fprintf(stderr, "inst %lu del %lu keep %lu broken %lu bad %lu\n",
+                   DCache->InstCount(), DCache->DelCount(), DCache->KeepCount(),
+                   DCache->BrokenCount(), DCache->BadCount());
+
+    for (pkgCache::PkgIterator i = cache->PkgBegin(); !i.end(); i++) {
+       if ((*DCache)[i].Install())
+         fprintf(stderr, "inst %s\n", i.Name());
+       if ((*DCache)[i].InstBroken())
+         fprintf(stderr, "instbroken %s\n", i.Name());
+       if ((*DCache)[i].NowBroken())
+         fprintf(stderr, "nowbroken %s\n", i.Name());
+    }
+
+    fprintf(stderr, "\n");
+
+    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));
+    fix.Resolve();
+
+    fprintf(stderr, "\n");
+    fprintf(stderr, "inst %lu del %lu keep %lu broken %lu bad %lu\n",
+                   DCache->InstCount(), DCache->DelCount(), DCache->KeepCount(),
+                   DCache->BrokenCount(), DCache->BadCount());
+    for (pkgCache::PkgIterator i = cache->PkgBegin(); !i.end(); i++) {
+       if ((*DCache)[i].Install())
+         fprintf(stderr, "inst %s\n", i.Name());
+       if ((*DCache)[i].Delete())
+         fprintf(stderr, "del %s\n", i.Name());
+       if ((*DCache)[i].InstBroken())
+         fprintf(stderr, "instbroken %s\n", i.Name());
+       if ((*DCache)[i].NowBroken())
+         fprintf(stderr, "nowbroken %s\n", i.Name());
+    }
+
+    fprintf(stderr, "\n");
+
+    InstallPackages(cachef);
+}
diff --git a/magic.cc b/magic.cc
deleted file mode 100644 (file)
index bb67bf2..0000000
--- a/magic.cc
+++ /dev/null
@@ -1,260 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <iostream>
-#include <cstdio>
-#include <fstream>
-#include <apt-pkg/pkgcache.h>
-#include <apt-pkg/cachefile.h>
-#include <apt-pkg/dpkgdb.h>
-#include <apt-pkg/progress.h>
-#include <apt-pkg/init.h>
-#include <apt-pkg/error.h>
-#include <apt-pkg/algorithms.h>
-#include <apt-pkg/sptr.h>
-#include <apt-pkg/acquire-item.h>
-
-#include "acqprogress.h"
-#include "awesome.h"
-
-using namespace std;
-
-
-bool InstallPackages(pkgCacheFile &Cache,bool ShwKept = false,bool Ask = true,
-                     bool Safety = true)
-{
-   if (_config->FindB("APT::Get::Purge",false) == true)
-   {
-      pkgCache::PkgIterator I = Cache->PkgBegin();
-      for (; I.end() == false; I++)
-      {
-         if (I.Purge() == false && Cache[I].Mode == pkgDepCache::ModeDelete)
-            Cache->MarkDelete(I,true);
-      }
-   }
-
-   if (Cache->BrokenCount() != 0)
-   {
-      return _error->Error("Internal error, InstallPackages was called with broken packages!");
-   }
-
-   if (Cache->DelCount() == 0 && Cache->InstCount() == 0 &&
-       Cache->BadCount() == 0)
-      return true;
-
-   if (Cache->DelCount() != 0 && _config->FindB("APT::Get::Remove",true) == false)
-      return _error->Error(("Packages need to be removed but remove is disabled."));
-
-   pkgRecords Recs(Cache);
-   if (_error->PendingError() == true)
-      return false;
-
-   FileFd Lock;
-   if (_config->FindB("Debug::NoLocking",false) == false &&
-       _config->FindB("APT::Get::Print-URIs") == false)
-   {
-      Lock.Fd(GetLock(_config->FindDir("Dir::Cache::Archives") + "lock"));
-      if (_error->PendingError() == true)
-         return _error->Error(("Unable to lock the download directory"));
-   }
-
-   unsigned int width = 80;
-   AcqTextStatus status (width, 0);
-   pkgAcquire Fetcher (&status);
-
-   pkgSourceList List;
-   if (List.ReadMainList() == false)
-      return _error->Error(("The list of sources could not be read."));
-
-   SPtr<pkgPackageManager> PM= _system->CreatePM(Cache);
-   if (PM->GetArchives(&Fetcher, &List, &Recs) == false ||
-       _error->PendingError() == true)
-      return false;
-
-   if (_error->PendingError() == true)
-      return false;
-
-   while (1)
-   {
-      bool Transient = false;
-      if (_config->FindB("APT::Get::Download",true) == false)
-      {
-         for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin(); I < Fetcher.ItemsEnd();)
-         {
-            if ((*I)->Local == true)
-            {
-               I++;
-               continue;
-            }
-
-            // Close the item and check if it was found in cache
-            (*I)->Finished();
-            if ((*I)->Complete == false)
-               Transient = true;
-
-            // Clear it out of the fetch list
-            delete *I;
-            I = Fetcher.ItemsBegin();
-         }
-      }
-
-      if (Fetcher.Run() == pkgAcquire::Failed)
-         return false;
-
-      // Print out errors
-      bool Failed = false;
-      for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin(); I != Fetcher.ItemsEnd(); I++)
-      {
-         if ((*I)->Status == pkgAcquire::Item::StatDone &&
-             (*I)->Complete == true)
-            continue;
-
-         if ((*I)->Status == pkgAcquire::Item::StatIdle)
-         {
-            Transient = true;
-            // Failed = true;
-            continue;
-         }
-
-         fprintf(stderr,("Failed to fetch %s  %s\n"),(*I)->DescURI().c_str(),
-                 (*I)->ErrorText.c_str());
-         Failed = true;
-      }
-
-      /* If we are in no download mode and missing files and there were
-         'failures' then the user must specify -m. Furthermore, there
-         is no such thing as a transient error in no-download mode! */
-      if (Transient == true &&
-          _config->FindB("APT::Get::Download",true) == false)
-      {
-         Transient = false;
-         Failed = true;
-      }
-
-      if (_config->FindB("APT::Get::Download-Only",false) == true)
-      {
-         if (Failed == true && _config->FindB("APT::Get::Fix-Missing",false) == false)
-            return _error->Error(("Some files failed to download"));
-         //c1out << _("Download complete and in download only mode") << endl;
-         return true;
-      }
-
-      if (Failed == true && _config->FindB("APT::Get::Fix-Missing",false) == false)
-      {
-         return _error->Error(("Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?"));
-      }
-
-      if (Transient == true && Failed == true)
-         return _error->Error(("--fix-missing and media swapping is not currently supported"));
-
-      // Try to deal with missing package files
-      if (Failed == true && PM->FixMissing() == false)
-      {
-         cerr << ("Unable to correct missing packages.") << endl;
-         return _error->Error(("Aborting install."));
-      }
-
-      _system->UnLock();
-      int status_fd = _config->FindI("APT::Status-Fd",-1);
-      pkgPackageManager::OrderResult Res = PM->DoInstall(status_fd);
-      if (Res == pkgPackageManager::Failed || _error->PendingError() == true)
-         return false;
-      if (Res == pkgPackageManager::Completed)
-         return true;
-
-      // Reload the fetcher object and loop again for media swapping
-      Fetcher.Shutdown();
-      if (PM->GetArchives(&Fetcher,&List,&Recs) == false)
-         return false;
-
-      _system->Lock();
-   }
-}
-
-
-int main(int argc, char *argv[]) {
-
-    vector<char *> add_list;
-    vector<char *> del_list;
-
-    pkgInitConfig(*_config);
-    pkgInitSystem(*_config, _system);
-
-     _config->Set("Debug::pkgProblemResolver", true);
-
-    OpTextProgress prog;
-    pkgCacheFile cachef;
-
-    if (cachef.Open(prog) == false) {
-       _error->DumpErrors();
-        exit(1);
-    }
-
-    pkgCache *cache = cachef;
-    pkgDepCache *DCache = cachef;
-
-    scanner(add_list, del_list);
-
-    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<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);
-    }
-
-    fprintf(stderr, "\n");
-    fprintf(stderr, "nondownloadable packages:\n");
-    for (pkgCache::PkgIterator i = cache->PkgBegin(); !i.end(); i++) {
-       if (i.CurrentVer() && !i.CurrentVer().Downloadable()) {
-              fprintf(stderr, "%s ", i.Name());
-              fprintf(stderr, "%s\n", DCache->GetCandidateVer(i).VerStr());
-       }
-    }
-
-    fprintf(stderr, "\n");
-    fprintf(stderr, "inst %lu del %lu keep %lu broken %lu bad %lu\n",
-                   DCache->InstCount(), DCache->DelCount(), DCache->KeepCount(),
-                   DCache->BrokenCount(), DCache->BadCount());
-
-    for (pkgCache::PkgIterator i = cache->PkgBegin(); !i.end(); i++) {
-       if ((*DCache)[i].Install())
-         fprintf(stderr, "inst %s\n", i.Name());
-       if ((*DCache)[i].InstBroken())
-         fprintf(stderr, "instbroken %s\n", i.Name());
-       if ((*DCache)[i].NowBroken())
-         fprintf(stderr, "nowbroken %s\n", i.Name());
-    }
-
-    fprintf(stderr, "\n");
-
-    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));
-    fix.Resolve();
-
-    fprintf(stderr, "\n");
-    fprintf(stderr, "inst %lu del %lu keep %lu broken %lu bad %lu\n",
-                   DCache->InstCount(), DCache->DelCount(), DCache->KeepCount(),
-                   DCache->BrokenCount(), DCache->BadCount());
-    for (pkgCache::PkgIterator i = cache->PkgBegin(); !i.end(); i++) {
-       if ((*DCache)[i].Install())
-         fprintf(stderr, "inst %s\n", i.Name());
-       if ((*DCache)[i].Delete())
-         fprintf(stderr, "del %s\n", i.Name());
-       if ((*DCache)[i].InstBroken())
-         fprintf(stderr, "instbroken %s\n", i.Name());
-       if ((*DCache)[i].NowBroken())
-         fprintf(stderr, "nowbroken %s\n", i.Name());
-    }
-
-    fprintf(stderr, "\n");
-
-    InstallPackages(cachef);
-}
diff --git a/parser.h b/parser.h
new file mode 100644 (file)
index 0000000..1aefca3
--- /dev/null
+++ b/parser.h
@@ -0,0 +1 @@
+void scanner(vector<char *> &add_list, vector<char *> &del_list);
diff --git a/parser.rl b/parser.rl
new file mode 100644 (file)
index 0000000..8e9b5b1
--- /dev/null
+++ b/parser.rl
@@ -0,0 +1,121 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <vector>
+
+using namespace std;
+
+#define xstrndup strndup
+
+%%{
+    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();
+      }
+    }
+
+    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();
+    }
+
+    action misc_error {
+        fprintf(stderr, "%s: %d: Syntax Error\n", "stdin", curline);
+    }
+
+    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;
+    main := (cmd_install | cmd_remove | whitespace)* $err(misc_error);
+}%%
+
+%% write data;
+
+#define BUFSIZE 128
+
+void scanner(vector<char *> &add_list, vector<char *> &del_list)
+{
+    static char buf[BUFSIZE];
+    int cs, have = 0;
+    int done = 0;
+    int curline = 1;
+    char *ts = 0, *te = 0;
+
+    vector<char *> tmp_list;
+
+    %% write init;
+
+    while ( !done ) {
+        char *p = buf + have, *pe, *eof = 0;
+        int len, space = BUFSIZE - have;
+
+        if (space == 0) {
+            fprintf(stderr, "OUT OF BUFFER SPACE\n");
+            exit(1);
+        }
+
+        len = fread(p, 1, space, stdin);
+        pe = p + len;
+
+        if (len < space) {
+            eof = pe;
+            done = 1;
+        }
+
+        %% write exec;
+
+        if (cs == inapt_error) {
+            fprintf(stderr, "PARSE ERROR\n");
+           exit(1);
+        }
+
+        have = 0;
+
+        if (ts) {
+            have = pe - ts;
+            memmove(buf, ts, have);
+            te = buf + (te - ts);
+            ts = buf;
+        }
+    }
+
+    if (cs < inapt_first_final) {
+       fprintf(stderr, "UNEXPECTED EOF\n");
+       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;
+}
+*/