getopt.c 1.1 KB

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