* same with xv6
[mascara-docs.git] / i386 / MIT / course / src / src.lab / lib / args.c
blob9269aca11d86ae298dc643f11a15527b93fc3f23
1 #include <inc/args.h>
2 #include <inc/string.h>
4 void
5 argstart(int *argc, char **argv, struct Argstate *args)
7 args->argc = argc;
8 args->argv = (const char **) argv;
9 args->curarg = (*argc > 1 && argv ? "" : 0);
10 args->argvalue = 0;
13 int
14 argnext(struct Argstate *args)
16 int arg;
18 args->argvalue = 0;
20 // Done processing arguments if args->curarg == 0
21 if (args->curarg == 0)
22 return -1;
24 if (!*args->curarg) {
25 // Need to process the next argument
26 // Check for end of argument list
27 if (*args->argc == 1
28 || args->argv[1][0] != '-'
29 || args->argv[1][1] == '\0')
30 goto endofargs;
31 // Shift arguments down one
32 args->curarg = args->argv[1] + 1;
33 memmove(args->argv + 1, args->argv + 2, sizeof(const char *) * (*args->argc - 1));
34 (*args->argc)--;
35 // Check for "--": end of argument list
36 if (args->curarg[0] == '-' && args->curarg[1] == '\0')
37 goto endofargs;
40 arg = (unsigned char) *args->curarg;
41 args->curarg++;
42 return arg;
44 endofargs:
45 args->curarg = 0;
46 return -1;
49 char *
50 argvalue(struct Argstate *args)
52 return (char*) (args->argvalue ? args->argvalue : argnextvalue(args));
55 char *
56 argnextvalue(struct Argstate *args)
58 if (!args->curarg)
59 return 0;
60 if (*args->curarg) {
61 args->argvalue = args->curarg;
62 args->curarg = "";
63 } else if (*args->argc > 1) {
64 args->argvalue = args->argv[1];
65 memmove(args->argv + 1, args->argv + 2, sizeof(const char *) * (*args->argc - 1));
66 (*args->argc)--;
67 } else {
68 args->argvalue = 0;
69 args->curarg = 0;
71 return (char*) args->argvalue;