Main Page | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

attgetopt.c

Go to the documentation of this file.
00001 /* ==================================================================== 
00002  * The Kannel Software License, Version 1.0 
00003  * 
00004  * Copyright (c) 2001-2008 Kannel Group  
00005  * Copyright (c) 1998-2001 WapIT Ltd.   
00006  * All rights reserved. 
00007  * 
00008  * Redistribution and use in source and binary forms, with or without 
00009  * modification, are permitted provided that the following conditions 
00010  * are met: 
00011  * 
00012  * 1. Redistributions of source code must retain the above copyright 
00013  *    notice, this list of conditions and the following disclaimer. 
00014  * 
00015  * 2. Redistributions in binary form must reproduce the above copyright 
00016  *    notice, this list of conditions and the following disclaimer in 
00017  *    the documentation and/or other materials provided with the 
00018  *    distribution. 
00019  * 
00020  * 3. The end-user documentation included with the redistribution, 
00021  *    if any, must include the following acknowledgment: 
00022  *       "This product includes software developed by the 
00023  *        Kannel Group (http://www.kannel.org/)." 
00024  *    Alternately, this acknowledgment may appear in the software itself, 
00025  *    if and wherever such third-party acknowledgments normally appear. 
00026  * 
00027  * 4. The names "Kannel" and "Kannel Group" must not be used to 
00028  *    endorse or promote products derived from this software without 
00029  *    prior written permission. For written permission, please  
00030  *    contact org@kannel.org. 
00031  * 
00032  * 5. Products derived from this software may not be called "Kannel", 
00033  *    nor may "Kannel" appear in their name, without prior written 
00034  *    permission of the Kannel Group. 
00035  * 
00036  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 
00037  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
00038  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
00039  * DISCLAIMED.  IN NO EVENT SHALL THE KANNEL GROUP OR ITS CONTRIBUTORS 
00040  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,  
00041  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT  
00042  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR  
00043  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,  
00044  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE  
00045  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,  
00046  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
00047  * ==================================================================== 
00048  * 
00049  * This software consists of voluntary contributions made by many 
00050  * individuals on behalf of the Kannel Group.  For more information on  
00051  * the Kannel Group, please see <http://www.kannel.org/>. 
00052  * 
00053  * Portions of this software are based upon software originally written at  
00054  * WapIT Ltd., Helsinki, Finland for the Kannel project.  
00055  */ 
00056 
00057 /*
00058  * attgetopt.c - AT&T's public domain implementation of getopt.
00059  *
00060  * From the mod.sources newsgroup, volume 3, issue 58, with modifications
00061  * to bring it up to 21st century C.
00062  */
00063 
00064 #include <stdio.h>
00065 #include <string.h>
00066 
00067 #include "gw-config.h"
00068 
00069 /*
00070  * If the systm has getopt() defined within stdio.h (like on Solaris 2.6)
00071  * then we will not implement our own here.
00072  */
00073 #ifndef HAVE_GETOPT_IN_STDIO_H
00074 
00075 #define ERR(s, c)       \
00076     if (opterr) \
00077             (void) fprintf(stderr, "%s: %s\n", argv[0], s)
00078 
00079 int     opterr = 1;
00080 int     optind = 1;
00081 int     optopt;
00082 char    *optarg;
00083 
00084 int getopt(int argc, char **argv, char *opts)
00085 {
00086         static int sp = 1;
00087         register int c;
00088         register char *cp;
00089 
00090         if(sp == 1) {
00091                 if(optind >= argc ||
00092                    argv[optind][0] != '-' || argv[optind][1] == '\0')
00093                         return(EOF);
00094                 else if(strcmp(argv[optind], "--") == 0) {
00095                         optind++;
00096                         return(EOF);
00097                 }
00098     }
00099         optopt = c = argv[optind][sp];
00100         if(c == ':' || (cp=strchr(opts, c)) == NULL) {
00101                 ERR(": illegal option -- ", c);
00102                 if(argv[optind][++sp] == '\0') {
00103                         optind++;
00104                         sp = 1;
00105                 }
00106                 return('?');
00107         }
00108         if(*++cp == ':') {
00109                 if(argv[optind][sp+1] != '\0')
00110                         optarg = &argv[optind++][sp+1];
00111                 else if(++optind >= argc) {
00112                         ERR(": option requires an argument -- ", c);
00113                         sp = 1;
00114                         return('?');
00115                 } else
00116                         optarg = argv[optind++];
00117                 sp = 1;
00118         } else {
00119                 if(argv[optind][++sp] == '\0') {
00120                         sp = 1;
00121                         optind++;
00122                 }
00123                 optarg = NULL;
00124         }
00125         return(c);
00126 }
00127 
00128 #endif /* HAVE_GETOPT_IN_STDIO_H */
See file LICENSE for details about the license agreement for using, modifying, copying or deriving work from this software.