getopt.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:2k
源码类别:

Symbian

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "getopt.h"
  4. /*
  5.  * get option letter from argument vector
  6.  */
  7. int
  8. opterr = 1, // should error messages be printed?
  9. optind = 1, // index into parent argv vector
  10. optopt; // character checked for validity
  11. char
  12. *optarg; // argument associated with option
  13. #define EMSG ""
  14. char *progname; // may also be defined elsewhere
  15. static void
  16. error(char *pch)
  17. {
  18. if (!opterr) {
  19. return; // without printing
  20. }
  21. fprintf(stderr, "%s: %s: %cn",
  22. (NULL != progname) ? progname : "getopt", pch, optopt);
  23. }
  24. int
  25. getopt(int argc, char **argv, char *ostr)
  26. {
  27. static char *place = EMSG; /* option letter processing */
  28. register char *oli; /* option letter list index */
  29. if (!*place) {
  30. // update scanning pointer
  31. if (optind >= argc || *(place = argv[optind]) != '-' || !*++place) {
  32. return EOF; 
  33. }
  34. if (*place == '-') {
  35. // found "--"
  36. ++optind;
  37. return EOF;
  38. }
  39. }
  40. /* option letter okay? */
  41. if ((optopt = (int)*place++) == (int)':'
  42. || !(oli = strchr(ostr, optopt))) {
  43. if (!*place) {
  44. ++optind;
  45. }
  46. error("illegal option");
  47. return BADCH;
  48. }
  49. if (*++oli != ':') {
  50. /* don't need argument */
  51. optarg = NULL;
  52. if (!*place)
  53. ++optind;
  54. } else {
  55. /* need an argument */
  56. if (*place) {
  57. optarg = place; /* no white space */
  58. } else  if (argc <= ++optind) {
  59. /* no arg */
  60. place = EMSG;
  61. error("option requires an argument");
  62. return BADCH;
  63. } else {
  64. optarg = argv[optind]; /* white space */
  65. }
  66. place = EMSG;
  67. ++optind;
  68. }
  69. return optopt; // return option letter
  70. }