Imported PennMUSH NextDbref and Unique functions
authornveid <nveid@cobramush.org>
Thu, 5 Apr 2007 17:15:57 +0000 (17:15 +0000)
committerAri Johnson <ari@theari.com>
Thu, 24 Mar 2011 15:58:45 +0000 (15:58 +0000)
(cherry picked from commit ae2dc871c4b9521bb610ceb54492fd954f18bd33)

game/txt/changes/0.73
game/txt/hlp/cobra_func.hlp
src/function.c
src/fundb.c
src/funlist.c
win32/funs.h

index b49e9f5d763a68c3fe963ef34a334f06b9b60934..35ff9fa27330d3174d87a0c48a617f40375c0ff4 100644 (file)
@@ -175,4 +175,6 @@ CobraMUSH Version 0.73
    * SQL support is now reported via @config compile. [RLB]
    * Player aliases may now be supplied to @pemit/list. [RLB]
    * Width() and height() take optional second argument for defaults. [RLB]
+   * Unique() removes contiguous duplicates in lists. [RLB]
+   * NextDbref() now returns the next object to be created. [RLB]
 
index ca03a3d8227fad16e91a7e197d9b460508b14454..a9af65fe964ba9b231951c341c09dc3e01421f69 100644 (file)
@@ -2599,6 +2599,14 @@ for an object named "Test", preferring a thing over other types.
   apply to exits, as well.
 
   See also: lcon(), lexits(), con(), exit()
+
+& NEXTDBREF()
+  nextdbref()
+
+  This function returns the next dbref on the free list; when the next
+  object is @created (or @dug, or @opened, or @pcreated, etc.), it
+  will have this dbref.
+
 & NOR()
   nor(<boolean>, <boolean>,...)
 
@@ -4123,7 +4131,25 @@ for an object named "Test", preferring a thing over other types.
   value of %q0 to its original "are delicious!"
  
   See also: u(), setq(), r()
+
+ & UNIQUE()
+  unique(<list>[, <sort type>[,<sep>[, <osep>]]])
+
+  unique() returns a copy of <list> with consecutive duplicate items
+  removed. It does not sort the list. The optional <sort type> describes
+  what type of data is in the list; see 'help sorting' for details. If
+  no type is given, the elements are compared as strings. The optional
+  third and fourth arguments are the list delimiter and output seperator.
+
+  Examples:
+  > think unique(a b b c b)
+    a b c b
+  > think unique(1 2 2.0 3, f)
+    1 2 3
+  > think unique(1|2|3|3, n, |, _)
+    1_2_3
+
+
 & V()
 & V-FUNCTION
   V(<name of attribute>)
