X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=rmac.c;h=4772d203bd93d612f5e9e6a7121ae37e98fc9786;hp=4fb1582a725c603ff64663bad92b59a63d008ba9;hb=3a00205f107ec3c620e87c94ebb240abdf4f1787;hpb=9afaf60ca24cdb08f900ae584107e29e3af46566 diff --git a/rmac.c b/rmac.c index 4fb1582..4772d20 100644 --- a/rmac.c +++ b/rmac.c @@ -50,6 +50,7 @@ int endian; // Host processor endianess (0 = LE, 1 = BE) char * objfname; // Object filename pointer char * firstfname; // First source filename char * cmdlnexec; // Executable name, pointer to ARGV[0] +char searchpatha[512] = { 0 }; // Buffer to hold searchpath when specified char * searchpath = NULL; // Search path for include files char defname[] = "noname.o"; // Default output filename int optim_flags[OPT_COUNT]; // Specific optimisations on/off matrix @@ -163,17 +164,17 @@ void DisplayHelp(void) " -o file Output file name\n" " +o[value] Turn a specific optimisation on\n" " Available optimisation values and default settings:\n" - " o0: Absolute long addresses to word (on)\n" - " o1: move.l #x,dn/an to moveq (on)\n" - " o2: Word branches to short (on)\n" - " o3: Outer displacement 0(an) to (an) (off)\n" - " o4: lea size(An),An to addq #size,An (off)\n" - " o5: 68020+ Absolute long base/outer displacement to word (off)\n" - " o6: Null branches to NOP (off)\n" - " o7: clr.l Dx to moveq #0,Dx (off)\n" - " o8: adda.w/l #x,Dy to addq.w/l #x,Dy (off)\n" - " o9: adda.w/l #x,Dy to lea x(Dy),Dy (off)\n" - " op: Enforce PC relative (off)\n" + " o0: Absolute long addresses to word (on)\n" + " o1: move.l #x,dn/an to moveq (on)\n" + " o2: Word branches to short (on)\n" + " o3: Outer displacement 0(an) to (an) (off)\n" + " o4: lea size(An),An to addq #size,An (off)\n" + " o5: 68020+ Absolute long base/outer disp. to word (off)\n" + " o6: Null branches to NOP (off)\n" + " o7: clr.l Dx to moveq #0,Dx (off)\n" + " o8: adda.w/l #x,Dy to addq.w/l #x,Dy (off)\n" + " o9: adda.w/l #x,Dy to lea x(Dy),Dy (off)\n" + " op: Enforce PC relative (off)\n" " ~o[value] Turn a specific optimisation off\n" " +oall Turn all optimisations on\n" " ~oall Turn all optimisations off\n" @@ -243,15 +244,17 @@ int ParseOptimization(char * optstring) else { int opt_no = atoi(&optstring[2]); + if ((opt_no >= 0) && (opt_no < OPT_COUNT)) { optim_flags[opt_no] = onoff; optstring += 3; + // If opt_no is 2 digits then consume an extra character. // Sounds a bit sleazy but we know we're not going to hit - // more than 100 optimisation switches so this should be fine. - // If we do hit that number then it'll probably be time to burn - // the whole codebase and start from scratch. + // more than 100 optimisation switches so this should be + // fine. If we do hit that number then it'll probably be + // time to burn the whole codebase and start from scratch. if (opt_no > 9) optstring++; } @@ -263,6 +266,7 @@ int ParseOptimization(char * optstring) { return ERROR; } + if (*optstring == ',') optstring++; } @@ -281,6 +285,7 @@ int Process(int argc, char ** argv) int fd; // File descriptor char fnbuf[FNSIZ]; // Filename buffer int i; // Iterator + int current_path_index = 0; // Iterator for search paths errcnt = 0; // Initialize error count listing = 0; // Initialize listing level @@ -290,7 +295,6 @@ int Process(int argc, char ** argv) glob_flag = 0; // Initialize .globl flag optim_warn_flag = 0; // Initialize short branch flag debug = 0; // Initialize debug flag - searchpath = NULL; // Initialize search path objfname = NULL; // Initialize object filename list_fname = NULL; // Initialize listing filename err_fname = NULL; // Initialize error filename @@ -407,23 +411,31 @@ int Process(int argc, char ** argv) case 'i': // Set directory search path case 'I': { - searchpath = argv[argno] + 2; + strcat(searchpatha, argv[argno] + 2); + strcat(searchpatha, ";"); + searchpath = searchpatha; // Check to see if include paths actually exist - if (strlen(searchpath) > 0) - { - DIR * test = opendir(searchpath); + char current_path[256]; - if (test == NULL) + for(i=current_path_index; nthpath("RMACPATH", i, current_path)!=0; i++) + { + if (strlen(current_path) > 0) { - printf("Invalid include path: %s\n", searchpath); - errcnt++; - return errcnt; - } + DIR * test = opendir(current_path); - closedir(test); + if (test == NULL) + { + printf("Invalid include path: %s\n", current_path); + errcnt++; + return errcnt; + } + + closedir(test); + } } + current_path_index = i - 1; break; } case 'l': // Produce listing file