home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum7.lzh / RICO / C / LIBSOURCE / ARGPROC / demo.c < prev    next >
C/C++ Source or Header  |  1988-09-26  |  4KB  |  119 lines

  1. /*--------------------------------------------------------------------------
  2.  Demo program for argproc().
  3.  Demonstrates boolean, string, integer, and float argument-getting.
  4.  
  5.  Just about every program written here follows the scheme shown below:
  6.     #define default values
  7.     main() {
  8.     declare all command-line-settable variables and initialize
  9.     call lose_title() to register the program name for error messages
  10.     call argproc() to parse the command line
  11.     if any mistakes, print usage message and abort
  12.     else loop over argv[] and do the real work.
  13.     }
  14. --------------------------------------------------------------------------*/
  15.  
  16. #include <stdio.h>
  17. #ifndef os9
  18. #include <string.h>
  19. #else
  20. #define    void    int
  21. #include <strings.h>
  22. #endif
  23. #include <argproc.h>
  24.  
  25. /* Default values for variables set by command line options */
  26. #define DEF_X 32
  27. #define DEF_PI 3.1445
  28. #define DEF_S "this is a test"
  29.  
  30. main(argc, argv)
  31.     int argc;
  32.     char **argv;
  33. {
  34.     /* These variables are set according to the command line */
  35.     boolean b_bool, c_bool, help_bool;
  36.     static char s_string[256] = DEF_S;
  37.     boolean s_string_given;    /* TRUE if user gave value for s_string */
  38.     int     x = DEF_X;
  39.     double  pi = DEF_PI;
  40.     char    arg_string[256];
  41.  
  42.     /* Variables */
  43.     int i;
  44.  
  45.     /* Register program name for use in error messages generated by lose() */
  46.     lose_title(argv[0]);
  47.  
  48.     /* Parse command-line options.
  49.      * - and = introduce switches with single-letter names.
  50.      * {-name...} and {=name...} introduce switches with longer names.
  51.      * Switches introduced with = set or clear a corresponding boolean 
  52.      * so you can tell if the user gave them; - is only useful for switches
  53.      * that take arguments.
  54.      *
  55.      * Switch names followed by scanf-style format specifiers separated by 
  56.      * commas, e.g. "-m%d" or "-m%d,%f" etc., indicate required arguments.
  57.      * If such a switch appears in argv[i], its arguments must also appear
  58.      * in argv[i], separated by commas.
  59.      *
  60.      * Format specifiers surrounded by square brackets, e.g. "=m[%d]", indicate 
  61.      * optional arguments; both "... -m " and "... -m546 " are accepted.
  62.      * To tell if the optional argument was given, you must either
  63.      * check to see if its value changed during the call to argproc(), or
  64.      * (yech!) check the bitmask returned by argproc.  Checking the bitmask
  65.      * is rather difficult; nowadays, I just ignore argproc's return value.
  66.      */
  67.     argproc(argc, argv, "=bc {=help} =s%s -x%d {-pi%lf} %s",
  68.         &b_bool, &c_bool, &help_bool, &s_string_given, s_string, 
  69.         &x, &pi, arg_string);
  70.  
  71.     /* If user didn't give a value for arg_string, or if she gave the
  72.      * -help switch, print a terse usage message.
  73.      * In a real program, this usage message is very helpful for the user
  74.      * who just needs a little reminder about which options do what.
  75.      */
  76.     if (!arg_string[0] || help_bool)
  77.     lose("Usage: %s file ...\n\
  78. Demonstration program for argproc().  Note that no spaces are allowed\n\
  79. between a switch and its arguments (i.e. -x3 is okay, -x 3 is not allowed).\n\
  80. Options:\n\
  81.     -help    Print this message\n\
  82.     -b       Set b_bool TRUE\n\
  83.     -c       Set c_bool TRUE\n\
  84.     -sSTRING Set string s  [default: %s]\n\
  85.     -xINT    Set integer x [default: %d]\n\
  86.     -piFLOAT Set double pi [default: %f]",
  87.     argv[0], DEF_S, DEF_X, DEF_PI);
  88.  
  89.     /* argproc() accepts options anywhere on the command line; filenames
  90.      * and switches may be freely intermixed.  (C'mon, haven't you wished you
  91.      * could type "ls *.c -l", and have it work?)
  92.      * Therefore, to handle an arbitrary number of filenames, you must
  93.      * step through argv[], and treat each string not beginning with a dash
  94.      * as a filename argument.
  95.      */
  96.     for (i=1; i<argc; i++) {
  97.     if (argv[i][0] != '-') {
  98.         /* Do something with this argument. */
  99.         do_file(argv[i], b_bool, c_bool, s_string_given, s_string, x, pi);
  100.     }
  101.     }
  102.  
  103.     exit(0);
  104. }
  105.  
  106. /* Dummy routine to do something with each file argument. */
  107.  
  108. do_file(arg, b, c, sGiven, s, x, pi)
  109.     char *arg;
  110.     boolean b, c, sGiven;
  111.     char *s;
  112.     int x;
  113.     double pi;
  114. {
  115.     (void) printf("arg=%s, b=%d, c=%d, sGiven=%d, s=%s, x=%d, pi=%f\n",
  116.     arg, b, c, sGiven, s, x, pi);
  117. }
  118.  
  119.