new isname (fixed)

From: d. hall (dhall@sunspot.tiac.net)
Date: 12/16/95


Found a rather glaring bug in my source code, which unfortunately didn't
show up since I had an incompatibility problem with one of the internal
functions, get_number (which chops at a "period" no matter what).  I added
in a check to see if start of the string isdigit, before it does any
chopping.  The bug is that given just one argument which does NOT match the
start of any elements in namelist, would always match.  Therefore the read
[0-9] on a board would just show the board.

1. so if you add in a isdigit check in get_number:handler.c

allows
	look city.cityguard
	look death.reaper
	look small.sword
	get small.sword
	wie small.sword

2. changed str_cmp in generic_find for equipped objects to isname

allows
	rem small.sword

what follows is a condensed no comments, except for what pertains to where
I screwed up.

d.
--
#include <stdio.h>
#include <stdlib.h>

#define LOWER(c)   (((c)>='A'  && (c) <= 'Z') ? ((c)+('a'-'A')) : (c))

/* 12.15/95 dhall: attempt to incorporate "dot notation" */
/* 12.16/95 dhall: fixed one char always matching bug */

int
isname(textlist, namelist)
     char *textlist;
     char *namelist;
{
  register char *cptr, *sptr;
  char *curname;
  short active, search, string;

  active = 0;

  for (curname = textlist; *curname; curname++) {
    if (active) {
      if (*curname == '.') active = 0;
      continue;
    }
    if (*curname == '.')
      continue;
    search = 0;
    string = 1;
    cptr = curname;
    
    for (sptr = namelist; string; sptr++) {
      if (search) {
	if (*sptr == ' ')
	  search = 0;
	if (*sptr != '\0')
	  continue;
      }

      switch (*sptr) {
      case '\0': string = 0;
      case ' ':  active = 1;
	break;
      default:
	if (LOWER(*sptr) != LOWER(*cptr))
	  search = 1;
	break;
      }

      if (*cptr == '.' || *cptr == '\0') {
	if (active)
	  break;
	active = 1;
      }

      /* if active is TRUE, then only one of the two conditions was  */
      /* TRUE, therefore the substring did not match, but continue   */
      /* with inner loop until string is FALSE, also don't increment */
      /* cptr if search is TRUE                                      */

      if (active || search) {
	cptr = curname;
	active = 0;
      }
      else
	cptr++;
    }
    if (!active)
      return (0);
  }
  return (1);
}

void main ()
{
  char *nlist   = "red orange yellow green blue indigo violet";
  char *tlist[] =
  { "r",
    "re",
    "red",
    "redd",
    "red.orange",
    "RED",
    "ReD",
    "red.orangee",
    "red.orang",
    NULL,
  };
  int i;

  for (i = 0; tlist[i]; i++)
    printf ("%s = %d\n", tlist[i], isname (tlist[i], nlist));
}



This archive was generated by hypermail 2b30 : 12/07/00 PST