home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 28 / amigaformatcd28.iso / -seriously_amiga- / archivers / mpackppc-wos / src / getopt.c < prev    next >
C/C++ Source or Header  |  1998-04-27  |  3KB  |  123 lines

  1. /* (C) Copyright 1993,1994 by Carnegie Mellon University
  2.  * All Rights Reserved.
  3.  *
  4.  * Permission to use, copy, modify, distribute, and sell this software
  5.  * and its documentation for any purpose is hereby granted without
  6.  * fee, provided that the above copyright notice appear in all copies
  7.  * and that both that copyright notice and this permission notice
  8.  * appear in supporting documentation, and that the name of Carnegie
  9.  * Mellon University not be used in advertising or publicity
  10.  * pertaining to distribution of the software without specific,
  11.  * written prior permission.  Carnegie Mellon University makes no
  12.  * representations about the suitability of this software for any
  13.  * purpose.  It is provided "as is" without express or implied
  14.  * warranty.
  15.  *
  16.  * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
  17.  * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  18.  * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
  19.  * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  20.  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
  21.  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
  22.  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  23.  * SOFTWARE.
  24.  */
  25. #include <stdio.h>
  26.  
  27. #ifdef __OS2__ 
  28. # include <io.h>
  29. #endif
  30.  
  31. #if defined(__MSDOS__) || defined(__OS2__)
  32. #define ERR(s, c)                    \
  33.     if (opterr) {                    \
  34.     char buff[3];                    \
  35.     buff[0] = c; buff[1] = '\r'; buff[2] = '\n';    \
  36.     (void)write(2, av[0], strlen(av[0]));        \
  37.     (void)write(2, s, strlen(s));            \
  38.     (void)write(2, buff, 3);            \
  39.     }
  40. #else /* __MSDOS__ */
  41. #define ERR(s, c)                    \
  42.     if (opterr) {                    \
  43.     char buff[2];                    \
  44.     buff[0] = c; buff[1] = '\n';            \
  45.     (void)write(2, av[0], strlen(av[0]));        \
  46.     (void)write(2, s, strlen(s));            \
  47.     (void)write(2, buff, 2);            \
  48.     }
  49. #endif
  50.  
  51. int    opterr = 1;
  52. int    optind = 1;
  53. int    optopt;
  54. char    *optarg;
  55.  
  56.  
  57. /*
  58. **  Return options and their values from the command line.
  59. **  This comes from the AT&T public-domain getopt published in mod.sources
  60. **  (i.e., comp.sources.unix before the great Usenet renaming).
  61. */
  62. int
  63. getopt(ac, av, opts)
  64.     int        ac;
  65.     char    *av[];
  66.     char    *opts;
  67. {
  68.     extern char    *strchr();
  69.     static int    i = 1;
  70.     char    *p;
  71.  
  72.     /* Move to next value from argv? */
  73.     if (i == 1) {
  74.     if (optind >= ac ||
  75. #if defined(__MSDOS__) || defined(__OS2__)
  76.         (av[optind][0] != '-' && av[optind][0] != '/')
  77. #else
  78.         av[optind][0] != '-'
  79. #endif
  80.         || av[optind][1] == '\0')
  81.         return EOF;
  82.     if (strcmp(av[optind], "--") == 0) {
  83.         optind++;
  84.         return EOF;
  85.     }
  86.     }
  87.  
  88.     /* Get next option character. */
  89.     if ((optopt = av[optind][i]) == ':'
  90.      || (p = strchr(opts,  optopt)) == NULL) {
  91.     ERR(": illegal option -- ", optopt);
  92.     if (av[optind][++i] == '\0') {
  93.         optind++;
  94.         i = 1;
  95.     }
  96.     return '?';
  97.     }
  98.  
  99.     /* Snarf argument? */
  100.     if (*++p == ':') {
  101.     if (av[optind][i + 1] != '\0')
  102.         optarg = &av[optind++][i + 1];
  103.     else {
  104.         if (++optind >= ac) {
  105.         ERR(": option requires an argument -- ", optopt);
  106.         i = 1;
  107.         return '?';
  108.         }
  109.         optarg = av[optind++];
  110.     }
  111.     i = 1;
  112.     }
  113.     else {
  114.     if (av[optind][++i] == '\0') {
  115.         i = 1;
  116.         optind++;
  117.     }
  118.     optarg = NULL;
  119.     }
  120.  
  121.     return optopt;
  122. }
  123.