#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*[]);
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]
"\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;
}
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;
}
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;
}