Changeset 13575 for trunk/ippTools/src/pxconfig.c
- Timestamp:
- May 31, 2007, 12:44:19 PM (19 years ago)
- File:
-
- 1 edited
-
trunk/ippTools/src/pxconfig.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ippTools/src/pxconfig.c
r13564 r13575 21 21 #include <config.h> 22 22 #endif 23 24 #include <string.h> 25 26 #include <pslib.h> 27 #include <psmodules.h> 23 28 24 29 #include "pxtools.h" … … 51 56 psFree(config->args); 52 57 } 58 59 void pxUsage(FILE *stream, int argc, char **argv, psMetadata *modes) 60 { 61 fprintf(stream, "Usage: %s <mode> [<options>]\n\n", argv[0]); 62 fprintf(stream, "<mode>:\n"); 63 64 psArgumentHelpSimple(stream, modes); 65 } 66 67 68 void pxUsageMode(FILE *stream, int argc, char **argv, const char *modeName, psMetadata *argSet) 69 { 70 fprintf(stream, "Usage: %s <mode> [<options>]\n\n", argv[0]); 71 fprintf(stream, "%s:\n", modeName); 72 73 psArgumentHelpSimple(stream, argSet); 74 } 75 76 77 bool pxGetOptions(FILE *stream, int argc, char **argv, pxConfig *config, psMetadata *modes, psMetadata *argSets) 78 { 79 // figure out what mode we're running in 80 psMetadataIterator *iter = psMetadataIteratorAlloc(modes, PS_LIST_HEAD, NULL); 81 psMetadataItem *item = NULL; 82 while ((item = psMetadataGetAndIncrement(iter))) { 83 int N = 0; 84 if ((N = psArgumentGet(argc, argv, item->name))) { 85 psArgumentRemove(N, &argc, argv); 86 // check for duplicate mode specification 87 if (config->mode) { 88 psError(PS_ERR_UNKNOWN, true, "only one mode selection is allowed"); 89 fprintf(stream, "only one mode selection is allowed\n"); 90 pxUsage(stream, argc, argv, modes); 91 return NULL; 92 } 93 94 config->mode = item->data.U32; 95 config->modeName = psStringCopy(item->name); 96 97 bool status = false; 98 psMetadata *argset = psMetadataLookupMetadata(&status, argSets, item->name); 99 // make sure we can find the argSet for the sepcified mode 100 if (!status) { 101 psError(PS_ERR_UNKNOWN, true, "can not find arguments for mode"); 102 fprintf(stderr, "can not find arugments for mode"); 103 return NULL; 104 } 105 106 config->args = psMemIncrRefCounter(argset); 107 } 108 109 } 110 111 psFree(iter); 112 113 // make sure we found a mode 114 if (config->mode == PXTOOL_MODE_NONE) { 115 psError(PS_ERR_UNKNOWN, true, "mode argument is required"); 116 fprintf(stderr, "mode argument is required\n"); 117 pxUsage(stream, argc, argv, modes); 118 return NULL; 119 } 120 121 // actually parse the command line 122 if (!psArgumentParse(config->args, &argc, argv)) { 123 psError(PS_ERR_UNKNOWN, true, "error parsing arguments"); 124 fprintf(stderr, "error parsing arguments\n"); 125 pxUsageMode(stream, argc, argv, config->modeName, config->args); 126 return NULL; 127 } 128 129 // look for left overs on the command line 130 if (argc != 1) { 131 psError(PS_ERR_UNKNOWN, true, "extra arguments: "); 132 fprintf(stderr, "extra arguments: "); 133 for (int i = 1; i < argc; i++) { 134 fprintf (stderr, "%s ", argv[i]); 135 } 136 fprintf(stderr, "\n"); 137 pxUsageMode(stream, argc, argv, config->modeName, config->args); 138 return NULL; 139 } 140 141 // make sure that all required parameters have been specified 142 iter = psMetadataIteratorAlloc(config->args, PS_LIST_HEAD, NULL); 143 item = NULL; // Item from iterator 144 while ((item = psMetadataGetAndIncrement(iter))) { 145 if (strstr(item->comment, "require") == NULL) { 146 continue; 147 } 148 149 switch (item->type) { 150 case PS_DATA_BOOL: 151 psError(PS_ERR_UNKNOWN, false, "boolean type can not be required"); 152 fprintf(stderr, "boolean type can not be required\n"); 153 return NULL; 154 break; 155 case PS_DATA_S8: 156 case PS_DATA_S16: 157 case PS_DATA_S32: 158 case PS_DATA_S64: 159 if (item->data.S64 != 0) { 160 break; 161 } 162 goto ARG_REQUIRED; 163 case PS_DATA_U8: 164 case PS_DATA_U16: 165 case PS_DATA_U32: 166 case PS_DATA_U64: 167 if (item->data.U64 != 0) { 168 break; 169 } 170 goto ARG_REQUIRED; 171 case PS_DATA_F32: 172 case PS_DATA_F64: 173 if (!isnan(item->data.F64)) { 174 break; 175 } 176 goto ARG_REQUIRED; 177 case PS_DATA_STRING: 178 case PS_DATA_METADATA: 179 if (item->data.V) { 180 break; 181 } 182 goto ARG_REQUIRED; 183 default: 184 psError(PS_ERR_UNKNOWN, false, "unknown argument type"); 185 fprintf(stream, "unknown argument type\n"); 186 return NULL; 187 ARG_REQUIRED: 188 psError(PS_ERR_UNKNOWN, false, "argument %s is required", item->name); 189 fprintf(stream, "argument %s is required\n", item->name); 190 pxUsageMode(stream, argc, argv, config->modeName, config->args); 191 return NULL; 192 } 193 194 } 195 196 psFree(iter); 197 198 return true; 199 }
Note:
See TracChangeset
for help on using the changeset viewer.
