Better error messages from @alias
authorAri Johnson <ari@cobramush.org>
Sat, 3 Mar 2007 00:23:29 +0000 (00:23 +0000)
committerAri Johnson <ari@cobramush.org>
Sat, 3 Mar 2007 00:23:29 +0000 (00:23 +0000)
hdrs/attrib.h
src/attrib.c
src/predicat.c

index 2bb35e4f26d1640f08e8c36916140efca4bb5682..667718fbda938f6f3f1c7f65e2651f5db0ef8c1f 100644 (file)
@@ -132,4 +132,10 @@ safe_atr_value(ATTR *atr)
 #define AL_WLock(alist)                ((alist)->write_lock)
 #define AL_RLock(alist)                ((alist)->read_lock)
 
+/* Errors from ok_player_alias */
+#define OPAE_SUCCESS   1
+#define OPAE_INVALID   -1
+#define OPAE_TOOMANY   -2
+#define OPAE_NULL      -3
+
 #endif                         /* __ATTRIB_H */
index d530acd00164080eb67a07d42714475b8c2888f4..e348a0c26aa817a0a9536d181df6b60b0d519a16 100644 (file)
@@ -1743,16 +1743,43 @@ do_set_atr(dbref thing, const char *RESTRICT atr, const char *RESTRICT s,
     if (old) {
       /* Old alias - we're allowed to change to a different case */
       strcpy(tbuf1, atr_value(old));
-      if (s && (!*s || (strcasecmp(s, tbuf1)
-                       && !ok_player_alias(s, player, thing)))) {
-        notify_format(player, T("'%s' is not a valid alias."), s);
-        return -1;
+      if (s && !*s) {
+       notify_format(player, T("'%s' is not a valid alias."), s);
+       return -1;
+      }
+      if (s && strcasecmp(s, tbuf1)) {
+       int opae_res = ok_player_alias(s, player, thing);
+       switch (opae_res) {
+       case OPAE_INVALID:
+         notify_format(player, T("'%s' is not a valid alias."), s);
+         break;
+       case OPAE_TOOMANY:
+         notify_format(player, T("'%s' contains too many aliases."), s);
+         break;
+       case OPAE_NULL:
+         notify_format(player, T("Null aliases are not valid."));
+         break;
+       }
+       if (opae_res != OPAE_SUCCESS)
+         return -1;
       }
     } else {
       /* No old alias */
-      if (s && *s && !ok_player_alias(s, player, thing)) {
-        notify_format(player, T("'%s' is not a valid alias."), s);
-        return -1;
+      if (s && *s) {
+       int opae_res = ok_player_alias(s, player, thing);
+       switch (opae_res) {
+       case OPAE_INVALID:
+         notify_format(player, T("'%s' is not a valid alias."), s);
+         break;
+       case OPAE_TOOMANY:
+         notify_format(player, T("'%s' contains too many aliases."), s);
+         break;
+       case OPAE_NULL:
+         notify_format(player, T("Null aliases are not valid."));
+         break;
+       }
+       if (opae_res != OPAE_SUCCESS)
+         return -1;
       }
     }
   } else if (s && *s && (!strcmp(name, "FORWARDLIST")
index 66dec55d72cdf2922bef88cc230b04cbf79c2760..be72f287d799e60efe72cf28cd0a1cb01ef9362a 100644 (file)
@@ -832,6 +832,7 @@ ok_player_name(const char *name, dbref player, dbref thing)
  * \param thing player who is being aliased.
  * \retval 1 alias is valid for players.
  * \retval 0 alias is not valid for players.
+ * \return One of the OPAE_* constants defined in hdrs/attrib.h
  */
 int
 ok_player_alias(const char *alias, dbref player, dbref thing)
@@ -840,7 +841,7 @@ ok_player_alias(const char *alias, dbref player, dbref thing)
   int cnt = 0;
 
   if (!alias || !*alias)
-    return 0;
+    return OPAE_NULL;
 
   strncpy(tbuf1, alias, BUFFER_LEN - 1);
   tbuf1[BUFFER_LEN - 1] = '\0';
@@ -850,12 +851,16 @@ ok_player_alias(const char *alias, dbref player, dbref thing)
     while (sp && *sp && *sp == ' ')
       sp++;
     if (!sp || !*sp)
-      return 0;                        /* No null aliases */
+      return OPAE_NULL;                        /* No null aliases */
     if (!ok_player_name(sp, player, thing))
-      return 0;
+      return OPAE_INVALID;
     cnt++;
   }
-  return ((cnt <= MAX_ALIASES) || Director(player));
+  if (Director(player))
+    return OPAE_SUCCESS;
+  if (cnt > MAX_ALIASES)
+    return OPAE_TOOMANY;
+  return OPAE_SUCCESS;
 }