getopt.c
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:3k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. /*
  2. ** @(#)getopt.c 2.2 (smail) 1/26/87
  3. */
  4. /*
  5.  * Here's something you've all been waiting for:  the AT&T public domain
  6.  * source for getopt(3).  It is the code which was given out at the 1985
  7.  * UNIFORUM conference in Dallas.  I obtained it by electronic mail
  8.  * directly from AT&T.  The people there assure me that it is indeed
  9.  * in the public domain.
  10.  * 
  11.  * There is no manual page.  That is because the one they gave out at
  12.  * UNIFORUM was slightly different from the current System V Release 2
  13.  * manual page.  The difference apparently involved a note about the
  14.  * famous rules 5 and 6, recommending using white space between an option
  15.  * and its first argument, and not grouping options that have arguments.
  16.  * Getopt itself is currently lenient about both of these things White
  17.  * space is allowed, but not mandatory, and the last option in a group can
  18.  * have an argument.  That particular version of the man page evidently
  19.  * has no official existence, and my source at AT&T did not send a copy.
  20.  * The current SVR2 man page reflects the actual behavor of this getopt.
  21.  * However, I am not about to post a copy of anything licensed by AT&T.
  22.  */
  23. #include "global.h"
  24. #define index strchr
  25. #ifdef BSD
  26. #include <strings.h>
  27. #else
  28. #include <string.h>
  29. #endif
  30. #ifdef __TURBOC__
  31. #include <io.h> /* added by KA9Q for Turbo-C */
  32. #endif
  33. #ifdef AMIGA
  34. #include <fcntl.h>
  35. #endif
  36. /*LINTLIBRARY*/
  37. #ifndef NULL
  38. #define NULL 0
  39. #endif
  40. #define EOF (-1)
  41. #define ERR(s, c) if(opterr){
  42. extern int write();
  43. char errbuf[2];
  44. errbuf[0] = c; errbuf[1] = 'n';
  45. (void) write(2, argv[0], (unsigned)strlen(argv[0]));
  46. (void) write(2, s, (unsigned)strlen(s));
  47. (void) write(2, errbuf, 2);}
  48. extern char *index();
  49. int opterr = 1;
  50. int optind = 1;
  51. int optopt;
  52. char *optarg;
  53. int
  54. getopt(argc, argv, opts)
  55. int argc;
  56. char **argv, *opts;
  57. {
  58. static int sp = 1;
  59. register int c;
  60. register char *cp;
  61. if(sp == 1)
  62. if(optind >= argc ||
  63.    argv[optind][0] != '-' || argv[optind][1] == '')
  64. return(EOF);
  65. else if(strcmp(argv[optind], "--") == 0) {
  66. optind++;
  67. return(EOF);
  68. }
  69. optopt = c = argv[optind][sp];
  70. if(c == ':' || (cp=index(opts, c)) == NULL) {
  71. ERR(": illegal option -- ", c);
  72. if(argv[optind][++sp] == '') {
  73. optind++;
  74. sp = 1;
  75. }
  76. return('?');
  77. }
  78. if(*++cp == ':') {
  79. if(argv[optind][sp+1] != '')
  80. optarg = &argv[optind++][sp+1];
  81. else if(++optind >= argc) {
  82. ERR(": option requires an argument -- ", c);
  83. sp = 1;
  84. return('?');
  85. } else
  86. optarg = argv[optind++];
  87. sp = 1;
  88. } else {
  89. if(argv[optind][++sp] == '') {
  90. sp = 1;
  91. optind++;
  92. }
  93. optarg = NULL;
  94. }
  95. return(c);
  96. }