]> cloudbase.mooo.com Git - z180-stamp.git/blob - avr/getopt-min.c
778258d52b9f9790e7d34dc33a45415e7527423c
[z180-stamp.git] / avr / getopt-min.c
1 #include "common.h"
2 #include <avr/pgmspace.h>
3
4
5 /*
6 * Minimum getopt, original version was:
7 */
8
9 /*
10 getopt -- public domain version of standard System V routine
11
12 Strictly enforces the System V Command Syntax Standard;
13 provided by D A Gwyn of BRL for generic ANSI C implementations
14 */
15 /* $Id: getopt.c,v 1.2 1992/12/07 11:12:52 nickc Exp $ */
16
17 #include <string.h>
18
19 int optind = 1; /* next argv[] index */
20 char *optarg; /* option parameter if any */
21
22
23 int
24 getopt( /* returns letter, '?', EOF */
25 int argc, /* argument count from main */
26 char *const argv[], /* argument vector from main */
27 const FLASH char *optstring ) /* allowed args, e.g. "ab:c" */
28 {
29 static int sp = 1; /* position within argument */
30 int osp; /* saved `sp' for param test */
31 int c; /* option letter */
32 const FLASH char *cp; /* -> option in `optstring' */
33
34 optarg = NULL;
35
36 if ( sp == 1 ) /* fresh argument */
37 {
38 if ( optind >= argc /* no more arguments */
39 || argv[optind][0] != '-' /* no more options */
40 || argv[optind][1] == '\0' /* not option; stdin */
41 )
42 return EOF;
43 }
44
45 c = argv[optind][sp]; /* option letter */
46 osp = sp++; /* get ready for next letter */
47
48 if ( argv[optind][sp] == '\0' ) /* end of argument */
49 {
50 ++optind; /* get ready for next try */
51 sp = 1; /* beginning of next argument */
52 }
53
54 if ( c == ':' /* optstring syntax conflict */
55 || (cp = strchr_P( optstring, c )) == NULL /* not found */
56 )
57 return '?';
58
59 if ( cp[1] == ':' ) /* option takes parameter */
60 {
61 if ( osp != 1 )
62 return '?';
63
64 if ( sp != 1 ) /* reset by end of argument */
65 return '?';
66
67 if ( optind >= argc )
68 return '?';
69
70 optarg = argv[optind]; /* make parameter available */
71 ++optind; /* skip over parameter */
72 }
73
74 return c;
75 }
76