index 4b988172b196f8ad737d31443e4a6c1b3cdadbc1..5f1fee0d2b7758cb083ead0a34867d18c4b5e008 100644 (file)
@@ -511,6 +511,7 @@ FUNTAB flist[] = {
   {"NEARBY", fun_nearby, 2, 2, FN_REG},
   {"NEQ", fun_neq, 2, 2, FN_REG},
   {"NEXT", fun_next, 1, 1, FN_REG},
+  {"NEXTDBREF", fun_nextdbref, 0, 0, FN_REG},
   {"NLSEARCH", fun_lsearch, 1, INT_MAX, FN_REG},
   {"NOR", fun_nor, 1, INT_MAX, FN_REG},
   {"NOT", fun_not, 1, 1, FN_REG},
@@ -662,6 +663,7 @@ FUNTAB flist[] = {
   {"UFUN", fun_ufun, 1, 11, FN_REG},
   {"ULDEFAULT", fun_uldefault, 1, 12, FN_NOPARSE},
   {"ULOCAL", fun_ulocal, 1, 11, FN_REG},
+  {"UNIQUE", fun_unique, 1, 4, FN_REG},
   {"IDLE_TIMES", fun_idle_times, 1, 1, FN_REG},
   {"UTCTIME", fun_time, 0, 0, FN_REG},
   {"U", fun_ufun, 1, 11, FN_REG},
index 2f2a174b2d435c3a84138813b73f60d153d6bab0..0bec8f9a7c91fff1708946f1a8ee4f792b73f8dc 100644 (file)
@@ -476,6 +476,16 @@ FUNCTION(fun_lflags)
 #pragma warning( default : 4761)       /* Re-enable conversion warning */
 #endif
 
+/* ARGSUSED */
+FUNCTION(fun_nextdbref)
+{
+  if (first_free != NOTHING) {
+    safe_dbref(first_free, buff, bp);
+  } else {
+    safe_dbref(db_top, buff, bp);
+  }
+}
+
 /* ARGSUSED */
 FUNCTION(fun_num)
 {
index 9ae1e5f5f490515090ef128d8d254eb5110a383a..7e286a9d4b904f80de9e600b7722300cc0f34764 100644 (file)
@@ -1651,6 +1651,71 @@ FUNCTION(fun_setdiff)
 
 #define CACHE_SIZE 8  /**< Maximum size of the lnum cache */
 
+FUNCTION(fun_unique)
+{
+  char sep;
+  char **a1, **a2;
+  int n1, x1, x2;
+  char *sort_type = ALPHANUM_LIST;
+  int osepl = 0;
+  char *osep = NULL, osepd[2] = { '\0', '\0' };
+
+  /* if no lists, then no work */
+  if (!*args[0])
+    return;
+
+  if (!delim_check(buff, bp, nargs, args, 3, &sep))
+    return;
+
+  a1 = (char **) mush_malloc(MAX_SORTSIZE * sizeof(char *), "ptrarray");
+
+  if (!a1)
+    mush_panic("Unable to allocate memory in fun_unique");
+
+  /* make array out of the list */
+  n1 = list2arr(a1, MAX_SORTSIZE, args[0], sep);
+
+  a2 = mush_malloc(n1 * sizeof(char *), "ptrarray");
+  if (!a2)
+    mush_panic("Unable to allocate memory in fun_unique");
+
+  if (nargs >= 2)
+    sort_type = get_list_type_noauto(args, nargs, 2);
+
+  if (sort_type == UNKNOWN_LIST)
+    sort_type = ALPHANUM_LIST;
+
+  if (nargs < 4) {
+    osepd[0] = sep;
+    osep = osepd;
+    if (sep)
+      osepl = 1;
+  } else if (nargs == 4) {
+    osep = args[3];
+    osepl = arglens[3];
+  }
+
+
+  a2[0] = a1[0];
+  for (x1 = x2 = 1; x1 < n1; x1++) {
+    if (gencomp(executor, a1[x1], a2[x2 - 1], sort_type) == 0)
+      continue;
+    a2[x2] = a1[x1];
+    x2++;
+  }
+
+  for (x1 = 0; x1 < x2; x1++) {
+    if (x1 > 0)
+      safe_strl(osep, osepl, buff, bp);
+    safe_str(a2[x1], buff, bp);
+  }
+
+  mush_free(a1, "ptrarray");
+  mush_free(a2, "ptrarray");
+
+}
+
+
 /* ARGSUSED */
 FUNCTION(fun_lnum)
 {
index cbb92fb903b740273969fb17a63a9bb352f7b49f..214306747651283509cb1d56ae17c091c8472bc2 100644 (file)
@@ -221,6 +221,7 @@ FUNCTION_PROTO(fun_nattr);
 FUNCTION_PROTO(fun_nearby);
 FUNCTION_PROTO(fun_neq);
 FUNCTION_PROTO(fun_next);
+FUNCTION_PROTO(fun_nextdbref);
 FUNCTION_PROTO(fun_nor);
 FUNCTION_PROTO(fun_not);
 FUNCTION_PROTO(fun_null);
@@ -351,6 +352,7 @@ FUNCTION_PROTO(fun_ucstr);
 FUNCTION_PROTO(fun_ufun);
 FUNCTION_PROTO(fun_uldefault);
 FUNCTION_PROTO(fun_ulocal);
+FUNCTION_PROTO(fun_unique);
 FUNCTION_PROTO(fun_updiv);
 FUNCTION_PROTO(fun_v);
 FUNCTION_PROTO(fun_vadd);