home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / misc / parsarg.c < prev    next >
C/C++ Source or Header  |  1998-06-08  |  4KB  |  147 lines

  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
  11. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  12. */
  13. /*
  14.  * $Source: f:/miner/source/misc/rcs/parsarg.c $
  15.  * $Revision: 1.1 $
  16.  * $Author: matt $
  17.  * $Date: 1993/09/09 17:32:03 $
  18.  *
  19.  * Source for parse_args() function.  See header file (parsarg.h) for info
  20.  *
  21.  * $Log: parsarg.c $
  22.  * Revision 1.1  1993/09/09  17:32:03  matt
  23.  * Initial revision
  24.  * 
  25.  *
  26.  */
  27.  
  28. #pragma off (unreferenced)
  29. static char rcsid[] = "$Id: parsarg.c 1.1 1993/09/09 17:32:03 matt Exp $";
  30. #pragma on (unreferenced)
  31.  
  32. #include <stdio.h>
  33. #include <stdlib.h>
  34. #include <string.h>
  35. #include <dos.h>
  36.  
  37. #include "parsarg.h"
  38.  
  39. #define ARGBUF_SIZE 500
  40. #define MAX_ARGS 100
  41.  
  42. char arg_buf[ARGBUF_SIZE];
  43. char *ab_ptr=arg_buf;
  44.  
  45. void perror_exit(int n,char *s)
  46. {
  47.     perror(s);
  48.     exit(n);
  49. }
  50.  
  51. void verror(char *s,void *first_arg_ptr)
  52. {
  53.     fprintf(stderr,"Error: ");
  54.     vfprintf(stderr,s,first_arg_ptr);
  55.     fprintf(stderr,"\n");
  56. }
  57.  
  58. void error_exit(int ret_code,char *s,...)
  59. {
  60.     verror(s,((char *) &s)+sizeof(s));    /* addr of next parm on stack */
  61.     exit(ret_code);
  62. }
  63.  
  64. void parse_args(int argc,char **argv,void (*handler_func)(char *arg),int flags)
  65. {
  66.  
  67.     for (;argc--;argv++) {
  68.         if (**argv=='@') {            /* read args from file */
  69.             char *arg_ptrs[MAX_ARGS];
  70.             int arg_count;
  71.             FILE *argfile;
  72.             int len;
  73.             char *p=ab_ptr,c;
  74.  
  75.             if ((argfile=fopen(*argv+1,"rt"))==0) perror_exit(10,*argv+1);
  76.             if ((len=fread(ab_ptr,1,ARGBUF_SIZE-((int) (ab_ptr-arg_buf)),argfile))==ARGBUF_SIZE-(ab_ptr-arg_buf)) error_exit(20,"Argument buffer not big enough\n");
  77.             fclose(argfile);
  78.             ab_ptr[len++]=0;        /* write terminating null */
  79.  
  80.             /* remove comments */
  81.  
  82.             while ((p=strchr(ab_ptr,';'))!=NULL) {
  83.                 char *p2=strchr(p,'\n');
  84.  
  85.                 if (p2) {     /* found cr */
  86.                     strcpy(p,p2);    /* copy over comment */
  87.                     len = strlen(ab_ptr);
  88.                 }
  89.                 else {        /* no cr, end of string */
  90.                     *p=0;
  91.                     len = (int) (p-ab_ptr);
  92.                 }
  93.             }
  94.             ab_ptr[len]=0;        /* write terminating null */
  95.  
  96.             while (!ab_ptr[len-1]) len--;    /* back up over terminating nulls */
  97.             p=ab_ptr;
  98.  
  99.  
  100.             for (arg_count=0;p<ab_ptr+len;) {
  101.                 while (p<ab_ptr+len && ((c=*p)==' ' || c=='\t' || c=='\n')) p++;
  102.                 if (p<ab_ptr+len) {    /* found parm? */
  103.                     arg_ptrs[arg_count++]=p;
  104.                     if (arg_count>=MAX_ARGS) error_exit(10,"Too many args");
  105.                     while (p<ab_ptr+len && !((c=*p)==' ' || c=='\t' || c=='\n')) p++;
  106.                     *p++=0;
  107.                 }
  108.             }
  109.             ab_ptr+=len;
  110.             parse_args(arg_count,arg_ptrs,handler_func,flags);
  111.         }
  112.         else
  113.             if (flags&PA_EXPAND && (**argv != '-')) {
  114.                 struct find_t ffblk;
  115.                 char drive[_MAX_DRIVE],dir[_MAX_DIR];
  116.                 char filename[_MAX_DRIVE+_MAX_DIR+13],*nptr;
  117.                 int done;
  118.  
  119.                 _splitpath(*argv,drive,dir,NULL,NULL);        //get path
  120.                 strcpy(filename,drive);
  121.                 strcat(filename,dir);
  122.                 nptr = filename + strlen(filename);            //point at name part
  123.  
  124.                 done = _dos_findfirst(*argv,0,&ffblk);
  125.  
  126.                 if (done) handler_func(*argv);
  127.             
  128.                 else while (!done) {
  129.  
  130.                     strcpy(nptr,ffblk.name);    //copy name after path
  131.  
  132.                     handler_func(filename);
  133.             
  134.                     done = _dos_findnext(&ffblk);
  135.             
  136.                 }
  137.     
  138.             }
  139.             else
  140.                 handler_func(*argv);
  141.  
  142.     }
  143.  
  144. }
  145.  
  146.  
  147.