getopt.c
上传用户:sddyfurun
上传日期:2007-01-04
资源大小:525k
文件大小:5k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /* Copyright (c) 1987, 1993                                                  */
  2. /* The Regents of the University of California.  All rights reserved.        */
  3. /*                                                                           */
  4. /* Redistribution and use in source and binary forms, with or without        */
  5. /* modification, are permitted provided that the following conditions        */
  6. /* are met:                                                                  */
  7. /* 1. Redistributions of source code must retain the above copyright         */
  8. /*    notice, this list of conditions and the following disclaimer.          */
  9. /* 2. Redistributions in binary form must reproduce the above copyright      */
  10. /*    notice, this list of conditions and the following disclaimer in the    */
  11. /*    documentation and/or other materials provided with the distribution.   */
  12. /* 3. All advertising materials mentioning features or use of this software  */
  13. /*    must display the following acknowledgement:                            */
  14. /*      This product includes software developed by the University of        */
  15. /*      California, Berkeley and its contributors.                           */
  16. /* 4. Neither the name of the University nor the names of its contributors   */
  17. /*    may be used to endorse or promote products derived from this software  */
  18. /*    without specific prior written permission.                             */
  19. /*                                                                           */
  20. /* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND   */
  21. /* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE     */
  22. /* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE*/
  23. /* ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE  */
  24. /* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL*/
  25. /* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS   */
  26. /* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)     */
  27. /* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT*/
  28. /* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY */
  29. /* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF    */
  30. /* SUCH DAMAGE.                                                              */
  31. #ifdef SHOW_SCCSIDS
  32. static char sccsid[] = "@(#)getopt.c 8.1 (Berkeley) 6/4/93";
  33. #endif
  34. #include "config.h"
  35. #ifndef HAVE_GETOPT
  36. #ifndef __STDC__
  37. #define const
  38. #endif
  39. #include <stdio.h>
  40. #include <stdlib.h>
  41. #include <string.h>
  42. /* Get option letter from argument vector                                    */
  43. int opterr = 1; /* if error message should be printed                */
  44. int optind = 1; /* index into parent argv vector                     */
  45. int optopt; /* character checked for validity                    */
  46. int optreset; /* reset getopt                                      */
  47. char *optarg; /* argument associated with option                   */
  48. #define BADCH (int)'?'
  49. #define BADARG (int)':'
  50. #define EMSG ""
  51. int getopt(int nargc, char * const *nargv, const char *ostr) {
  52.     static char *place = EMSG; /* option letter processing          */
  53.     register char *oli; /* option letter list index          */
  54.     char *p;
  55.     if (optreset || !*place) { /* update scanning pointer           */
  56. optreset = 0;
  57. if (optind >= nargc || *(place = nargv[optind]) != '-') {
  58.     place = EMSG;
  59.     return(EOF);
  60. }
  61. if (place[1] && *++place == '-') { /* found "--"                */
  62.     ++optind;
  63.     place = EMSG;
  64.     return(EOF);
  65. }
  66.     } /* option letter okay?               */
  67.     if ((optopt = (int)*place++) == (int)':' || !(oli = strchr(ostr, optopt))) {
  68. /* If the user didn't specify '-' as an option, assume EOF.          */
  69. if (optopt == (int)'-') return(EOF);
  70. if (!*place) ++optind;
  71. if (opterr && *ostr != ':') {
  72.     if (!(p = strrchr(*nargv, '/'))) p = *nargv;
  73.     else ++p;
  74.     fprintf(stderr, "%s: illegal option -- %cn", p, optopt);
  75. }
  76. return(BADCH);
  77.     }
  78.     if (*++oli != ':') { /* don't need argument       */
  79. optarg = NULL;
  80. if (!*place) ++optind;
  81.     } else { /* need an argument          */
  82. if (*place) optarg = place; /* no white space            */
  83. else if (nargc <= ++optind) {         /* no arg                    */
  84.     place = EMSG;
  85.     if (!(p = strrchr(*nargv, '/'))) p = *nargv;
  86.     else ++p;
  87.     if (*ostr == ':') return(BADARG);
  88.     if (opterr) fprintf(stderr, "%s: option requires an argument -- %cn", p, optopt);
  89.     return(BADCH);
  90. } else optarg = nargv[optind]; /* white space               */
  91. place = EMSG;
  92. ++optind;
  93.     }
  94.     return(optopt); /* dump back option letter   */
  95. }
  96. #endif