From 390722f04a69f8f2233bfed59031cf32ca262c85 Mon Sep 17 00:00:00 2001 From: ken Date: Sat, 18 Feb 2017 11:03:13 -0800 Subject: [PATCH] package name resolution --- src/apc.c | 111 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 65 insertions(+), 46 deletions(-) diff --git a/src/apc.c b/src/apc.c index 494be6e..5bd846d 100644 --- a/src/apc.c +++ b/src/apc.c @@ -23,10 +23,11 @@ #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; } -- 2.18.0