/* 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*[]);
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
"\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;
- if ((sys_pagesize = sysconf(_SC_PAGESIZE)) == 0)
- sys_pagesize = DEFAULT_PAGESIZE;
- if (ir_init())
- { perror("init");
- exit(EXIT_FAILURE);
- }
+ 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' :
case DONE:
break;
}
- if (scanner_scanpath(SCANPATH))
+ if ((sys_pagesize = sysconf(_SC_PAGESIZE)) == 0)
+ sys_pagesize = DEFAULT_PAGESIZE;
+ if (ir_init())
+ { perror("init");
+ free(cargs);
+ 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;
+ }
+ 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);
+ }
+ 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);
}