diff --git a/main.c b/main.c index e56c128..bf1e1e7 100644 --- a/main.c +++ b/main.c @@ -58,15 +58,19 @@ static void usage(void) } static void bad_args(void) { usage(); exit(1); } +char ** process_args(char **argv, + long *heap_size, + long *stack_size, + char **object_file, + char **image_name); main(argc, argv) int argc; char **argv; { - extern char **process_meta_arg(char **); + char **argp; char *image_name = DEFAULT_IMAGE_NAME; long heap_size = DEFAULT_HEAP_SIZE; /* in numbers of cells */ long stack_size = DEFAULT_STACK_SIZE; /* in numbers of cells */ - char **argp; long return_value; extern void sysdep_init(); extern long required_init_space(); @@ -88,62 +92,11 @@ main(argc, argv) prog_name = *argv++; /* Save program name. */ object_file = reloc_file = NULL; + + argv=process_args(argv, + &heap_size, &stack_size, + &object_file, &image_name); - /* Handle an initial \ meta-arg expansion. */ - while ( *argv && streq(*argv, "\\") ) { - argv++; - if( !*argv ) bad_args(); /* die */ - argv = process_meta_arg(argv); - if( !argv ) { - fprintf(stderr, "%s: \\ expansion failed.\n", - prog_name); - exit(1); - } - } - - for (; *argv; argv++) - if( argv[0][0] != '-' ) - bad_args(); /* die */ - else - switch (argv[0][1]) { - default: - bad_args(); /* die */ - break; - - case 'h': /* heapsize */ - argv++; - if( !*argv ) bad_args(); /* die */ - heap_size = atoi(*argv); - if( heap_size <= 0 ) bad_args(); - break; - - case 's': - argv++; - if( !*argv ) bad_args(); /* die */ - stack_size = atoi(*argv); - if (stack_size <= 0) bad_args(); - break; - - case 'o': /* object file */ - argv++; - if( !*argv ) bad_args(); /* die */ - object_file = *argv; - break; - - /* These switches terminate arg scanning. */ - case 'i': - argv++; - if( !*argv ) bad_args(); /* die */ - image_name = *argv++; - goto args_done; - - case '-': - case 'a': - argv++; - goto args_done; - } - - args_done: for(argc=0, argp=argv; *argp; argc++, argp++); /* Recompute argc. */ sysdep_init(); @@ -196,3 +149,65 @@ main(argc, argv) return(return_value); } + +char ** process_args(char **argv, + long *pheap_size, + long *pstack_size, + char **pobject_file, + char **pimage_name) { + extern char **process_meta_arg(char **); + /* Handle an initial \ meta-arg expansion. */ + while ( *argv && streq(*argv, "\\") ) { + argv++; + if( !*argv ) bad_args(); /* die */ + argv = process_meta_arg(argv); + if( !argv ) { + fprintf(stderr, "%s: \\ expansion failed.\n", + prog_name); + exit(1); + } + } + + for (; *argv; argv++) + if( argv[0][0] != '-' ) + bad_args(); /* die */ + else + switch (argv[0][1]) { + default: + bad_args(); /* die */ + break; + + case 'h': /* heapsize */ + argv++; + if( !*argv ) bad_args(); /* die */ + *pheap_size = atoi(*argv); + if( *pheap_size <= 0 ) bad_args(); + break; + + case 's': + argv++; + if( !*argv ) bad_args(); /* die */ + *pstack_size = atoi(*argv); + if (*pstack_size <= 0) bad_args(); + break; + + case 'o': /* object file */ + argv++; + if( !*argv ) bad_args(); /* die */ + *pobject_file = *argv; + break; + + /* These switches terminate arg scanning. */ + case 'i': + argv++; + if( !*argv ) bad_args(); /* die */ + *pimage_name = *argv++; + return argv; + + case '-': + case 'a': + argv++; + return argv; + } + return argv; +}