textentries()
authorAri Johnson <ari@cobramush.org>
Fri, 23 Feb 2007 00:18:22 +0000 (00:18 +0000)
committerAri Johnson <ari@cobramush.org>
Fri, 23 Feb 2007 00:18:22 +0000 (00:18 +0000)
game/txt/hlp/cobra_func.hlp
src/function.c
src/help.c
win32/funs.h

index dd5e4c50da8a6d5bdf1e2c15128f616816804606..f82849a2266070edbb9f3b959e08d4ca9ea69361 100644 (file)
@@ -3718,12 +3718,18 @@ for an object named "Test", preferring a thing over other types.
 & TEXTFILE()
 & dynhelp()
   textfile(<type>,<entry>)
+  textentries(<type>,<entry>[,<separator>])
 
   textfile() returns the text of entries from cached text files (such as
   "help", "news", "events", etc.) All whitespace and newlines are included,
   so you may want to edit %r's and squish the result if you plan to use
   the text as a list of words rather than a display.
 
+  textentries() returns the topic names of matching entries. <entry>
+  may include wildcards, in which case a list of matching topic names
+  will be return, separated by the <separator> string if one is
+  provided, and space-separated otherwise.
+
   Examples: 
   > say textfile(help,tel\()
   You say, "  tel(<object>,<destination>)
index 8f65e4c05fbc4c91ba8a48db4789411d5d11e7b7..2188e407501d85d6cd0dad5c99b0c65657c75708 100644 (file)
@@ -634,6 +634,7 @@ FUNTAB flist[] = {
   {"TABLE", fun_table, 1, 5, FN_REG},
   {"TEL", fun_tel, 2, 4, FN_REG},
   {"TERMINFO", fun_terminfo, 1, 1, FN_REG},
+  {"TEXTENTRIES", fun_textentries, 2, 3, FN_REG},
   {"TEXTFILE", fun_textfile, 2, 2, FN_REG},
   {"TIME", fun_time, 0, 1, FN_REG},
   {"TIMEFMT", fun_timefmt, 1, 2, FN_REG},
index 200dd750f540b225beb4d27f91f1cdbe2038931f..4c0bd3ba75f98f6755552009d1266133b0959395 100644 (file)
@@ -32,7 +32,9 @@ static int help_init = 0;
 static void do_new_spitfile(dbref player, char *arg1, help_file *help_dat);
 static const char *string_spitfile(help_file *help_dat, char *arg1);
 static help_indx *help_find_entry(help_file *help_dat, const char *the_topic);
-static char *list_matching_entries(const char *pattern, help_file *help_dat);
+static char *list_matching_entries(char *pattern, help_file *help_dat,
+                                  const char *sep);
+static const char *normalize_entry(help_file *help_dat, char *arg1);
 
 static void help_build_index(help_file *h, int restricted);
 
@@ -70,7 +72,7 @@ COMMAND (cmd_helpcmd) {
 
   if (wildcard(arg_left))
     notify_format(player, T("Here are the entries which match '%s':\n%s"),
-                 arg_left, list_matching_entries(arg_left, h));
+                 arg_left, list_matching_entries(arg_left, h, ", "));
   else
     do_new_spitfile(player, arg_left, h);
 }
@@ -454,23 +456,40 @@ FUNCTION(fun_textfile)
     return;
   }
 
-  if (wildcard(args[1]))
-    safe_str(list_matching_entries(args[1], h), buff, bp);
-  else
+  if (wildcard(args[1])) {
+    const char *entries = list_matching_entries(args[1], h, ", ");
+    if (*entries)
+      safe_str(entries, buff, bp);
+    else
+      safe_str(T("No matching help topics."), buff, bp);
+  } else
     safe_str(string_spitfile(h, args[1]), buff, bp);
 }
 
+/* ARGSUSED */
+FUNCTION(fun_textentries)
+{
+  help_file *h;
+  const char *sep = " ";
+
+  h = hashfind(strupper(args[0]), &help_files);
+  if (!h) {
+    safe_str(T("#-1 NO SUCH FILE"), buff, bp);
+    return;
+  }
+  if (h->admin && !Prived(executor)) {
+    safe_str(T(e_perm), buff, bp);
+    return;
+  }
+  if (nargs > 2)
+    sep = args[2];
+  safe_str(list_matching_entries(args[1], h, sep), buff, bp);
+}
 
 static const char *
