9
static HashTable *object_map;
45
unsigned long value_hash(const void *key)
47
return (unsigned long)key;
50
int value_eq(const void *key1, const void *key2)
55
VALUE object_get(void *key)
57
VALUE val = (VALUE)h_get(object_map, key);
62
//static int hash_cnt = 0;
64
//object_add(void *key, VALUE obj)
65
object_add2(void *key, VALUE obj, const char *file, int line)
67
if (h_get(object_map, key))
68
printf("failed adding %lx to %ld; already contains %lx. %s:%d\n",
69
(long)obj, (long)key, (long)h_get(object_map, key), file, line);
70
//printf("adding %ld. now contains %d %s:%d\n", (long)key, ++hash_cnt, file, line);
71
h_set(object_map, key, (void *)obj);
75
//object_set(void *key, VALUE obj)
76
object_set2(void *key, VALUE obj, const char *file, int line)
78
//if (!h_get(object_map, key))
79
//printf("adding %ld. now contains %d %s:%d\n", (long)key, ++hash_cnt, file, line);
80
h_set(object_map, key, (void *)obj);
84
//object_del(void *key)
85
object_del2(void *key, const char *file, int line)
87
if (object_get(key) == Qnil)
88
printf("failed deleting %ld. %s:%d\n", (long)key, file, line);
89
//printf("deleting %ld. now contains %ld, %s:%d\n", (long)key, --hash_cnt, file, line);
90
h_del(object_map, key);
93
void frt_gc_mark(void *key)
95
VALUE val = (VALUE)h_get(object_map, key);
100
VALUE frt_data_alloc(VALUE klass)
102
return Frt_Make_Struct(klass);
105
void frt_deref_free(void *p)
110
void frt_thread_once(int *once_control, void (*init_routine) (void))
118
void frt_thread_key_create(thread_key_t *key, void (*destr_function)(void *))
120
*key = h_new(&value_hash, &value_eq, NULL, destr_function);
123
void frt_thread_key_delete(thread_key_t key)
128
void frt_thread_setspecific(thread_key_t key, const void *pointer)
130
h_set(key, (void *)rb_thread_current(), (void *)pointer);
133
void *frt_thread_getspecific(thread_key_t key)
135
return h_get(key, (void *)rb_thread_current());
138
void frt_create_dir(VALUE rpath)
141
rb_require("fileutils");
142
mFileUtils = rb_define_module("FileUtils");
143
rb_funcall(mFileUtils, id_mkdir_p, 1, rpath);
146
VALUE frt_hs_to_rb_ary(HashSet *hs)
149
VALUE ary = rb_ary_new();
150
for (i = 0; i < hs->size; i++) {
151
rb_ary_push(ary, rb_str_new2(hs->elems[i]));
156
void *frt_rb_data_ptr(VALUE val)
158
Check_Type(val, T_DATA);
159
return DATA_PTR(val);
165
return (char *)(RSTRING(rstr)->ptr ? RSTRING(rstr)->ptr : EMPTY_STRING);
171
char *old = rs2s(rstr);
172
int len = RSTRING(rstr)->len;
173
char *new = ALLOC_N(char, len + 1);
174
memcpy(new, old, len + 1);
179
frt_field(VALUE rfield)
181
switch (TYPE(rfield)) {
183
return rb_id2name(SYM2ID(rfield));
187
rb_raise(rb_eArgError, "field name must be a symbol");
193
* Json Exportation - Loading each LazyDoc and formatting them into json
194
* This code is designed to get a VERY FAST json string, the goal was speed,
196
* Jeremie 'ahFeel' BORDIER
200
json_concat_string(char *s, char *field)
217
static VALUE error_map;
219
VALUE frt_get_error(const char *err_type)
222
if (Qnil != (error_class = rb_hash_aref(error_map, rb_intern(err_type)))) {
225
return rb_eStandardError;
228
#define FRT_BUF_SIZ 2046
229
#ifdef FRT_HAS_VARARGS
230
void vfrt_rb_raise(const char *file, int line_num, const char *func,
231
const char *err_type, const char *fmt, va_list args)
233
void V_FRT_EXIT(const char *err_type, const char *fmt, va_list args)
236
char buf[FRT_BUF_SIZ];
238
#ifdef FRT_HAS_VARARGS
239
snprintf(buf, FRT_BUF_SIZ, "%s occured at <%s>:%d in %s\n",
240
err_type, file, line_num, func);
242
snprintf(buf, FRT_BUF_SIZ, "%s occured:\n", err_type);
244
so_far = strlen(buf);
245
vsnprintf(buf + so_far, FRT_BUF_SIZ - so_far, fmt, args);
247
so_far = strlen(buf);
248
if (fmt[0] != '\0' && fmt[strlen(fmt) - 1] == ':') {
249
snprintf(buf + so_far, FRT_BUF_SIZ - so_far, " %s", strerror(errno));
250
so_far = strlen(buf);
253
snprintf(buf + so_far, FRT_BUF_SIZ - so_far, "\n");
254
rb_raise(frt_get_error(err_type), buf);
257
#ifdef FRT_HAS_VARARGS
258
void frt_rb_raise(const char *file, int line_num, const char *func,
259
const char *err_type, const char *fmt, ...)
261
void FRT_EXIT(const char *err_type, const char *fmt, ...)
266
#ifdef FRT_HAS_VARARGS
267
vfrt_rb_raise(file, line_num, func, err_type, fmt, args);
269
V_FRT_EXIT(err_type, fmt, args);
274
/****************************************************************************
278
****************************************************************************/
282
VALUE frt_get_term(const char *field, const char *text)
284
return rb_struct_new(cTerm,
285
ID2SYM(rb_intern(field)),
290
static VALUE frt_term_to_s(VALUE self)
293
VALUE rfield = rb_funcall(self, id_field, 0);
294
VALUE rtext = rb_funcall(self, id_text, 0);
295
char *field = StringValuePtr(rfield);
296
char *text = StringValuePtr(rtext);
297
char *term_str = ALLOC_N(char,
298
5 + RSTRING(rfield)->len + RSTRING(rtext)->len);
299
sprintf(term_str, "%s:%s", field, text);
300
rstr = rb_str_new2(term_str);
305
* Document-class: Ferret::Term
309
* A Term holds a term from a document and its field name (as a Symbol).
313
const char *term_class = "Term";
314
cTerm = rb_struct_define(term_class, "field", "text", NULL);
315
rb_set_class_path(cTerm, mFerret, term_class);
316
rb_const_set(mFerret, rb_intern(term_class), cTerm);
317
rb_define_method(cTerm, "to_s", frt_term_to_s, 0);
318
id_field = rb_intern("field");
319
id_text = rb_intern("text");
323
* Document-module: Ferret
327
void Init_Ferret(void)
329
mFerret = rb_define_module("Ferret");
333
void Init_ferret_ext(void)
337
VALUE cFileNotFoundError;
339
/* initialize object map */
340
object_map = h_new(&value_hash, &value_eq, NULL, NULL);
343
id_new = rb_intern("new");
344
id_call = rb_intern("call");
345
id_eql = rb_intern("eql?");
346
id_hash = rb_intern("hash");
348
id_capacity = rb_intern("capacity");
349
id_less_than = rb_intern("less_than");
350
id_lt = rb_intern("<");
352
id_mkdir_p = rb_intern("mkdir_p");
353
id_is_directory = rb_intern("directory?");
354
id_close = rb_intern("close");
356
id_cclass = rb_intern("cclass");
358
id_data = rb_intern("@data");
361
sym_yes = ID2SYM(rb_intern("yes"));;
362
sym_no = ID2SYM(rb_intern("no"));;
363
sym_true = ID2SYM(rb_intern("true"));;
364
sym_false = ID2SYM(rb_intern("false"));;
365
sym_path = ID2SYM(rb_intern("path"));;
366
sym_dir = ID2SYM(rb_intern("dir"));;
379
rb_define_class_under(mFerret, "ParseError", rb_eStandardError);
381
rb_define_class_under(mFerret, "StateError", rb_eStandardError);
383
rb_define_class_under(mFerret, "FileNotFoundError", rb_eIOError);
385
error_map = rb_hash_new();
386
rb_hash_aset(error_map, rb_intern("Exception"), rb_eStandardError);
387
rb_hash_aset(error_map, rb_intern("IO Error"), rb_eIOError);
388
rb_hash_aset(error_map, rb_intern("File Not Found Error"),
390
rb_hash_aset(error_map, rb_intern("Argument Error"), rb_eArgError);
391
rb_hash_aset(error_map, rb_intern("End-of-File Error"), rb_eEOFError);
392
rb_hash_aset(error_map, rb_intern("Unsupported Function Error"),
394
rb_hash_aset(error_map, rb_intern("State Error"), cStateError);
395
rb_hash_aset(error_map, rb_intern("ParseError"), cParseError);
396
rb_hash_aset(error_map, rb_intern("Memory Error"), rb_eNoMemError);
397
rb_hash_aset(error_map, rb_intern("Index Error"), rb_eIndexError);
398
rb_hash_aset(error_map, rb_intern("Lock Error"), cLockError);
400
rb_define_const(mFerret, "EXCEPTION_MAP", error_map);
401
rb_define_const(mFerret, "FIX_INT_MAX", INT2FIX(INT_MAX >> 1));