home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / sendmail / sendmail-5.65c+IDA-1.4.4.1 / support / getopt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-06-23  |  2.4 KB  |  85 lines

  1. /*
  2.  * Copyright (c) 1987 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted
  6.  * provided that the above copyright notice and this paragraph are
  7.  * duplicated in all such forms and that any documentation,
  8.  * advertising materials, and other materials related to such
  9.  * distribution and use acknowledge that the software was developed
  10.  * by the University of California, Berkeley.  The name of the
  11.  * University may not be used to endorse or promote products derived
  12.  * from this software without specific prior written permission.
  13.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  14.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  15.  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  16.  */
  17.  
  18. #if defined(LIBC_SCCS) && !defined(lint)
  19. static char sccsid[] = "@(#)getopt.c    4.7 (Berkeley) 6/27/88";
  20. #endif /* LIBC_SCCS and not lint */
  21.  
  22. #include <stdio.h>
  23.  
  24. /*
  25.  * get option letter from argument vector
  26.  */
  27. int    opterr = 1,        /* if error message should be printed */
  28.     optind = 1,        /* index into parent argv vector */
  29.     optopt;            /* character checked for validity */
  30. char    *optarg;        /* argument associated with option */
  31.  
  32. #define    BADCH    (int)'?'
  33. #define    EMSG    ""
  34. #define    tell(s)    { \
  35.     if (opterr) { \
  36.         fputs(*nargv, stderr); \
  37.         fputs(s, stderr); \
  38.         fputc(optopt, stderr); \
  39.         fputc((int)'\n', stderr); \
  40.     } \
  41.     return(BADCH); \
  42. }
  43.  
  44. getopt(nargc, nargv, ostr)
  45.     int nargc;
  46.     char **nargv, *ostr;
  47. {
  48.     static char *place = EMSG;        /* option letter processing */
  49.     register char *oli;            /* option letter list index */
  50.     char *index();
  51.  
  52.     if (!*place) {                /* update scanning pointer */
  53.         if (optind >= nargc || *(place = nargv[optind]) != '-')
  54.             return(EOF);
  55.         if (place[1] && *++place == '-') {    /* found "--" */
  56.             ++optind;
  57.             return(EOF);
  58.         }
  59.     }                    /* option letter okay? */
  60.     if ((optopt = (int)*place++) == (int)':' ||
  61.         !(oli = index(ostr, optopt))) {
  62.         if (!*place)
  63.             ++optind;
  64.         tell(": illegal option -- ");
  65.     }
  66.     if (*++oli != ':') {            /* don't need argument */
  67.         optarg = NULL;
  68.         if (!*place)
  69.             ++optind;
  70.     }
  71.     else {                    /* need an argument */
  72.         if (*place)            /* no white space */
  73.             optarg = place;
  74.         else if (nargc <= ++optind) {    /* no arg */
  75.             place = EMSG;
  76.             tell(": option requires an argument -- ");
  77.         }
  78.          else                /* white space */
  79.             optarg = nargv[optind];
  80.         place = EMSG;
  81.         ++optind;
  82.     }
  83.     return(optopt);                /* dump back option letter */
  84. }
  85.