package name resolution
authorken <ken@mihrtec.com>
Sat, 18 Feb 2017 19:03:13 +0000 (11:03 -0800)
committerken <ken@mihrtec.com>
Sat, 18 Feb 2017 19:03:13 +0000 (11:03 -0800)
src/apc.c

index 494be6e..5bd846d 100644 (file)
--- a/src/apc.c
+++ b/src/apc.c
 #include "apc.h"
 #include "parser.tab.h" //bison
 #include "ir.h"
+#include "print.h"
 
 #define DEFAULT_PAGESIZE 4096
 const char** cargs;
-const char*  apc_package_name;
+const uint8_t*  apc_package_name;
 long  sys_pagesize;
   
 int main(int, char*[]);
@@ -46,17 +47,13 @@ int  ir_linker(void);
 extern //ir.c
 int  ir_condenser(void);
 extern
-void     ir_test(void);
+void ir_test(void);
+
+static
+char* getcwd_basename(void);
 
-/* Main entry from terminal
-   parses the command line and kicks off recursive scanning
-*/
-int main
-( int   argc,
-  char* argv[]
-)
 #define $($)#$ //stringifier
-#define MAXSTR 255
+#define MAXSTR 4096
 #define MAXERR "-%c allows at most " $(MAXSTR) " input characters\n", opt
 #define OPTS  "d:o:h-"
 #define USAGE "Usage %s [-d dir_root][-o output_file][-h]\n", argv[0]
@@ -66,15 +63,32 @@ int main
   "\t\t-o\tOutput filename \t\t[a.asspak]\n"           \
   "\t\t-h\tPrint this help\n"
 #define DONE   -1
+#undef eprintf_callback
+#define free_and_exit(ecode) do {              \
+    free(cargs);                               \
+    exit(ecode);                               \
+  } while(0)
+#define eprintf_callback(...) free_and_exit(EXIT_FAILURE)
+/* Main entry from terminal
+   parses the command line and kicks off recursive scanning
+*/
+int main
+( int   argc,
+  char* argv[]
+)
 { int   opt;
-  const char* scanpath;
-  char* path_iter;
-  char  path_buf[APC_NAME_MAX];
   DIR*  dirp;
+  const char* scanpath;
+  char*       path_iter;
   cargs = (const char**) malloc('Z');
  getopt:
   switch (opt = getopt(argc, argv, OPTS))
   { case 'd' :
+      path_iter = optarg;
+      while (*path_iter++ != '\0');
+      path_iter -= 2;
+      if (*path_iter == '/')
+       *path_iter = '\0';
     case 'o' :
       if (strnlen(optarg, MAXSTR) != MAXSTR)
         { cargs[opt] = optarg;
@@ -82,12 +96,11 @@ int main
         }
       fprintf(stderr, MAXERR);
     default :
-      fprintf(stderr, USAGE);
-      exit(EXIT_FAILURE);
+      eprintf(USAGE);
     case 'h' :
       printf(USAGE);
       printf(USAGE_LONG);
-      exit(EXIT_SUCCESS);
+      free_and_exit(EXIT_SUCCESS);
     case DONE:
       break;
   }
@@ -95,45 +108,51 @@ int main
     sys_pagesize = DEFAULT_PAGESIZE;
   if (ir_init())
     { perror("init");
-      free(cargs);
-      exit(EXIT_FAILURE);
+      free_and_exit(EXIT_FAILURE);
     }
-  
   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;
+    eprintf("Path %s could not be accessed: %s\n", scanpath, strerror(errno));
+  errno = 0;
+  if (chdir(scanpath) || errno)
+    eprintf("Could not change directory to %s: %s\n", scanpath, strerror(errno));
+  apc_package_name = (uint8_t*) getcwd_basename();
+  if (scanner_scandir(dirp))
+    eprintf(strerror(errno));
+  ir_test();
+  ir_linker();
+  ir_condenser();
+  free_and_exit(EXIT_SUCCESS);
+}
+
+static
+char* getcwd_basename
+( void )
+{ char* path_iter,* path_buf,* path;
+  int   pages;
+  path = NULL;
+  pages = 1;
+ try_cwd:
+  path_buf = (char*) malloc(MAXSTR * pages);
+  errno = 0;
+  getcwd(path_buf, MAXSTR * pages);
+  if (errno == ERANGE)
+    { pages++;
+      free(path_buf);
+      goto try_cwd;
     }
-  if (chdir(scanpath))
-    { fprintf(stderr, "Could not change directory to %s \n", scanpath);
-      return -1;
+  else if (errno)
+    { perror(NULL);
+      free(path_buf);
+      return NULL;
     }
-  apc_package_name = path_iter = getcwd(path_buf, APC_NAME_MAX - 1);
- basename:
+  path = path_iter = path_buf;
   while (*path_iter != '\0')
     { if (*path_iter == '/')
-       apc_package_name = path_iter + 1;
+       path = 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);
-    }
-  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);
+  return path;
 }