summaryrefslogtreecommitdiff
path: root/bindings/perl/Sword.xs
diff options
context:
space:
mode:
Diffstat (limited to 'bindings/perl/Sword.xs')
-rw-r--r--bindings/perl/Sword.xs254
1 files changed, 254 insertions, 0 deletions
diff --git a/bindings/perl/Sword.xs b/bindings/perl/Sword.xs
new file mode 100644
index 0000000..e78c3aa
--- /dev/null
+++ b/bindings/perl/Sword.xs
@@ -0,0 +1,254 @@
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#ifdef __cplusplus
+}
+#endif
+
+#undef list
+
+#include <iostream.h>
+#include <swmgr.h>
+#include <swmodule.h>
+#include <versekey.h>
+#include <localemgr.h>
+
+SWMgr manager;
+
+class VerseIterator {
+public:
+ SWModule * module;
+ VerseKey key;
+ VerseIterator(char * module_name);
+ ~VerseIterator();
+
+ // Iterator info
+ const char * get_module_name() { return module->Name(); }
+
+ // Verse info
+ const char * get_verse() { module->SetKey(key); return (const char*)*module; }
+ const char * get_key() { return key; }
+
+ // Iteration
+ int next(int how_far);
+ int prev(int how_far);
+
+ // Go to verse
+ int go_to_verse(char * verse);
+
+ // Book / Chapter / Verse traversal
+ const char * get_book() { return key.books[key.Testament() - 1][key.Book() - 1].name; }
+ int get_chapter_num() { return key.Chapter(); }
+ int get_verse_num() { return key.Verse(); }
+
+ void set_chapter_num(int chapter_num) { key.Chapter(chapter_num); }
+ void set_verse_num(int verse_num) { key.Verse(verse_num); }
+
+ // Stuff that should go into some sort of Module class
+ char * _get_module_name() { return module->Name(); }
+ char * _get_module_desc() { return module->Description(); }
+ char * _get_module_type() { return module->Type(); }
+ int _verse_greater(char * verse1, char * verse2);
+};
+
+VerseIterator::VerseIterator(char * module_name) {
+ module = manager.Modules[module_name];
+ key = module->Key();
+ key.setLocale(LocaleMgr::systemLocaleMgr.getDefaultLocaleName());
+
+ key = key.LowerBound();
+}
+
+VerseIterator::~VerseIterator() {
+}
+
+int VerseIterator::next(int how_far) {
+ if(key == key.UpperBound()) {
+ return 0;
+ }
+ module->SetKey(key);
+ (*module) += how_far;
+ key = module->Key();
+ return 1;
+}
+
+int VerseIterator::prev(int how_far) {
+ if(key == key.LowerBound()) {
+ return 0;
+ }
+ module->SetKey(key);
+ (*module) -= how_far;
+ key = module->Key();
+ return 1;
+}
+
+int VerseIterator::go_to_verse(char * verse) {
+ int retval = module->SetKey(verse);
+ key = module->Key();
+ return ! retval;
+}
+
+int VerseIterator::_verse_greater(char * verse1, char * verse2) {
+ if(module->SetKey(verse1)) {
+ return -1;
+ }
+ SWKey key1 = module->Key();
+ if(module->SetKey(verse2)) {
+ return -1;
+ }
+ SWKey key2 = module->Key();
+ return key1 > key2;
+}
+
+MODULE = Sword PACKAGE = Sword
+
+void
+get_modules(char * textType = "Biblical Texts")
+PPCODE:
+ ModMap::iterator modIterator;
+ for (modIterator = manager.Modules.begin(); modIterator != manager.Modules.end(); modIterator++) {
+ SWModule *module = (*modIterator).second;
+ if(!strcmp(module->Type(),textType)) {
+ string s = (*modIterator).first;
+ XPUSHs(sv_2mortal(newSVpv(s.c_str(), s.length())));
+ }
+ }
+
+void
+get_locales()
+PPCODE:
+ LocaleMgr lm = LocaleMgr::systemLocaleMgr;
+ list<string> loclist = lm.getAvailableLocales();
+ list<string>::iterator li = loclist.begin();
+ for (;li != loclist.end(); li++) {
+ XPUSHs(sv_2mortal(newSVpv(li->c_str(), li->length())));
+ }
+
+void
+set_locale(char * locale)
+CODE:
+ LocaleMgr::systemLocaleMgr.setDefaultLocaleName(locale);
+
+
+MODULE = Sword PACKAGE = Sword::VerseIterator
+
+VerseIterator *
+VerseIterator::new(char * module_name)
+
+void
+VerseIterator::DESTROY()
+
+const char *
+VerseIterator::get_module_name()
+
+const char *
+VerseIterator::get_verse()
+
+const char *
+VerseIterator::get_key()
+
+
+int
+VerseIterator::next(int how_far = 1)
+
+int
+VerseIterator::prev(int how_far = 1)
+
+
+int
+VerseIterator::go_to_verse(char * verse)
+
+
+const char *
+VerseIterator::get_book()
+
+int
+VerseIterator::get_chapter_num()
+
+int
+VerseIterator::get_verse_num()
+
+void
+VerseIterator::set_chapter_num(int chapter_num)
+
+void
+VerseIterator::set_verse_num(int verse_num)
+
+
+void
+VerseIterator::_get_books()
+PPCODE:
+
+ for(int testament_num=0;testament_num<2;testament_num++) {
+ for(int book_num=0;book_num<THIS->key.BMAX[testament_num];book_num++) {
+ int num_chapters = THIS->key.books[testament_num][book_num].chapmax;
+ HV * book_info = newHV();
+ hv_store(book_info, "name", 4, newSVpv(THIS->key.books[testament_num][book_num].name, 0), 0);
+ hv_store(book_info, "num_chapters", 12, newSVnv(num_chapters), 0);
+ hv_store(book_info, "testament_num", 13, newSVnv(testament_num), 0);
+ hv_store(book_info, "book_num", 8, newSVnv(book_num), 0);
+ AV * chapter_maxes = newAV();
+ for(int i=0;i<num_chapters;i++) {
+ av_push(chapter_maxes, newSVnv(THIS->key.books[testament_num][book_num].versemax[i]));
+ }
+ hv_store(book_info, "chapter_maxes", 13, newRV_noinc((SV *)chapter_maxes), 0);
+ XPUSHs(newRV_noinc((SV *)book_info));
+ }
+ }
+
+void
+VerseIterator::_search(char * searchStr)
+PPCODE:
+ ListKey &searchResults = THIS->module->Search(searchStr);
+
+ searchResults.Persist(true);
+
+ for(int i=0;i<searchResults.Count();i++) {
+ SWKey * key = searchResults.GetElement(i);
+ AV * search_result = newAV();
+ av_push(search_result, newSVpv(*key, 0));
+ THIS->module->SetKey(key);
+ av_push(search_result, newSVpv(*THIS->module, 0));
+ XPUSHs(newRV_noinc((SV *)search_result));
+ }
+
+void
+VerseIterator::_search_verses(char * searchStr)
+PPCODE:
+ ListKey &searchResults = THIS->module->Search(searchStr);
+
+ searchResults.Persist(true);
+
+ for(int i=0;i<searchResults.Count();i++) {
+ SWKey * key = searchResults.GetElement(i);
+ XPUSHs(newSVpv(*key, 0));
+ }
+
+void
+VerseIterator::_parse_verse_list(char * verseList)
+PPCODE:
+ ListKey searchResults = THIS->key.ParseVerseList(verseList, "Genesis 1:1", false);
+
+ searchResults.Persist(true);
+
+ for(int i=0;i<searchResults.Count();i++) {
+ SWKey * key = searchResults.GetElement(i);
+ XPUSHs(newSVpv(*key, 0));
+ }
+
+char *
+VerseIterator::_get_module_name()
+
+char *
+VerseIterator::_get_module_desc()
+
+char *
+VerseIterator::_get_module_type()
+
+int
+VerseIterator::_verse_greater(char * verse1, char * verse2)
+