@attrib/access no longer treats unmatched flag names as a set of flag characters
authorAri Johnson <ari@cobramush.org>
Fri, 23 Feb 2007 02:45:04 +0000 (02:45 +0000)
committerAri Johnson <ari@cobramush.org>
Fri, 23 Feb 2007 02:45:04 +0000 (02:45 +0000)
game/txt/hlp/cobra_cmd.hlp
hdrs/privtab.h
src/atr_tab.c
src/privtab.c

index e2ecb4f071d764d2c8857bdbb7abd91b623a8d9f..85c27978e3f1e4ddab0d0bb488627eddd1d9280e 100644 (file)
@@ -392,7 +392,7 @@ See also: @success, @osuccess, get, @lock, EXITS, ACTION LISTS
   Used without switches, @attribute shows info about a standard attrib.
 
   @attribute/access adds a new standard attribute into the table,
-  associating it with the given space-separated list of flags.
+  associating it with the given space-separated list of full flag names.
   See 'help @set' for possible flags. A flag list of "none" removes
   all flag associations.
   If the /retroactive switch is added, the flags are assigned to every copy
index 6d0f9af6f18154d4d7a5e02c921e35ac22bc883c..8532cf8c067a2d5d2ce9d3c39e856228f0d61742 100644 (file)
@@ -28,6 +28,7 @@ struct priv_info {
 #define PrivShowBits(x) ((x)->bits_to_show)
 
 extern int string_to_privs(PRIV *table, const char *str, long int origprivs);
+extern int list_to_privs(PRIV *table, const char *str, long int origprivs);
 extern int string_to_privsets(PRIV *table, const char *str, int *setprivs,
                              int *clrprivs);
 extern int letter_to_privs(PRIV *table, const char *str, long int origprivs);
index 0a33fb4ae78a6ac61e647aa1efdd987e9e528b05..75ff246da95c85d00ef2b69657ba02ac451da4ad 100644 (file)
@@ -290,7 +290,7 @@ do_attribute_access(dbref player, char *name, char *perms, int retroactive)
     return;
   }
   if (strcasecmp(perms, "none")) {
-    flags = string_to_privs(attr_privs_set, perms, 0);
+    flags = list_to_privs(attr_privs_set, perms, 0);
     if (!flags) {
       notify(player, T("I don't understand those permissions."));
       return;
index c85af226265e303931e1bc8c4a9db0988c7df0c5..3e42ccf766f71a6da22da451690c95d44e3cb131 100644 (file)
@@ -22,7 +22,9 @@
 /** Convert a string to a set of privilege bits, masked by an original set.
  * Given a privs table, a string, and an original set of privileges,
  * return a modified set of privileges by applying the privs in the
- * string to the original set of privileges.
+ * string to the original set of privileges. IF A SINGLE WORD STRING
+ * IS GIVEN AND IT ISN'T THE NAME OF A PRIV, PARSE IT AS INDIVIDUAL
+ * PRIV CHARS.
  * \param table pointer to a privtab.
  * \param str a space-separated string of privilege names to apply.
  * \param origprivs the original privileges.
@@ -83,6 +85,53 @@ string_to_privs(PRIV *table, const char *str, long int origprivs)
   return ((origprivs | yes) & ~no);
 }
 
+/** Convert a list to a set of privilege bits, masked by an original set.
+ * Given a privs table, a list, and an original set of privileges,
+ * return a modified set of privileges by applying the privs in the
+ * string to the original set of privileges. No prefix-matching is
+ * permitted in this list. 
+ * \param table pointer to a privtab.
+ * \param str a space-separated string of privilege names to apply.
+ * \param origprivs the original privileges.
+ * \return a privilege bitmask.
+ */
+int
+list_to_privs(PRIV *table, const char *str, long int origprivs)
+{ 
+  PRIV *c; 
+  long int yes = 0;
+  long int no = 0;
+  char *p, *r;
+  char tbuf1[BUFFER_LEN];
+  int not;
+  int words = 0;
+
+  if (!str || !*str)
+    return origprivs;
+  strcpy(tbuf1, str);
+  r = trim_space_sep(tbuf1, ' ');
+  while ((p = split_token(&r, ' '))) {
+    words++;
+    not = 0;
+    if (*p == '!') {
+      not = 1;
+      if (!*++p)
+       continue;
+    }
+    for (c = table; c->name; c++) {
+      if (!strcasecmp(c->name, p)) {
+       if (not)
+         no |= c->bits_to_set;
+       else
+         yes |= c->bits_to_set;
+       break;
+      }
+    }
+  }
+  return ((origprivs | yes) & ~no);
+}
+
+
 /** Convert a string to 2 sets of privilege bits, privs to set and
  * privs to clear.
  * \param table pointer to a privtab.