IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
May 30, 2007, 5:55:54 PM (19 years ago)
Author:
jhoblitt
Message:

(experimental) change to dettool's option handling

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ippTools/src/dettoolConfig.c

    r12784 r13564  
    2222#endif
    2323
     24#include <string.h>
     25
    2426#include <psmodules.h>
    2527
    2628#include "pxtools.h"
    2729#include "dettool.h"
     30
     31#define PXTOOL_MODE(option, comment, modeval, argset) \
     32{ \
     33    if (!psMetadataAddMetadata(argSets, PS_LIST_TAIL, option, 0, comment, argset)) {;\
     34        psError(PS_ERR_UNKNOWN, false, "failed to add argset for %s", option); \
     35    } \
     36    psFree(argset); \
     37\
     38    if (!psMetadataAddU32(modes, PS_LIST_TAIL, option, 0, comment, modeval)) {;\
     39        psError(PS_ERR_UNKNOWN, false, "failed to add argset for %s", option); \
     40    } \
     41}
     42
     43static void printUsage(int argc, char **argv, psMetadata *modes)
     44{
     45    printf("Usage: %s <mode> [<options>]\n\n", argv[0]);
     46    printf("<mode>:\n");
     47
     48    psArgumentHelpSimple(stderr, modes);
     49}
     50
     51static void printUsageMode(int argc, char **argv, const char *modeName, psMetadata *argSet)
     52{
     53    printf("Usage: %s <mode> [<options>]\n\n", argv[0]);
     54    printf("%s:\n", modeName);
     55
     56    psArgumentHelpSimple(stderr, argSet);
     57}
    2858
    2959pxConfig *dettoolConfig(pxConfig *config, int argc, char **argv) {
     
    4575    psString now = psTimeToISO(time);
    4676    psFree(time);
     77
     78    psMetadata *argSets = psMetadataAlloc();
     79    psMetadata *modes = psMetadataAlloc();
    4780
    4881    // -pending
     
    780813    psFree(now);
    781814
    782 
    783 #define PXTOOL_MODE(option, modeval, argset) \
    784 { \
    785     int N = 0; \
    786     if ((N = psArgumentGet (argc, argv, option))) { \
    787         psArgumentRemove (N, &argc, argv); \
    788         if (config->mode) { \
    789             psError(PS_ERR_UNKNOWN, true, "only one mode selection is allowed"); \
    790             psFree(argset); \
    791             psFree(argSets); \
    792             psFree(config); \
    793             return NULL; \
    794         } \
    795         config->mode = modeval; \
    796         config->args = psMemIncrRefCounter(argset); \
    797     } \
    798     if (!psMetadataAddMetadata(argSets, PS_LIST_TAIL, option, 0, NULL, argset)) {;\
    799         psError(PS_ERR_UNKNOWN, false, "failed to add argset for %s", option); \
    800     } \
    801     psFree(argset); \
    802 }
    803 
    804     psMetadata *argSets = psMetadataAlloc();
    805815    // find which mode we're running under
    806     PXTOOL_MODE("-pending",         DETTOOL_MODE_PENDING,       pendingArgs);
    807     PXTOOL_MODE("-definebytag",     DETTOOL_MODE_DEFINEBYTAG,   definebytagArgs);
    808     PXTOOL_MODE("-definebyquery",   DETTOOL_MODE_DEFINEBYQUERY, definebyqueryArgs);
    809     PXTOOL_MODE("-definebydetrun",  DETTOOL_MODE_DEFINEBYDETRUN, definebydetrunArgs);
    810     PXTOOL_MODE("-raw",             DETTOOL_MODE_RAW,           rawArgs);
    811     PXTOOL_MODE("-runs",            DETTOOL_MODE_RUNS,          runsArgs);
    812     PXTOOL_MODE("-childlessrun",    DETTOOL_MODE_CHILDLESSRUN,  childlessrunArgs);
    813     PXTOOL_MODE("-input",           DETTOOL_MODE_INPUT,         inputArgs);
    814     PXTOOL_MODE("-toprocessedimfile", DETTOOL_MODE_TOPROCESSEDIMFILE, toprocessedimfileArgs);
    815     PXTOOL_MODE("-addprocessedimfile", DETTOOL_MODE_ADDPROCESSEDIMFILE,  addprocessedimfileArgs);
    816     PXTOOL_MODE("-processedimfile", DETTOOL_MODE_PROCESSEDIMFILE, processedimfileArgs);
    817     PXTOOL_MODE("-toprocessedexp",  DETTOOL_MODE_TOPROCESSEDEXP,  toprocessedexpArgs);
    818     PXTOOL_MODE("-addprocessedexp", DETTOOL_MODE_ADDPROCESSEDEXP, addprocessedexpArgs);
    819     PXTOOL_MODE("-processedexp",    DETTOOL_MODE_PROCESSEDEXP, processedexpArgs);
    820     PXTOOL_MODE("-tostacked",       DETTOOL_MODE_TOSTACKED,     tostackedArgs);
    821     PXTOOL_MODE("-addstacked",      DETTOOL_MODE_ADDSTACKED,    addstackedArgs);
    822     PXTOOL_MODE("-stacked",         DETTOOL_MODE_STACKED,       stackedArgs);
    823     PXTOOL_MODE("-tonormalize",     DETTOOL_MODE_TONORMALIZE,   tonormalizeArgs);
    824     PXTOOL_MODE("-addnormalizedstat",     DETTOOL_MODE_ADDNORMALIZEDSTAT,   addnormstatArgs);
    825     PXTOOL_MODE("-tonormalizedstat",      DETTOOL_MODE_TONORMALIZEDSTAT,    tonormstatArgs);
    826     PXTOOL_MODE("-addnormalizedimfile", DETTOOL_MODE_ADDNORMALIZEDIMFILE,addnormalizedimfileArgs);
    827     PXTOOL_MODE("-normalizedimfile",DETTOOL_MODE_NORMALIZEDIMFILE, normalizedimfileArgs);
    828     PXTOOL_MODE("-tonormalizedexp", DETTOOL_MODE_TONORMALIZEDEXP, tonormalizedexpArgs);
    829     PXTOOL_MODE("-addnormalizedexp", DETTOOL_MODE_ADDNORMALIZEDEXP, addnormalizedexpArgs);
    830     PXTOOL_MODE("-normalizedexp",   DETTOOL_MODE_NORMALIZEDEXP, normalizedexpArgs);
    831     PXTOOL_MODE("-toresidimfile",   DETTOOL_MODE_TORESIDIMFILE, toresidimfileArgs);
    832     PXTOOL_MODE("-addresidimfile",  DETTOOL_MODE_ADDRESIDIMFILE,  addresidimfileArgs);
    833     PXTOOL_MODE("-residimfile",     DETTOOL_MODE_RESIDIMFILE,    residimfileArgs);
    834     PXTOOL_MODE("-toresidexp",      DETTOOL_MODE_TORESIDEXP,    toresidexpArgs);
    835     PXTOOL_MODE("-addresidexp",     DETTOOL_MODE_ADDRESIDEXP,  addresidexpArgs);
    836     PXTOOL_MODE("-residexp",        DETTOOL_MODE_RESIDEXP,     residexpArgs);
    837     PXTOOL_MODE("-residdetrun",     DETTOOL_MODE_RESIDDETRUN,  residdetrunArgs);
    838     PXTOOL_MODE("-updateresidexp", DETTOOL_MODE_UPDATERESIDEXP,updateresidexpArgs);
    839     PXTOOL_MODE("-adddetrunsummary", DETTOOL_MODE_ADDDETRUNSUMMARY,adddetrunsummaryArgs);
    840     PXTOOL_MODE("-detrunsummary", DETTOOL_MODE_DETRUNSUMMARY,detrunsummaryArgs);
    841     PXTOOL_MODE("-updatedetrun", DETTOOL_MODE_UPDATEDETRUN, updatedetrunArgs);
    842     PXTOOL_MODE("-rerun",           DETTOOL_MODE_RERUN,         rerunArgs);
    843     PXTOOL_MODE("-register_detrend", DETTOOL_MODE_REGISTER_DETREND, register_detrendArgs);
    844     PXTOOL_MODE("-register_detrend_imfile", DETTOOL_MODE_REGISTER_DETREND_IMFILE, register_detrend_imfileArgs);
    845 
    846     bool argErr = false;
     816    PXTOOL_MODE("-pending",         "list active detruns", DETTOOL_MODE_PENDING,       pendingArgs);
     817    PXTOOL_MODE("-definebytag",     "", DETTOOL_MODE_DEFINEBYTAG,   definebytagArgs);
     818    PXTOOL_MODE("-definebyquery",   "", DETTOOL_MODE_DEFINEBYQUERY, definebyqueryArgs);
     819    PXTOOL_MODE("-definebydetrun",  "", DETTOOL_MODE_DEFINEBYDETRUN, definebydetrunArgs);
     820    PXTOOL_MODE("-raw",             "", DETTOOL_MODE_RAW,           rawArgs);
     821    PXTOOL_MODE("-runs",            "", DETTOOL_MODE_RUNS,          runsArgs);
     822    PXTOOL_MODE("-childlessrun",    "", DETTOOL_MODE_CHILDLESSRUN,  childlessrunArgs);
     823    PXTOOL_MODE("-input",           "", DETTOOL_MODE_INPUT,         inputArgs);
     824    PXTOOL_MODE("-toprocessedimfile", "", DETTOOL_MODE_TOPROCESSEDIMFILE, toprocessedimfileArgs);
     825    PXTOOL_MODE("-addprocessedimfile", "", DETTOOL_MODE_ADDPROCESSEDIMFILE,  addprocessedimfileArgs);
     826    PXTOOL_MODE("-processedimfile", "", DETTOOL_MODE_PROCESSEDIMFILE, processedimfileArgs);
     827    PXTOOL_MODE("-toprocessedexp",  "", DETTOOL_MODE_TOPROCESSEDEXP,  toprocessedexpArgs);
     828    PXTOOL_MODE("-addprocessedexp", "", DETTOOL_MODE_ADDPROCESSEDEXP, addprocessedexpArgs);
     829    PXTOOL_MODE("-processedexp",    "", DETTOOL_MODE_PROCESSEDEXP, processedexpArgs);
     830    PXTOOL_MODE("-tostacked",       "", DETTOOL_MODE_TOSTACKED,     tostackedArgs);
     831    PXTOOL_MODE("-addstacked",      "", DETTOOL_MODE_ADDSTACKED,    addstackedArgs);
     832    PXTOOL_MODE("-stacked",         "", DETTOOL_MODE_STACKED,       stackedArgs);
     833    PXTOOL_MODE("-tonormalize",     "", DETTOOL_MODE_TONORMALIZE,   tonormalizeArgs);
     834    PXTOOL_MODE("-addnormalizedstat",     "", DETTOOL_MODE_ADDNORMALIZEDSTAT,   addnormstatArgs);
     835    PXTOOL_MODE("-tonormalizedstat",      "", DETTOOL_MODE_TONORMALIZEDSTAT,    tonormstatArgs);
     836    PXTOOL_MODE("-addnormalizedimfile", "", DETTOOL_MODE_ADDNORMALIZEDIMFILE,addnormalizedimfileArgs);
     837    PXTOOL_MODE("-normalizedimfile","", DETTOOL_MODE_NORMALIZEDIMFILE, normalizedimfileArgs);
     838    PXTOOL_MODE("-tonormalizedexp", "", DETTOOL_MODE_TONORMALIZEDEXP, tonormalizedexpArgs);
     839    PXTOOL_MODE("-addnormalizedexp", "", DETTOOL_MODE_ADDNORMALIZEDEXP, addnormalizedexpArgs);
     840    PXTOOL_MODE("-normalizedexp",   "", DETTOOL_MODE_NORMALIZEDEXP, normalizedexpArgs);
     841    PXTOOL_MODE("-toresidimfile",   "", DETTOOL_MODE_TORESIDIMFILE, toresidimfileArgs);
     842    PXTOOL_MODE("-addresidimfile",  "", DETTOOL_MODE_ADDRESIDIMFILE,  addresidimfileArgs);
     843    PXTOOL_MODE("-residimfile",     "", DETTOOL_MODE_RESIDIMFILE,    residimfileArgs);
     844    PXTOOL_MODE("-toresidexp",      "", DETTOOL_MODE_TORESIDEXP,    toresidexpArgs);
     845    PXTOOL_MODE("-addresidexp",     "", DETTOOL_MODE_ADDRESIDEXP,  addresidexpArgs);
     846    PXTOOL_MODE("-residexp",        "", DETTOOL_MODE_RESIDEXP,     residexpArgs);
     847    PXTOOL_MODE("-residdetrun",     "", DETTOOL_MODE_RESIDDETRUN,  residdetrunArgs);
     848    PXTOOL_MODE("-updateresidexp", "", DETTOOL_MODE_UPDATERESIDEXP,updateresidexpArgs);
     849    PXTOOL_MODE("-adddetrunsummary", "", DETTOOL_MODE_ADDDETRUNSUMMARY,adddetrunsummaryArgs);
     850    PXTOOL_MODE("-detrunsummary", "", DETTOOL_MODE_DETRUNSUMMARY,detrunsummaryArgs);
     851    PXTOOL_MODE("-updatedetrun", "", DETTOOL_MODE_UPDATEDETRUN, updatedetrunArgs);
     852    PXTOOL_MODE("-rerun",           "", DETTOOL_MODE_RERUN,         rerunArgs);
     853    PXTOOL_MODE("-register_detrend", "", DETTOOL_MODE_REGISTER_DETREND, register_detrendArgs);
     854    PXTOOL_MODE("-register_detrend_imfile", "", DETTOOL_MODE_REGISTER_DETREND_IMFILE, register_detrend_imfileArgs);
     855
     856
     857    // figure out what mode we're running in
     858    char *modeName = NULL;
     859    psMetadataIterator *iter = psMetadataIteratorAlloc(modes, PS_LIST_HEAD, NULL);
     860    psMetadataItem *item = NULL; // Item from iterator
     861    while ((item = psMetadataGetAndIncrement(iter))) {
     862        int N = 0;
     863        if ((N = psArgumentGet(argc, argv, item->name))) {
     864            psArgumentRemove(N, &argc, argv);
     865            // check for duplicate mode specification
     866            if (config->mode) {
     867                psError(PS_ERR_UNKNOWN, true, "only one mode selection is allowed");
     868                fprintf(stderr, "only one mode selection is allowed\n");
     869                printUsage(argc, argv, modes);
     870                psFree(argSets);
     871                psFree(modes);
     872                psFree(config);
     873                return NULL;
     874            }
     875
     876            config->mode = item->data.U32;
     877            modeName = item->name;
     878
     879            bool status = false;
     880            psMetadata *argset = psMetadataLookupMetadata(&status, argSets, item->name);
     881            // make sure we can find the argSet for the sepcified mode
     882            if (!status) {
     883                psError(PS_ERR_UNKNOWN, true, "can not find arguments for mode");
     884                fprintf(stderr, "can not find arugments for mode");
     885                psFree(argSets);
     886                psFree(modes);
     887                psFree(config);
     888                return NULL;
     889            }
     890
     891            config->args = psMemIncrRefCounter(argset);
     892        }
     893
     894    }
     895
     896    psFree(iter);
     897    psFree(argSets);
     898
     899    // make sure we found a mode
    847900    if (config->mode == DETTOOL_MODE_NONE) {
    848         argErr = true;
    849         fprintf (stderr, "mode argument is required\n");
    850     } else {
    851         if (! psArgumentParse(config->args, &argc, argv)) {
    852             argErr = true;
    853             fprintf (stderr, "error parsing arguments\n");
    854         }
    855         if (argc != 1) {
    856             fprintf (stderr, "extra arguments: ");
    857             for (int i = 1; i < argc; i++) {
    858                 fprintf (stderr, "%s ", argv[i]);
    859             }
    860             fprintf (stderr, "\n");
    861             argErr = true;
    862         }
    863     }
    864 
    865     if (argErr) {
    866         printf("\nPan-STARRS Detrend Tool\n");
    867         printf("Usage: %s <mode> [<options>]\n\n", argv[0]);
    868         printf(" <mode> :\n\n");
    869 
    870         psMetadataIterator *iter = psMetadataIteratorAlloc(argSets, 0, NULL);
    871         psMetadataItem *item = NULL;
    872         while ((item = psMetadataGetAndIncrement(iter))) {
    873             if (!item->type == PS_DATA_METADATA) {
    874                 psAbort("all options must be specified as a metadata");
    875             }
    876 
    877             fprintf(stdout, "%s ", item->name);
    878             psArgumentHelp(item->data.md);
    879         }
    880         psFree(iter);
    881         psFree(argSets);
     901        psError(PS_ERR_UNKNOWN, true, "mode argument is required");
     902        fprintf(stderr, "mode argument is required\n");
     903        printUsage(argc, argv, modes);
     904
     905        psFree(modes);
    882906        psFree(config);
    883907        return NULL;
    884908    }
    885909
    886     psFree(argSets);
     910    psFree(modes);
     911
     912    // actually parse the command line
     913    if (!psArgumentParse(config->args, &argc, argv)) {
     914        psError(PS_ERR_UNKNOWN, true, "error parsing arguments");
     915        fprintf(stderr, "error parsing arguments\n");
     916        printUsageMode(argc, argv, modeName, config->args);
     917
     918        psFree(config);
     919        return NULL;
     920    }
     921
     922    // look for left overs on the command line
     923    if (argc != 1) {
     924        psError(PS_ERR_UNKNOWN, true, "extra arguments: ");
     925        fprintf(stderr, "extra arguments: ");
     926        for (int i = 1; i < argc; i++) {
     927            fprintf (stderr, "%s ", argv[i]);
     928        }
     929        fprintf(stderr, "\n");
     930        printUsageMode(argc, argv, modeName, config->args);
     931
     932        psFree(config);
     933        return NULL;
     934    }
     935
     936    // make sure that all require parameters have been specified
     937    iter = psMetadataIteratorAlloc(config->args, PS_LIST_HEAD, NULL);
     938    item = NULL; // Item from iterator
     939    while ((item = psMetadataGetAndIncrement(iter))) {
     940        if (strstr(item->comment, "require") == NULL) {
     941            continue;
     942        }
     943
     944        switch (item->type) {
     945            case PS_DATA_BOOL:
     946                psError(PS_ERR_UNKNOWN, false, "boolean type can not be required");
     947                fprintf(stderr, "boolean type can not be required\n");
     948                psFree(iter);
     949                psFree(config);
     950                return NULL;
     951                break;
     952            case PS_DATA_S8:
     953            case PS_DATA_S16:
     954            case PS_DATA_S32:
     955            case PS_DATA_S64:
     956                if (item->data.S64 != 0) {
     957                    break;
     958                }
     959                goto ARG_REQUIRED;
     960            case PS_DATA_U8:
     961            case PS_DATA_U16:
     962            case PS_DATA_U32:
     963            case PS_DATA_U64:
     964                if (item->data.U64 != 0) {
     965                    break;
     966                }
     967                goto ARG_REQUIRED;
     968            case PS_DATA_F32:
     969            case PS_DATA_F64:
     970                if (!isnan(item->data.F64)) {
     971                    break;
     972                }
     973                goto ARG_REQUIRED;
     974            case PS_DATA_STRING:
     975            case PS_DATA_METADATA:
     976                if (item->data.V) {
     977                    break;
     978                }
     979                goto ARG_REQUIRED;
     980            default:
     981                psError(PS_ERR_UNKNOWN, false, "unknown argument type");
     982                fprintf(stderr, "unknown argument type\n");
     983                psFree(iter);
     984                psFree(config);
     985                return NULL;
     986            ARG_REQUIRED:               
     987                psError(PS_ERR_UNKNOWN, false, "argument %s is required", item->name);
     988                fprintf(stderr, "argument %s is required\n", item->name);
     989                printUsageMode(argc, argv, modeName, config->args);
     990                psFree(iter);
     991                psFree(config);
     992                return NULL;
     993        }
     994
     995    }
     996    psFree(iter);
    887997
    888998    // setup search criterion
Note: See TracChangeset for help on using the changeset viewer.