~ubuntu-branches/debian/squeeze/sword/squeeze

« back to all changes in this revision

Viewing changes to bindings/perl/Sword.xs

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Glassey
  • Date: 2004-01-15 15:50:07 UTC
  • Revision ID: james.westby@ubuntu.com-20040115155007-n9mz4x0zxrs1isd3
Tags: upstream-1.5.7
ImportĀ upstreamĀ versionĀ 1.5.7

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
#ifdef __cplusplus
 
3
extern "C" {
 
4
#endif
 
5
#include "EXTERN.h"
 
6
#include "perl.h"
 
7
#include "XSUB.h"
 
8
#ifdef __cplusplus
 
9
}
 
10
#endif
 
11
 
 
12
#undef list
 
13
 
 
14
#include <iostream.h>
 
15
#include <swmgr.h>
 
16
#include <swmodule.h>
 
17
#include <versekey.h>
 
18
#include <localemgr.h>
 
19
 
 
20
SWMgr manager;
 
21
 
 
22
class VerseIterator {
 
23
public:
 
24
        SWModule * module;
 
25
        VerseKey key;
 
26
        VerseIterator(char * module_name);
 
27
        ~VerseIterator();
 
28
 
 
29
        // Iterator info
 
30
        const char * get_module_name() { return module->Name(); }
 
31
 
 
32
        // Verse info
 
33
        const char * get_verse() { module->SetKey(key); return (const char*)*module; }
 
34
        const char * get_key() { return key; }
 
35
 
 
36
        // Iteration
 
37
        int next(int how_far);
 
38
        int prev(int how_far);
 
39
 
 
40
        // Go to verse
 
41
        int go_to_verse(char * verse);
 
42
 
 
43
        // Book / Chapter / Verse traversal
 
44
        const char * get_book() { return key.books[key.Testament() - 1][key.Book() - 1].name; }
 
45
        int get_chapter_num() { return key.Chapter(); }
 
46
        int get_verse_num() { return key.Verse(); }
 
47
 
 
48
        void set_chapter_num(int chapter_num) { key.Chapter(chapter_num); }
 
49
        void set_verse_num(int verse_num) { key.Verse(verse_num); }
 
50
 
 
51
        // Stuff that should go into some sort of Module class
 
52
        char * _get_module_name() { return module->Name(); }
 
53
        char * _get_module_desc() { return module->Description(); }
 
54
        char * _get_module_type() { return module->Type(); }
 
55
        int _verse_greater(char * verse1, char * verse2);
 
56
};
 
57
 
 
58
VerseIterator::VerseIterator(char * module_name) {
 
59
        module = manager.Modules[module_name];
 
60
        key = module->Key();
 
61
        key.setLocale(LocaleMgr::systemLocaleMgr.getDefaultLocaleName());
 
62
 
 
63
        key = key.LowerBound();
 
64
}
 
65
 
 
66
VerseIterator::~VerseIterator() {
 
67
}
 
68
 
 
69
int VerseIterator::next(int how_far) {
 
70
        if(key == key.UpperBound()) {
 
71
                return 0;
 
72
        }
 
73
        module->SetKey(key);
 
74
        (*module) += how_far;
 
75
        key = module->Key();
 
76
        return 1;
 
77
}
 
78
 
 
79
int VerseIterator::prev(int how_far) {
 
80
        if(key == key.LowerBound()) {
 
81
                return 0;
 
82
        }
 
83
        module->SetKey(key);
 
84
        (*module) -= how_far;
 
85
        key = module->Key();
 
86
        return 1;
 
87
}
 
88
 
 
89
int VerseIterator::go_to_verse(char * verse) {
 
90
        int retval = module->SetKey(verse);
 
91
        key = module->Key();
 
92
        return ! retval;
 
93
}
 
94
 
 
95
int VerseIterator::_verse_greater(char * verse1, char * verse2) {
 
96
        if(module->SetKey(verse1)) {
 
97
                return -1;
 
98
        }
 
99
        SWKey key1 = module->Key();
 
100
        if(module->SetKey(verse2)) {
 
101
                return -1;
 
102
        }
 
103
        SWKey key2 = module->Key();
 
104
        return key1 > key2;
 
105
}
 
106
 
 
107
MODULE = Sword          PACKAGE = Sword         
 
108
 
 
109
void
 
110
get_modules(char * textType = "Biblical Texts")
 
111
PPCODE:
 
112
        ModMap::iterator modIterator;
 
113
        for (modIterator = manager.Modules.begin(); modIterator != manager.Modules.end(); modIterator++) {
 
114
                SWModule *module = (*modIterator).second;
 
115
                if(!strcmp(module->Type(),textType)) {
 
116
                        string s = (*modIterator).first;
 
117
                        XPUSHs(sv_2mortal(newSVpv(s.c_str(), s.length())));
 
118
                }
 
119
        }
 
120
 
 
121
void
 
122
get_locales()
 
123
PPCODE:
 
124
        LocaleMgr lm = LocaleMgr::systemLocaleMgr;
 
125
        list<string> loclist = lm.getAvailableLocales();
 
