d98c4d2b6709f14824943a20c6509a506b26faa0
jcasper
  Thu Jun 18 16:12:51 2015 -0700
Replaced perl CGI with C CGI for writing static page menu bars

diff --git src/hg/hgMenubar/hgMenubar.c src/hg/hgMenubar/hgMenubar.c
new file mode 100644
index 0000000..318abd0
--- /dev/null
+++ src/hg/hgMenubar/hgMenubar.c
@@ -0,0 +1,65 @@
+#include "common.h"
+#include "dystring.h"
+#include "filePath.h"
+#include "linefile.h"
+
+#define CGI_NAME "cgi-bin/hgMenubar"
+
+struct dyString *navBarFilePath(char *cgiPath, char *docRoot)
+{
+struct dyString *navPath = dyStringCreate("%s", docRoot);
+// Memory leak - replaceChars returns memory that is never freed
+char *incPath = replaceChars(cgiPath, "/cgi-bin/hgMenubar", "/inc/globalNavBar.inc");
+
+dyStringAppend(navPath, incPath);
+return navPath;
+}
+
+
+void printMenuBar(char *cgiPath, char *docRoot, char *pagePath)
+{
+struct dyString *navBarLoc = navBarFilePath(cgiPath, docRoot);
+struct lineFile *menuFile = lineFileOpen(dyStringContents(navBarLoc), TRUE);
+char* oldLine = NULL;
+int lineSize = 0;
+
+char *cgiContainerPath = replaceChars(cgiPath, CGI_NAME, "");
+char *newPath = makeRelativePath(pagePath, cgiContainerPath);
+
+struct dyString *oldHref = dyStringCreate("href=\"../");
+struct dyString *newHref = dyStringCreate("href=\"%s", newPath);
+
+printf ("Content: text/html\r\n\r\n");
+
+while (lineFileNext(menuFile, &oldLine, &lineSize))
+    {
+    // Not quite as robust as perl search and replace - no variable whitespace handling
+    // Also lots of memory leakage - every line is reallocated and forgotten
+    char *newLine = replaceChars(oldLine, dyStringContents(oldHref), dyStringContents(newHref));
+    printf("%s\n", newLine);
+    }
+
+lineFileClose(&menuFile);
+}
+
+
+void parseEnvOrDie (char **cgiPath, char** docRoot, char** pagePath)
+{
+*cgiPath = getenv("SCRIPT_NAME");
+*docRoot = getenv("DOCUMENT_ROOT");
+*pagePath = getenv("DOCUMENT_URI");
+if ( (*cgiPath == NULL) || (*docRoot == NULL) || (*pagePath == NULL) )
+    {
+    fprintf (stderr, "Error: bad invocation of menubar\n");
+    exit (1);
+    }
+}
+
+int main(int argc, char *argv[])
+/* Process command line. */
+{
+char *cgiPath, *docRoot, *pagePath;
+parseEnvOrDie(&cgiPath, &docRoot, &pagePath);
+printMenuBar(cgiPath, docRoot, pagePath);
+return 0;
+}