Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "c.h"
00038
00039 #include "getopt_long.h"
00040
00041 #define BADCH '?'
00042 #define BADARG ':'
00043 #define EMSG ""
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 int
00057 getopt_long(int argc, char *const argv[],
00058 const char *optstring,
00059 const struct option * longopts, int *longindex)
00060 {
00061 static char *place = EMSG;
00062 char *oli;
00063
00064 if (!*place)
00065 {
00066 if (optind >= argc)
00067 {
00068 place = EMSG;
00069 return -1;
00070 }
00071
00072 place = argv[optind];
00073
00074 if (place[0] != '-')
00075 {
00076 place = EMSG;
00077 return -1;
00078 }
00079
00080 place++;
00081
00082 if (place[0] && place[0] == '-' && place[1] == '\0')
00083 {
00084 ++optind;
00085 place = EMSG;
00086 return -1;
00087 }
00088
00089 if (place[0] && place[0] == '-' && place[1])
00090 {
00091
00092 size_t namelen;
00093 int i;
00094
00095 place++;
00096
00097 namelen = strcspn(place, "=");
00098 for (i = 0; longopts[i].name != NULL; i++)
00099 {
00100 if (strlen(longopts[i].name) == namelen
00101 && strncmp(place, longopts[i].name, namelen) == 0)
00102 {
00103 if (longopts[i].has_arg)
00104 {
00105 if (place[namelen] == '=')
00106 optarg = place + namelen + 1;
00107 else if (optind < argc - 1)
00108 {
00109 optind++;
00110 optarg = argv[optind];
00111 }
00112 else
00113 {
00114 if (optstring[0] == ':')
00115 return BADARG;
00116 if (opterr)
00117 fprintf(stderr,
00118 "%s: option requires an argument -- %s\n",
00119 argv[0], place);
00120 place = EMSG;
00121 optind++;
00122 return BADCH;
00123 }
00124 }
00125 else
00126 {
00127 optarg = NULL;
00128 if (place[namelen] != 0)
00129 {
00130
00131 }
00132 }
00133
00134 optind++;
00135
00136 if (longindex)
00137 *longindex = i;
00138
00139 place = EMSG;
00140
00141 if (longopts[i].flag == NULL)
00142 return longopts[i].val;
00143 else
00144 {
00145 *longopts[i].flag = longopts[i].val;
00146 return 0;
00147 }
00148 }
00149 }
00150
00151 if (opterr && optstring[0] != ':')
00152 fprintf(stderr,
00153 "%s: illegal option -- %s\n", argv[0], place);
00154 place = EMSG;
00155 optind++;
00156 return BADCH;
00157 }
00158 }
00159
00160
00161 optopt = (int) *place++;
00162
00163 oli = strchr(optstring, optopt);
00164 if (!oli)
00165 {
00166 if (!*place)
00167 ++optind;
00168 if (opterr && *optstring != ':')
00169 fprintf(stderr,
00170 "%s: illegal option -- %c\n", argv[0], optopt);
00171 return BADCH;
00172 }
00173
00174 if (oli[1] != ':')
00175 {
00176 optarg = NULL;
00177 if (!*place)
00178 ++optind;
00179 }
00180 else
00181 {
00182 if (*place)
00183 optarg = place;
00184 else if (argc <= ++optind)
00185 {
00186 place = EMSG;
00187 if (*optstring == ':')
00188 return BADARG;
00189 if (opterr)
00190 fprintf(stderr,
00191 "%s: option requires an argument -- %c\n",
00192 argv[0], optopt);
00193 return BADCH;
00194 }
00195 else
00196
00197 optarg = argv[optind];
00198 place = EMSG;
00199 ++optind;
00200 }
00201 return optopt;
00202 }