PennMUSH 1.8.3p12
authorRick L Bird <nveid@yahoo.com>
Sun, 15 May 2011 20:37:15 +0000 (16:37 -0400)
committerRick L Bird <nveid@yahoo.com>
Sun, 15 May 2011 20:37:15 +0000 (16:37 -0400)
Author: talvo@talvo.com
<talvo@talvo.com@ba372814-4f39-11de-9ad6-1127a62b9fcd>
Date:   Sat Jan 30 08:36:51 2010 +0000

    Issue 178, new 'x' option for locate() to only do exact-name matches

Fixes #209

hdrs/match.h
src/fundb.c
src/match.c

index 96a6905fe64f36fd1d94612ccc50784faacce4ee..e21a11f8fccf38efb8f65c316c08e6ce0e30d89a 100644 (file)
@@ -30,6 +30,7 @@
 #define MAT_NOISY                0x1000000
 #define MAT_LAST                 0x2000000
 #define MAT_TYPE                 0x4000000 /* don't accept objects of other types */
+#define MAT_EXACT                0x8000000 /* don't do partial name matches */
   /* groups of things to match */
 #define MAT_EVERYTHING   (MAT_ME|MAT_HERE|MAT_ABSOLUTE|MAT_PLAYER| \
                           MAT_NEIGHBOR|MAT_POSSESSION|MAT_EXIT|MAT_ENGLISH)
index b6ce0a4a32fe4c2e367c548e5251d4c92e89808e..ef6f715bd43730e08e02d505ae06ae37dfe930a5 100644 (file)
@@ -1980,6 +1980,9 @@ FUNCTION(fun_locate)
     case 'z':
       match_flags |= MAT_ENGLISH;
       break;
+    case 'x':
+      match_flags |= MAT_EXACT;
+      break;
     case 'X':
       ambig_ok = 1;             /* okay to pick last match */
       break;
@@ -1993,7 +1996,7 @@ FUNCTION(fun_locate)
   if (!pref_type)
     pref_type = NOTYPE;
 
-  if (!(match_flags & ~(MAT_CHECK_KEYS | MAT_TYPE)))
+  if (!(match_flags & ~(MAT_CHECK_KEYS | MAT_TYPE | MAT_EXACT)))
     match_flags |= MAT_EVERYTHING;
 
   /* report the results */
index 5427f6e8593b58c42021a68ee180ad0efb22bb14..e024aacfded2be858796b9651842abb0d7776640 100644 (file)
@@ -33,6 +33,7 @@
  * MAT_REMOTE_CONTENTS  - match the contents of a remote location
  * MAT_ENGLISH          - match natural english 'my 2nd flower'
  * MAT_TYPE             - match only objects of the given type(s)
+ * MAT_EXACT            - only do full-name matching, no partial names
  * MAT_EVERYTHING       - me,here,absolute,player,neighbor,possession,exit
  * MAT_NEARBY           - everything near
  * MAT_OBJECTS          - me,absolute,player,neigbor,possession
@@ -58,7 +59,7 @@
 #include "attrib.h"
 
 static int parse_english(char **name, long *flags);
-static dbref match_player(dbref who, const char *name);
+static dbref match_player(dbref who, const char *name, int partial);
 extern int check_alias(const char *command, const char *list);  /* game.c */
 static int match_aliases(dbref match, const char *name);
 static dbref choose_thing(const dbref who, const int preferred_type, long flags, dbref thing1, dbref thing2);
@@ -198,7 +199,7 @@ static dbref debugMatchTo = 1;
       } else if (match_aliases(match, name) || (!IsExit(match) && !strcasecmp(Name(match), name))) { \
         /* exact name match */ \
         MATCHED(1); \
-      } else if ((!exact || !GoodObject(bestmatch)) && !IsExit(match) && string_match(Name(match), name)) { \
+      } else if (!(flags & MAT_EXACT) && (!exact || !GoodObject(bestmatch)) && !IsExit(match) && string_match(Name(match), name)) { \
         /* partial name match */ \
         MATCHED(0); \
       } \
@@ -268,7 +269,7 @@ choose_thing(const dbref who, const int preferred_type, long flags, dbref thing1
 }
 
 static dbref
-match_player(dbref who, const char *name) {
+match_player(dbref who, const char *name, int partial) {
   dbref match;
 
   if (*name == LOOKUP_TOKEN) {
@@ -283,7 +284,7 @@ match_player(dbref who, const char *name) {
   if (match != NOTHING) {
     return match;
   }
-  return (GoodObject(who) ? visible_short_page(who, name) : NOTHING);
+  return (GoodObject(who) && partial ? visible_short_page(who, name) : NOTHING);
 }
 
 static int
@@ -346,7 +347,7 @@ match_result(dbref who, const char *xname, int type, long flags)
   if (((flags & MAT_PMATCH) ||
       ((flags & MAT_PLAYER) && *xname == LOOKUP_TOKEN)) &&
       ((type & TYPE_PLAYER) || !(flags & MAT_TYPE))) {
-    match = match_player(who, xname);
+    match = match_player(who, xname, !(flags & MAT_EXACT));
     if (GoodObject(match)) {
       if (MATCH_CONTROLS) {
         return match;