annotate src/getopt.c @ 4650:4938d12f6d48

[gaim-migrate @ 4961] This is mostly just me cleaning up some of my mess. The one important change is... I set what is believed to be the UTF8 capability flag for ICQ. I'm hoping this will tell ICQ2002 and more recent that we are able to accept UTF8 messages. Please test this and let us know what happens. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Wed, 05 Mar 2003 05:10:47 +0000
parents 3dbc2cd326e2
children fa6395637e2c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
991
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1 /* Getopt for GNU.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2 NOTE: getopt is now part of the C library, so if you don't know what
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
3 "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
4 before changing it!
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
5
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
6 Copyright (C) 1987, 88, 89, 90, 91, 92, 1993
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
7 Free Software Foundation, Inc.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
8
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
9 This program is free software; you can redistribute it and/or modify it
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
10 under the terms of the GNU General Public License as published by the
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
11 Free Software Foundation; either version 2, or (at your option) any
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
12 later version.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
13
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
14 This program is distributed in the hope that it will be useful,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
17 GNU General Public License for more details.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
18
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
19 You should have received a copy of the GNU General Public License
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
20 along with this program; if not, write to the Free Software
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
21 Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
22
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
23 /* NOTE!!! AIX requires this to be the first thing in the file.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
24 Do not put ANYTHING before it! */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
25 #if !defined (__GNUC__) && defined (_AIX)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
26 #pragma alloca
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
27 #endif
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
28
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
29 #ifdef HAVE_CONFIG_H
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
30 #include "config.h"
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
31 #endif
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
32
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
33 #ifdef __GNUC__
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
34 #define alloca __builtin_alloca
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
35 #else /* not __GNUC__ */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
36 #if defined (HAVE_ALLOCA_H) || (defined(sparc) && (defined(sun) || (!defined(USG) && !defined(SVR4) && !defined(__svr4__))))
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
37 #include <alloca.h>
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
38 #else
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
39 #ifndef _AIX
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
40 char *alloca ();
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
41 #endif
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
42 #endif /* alloca.h */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
43 #endif /* not __GNUC__ */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
44
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
45 #if !__STDC__ && !defined(const) && IN_GCC
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
46 #define const
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
47 #endif
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
48
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
49 /* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
50 #ifndef _NO_PROTO
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
51 #define _NO_PROTO
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
52 #endif
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
53
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
54 #include <stdio.h>
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
55
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
56 /* Comment out all this code if we are using the GNU C Library, and are not
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
57 actually compiling the library itself. This code is part of the GNU C
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
58 Library, but also included in many other GNU distributions. Compiling
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
59 and linking in this code is a waste when using the GNU C library
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
60 (especially if it is a shared library). Rather than having every GNU
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
61 program understand `configure --with-gnu-libc' and omit the object files,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
62 it is simpler to just do this in the source for each such file. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
63
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
64 #if defined (_LIBC) || !defined (__GNU_LIBRARY__)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
65
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
66
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
67 /* This needs to come after some library #include
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
68 to get __GNU_LIBRARY__ defined. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
69 #ifdef __GNU_LIBRARY__
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
70 #undef alloca
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
71 /* Don't include stdlib.h for non-GNU C libraries because some of them
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
72 contain conflicting prototypes for getopt. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
73 #include <stdlib.h>
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
74 #else /* Not GNU C library. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
75 #define __alloca alloca
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
76 #endif /* GNU C library. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
77
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
78 /* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
79 long-named option. Because this is not POSIX.2 compliant, it is
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
80 being phased out. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
81 /* #define GETOPT_COMPAT */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
82
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
83 /* This version of `getopt' appears to the caller like standard Unix `getopt'
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
84 but it behaves differently for the user, since it allows the user
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
85 to intersperse the options with the other arguments.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
86
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
87 As `getopt' works, it permutes the elements of ARGV so that,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
88 when it is done, all the options precede everything else. Thus
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
89 all application programs are extended to handle flexible argument order.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
90
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
91 Setting the environment variable POSIXLY_CORRECT disables permutation.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
92 Then the behavior is completely standard.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
93
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
94 GNU application programs can use a third alternative mode in which
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
95 they can distinguish the relative order of options and other arguments. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
96
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
97 #include "getopt.h"
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
98
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
99 /* For communication from `getopt' to the caller.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
100 When `getopt' finds an option that takes an argument,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
101 the argument value is returned here.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
102 Also, when `ordering' is RETURN_IN_ORDER,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
103 each non-option ARGV-element is returned here. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
104
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
105 char *optarg = 0;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
106
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
107 /* Index in ARGV of the next element to be scanned.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
108 This is used for communication to and from the caller
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
109 and for communication between successive calls to `getopt'.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
110
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
111 On entry to `getopt', zero means this is the first call; initialize.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
112
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
113 When `getopt' returns EOF, this is the index of the first of the
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
114 non-option elements that the caller should itself scan.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
115
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
116 Otherwise, `optind' communicates from one call to the next
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
117 how much of ARGV has been scanned so far. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
118
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
119 /* XXX 1003.2 says this must be 1 before any call. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
120 int optind = 0;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
121
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
122 /* The next char to be scanned in the option-element
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
123 in which the last option character we returned was found.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
124 This allows us to pick up the scan where we left off.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
125
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
126 If this is zero, or a null string, it means resume the scan
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
127 by advancing to the next ARGV-element. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
128
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
129 static char *nextchar;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
130
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
131 /* Callers store zero here to inhibit the error message
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
132 for unrecognized options. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
133
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
134 int opterr = 1;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
135
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
136 /* Set to an option character which was unrecognized.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
137 This must be initialized on some systems to avoid linking in the
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
138 system's own getopt implementation. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
139
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
140 int optopt = '?';
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
141
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
142 /* Describe how to deal with options that follow non-option ARGV-elements.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
143
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
144 If the caller did not specify anything,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
145 the default is REQUIRE_ORDER if the environment variable
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
146 POSIXLY_CORRECT is defined, PERMUTE otherwise.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
147
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
148 REQUIRE_ORDER means don't recognize them as options;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
149 stop option processing when the first non-option is seen.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
150 This is what Unix does.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
151 This mode of operation is selected by either setting the environment
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
152 variable POSIXLY_CORRECT, or using `+' as the first character
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
153 of the list of option characters.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
154
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
155 PERMUTE is the default. We permute the contents of ARGV as we scan,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
156 so that eventually all the non-options are at the end. This allows options
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
157 to be given in any order, even with programs that were not written to
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
158 expect this.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
159
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
160 RETURN_IN_ORDER is an option available to programs that were written
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
161 to expect options and other ARGV-elements in any order and that care about
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
162 the ordering of the two. We describe each non-option ARGV-element
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
163 as if it were the argument of an option with character code 1.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
164 Using `-' as the first character of the list of option characters
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
165 selects this mode of operation.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
166
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
167 The special argument `--' forces an end of option-scanning regardless
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
168 of the value of `ordering'. In the case of RETURN_IN_ORDER, only
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
169 `--' can cause `getopt' to return EOF with `optind' != ARGC. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
170
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
171 static enum
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
172 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
173 REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
174 } ordering;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
175
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
176 #ifdef __GNU_LIBRARY__
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
177 /* We want to avoid inclusion of string.h with non-GNU libraries
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
178 because there are many ways it can cause trouble.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
179 On some systems, it contains special magic macros that don't work
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
180 in GCC. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
181 #include <string.h>
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
182 #define my_index strchr
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
183 #define my_bcopy(src, dst, n) memcpy ((dst), (src), (n))
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
184 #else
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
185
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
186 /* Avoid depending on library functions or files
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
187 whose names are inconsistent. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
188
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
189 char *getenv ();
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
190
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
191 static char *
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
192 my_index (str, chr)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
193 const char *str;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
194 int chr;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
195 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
196 while (*str)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
197 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
198 if (*str == chr)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
199 return (char *) str;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
200 str++;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
201 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
202 return 0;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
203 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
204
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
205 static void
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
206 my_bcopy (from, to, size)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
207 const char *from;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
208 char *to;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
209 int size;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
210 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
211 int i;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
212 for (i = 0; i < size; i++)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
213 to[i] = from[i];
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
214 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
215 #endif /* GNU C library. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
216
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
217 /* Handle permutation of arguments. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
218
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
219 /* Describe the part of ARGV that contains non-options that have
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
220 been skipped. `first_nonopt' is the index in ARGV of the first of them;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
221 `last_nonopt' is the index after the last of them. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
222
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
223 static int first_nonopt;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
224 static int last_nonopt;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
225
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
226 /* Exchange two adjacent subsequences of ARGV.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
227 One subsequence is elements [first_nonopt,last_nonopt)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
228 which contains all the non-options that have been skipped so far.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
229 The other is elements [last_nonopt,optind), which contains all
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
230 the options processed since those non-options were skipped.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
231
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
232 `first_nonopt' and `last_nonopt' are relocated so that they describe
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
233 the new indices of the non-options in ARGV after they are moved. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
234
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
235 static void
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
236 exchange (argv)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
237 char **argv;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
238 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
239 int nonopts_size = (last_nonopt - first_nonopt) * sizeof (char *);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
240 char **temp = (char **) __alloca (nonopts_size);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
241
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
242 /* Interchange the two blocks of data in ARGV. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
243
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
244 my_bcopy ((char *) &argv[first_nonopt], (char *) temp, nonopts_size);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
245 my_bcopy ((char *) &argv[last_nonopt], (char *) &argv[first_nonopt],
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
246 (optind - last_nonopt) * sizeof (char *));
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
247 my_bcopy ((char *) temp,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
248 (char *) &argv[first_nonopt + optind - last_nonopt],
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
249 nonopts_size);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
250
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
251 /* Update records for the slots the non-options now occupy. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
252
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
253 first_nonopt += (optind - last_nonopt);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
254 last_nonopt = optind;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
255 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
256
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
257 /* Scan elements of ARGV (whose length is ARGC) for option characters
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
258 given in OPTSTRING.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
259
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
260 If an element of ARGV starts with '-', and is not exactly "-" or "--",
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
261 then it is an option element. The characters of this element
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
262 (aside from the initial '-') are option characters. If `getopt'
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
263 is called repeatedly, it returns successively each of the option characters
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
264 from each of the option elements.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
265
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
266 If `getopt' finds another option character, it returns that character,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
267 updating `optind' and `nextchar' so that the next call to `getopt' can
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
268 resume the scan with the following option character or ARGV-element.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
269
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
270 If there are no more option characters, `getopt' returns `EOF'.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
271 Then `optind' is the index in ARGV of the first ARGV-element
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
272 that is not an option. (The ARGV-elements have been permuted
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
273 so that those that are not options now come last.)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
274
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
275 OPTSTRING is a string containing the legitimate option characters.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
276 If an option character is seen that is not listed in OPTSTRING,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
277 return '?' after printing an error message. If you set `opterr' to
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
278 zero, the error message is suppressed but we still return '?'.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
279
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
280 If a char in OPTSTRING is followed by a colon, that means it wants an arg,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
281 so the following text in the same ARGV-element, or the text of the following
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
282 ARGV-element, is returned in `optarg'. Two colons mean an option that
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
283 wants an optional arg; if there is text in the current ARGV-element,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
284 it is returned in `optarg', otherwise `optarg' is set to zero.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
285
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
286 If OPTSTRING starts with `-' or `+', it requests different methods of
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
287 handling the non-option ARGV-elements.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
288 See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
289
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
290 Long-named options begin with `--' instead of `-'.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
291 Their names may be abbreviated as long as the abbreviation is unique
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
292 or is an exact match for some defined option. If they have an
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
293 argument, it follows the option name in the same ARGV-element, separated
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
294 from the option name by a `=', or else the in next ARGV-element.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
295 When `getopt' finds a long-named option, it returns 0 if that option's
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
296 `flag' field is nonzero, the value of the option's `val' field
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
297 if the `flag' field is zero.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
298
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
299 The elements of ARGV aren't really const, because we permute them.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
300 But we pretend they're const in the prototype to be compatible
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
301 with other systems.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
302
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
303 LONGOPTS is a vector of `struct option' terminated by an
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
304 element containing a name which is zero.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
305
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
306 LONGIND returns the index in LONGOPT of the long-named option found.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
307 It is only valid when a long-named option has been found by the most
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
308 recent call.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
309
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
310 If LONG_ONLY is nonzero, '-' as well as '--' can introduce
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
311 long-named options. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
312
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
313 int
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
314 _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
315 int argc;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
316 char *const *argv;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
317 const char *optstring;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
318 const struct option *longopts;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
319 int *longind;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
320 int long_only;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
321 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
322 int option_index;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
323
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
324 optarg = 0;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
325
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
326 /* Initialize the internal data when the first call is made.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
327 Start processing options with ARGV-element 1 (since ARGV-element 0
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
328 is the program name); the sequence of previously skipped
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
329 non-option ARGV-elements is empty. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
330
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
331 if (optind == 0)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
332 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
333 first_nonopt = last_nonopt = optind = 1;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
334
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
335 nextchar = NULL;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
336
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
337 /* Determine how to handle the ordering of options and nonoptions. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
338
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
339 if (optstring[0] == '-')
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
340 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
341 ordering = RETURN_IN_ORDER;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
342 ++optstring;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
343 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
344 else if (optstring[0] == '+')
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
345 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
346 ordering = REQUIRE_ORDER;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
347 ++optstring;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
348 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
349 else if (getenv ("POSIXLY_CORRECT") != NULL)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
350 ordering = REQUIRE_ORDER;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
351 else
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
352 ordering = PERMUTE;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
353 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
354
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
355 if (nextchar == NULL || *nextchar == '\0')
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
356 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
357 if (ordering == PERMUTE)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
358 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
359 /* If we have just processed some options following some non-options,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
360 exchange them so that the options come first. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
361
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
362 if (first_nonopt != last_nonopt && last_nonopt != optind)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
363 exchange ((char **) argv);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
364 else if (last_nonopt != optind)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
365 first_nonopt = optind;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
366
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
367 /* Now skip any additional non-options
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
368 and extend the range of non-options previously skipped. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
369
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
370 while (optind < argc
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
371 && (argv[optind][0] != '-' || argv[optind][1] == '\0')
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
372 #ifdef GETOPT_COMPAT
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
373 && (longopts == NULL
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
374 || argv[optind][0] != '+' || argv[optind][1] == '\0')
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
375 #endif /* GETOPT_COMPAT */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
376 )
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
377 optind++;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
378 last_nonopt = optind;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
379 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
380
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
381 /* Special ARGV-element `--' means premature end of options.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
382 Skip it like a null option,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
383 then exchange with previous non-options as if it were an option,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
384 then skip everything else like a non-option. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
385
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
386 if (optind != argc && !strcmp (argv[optind], "--"))
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
387 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
388 optind++;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
389
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
390 if (first_nonopt != last_nonopt && last_nonopt != optind)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
391 exchange ((char **) argv);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
392 else if (first_nonopt == last_nonopt)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
393 first_nonopt = optind;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
394 last_nonopt = argc;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
395
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
396 optind = argc;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
397 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
398
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
399 /* If we have done all the ARGV-elements, stop the scan
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
400 and back over any non-options that we skipped and permuted. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
401
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
402 if (optind == argc)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
403 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
404 /* Set the next-arg-index to point at the non-options
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
405 that we previously skipped, so the caller will digest them. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
406 if (first_nonopt != last_nonopt)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
407 optind = first_nonopt;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
408 return EOF;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
409 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
410
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
411 /* If we have come to a non-option and did not permute it,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
412 either stop the scan or describe it to the caller and pass it by. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
413
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
414 if ((argv[optind][0] != '-' || argv[optind][1] == '\0')
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
415 #ifdef GETOPT_COMPAT
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
416 && (longopts == NULL
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
417 || argv[optind][0] != '+' || argv[optind][1] == '\0')
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
418 #endif /* GETOPT_COMPAT */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
419 )
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
420 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
421 if (ordering == REQUIRE_ORDER)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
422 return EOF;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
423 optarg = argv[optind++];
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
424 return 1;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
425 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
426
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
427 /* We have found another option-ARGV-element.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
428 Start decoding its characters. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
429
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
430 nextchar = (argv[optind] + 1
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
431 + (longopts != NULL && argv[optind][1] == '-'));
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
432 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
433
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
434 if (longopts != NULL
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
435 && ((argv[optind][0] == '-'
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
436 && (argv[optind][1] == '-' || long_only))
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
437 #ifdef GETOPT_COMPAT
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
438 || argv[optind][0] == '+'
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
439 #endif /* GETOPT_COMPAT */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
440 ))
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
441 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
442 const struct option *p;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
443 char *s = nextchar;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
444 int exact = 0;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
445 int ambig = 0;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
446 const struct option *pfound = NULL;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
447 int indfound;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
448
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
449 while (*s && *s != '=')
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
450 s++;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
451
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
452 /* Test all options for either exact match or abbreviated matches. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
453 for (p = longopts, option_index = 0; p->name;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
454 p++, option_index++)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
455 if (!strncmp (p->name, nextchar, s - nextchar))
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
456 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
457 if (s - nextchar == strlen (p->name))
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
458 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
459 /* Exact match found. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
460 pfound = p;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
461 indfound = option_index;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
462 exact = 1;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
463 break;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
464 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
465 else if (pfound == NULL)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
466 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
467 /* First nonexact match found. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
468 pfound = p;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
469 indfound = option_index;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
470 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
471 else
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
472 /* Second nonexact match found. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
473 ambig = 1;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
474 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
475
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
476 if (ambig && !exact)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
477 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
478 if (opterr)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
479 fprintf (stderr, "%s: option `%s' is ambiguous\n",
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
480 argv[0], argv[optind]);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
481 nextchar += strlen (nextchar);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
482 optind++;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
483 return '?';
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
484 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
485
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
486 if (pfound != NULL)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
487 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
488 option_index = indfound;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
489 optind++;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
490 if (*s)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
491 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
492 /* Don't test has_arg with >, because some C compilers don't
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
493 allow it to be used on enums. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
494 if (pfound->has_arg)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
495 optarg = s + 1;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
496 else
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
497 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
498 if (opterr)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
499 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
500 if (argv[optind - 1][1] == '-')
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
501 /* --option */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
502 fprintf (stderr,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
503 "%s: option `--%s' doesn't allow an argument\n",
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
504 argv[0], pfound->name);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
505 else
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
506 /* +option or -option */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
507 fprintf (stderr,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
508 "%s: option `%c%s' doesn't allow an argument\n",
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
509 argv[0], argv[optind - 1][0], pfound->name);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
510 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
511 nextchar += strlen (nextchar);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
512 return '?';
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
513 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
514 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
515 else if (pfound->has_arg == 1)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
516 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
517 if (optind < argc)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
518 optarg = argv[optind++];
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
519 else
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
520 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
521 if (opterr)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
522 fprintf (stderr, "%s: option `%s' requires an argument\n",
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
523 argv[0], argv[optind - 1]);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
524 nextchar += strlen (nextchar);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
525 return optstring[0] == ':' ? ':' : '?';
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
526 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
527 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
528 nextchar += strlen (nextchar);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
529 if (longind != NULL)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
530 *longind = option_index;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
531 if (pfound->flag)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
532 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
533 *(pfound->flag) = pfound->val;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
534 return 0;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
535 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
536 return pfound->val;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
537 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
538 /* Can't find it as a long option. If this is not getopt_long_only,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
539 or the option starts with '--' or is not a valid short
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
540 option, then it's an error.
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
541 Otherwise interpret it as a short option. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
542 if (!long_only || argv[optind][1] == '-'
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
543 #ifdef GETOPT_COMPAT
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
544 || argv[optind][0] == '+'
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
545 #endif /* GETOPT_COMPAT */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
546 || my_index (optstring, *nextchar) == NULL)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
547 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
548 if (opterr)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
549 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
550 if (argv[optind][1] == '-')
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
551 /* --option */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
552 fprintf (stderr, "%s: unrecognized option `--%s'\n",
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
553 argv[0], nextchar);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
554 else
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
555 /* +option or -option */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
556 fprintf (stderr, "%s: unrecognized option `%c%s'\n",
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
557 argv[0], argv[optind][0], nextchar);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
558 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
559 nextchar = (char *) "";
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
560 optind++;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
561 return '?';
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
562 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
563 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
564
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
565 /* Look at and handle the next option-character. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
566
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
567 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
568 char c = *nextchar++;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
569 char *temp = my_index (optstring, c);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
570
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
571 /* Increment `optind' when we start to process its last character. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
572 if (*nextchar == '\0')
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
573 ++optind;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
574
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
575 if (temp == NULL || c == ':')
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
576 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
577 if (opterr)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
578 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
579 #if 0
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
580 if (c < 040 || c >= 0177)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
581 fprintf (stderr, "%s: unrecognized option, character code 0%o\n",
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
582 argv[0], c);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
583 else
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
584 fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
585 #else
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
586 /* 1003.2 specifies the format of this message. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
587 fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
588 #endif
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
589 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
590 optopt = c;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
591 return '?';
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
592 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
593 if (temp[1] == ':')
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
594 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
595 if (temp[2] == ':')
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
596 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
597 /* This is an option that accepts an argument optionally. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
598 if (*nextchar != '\0')
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
599 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
600 optarg = nextchar;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
601 optind++;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
602 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
603 else
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
604 optarg = 0;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
605 nextchar = NULL;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
606 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
607 else
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
608 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
609 /* This is an option that requires an argument. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
610 if (*nextchar != '\0')
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
611 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
612 optarg = nextchar;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
613 /* If we end this ARGV-element by taking the rest as an arg,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
614 we must advance to the next element now. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
615 optind++;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
616 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
617 else if (optind == argc)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
618 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
619 if (opterr)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
620 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
621 #if 0
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
622 fprintf (stderr, "%s: option `-%c' requires an argument\n",
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
623 argv[0], c);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
624 #else
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
625 /* 1003.2 specifies the format of this message. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
626 fprintf (stderr, "%s: option requires an argument -- %c\n",
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
627 argv[0], c);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
628 #endif
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
629 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
630 optopt = c;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
631 if (optstring[0] == ':')
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
632 c = ':';
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
633 else
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
634 c = '?';
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
635 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
636 else
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
637 /* We already incremented `optind' once;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
638 increment it again when taking next ARGV-elt as argument. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
639 optarg = argv[optind++];
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
640 nextchar = NULL;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
641 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
642 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
643 return c;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
644 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
645 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
646
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
647 int
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
648 getopt (argc, argv, optstring)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
649 int argc;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
650 char *const *argv;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
651 const char *optstring;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
652 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
653 return _getopt_internal (argc, argv, optstring,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
654 (const struct option *) 0,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
655 (int *) 0,
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
656 0);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
657 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
658
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
659 #endif /* _LIBC or not __GNU_LIBRARY__. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
660
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
661 #ifdef TEST
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
662
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
663 /* Compile with -DTEST to make an executable for use in testing
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
664 the above definition of `getopt'. */
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
665
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
666 int
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
667 main (argc, argv)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
668 int argc;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
669 char **argv;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
670 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
671 int c;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
672 int digit_optind = 0;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
673
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
674 while (1)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
675 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
676 int this_option_optind = optind ? optind : 1;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
677
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
678 c = getopt (argc, argv, "abc:d:0123456789");
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
679 if (c == EOF)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
680 break;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
681
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
682 switch (c)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
683 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
684 case '0':
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
685 case '1':
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
686 case '2':
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
687 case '3':
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
688 case '4':
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
689 case '5':
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
690 case '6':
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
691 case '7':
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
692 case '8':
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
693 case '9':
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
694 if (digit_optind != 0 && digit_optind != this_option_optind)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
695 printf ("digits occur in two different argv-elements.\n");
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
696 digit_optind = this_option_optind;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
697 printf ("option %c\n", c);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
698 break;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
699
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
700 case 'a':
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
701 printf ("option a\n");
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
702 break;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
703
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
704 case 'b':
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
705 printf ("option b\n");
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
706 break;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
707
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
708 case 'c':
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
709 printf ("option c with value `%s'\n", optarg);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
710 break;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
711
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
712 case '?':
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
713 break;
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
714
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
715 default:
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
716 printf ("?? getopt returned character code 0%o ??\n", c);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
717 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
718 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
719
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
720 if (optind < argc)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
721 {
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
722 printf ("non-option ARGV-elements: ");
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
723 while (optind < argc)
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
724 printf ("%s ", argv[optind++]);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
725 printf ("\n");
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
726 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
727
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
728 exit (0);
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
729 }
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
730
3dbc2cd326e2 [gaim-migrate @ 1001]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
731 #endif /* TEST */