home *** CD-ROM | disk | FTP | other *** search
/ Dream 57 / Amiga_Dream_57.iso / Amiga / Programmation / c / Exemples / 10Lignes / AMCSourcesV2.lha / AMCSources2 / FFT / ARGS.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-07-18  |  3.7 KB  |  183 lines

  1. /*
  2.     args - handle command line arguments
  3.  
  4.     The calling program must supply the following two items...
  5. */
  6. extern int get_parameter();
  7. extern char *message[];
  8.  
  9. #include <stdio.h>
  10.  
  11. #define streq(a, b) (strcmp(a, b) == 0)
  12.  
  13. extern double atof();
  14. /* prototypes */
  15.  
  16. static int help();
  17. //static int gripe_arg(char *s);
  18. static int numeric(char *s);
  19. /*---------------------------------------------------------------*/
  20. /*    write out the command line */
  21. fprint_cmd(FILE *fp,char *format)
  22.  
  23. {    char buf[129];
  24.     int i=0;
  25. #ifdef __DESMET__
  26.     _lmove(129, 130, _showcs()-0x10, &buf, _showds());
  27.     buf[128]=13;
  28.     while(buf[i] != 13) i++;
  29.     buf[i]=0;
  30. #else /* not __DESMET__ */
  31. #ifdef __TURBOC__
  32.     extern int _argc;
  33.     extern char **_argv;
  34.     buf[0] = 0;
  35.     for (i = 1; i < _argc; i++) {strcat(buf, _argv[i]); strcat(buf, " ");}
  36. #else /* not __TURBOC__ */
  37.     buf[0] = 0;
  38. #endif /* not __TURBOC__ */
  39. #endif /* not __DESMET__ */
  40.  
  41.     fprintf(fp, format, buf);
  42.    return;
  43. }
  44.  
  45. /*  parse command line switches */
  46. args(int argc,char **argv )
  47. {    char **av;
  48.     int ac, i;
  49.     argc--; argv++;
  50.     ac=argc; av=argv; argc=0;
  51.     while(ac>0)
  52.         {if(**av=='?') help();
  53.         else if(**av=='-' && (i=get_parameter( ac, av )) && i > 0)
  54.             {ac-=i; av+=i;
  55.             }
  56.         else {argv[argc++] = *av++; ac--;}
  57.         }
  58.     return argc+1;
  59. }
  60.  
  61. /*
  62.     get one or more double values from command line.
  63.  
  64.     note variable number of arguments...  
  65.                                 get_double(argc, argv, 3, &a, &b, &c)
  66. */
  67. int get_double(int argc,char **argv,int permitted,double *a)    /* returns # arguments used */
  68.                                      /* # argument strings left */
  69.                                  /* ptr to string array */
  70.                                  /* # pointers following */
  71.                                     /* the first of the pointers */
  72. {    int i=1;
  73.     double **dp = &a;
  74.  
  75.     while((permitted--)>0 && (argc>i) && numeric(argv[i])) 
  76.         {**dp = atof(argv[i++]); 
  77.         dp++;
  78.         }
  79.     return i;
  80. }
  81.  
  82. gripe_arg(char *s)
  83. {    fprintf(stderr, "argument missing for switch %s", s);
  84.     help();
  85. return;
  86. }
  87.  
  88. gripe(char **argv)
  89. {    fprintf(stderr, *argv); fprintf(stderr, " isn\'t a legal argument \n\n");
  90.     help();
  91. return;
  92. }
  93.  
  94. numeric(char *s)
  95. {    char c;
  96.     while(c=*s++)
  97.         {if((c <= '9' && c >= '0') || 
  98.                         c == '+' || 
  99.                         c == '-' || 
  100.                         c == '.' || 
  101.                         c == 'e' || 
  102.                         c == 'E') continue;
  103.         return 0;
  104.         }
  105.     return 1;
  106. }
  107.  
  108. help()
  109. {    char **sp;
  110.  
  111.     for (sp = message; *sp; sp++) printf(*sp);
  112.     exit(0);
  113. return;
  114. }
  115.  
  116. #ifdef MAIN
  117.  
  118. double f1, f2, f3;
  119. int debugging = 0;
  120.  
  121. /* get_parameter - process one command line option
  122.         (return # parameters used) */
  123. int get_parameter(argc, argv) 
  124. int argc;             /* # valid entries in argv[] */
  125. char **argv;        /* pointer to array of pointers to argument strings */
  126. {
  127.     int i;
  128.  
  129.     if(streq(*argv, "-d")) {debugging = 1; return 1;}
  130.     else if(streq(*argv, "-f1")) 
  131.         {i = get_double(argc, argv, 1, &f1, &f2, &f3); 
  132.         return i;
  133.         }
  134.     else if(streq(*argv, "-f2")) 
  135.         {i = get_double(argc, argv, 2, &f1, &f2, &f3); 
  136.         return i;
  137.         }
  138.     else if(streq(*argv, "-f3")) 
  139.         {i = get_double(argc, argv, 3, &f1, &f2, &f3); 
  140.         return i;
  141.         }
  142.  
  143.     else gripe(argv);
  144. }
  145.  
  146.  
  147. char *message[]=
  148. {
  149. " - calculate ASAT engagements\n",
  150. "usage:  asat  [options]\n",
  151. "options:\n",
  152. "     -a <num>   target satellite altitude (km, default 400)\n",
  153. "     -i <num>   target satellite inclination (degrees, default 65)\n",
  154. "     -la <num>  ASAT site latitude (degrees, default 9)\n",
  155. "     -r         print radar horizon only\n",
  156. "     -v <num>   ASAT axial delta velocity (km/sec, default 4)\n",
  157. "     -n         northbound satellite\n",
  158. "     -vl        visibility limit\n",
  159. "     -el        energy limit (default)\n",
  160. "     -tl        timing limit\n",
  161. "     -td        delay time (sec, default 30)\n",
  162.  
  163. 0
  164. };
  165.  
  166. main(argc, argv) int argc; char **argv;
  167. {    int i;
  168.  
  169.     fprint_cmd(stdout, "; args %s\n");
  170.  
  171.     argc = args(argc, argv);
  172.  
  173.     printf("f1 = %f  f2 = %f  f3 = %f\n", f1, f2, f3);
  174.  
  175.     printf("argv = ");
  176.     for (i = 0; i < argc; i++) printf(" \"%s\"", argv[i]);
  177.  
  178. }
  179.  
  180.  
  181. #endif /* MAIN */
  182.  
  183.