/* wild.c */


/* wild card routine(s) created by Lawrence Foard */
#include "os.h"
#include "config.h"
#include "interface.h"
#include "globals.h"

char *wptr[10];
int wlen[10];
static char wbuff[BUFFER_LEN];

int wild (char *s, char *d, int p,      /* what argument are we on now? */
  int os                        /* true if just came from wild card state */
  )
{
  switch (*s) {
  case '?':                    /* match any character in d, note end of
                                 * string is considered a match */
    /* if just in nonwildcard state record location of change */
    if (!os && (p < 10))
      wptr[p] = d;
    return (wild (s + 1, (*d) ? d + 1 : d, p, 1));
  case '*':                    /* match a range of characters */
    if (!os && (p < 10)) {
      wptr[p] = d;
    }
    return (wild (s + 1, d, p, 1) || ((*d) ? wild (s, d + 1, p, 1) : 0));
  default:
    if (os && (p < 10)) {
      wlen[p] = d - wptr[p];
      p++;
    }
    return ((DOWNCASE (*s) != DOWNCASE (*d)) ? 0 :
      ((*s) ? wild (s + 1, d + 1, p, 0) : 1));
  }
}

int wild_match (char *s, char *d)
{
  int a;
  for (a = 0; a < 10; a++)
    wptr[a] = NULL;

  switch (*s) {
  case '>':
    s++;
    /* if both first letters are #'s then numeric compare */
    if ((isascii ((int)s[0]) && isdigit ((int)s[0])) || (*s == '-'))
      return (atoi (s) < atoi (d));
    else
      return (strcmp (s, d) < 0);
  case '<':
    s++;
    if ((isascii ((int)s[0]) && isdigit ((int)s[0])) || (*s == '-'))
      return (atoi (s) > atoi (d));
    else
      return (strcmp (s, d) > 0);
  default:
    if (wild (s, d, 0, 0)) {
      int b;
      char *e, *f = wbuff;
      for (a = 0; a < 10; a++)
        if (e = wptr[a]) {
          wptr[a] = f;
          for (b = wlen[a]; b--; *f++ = *e++);
          *f++ = 0;
        }
      return (1);
    } else
      return (0);
  }
}