getopt.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /*
  2. * getopt - parse command-line options
  3. */
  4. /* $Id$ */
  5. #include <stdio.h>
  6. #include <string.h>
  7. #define ERR(s, c) if(opterr){\
  8. fputs(argv[0], stderr);\
  9. fputs(s, stderr);\
  10. fputc(c, stderr);\
  11. fputc('\n', stderr);}
  12. int opterr = 1;
  13. int optind = 1;
  14. int optopt;
  15. char *optarg;
  16. int
  17. getopt(int argc, char **argv, char *opts)
  18. {
  19. static int sp = 1;
  20. register c;
  21. register char *cp;
  22. if (sp == 1)
  23. if (optind >= argc ||
  24. argv[optind][0] != '-' || argv[optind][1] == '\0')
  25. return EOF;
  26. else if (!strcmp(argv[optind], "--")) {
  27. optind++;
  28. return EOF;
  29. }
  30. optopt = c = argv[optind][sp];
  31. if (c == ':' || (cp=strchr(opts, c)) == NULL) {
  32. ERR (": illegal option -- ", c);
  33. if (argv[optind][++sp] == '\0') {
  34. optind++;
  35. sp = 1;
  36. }
  37. return '?';
  38. }
  39. if (*++cp == ':') {
  40. if (argv[optind][sp+1] != '\0')
  41. optarg = &argv[optind++][sp+1];
  42. else if (++optind >= argc) {
  43. ERR (": option requires an argument -- ", c);
  44. sp = 1;
  45. return '?';
  46. } else
  47. optarg = argv[optind++];
  48. sp = 1;
  49. } else {
  50. if (argv[optind][++sp] == '\0') {
  51. sp = 1;
  52. optind++;
  53. }
  54. optarg = NULL;
  55. }
  56. return c;
  57. }