opt.c
1 2 #include <stdlib.h> 3 #include <stdio.h> 4 #include <limits.h> 5 6 #include "opt.h" 7 8 9 int 10 parse_opt(Opt *opt, const char *cur, const char *next) 11 { 12 int index; 13 char flag; 14 15 if (cur[0] != '-') return OPT_LAST; 16 for (index = 1;;) { 17 flag = cur[index]; 18 if (flag == '\0') break; 19 20 switch (flag) { 21 case 'i': opt->index = 1; break; 22 case 'p': opt->pages = 1; break; 23 case 'o': opt->out_dir = next; return OPT_SKIP; 24 case 'b': opt->base_url = next; return OPT_SKIP; 25 case 'c': opt->cache = next; return OPT_SKIP; 26 default: ERROR("Unrecognized flag: -%c." "\n\n", flag); 27 } 28 29 index++; 30 } 31 32 return OPT_GOOD; 33 } 34 35 int 36 parse_opts(Opt *opt, int argc, const char * argv[]) 37 { 38 const char * cur; 39 const char * next; 40 int index; 41 42 if (argc < 2) ERROR(""); 43 44 /* set default values */ 45 opt->index = 0; 46 opt->pages = 0; 47 opt->base_url = ""; 48 opt->out_dir = ""; 49 50 for (index = 1;;) { 51 cur = argv[index]; 52 // printf("Parsing flag group: %s" "\n", cur); 53 next = (index+1 < argc-1) ? argv[index+1] : NULL; 54 switch (parse_opt(opt, cur, next)) { 55 case OPT_SKIP: index++; break; 56 case OPT_FAIL: return OPT_FAIL; 57 case OPT_LAST: 58 opt->repo_dirs = argv + index; 59 opt->repo_count = argc - index; 60 return OPT_GOOD; 61 } 62 index++; 63 if(index >= argc) break; 64 } 65 66 ERROR("Must specify at least one repository." "\n\n"); 67 } 68