Files
modules/xref/getopt.c.src.html
2006-01-12 19:30:05 +00:00

1419 lines
78 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- This HTML file generated by cxref (version 1.6a). -->
<!-- cxref program (c) Andrew M. Bishop 1995,96,97,98,99,2000,01,02,03,04,05. -->
<!--
Cxref: cxref -block-comments -verbatim-comments -xref-all -index-all -html-src -Oxref getopt.c
CPP : cxref-cpp -lang-c -C -dD -dI
-->
<HTML>
<HEAD>
<TITLE>Source File getopt.c</TITLE>
<LINK rel="stylesheet" href="cxref.css" type="text/css">
</HEAD>
<BODY>
<pre>
<a name="line1">1 |</a> /*****
<a name="line2">2 |</a> ** ** Module Header ******************************************************* **
<a name="line3">3 |</a> ** **
<a name="line4">4 |</a> ** Modules Revision 3.0 **
<a name="line5">5 |</a> ** Providing a flexible user environment **
<a name="line6">6 |</a> ** **
<a name="line7">7 |</a> ** File: getopt.c **
<a name="line8">8 |</a> ** First Edition: 1995/12/20 **
<a name="line9">9 |</a> ** **
<a name="line10">10 |</a> ** Authors: Jens Hamisch, jens@Strawberry.COM **
<a name="line11">11 |</a> ** **
<a name="line12">12 |</a> ** Description: getopt procedure for the Modules package **
<a name="line13">13 |</a> ** **
<a name="line14">14 |</a> ** Exports: getopt Recognition of commadn line options **
<a name="line15">15 |</a> ** **
<a name="line16">16 |</a> ** Notes: This is based on the 'Getopt for GNU' from the gcc-2.7.2 **
<a name="line17">17 |</a> ** compiler. It is preferred to the libc version, because it **
<a name="line18">18 |</a> ** provides 'long-options'. **
<a name="line19">19 |</a> ** **
<a name="line20">20 |</a> ** ************************************************************************ **
<a name="line21">21 |</a> ****/
<a name="line22">22 |</a> /** **/
<a name="line23">23 |</a> /** Getopt for GNU. **/
<a name="line24">24 |</a> /** NOTE: getopt is now part of the C library, so if you don't know what **/
<a name="line25">25 |</a> /** "Keep this file name-space clean" means, talk to roland"@gnu.ai.mit.edu **/
<a name="line26">26 |</a> /** before changing it! **/
<a name="line27">27 |</a> /** **/
<a name="line28">28 |</a> /** Copyright( C) 1987, 88, 89, 90, 91, 92, 93, 94, 95 **/
<a name="line29">29 |</a> /** Free Software Foundation, Inc. **/
<a name="line30">30 |</a> /** **/
<a name="line31">31 |</a> /** This program is free software; you can redistribute it and/or modify **/
<a name="line32">32 |</a> /** it under the terms of the GNU General Public License as published by **/
<a name="line33">33 |</a> /** the Free Software Foundation; either version 2, or( at your option) **/
<a name="line34">34 |</a> /** any later version. **/
<a name="line35">35 |</a> /** **/
<a name="line36">36 |</a> /** This program is distributed in the hope that it will be useful, **/
<a name="line37">37 |</a> /** but WITHOUT ANY WARRANTY; without even the implied warranty of **/
<a name="line38">38 |</a> /** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the **/
<a name="line39">39 |</a> /** GNU General Public License for more details. **/
<a name="line40">40 |</a> /** **/
<a name="line41">41 |</a> /** You should have received a copy of the GNU General Public License **/
<a name="line42">42 |</a> /** along with this program; if not, write to the Free Software **/
<a name="line43">43 |</a> /** Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. **/
<a name="line44">44 |</a> /** **/
<a name="line45">45 |</a> /** ************************************************************************ **/
<a name="line46">46 |</a>
<a name="line47">47 |</a> /** ** Copyright *********************************************************** **
<a name="line48">48 |</a> ** **
<a name="line49">49 |</a> ** Copyright 1991-1994 by John L. Furlan. **
<a name="line50">50 |</a> ** see LICENSE.GPL, which must be provided, for details **
<a name="line51">51 |</a> ** **
<a name="line52">52 |</a> ** ************************************************************************ **/
<a name="line53">53 |</a>
<a name="line54">54 |</a> static char Id[] = "@(#)$Id: getopt.c.src.html,v 1.6 2006/01/18 05:35:11 rkowen Exp $";
<a name="line55">55 |</a> static void *UseId[] = { &amp;UseId, Id };
<a name="line56">56 |</a>
<a name="line57">57 |</a> /** ************************************************************************ **/
<a name="line58">58 |</a> /** CONFIGURATION **/
<a name="line59">59 |</a> /** ************************************************************************ **/
<a name="line60">60 |</a>
<a name="line61">61 |</a> /**
<a name="line62">62 |</a> ** This tells Alpha OSF/1 not to define a getopt prototype in &lt;stdio.h&gt;.
<a name="line63">63 |</a> ** Ditto for AIX 3.2 and &lt;stdlib.h&gt;.
<a name="line64">64 |</a> **/
<a name="line65">65 |</a>
<a name="line66">66 |</a> #ifndef _NO_PROTO
<a name="line67">67 |</a> # define _NO_PROTO
<a name="line68">68 |</a> #endif
<a name="line69">69 |</a>
<a name="line70">70 |</a> #ifdef HAVE_CONFIG_H
<a name="line71">71 |</a> # include &lt;config.h&gt;
<a name="line72">72 |</a> #endif
<a name="line73">73 |</a>
<a name="line74">74 |</a> /**
<a name="line75">75 |</a> ** This is a separate conditional since some stdc systems
<a name="line76">76 |</a> ** reject `defined( const)'.
<a name="line77">77 |</a> **/
<a name="line78">78 |</a>
<a name="line79">79 |</a> #if !defined( __STDC__) || !__STDC__
<a name="line80">80 |</a> # ifndef const
<a name="line81">81 |</a> # define const
<a name="line82">82 |</a> # endif
<a name="line83">83 |</a> #endif
<a name="line84">84 |</a>
<a name="line85">85 |</a> /** ************************************************************************ **/
<a name="line86">86 |</a> /** HEADERS **/
<a name="line87">87 |</a> /** ************************************************************************ **/
<a name="line88">88 |</a>
<a name="line89">89 |</a> #include &lt;stdio.h&gt;
<a name="line90">90 |</a>
<a name="line91">91 |</a> /**
<a name="line92">92 |</a> ** Comment out all this code if we are using the GNU C Library, and are not
<a name="line93">93 |</a> ** actually compiling the library itself. This code is part of the GNU C
<a name="line94">94 |</a> ** Library, but also included in many other GNU distributions. Compiling
<a name="line95">95 |</a> ** and linking in this code is a waste when using the GNU C library
<a name="line96">96 |</a> ** ( especially if it is a shared library). Rather than having every GNU
<a name="line97">97 |</a> ** program understand `configure --with-gnu-libc' and omit the object files,
<a name="line98">98 |</a> ** it is simpler to just do this in the source for each such file.
<a name="line99">99 |</a> **
<a name="line100">100 |</a> ** All this conditional nonsense has been commented out, because this
<a name="line101">101 |</a> ** version of getopt has some module specific error handling that gets
<a name="line102">102 |</a> ** tested during the check. It's a nice sentiment, but it doesn't buy
<a name="line103">103 |</a> ** you much to not include this code in.
<a name="line104">104 |</a> **/
<a name="line105">105 |</a>
<a name="line106">106 |</a> /**
<a name="line107">107 |</a> ** This needs to come after some library #include
<a name="line108">108 |</a> ** to get __GNU_LIBRARY__ defined.
<a name="line109">109 |</a> **/
<a name="line110">110 |</a>
<a name="line111">111 |</a> /* #if defined( _LIBC) || !defined (__GNU_LIBRARY__) */
<a name="line112">112 |</a>
<a name="line113">113 |</a> /**
<a name="line114">114 |</a> ** Don't include stdlib.h for non-GNU C libraries because some of them
<a name="line115">115 |</a> ** contain conflicting prototypes for getopt.
<a name="line116">116 |</a> **/
<a name="line117">117 |</a>
<a name="line118">118 |</a> # ifdef __GNU_LIBRARY__
<a name="line119">119 |</a> # include &lt;stdlib.h&gt;
<a name="line120">120 |</a> # endif /* GNU C library. */
<a name="line121">121 |</a>
<a name="line122">122 |</a> /**
<a name="line123">123 |</a> ** This is for other GNU distributions with internationalized messages.
<a name="line124">124 |</a> ** When compiling libc, the _ macro is predefined.
<a name="line125">125 |</a> **/
<a name="line126">126 |</a>
<a name="line127">127 |</a> # ifndef _
<a name="line128">128 |</a> # ifdef HAVE_LIBINTL_H
<a name="line129">129 |</a> # include &lt;libintl.h&gt;
<a name="line130">130 |</a> # define _(msgid) gettext( msgid)
<a name="line131">131 |</a> # else
<a name="line132">132 |</a> # define _(msgid) (msgid)
<a name="line133">133 |</a> # endif
<a name="line134">134 |</a> # endif
<a name="line135">135 |</a>
<a name="line136">136 |</a> /**
<a name="line137">137 |</a> ** This version of `getopt' appears to the caller like standard Unix `getopt'
<a name="line138">138 |</a> ** but it behaves differently for the user, since it allows the user
<a name="line139">139 |</a> ** to intersperse the options with the other arguments.
<a name="line140">140 |</a> **
<a name="line141">141 |</a> ** As `getopt' works, it permutes the elements of ARGV so that,
<a name="line142">142 |</a> ** when it is done, all the options precede everything else. Thus
<a name="line143">143 |</a> ** all application programs are extended to handle flexible argument order.
<a name="line144">144 |</a> **
<a name="line145">145 |</a> ** Setting the environment variable POSIXLY_CORRECT disables permutation.
<a name="line146">146 |</a> ** Then the behavior is completely standard.
<a name="line147">147 |</a> **
<a name="line148">148 |</a> ** GNU application programs can use a third alternative mode in which
<a name="line149">149 |</a> ** they can distinguish the relative order of options and other arguments.
<a name="line150">150 |</a> **/
<a name="line151">151 |</a>
<a name="line152">152 |</a> # include "getopt.h"
<a name="line153">153 |</a>
<a name="line154">154 |</a> /**
<a name="line155">155 |</a> ** We want to avoid inclusion of string.h with non-GNU libraries
<a name="line156">156 |</a> ** because there are many ways it can cause trouble.
<a name="line157">157 |</a> ** On some systems, it contains special magic macros that don't work
<a name="line158">158 |</a> ** in GCC.
<a name="line159">159 |</a> **/
<a name="line160">160 |</a>
<a name="line161">161 |</a> # ifdef __GNU_LIBRARY__
<a name="line162">162 |</a> # include &lt;string.h&gt;
<a name="line163">163 |</a> # define my_index strchr
<a name="line164">164 |</a> # else
<a name="line165">165 |</a>
<a name="line166">166 |</a> /**
<a name="line167">167 |</a> ** Avoid depending on library functions or files whose names are
<a name="line168">168 |</a> ** inconsistent.
<a name="line169">169 |</a> **/
<a name="line170">170 |</a>
<a name="line171">171 |</a> char *getenv();
<a name="line172">172 |</a>
<a name="line173">173 |</a> static char *my_index( const char *str, int chr)
<a name="line174">174 |</a> {
<a name="line175">175 |</a> while( *str) {
<a name="line176">176 |</a> if( *str == chr)
<a name="line177">177 |</a> return( char *) str;
<a name="line178">178 |</a> str++;
<a name="line179">179 |</a> }
<a name="line180">180 |</a> return( 0);
<a name="line181">181 |</a> }
<a name="line182">182 |</a>
<a name="line183">183 |</a> /**
<a name="line184">184 |</a> ** If using GCC, we can safely declare strlen this way.
<a name="line185">185 |</a> ** If not using GCC, it is ok not to declare it.
<a name="line186">186 |</a> **
<a name="line187">187 |</a> ** Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
<a name="line188">188 |</a> ** That was relevant to code that was here before.
<a name="line189">189 |</a> **/
<a name="line190">190 |</a>
<a name="line191">191 |</a> # ifdef __GNUC__
<a name="line192">192 |</a> # if !defined( __STDC__) || !__STDC__
<a name="line193">193 |</a>
<a name="line194">194 |</a> /**
<a name="line195">195 |</a> ** gcc with -traditional declares the built-in strlen to return int,
<a name="line196">196 |</a> ** and has done so at least since version 2.4.5. -- rms.
<a name="line197">197 |</a> **/
<a name="line198">198 |</a>
<a name="line199">199 |</a> extern int strlen( const char *);
<a name="line200">200 |</a> # endif /* not __STDC__ */
<a name="line201">201 |</a> # endif /* __GNUC__ */
<a name="line202">202 |</a>
<a name="line203">203 |</a> # endif /* not __GNU_LIBRARY__ */
<a name="line204">204 |</a>
<a name="line205">205 |</a> /**
<a name="line206">206 |</a> ** Include the modules header in order to get all error messages
<a name="line207">207 |</a> **/
<a name="line208">208 |</a>
<a name="line209">209 |</a> #include "modules_def.h"
<a name="line210">210 |</a>
<a name="line211">211 |</a> /** ************************************************************************ **/
<a name="line212">212 |</a> /** LOCAL DATATYPES **/
<a name="line213">213 |</a> /** ************************************************************************ **/
<a name="line214">214 |</a>
<a name="line215">215 |</a> /** not applicable **/
<a name="line216">216 |</a>
<a name="line217">217 |</a> /** ************************************************************************ **/
<a name="line218">218 |</a> /** CONSTANTS **/
<a name="line219">219 |</a> /** ************************************************************************ **/
<a name="line220">220 |</a>
<a name="line221">221 |</a> /** not applicable **/
<a name="line222">222 |</a>
<a name="line223">223 |</a> /** ************************************************************************ **/
<a name="line224">224 |</a> /** MACROS **/
<a name="line225">225 |</a> /** ************************************************************************ **/
<a name="line226">226 |</a>
<a name="line227">227 |</a> /** not applicable **/
<a name="line228">228 |</a>
<a name="line229">229 |</a> /** ************************************************************************ **/
<a name="line230">230 |</a> /** GLOBAL DATA **/
<a name="line231">231 |</a> /** ************************************************************************ **/
<a name="line232">232 |</a>
<a name="line233">233 |</a> /**
<a name="line234">234 |</a> ** The following is required for compiling the TEST environment for the
<a name="line235">235 |</a> ** modules package
<a name="line236">236 |</a> **/
<a name="line237">237 |</a>
<a name="line238">238 |</a> #ifdef _MODULES_DEF_H
<a name="line239">239 |</a> # ifdef TEST
<a name="line240">240 |</a> char *g_current_module = "getopt";
<a name="line241">241 |</a> int linenum = 0;
<a name="line242">242 |</a> # endif
<a name="line243">243 |</a> #endif /** _MODULES_DEF_H **/
<a name="line244">244 |</a>
<a name="line245">245 |</a> /**
<a name="line246">246 |</a> ** For communication from `getopt' to the caller. When `getopt' finds an
<a name="line247">247 |</a> ** option that takes an argument, the argument value is returned here.
<a name="line248">248 |</a> ** Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element
<a name="line249">249 |</a> ** is returned here.
<a name="line250">250 |</a> **/
<a name="line251">251 |</a>
<a name="line252">252 |</a> char *optarg = NULL;
<a name="line253">253 |</a>
<a name="line254">254 |</a> /**
<a name="line255">255 |</a> ** Index in ARGV of the next element to be scanned. This is used for
<a name="line256">256 |</a> ** communication to and from the caller and for communication between
<a name="line257">257 |</a> ** successive calls to `getopt'.
<a name="line258">258 |</a> **
<a name="line259">259 |</a> ** On entry to `getopt', zero means this is the first call; initialize.
<a name="line260">260 |</a> **
<a name="line261">261 |</a> ** When `getopt' returns EOF, this is the index of the first of the
<a name="line262">262 |</a> ** non-option elements that the caller should itself scan.
<a name="line263">263 |</a> **
<a name="line264">264 |</a> ** Otherwise, `optind' communicates from one call to the next
<a name="line265">265 |</a> ** how much of ARGV has been scanned so far.
<a name="line266">266 |</a> **/
<a name="line267">267 |</a>
<a name="line268">268 |</a> /**
<a name="line269">269 |</a> ** XXX 1003.2 says this must be 1 before any call.
<a name="line270">270 |</a> **/
<a name="line271">271 |</a>
<a name="line272">272 |</a> int optind = 0;
<a name="line273">273 |</a>
<a name="line274">274 |</a> /**
<a name="line275">275 |</a> ** Callers store zero here to inhibit the error message for unrecognized
<a name="line276">276 |</a> ** options.
<a name="line277">277 |</a> **/
<a name="line278">278 |</a>
<a name="line279">279 |</a> int opterr = 1;
<a name="line280">280 |</a>
<a name="line281">281 |</a> /**
<a name="line282">282 |</a> ** Set to an option character which was unrecognized.
<a name="line283">283 |</a> ** This must be initialized on some systems to avoid linking in the
<a name="line284">284 |</a> ** system's own getopt implementation.
<a name="line285">285 |</a> **/
<a name="line286">286 |</a>
<a name="line287">287 |</a> int optopt = '?';
<a name="line288">288 |</a>
<a name="line289">289 |</a> /** ************************************************************************ **/
<a name="line290">290 |</a> /** LOCAL DATA **/
<a name="line291">291 |</a> /** ************************************************************************ **/
<a name="line292">292 |</a>
<a name="line293">293 |</a> #ifdef _MODULES_DEF_H
<a name="line294">294 |</a>
<a name="line295">295 |</a> /**
<a name="line296">296 |</a> ** Runtime information for the modules package
<a name="line297">297 |</a> **/
<a name="line298">298 |</a>
<a name="line299">299 |</a> static char module_name[] = "getopt.c"; /** File name of this module **/
<a name="line300">300 |</a>
<a name="line301">301 |</a> #ifdef _MODULES_DEF_H
<a name="line302">302 |</a> # if WITH_DEBUGGING_INIT
<a name="line303">303 |</a> static char _proc_exchange[] = "exchange";
<a name="line304">304 |</a> static char _proc_getopt_initialize[] = "_getopt_initialize";
<a name="line305">305 |</a> static char _proc_getopt_internal[] = " _getopt_internal";
<a name="line306">306 |</a> static char _proc_getopt[] = "getopt";
<a name="line307">307 |</a> static char _proc_getopt_long[] = "getopt_long";
<a name="line308">308 |</a> static char _proc_getopt_long_only[] = "getopt_long_only";
<a name="line309">309 |</a> # endif
<a name="line310">310 |</a> #endif
<a name="line311">311 |</a>
<a name="line312">312 |</a> # ifdef TEST
<a name="line313">313 |</a> static char _proc_main[] = "main";
<a name="line314">314 |</a> # endif
<a name="line315">315 |</a>
<a name="line316">316 |</a> #endif /** _MODULES_DEF_H **/
<a name="line317">317 |</a>
<a name="line318">318 |</a> /**
<a name="line319">319 |</a> ** The next char to be scanned in the option-element in which the last
<a name="line320">320 |</a> ** option character we returned was found. This allows us to pick up
<a name="line321">321 |</a> ** the scan where we left off.
<a name="line322">322 |</a> **
<a name="line323">323 |</a> ** If this is zero, or a null string, it means resume the scan by advan-
<a name="line324">324 |</a> ** cing to the next ARGV-element.
<a name="line325">325 |</a> **/
<a name="line326">326 |</a>
<a name="line327">327 |</a> static char *nextchar;
<a name="line328">328 |</a>
<a name="line329">329 |</a> /**
<a name="line330">330 |</a> ** Describe how to deal with options that follow non-option ARGV-elements.
<a name="line331">331 |</a> **
<a name="line332">332 |</a> ** If the caller did not specify anything, the default is REQUIRE_ORDER if
<a name="line333">333 |</a> ** the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise.
<a name="line334">334 |</a> **
<a name="line335">335 |</a> ** REQUIRE_ORDER means don't recognize them as options;
<a name="line336">336 |</a> ** stop option processing when the first non-option is seen.
<a name="line337">337 |</a> ** This is what Unix does.
<a name="line338">338 |</a> ** This mode of operation is selected by either setting the environment
<a name="line339">339 |</a> ** variable POSIXLY_CORRECT, or using `+' as the first character
<a name="line340">340 |</a> ** of the list of option characters.
<a name="line341">341 |</a> **
<a name="line342">342 |</a> ** PERMUTE is the default. We permute the contents of ARGV as we scan,
<a name="line343">343 |</a> ** so that eventually all the non-options are at the end. This allows options
<a name="line344">344 |</a> ** to be given in any order, even with programs that were not written to
<a name="line345">345 |</a> ** expect this.
<a name="line346">346 |</a> **
<a name="line347">347 |</a> ** RETURN_IN_ORDER is an option available to programs that were written
<a name="line348">348 |</a> ** to expect options and other ARGV-elements in any order and that care about
<a name="line349">349 |</a> ** the ordering of the two. We describe each non-option ARGV-element
<a name="line350">350 |</a> ** as if it were the argument of an option with character code 1.
<a name="line351">351 |</a> ** Using `-' as the first character of the list of option characters
<a name="line352">352 |</a> ** selects this mode of operation.
<a name="line353">353 |</a> **
<a name="line354">354 |</a> ** The special argument `--' forces an end of option-scanning regardless
<a name="line355">355 |</a> ** of the value of `ordering'. In the case of RETURN_IN_ORDER, only
<a name="line356">356 |</a> ** `--' can cause `getopt' to return EOF with `optind' != ARGC.
<a name="line357">357 |</a> **/
<a name="line358">358 |</a>
<a name="line359">359 |</a> static enum {
<a name="line360">360 |</a> REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
<a name="line361">361 |</a> } ordering;
<a name="line362">362 |</a>
<a name="line363">363 |</a> /**
<a name="line364">364 |</a> ** Value of POSIXLY_CORRECT environment variable.
<a name="line365">365 |</a> **/
<a name="line366">366 |</a>
<a name="line367">367 |</a> static char *posixly_correct;
<a name="line368">368 |</a>
<a name="line369">369 |</a> /**
<a name="line370">370 |</a> ** Handle permutation of arguments.
<a name="line371">371 |</a> **/
<a name="line372">372 |</a>
<a name="line373">373 |</a> /**
<a name="line374">374 |</a> ** Describe the part of ARGV that contains non-options that have
<a name="line375">375 |</a> ** been skipped. `first_nonopt' is the index in ARGV of the first of them;
<a name="line376">376 |</a> ** `last_nonopt' is the index after the last of them.
<a name="line377">377 |</a> **/
<a name="line378">378 |</a>
<a name="line379">379 |</a> static int first_nonopt;
<a name="line380">380 |</a> static int last_nonopt;
<a name="line381">381 |</a>
<a name="line382">382 |</a> /** ************************************************************************ **/
<a name="line383">383 |</a> /** PROTOTYPES **/
<a name="line384">384 |</a> /** ************************************************************************ **/
<a name="line385">385 |</a>
<a name="line386">386 |</a> static void exchange( char **argv);
<a name="line387">387 |</a> static const char *_getopt_initialize( const char *optstring);
<a name="line388">388 |</a> static int _getopt_internal( int argc,
<a name="line389">389 |</a> char *const *argv,
<a name="line390">390 |</a> const char *optstring,
<a name="line391">391 |</a> const struct option *longopts,
<a name="line392">392 |</a> int *longind,
<a name="line393">393 |</a> int long_only);
<a name="line394">394 |</a>
<a name="line395">395 |</a> /*++++
<a name="line396">396 |</a> ** ** Function-Header ***************************************************** **
<a name="line397">397 |</a> ** **
<a name="line398">398 |</a> ** Function: exchange **
<a name="line399">399 |</a> ** **
<a name="line400">400 |</a> ** Description: Exchange two adjacent subsequences of ARGV. **
<a name="line401">401 |</a> ** One subsequence is elements( first_nonopt, **
<a name="line402">402 |</a> ** last_nonopt) which contains all the non-options that **
<a name="line403">403 |</a> ** have been skipped so far. The other is elements **
<a name="line404">404 |</a> ** (last_nonopt,optind), which contains all the options **
<a name="line405">405 |</a> ** processed since those non-options were skipped. **
<a name="line406">406 |</a> ** **
<a name="line407">407 |</a> ** `first_nonopt' and `last_nonopt' are relocated so **
<a name="line408">408 |</a> ** that they describe the new indices of the non-options**
<a name="line409">409 |</a> ** in ARGV after they are moved. **
<a name="line410">410 |</a> ** **
<a name="line411">411 |</a> ** First Edition: 1995/12/20 **
<a name="line412">412 |</a> ** **
<a name="line413">413 |</a> ** Parameters: char **argv Command line arguments **
<a name="line414">414 |</a> ** **
<a name="line415">415 |</a> ** Result: argv ARGV array with exchanged sequences **
<a name="line416">416 |</a> ** **
<a name="line417">417 |</a> ** Attached Globals: first_nonopt first and last non option argument **
<a name="line418">418 |</a> ** last_nonopt on the stream before and after the **
<a name="line419">419 |</a> ** change.( I/O parameter) **
<a name="line420">420 |</a> ** **
<a name="line421">421 |</a> ** ************************************************************************ **
<a name="line422">422 |</a> ++++*/
<a name="line423">423 |</a>
<a name="line424">424 |</a> static void exchange( char **argv)
<a name="line425">425 |</a> {
<a name="line426">426 |</a> int bottom = first_nonopt;
<a name="line427">427 |</a> int middle = last_nonopt;
<a name="line428">428 |</a> int top = optind;
<a name="line429">429 |</a> char *tem;
<a name="line430">430 |</a>
<a name="line431">431 |</a> #ifdef _MODULES_DEF_H
<a name="line432">432 |</a> # if WITH_DEBUGGING_INIT
<a name="line433">433 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_exchange, NULL);
<a name="line434">434 |</a> # endif
<a name="line435">435 |</a> #endif
<a name="line436">436 |</a>
<a name="line437">437 |</a> /**
<a name="line438">438 |</a> ** Exchange the shorter segment with the far end of the longer segment.
<a name="line439">439 |</a> ** That puts the shorter segment into the right place.
<a name="line440">440 |</a> ** It leaves the longer segment in the right place overall,
<a name="line441">441 |</a> ** but it consists of two parts that need to be swapped next.
<a name="line442">442 |</a> **/
<a name="line443">443 |</a>
<a name="line444">444 |</a> while( top &gt; middle &amp;&amp; middle &gt; bottom) {
<a name="line445">445 |</a> if( top - middle &gt; middle - bottom) {
<a name="line446">446 |</a>
<a name="line447">447 |</a> /**
<a name="line448">448 |</a> ** Bottom segment is the short one.
<a name="line449">449 |</a> **/
<a name="line450">450 |</a>
<a name="line451">451 |</a> int len = middle - bottom;
<a name="line452">452 |</a> register int i;
<a name="line453">453 |</a>
<a name="line454">454 |</a> /**
<a name="line455">455 |</a> ** Swap it with the top part of the top segment.
<a name="line456">456 |</a> **/
<a name="line457">457 |</a>
<a name="line458">458 |</a> for( i = 0; i &lt; len; i++) {
<a name="line459">459 |</a> tem = argv[bottom + i];
<a name="line460">460 |</a> argv[bottom + i] = argv[top -( middle - bottom) + i];
<a name="line461">461 |</a> argv[top -( middle - bottom) + i] = tem;
<a name="line462">462 |</a> }
<a name="line463">463 |</a>
<a name="line464">464 |</a> /**
<a name="line465">465 |</a> ** Exclude the moved bottom segment from further swapping.
<a name="line466">466 |</a> **/
<a name="line467">467 |</a>
<a name="line468">468 |</a> top -= len;
<a name="line469">469 |</a>
<a name="line470">470 |</a> } else {
<a name="line471">471 |</a>
<a name="line472">472 |</a> /**
<a name="line473">473 |</a> ** Top segment is the short one.
<a name="line474">474 |</a> **/
<a name="line475">475 |</a>
<a name="line476">476 |</a> int len = top - middle;
<a name="line477">477 |</a> register int i;
<a name="line478">478 |</a>
<a name="line479">479 |</a> /**
<a name="line480">480 |</a> ** Swap it with the bottom part of the bottom segment.
<a name="line481">481 |</a> **/
<a name="line482">482 |</a>
<a name="line483">483 |</a> for( i = 0; i &lt; len; i++) {
<a name="line484">484 |</a> tem = argv[bottom + i];
<a name="line485">485 |</a> argv[bottom + i] = argv[middle + i];
<a name="line486">486 |</a> argv[middle + i] = tem;
<a name="line487">487 |</a> }
<a name="line488">488 |</a>
<a name="line489">489 |</a> /**
<a name="line490">490 |</a> ** Exclude the moved top segment from further swapping.
<a name="line491">491 |</a> **/
<a name="line492">492 |</a>
<a name="line493">493 |</a> bottom += len;
<a name="line494">494 |</a> }
<a name="line495">495 |</a>
<a name="line496">496 |</a> } /** while **/
<a name="line497">497 |</a>
<a name="line498">498 |</a> /**
<a name="line499">499 |</a> ** Update records for the slots the non-options now occupy.
<a name="line500">500 |</a> **/
<a name="line501">501 |</a>
<a name="line502">502 |</a> first_nonopt +=( optind - last_nonopt);
<a name="line503">503 |</a> last_nonopt = optind;
<a name="line504">504 |</a>
<a name="line505">505 |</a> #ifdef _MODULES_DEF_H
<a name="line506">506 |</a> # if WITH_DEBUGGING_INIT
<a name="line507">507 |</a> ErrorLogger( NO_ERR_END, LOC, _proc_exchange, NULL);
<a name="line508">508 |</a> # endif
<a name="line509">509 |</a> #endif
<a name="line510">510 |</a>
<a name="line511">511 |</a> } /** end of 'exchange' **/
<a name="line512">512 |</a>
<a name="line513">513 |</a> /*++++
<a name="line514">514 |</a> ** ** Function-Header ***************************************************** **
<a name="line515">515 |</a> ** **
<a name="line516">516 |</a> ** Function: _getopt_initialize **
<a name="line517">517 |</a> ** **
<a name="line518">518 |</a> ** Description: Initialize the internal data when the first call is **
<a name="line519">519 |</a> ** made **
<a name="line520">520 |</a> ** This defines how to proceed if options and non-op- **
<a name="line521">521 |</a> ** tions are mixed up. See definition of the enum **
<a name="line522">522 |</a> ** 'ordering' for further explanation. **
<a name="line523">523 |</a> ** **
<a name="line524">524 |</a> ** First Edition: 1995/12/20 **
<a name="line525">525 |</a> ** **
<a name="line526">526 |</a> ** Parameters: char *optstring Options string **
<a name="line527">527 |</a> ** **
<a name="line528">528 |</a> ** Result: argv ARGV array with exchanged sequences **
<a name="line529">529 |</a> ** **
<a name="line530">530 |</a> ** Attached globals: first_nonopt, First an las position of **
<a name="line531">531 |</a> ** last_nonopt non-option arguments **
<a name="line532">532 |</a> ** optind Option scan index **
<a name="line533">533 |</a> ** nextchar Next character to scan **
<a name="line534">534 |</a> ** posixly_correct Value of the environment **
<a name="line535">535 |</a> ** variable 'POSIXLY_CORRECT' **
<a name="line536">536 |</a> ** ordering Ordering method ... **
<a name="line537">537 |</a> ** **
<a name="line538">538 |</a> ** ************************************************************************ **
<a name="line539">539 |</a> ++++*/
<a name="line540">540 |</a>
<a name="line541">541 |</a> static const char *_getopt_initialize( const char *optstring)
<a name="line542">542 |</a> {
<a name="line543">543 |</a>
<a name="line544">544 |</a> #ifdef _MODULES_DEF_H
<a name="line545">545 |</a> # if WITH_DEBUGGING_INIT
<a name="line546">546 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_getopt_initialize, NULL);
<a name="line547">547 |</a> # endif
<a name="line548">548 |</a> #endif
<a name="line549">549 |</a>
<a name="line550">550 |</a> /**
<a name="line551">551 |</a> ** Start processing options with ARGV-element 1( since ARGV-element 0
<a name="line552">552 |</a> ** is the program name); the sequence of previously skipped
<a name="line553">553 |</a> ** non-option ARGV-elements is empty.
<a name="line554">554 |</a> **/
<a name="line555">555 |</a>
<a name="line556">556 |</a> first_nonopt = last_nonopt = optind = 1;
<a name="line557">557 |</a> nextchar = NULL;
<a name="line558">558 |</a> posixly_correct = getenv( "POSIXLY_CORRECT");
<a name="line559">559 |</a>
<a name="line560">560 |</a> /**
<a name="line561">561 |</a> ** Determine how to handle the ordering of options and nonoptions.
<a name="line562">562 |</a> **/
<a name="line563">563 |</a>
<a name="line564">564 |</a> if( optstring[0] == '-') {
<a name="line565">565 |</a> ordering = RETURN_IN_ORDER;
<a name="line566">566 |</a> ++optstring;
<a name="line567">567 |</a>
<a name="line568">568 |</a> } else if( optstring[0] == '+') {
<a name="line569">569 |</a> ordering = REQUIRE_ORDER;
<a name="line570">570 |</a> ++optstring;
<a name="line571">571 |</a>
<a name="line572">572 |</a> } else if( posixly_correct != NULL)
<a name="line573">573 |</a> ordering = REQUIRE_ORDER;
<a name="line574">574 |</a>
<a name="line575">575 |</a> else
<a name="line576">576 |</a> ordering = PERMUTE;
<a name="line577">577 |</a>
<a name="line578">578 |</a> #ifdef _MODULES_DEF_H
<a name="line579">579 |</a> # if WITH_DEBUGGING_INIT
<a name="line580">580 |</a> ErrorLogger( NO_ERR_END, LOC, _proc_getopt_initialize, NULL);
<a name="line581">581 |</a> # endif
<a name="line582">582 |</a> #endif
<a name="line583">583 |</a>
<a name="line584">584 |</a> return( optstring);
<a name="line585">585 |</a>
<a name="line586">586 |</a> } /** End of '_getopt_initialize' **/
<a name="line587">587 |</a>
<a name="line588">588 |</a> /*++++
<a name="line589">589 |</a> ** ** Function-Header ***************************************************** **
<a name="line590">590 |</a> ** **
<a name="line591">591 |</a> ** Function: _getopt_internal **
<a name="line592">592 |</a> ** **
<a name="line593">593 |</a> ** Description: Scan elements of ARGV( whose length is ARGC) for **
<a name="line594">594 |</a> ** option characters given in OPTSTRING. **
<a name="line595">595 |</a> ** or long-options specified in the longopt array **
<a name="line596">596 |</a> ** **
<a name="line597">597 |</a> ** First Edition: 1995/12/20 **
<a name="line598">598 |</a> ** **
<a name="line599">599 |</a> ** Parameters: int argc, # of arguments **
<a name="line600">600 |</a> ** char **argv, ARGV array **
<a name="line601">601 |</a> ** char *optstring, String of valid **
<a name="line602">602 |</a> ** short options **
<a name="line603">603 |</a> ** struct option *longopts, Table of valid long **
<a name="line604">604 |</a> ** options **
<a name="line605">605 |</a> ** int *longind, Returns the index of **
<a name="line606">606 |</a> ** the found long opt. **
<a name="line607">607 |</a> ** int long_only Search long options **
<a name="line608">608 |</a> ** only **
<a name="line609">609 |</a> ** **
<a name="line610">610 |</a> ** Result: int '?' Parse error **
<a name="line611">611 |</a> ** 0 Long option w/o argument found **
<a name="line612">612 |</a> ** else short option that has been found **
<a name="line613">613 |</a> ** or the value of a long option **
<a name="line614">614 |</a> ** EOF no more arguments on ARGV **
<a name="line615">615 |</a> ** **
<a name="line616">616 |</a> ** Attached globals: optind Index of the current option in the **
<a name="line617">617 |</a> ** ARGV array **
<a name="line618">618 |</a> ** optarg Argument of an option with value **
<a name="line619">619 |</a> ** **
<a name="line620">620 |</a> ** ************************************************************************ **
<a name="line621">621 |</a> ++++*/
<a name="line622">622 |</a> /** **/
<a name="line623">623 |</a> /** If an element of ARGV starts with '-', and is not exactly "-" or "--", **/
<a name="line624">624 |</a> /** then it is an option element. The characters of this element **/
<a name="line625">625 |</a> /** ( aside from the initial '-') are option characters. If `getopt' **/
<a name="line626">626 |</a> /** is called repeatedly, it returns successively each of the option **/
<a name="line627">627 |</a> /** characters from each of the option elements. **/
<a name="line628">628 |</a> /** **/
<a name="line629">629 |</a> /** If `getopt' finds another option character, it returns that character, **/
<a name="line630">630 |</a> /** updating `optind' and `nextchar' so that the next call to `getopt' can **/
<a name="line631">631 |</a> /** resume the scan with the following option character or ARGV-element. **/
<a name="line632">632 |</a> /** **/
<a name="line633">633 |</a> /** If there are no more option characters, `getopt' returns `EOF'. **/
<a name="line634">634 |</a> /** Then `optind' is the index in ARGV of the first ARGV-element **/
<a name="line635">635 |</a> /** that is not an option. ( The ARGV-elements have been permuted **/
<a name="line636">636 |</a> /** so that those that are not options now come last.) **/
<a name="line637">637 |</a> /** **/
<a name="line638">638 |</a> /** OPTSTRING is a string containing the legitimate option characters. **/
<a name="line639">639 |</a> /** If an option character is seen that is not listed in OPTSTRING, **/
<a name="line640">640 |</a> /** return '?' after printing an error message. If you set `opterr' to **/
<a name="line641">641 |</a> /** zero, the error message is suppressed but we still return '?'. **/
<a name="line642">642 |</a> /** **/
<a name="line643">643 |</a> /** If a char in OPTSTRING is followed by a colon, that means it wants an **/
<a name="line644">644 |</a> /** arg, so the following text in the same ARGV-element, or the text of **/
<a name="line645">645 |</a> /** the following ARGV-element, is returned in `optarg'. Two colons mean **/
<a name="line646">646 |</a> /** an option that wants an optional arg; if there is text in the current **/
<a name="line647">647 |</a> /** ARGV-element, it is returned in `optarg', otherwise `optarg' is set to **/
<a name="line648">648 |</a> /** zero. **/
<a name="line649">649 |</a> /** **/
<a name="line650">650 |</a> /** If OPTSTRING starts with `-' or `+', it requests different methods of **/
<a name="line651">651 |</a> /** handling the non-option ARGV-elements. **/
<a name="line652">652 |</a> /** See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. **/
<a name="line653">653 |</a> /** **/
<a name="line654">654 |</a> /** Long-named options begin with `--' instead of `-'. **/
<a name="line655">655 |</a> /** Their names may be abbreviated as long as the abbreviation is unique **/
<a name="line656">656 |</a> /** or is an exact match for some defined option. If they have an **/
<a name="line657">657 |</a> /** argument, it follows the option name in the same ARGV-element, **/
<a name="line658">658 |</a> /** separated from the option name by a `=', or else the in next ARGV- **/
<a name="line659">659 |</a> /** element. When `getopt' finds a long-named option, it returns 0 if **/
<a name="line660">660 |</a> /** that option's `flag' field is nonzero, the value of the option's `val' **/
<a name="line661">661 |</a> /** field if the `flag' field is zero. **/
<a name="line662">662 |</a> /** **/
<a name="line663">663 |</a> /** The elements of ARGV aren't really const, because we permute them. **/
<a name="line664">664 |</a> /** But we pretend they're const in the prototype to be compatible **/
<a name="line665">665 |</a> /** with other systems. **/
<a name="line666">666 |</a> /** **/
<a name="line667">667 |</a> /** LONGOPTS is a vector of `struct option' terminated by an **/
<a name="line668">668 |</a> /** element containing a name which is zero. **/
<a name="line669">669 |</a> /** **/
<a name="line670">670 |</a> /** LONGIND returns the index in LONGOPT of the long-named option found. **/
<a name="line671">671 |</a> /** It is only valid when a long-named option has been found by the most **/
<a name="line672">672 |</a> /** recent call. **/
<a name="line673">673 |</a> /** **/
<a name="line674">674 |</a> /** If LONG_ONLY is nonzero, '-' as well as '--' can introduce **/
<a name="line675">675 |</a> /** long-named options. **/
<a name="line676">676 |</a> /** **/
<a name="line677">677 |</a> /** ************************************************************************ **/
<a name="line678">678 |</a>
<a name="line679">679 |</a> static int _getopt_internal( int argc,
<a name="line680">680 |</a> char *const *argv,
<a name="line681">681 |</a> const char *optstring,
<a name="line682">682 |</a> const struct option *longopts,
<a name="line683">683 |</a> int *longind,
<a name="line684">684 |</a> int long_only)
<a name="line685">685 |</a> {
<a name="line686">686 |</a> optarg = NULL;
<a name="line687">687 |</a>
<a name="line688">688 |</a> #ifdef _MODULES_DEF_H
<a name="line689">689 |</a> # if WITH_DEBUGGING_INIT
<a name="line690">690 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_getopt_internal, NULL);
<a name="line691">691 |</a> # endif
<a name="line692">692 |</a> #endif
<a name="line693">693 |</a>
<a name="line694">694 |</a> /**
<a name="line695">695 |</a> ** Initialization
<a name="line696">696 |</a> **/
<a name="line697">697 |</a>
<a name="line698">698 |</a> if( optind == 0) {
<a name="line699">699 |</a> optstring = _getopt_initialize( optstring);
<a name="line700">700 |</a> optind = 1; /** Don't scan ARGV[0], the program name. **/
<a name="line701">701 |</a> }
<a name="line702">702 |</a>
<a name="line703">703 |</a> if( nextchar == NULL || *nextchar == '\0') {
<a name="line704">704 |</a>
<a name="line705">705 |</a> /**
<a name="line706">706 |</a> ** Advance to the next ARGV-element.
<a name="line707">707 |</a> **/
<a name="line708">708 |</a>
<a name="line709">709 |</a> if( ordering == PERMUTE) {
<a name="line710">710 |</a>
<a name="line711">711 |</a> /**
<a name="line712">712 |</a> ** If we have just processed some options following some non-
<a name="line713">713 |</a> ** options, exchange them so that the options come first.
<a name="line714">714 |</a> **/
<a name="line715">715 |</a>
<a name="line716">716 |</a> if( first_nonopt != last_nonopt &amp;&amp; last_nonopt != optind)
<a name="line717">717 |</a> exchange( (char **) argv);
<a name="line718">718 |</a> else if( last_nonopt != optind)
<a name="line719">719 |</a> first_nonopt = optind;
<a name="line720">720 |</a>
<a name="line721">721 |</a> /**
<a name="line722">722 |</a> ** Skip any additional non-options and extend the range of
<a name="line723">723 |</a> ** non-options previously skipped.
<a name="line724">724 |</a> **/
<a name="line725">725 |</a>
<a name="line726">726 |</a> while( optind &lt; argc &amp;&amp;
<a name="line727">727 |</a> ( argv[optind][0] != '-' || argv[optind][1] == '\0'))
<a name="line728">728 |</a> optind++;
<a name="line729">729 |</a>
<a name="line730">730 |</a> last_nonopt = optind;
<a name="line731">731 |</a> }
<a name="line732">732 |</a>
<a name="line733">733 |</a> /**
<a name="line734">734 |</a> ** The special ARGV-element `--' means premature end of options.
<a name="line735">735 |</a> ** Skip it like a null option, then exchange with previous non-
<a name="line736">736 |</a> ** options ** as if it were an option, then skip everything else
<a name="line737">737 |</a> ** like a non-option.
<a name="line738">738 |</a> **/
<a name="line739">739 |</a>
<a name="line740">740 |</a> if( optind != argc &amp;&amp; !strcmp( argv[optind], "--")) {
<a name="line741">741 |</a>
<a name="line742">742 |</a> optind++;
<a name="line743">743 |</a>
<a name="line744">744 |</a> if( first_nonopt != last_nonopt &amp;&amp; last_nonopt != optind)
<a name="line745">745 |</a> exchange((char **) argv);
<a name="line746">746 |</a> else if( first_nonopt == last_nonopt)
<a name="line747">747 |</a> first_nonopt = optind;
<a name="line748">748 |</a>
<a name="line749">749 |</a> last_nonopt = argc;
<a name="line750">750 |</a>
<a name="line751">751 |</a> optind = argc;
<a name="line752">752 |</a> }
<a name="line753">753 |</a>
<a name="line754">754 |</a> /**
<a name="line755">755 |</a> ** If we have done all the ARGV-elements, stop the scan and back
<a name="line756">756 |</a> ** over any non-options that we skipped and permuted.
<a name="line757">757 |</a> **/
<a name="line758">758 |</a>
<a name="line759">759 |</a> if( optind == argc) {
<a name="line760">760 |</a>
<a name="line761">761 |</a> /**
<a name="line762">762 |</a> ** Set the next-arg-index to point at the non-options that we
<a name="line763">763 |</a> ** previously skipped, so the caller will digest them.
<a name="line764">764 |</a> **/
<a name="line765">765 |</a>
<a name="line766">766 |</a> if( first_nonopt != last_nonopt)
<a name="line767">767 |</a> optind = first_nonopt;
<a name="line768">768 |</a>
<a name="line769">769 |</a> return( EOF);
<a name="line770">770 |</a> }
<a name="line771">771 |</a>
<a name="line772">772 |</a> /**
<a name="line773">773 |</a> ** If we have come to a non-option and did not permute it,
<a name="line774">774 |</a> ** either stop the scan or describe it to the caller and pass it by.
<a name="line775">775 |</a> **/
<a name="line776">776 |</a>
<a name="line777">777 |</a> if( argv[optind][0] != '-' || argv[optind][1] == '\0') {
<a name="line778">778 |</a>
<a name="line779">779 |</a> if( ordering == REQUIRE_ORDER)
<a name="line780">780 |</a> return EOF;
<a name="line781">781 |</a> optarg = argv[optind++];
<a name="line782">782 |</a>
<a name="line783">783 |</a> return( 1);
<a name="line784">784 |</a> }
<a name="line785">785 |</a>
<a name="line786">786 |</a> /**
<a name="line787">787 |</a> ** We have found another option-ARGV-element.
<a name="line788">788 |</a> ** Skip the initial punctuation.
<a name="line789">789 |</a> **/
<a name="line790">790 |</a>
<a name="line791">791 |</a> nextchar =( argv[optind] + 1 +
<a name="line792">792 |</a> ( longopts != NULL &amp;&amp; argv[optind][1] == '-'));
<a name="line793">793 |</a> }
<a name="line794">794 |</a>
<a name="line795">795 |</a> /**
<a name="line796">796 |</a> ** Decode the current option-ARGV-element.
<a name="line797">797 |</a> **/
<a name="line798">798 |</a>
<a name="line799">799 |</a> /**
<a name="line800">800 |</a> ** Check whether the ARGV-element is a long option.
<a name="line801">801 |</a> **
<a name="line802">802 |</a> ** If long_only and the ARGV-element has the form "-f", where f is
<a name="line803">803 |</a> ** a valid short option, don't consider it an abbreviated form of
<a name="line804">804 |</a> ** a long option that starts with f. Otherwise there would be no
<a name="line805">805 |</a> ** way to give the -f short option.
<a name="line806">806 |</a> **
<a name="line807">807 |</a> ** On the other hand, if there's a long option "fubar" and
<a name="line808">808 |</a> ** the ARGV-element is "-fu", do consider that an abbreviation of
<a name="line809">809 |</a> ** the long option, just like "--fu", and not "-f" with arg "u".
<a name="line810">810 |</a> **
<a name="line811">811 |</a> ** This distinction seems to be the most useful approach.
<a name="line812">812 |</a> **/
<a name="line813">813 |</a>
<a name="line814">814 |</a> if( longopts != NULL &amp;&amp;( argv[optind][1] == '-' ||
<a name="line815">815 |</a> ( long_only &amp;&amp;
<a name="line816">816 |</a> ( argv[optind][2] || !my_index (optstring, argv[optind][1]))))) {
<a name="line817">817 |</a>
<a name="line818">818 |</a> char *nameend;
<a name="line819">819 |</a> const struct option *p;
<a name="line820">820 |</a> const struct option *pfound = NULL;
<a name="line821">821 |</a> int exact = 0;
<a name="line822">822 |</a> int ambig = 0;
<a name="line823">823 |</a> int indfound;
<a name="line824">824 |</a> int option_index;
<a name="line825">825 |</a>
<a name="line826">826 |</a> /**
<a name="line827">827 |</a> ** Skip the remaining characters of the long option upt to its
<a name="line828">828 |</a> ** names end( End of the option itsself or the '=' sign)
<a name="line829">829 |</a> **/
<a name="line830">830 |</a>
<a name="line831">831 |</a> for( nameend = nextchar; *nameend &amp;&amp; *nameend != '='; nameend++);
<a name="line832">832 |</a>
<a name="line833">833 |</a> /**
<a name="line834">834 |</a> ** Test all long options for either exact match or abbreviated
<a name="line835">835 |</a> ** matches.
<a name="line836">836 |</a> **/
<a name="line837">837 |</a>
<a name="line838">838 |</a> for( p = longopts, option_index = 0; p-&gt;name; p++, option_index++) {
<a name="line839">839 |</a> if( !strncmp( p-&gt;name, nextchar, nameend - nextchar)) {
<a name="line840">840 |</a>
<a name="line841">841 |</a> if( nameend - nextchar == strlen( p-&gt;name)) {
<a name="line842">842 |</a>
<a name="line843">843 |</a> /**
<a name="line844">844 |</a> ** Exact match found.
<a name="line845">845 |</a> **/
<a name="line846">846 |</a>
<a name="line847">847 |</a> pfound = p;
<a name="line848">848 |</a> indfound = option_index;
<a name="line849">849 |</a> exact = 1;
<a name="line850">850 |</a> break;
<a name="line851">851 |</a>
<a name="line852">852 |</a> } else if( pfound == NULL) {
<a name="line853">853 |</a>
<a name="line854">854 |</a> /**
<a name="line855">855 |</a> ** First nonexact match found.
<a name="line856">856 |</a> **/
<a name="line857">857 |</a>
<a name="line858">858 |</a> pfound = p;
<a name="line859">859 |</a> indfound = option_index;
<a name="line860">860 |</a>
<a name="line861">861 |</a> } else
<a name="line862">862 |</a>
<a name="line863">863 |</a> /**
<a name="line864">864 |</a> ** Second or later nonexact match found.
<a name="line865">865 |</a> **/
<a name="line866">866 |</a>
<a name="line867">867 |</a> ambig = 1;
<a name="line868">868 |</a>
<a name="line869">869 |</a> } /** if( !strncmp) **/
<a name="line870">870 |</a> } /** for **/
<a name="line871">871 |</a>
<a name="line872">872 |</a> /**
<a name="line873">873 |</a> ** Print an error message for ambigious abbreviations and exit
<a name="line874">874 |</a> ** on error
<a name="line875">875 |</a> **/
<a name="line876">876 |</a>
<a name="line877">877 |</a> if( ambig &amp;&amp; !exact) {
<a name="line878">878 |</a>
<a name="line879">879 |</a> if( opterr)
<a name="line880">880 |</a> #ifdef _MODULES_DEF_H
<a name="line881">881 |</a> ErrorLogger( ERR_OPT_AMBIG, LOC, argv[optind], NULL);
<a name="line882">882 |</a> #else
<a name="line883">883 |</a> fprintf( stderr, _("%s: option `%s' is ambiguous\n"),
<a name="line884">884 |</a> argv[0], argv[optind]);
<a name="line885">885 |</a> #endif
<a name="line886">886 |</a>
<a name="line887">887 |</a> nextchar += strlen( nextchar);
<a name="line888">888 |</a> optind++;
<a name="line889">889 |</a> return( '?');
<a name="line890">890 |</a> }
<a name="line891">891 |</a>
<a name="line892">892 |</a> /**
<a name="line893">893 |</a> ** Longname found ?
<a name="line894">894 |</a> **/
<a name="line895">895 |</a>
<a name="line896">896 |</a> if( pfound != NULL) {
<a name="line897">897 |</a>
<a name="line898">898 |</a> option_index = indfound;
<a name="line899">899 |</a> optind++;
<a name="line900">900 |</a>
<a name="line901">901 |</a> /**
<a name="line902">902 |</a> ** *nameend is != NULL if there is a value specified for
<a name="line903">903 |</a> ** the option: '--option=value' -&gt; *nameend = '='
<a name="line904">904 |</a> **/
<a name="line905">905 |</a>
<a name="line906">906 |</a> if( *nameend) {
<a name="line907">907 |</a>
<a name="line908">908 |</a> /**
<a name="line909">909 |</a> ** Don't test has_arg with &gt;, because some C compilers don't
<a name="line910">910 |</a> ** allow it to be used on enums.
<a name="line911">911 |</a> **/
<a name="line912">912 |</a>
<a name="line913">913 |</a> if( pfound-&gt;has_arg)
<a name="line914">914 |</a> optarg = nameend + 1;
<a name="line915">915 |</a>
<a name="line916">916 |</a> else {
<a name="line917">917 |</a>
<a name="line918">918 |</a> if( opterr)
<a name="line919">919 |</a>
<a name="line920">920 |</a> /**
<a name="line921">921 |</a> ** ERROR: --option w/o argument
<a name="line922">922 |</a> **/
<a name="line923">923 |</a>
<a name="line924">924 |</a> if( argv[optind - 1][1] == '-')
<a name="line925">925 |</a> #ifdef _MODULES_DEF_H
<a name="line926">926 |</a> ErrorLogger( ERR_OPT_NOARG, LOC, pfound-&gt;name, NULL);
<a name="line927">927 |</a> #else
<a name="line928">928 |</a> fprintf( stderr,
<a name="line929">929 |</a> _("%s: option `--%s' doesn't allow an argument\n"),
<a name="line930">930 |</a> argv[0], pfound-&gt;name);
<a name="line931">931 |</a> #endif
<a name="line932">932 |</a>
<a name="line933">933 |</a> /**
<a name="line934">934 |</a> ** ERROR: +option or -option w/o argument
<a name="line935">935 |</a> **/
<a name="line936">936 |</a>
<a name="line937">937 |</a> else {
<a name="line938">938 |</a> #ifdef _MODULES_DEF_H
<a name="line939">939 |</a> char buffer[ BUFSIZ];
<a name="line940">940 |</a> sprintf( buffer, "%c%s", argv[optind - 1][0], pfound-&gt;name);
<a name="line941">941 |</a> ErrorLogger( ERR_OPT_NOARG, LOC, buffer, NULL);
<a name="line942">942 |</a> #else
<a name="line943">943 |</a> fprintf( stderr,
<a name="line944">944 |</a> _("%s: option `%c%s' doesn't allow an argument\n"),
<a name="line945">945 |</a> argv[0], argv[optind - 1][0], pfound-&gt;name);
<a name="line946">946 |</a> #endif
<a name="line947">947 |</a> }
<a name="line948">948 |</a>
<a name="line949">949 |</a> nextchar += strlen( nextchar);
<a name="line950">950 |</a> return( '?');
<a name="line951">951 |</a> }
<a name="line952">952 |</a>
<a name="line953">953 |</a> /**
<a name="line954">954 |</a> ** Options with arguments
<a name="line955">955 |</a> **/
<a name="line956">956 |</a>
<a name="line957">957 |</a> } else if( pfound-&gt;has_arg == 1) {
<a name="line958">958 |</a>
<a name="line959">959 |</a> if( optind &lt; argc)
<a name="line960">960 |</a> optarg = argv[optind++];
<a name="line961">961 |</a>
<a name="line962">962 |</a> else {
<a name="line963">963 |</a>
<a name="line964">964 |</a> /**
<a name="line965">965 |</a> ** ERROR: Option without argument where one is required
<a name="line966">966 |</a> **/
<a name="line967">967 |</a>
<a name="line968">968 |</a> if( opterr)
<a name="line969">969 |</a> #ifdef _MODULES_DEF_H
<a name="line970">970 |</a> ErrorLogger( ERR_OPT_REQARG, LOC, argv[optind-1], NULL);
<a name="line971">971 |</a> #else
<a name="line972">972 |</a> fprintf( stderr,
<a name="line973">973 |</a> _("%s: option `%s' requires an argument\n"),
<a name="line974">974 |</a> argv[0], argv[optind - 1]);
<a name="line975">975 |</a> #endif
<a name="line976">976 |</a>
<a name="line977">977 |</a> nextchar += strlen( nextchar);
<a name="line978">978 |</a> return((optstring[0] == ':') ? ':' : '?');
<a name="line979">979 |</a> }
<a name="line980">980 |</a> }
<a name="line981">981 |</a>
<a name="line982">982 |</a> /**
<a name="line983">983 |</a> ** Return the indication, that a long vlaue has been found
<a name="line984">984 |</a> ** and set up pointers for the next option expansion
<a name="line985">985 |</a> **/
<a name="line986">986 |</a>
<a name="line987">987 |</a> nextchar += strlen( nextchar);
<a name="line988">988 |</a>
<a name="line989">989 |</a> if( longind != NULL)
<a name="line990">990 |</a> *longind = option_index;
<a name="line991">991 |</a>
<a name="line992">992 |</a> if( pfound-&gt;flag) {
<a name="line993">993 |</a> *(pfound-&gt;flag) = pfound-&gt;val;
<a name="line994">994 |</a> return( 0);
<a name="line995">995 |</a> }
<a name="line996">996 |</a> return( pfound-&gt;val);
<a name="line997">997 |</a> }
<a name="line998">998 |</a>
<a name="line999">999 |</a> /**
<a name="line1000">1000 |</a> ** Can't find it as a long option. If this is not getopt_long_only,
<a name="line1001">1001 |</a> ** or the option starts with '--' or is not a valid short
<a name="line1002">1002 |</a> ** option, then it's an error.
<a name="line1003">1003 |</a> ** Otherwise interpret it as a short option.
<a name="line1004">1004 |</a> **/
<a name="line1005">1005 |</a>
<a name="line1006">1006 |</a> if( !long_only || argv[optind][1] == '-' ||
<a name="line1007">1007 |</a> my_index( optstring, *nextchar) == NULL) {
<a name="line1008">1008 |</a>
<a name="line1009">1009 |</a> if( opterr) {
<a name="line1010">1010 |</a>
<a name="line1011">1011 |</a> /**
<a name="line1012">1012 |</a> ** ERROR: unrecognized --option
<a name="line1013">1013 |</a> **/
<a name="line1014">1014 |</a>
<a name="line1015">1015 |</a> if( argv[optind][1] == '-') {
<a name="line1016">1016 |</a> #ifdef _MODULES_DEF_H
<a name="line1017">1017 |</a> ErrorLogger( ERR_OPT_UNKNOWN, LOC, nextchar, NULL);
<a name="line1018">1018 |</a> #else
<a name="line1019">1019 |</a> fprintf( stderr, _("%s: unrecognized option `--%s'\n"),
<a name="line1020">1020 |</a> argv[0], nextchar);
<a name="line1021">1021 |</a> #endif
<a name="line1022">1022 |</a>
<a name="line1023">1023 |</a> /**
<a name="line1024">1024 |</a> ** ERROR: unrecognized +option or -option
<a name="line1025">1025 |</a> **/
<a name="line1026">1026 |</a>
<a name="line1027">1027 |</a> } else {
<a name="line1028">1028 |</a> #ifdef _MODULES_DEF_H
<a name="line1029">1029 |</a> char buffer[ BUFSIZ];
<a name="line1030">1030 |</a> sprintf( buffer, "%c%s", argv[optind][0], nextchar);
<a name="line1031">1031 |</a> ErrorLogger( ERR_OPT_AMBIG, LOC, buffer, NULL);
<a name="line1032">1032 |</a> #else
<a name="line1033">1033 |</a> fprintf( stderr, _("%s: unrecognized option `%c%s'\n"),
<a name="line1034">1034 |</a> argv[0], argv[optind][0], nextchar);
<a name="line1035">1035 |</a> #endif
<a name="line1036">1036 |</a> }
<a name="line1037">1037 |</a> }
<a name="line1038">1038 |</a>
<a name="line1039">1039 |</a> nextchar =( char *) "";
<a name="line1040">1040 |</a> optind++;
<a name="line1041">1041 |</a> return( '?');
<a name="line1042">1042 |</a> }
<a name="line1043">1043 |</a> } /** if( long option) **/
<a name="line1044">1044 |</a>
<a name="line1045">1045 |</a> /**
<a name="line1046">1046 |</a> ** Look at and handle the next short option-character.
<a name="line1047">1047 |</a> **/
<a name="line1048">1048 |</a>
<a name="line1049">1049 |</a> {
<a name="line1050">1050 |</a> char c = *nextchar++;
<a name="line1051">1051 |</a> char *temp = my_index( optstring, c);
<a name="line1052">1052 |</a>
<a name="line1053">1053 |</a> /**
<a name="line1054">1054 |</a> ** Increment `optind' when we start to process its last character.
<a name="line1055">1055 |</a> **/
<a name="line1056">1056 |</a>
<a name="line1057">1057 |</a> if( *nextchar == '\0')
<a name="line1058">1058 |</a> ++optind;
<a name="line1059">1059 |</a>
<a name="line1060">1060 |</a> /**
<a name="line1061">1061 |</a> ** Unrecognized options
<a name="line1062">1062 |</a> **/
<a name="line1063">1063 |</a>
<a name="line1064">1064 |</a> if( temp == NULL || c == ':') {
<a name="line1065">1065 |</a> if( opterr) {
<a name="line1066">1066 |</a>
<a name="line1067">1067 |</a> #ifdef _MODULES_DEF_H
<a name="line1068">1068 |</a> char buffer[ 2];
<a name="line1069">1069 |</a> buffer[ 0] = c;
<a name="line1070">1070 |</a> buffer[ 1] = '\0';
<a name="line1071">1071 |</a> #endif
<a name="line1072">1072 |</a>
<a name="line1073">1073 |</a> if( posixly_correct) {
<a name="line1074">1074 |</a>
<a name="line1075">1075 |</a> /**
<a name="line1076">1076 |</a> ** 1003.2 specifies the format of this message.
<a name="line1077">1077 |</a> **/
<a name="line1078">1078 |</a>
<a name="line1079">1079 |</a> #ifdef _MODULES_DEF_H
<a name="line1080">1080 |</a> ErrorLogger( ERR_OPT_ILL, LOC, buffer, NULL);
<a name="line1081">1081 |</a> #else
<a name="line1082">1082 |</a> fprintf( stderr, _("%s: illegal option -- %c\n"),
<a name="line1083">1083 |</a> argv[0], c);
<a name="line1084">1084 |</a> #endif
<a name="line1085">1085 |</a> } else {
<a name="line1086">1086 |</a> #ifdef _MODULES_DEF_H
<a name="line1087">1087 |</a> ErrorLogger( ERR_OPT_INV, LOC, buffer, NULL);
<a name="line1088">1088 |</a> #else
<a name="line1089">1089 |</a> fprintf( stderr, _("%s: invalid option -- %c\n"),
<a name="line1090">1090 |</a> argv[0], c);
<a name="line1091">1091 |</a> #endif
<a name="line1092">1092 |</a> }
<a name="line1093">1093 |</a> }
<a name="line1094">1094 |</a> optopt = c;
<a name="line1095">1095 |</a> return( '?');
<a name="line1096">1096 |</a> }
<a name="line1097">1097 |</a>
<a name="line1098">1098 |</a> /**
<a name="line1099">1099 |</a> **
<a name="line1100">1100 |</a> **/
<a name="line1101">1101 |</a>
<a name="line1102">1102 |</a> if( temp[1] == ':') {
<a name="line1103">1103 |</a> if( temp[2] == ':') {
<a name="line1104">1104 |</a>
<a name="line1105">1105 |</a> /**
<a name="line1106">1106 |</a> ** This is an option that accepts an argument optionally.
<a name="line1107">1107 |</a> **/
<a name="line1108">1108 |</a>
<a name="line1109">1109 |</a> if( *nextchar != '\0') {
<a name="line1110">1110 |</a> optarg = nextchar;
<a name="line1111">1111 |</a> optind++;
<a name="line1112">1112 |</a> } else
<a name="line1113">1113 |</a> optarg = NULL;
<a name="line1114">1114 |</a>
<a name="line1115">1115 |</a> nextchar = NULL;
<a name="line1116">1116 |</a>
<a name="line1117">1117 |</a> } else { /** optional argument **/
<a name="line1118">1118 |</a>
<a name="line1119">1119 |</a> /**
<a name="line1120">1120 |</a> ** This is an option that requires an argument.
<a name="line1121">1121 |</a> **/
<a name="line1122">1122 |</a>
<a name="line1123">1123 |</a> if( *nextchar != '\0') {
<a name="line1124">1124 |</a> optarg = nextchar;
<a name="line1125">1125 |</a>
<a name="line1126">1126 |</a> /**
<a name="line1127">1127 |</a> ** If we end this ARGV-element by taking the rest as an arg,
<a name="line1128">1128 |</a> ** we must advance to the next element now.
<a name="line1129">1129 |</a> **/
<a name="line1130">1130 |</a>
<a name="line1131">1131 |</a> optind++;
<a name="line1132">1132 |</a>
<a name="line1133">1133 |</a> } else if( optind == argc) {
<a name="line1134">1134 |</a>
<a name="line1135">1135 |</a> if( opterr) {
<a name="line1136">1136 |</a>
<a name="line1137">1137 |</a> /**
<a name="line1138">1138 |</a> ** 1003.2 specifies the format of this message. *
<a name="line1139">1139 |</a> **/
<a name="line1140">1140 |</a>
<a name="line1141">1141 |</a> #ifdef _MODULES_DEF_H
<a name="line1142">1142 |</a> char buffer[ 2];
<a name="line1143">1143 |</a> buffer[ 0] = c;
<a name="line1144">1144 |</a> buffer[ 1] = '\0';
<a name="line1145">1145 |</a> ErrorLogger( ERR_OPT_REQARG, LOC, buffer, NULL);
<a name="line1146">1146 |</a> #else
<a name="line1147">1147 |</a> fprintf( stderr,
<a name="line1148">1148 |</a> _("%s: option requires an argument -- %c\n"),
<a name="line1149">1149 |</a> argv[0], c);
<a name="line1150">1150 |</a> #endif
<a name="line1151">1151 |</a> }
<a name="line1152">1152 |</a>
<a name="line1153">1153 |</a> optopt = c;
<a name="line1154">1154 |</a> if( optstring[0] == ':')
<a name="line1155">1155 |</a> c = ':';
<a name="line1156">1156 |</a> else
<a name="line1157">1157 |</a> c = '?';
<a name="line1158">1158 |</a>
<a name="line1159">1159 |</a> } else
<a name="line1160">1160 |</a>
<a name="line1161">1161 |</a> /**
<a name="line1162">1162 |</a> ** We already incremented `optind' once;
<a name="line1163">1163 |</a> ** increment it again when taking next ARGV-elt as argument.
<a name="line1164">1164 |</a> **/
<a name="line1165">1165 |</a>
<a name="line1166">1166 |</a> optarg = argv[optind++];
<a name="line1167">1167 |</a> nextchar = NULL;
<a name="line1168">1168 |</a> }
<a name="line1169">1169 |</a> }
<a name="line1170">1170 |</a>
<a name="line1171">1171 |</a> /**
<a name="line1172">1172 |</a> ** Now c contains the found character in case of success of '?' in case
<a name="line1173">1173 |</a> ** of failure
<a name="line1174">1174 |</a> **/
<a name="line1175">1175 |</a>
<a name="line1176">1176 |</a> #ifdef _MODULES_DEF_H
<a name="line1177">1177 |</a> # if WITH_DEBUGGING_INIT
<a name="line1178">1178 |</a> ErrorLogger( NO_ERR_END, LOC, _proc_getopt_internal, NULL);
<a name="line1179">1179 |</a> # endif
<a name="line1180">1180 |</a> #endif
<a name="line1181">1181 |</a> return( c);
<a name="line1182">1182 |</a>
<a name="line1183">1183 |</a> } /** block **/
<a name="line1184">1184 |</a>
<a name="line1185">1185 |</a> } /** End of '_getopt_internal' **/
<a name="line1186">1186 |</a>
<a name="line1187">1187 |</a> /*++++
<a name="line1188">1188 |</a> ** ** Function-Header ***************************************************** **
<a name="line1189">1189 |</a> ** **
<a name="line1190">1190 |</a> ** Function: getopt, getopt_long, getopt_long_only **
<a name="line1191">1191 |</a> ** **
<a name="line1192">1192 |</a> ** Description: Calls _getopt_internal in order to provide a normal **
<a name="line1193">1193 |</a> ** getopt call. **
<a name="line1194">1194 |</a> ** **
<a name="line1195">1195 |</a> ** First Edition: 1995/12/20 **
<a name="line1196">1196 |</a> ** **
<a name="line1197">1197 |</a> ** Parameters: int argc, # of arguments **
<a name="line1198">1198 |</a> ** char **argv, ARGV array **
<a name="line1199">1199 |</a> ** char *optstring, String of valid short opt. **
<a name="line1200">1200 |</a> ** **
<a name="line1201">1201 |</a> ** Result: int '?' Parse error **
<a name="line1202">1202 |</a> ** 0 Long option w/o argument found **
<a name="line1203">1203 |</a> ** else short option that has been found **
<a name="line1204">1204 |</a> ** or the value of a long option **
<a name="line1205">1205 |</a> ** EOF no more arguments on ARGV **
<a name="line1206">1206 |</a> ** **
<a name="line1207">1207 |</a> ** Attached globals: optind Index of the current option in the **
<a name="line1208">1208 |</a> ** ARGV array **
<a name="line1209">1209 |</a> ** optarg Argument of an option with value **
<a name="line1210">1210 |</a> ** opterr Set in case of parse errors **
<a name="line1211">1211 |</a> ** **
<a name="line1212">1212 |</a> ** ************************************************************************ **
<a name="line1213">1213 |</a> ++++*/
<a name="line1214">1214 |</a>
<a name="line1215">1215 |</a> int getopt( int argc, char *const *argv, const char *optstring)
<a name="line1216">1216 |</a> {
<a name="line1217">1217 |</a>
<a name="line1218">1218 |</a> #ifdef _MODULES_DEF_H
<a name="line1219">1219 |</a> # if WITH_DEBUGGING_INIT
<a name="line1220">1220 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_getopt, NULL);
<a name="line1221">1221 |</a> # endif
<a name="line1222">1222 |</a> #endif
<a name="line1223">1223 |</a>
<a name="line1224">1224 |</a> return _getopt_internal( argc, argv, optstring,
<a name="line1225">1225 |</a> ( const struct option *) 0,
<a name="line1226">1226 |</a> ( int *) 0,
<a name="line1227">1227 |</a> 0);
<a name="line1228">1228 |</a> } /** End of 'getopt' **/
<a name="line1229">1229 |</a>
<a name="line1230">1230 |</a> int getopt_long( int argc, char *const *argv, const char *optstring,
<a name="line1231">1231 |</a> const struct option *longopts, int *longind)
<a name="line1232">1232 |</a> {
<a name="line1233">1233 |</a>
<a name="line1234">1234 |</a> #ifdef _MODULES_DEF_H
<a name="line1235">1235 |</a> # if WITH_DEBUGGING_INIT
<a name="line1236">1236 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_getopt_long, NULL);
<a name="line1237">1237 |</a> # endif
<a name="line1238">1238 |</a> #endif
<a name="line1239">1239 |</a>
<a name="line1240">1240 |</a> return _getopt_internal( argc, argv, optstring, longopts, longind, 0);
<a name="line1241">1241 |</a>
<a name="line1242">1242 |</a> } /** End of 'getopt' **/
<a name="line1243">1243 |</a>
<a name="line1244">1244 |</a> int getopt_long_only( int argc, char *const *argv, const char *optstring,
<a name="line1245">1245 |</a> const struct option *longopts, int *longind)
<a name="line1246">1246 |</a> {
<a name="line1247">1247 |</a>
<a name="line1248">1248 |</a> #ifdef _MODULES_DEF_H
<a name="line1249">1249 |</a> # if WITH_DEBUGGING_INIT
<a name="line1250">1250 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_getopt_long_only, NULL);
<a name="line1251">1251 |</a> # endif
<a name="line1252">1252 |</a> #endif
<a name="line1253">1253 |</a>
<a name="line1254">1254 |</a> return _getopt_internal( argc, argv, optstring, longopts, longind, 1);
<a name="line1255">1255 |</a>
<a name="line1256">1256 |</a> } /** End of 'getopt' **/
<a name="line1257">1257 |</a>
<a name="line1258">1258 |</a> /* #endif */ /* _LIBC or not __GNU_LIBRARY__. */
<a name="line1259">1259 |</a>
<a name="line1260">1260 |</a> #ifdef TEST
<a name="line1261">1261 |</a>
<a name="line1262">1262 |</a> /*++++
<a name="line1263">1263 |</a> ** ** Function-Header ***************************************************** **
<a name="line1264">1264 |</a> ** **
<a name="line1265">1265 |</a> ** Function: main **
<a name="line1266">1266 |</a> ** **
<a name="line1267">1267 |</a> ** Description: Test procedure for getopt **
<a name="line1268">1268 |</a> ** Compile with -DTEST to make an executable for use in **
<a name="line1269">1269 |</a> ** testing the above definition of `getopt' **
<a name="line1270">1270 |</a> ** **
<a name="line1271">1271 |</a> ** First Edition: 1995/12/20 **
<a name="line1272">1272 |</a> ** **
<a name="line1273">1273 |</a> ** Parameters: int argc, # of arguments **
<a name="line1274">1274 |</a> ** char **argv, ARGV array **
<a name="line1275">1275 |</a> ** **
<a name="line1276">1276 |</a> ** Result: - **
<a name="line1277">1277 |</a> ** **
<a name="line1278">1278 |</a> ** ************************************************************************ **
<a name="line1279">1279 |</a> ++++*/
<a name="line1280">1280 |</a>
<a name="line1281">1281 |</a> int main( int argc, char **argv)
<a name="line1282">1282 |</a> {
<a name="line1283">1283 |</a>
<a name="line1284">1284 |</a> # ifdef _MODULES_DEF_H
<a name="line1285">1285 |</a> # if WITH_DEBUGGING_INIT
<a name="line1286">1286 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_main, NULL);
<a name="line1287">1287 |</a> # endif
<a name="line1288">1288 |</a> # endif
<a name="line1289">1289 |</a>
<a name="line1290">1290 |</a> int c;
<a name="line1291">1291 |</a> int digit_optind = 0;
<a name="line1292">1292 |</a> int longind;
<a name="line1293">1293 |</a> int option, verbose;
<a name="line1294">1294 |</a> char *value;
<a name="line1295">1295 |</a>
<a name="line1296">1296 |</a> const struct option longopts[] = {
<a name="line1297">1297 |</a> { "test", no_argument, NULL, 0 },
<a name="line1298">1298 |</a> { "option", optional_argument, &amp;option, 1 },
<a name="line1299">1299 |</a> { "verbose", optional_argument, NULL, 'v' },
<a name="line1300">1300 |</a> { "value", required_argument, NULL, 'x'},
<a name="line1301">1301 |</a> { NULL, no_argument, NULL, 0 }
<a name="line1302">1302 |</a> };
<a name="line1303">1303 |</a>
<a name="line1304">1304 |</a> /**
<a name="line1305">1305 |</a> ** Print all options ...
<a name="line1306">1306 |</a> **/
<a name="line1307">1307 |</a>
<a name="line1308">1308 |</a> while( 1) {
<a name="line1309">1309 |</a>
<a name="line1310">1310 |</a> int this_option_optind = optind ? optind : 1;
<a name="line1311">1311 |</a>
<a name="line1312">1312 |</a> c = getopt_long( argc, argv, "abc:d:0123456789", longopts, &amp;longind);
<a name="line1313">1313 |</a> if( c == EOF)
<a name="line1314">1314 |</a> break; /** while( 1) **/
<a name="line1315">1315 |</a>
<a name="line1316">1316 |</a> switch( c) {
<a name="line1317">1317 |</a>
<a name="line1318">1318 |</a> case 0:
<a name="line1319">1319 |</a> printf( "option --test or --option\n");
<a name="line1320">1320 |</a> if( optarg)
<a name="line1321">1321 |</a> printf( "with argument '%s'", optarg);
<a name="line1322">1322 |</a> printf( "\n option is set to %d\n", option);
<a name="line1323">1323 |</a> break;
<a name="line1324">1324 |</a>
<a name="line1325">1325 |</a> case '0':
<a name="line1326">1326 |</a> case '1':
<a name="line1327">1327 |</a> case '2':
<a name="line1328">1328 |</a> case '3':
<a name="line1329">1329 |</a> case '4':
<a name="line1330">1330 |</a> case '5':
<a name="line1331">1331 |</a> case '6':
<a name="line1332">1332 |</a> case '7':
<a name="line1333">1333 |</a> case '8':
<a name="line1334">1334 |</a> case '9':
<a name="line1335">1335 |</a> if( digit_optind != 0 &amp;&amp; digit_optind != this_option_optind)
<a name="line1336">1336 |</a> printf( "digits occur in two different argv-elements.\n");
<a name="line1337">1337 |</a> digit_optind = this_option_optind;
<a name="line1338">1338 |</a> printf( "option %c\n", c);
<a name="line1339">1339 |</a> break;
<a name="line1340">1340 |</a>
<a name="line1341">1341 |</a> case 'a':
<a name="line1342">1342 |</a> printf( "option a\n");
<a name="line1343">1343 |</a> break;
<a name="line1344">1344 |</a>
<a name="line1345">1345 |</a> case 'b':
<a name="line1346">1346 |</a> printf( "option b\n");
<a name="line1347">1347 |</a> break;
<a name="line1348">1348 |</a>
<a name="line1349">1349 |</a> case 'c':
<a name="line1350">1350 |</a> printf( "option c with value `%s'\n", optarg);
<a name="line1351">1351 |</a> break;
<a name="line1352">1352 |</a>
<a name="line1353">1353 |</a> case 'v':
<a name="line1354">1354 |</a> case 'x':
<a name="line1355">1355 |</a> printf( "option %c ", c);
<a name="line1356">1356 |</a> if( optarg)
<a name="line1357">1357 |</a> printf( "with argument '%s'", optarg);
<a name="line1358">1358 |</a> printf( "\n");
<a name="line1359">1359 |</a> break;
<a name="line1360">1360 |</a>
<a name="line1361">1361 |</a> case '?':
<a name="line1362">1362 |</a> break;
<a name="line1363">1363 |</a>
<a name="line1364">1364 |</a> default:
<a name="line1365">1365 |</a> printf( "?? getopt returned character code 0%o ??\n", c);
<a name="line1366">1366 |</a> }
<a name="line1367">1367 |</a> } /** while( 1) **/
<a name="line1368">1368 |</a>
<a name="line1369">1369 |</a> /**
<a name="line1370">1370 |</a> ** Finally print all remaining arguments
<a name="line1371">1371 |</a> **/
<a name="line1372">1372 |</a>
<a name="line1373">1373 |</a> if( optind &lt; argc) {
<a name="line1374">1374 |</a> printf( "non-option ARGV-elements: ");
<a name="line1375">1375 |</a> while( optind &lt; argc)
<a name="line1376">1376 |</a> printf( "%s ", argv[optind++]);
<a name="line1377">1377 |</a> printf( "\n");
<a name="line1378">1378 |</a> }
<a name="line1379">1379 |</a>
<a name="line1380">1380 |</a> /**
<a name="line1381">1381 |</a> ** Exit on success
<a name="line1382">1382 |</a> **/
<a name="line1383">1383 |</a>
<a name="line1384">1384 |</a> # ifdef _MODULES_DEF_H
<a name="line1385">1385 |</a> # if WITH_DEBUGGING_INIT
<a name="line1386">1386 |</a> ErrorLogger( NO_ERR_END, LOC, _proc_main, NULL);
<a name="line1387">1387 |</a> # endif
<a name="line1388">1388 |</a> # endif
<a name="line1389">1389 |</a>
<a name="line1390">1390 |</a> exit( 0);
<a name="line1391">1391 |</a>
<a name="line1392">1392 |</a> } /** End of 'main' **/
<a name="line1393">1393 |</a>
<a name="line1394">1394 |</a> #endif /* TEST */
</pre>
</BODY>
</HTML>