home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_2.iso / files / 653.lha / Wild_v2.0 / src.LZH / src / wild.c < prev    next >
C/C++ Source or Header  |  1992-01-18  |  3KB  |  147 lines

  1. /*
  2.  * wild.c - expands wildcard arguments and run command afterwards
  3.  *
  4.  * Bruno Costa - 15 Mar 91 - 19 Mar 91
  5.  *
  6.  * (Requires AmigaDOS 2.0)
  7.  */
  8.  
  9. #include <exec/types.h>
  10. #include <clib/dos_protos.h>
  11. #include <pragmas/dos_pragmas.h>
  12. #include "wildargs.h"
  13.  
  14. extern struct DosLibrary *DOSBase;
  15.  
  16. #define HUGECLUSTER 2000    /* any big number will do */
  17. #define MAXCMD 1024
  18. char cmd[MAXCMD];
  19.  
  20.  
  21. void usage (void)
  22. {
  23.  PutStr ("\x1b[1mwild\x1b[0m v2.0 - \xa9 1991 by Bruno Costa\n");
  24.  PutStr ("usage: wild [-eqfdso] [-<n>] <program> {<wildcards>} ...\n");
  25.  PutStr ("\t-e = don't do anything, just echo\n"
  26.          "\t-q = quote arguments\n"
  27.          "\t-f = just use files from wildcard expansion\n"
  28.          "\t-d = just use directories from wildcard expansion\n"
  29.          "\t-s = don't map a lonely star ('*') to '#?'\n"
  30.          "\t-o = don't assume that arguments starting with '-' are options\n"
  31.          "\t<n>= call <program> with at most <n> arguments\n");
  32.  exit (10);
  33. }
  34.  
  35.  
  36. void main (int argc, char *argv[])
  37. {
  38.  int arg, childarg, cluster = HUGECLUSTER;
  39.  int copyopt = TRUE, quote = FALSE, echo = FALSE;
  40.  int wflags = WILD_DIRS | WILD_FILES;
  41.  
  42.  if (argc < 2)
  43.    usage ();
  44.  
  45.  for (arg = 1; arg < argc  &&  argv[arg][0] == '-'; arg++)
  46.  {
  47.    int j = 0;
  48.    while (argv[arg][++j])
  49.      switch (argv[arg][j])
  50.      {
  51.        case 'e':        /* just echo */
  52.          echo = TRUE;
  53.          break;
  54.  
  55.        case 'q':        /* quote args */
  56.          quote = TRUE;
  57.          break;
  58.  
  59.        case 'o':        /* don't copy options */
  60.          copyopt = FALSE;
  61.          break;
  62.  
  63.        case 'd':        /* just expand dirs */
  64.          wflags = WILD_DIRS;
  65.          break;
  66.  
  67.        case 'f':        /* just expand files */
  68.          wflags = WILD_FILES;
  69.          break;
  70.  
  71.        case 's':        /* leave lonely stars untouched */
  72.          wflags |= WILD_KEEPSTAR;
  73.          break;
  74.  
  75.        case '0':
  76.          cluster = HUGECLUSTER;
  77.          break;
  78.        case '1':
  79.        case '2':
  80.        case '3':
  81.        case '4':
  82.        case '5':
  83.        case '6':
  84.        case '7':
  85.        case '8':
  86.        case '9':
  87.          cluster = argv[arg][j] - '0';
  88.          break;
  89.  
  90.        default:
  91.          PutStr ("wild: unknown option\n");
  92.          usage ();
  93.          break;
  94.      }
  95.  }
  96.  
  97.  wildoptions (wflags);
  98.  
  99.  if (!wildargs (&argc, &argv))
  100.  {
  101.    PutStr ("wild: error expanding arguments.\n");
  102.    exit (10);
  103.  }
  104.  
  105.  if (arg == argc)
  106.    usage ();
  107.  
  108.  childarg = arg;
  109.  
  110.  while (arg < argc)
  111.  {
  112.    int end, opt = childarg;
  113.  
  114.    strncpy (cmd, argv[opt++], MAXCMD);        /* copy command name */
  115.  
  116.    if (copyopt)
  117.      while (argv[opt][0] == '-')
  118.      {
  119.        strncat (cmd, " ", MAXCMD);
  120.        strncat (cmd, argv[opt++], MAXCMD);    /* copy options */
  121.      }
  122.  
  123.    if (arg == childarg)     /* if it is the 1st time, skip name & options */
  124.      arg = opt;
  125.  
  126.    for (end = arg + cluster; arg < end && arg < argc; arg++)
  127.    {
  128.      strncat (cmd, (quote) ? " \"" : " ", MAXCMD);
  129.      strncat (cmd, argv[arg], MAXCMD);
  130.      if (quote)
  131.        strncat (cmd, "\"", MAXCMD);
  132.    }
  133.    strncat (cmd, "\n", MAXCMD);
  134.  
  135.    if (echo)
  136.      PutStr (cmd);
  137.    else if (System (cmd, NULL))
  138.    {
  139.      PutStr ("wild: failed executing ");
  140.      PutStr (cmd);
  141.      exit (10);
  142.    }
  143.  }
  144.  
  145.  exit (0);
  146. }
  147.