30 #include <stdlib.h> |
30 #include <stdlib.h> |
31 #include <string.h> |
31 #include <string.h> |
32 |
32 |
33 #include "sopt.h" |
33 #include "sopt.h" |
34 |
34 |
|
35 #include <cx/hash_map.h> |
|
36 |
35 void cmd_args_free(CmdArgs *args) { |
37 void cmd_args_free(CmdArgs *args) { |
36 if(args) { |
38 if(args) { |
37 ucx_map_free(args->options); |
39 cxMapDestroy(args->options); |
38 free(args->argv); |
40 free(args->argv); |
39 free(args); |
41 free(args); |
40 } |
42 } |
41 } |
43 } |
42 |
44 |
|
45 static void cmd_map_put(CxMap *map, const char *key, const void *value) { |
|
46 cxMapPut(map, key, (void*)value); |
|
47 } |
|
48 |
43 CmdArgs* cmd_parse_args(int argc, char **argv) { |
49 CmdArgs* cmd_parse_args(int argc, char **argv) { |
44 CmdArgs *a = malloc(sizeof(CmdArgs)); |
50 CmdArgs *a = malloc(sizeof(CmdArgs)); |
45 a->options = ucx_map_new(16); |
51 a->options = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16); |
46 a->argv = calloc(argc, sizeof(char*)); |
52 a->argv = calloc(argc, sizeof(char*)); |
47 a->argc = 0; |
53 a->argc = 0; |
48 |
54 |
49 const char *NOARG = ""; |
55 const char *NOARG = ""; |
50 |
56 |
60 fprintf(stderr, "Unknown option -%c\n\n", arg[c]); |
66 fprintf(stderr, "Unknown option -%c\n\n", arg[c]); |
61 cmd_args_free(a); |
67 cmd_args_free(a); |
62 return NULL; |
68 return NULL; |
63 } |
69 } |
64 case 'c': { |
70 case 'c': { |
65 ucx_map_cstr_put(a->options, "conflict", NOARG); |
71 cmd_map_put(a->options, "conflict", NOARG); |
66 break; |
72 break; |
67 } |
73 } |
68 case 'l': { |
74 case 'l': { |
69 ucx_map_cstr_put(a->options, "lock", NOARG); |
75 cmd_map_put(a->options, "lock", NOARG); |
70 break; |
76 break; |
71 } |
77 } |
72 case 'd': { |
78 case 'd': { |
73 ucx_map_cstr_put(a->options, "nolock", NOARG); |
79 cmd_map_put(a->options, "nolock", NOARG); |
74 break; |
80 break; |
75 } |
81 } |
76 case 'r': { |
82 case 'r': { |
77 ucx_map_cstr_put(a->options, "remove", NOARG); |
83 cmd_map_put(a->options, "remove", NOARG); |
78 break; |
84 break; |
79 } |
85 } |
80 case 'v': { |
86 case 'v': { |
81 ucx_map_cstr_put(a->options, "verbose", NOARG); |
87 cmd_map_put(a->options, "verbose", NOARG); |
82 break; |
88 break; |
83 } |
89 } |
84 case 's': { |
90 case 's': { |
85 option = "syncdir"; |
91 option = "syncdir"; |
86 optchar = 's'; |
92 optchar = 's'; |
95 option = "version"; |
101 option = "version"; |
96 optchar = 'V'; |
102 optchar = 'V'; |
97 break; |
103 break; |
98 } |
104 } |
99 case 'R': { |
105 case 'R': { |
100 ucx_map_cstr_put(a->options, "restore-removed", NOARG); |
106 cmd_map_put(a->options, "restore-removed", NOARG); |
101 break; |
107 break; |
102 } |
108 } |
103 case 'M': { |
109 case 'M': { |
104 ucx_map_cstr_put(a->options, "restore-modified", NOARG); |
110 cmd_map_put(a->options, "restore-modified", NOARG); |
105 break; |
111 break; |
106 } |
112 } |
107 case 'S': { |
113 case 'S': { |
108 ucx_map_cstr_put(a->options, "snapshot", NOARG); |
114 cmd_map_put(a->options, "snapshot", NOARG); |
109 } |
115 } |
110 } |
116 } |
111 } |
117 } |
112 } else if(option) { |
118 } else if(option) { |
113 ucx_map_cstr_put(a->options, option, arg); |
119 cmd_map_put(a->options, option, arg); |
114 option = NULL; |
120 option = NULL; |
115 } else { |
121 } else { |
116 a->argv[a->argc++] = arg; |
122 a->argv[a->argc++] = arg; |
117 } |
123 } |
118 } |
124 } |
119 |
125 |
120 return a; |
126 return a; |
121 } |
127 } |
122 |
128 |
123 char* cmd_getoption(CmdArgs *arg, char *name) { |
129 char* cmd_getoption(CmdArgs *arg, const char *name) { |
124 return ucx_map_cstr_get(arg->options, name); |
130 return cxMapGet(arg->options, cx_hash_key_str(name)); |
125 } |
131 } |