-string_spitfile(help_file *help_dat, char *arg1)
+normalize_entry(help_file *help_dat, char *arg1)
 {
-  help_indx *entry = NULL;
-  FILE *fp;
-  char line[LINE_SIZE + 1];
-  char the_topic[LINE_SIZE + 2];
-  size_t n;
-  static char buff[BUFFER_LEN];
-  char *bp;
+  static char the_topic[LINE_SIZE + 2];
 
   if (*arg1 == '\0')
     arg1 = (char *) "help";
@@ -483,12 +502,26 @@ string_spitfile(help_file *help_dat, char *arg1)
     sprintf(the_topic, "&%s", arg1);
   else
     strcpy(the_topic, arg1);
+  return the_topic;
+}
+
+static const char *
+string_spitfile(help_file *help_dat, char *arg1)
+{
+  help_indx *entry = NULL;
+  FILE *fp;
+  char line[LINE_SIZE + 1];
+  char the_topic[LINE_SIZE + 2];
+  size_t n;
+  static char buff[BUFFER_LEN];
+  char *bp;
+
+  strcpy(the_topic, normalize_entry(help_dat, arg1));
 
   if (!help_dat->indx || help_dat->entries == 0)
     return T("#-1 NO INDEX FOR FILE");
 
   entry = help_find_entry(help_dat, the_topic);
-
   if (!entry) {
     return T("#-1 NO ENTRY");
   }
@@ -514,12 +547,13 @@ string_spitfile(help_file *help_dat, char *arg1)
 
 /** Return a string with all help entries that match a pattern */
 static char *
-list_matching_entries(const char *pattern, help_file *help_dat)
+list_matching_entries(char *pattern, help_file *help_dat, const char *sep)
 {
   static char buff[BUFFER_LEN];
   int offset;
   char *bp;
   size_t n;
+  int len;
 
   bp = buff;
 
@@ -528,16 +562,34 @@ list_matching_entries(const char *pattern, help_file *help_dat)
   else
     offset = 0;
 
+  if (!wildcard(pattern)) {
+    /* Quick way out, use the other kind of matching */
+    char the_topic[LINE_SIZE + 2];
+    help_indx *entry = NULL;
+    strcpy(the_topic, normalize_entry(help_dat, pattern));
+    if (!help_dat->indx || help_dat->entries == 0)
+      return T("#-1 NO INDEX FOR FILE");
+    entry = help_find_entry(help_dat, the_topic);
+    if (!entry)
+      return (char *) "";
+    return (char *) (entry->topic + offset);
+  }
+
+  bp = buff;
+
+  if (sep)
+    len = strlen(sep);
+
   for (n = 0; n < help_dat->entries; n++)
     if (quick_wild(pattern, help_dat->indx[n].topic + offset)) {
       safe_str(help_dat->indx[n].topic + offset, buff, &bp);
-      safe_strl(", ", 2, buff, &bp);
+      if (sep)
+       safe_strl(sep, len, buff, &bp);
     }
 
   if (bp > buff)
-    *(bp - 2) = '\0';
+    *(bp - len) = '\0';
   else {
-    safe_str(T("No matching help topics."), buff, &bp);
     *bp = '\0';
   }
 
index f3ae546e080c307c136d426c9cc1404d63bc1d36..c7ef7cbc1447ea73975210aa3cbb012d57349a08 100644 (file)
@@ -333,6 +333,7 @@ FUNCTION_PROTO(fun_tagwrap);
 FUNCTION_PROTO(fun_tan);
 FUNCTION_PROTO(fun_tel);
 FUNCTION_PROTO(fun_terminfo);
+FUNCTION_PROTO(fun_textentries);
 FUNCTION_PROTO(fun_textfile);
 FUNCTION_PROTO(fun_time);
 FUNCTION_PROTO(fun_timefmt);