diff anagram/guisupport/help.cpp @ 0:13d2b8934445

Import AnaGram (near-)release tree into Mercurial.
author David A. Holland
date Sat, 22 Dec 2007 17:52:45 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/anagram/guisupport/help.cpp	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,130 @@
+/*
+ * AnaGram, A System for Syntax Directed Programming
+ * Copyright 2006 David A. Holland. All Rights Reserved.
+ * See the file COPYING for license and usage terms.
+ *
+ * help.cpp - help data.
+ *
+ * This file obsoletes the external AnaGram.hlp file found
+ * in older versions of AnaGram.
+ */
+
+#include "port.h" // for OPTLINK
+
+#include "agstring.h"
+#include "assert.h"
+#include "help.h"
+
+//#define INCLUDE_LOGGING
+#include "log.h"
+
+
+#include "helpdata.h"
+
+
+static const HelpTopic empty_topic = {
+  "Secret of Life",
+  "No help message for this topic."
+};
+
+const char *helptopic_gettitle(const HelpTopic *ht) {
+  return ht->title;
+}
+
+const char *helptopic_gettext(const HelpTopic *ht) {
+  return ht->body;
+}
+
+////////////////////////////////////////////////////////////
+
+static int OPTLINK helptable_sort(const void *ventrya, const void *ventryb) {
+  const helpentry *entrya = (const helpentry *)ventrya;
+  const helpentry *entryb = (const helpentry *)ventryb;
+  return stricmp(entrya->topic, entryb->topic);
+}
+
+static int OPTLINK helptable_search(const void *vkey, const void *ventryb) {
+  const char *key = (const char *)vkey;
+  const helpentry *entryb = (const helpentry *)ventryb;
+  return stricmp(key, entryb->topic);
+}
+
+static int OPTLINK topiclist_sort(const void *ventrya, const void *ventryb) {
+  const char *const *entrya = (const char *const *)ventrya;
+  const char *const *entryb = (const char *const *)ventryb;
+  return stricmp(*entrya, *entryb);
+}
+
+void help_init(void) {
+  LOGSECTION("help_init");
+  qsort(helptable, helptablenum, sizeof(helptable[0]), helptable_sort);
+  qsort(topiclist, numtopiclist, sizeof(topiclist[0]), topiclist_sort);
+}
+
+static const HelpTopic *try_help_topic(const char *topic) {
+  LOGSECTION("help_get");
+  const void *ventry;
+  const helpentry *entry;
+  ventry = bsearch(topic, helptable, helptablenum, sizeof(helptable[0]),
+		   helptable_search);
+  if (!ventry) {
+    //fprintf(stderr, "warning: help topic <%s> not found\n", topic);
+    return NULL;
+  }
+  entry = (const helpentry *)ventry;
+  return entry->data;
+}
+
+////////////////////////////////////////////////////////////
+
+const HelpTopic *help_topic(const char *title) {
+  const HelpTopic *ht;
+
+  ht = try_help_topic(title);
+  if (ht) {
+    return ht;
+  }
+
+  AgString titlecopy = title;
+  size_t len = titlecopy.size();
+  if (len > 0 && titlecopy[len-1] == 's') {
+    titlecopy[len-1] = 0;
+    ht = try_help_topic(titlecopy.pointer());
+    if (ht) {
+      return ht;
+    }
+  }
+
+  // The old help code used to do this. But the new help compiler
+  // checks crossreferences (up to trailing 's') so it can't be
+  // triggered.
+#if 0
+  char *t = titlecopy.pointer();
+  while (len) {
+    while (len && t[len] != ' ') len--;
+    while (len && (t[len] == ' ' || ispunct(t[len]))) len--;
+    t[len+1] = 0;
+    ht = try_help_topic(t);
+    if (ht) {
+      return ht;
+    }
+  }
+#endif
+
+  return &empty_topic;
+}
+
+int help_topicexists(const char *title) {
+  // This is *not* supposed to check alternate spellings.
+  const HelpTopic *ht = try_help_topic(title);
+  return ht != NULL;
+}
+
+unsigned helpindex_num(void) {
+  return numtopiclist;
+}
+
+const char *helpindex_get(unsigned ix) {
+  assert(ix < numtopiclist);
+  return topiclist[ix];
+}