summaryrefslogtreecommitdiff
path: root/utilities/addgb.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utilities/addgb.cpp')
-rw-r--r--utilities/addgb.cpp148
1 files changed, 148 insertions, 0 deletions
diff --git a/utilities/addgb.cpp b/utilities/addgb.cpp
new file mode 100644
index 0000000..5925ae0
--- /dev/null
+++ b/utilities/addgb.cpp
@@ -0,0 +1,148 @@
+#include <ctype.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#ifndef __GNUC__
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+#include <entriesblk.h>
+#include <iostream.h>
+#include <string>
+#include <stdio.h>
+#include <treekeyidx.h>
+#include <rawgenbook.h>
+
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
+void printTree(TreeKeyIdx treeKey, TreeKeyIdx *target = 0, int level = 1) {
+ if (!target)
+ target = &treeKey;
+
+ unsigned long currentOffset = target->getOffset();
+ cout << ((currentOffset == treeKey.getOffset()) ? "==>" : "");
+ for (int i = 0; i < level; i++) cout << "\t";
+ cout << treeKey.getLocalName() << "/\n";
+ if (treeKey.firstChild()) {
+ printTree(treeKey, target, level+1);
+ treeKey.parent();
+ }
+ if (treeKey.nextSibling())
+ printTree(treeKey, target, level);
+
+}
+
+
+int main(int argc, char **argv) {
+
+ const char * helptext ="addgb 1.0 General Book module creation tool for the SWORD Project\nUse -a to add a new leaf entry from standard input or a file\n usage:\n %s -a <filename> <key> [</path/to/file/with/entry>]\n";
+
+ // const char * helptext ="addgb 1.0 General Book module creation tool for the SWORD Project\nUse -a to add a new leaf entry from standard input or a file, -d to delete an\nentry, -l to link two leaf entries.\n usage:\n %s -a <filename> <key> [</path/to/file/with/entry>]\n %s -d <filename> <key>\n %s -l <filename> <first key (already assigned)> <second key>\n";
+
+ char mode;
+ unsigned long entrysize;
+
+ if (argc < 3) {
+ fprintf(stderr, helptext, argv[0]);
+ exit(-1);
+ }
+
+ mode = argv[1][1];
+
+ // Do some initialization stuff
+ TreeKeyIdx *treeKey = new TreeKeyIdx(argv[2]);
+ if (treeKey->Error()) {
+ treeKey->create(argv[2]);
+ delete treeKey;
+ treeKey = new TreeKeyIdx(argv[2]);
+ RawGenBook::createModule(argv[2]);
+ }
+ delete treeKey;
+ RawGenBook *book = new RawGenBook(argv[2]);
+ TreeKeyIdx root = *((TreeKeyIdx *)((SWKey *)(*book)));
+ treeKey = (TreeKeyIdx *)(SWKey *)(*book);
+
+ if ((mode == 'a') && (argc == 4 || argc == 5)) {
+ char buffer[1048576]; //this is the max size of any entry
+
+ char* tok = strtok(argv[3], "/");
+ while (tok) {
+ bool foundkey = false;
+ if (treeKey->hasChildren()) {
+ treeKey->firstChild();
+ if (!strcmp(treeKey->getLocalName(), tok)) {
+ foundkey = true;
+ } else {
+ while (treeKey->nextSibling()) {
+ if (treeKey->getLocalName()) {
+ if (!strcmp(treeKey->getLocalName(), tok)) {
+ foundkey = true;
+ }
+ }
+ }
+ }
+ if (!foundkey) {
+ treeKey->append();
+ treeKey->setLocalName(tok);
+ treeKey->save();
+ }
+ }
+ else {
+ treeKey->appendChild();
+ treeKey->setLocalName(tok);
+ treeKey->save();
+ }
+
+ //DEBUG cout << treeKey->getLocalName() << " : " << tok << endl;
+
+ tok = strtok(NULL, "/");
+
+ }
+
+ FILE *infile;
+ // case: add from text file
+ //Open our data file and read its contents into the buffer
+ if (argc == 5) infile = fopen(argv[4], "r");
+ // case: add from stdin
+ else infile = stdin;
+
+ entrysize = fread(buffer, sizeof(char), sizeof(buffer), infile);
+ book->setentry(buffer, entrysize); // save text to module at current position
+ }
+
+ /*
+ // let's pretend these don't exist for the time being
+
+ // Link 2 verses
+ else if ((mode == 'l') && argc == 5) {
+ *key = argv[3];
+ mod.SetKey(*key);
+
+ SWKey tmpkey = argv[4];
+ mod << &(tmpkey);
+ }
+
+ // Delete an entry
+ else if ((mode == 'd') && argc == 4) {
+ mod.SetKey(argv[3]);
+ mod.deleteEntry();
+ }
+ */
+ // Bad arguments, print usage
+ else {
+ fprintf(stderr, helptext, argv[0]);
+ exit(-1);
+ }
+
+ //DEBUG printTree(root, treeKey);
+
+ delete treeKey;
+ delete book;
+ return 0;
+}