factored out arg parsing; have not gotten the static linker to support linking in a new one yet; probably no more work required here though
This commit is contained in:
parent
26b8de258e
commit
55a65c1b64
129
main.c
129
main.c
|
@ -58,15 +58,19 @@ static void usage(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bad_args(void) { usage(); exit(1); }
|
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)
|
main(argc, argv)
|
||||||
int argc; char **argv;
|
int argc; char **argv;
|
||||||
{
|
{
|
||||||
extern char **process_meta_arg(char **);
|
char **argp;
|
||||||
char *image_name = DEFAULT_IMAGE_NAME;
|
char *image_name = DEFAULT_IMAGE_NAME;
|
||||||
long heap_size = DEFAULT_HEAP_SIZE; /* in numbers of cells */
|
long heap_size = DEFAULT_HEAP_SIZE; /* in numbers of cells */
|
||||||
long stack_size = DEFAULT_STACK_SIZE; /* in numbers of cells */
|
long stack_size = DEFAULT_STACK_SIZE; /* in numbers of cells */
|
||||||
char **argp;
|
|
||||||
long return_value;
|
long return_value;
|
||||||
extern void sysdep_init();
|
extern void sysdep_init();
|
||||||
extern long required_init_space();
|
extern long required_init_space();
|
||||||
|
@ -88,62 +92,11 @@ main(argc, argv)
|
||||||
prog_name = *argv++; /* Save program name. */
|
prog_name = *argv++; /* Save program name. */
|
||||||
|
|
||||||
object_file = reloc_file = NULL;
|
object_file = reloc_file = NULL;
|
||||||
|
|
||||||
|
argv=process_args(argv,
|
||||||
|
&heap_size, &stack_size,
|
||||||
|
&object_file, &image_name);
|
||||||
|
|
||||||
/* Handle an initial \ <fname> meta-arg expansion. */
|
|
||||||
while ( *argv && streq(*argv, "\\") ) {
|
|
||||||
argv++;
|
|
||||||
if( !*argv ) bad_args(); /* die */
|
|
||||||
argv = process_meta_arg(argv);
|
|
||||||
if( !argv ) {
|
|
||||||
fprintf(stderr, "%s: \\ <fname> 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. */
|
for(argc=0, argp=argv; *argp; argc++, argp++); /* Recompute argc. */
|
||||||
|
|
||||||
sysdep_init();
|
sysdep_init();
|
||||||
|
@ -196,3 +149,65 @@ main(argc, argv)
|
||||||
|
|
||||||
return(return_value);
|
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 \ <fname> meta-arg expansion. */
|
||||||
|
while ( *argv && streq(*argv, "\\") ) {
|
||||||
|
argv++;
|
||||||
|
if( !*argv ) bad_args(); /* die */
|
||||||
|
argv = process_meta_arg(argv);
|
||||||
|
if( !argv ) {
|
||||||
|
fprintf(stderr, "%s: \\ <fname> 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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue