home *** CD-ROM | disk | FTP | other *** search
/ C++ Games Programming / CPPGAMES.ISO / thx / source / utils / cmdline.cpp next >
C/C++ Source or Header  |  1995-03-24  |  2KB  |  89 lines

  1. // ------------ cmdline.cpp
  2.  
  3. // Parse command lines for file names (no wildcards allowed
  4. // in order to preserve file sequence control)
  5. // Recognize a response file by @filename
  6. // Call a callback function for each name parsed
  7.  
  8. #include <iostream.h>
  9. #include <fstream.h>
  10. #include <stdlib.h>
  11. #include <dir.h>
  12. #include <io.h>
  13. #include <string.h>
  14.  
  15. int checkfile(char *fname)
  16. {
  17.     if (access(fname, 0) != 0)    {
  18.         cerr << "\nNo such file as " << fname;
  19.         return 0;
  20.     }
  21.     return 1;
  22. }
  23.  
  24. int process_responsefile(char *rfname, void (*func)(char*))
  25. {
  26.     if (!checkfile(rfname))
  27.         return 0;
  28.     ifstream list(rfname);
  29.     char fname[MAXPATH];
  30.     while (!list.eof())    {
  31.         list.getline(fname,MAXPATH);
  32.         if (*fname)    {
  33.             if (!checkfile(fname))
  34.                 return 0;
  35.             (*func)(fname);
  36.         }
  37.     }
  38.     return 1;
  39. }
  40.  
  41. int parse_cmdline(int argc, char *argv[], void (*func)(char*))
  42. {
  43.     int n = 0;
  44.     while (argc--)    {
  45.         if (*argv[n] == '@')    {
  46.             if (!process_responsefile(argv[n]+1, func))
  47.                 return 0;
  48.         }
  49.         else    {
  50.             char path[MAXPATH];
  51.             char drive[MAXDRIVE];
  52.             char dir[MAXDIR];
  53.             _splitpath(argv[n], drive, dir, 0, 0);
  54.             _makepath(path, drive, dir, 0, 0);
  55.             char *cp = path+strlen(path);
  56.  
  57.             ffblk ff;
  58.             int ax = findfirst(argv[n], &ff, 0);
  59.             if (ax == -1)
  60.                 return 0;
  61.             do    {
  62.                 strcpy(cp, ff.ff_name);
  63.                 (*func)(path);
  64.                 ax = findnext(&ff);
  65.             } while (ax != -1);
  66.         }
  67.         n++;
  68.     }
  69.     return 1;
  70. }
  71.  
  72. #ifdef TESTING
  73. // ----------- stub
  74. void callback(char *fname)
  75. {
  76.     cout << "Processing " << fname << endl;
  77. }
  78.  
  79. int main(int argc, char *argv[])
  80. {
  81.     if (argc > 1)    {
  82.         cout << "1st parameter = " << argv[1] << endl;
  83.         parse_cmdline(argc-2, argv+2, callback);
  84.     }
  85.     return 0;
  86. }
  87. #endif
  88.  
  89.