Changeset 48

Show
Ignore:
Timestamp:
01/10/05 14:59:48 (19 years ago)
Author:
wagi
Message:

- Added argp parsing

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/freebob/src/freebob.h

    r43 r48  
    3636} FBReturnCodes; 
    3737 
     38// Used by `main' to communicate with `parse_opt'. 
     39struct arguments 
     40{ 
     41    char* args[1];           // LISTEN_TIME 
     42    int silent, verbose; 
     43}; 
     44 
     45extern struct arguments* pMainArguments; 
     46 
    3847#endif 
  • trunk/freebob/src/main.cpp

    r14 r48  
    1919 */ 
    2020 
     21#include <argp.h> 
     22#include <stdlib.h> 
     23 
     24#include <config.h> 
    2125#include "streamprocess.h" 
     26 
     27const char *argp_program_version = PACKAGE_STRING; 
     28const char *argp_program_bug_address = PACKAGE_BUGREPORT; 
     29 
     30// Program documentation. 
     31static char doc[] = "FreeBob -- a driver for BeBob devices"; 
     32 
     33// A description of the arguments we accept. 
     34static char args_doc[] = "LISTEN_TIME"; 
     35 
     36// The options we understand. 
     37static struct argp_option options[] = { 
     38    {"verbose",  'v', 0,      0,  "Produce verbose output" }, 
     39    {"quiet",    'q', 0,      0,  "Don't produce any output" }, 
     40    {"silent",   's', 0,      OPTION_ALIAS }, 
     41    { 0 } 
     42}; 
     43 
     44// Parse a single option. 
     45static error_t 
     46parse_opt( int key, char* arg, struct argp_state* state ) 
     47{ 
     48    // Get the input argument from `argp_parse', which we 
     49    // know is a pointer to our arguments structure. 
     50    struct arguments* arguments = ( struct arguments* ) state->input; 
     51 
     52    switch (key) { 
     53    case 'q': case 's': 
     54        arguments->silent = 1; 
     55        break; 
     56    case 'v': 
     57        arguments->verbose = 1; 
     58        break; 
     59    case ARGP_KEY_ARG: 
     60        if ( state->arg_num >= 1 ) { 
     61            // Too many arguments. 
     62            argp_usage( state ); 
     63        } 
     64        arguments->args[state->arg_num] = arg; 
     65        break; 
     66    case ARGP_KEY_END: 
     67        if ( state->arg_num < 1 ) { 
     68            //  Not enough arguments. 
     69            argp_usage( state ); 
     70        } 
     71        break; 
     72    default: 
     73        return ARGP_ERR_UNKNOWN; 
     74    } 
     75    return 0; 
     76} 
     77 
     78// Our argp parser. 
     79static struct argp argp = { options, parse_opt, args_doc, doc }; 
     80 
     81struct arguments* pMainArguments; 
    2282 
    2383int 
    2484main( int argc,  char** argv ) 
    2585{ 
     86    struct arguments arguments; 
     87    pMainArguments = &arguments; 
     88 
     89    // Default values. 
     90    arguments.silent = 0; 
     91    arguments.verbose = 0; 
     92 
     93    // Parse our arguments; every option seen by `parse_opt' will 
     94    // be reflected in `arguments'. 
     95    argp_parse (&argp, argc, argv, 0, 0, &arguments); 
     96 
     97    char* tail; 
     98    int timeToListen = strtol( arguments.args[0], &tail, 0 ); 
     99    if ( errno ) { 
     100        fprintf( stderr, "LISTEN_TIME could not be parsed\n" ); 
     101        return -1; 
     102    } 
     103 
    26104    StreamProcess* pStreamProcess = new StreamProcess(); 
    27     pStreamProcess->run(); 
     105    pStreamProcess->run( timeToListen ); 
    28106    return 0; 
    29107}