126
        list<string>::iterator li = loclist.begin();
 
127
        for (;li != loclist.end(); li++) {
 
128
                XPUSHs(sv_2mortal(newSVpv(li->c_str(), li->length())));
 
129
        }
 
130
 
 
131
void
 
132
set_locale(char * locale)
 
133
CODE:
 
134
        LocaleMgr::systemLocaleMgr.setDefaultLocaleName(locale);
 
135
 
 
136
 
 
137
MODULE = Sword          PACKAGE = Sword::VerseIterator
 
138
 
 
139
VerseIterator *
 
140
VerseIterator::new(char * module_name)
 
141
 
 
142
void
 
143
VerseIterator::DESTROY()
 
144
 
 
145
const char *
 
146
VerseIterator::get_module_name()
 
147
 
 
148
const char *
 
149
VerseIterator::get_verse()
 
150
 
 
151
const char *
 
152
VerseIterator::get_key()
 
153
 
 
154
 
 
155
int
 
156
VerseIterator::next(int how_far = 1)
 
157
 
 
158
int
 
159
VerseIterator::prev(int how_far = 1)
 
160
 
 
161
 
 
162
int
 
163
VerseIterator::go_to_verse(char * verse)
 
164
 
 
165
 
 
166
const char *
 
167
VerseIterator::get_book()
 
168
 
 
169
int
 
170
VerseIterator::get_chapter_num()
 
171
 
 
172
int
 
173
VerseIterator::get_verse_num()
 
174
 
 
175
void
 
176
VerseIterator::set_chapter_num(int chapter_num)
 
177
 
 
178
void
 
179
VerseIterator::set_verse_num(int verse_num)
 
180
 
 
181
 
 
182
void
 
183
VerseIterator::_get_books()
 
184
PPCODE:
 
185
 
 
186
        for(int testament_num=0;testament_num<2;testament_num++) {
 
187
                for(int book_num=0;book_num<THIS->key.BMAX[testament_num];book_num++) {
 
188
                        int num_chapters = THIS->key.books[testament_num][book_num].chapmax;
 
189
                        HV * book_info = newHV();
 
190
                        hv_store(book_info, "name", 4, newSVpv(THIS->key.books[testament_num][book_num].name, 0), 0);
 
191
                        hv_store(book_info, "num_chapters", 12, newSVnv(num_chapters), 0);
 
192
                        hv_store(book_info, "testament_num", 13, newSVnv(testament_num), 0);
 
193
                        hv_store(book_info, "book_num", 8, newSVnv(book_num), 0);
 
194
                        AV * chapter_maxes = newAV();
 
195
                        for(int i=0;i<num_chapters;i++) {
 
196
                                av_push(chapter_maxes, newSVnv(THIS->key.books[testament_num][book_num].versemax[i]));
 
197
                        }
 
198
                        hv_store(book_info, "chapter_maxes", 13, newRV_noinc((SV *)chapter_maxes), 0);
 
199
                        XPUSHs(newRV_noinc((SV *)book_info));
 
200
                }
 
201
        }
 
202
 
 
203
void
 
204
VerseIterator::_search(char * searchStr)
 
205
PPCODE:
 
206
        ListKey &searchResults = THIS->module->Search(searchStr);
 
207
 
 
208
        searchResults.Persist(true);
 
209
 
 
210
        for(int i=0;i<searchResults.Count();i++) {
 
211
                SWKey * key = searchResults.GetElement(i);
 
212
                AV * search_result = newAV();
 
213
                av_push(search_result, newSVpv(*key, 0));
 
214
                THIS->module->SetKey(key);
 
215
                av_push(search_result, newSVpv(*THIS->module, 0));
 
216
                XPUSHs(newRV_noinc((SV *)search_result));
 
217
        }
 
218
 
 
219
void
 
220
VerseIterator::_search_verses(char * searchStr)
 
221
PPCODE:
 
222
        ListKey &searchResults = THIS->module->Search(searchStr);
 
223
 
 
224
        searchResults.Persist(true);
 
225
 
 
226
        for(int i=0;i<searchResults.Count();i++) {
 
227
                SWKey * key = searchResults.GetElement(i);
 
228
                XPUSHs(newSVpv(*key, 0));
 
229
        }
 
230
 
 
231
void
 
232
VerseIterator::_parse_verse_list(char * verseList)
 
233
PPCODE:
 
234
        ListKey searchResults = THIS->key.ParseVerseList(verseList, "Genesis 1:1", false);
 
235
 
 
236
        searchResults.Persist(true);
 
237
 
 
238
        for(int i=0;i<searchResults.Count();i++) {
 
239
                SWKey * key = searchResults.GetElement(i);
 
240
                XPUSHs(newSVpv(*key, 0));
 
241
        }
 
242
 
 
243
char *
 
244
VerseIterator::_get_module_name()
 
245
 
 
246
char *
 
247
VerseIterator::_get_module_desc()
 
248
 
 
249
char *
 
250
VerseIterator::_get_module_type()
 
251
 
 
252
int
 
253
VerseIterator::_verse_greater(char * verse1, char * verse2)
 
254