root class is name of package, apc_package_name available to extern
[henge/apc.git] / src / apc.c
index df4810e..494be6e 100644 (file)
--- a/src/apc.c
+++ b/src/apc.c
 /* Posix */
 #include <stdlib.h> //exit
 #include <unistd.h> //getopt, sysconf
+#include <dirent.h> //opendir
 /* Internal */
+#include "apc.h"
 #include "parser.tab.h" //bison
 #include "ir.h"
 
 #define DEFAULT_PAGESIZE 4096
-const char* cargs['Z'] = {0};
+const char** cargs;
+const char*  apc_package_name;
 long  sys_pagesize;
   
 int main(int, char*[]);
@@ -35,7 +38,7 @@ int  scanner_init(void);
 extern //scanner.c
 void scanner_quit(void);
 extern //scanner.c
-int  scanner_scanpath(char const*);
+int  scanner_scandir(DIR*);
 extern //ir.c
 int  ir_init(void);
 extern //ir.c
@@ -63,8 +66,12 @@ int main
   "\t\t-o\tOutput filename \t\t[a.asspak]\n"           \
   "\t\t-h\tPrint this help\n"
 #define DONE   -1
-#define SCANPATH (cargs['d'] ? cargs['d'] : "./")
 { int   opt;
+  const char* scanpath;
+  char* path_iter;
+  char  path_buf[APC_NAME_MAX];
+  DIR*  dirp;
+  cargs = (const char**) malloc('Z');
  getopt:
   switch (opt = getopt(argc, argv, OPTS))
   { case 'd' :
@@ -88,38 +95,45 @@ int main
     sys_pagesize = DEFAULT_PAGESIZE;
   if (ir_init())
     { perror("init");
+      free(cargs);
       exit(EXIT_FAILURE);
     }
-#if 0
-  if (scanner_scanpath(SCANPATH))
-    { perror("scanner");
+  
+  scanpath = cargs['d'] ? cargs['d'] : "./";
+  errno = 0;
+  dirp = opendir(scanpath);
+  if (dirp == NULL || errno)
+    { fprintf(stderr, "Path %s could not be accessed\n", scanpath);
+      return -1;
+    }
+  if (chdir(scanpath))
+    { fprintf(stderr, "Could not change directory to %s \n", scanpath);
+      return -1;
+    }
+  apc_package_name = path_iter = getcwd(path_buf, APC_NAME_MAX - 1);
+ basename:
+  while (*path_iter != '\0')
+    { if (*path_iter == '/')
+       apc_package_name = path_iter + 1;
+      path_iter++;
+    }
+  if (apc_package_name == path_buf)
+    { fprintf(stderr, "Error resolving package name from path %s\n", path_buf);
+      free(cargs);
       exit(EXIT_FAILURE);
     }
-#endif
-  ir_class class;
-  ir_set   set;
-  int i, j;
-  char wordbuf[0xFFF];
-  for (class = ir_class_root(), i = 0, j = 0; i < 100; i++)
-    { sprintf(wordbuf,"Class%i",i);
-      class = ir_class_addchild(class,(uint8_t*)wordbuf);
-      sprintf(wordbuf,"c%i-s%i",i,j++);
-      set = ir_class_addset(class, (uint8_t*)wordbuf);
-      sprintf(wordbuf,"c%i-s%i",i,j++);
-      ir_class_addset(class, (uint8_t*)wordbuf);
-      sprintf(wordbuf,"c%i-s%i",i,j++);
-      ir_class_addset(class, (uint8_t*)wordbuf);
-      sprintf(wordbuf,"c%i-sc%i",i,j=0);
-      set = ir_set_addchild(set, (uint8_t*)wordbuf);
-      sprintf(wordbuf,"c%i-sc%i",i,++j);
-      ir_set_addchild(set, (uint8_t*)wordbuf);
-      sprintf(wordbuf,"c%i-sc%i",i,++j);
-      set = ir_set_addchild(set, (uint8_t*)wordbuf);
-      sprintf(wordbuf,"c%i-sb%i",i,j=0);
-      ir_set_addchild(set, (uint8_t*)wordbuf);
+  if (apc_package_name == path_iter)
+    { *--path_iter = '\0';
+      goto basename;
+    }
+  if (scanner_scandir(dirp))
+    { perror("scanner");
+      free(cargs);
+      exit(EXIT_FAILURE);
     }
   ir_test();
   ir_linker();
   ir_condenser();
+  free(cargs);
   exit(EXIT_SUCCESS);
 }