IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
May 31, 2007, 12:44:19 PM (19 years ago)
Author:
jhoblitt
Message:

make dettoolConfig.c's option handling functions global

File:
1 edited

Legend:

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

    r13564 r13575  
    2121#include <config.h>
    2222#endif
     23
     24#include <string.h>
     25
     26#include <pslib.h>
     27#include <psmodules.h>
    2328
    2429#include "pxtools.h"
     
    5156    psFree(config->args);
    5257}
     58
     59void 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
     68void 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
     77bool 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.