]> cloudbase.mooo.com Git - z180-stamp.git/blame - avr/getopt-min.c
Define fifos: msg_tx_fifo, msg_rx_fifo
[z180-stamp.git] / avr / getopt-min.c
CommitLineData
41d36f28
L
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
19int optind = 1; /* next argv[] index */
20char *optarg; /* option parameter if any */
21
22
23int
24getopt( /* 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 )
cd5ee544 42 return -1;
41d36f28
L
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