Changeset 18637
- Timestamp:
- Jul 20, 2008, 3:24:49 PM (18 years ago)
- File:
-
- 1 edited
-
trunk/pstamp/src/pstamprequest.c (modified) (27 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/pstamp/src/pstamprequest.c
r18550 r18637 11 11 psString fileName; 12 12 psString requestName; 13 bool verbose; 13 14 } psrOptions; 14 15 15 char *str _columns[] = {16 char *string_columns[] = { 16 17 "ROWNUM", 17 18 "PROJECT", … … 20 21 "ID", // db id, exposure name, n/a 21 22 "CLASS_ID", 23 "FILTER", 24 "STAMP_NAME", 25 NULL 26 }; 27 char *double_columns[]= { 22 28 "CENTER_X", 23 29 "CENTER_Y", … … 25 31 "HEIGHT", 26 32 "FILTER", 27 "DATE_MIN", 28 "DATE_MAX", 29 "STAMP_NAME", 30 NULL 33 "MJD_MIN", 34 "MJD_MAX", 31 35 }; 32 36 char *u32_columns[] = { … … 36 40 }; 37 41 38 static void usage( )42 static void usage(int exitStatus) 39 43 { 40 44 psErrorStackPrint(stderr, "Unable to parse command-line arguments."); 41 exit( 1);45 exit(exitStatus); 42 46 } 43 47 … … 46 50 psMetadata *md = psMetadataAlloc(); 47 51 48 for (char **col_name = str_columns; *col_name != NULL; col_name++) { 52 // unset columns with string type default to "null" 53 for (char **col_name = string_columns; *col_name != NULL; col_name++) { 49 54 psMetadataAddStr(md, PS_LIST_TAIL, *col_name, PS_META_DEFAULT, "", "null"); 50 55 } 56 // unset columns with u32 type default to 0 51 57 for (char **col_name = u32_columns; *col_name != NULL; col_name++) { 52 58 psMetadataAddU32(md, PS_LIST_TAIL, *col_name, PS_META_DEFAULT, "", 0); 53 59 } 60 // unset columns with f64 type default to 0. 61 for (char **col_name = double_columns; *col_name != NULL; col_name++) { 62 psMetadataAddF64(md, PS_LIST_TAIL, *col_name, PS_META_DEFAULT, "", 0.0); 63 } 54 64 return md; 55 65 } … … 58 68 if (*pArgc < 2) { 59 69 fprintf(stderr, "must specify %s\n", idString); 60 usage( );70 usage(PS_EXIT_DATA_ERROR); 61 71 } 62 72 // catch common error 63 73 if (*argv[argnum] == '-') { 64 74 fprintf(stderr, "%s is not a valid %s\n", argv[argnum], idString); 65 usage( );75 usage(PS_EXIT_DATA_ERROR); 66 76 } 67 77 … … 73 83 static pstampImageType getType(int argnum, int *pArgc, char *argv[], psrOptions *options, char *paramName) 74 84 { 75 if (*pArgc < (argnum+2)) { 76 fprintf(stderr, "must specify image type and %s\n", paramName); 77 usage(); 85 if (paramName) { 86 if (*pArgc < (argnum+2)) { 87 fprintf(stderr, "must specify image type and %s\n", paramName); 88 usage(PS_EXIT_DATA_ERROR); 89 } 90 } else { 91 if (*pArgc < (argnum+1)) { 92 fprintf(stderr, "must specify image type"); 93 usage(PS_EXIT_DATA_ERROR); 94 } 78 95 } 79 96 char *type = argv[argnum]; … … 95 112 } else { 96 113 fprintf(stderr, "unknown image type %s\n", type); 97 usage( );114 usage(PS_EXIT_DATA_ERROR); 98 115 } 99 116 psMetadataAddStr (options->md, PS_LIST_TAIL, "IMG_TYPE", PS_META_REPLACE, "", type); 100 117 101 getId(paramName, argnum, pArgc, argv, options); 118 if (paramName) { 119 getId(paramName, argnum, pArgc, argv, options); 120 } 102 121 103 122 return itype; … … 141 160 } 142 161 } 143 144 static psrOptions *parseArguments(int argc, char *argv[]) 162 static void doByCoord(int argnum, int *pArgc, char *argv[], psrOptions *options) 163 { 164 switch (getType(argnum, pArgc, argv, options, NULL)) { 165 case PSTAMP_RAW: 166 getId("CLASS_ID", argnum, pArgc, argv, options); 167 break; 168 case PSTAMP_CHIP: 169 getId("CLASS_ID", argnum, pArgc, argv, options); 170 break; 171 case PSTAMP_WARP: 172 case PSTAMP_DIFF: 173 case PSTAMP_STACK: 174 break; 175 default: 176 fprintf(stderr, "programming error unexpected image type\n"); 177 exit(1); 178 } 179 } 180 181 static psrOptions *parseArguments(int argc, char *argv[], int *pExitStatus) 145 182 { 146 183 psrOptions *options = psAlloc(sizeof(psrOptions)); … … 180 217 if (argc < 2) { 181 218 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "value required for request name"); 182 usage( );219 usage(PS_EXIT_DATA_ERROR); 183 220 } 184 221 options->requestName = argv[argnum]; … … 186 223 } else { 187 224 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "req_name is required\n"); 188 usage( );225 usage(PS_EXIT_DATA_ERROR); 189 226 } 190 227 … … 193 230 if (argc < 2) { 194 231 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "project is required"); 195 usage( );232 usage(PS_EXIT_DATA_ERROR); 196 233 } 197 234 psMetadataAddStr(md, PS_LIST_TAIL, "PROJECT", PS_META_REPLACE, "", argv[argnum]); … … 199 236 } else { 200 237 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "project is required\n"); 201 usage( );202 } 203 204 // user tag will be used asthe base name for the postage stamp images238 usage(PS_EXIT_DATA_ERROR); 239 } 240 241 // if provided, stamp name tag will be appended to the base name for the postage stamp images 205 242 if ((argnum = psArgumentGet(argc, argv, "-stamp_name"))) { 206 243 psArgumentRemove(argnum, &argc, argv); 207 244 if (argc < 2) { 208 245 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "missing value for stamp_name"); 209 usage( );246 usage(PS_EXIT_DATA_ERROR); 210 247 } 211 248 psMetadataAddStr(md, PS_LIST_TAIL, "STAMP_NAME", PS_META_REPLACE, "", argv[argnum]); 212 249 psArgumentRemove(argnum, &argc, argv); 213 } else {214 // if stamp name not specified use requestName215 psMetadataAddStr(md, PS_LIST_TAIL, "STAMP_NAME", PS_META_REPLACE, "", options->requestName);216 250 } 217 251 … … 228 262 // find style & image type 229 263 if ((argnum = psArgumentGet(argc, argv, "-bycoord"))) { 230 fprintf(stderr, "-bycoord not implemented yet\n");231 exit(1);232 233 264 gotStyle = true; 234 265 psMetadataAddStr(md, PS_LIST_TAIL, "REQ_TYPE", PS_META_REPLACE, "", 1+argv[argnum]); … … 236 267 psArgumentRemove(argnum, &argc, argv); needCoord = true; 237 268 needROI = true; 238 // TODO: we need an IMG_TYPE too...269 doByCoord(argnum, &argc, argv, options); 239 270 } 240 271 … … 242 273 if (gotStyle) { 243 274 fprintf(stderr, "only one of -bycoord -byid -byexp may be specified\n"); 244 usage( 1);275 usage(PS_EXIT_DATA_ERROR); 245 276 } 246 277 gotStyle = true; … … 253 284 if (gotStyle) { 254 285 fprintf(stderr, "only one of -bycoord -byid -byexp may be specified\n"); 255 usage( 1);286 usage(PS_EXIT_DATA_ERROR); 256 287 } 257 288 gotStyle = true; … … 260 291 doByExp(argnum, &argc, argv, options); 261 292 } 262 263 293 if (!gotStyle) { 264 294 fprintf(stderr, "one of -bycoord -byid -byexp must be specified\n"); 265 usage(); 295 usage(PS_EXIT_DATA_ERROR); 296 } 297 if ((argnum = psArgumentGet(argc, argv, "-mjd_min"))) { 298 psArgumentRemove(argnum, &argc, argv); 299 if (argc < 2) { 300 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "missing value mjd_min"); 301 usage(PS_EXIT_DATA_ERROR); 302 } 303 psMetadataAddF64(md, PS_LIST_TAIL, "MJD_MIN", PS_META_REPLACE, "", atof(argv[argnum])); 304 psArgumentRemove(argnum, &argc, argv); 305 } 306 if ((argnum = psArgumentGet(argc, argv, "-mjd_max"))) { 307 psArgumentRemove(argnum, &argc, argv); 308 if (argc < 2) { 309 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "missing value mjd_max"); 310 usage(PS_EXIT_DATA_ERROR); 311 } 312 psMetadataAddF64(md, PS_LIST_TAIL, "MJD_MAX", PS_META_REPLACE, "", atof(argv[argnum])); 313 psArgumentRemove(argnum, &argc, argv); 266 314 } 267 315 … … 271 319 if (!pstampGetROI(&roiParam, &argc, argv, &gotCenter, &gotRange)) { 272 320 if (needROI) { 273 usage( );321 usage(PS_EXIT_DATA_ERROR); 274 322 } else { 275 323 psErrorClear(); … … 280 328 unsigned coord_mask = 0; 281 329 282 if (!roiParam.celestialCenter) { 330 if (roiParam.celestialCenter) { 331 psMetadataAddF64 (md, PS_LIST_TAIL, "CENTER_X", PS_META_REPLACE, "", 332 RAD_TO_DEG(roiParam.centerRA)); 333 psMetadataAddF64 (md, PS_LIST_TAIL, "CENTER_Y", PS_META_REPLACE, "", 334 RAD_TO_DEG(roiParam.centerDEC)); 335 } else { 283 336 if (needCoord) { 284 337 fprintf(stderr, "need to specify ROI in sky coordinates with -bycoord\n"); 285 usage( );338 usage(PS_EXIT_DATA_ERROR); 286 339 } 287 340 coord_mask |= PSTAMP_CENTER_IN_PIXELS; 288 } 289 psMetadataAddStr (md, PS_LIST_TAIL, "CENTER_X", PS_META_REPLACE, "", roiParam.center[0]); 290 psMetadataAddStr (md, PS_LIST_TAIL, "CENTER_Y", PS_META_REPLACE, "", roiParam.center[1]); 291 292 if (!roiParam.celestialRange) { 341 psMetadataAddF64 (md, PS_LIST_TAIL, "CENTER_X", PS_META_REPLACE, "", atof(roiParam.center[0])); 342 psMetadataAddF64 (md, PS_LIST_TAIL, "CENTER_Y", PS_META_REPLACE, "", atof(roiParam.center[1])); 343 } 344 345 if (roiParam.celestialRange) { 346 psMetadataAddF64 (md, PS_LIST_TAIL, "WIDTH", PS_META_REPLACE, "", 347 RAD_TO_DEG(atof(roiParam.range[0]))); 348 psMetadataAddF64 (md, PS_LIST_TAIL, "HEIGHT", PS_META_REPLACE, "", 349 RAD_TO_DEG(atof(roiParam.range[1]))); 350 } else { 293 351 coord_mask |= PSTAMP_RANGE_IN_PIXELS; 294 }295 psMetadataAddStr (md, PS_LIST_TAIL, "WIDTH", PS_META_REPLACE, "", roiParam.range[0]);296 psMetadataAddStr (md, PS_LIST_TAIL, "HEIGHT", PS_META_REPLACE, "", roiParam.range[1]);352 psMetadataAddF64 (md, PS_LIST_TAIL, "WIDTH", PS_META_REPLACE, "", atof(roiParam.range[0])); 353 psMetadataAddF64 (md, PS_LIST_TAIL, "HEIGHT", PS_META_REPLACE, "", atof(roiParam.range[1])); 354 } 297 355 298 356 psMetadataAddU32(md, PS_LIST_TAIL, "COORD_MASK", PS_META_REPLACE, "", coord_mask); … … 305 363 } else if (argc == 1) { 306 364 fprintf(stderr, "output file name is required\n"); 307 usage( );365 usage(PS_EXIT_DATA_ERROR); 308 366 } else { 309 367 fprintf(stderr, "too many arguments supplied:"); … … 313 371 } 314 372 fprintf(stderr, "\n"); 315 usage( );373 usage(PS_EXIT_DATA_ERROR); 316 374 } 317 375 … … 319 377 } 320 378 321 static bool writeTable(psrOptions *options )379 static bool writeTable(psrOptions *options, int *pExitStatus) 322 380 { 323 381 psFits *fitsFile = psFitsOpen(options->fileName, "w"); 324 382 if (fitsFile == NULL) { 325 383 psError(PS_ERR_IO, true, "failed to open %s for output\n", options->fileName); 384 *pExitStatus = PS_EXIT_SYS_ERROR; 326 385 return false; 327 386 } … … 336 395 if (!psFitsWriteTable(fitsFile, header, table, STAMP_REQUEST_EXTNAME)) { 337 396 psError(PS_ERR_IO, false, "failed to write fits table"); 397 *pExitStatus = PS_EXIT_SYS_ERROR; 338 398 return false; 339 399 } … … 341 401 if (! psFitsClose(fitsFile)) { 342 402 psError(PS_ERR_IO, false, "failed to close fits table"); 403 *pExitStatus = PS_EXIT_SYS_ERROR; 343 404 return false; 344 405 } … … 349 410 int main(int argc, char *argv[]) 350 411 { 351 psrOptions *options = parseArguments(argc, argv); 412 int exitStatus = 0; 413 414 // all of the action happens in parseArguments 415 psrOptions *options = parseArguments(argc, argv, &exitStatus); 352 416 353 417 if (!options) { … … 355 419 } 356 420 357 // psMetadataPrint(stderr, options->md, 0);358 359 if (writeTable(options)) {360 return 0; 361 } else{421 if (options->verbose) { 422 psMetadataPrint(stderr, options->md, 0); 423 } 424 425 if (!writeTable(options, &exitStatus)) { 362 426 psErrorStackPrint(stderr, "failed to create request table"); 363 // XXX: we should have variable status codes that indicate what the problem was 364 return 1; 365 } 366 } 427 } 428 return exitStatus; 429 }
Note:
See TracChangeset
for help on using the changeset viewer.
