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 / wildargs.c < prev    next >
C/C++ Source or Header  |  1992-01-18  |  3KB  |  138 lines

  1. /*
  2.  * wildargs.c - routine to expand arguments with wildcards (as UNIX shells)
  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 <stdlib.h>
  13. #include <string.h>
  14. #include "wildargs.h"
  15.  
  16. extern struct DosLibrary *DOSBase;
  17. static int wildopt = WILD_FILES | WILD_DIRS;
  18.  
  19. #define MAXPATH 100
  20. #define MAXARGS 256
  21.  
  22. #define memclear(area,size) memset(area, 0, size)
  23. #define isfile(anchor)    ((anchor)->ap_Info.fib_DirEntryType < 0)
  24. #define isdir(anchor)    ((anchor)->ap_Info.fib_DirEntryType > 0)
  25.  
  26. static int haswild (char *pattern)
  27. {
  28.  static char buffer[MAXPATH];
  29.  return (int)ParsePattern (pattern, buffer, MAXPATH);
  30. }
  31.  
  32.  
  33. static char *nextfile (char *pattern)
  34. {
  35.  long err;
  36.  char *pathname = NULL;
  37.  static struct AnchorPath *anchor = NULL;
  38.  
  39.  if (pattern == NULL)
  40.    err = -1;
  41.  else
  42.    do
  43.    {
  44.      if (anchor == NULL)
  45.      {
  46.        anchor = malloc (sizeof (struct AnchorPath) + MAXPATH);
  47.        memclear (anchor, sizeof (struct AnchorPath) + MAXPATH);
  48.  
  49.        anchor->ap_BreakBits = SIGBREAKF_CTRL_C;
  50.        anchor->ap_Strlen = MAXPATH;
  51.        anchor->ap_Flags = APF_DOWILD | APF_DODOT;
  52.  
  53.        if (!(wildopt & WILD_KEEPSTAR)  &&  strcmp (pattern, "*") == 0)
  54.          err = MatchFirst ("#?", anchor);
  55.        else
  56.          err = MatchFirst (pattern, anchor);
  57.      }
  58.      else
  59.        err = MatchNext (anchor);
  60.  
  61.      if (isfile (anchor)  &&  wildopt & WILD_FILES)
  62.        pathname = anchor->ap_Buf;
  63.      if (isdir (anchor)  &&  wildopt & WILD_DIRS)
  64.        pathname = anchor->ap_Buf;
  65.  
  66.    } while (err == 0  &&  pathname == NULL);
  67.  
  68.  if (err)
  69.  {
  70.    MatchEnd (anchor);
  71.    free (anchor);
  72.    anchor = NULL;
  73.  
  74.    return NULL;
  75.  }
  76.  else
  77.    return pathname;
  78. }
  79.  
  80.  
  81. void wildoptions (int options)
  82. {
  83.  wildopt = options;
  84. }
  85.  
  86.  
  87. int wildargs (int *oargc, char ***oargv)
  88. {
  89.  int i;
  90.  char *str;
  91.  int argc = 0;
  92.  char **argv = calloc (MAXARGS, sizeof (char *));
  93.  
  94.  if (!argv)
  95.    return FALSE;
  96.  
  97.  for (i = 0; i < *oargc; i++)
  98.  {
  99.    if (haswild ((*oargv)[i]))
  100.    {
  101.      while (str = nextfile ((*oargv)[i]))
  102.        if (argc >= MAXARGS)
  103.        {
  104.          nextfile (NULL);
  105.          return FALSE;
  106.        }
  107.        else
  108.          argv[argc++] = strdup (str);
  109.    }
  110.    else
  111.      if (argc >= MAXARGS)
  112.        return FALSE;
  113.      else
  114.        argv[argc++] = (*oargv)[i];
  115.  }
  116.  
  117.  *oargc = argc;
  118.  *oargv = argv;
  119.  
  120.  return TRUE;
  121. }
  122.  
  123.  
  124. #ifdef TEST
  125. #include <stdio.h>
  126.  
  127. void main (int argc, char *argv[])
  128. {
  129.  int i;
  130.  
  131.  if (!wildargs (&argc, &argv))
  132.    printf ("error expanding args!\n");
  133.  
  134.  for (i = 0; i < argc; i++)
  135.    printf ("%d\t%s\n", i, argv[i]);
  136. }
  137. #endif
  138.