jos/lib/args.c
Anish Athalye c67463e23c Lab 5
2018-10-24 20:44:45 -04:00

74 lines
1.5 KiB
C

#include <inc/args.h>
#include <inc/string.h>
void
argstart(int *argc, char **argv, struct Argstate *args)
{
args->argc = argc;
args->argv = (const char **) argv;
args->curarg = (*argc > 1 && argv ? "" : 0);
args->argvalue = 0;
}
int
argnext(struct Argstate *args)
{
int arg;
args->argvalue = 0;
// Done processing arguments if args->curarg == 0
if (args->curarg == 0)
return -1;
if (!*args->curarg) {
// Need to process the next argument
// Check for end of argument list
if (*args->argc == 1
|| args->argv[1][0] != '-'
|| args->argv[1][1] == '\0')
goto endofargs;
// Shift arguments down one
args->curarg = args->argv[1] + 1;
memmove(args->argv + 1, args->argv + 2, sizeof(const char *) * (*args->argc - 1));
(*args->argc)--;
// Check for "--": end of argument list
if (args->curarg[0] == '-' && args->curarg[1] == '\0')
goto endofargs;
}
arg = (unsigned char) *args->curarg;
args->curarg++;
return arg;
endofargs:
args->curarg = 0;
return -1;
}
char *
argvalue(struct Argstate *args)
{
return (char*) (args->argvalue ? args->argvalue : argnextvalue(args));
}
char *
argnextvalue(struct Argstate *args)
{
if (!args->curarg)
return 0;
if (*args->curarg) {
args->argvalue = args->curarg;
args->curarg = "";
} else if (*args->argc > 1) {
args->argvalue = args->argv[1];
memmove(args->argv + 1, args->argv + 2, sizeof(const char *) * (*args->argc - 1));
(*args->argc)--;
} else {
args->argvalue = 0;
args->curarg = 0;
}
return (char*) args->argvalue;
}