11 /***************************************************************************\
13 ** Function name: getopt() **
14 ** Author: Henry Spencer, UofT **
15 ** Coding date: 84/04/28 **
19 ** Parses argv[] for arguments. **
20 ** Works with Whitesmith's C compiler. **
22 ** Inputs - The number of arguments **
23 ** - The base address of the array of arguments **
24 ** - A string listing the valid options (':' indicates an **
25 ** argument to the preceding option is required, a ';' **
26 ** indicates an argument to the preceding option is optional) **
28 ** Outputs - Returns the next option character, **
29 ** '?' for non '-' arguments **
30 ** or ':' when there is no more arguments. **
32 ** Side Effects + The argument to an option is pointed to by 'optarg' **
34 *****************************************************************************
36 ** REVISION HISTORY: **
38 ** DATE NAME DESCRIPTION **
39 ** YY/MM/DD ------------------ ------------------------------------ **
40 ** 88/10/20 Janick Bergeron Returns '?' on unamed arguments **
41 ** returns '!' on unknown options **
42 ** and 'EOF' only when exhausted. **
43 ** 88/11/18 Janick Bergeron Return ':' when no more arguments **
44 ** 89/08/11 Janick Bergeron Optional optarg when ';' in optstring **
46 \***************************************************************************/
48 char *optarg; /* Global argument pointer. */
55 getopt(argc, argv, optstring)
63 static int optind = 0;
64 static char *scan = NULL;
68 if (scan == NULL || *scan == '\0') {
75 optarg = place = argv[optind++];
76 if (place[0] != '-' || place[1] == '\0')
78 if (place[1] == '-' && place[2] == '\0')
84 place = index(optstring, c);
85 if (place == NULL || c == ':' || c == ';') {
87 (void) fprintf(stderr, "%s: unknown option %c\n", argv[0], c);
91 if (*++place == ':') {
101 if (optind >= argc) {
103 (void) fprintf(stderr, "%s: %c requires an argument\n",
107 optarg = argv[optind];
111 else if (*place == ';') {
121 if (optind >= argc || *argv[optind] == '-')
124 optarg = argv[optind];
140 for (i = 0; i < db.dsize; i++) {
141 if (isprint((unsigned char)db.dptr[i]))
145 putchar('0' + ((db.dptr[i] >> 6) & 0x07));
146 putchar('0' + ((db.dptr[i] >> 3) & 0x07));
147 putchar('0' + (db.dptr[i] & 0x07));
163 db.dptr = (char *) malloc(strlen(s) * sizeof(char));
165 oops("cannot get memory");
167 for (p = db.dptr; *s != '\0'; p++, db.dsize++, s++) {
177 else if (isdigit((unsigned char)*s)
178 && isdigit((unsigned char)*(s + 1))
179 && isdigit((unsigned char)*(s + 2)))
181 i = (*s++ - '0') << 6;
182 i |= (*s++ - '0') << 3;
206 buf = (char *) malloc((db.dsize + 1) * sizeof(char));
208 oops("cannot get memory");
209 for (p1 = buf, p2 = db.dptr; *p2 != '\0'; *p1++ = *p2++);
220 YOW, FETCH, STORE, DELETE, SCAN, REGEXP
228 int st_flag = DBM_INSERT;
237 while ((opt = getopt(argc, argv, "acdfFm:rstvx")) != ':') {
256 if (strcmp(optarg, "r") == 0)
258 else if (strcmp(optarg, "w") == 0)
260 else if (strcmp(optarg, "rw") == 0)
263 fprintf(stderr, "Invalid mode: \"%s\"\n", optarg);
268 st_flag = DBM_REPLACE;
287 comarg[argn++] = optarg;
289 fprintf(stderr, "Too many arguments.\n");
296 if (giveusage || what == YOW || argn < 1) {
297 fprintf(stderr, "Usage: %s databse [-m r|w|rw] [-crtx] -a|-d|-f|-F|-s [key [content]]\n", argv[0]);
301 if ((db = dbm_open(comarg[0], flags, 0777)) == NULL) {
302 fprintf(stderr, "Error opening database \"%s\"\n", comarg[0]);
307 key = read_datum(comarg[1]);
309 content = read_datum(comarg[2]);
314 key = dbm_firstkey(db);
316 fprintf(stderr, "Error when fetching first key\n");
319 while (key.dptr != NULL) {
320 content = dbm_fetch(db, key);
322 fprintf(stderr, "Error when fetching ");
329 print_datum(content);
332 fprintf(stderr, "Error when fetching next key\n");
335 key = dbm_nextkey(db);
341 fprintf(stderr, "Missing regular expression.\n");
344 if (re_comp(comarg[1])) {
345 fprintf(stderr, "Invalid regular expression\n");
348 key = dbm_firstkey(db);
350 fprintf(stderr, "Error when fetching first key\n");
353 while (key.dptr != NULL) {
354 if (re_exec(key2s(key))) {
355 content = dbm_fetch(db, key);
357 fprintf(stderr, "Error when fetching ");
364 print_datum(content);
367 fprintf(stderr, "Error when fetching next key\n");
371 key = dbm_nextkey(db);
377 fprintf(stderr, "Missing fetch key.\n");
380 content = dbm_fetch(db, key);
382 fprintf(stderr, "Error when fetching ");
387 if (content.dptr == NULL) {
388 fprintf(stderr, "Cannot find ");
395 print_datum(content);
401 fprintf(stderr, "Missing delete key.\n");
404 if (dbm_delete(db, key) || dbm_error(db)) {
405 fprintf(stderr, "Error when deleting ");
412 printf(": DELETED\n");
418 fprintf(stderr, "Missing key and/or content.\n");
421 if (dbm_store(db, key, content, st_flag) || dbm_error(db)) {
422 fprintf(stderr, "Error when storing ");
430 print_datum(content);
440 fprintf(stderr, "Error closing database \"%s\"\n", comarg[0]);