home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_progs / prog_c / suplib.lzh / SUPLIB / SRC / OPTION.C < prev    next >
C/C++ Source or Header  |  1991-08-16  |  2KB  |  101 lines

  1.  
  2. /*
  3.  *  OPTION.C
  4.  *
  5.  *  ops format:     <op>[%[l][s/d/f]
  6.  */
  7.  
  8. #include <local/typedefs.h>
  9. #ifdef LATTICE
  10. #include <stdlib.h>
  11. #endif
  12.  
  13. int
  14. DoOption(ac, av, ops, args)
  15. int ac;
  16. char *av[];
  17. char *ops;
  18. long args;
  19. {
  20.     short i;
  21.     short j;
  22.  
  23.     for (i = j = 1; i < ac; ++i) {
  24.     char *ptr = av[i];
  25.     if (*ptr != '-') {
  26.         av[j++] = av[i];
  27.         continue;
  28.     }
  29.     while (*++ptr) {
  30.         char *op;
  31.         long **ap = (long **)&args;
  32.         short isshort;
  33.         for (op = ops; *op && *op != *ptr;) {
  34.         if (*op == *ptr)
  35.             break;
  36.         if (*++op == '%') {
  37.             while (*op && *op != 's' && *op != 'd')
  38.             ++op;
  39.             if (*op)
  40.             ++op;
  41.         }
  42.         if (*op == ',')
  43.             ++op;
  44.         ++ap;
  45.         }
  46.  
  47.         /*    START, REMOVING THIS SECTION GETS RID OF ERROR SO SOMETHING
  48.          *    IN THIS SECTION IS CAUSING THE CXERR
  49.          */
  50.         if (*op == 0)
  51.         return(-1);
  52.         if (op[1] != '%') {
  53.         short *stmp = (short *)*ap;
  54.         *stmp = 1;
  55.         ++ap;
  56.         continue;
  57.         }
  58.         /* END OF SECTION */
  59.  
  60.         op += 2;
  61.         isshort = 1;
  62.         while (*op && *op != 's' && *op != 'd') {
  63.         switch(*op) {
  64.         case 'h':
  65.             isshort = 1;
  66.             break;
  67.         case 'l':
  68.             isshort = 0;
  69.             break;
  70.         default:
  71.             return(-1);
  72.         }
  73.         ++op;
  74.         }
  75.         switch(*op) {
  76.         case 's':
  77.         if (ptr[1]) {
  78.             *(char **)*ap = ptr + 1;
  79.             ptr = "\0";
  80.         } else {
  81.             *(char **)*ap = av[++i];
  82.         }
  83.         break;
  84.         case 'd':
  85.         if (isshort)
  86.             *(short *)*ap = atoi(++ptr);
  87.         else
  88.             *(long *)*ap = atoi(++ptr);
  89.         while (*ptr >= '0' && *ptr <= '9')
  90.             ++ptr;
  91.         --ptr;
  92.         break;
  93.         default:
  94.         return(-1);
  95.         }
  96.     }
  97.     }
  98.     return((int)j);
  99. }
  100.  
  101.