summaryrefslogtreecommitdiff
path: root/util/rarian-sk-get-cl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'util/rarian-sk-get-cl.cpp')
-rw-r--r--util/rarian-sk-get-cl.cpp236
1 files changed, 236 insertions, 0 deletions
diff --git a/util/rarian-sk-get-cl.cpp b/util/rarian-sk-get-cl.cpp
new file mode 100644
index 0000000..776b64c
--- /dev/null
+++ b/util/rarian-sk-get-cl.cpp
@@ -0,0 +1,236 @@
+/*
+ * rarian-sk-get-cl.cpp
+ * This file is part of Rarian
+ *
+ * Copyright (C) 2006 - Don scorgie
+ *
+ * Rarian is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rarian is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Rarian; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ */
+
+#define I_KNOW_RARIAN_0_8_IS_UNSTABLE
+#include <rarian.h>
+#include <rarian-utils.h>
+#include <tinyxml.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+static char *cat = NULL;
+static TiXmlElement *docs = NULL;
+static int id = 0;
+
+void
+print_usage (char *proc_name)
+{
+ printf ("Usage: %s <LOCALE> <CAT TREE NAME>\n", proc_name);
+ exit (0);
+}
+
+void
+get_attribute (TiXmlElement *elem)
+{
+ TiXmlAttribute* pAttrib=elem->FirstAttribute();
+ if (strcmp (pAttrib->Value(), "")) {
+ char *new_cat = NULL;
+ char *iter = NULL;
+ char *st_iter = NULL;
+ char *tmp = NULL;
+
+ cat = strdup (pAttrib->Value());
+ /* Fix category to mimic scrollkeeper */
+ new_cat = (char *) calloc (sizeof(char), strlen (cat));
+
+ st_iter = cat;
+ iter = cat;
+ while (iter && *iter) {
+ while (iter && *iter && *iter != '|') {
+ iter++;
+ }
+ tmp = rrn_strndup (st_iter, (iter-st_iter));
+ if (*new_cat) {
+ strcat (new_cat, tmp);
+ } else {
+ strcpy (new_cat, tmp);
+ }
+ free (tmp);
+ if (*iter == '|')
+ iter++;
+ else
+ break;
+ st_iter = iter;
+ }
+ elem->SetAttribute("categorycode", new_cat);
+
+ }
+}
+
+int
+get_docs (RrnReg *reg, TiXmlNode *pParent)
+{
+ if (reg->omf_location) {
+ TiXmlElement * doc = new TiXmlElement ("doc");
+ TiXmlElement * entry;
+ TiXmlElement * text;
+ char *tmp;
+
+ doc->SetAttribute ("id", id);
+ id++;
+
+ /* doctitle */
+ entry = new TiXmlElement ("doctitle");
+ entry->LinkEndChild (new TiXmlText (reg->name));
+ doc->LinkEndChild (entry);
+
+ /* docomf */
+ entry = new TiXmlElement ("docomf");
+ entry->LinkEndChild (new TiXmlText (reg->omf_location));
+ doc->LinkEndChild (entry);
+
+ /* docsource */
+ tmp = reg->uri + 7;// Remove file://
+ entry = new TiXmlElement ("docsource");
+ entry->LinkEndChild (new TiXmlText (tmp));
+ doc->LinkEndChild (entry);
+
+ /* docformat */
+ entry = new TiXmlElement ("docformat");
+ entry->LinkEndChild (new TiXmlText (reg->type));
+ doc->LinkEndChild (entry);
+
+ /* docseriesid */
+ tmp = reg->identifier + 17;// remove org.scrollkeeper.
+ entry = new TiXmlElement ("docseriesid");
+ entry->LinkEndChild (new TiXmlText (tmp));
+ doc->LinkEndChild (entry);
+ pParent->LinkEndChild (doc);
+
+ }
+
+ return 0;
+}
+
+void
+process_node (TiXmlNode *pParent)
+{
+ TiXmlNode* pChild;
+ TiXmlText* pText;
+ int t = pParent->Type();
+ int num;
+
+ switch ( t )
+ {
+ case TiXmlNode::DOCUMENT:
+ break;
+
+ case TiXmlNode::ELEMENT:
+ if (!strcmp (pParent->Value(), "sect")) {
+ get_attribute (pParent->ToElement());
+ rrn_for_each_in_category ((RrnForeachFunc) get_docs, cat, pParent);
+ free (cat);
+
+ }
+ default:
+ break;
+ }
+
+ for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling())
+ {
+ process_node ( pChild);
+ }
+}
+
+
+/* Find a suitable file to dump out output to.
+ * for now, we're always going to the same file
+ */
+char *
+find_dump_name ()
+{
+ char *filename = NULL;
+ char *user = getenv ("USERNAME");
+ char *basepath = NULL;
+ int i=0;
+ int last = 0;
+ unsigned int lasttime = 0;
+ int init = 1;
+
+ if (!user) {
+ /* if USERNAME isn't set, we use the "default" username: UNKNOWN */
+ user = strdup ("UNKNOWN");
+ }
+
+ basepath = (char *) malloc (sizeof(char) * (strlen(user) + 18 /*/tmp/scrollkeeper.*/ + 1));
+ sprintf (basepath, "/tmp/scrollkeeper-%s", user);
+ mkdir(basepath, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
+
+
+ filename = (char *) malloc (sizeof(char) * (strlen(user) + 18 /*/tmp/scrollkeeper.*/ + 10 /*contents.0*/) + 1);
+
+ for (i=0 ;i<5; i++) {
+ struct stat sbuf;
+ sprintf (filename, "/tmp/scrollkeeper-%s/contents.%d", user, i);
+ if (stat(filename,&sbuf) == -1) {
+ last = i;
+ break;
+ }
+ if (sbuf.st_mtime < lasttime || init) {
+ init = 0;
+ last = i;
+ lasttime = sbuf.st_mtime;
+ }
+ }
+ sprintf (filename, "/tmp/scrollkeeper-%s/contents.%d", user, last);
+
+ return filename;
+}
+
+int main (int argc, char * argv[])
+{
+ int skip = 0;
+
+ if (argc < 3 || argc > 4) {
+ print_usage (argv[0]);
+ }
+ if (!strcmp(argv[1], "-v")) {
+ skip = 1;
+ }
+
+ if (strcmp (argv[2+skip], "scrollkeeper_extended_cl.xml") &&
+ strcmp (argv[2+skip], "scrollkeeper_cl.xml")) {
+ print_usage (argv[0]);
+ }
+ bool loadok;
+
+ rrn_set_language (argv[1+skip]);
+
+ TiXmlDocument doc (DATADIR"/librarian/rarian-sk-cl.xml");
+ loadok = doc.LoadFile(TIXML_ENCODING_UTF8);
+
+ if (!loadok) {
+ fprintf (stderr, "ERROR: Cannot parse template file. Aborting.\n");
+ exit (2);
+ }
+
+ TiXmlNode *pParent = doc.FirstChildElement();
+
+ process_node (pParent);
+
+ char *filename = find_dump_name ();
+ doc.SaveFile(filename);
+ printf ("%s\n", filename);
+
+ exit (0);
+
+}