getopt.c
上传用户:yingdiyu
上传日期:2007-01-06
资源大小:116k
文件大小:4k
源码类别:

磁盘编程

开发平台:

Others

  1. /*
  2.  *  $Header$
  3.  *
  4.  *  Copyright (C) 1994 Arno Schaefer
  5.  *
  6.  *  AU: Auswertung der Kommandozeile, der POSIX-Version von getopt ()
  7.  * nachempfunden.
  8.  *
  9.  *  PO: ANSI C
  10.  */
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include "getopt.h"
  14. /* Globale Variablen */
  15. char *optarg;
  16. int optind = 1;
  17. int opterr = 1;
  18. int optopt;
  19. static char *nextarg = NULL;
  20. /* Funktion */
  21. int getopt (int argc, char *argv[], char *optstring)
  22. /*
  23.  *  AU: Auswertung der Kommandozeile
  24.  *
  25.  *  VB: argc und argv sind die Parameter, die an main () uebergeben werden.
  26.  * optstring ist ein String, der die Zeichen enthaelt, die als
  27.  * Optionen erkannt werden. Wenn ein Zeichen von einem Doppelpunkt
  28.  * gefolgt wird, hat die Option ein Argument, das direkt auf das Zeichen
  29.  * folgt oder durch Space davon getrennt ist. Gueltige Optionszeichen
  30.  * sind alle druckbaren Zeichen ausser '?', ' ' und ':'.
  31.  *
  32.  * optind ist der Index auf das naechste Element von argv[], das
  33.  * bearbeitet wird.
  34.  *
  35.  * opterr ist ein Flag, das festlegt, ob bei Fehlern Fehlermeldungen
  36.  * ausgegeben werden.
  37.  *
  38.  * optarg ist ein Zeiger auf das Argument, wenn eine Option ein
  39.  * Argument hat.
  40.  *
  41.  * optopt enthaelt bei Fehlern das Optionszeichen, das den Fehler aus-
  42.  * geloest hat.
  43.  *
  44.  *  NB: Rueckgabewert ist das jeweils naechste Optionszeichen, oder -1 am
  45.  * Ende der Optionsliste.
  46.  *
  47.  * Die Optionsliste ist zu Ende, wenn argv[optind] NULL ist, oder
  48.  * argv[optind] nicht mit '-' (oder '/') beginnt, oder argv[optind]
  49.  * ein einzelnes "-" ist. In diesem Fall wird optind nicht erhoeht.
  50.  * Das Ende der Optionsliste kann mit "--" erzwungen werden, dann ist
  51.  * argv[optind] das erste Argument nach "--".
  52.  *
  53.  *  FB: Ein '?' wird zurueckgegeben, wenn ein Optionszeichen nicht in
  54.  * optstring enthalten war oder ein ungueltiges Optionszeichen
  55.  * uebergeben wurde ('?' oder ':'). Ausserdem bei einem fehlenden
  56.  * Argument, wenn das erste Zeichen von optstring kein ':' ist.
  57.  *
  58.  * Ein ':' wird zurueckgegeben bei einem fehlenden Argument, wenn
  59.  * das erste Zeichen von optstring ein ':' ist.
  60.  */
  61. {
  62. char *search;
  63. optarg = NULL;
  64. if (nextarg == NULL)
  65. {
  66. nextarg = argv[optind];
  67. if (nextarg == NULL)
  68. {
  69. return (-1);
  70. }
  71. #ifdef __MSDOS__
  72. if (*nextarg != '-' && *nextarg != '/')
  73. #else
  74. if (*nextarg != '-')
  75. #endif
  76. {
  77. return (-1);
  78. }
  79. nextarg++;
  80. } /* if */
  81. optopt = *nextarg++;
  82. if (optopt == 0)
  83. {
  84. return (-1);
  85. }
  86. optind++;
  87. if (optopt == '-' && *nextarg == 0)
  88. {
  89. return (-1);
  90. }
  91. if (optopt == ':' || optopt == '?')
  92. {
  93. if (opterr)
  94. {
  95. fprintf
  96. (
  97. stderr,
  98. "%s: illegal option -- %cn",
  99. argv[0],
  100. optopt
  101. );
  102. }
  103. return ('?');
  104. } /* if */
  105. search = strchr (optstring, optopt);
  106. if (search == NULL)
  107. {
  108. if (opterr)
  109. {
  110. fprintf
  111. (
  112. stderr,
  113. "%s: illegal option -- %cn",
  114. argv[0],
  115. optopt
  116. );
  117. }
  118. return ('?');
  119. } /* if */
  120. if (*nextarg == 0)
  121. {
  122. nextarg = NULL;
  123. }
  124. if (search[1] != ':')
  125. {
  126. if (nextarg != NULL)
  127. {
  128. optind--;
  129. }
  130. return (optopt);
  131. }
  132. if (nextarg != NULL)
  133. {
  134. optarg = nextarg;
  135. nextarg = NULL;
  136. return (optopt);
  137. }
  138. optarg = argv[optind];
  139. if (optind == argc)
  140. {
  141. if (opterr)
  142. {
  143. fprintf
  144. (
  145. stderr,
  146. "%s: option requires an argument -- %cn",
  147. argv[0],
  148. optopt
  149. );
  150. } /* if */
  151. if (optstring[0] == ':')
  152. {
  153. return (':');
  154. }
  155. else
  156. {
  157. return ('?');
  158. }
  159. } /* if */
  160. else
  161. {
  162. optind++;
  163. }
  164. return (optopt);
  165. } /* getopt () */