File: args.h

package info (click to toggle)
nyquist 3.12%2Bds-4
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 58,036 kB
  • sloc: ansic: 74,355; lisp: 20,485; java: 9,390; cpp: 6,695; sh: 207; xml: 58; makefile: 40
file content (65 lines) | stat: -rw-r--r-- 1,437 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
 * Argument processing macros
 * I got tired of rethinking this everytime,
 * and 4xbsd doesn't have getopt()
 *
 * The following is an example of the use of this stuff
 *

#include "args.h"
#include <stdio.h>

main(argc, argv)
char **argv;
{
    char *a = "a", *b = "b", *c = "c";
    int x = 0, y = 0, z = 0;
    ARGLOOP
        STRINGARG(a)	a = p;		ENDSTRINGARG
        STRINGARG(b)	b = p;		ENDSTRINGARG
        STRINGARG(c)	c = p;		ENDSTRINGARG
        FLAGARG(x)	x++;		ENDFLAGARG
        FLAGARG(y)	y++;		ENDFLAGARG
        FLAGARG(z)	z++;		ENDFLAGARG

        BADARG
            fprintf(stderr, "unknown option %c\n", *p);
            fprintf(stderr, "Usage: usage\n");
            exit(1);
        ENDBADARG
    ENDARGLOOP

    Here, the remaining args are argv[0] to argv[argc - 1] 

    printf("a=%s b=%s c=%s x=%d y=%d z=%d\nargs:", a, b, c, x, y, z);
    { int i; for(i = 0; i < argc; i++)
        printf(" %s", argv[i]);
    }
    printf("\n");
}

 *
 */


#define	ARGLOOP						\
    while(--argc > 0 && **++argv == '-') {		\
        register char *p;				\
        for(p = *argv + 1; *p != '\0'; p++) {	\
        switch(*p) {				\

#define ENDARGLOOP					\
        }					\
        }						\
nextarg:;						\
    }						\

#define FLAGARG(c)	case c:
#define ENDFLAGARG	break;

#define STRINGARG(c)	case c: if(!*++p) p = *++argv, argc--;
#define ENDSTRINGARG	goto nextarg;

#define	BADARG		default:
#define ENDBADARG	break;