ruby-magic 0.0.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,23 +1,3 @@
1
- /* :enddoc: */
2
-
3
- /*
4
- * ruby-magic.h
5
- *
6
- * Copyright 2013-2014 Krzysztof Wilczynski
7
- *
8
- * Licensed under the Apache License, Version 2.0 (the "License");
9
- * you may not use this file except in compliance with the License.
10
- * You may obtain a copy of the License at
11
- *
12
- * http://www.apache.org/licenses/LICENSE-2.0
13
- *
14
- * Unless required by applicable law or agreed to in writing, software
15
- * distributed under the License is distributed on an "AS IS" BASIS,
16
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
- * See the License for the specific language governing permissions and
18
- * limitations under the License.
19
- */
20
-
21
1
  #if !defined(_RUBY_MAGIC_H)
22
2
  #define _RUBY_MAGIC_H 1
23
3
 
@@ -28,217 +8,447 @@ extern "C" {
28
8
  #include "common.h"
29
9
  #include "functions.h"
30
10
 
31
- #define DATA_P(x) (TYPE(x) == T_DATA)
32
- #define STRING_P(x) (TYPE(x) == T_STRING)
33
- #define ARRAY_P(x) (TYPE(x) == T_ARRAY)
11
+ #define MAGIC_SYNCHRONIZED(f, d) magic_lock(object, (f), (d))
34
12
 
35
- #if !defined(STR2CSTR)
36
- # define STR2CSTR(x) StringValuePtr(x)
37
- #endif
13
+ #define MAGIC_OBJECT(o) \
14
+ TypedData_Get_Struct(object, magic_object_t, &rb_magic_type, (o))
38
15
 
39
- #if !defined(RVAL2CSTR)
40
- # define RVAL2CSTR(x) (NIL_P(x) ? NULL : STR2CSTR(x))
41
- #endif
16
+ #define MAGIC_COOKIE(o, c) \
17
+ ((c) = MAGIC_OBJECT((o))->cookie)
42
18
 
43
- #if !defined(CSTR2RVAL)
44
- # define CSTR2RVAL(x) ((x) == NULL ? Qnil : rb_str_new2(x))
45
- #endif
19
+ #define MAGIC_CLOSED_P(o) RTEST(rb_mgc_close_p((o)))
20
+ #define MAGIC_LOADED_P(o) RTEST(rb_mgc_load_p((o)))
46
21
 
47
- #if !defined(RARRAY_LEN)
48
- # define RARRAY_LEN(a) (RARRAY(a)->len)
49
- #endif
22
+ #define MAGIC_WARNING(i, ...) \
23
+ do { \
24
+ if (!(i) || !(rb_mgc_warning & BIT(i))) { \
25
+ rb_mgc_warning |= BIT(i); \
26
+ rb_warn(__VA_ARGS__); \
27
+ } \
28
+ } while(0)
50
29
 
51
- #if !defined(RSTRING_LEN)
52
- # define RSTRING_LEN(s) (RSTRING(s)->len)
53
- #endif
30
+ #define MAGIC_ARGUMENT_TYPE_ERROR(o, ...) \
31
+ rb_raise(rb_eTypeError, error(E_ARGUMENT_TYPE_INVALID), CLASS_NAME((o)), __VA_ARGS__)
54
32
 
55
- #if !defined(RSTRING_PTR)
56
- # define RSTRING_PTR(s) (RSTRING(s)->ptr)
57
- #endif
33
+ #define MAGIC_GENERIC_ERROR(k, e, m) \
34
+ rb_exc_raise(magic_generic_error((k), (e), error(m)))
58
35
 
59
- #define RSTRING_EMPTY_P(s) (RSTRING_LEN(s) == 0)
60
- #define RARRAY_EMPTY_P(a) (RARRAY_LEN(a) == 0)
61
- #define RARRAY_FIRST(a) (RARRAY_EMPTY_P(a) ? Qnil : RARRAY_PTR(a)[0])
62
-
63
- #define NOGVL_FUNCTION (VALUE (*)(void *))
64
-
65
- #if defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL) && \
66
- defined(HAVE_RUBY_THREAD_H) && HAVE_RUBY_THREAD_H
67
- # include <ruby/thread.h>
68
- # define NOGVL(f, d) \
69
- rb_thread_call_without_gvl((f), (d), RUBY_UBF_IO, NULL)
70
- #elif defined(HAVE_RB_THREAD_BLOCKING_REGION)
71
- # define NOGVL(f, d) \
72
- rb_thread_blocking_region(NOGVL_FUNCTION(f), (d), RUBY_UBF_IO, NULL)
73
- #else
74
- # include <rubysig.h>
75
- static inline VALUE
76
- fake_blocking_region(VALUE (*f)(ANYARGS), void *data)
77
- {
78
- VALUE rv;
36
+ #define MAGIC_LIBRARY_ERROR(c) \
37
+ rb_exc_raise(magic_library_error(rb_mgc_eMagicError, (c)))
79
38
 
80
- TRAP_BEG;
81
- rv = f(data);
82
- TRAP_END;
39
+ #define MAGIC_CHECK_INTEGER_TYPE(o) magic_check_type((o), T_FIXNUM)
40
+ #define MAGIC_CHECK_STRING_TYPE(o) magic_check_type((o), T_STRING)
83
41
 
84
- return rv;
85
- }
86
- # define NOGVL(f, d) fake_blocking_region(NOGVL_FUNCTION(f), (d))
87
- #endif
42
+ #define MAGIC_CHECK_ARGUMENT_MISSING(t, o) \
43
+ do { \
44
+ if ((t) < (o)) \
45
+ rb_raise(rb_eArgError, error(E_ARGUMENT_MISSING), (t), (o)); \
46
+ } while(0)
88
47
 
89
- #define MAGIC_SYNCHRONIZED(f, d) magic_lock(object, (f), (d))
48
+ #define MAGIC_CHECK_ARRAY_EMPTY(o) \
49
+ do { \
50
+ if (RARRAY_EMPTY_P(o)) \
51
+ rb_raise(rb_eArgError, "%s", error(E_ARGUMENT_TYPE_ARRAY_EMPTY)); \
52
+ } while(0)
90
53
 
91
- #define MAGIC_COOKIE(c) \
92
- Data_Get_Struct(object, struct magic_set, (c))
54
+ #define MAGIC_CHECK_ARRAY_OF_STRINGS(o) \
55
+ magic_check_type_array_of_strings((o))
93
56
 
94
- #define MAGIC_CLOSED_P(o) RTEST(rb_mgc_closed((o)))
57
+ #define MAGIC_CHECK_OPEN(o) \
58
+ do { \
59
+ if (MAGIC_CLOSED_P(o)) \
60
+ MAGIC_GENERIC_ERROR(rb_mgc_eLibraryError, EFAULT, \
61
+ E_MAGIC_LIBRARY_CLOSED); \
62
+ } while(0)
95
63
 
96
- #define MAGIC_GENERIC_ERROR(k, e, m) \
97
- do { \
98
- VALUE __e_##k = magic_generic_error((k), (e), (m)); \
99
- rb_exc_raise(__e_##k); \
100
- } while(0)
64
+ #define MAGIC_CHECK_LOADED(o) \
65
+ do { \
66
+ if (!MAGIC_LOADED_P(o)) \
67
+ MAGIC_GENERIC_ERROR(rb_mgc_eMagicError, EFAULT, \
68
+ E_MAGIC_LIBRARY_NOT_LOADED); \
69
+ } while(0)
101
70
 
102
- #define MAGIC_LIBRARY_ERROR(c) \
103
- do { \
104
- VALUE __e_library = magic_library_error(rb_mgc_eMagicError, (c)); \
105
- rb_exc_raise(__e_library); \
106
- } while(0)
71
+ #define MAGIC_STRINGIFY(s) #s
107
72
 
108
- #define CHECK_MAGIC_OPEN(o) \
109
- do { \
110
- if (MAGIC_CLOSED_P(o)) { \
111
- MAGIC_GENERIC_ERROR(rb_mgc_eLibraryError, EFAULT, \
112
- error(E_MAGIC_LIBRARY_CLOSED)); \
113
- } \
114
- } while(0) \
73
+ #define MAGIC_DEFINE_FLAG(c) \
74
+ rb_define_const(rb_cMagic, MAGIC_STRINGIFY(c), INT2NUM(MAGIC_##c));
75
+
76
+ #define MAGIC_DEFINE_PARAMETER(c) \
77
+ rb_define_const(rb_cMagic, MAGIC_STRINGIFY(PARAM_##c), INT2NUM(MAGIC_PARAM_##c));
115
78
 
116
79
  #define error(t) errors[(t)]
117
80
 
118
81
  enum error {
119
- E_UNKNOWN = 0,
120
- E_NOT_IMPLEMENTED,
121
- E_MAGIC_LIBRARY_INITIALIZE,
122
- E_MAGIC_LIBRARY_CLOSED,
123
- E_FLAG_INVALID_VALUE,
124
- E_FLAG_NOT_IMPLEMENTED
82
+ E_UNKNOWN = 0,
83
+ E_NOT_ENOUGH_MEMORY,
84
+ E_ARGUMENT_MISSING,
85
+ E_ARGUMENT_TYPE_INVALID,
86
+ E_ARGUMENT_TYPE_UNKNOWN,
87
+ E_ARGUMENT_TYPE_ARRAY_EMPTY,
88
+ E_ARGUMENT_TYPE_ARRAY_STRINGS,
89
+ E_MAGIC_LIBRARY_INITIALIZE,
90
+ E_MAGIC_LIBRARY_CLOSED,
91
+ E_MAGIC_LIBRARY_NOT_LOADED,
92
+ E_PARAM_INVALID_TYPE,
93
+ E_PARAM_INVALID_VALUE,
94
+ E_FLAG_NOT_IMPLEMENTED,
95
+ E_FLAG_INVALID_TYPE
125
96
  };
126
97
 
127
- union file {
128
- int fd;
129
- const char *path;
130
- };
98
+ typedef struct parameter {
99
+ size_t value;
100
+ int tag;
101
+ } parameter_t;
102
+
103
+ typedef union file {
104
+ const char *path;
105
+ int fd;
106
+ } file_t;
107
+
108
+ typedef struct buffers {
109
+ size_t count;
110
+ size_t *sizes;
111
+ void **pointers;
112
+ } buffers_t;
113
+
114
+ typedef struct magic_object {
115
+ magic_t cookie;
116
+ VALUE mutex;
117
+ unsigned int database_loaded:1;
118
+ unsigned int stop_on_errors:1;
119
+ } magic_object_t;
120
+
121
+ typedef struct magic_arguments {
122
+ union {
123
+ file_t file;
124
+ parameter_t parameter;
125
+ buffers_t buffers;
126
+ } type;
127
+ magic_t cookie;
128
+ const char *result;
129
+ int flags;
130
+ int status;
131
+ unsigned int stop_on_errors:1;
132
+ } magic_arguments_t;
133
+
134
+ typedef struct magic_exception {
135
+ const char *magic_error;
136
+ VALUE klass;
137
+ int magic_errno;
138
+ } magic_exception_t;
131
139
 
132
- struct buffer {
133
- size_t size;
134
- const char *buffer;
140
+ static const char *errors[] = {
141
+ [E_UNKNOWN] = "an unknown error has occurred",
142
+ [E_NOT_ENOUGH_MEMORY] = "cannot allocate memory",
143
+ [E_ARGUMENT_MISSING] = "wrong number of arguments (given %d, expected %d)",
144
+ [E_ARGUMENT_TYPE_INVALID] = "wrong argument type %s (expected %s)",
145
+ [E_ARGUMENT_TYPE_UNKNOWN] = "unknown type 0x%x (0x%x given)",
146
+ [E_ARGUMENT_TYPE_ARRAY_EMPTY] = "arguments list cannot be empty (expected array of String)",
147
+ [E_ARGUMENT_TYPE_ARRAY_STRINGS] = "wrong argument type %s in arguments list (expected String)",
148
+ [E_MAGIC_LIBRARY_INITIALIZE] = "failed to initialize Magic library",
149
+ [E_MAGIC_LIBRARY_CLOSED] = "Magic library is not open",
150
+ [E_MAGIC_LIBRARY_NOT_LOADED] = "Magic library not loaded",
151
+ [E_PARAM_INVALID_TYPE] = "unknown or invalid parameter specified",
152
+ [E_PARAM_INVALID_VALUE] = "invalid parameter value specified",
153
+ [E_FLAG_NOT_IMPLEMENTED] = "flag is not implemented",
154
+ [E_FLAG_INVALID_TYPE] = "unknown or invalid flag specified",
155
+ NULL
135
156
  };
136
157
 
137
- typedef union file file_t;
138
- typedef struct buffer buffer_t;
139
-
140
- struct magic_arguments {
141
- int flags;
142
- magic_t cookie;
143
- union {
144
- file_t file;
145
- buffer_t buffer;
146
- } data;
158
+ #if defined(MAGIC_CUSTOM_CHECK_TYPE)
159
+ static const char *ruby_types[] = {
160
+ "", /* Not an object */
161
+ [T_OBJECT] = "Object",
162
+ [T_CLASS] = "Class",
163
+ [T_MODULE] = "Module",
164
+ [T_FLOAT] = "Float",
165
+ [T_STRING] = "String",
166
+ [T_REGEXP] = "Regexp",
167
+ [T_ARRAY] = "Array",
168
+ [T_HASH] = "Hash",
169
+ [T_STRUCT] = "Struct",
170
+ [T_BIGNUM] = "Integer",
171
+ [T_FILE] = "File",
172
+ "", /* Internal use */
173
+ [T_MATCH] = "MatchData",
174
+ [T_COMPLEX] = "Complex",
175
+ [T_RATIONAL] = "Rational",
176
+ "", /* Internal use */
177
+ [T_NIL] = "nil",
178
+ [T_TRUE] = "true",
179
+ [T_FALSE] = "false",
180
+ [T_SYMBOL] = "Symbol",
181
+ [T_FIXNUM] = "Integer",
182
+ "", /* Internal use */
183
+ NULL
147
184
  };
148
185
 
149
- struct magic_exception {
150
- int magic_errno;
151
- const char *magic_error;
152
- VALUE klass;
153
- };
186
+ static const char *
187
+ magic_ruby_type_name(int type)
188
+ {
189
+ const char *name;
154
190
 
155
- typedef struct magic_arguments magic_arguments_t;
156
- typedef struct magic_exception magic_exception_t;
191
+ if (type >= ARRAY_SIZE(ruby_types))
192
+ return NULL;
157
193
 
158
- static const char *errors[] = {
159
- "unknown error",
160
- "function is not implemented",
161
- "failed to initialize Magic library",
162
- "Magic library is not open",
163
- "unknown or invalid flag specified",
164
- "flag is not implemented",
165
- NULL
166
- };
194
+ name = ruby_types[type];
195
+ if (name)
196
+ return name;
197
+
198
+ return NULL;
199
+ }
167
200
 
168
- inline static VALUE
169
- magic_size(VALUE v)
201
+ static const char *
202
+ magic_ruby_class_name(VALUE object)
170
203
  {
171
- if (ARRAY_P(v) || STRING_P(v)) {
172
- return rb_funcall(v, rb_intern("size"), 0, NULL);
173
- }
204
+ const char *name = NULL;
205
+
206
+ if (NIL_P(object))
207
+ name = "nil";
208
+ else if (RB_TYPE_P(object, T_TRUE))
209
+ name = "true";
210
+ else if (RB_TYPE_P(object, T_FALSE))
211
+ name = "false";
212
+ else
213
+ name = CLASS_NAME(object);
214
+
215
+ return name;
216
+ }
174
217
 
175
- return Qnil;
218
+ void
219
+ magic_check_ruby_type(VALUE object, int type)
220
+ {
221
+ const char *name;
222
+ int object_type = TYPE(object);
223
+
224
+ if (object == Qundef)
225
+ rb_bug("invalid type leaked to the Ruby space");
226
+
227
+ if (object_type > T_MASK || object_type == T_DATA)
228
+ goto error;
229
+
230
+ if (object_type == type)
231
+ return;
232
+
233
+ name = magic_ruby_type_name(type);
234
+ if (name)
235
+ rb_raise(rb_eTypeError, error(E_ARGUMENT_TYPE_INVALID),
236
+ magic_ruby_class_name(object),
237
+ name);
238
+ error:
239
+ rb_raise(rb_eTypeError, error(E_ARGUMENT_TYPE_UNKNOWN),
240
+ object_type,
241
+ type);
176
242
  }
243
+ #endif /* MAGIC_CUSTOM_CHECK_TYPE */
177
244
 
178
- inline static VALUE
245
+ static inline VALUE
179
246
  magic_shift(VALUE v)
180
247
  {
181
- if (ARRAY_P(v)) {
182
- return rb_funcall(v, rb_intern("shift"), 0, NULL);
183
- }
184
-
185
- return Qnil;
248
+ return ARRAY_P(v) ? \
249
+ rb_funcall(v, rb_intern("shift"), 0) : \
250
+ Qnil;
186
251
  }
187
252
 
188
- inline static VALUE
253
+ static inline VALUE
189
254
  magic_split(VALUE a, VALUE b)
190
255
  {
191
- if (STRING_P(a) && STRING_P(b)) {
192
- return rb_funcall(a, rb_intern("split"), 1, b);
193
- }
194
-
195
- return Qnil;
256
+ return (STRING_P(a) && STRING_P(b)) ? \
257
+ rb_funcall(a, rb_intern("split"), 1, b) : \
258
+ Qnil;
196
259
  }
197
260
 
198
- inline static VALUE
261
+ static inline VALUE
199
262
  magic_join(VALUE a, VALUE b)
200
263
  {
201
- if (ARRAY_P(a) && STRING_P(b)) {
202
- return rb_funcall(a, rb_intern("join"), 1, b);
203
- }
264
+ return (ARRAY_P(a) && STRING_P(b)) ? \
265
+ rb_funcall(a, rb_intern("join"), 1, b) : \
266
+ Qnil;
267
+ }
268
+
269
+ static inline VALUE
270
+ magic_flatten(VALUE v)
271
+ {
272
+ return ARRAY_P(v) ? \
273
+ rb_funcall(v, rb_intern("flatten"), 0) : \
274
+ Qnil;
275
+ }
276
+
277
+ static int
278
+ magic_fileno(VALUE object)
279
+ {
280
+ int fd;
281
+ rb_io_t *io;
282
+
283
+ if (rb_respond_to(object, rb_intern("fileno"))) {
284
+ object = rb_funcall(object, rb_intern("fileno"), 0);
285
+ return NUM2INT(object);
286
+ }
287
+
288
+ if (!FILE_P(object))
289
+ object = rb_convert_type(object, T_FILE, "IO", "to_io");
290
+
291
+ GetOpenFile(object, io);
292
+ if ((fd = FPTR_TO_FD(io)) < 0)
293
+ rb_raise(rb_eIOError, "closed stream");
294
+
295
+ return fd;
296
+ }
297
+
298
+ static inline VALUE
299
+ magic_path(VALUE object)
300
+ {
301
+ if (STRING_P(object))
302
+ return object;
303
+
304
+ if (rb_respond_to(object, rb_intern("to_path")))
305
+ return rb_funcall(object, rb_intern("to_path"), 0);
306
+
307
+ if (rb_respond_to(object, rb_intern("path")))
308
+ return rb_funcall(object, rb_intern("path"), 0);
309
+
310
+ if (rb_respond_to(object, rb_intern("to_s")))
311
+ return rb_funcall(object, rb_intern("to_s"), 0);
312
+
313
+ return Qnil;
314
+ }
315
+
316
+ static inline void
317
+ magic_check_type(VALUE object, RVALUE_TYPE type)
318
+ {
319
+ VALUE boolean = Qundef;
320
+
321
+ boolean = rb_obj_is_kind_of(object, T_INTEGER);
322
+ if (type == T_FIXNUM && !RVAL2CBOOL(boolean))
323
+ MAGIC_ARGUMENT_TYPE_ERROR(object, rb_class2name(T_INTEGER));
324
+
325
+ MAGIC_CHECK_RUBY_TYPE(object, type);
326
+ }
204
327
 
205
- return Qnil;
328
+ static inline void
329
+ magic_check_type_array_of_strings(VALUE object)
330
+ {
331
+ VALUE value = Qundef;
332
+
333
+ for (int i = 0; i < RARRAY_LEN(object); i++) {
334
+ value = RARRAY_AREF(object, (long)i);
335
+ if (NIL_P(value) || !STRING_P(value))
336
+ rb_raise(rb_eTypeError,
337
+ error(E_ARGUMENT_TYPE_ARRAY_STRINGS),
338
+ CLASS_NAME(value));
339
+ }
206
340
  }
207
341
 
208
- RUBY_EXTERN ID id_at_flags, id_at_path, id_at_mutex;
342
+ static int rb_mgc_do_not_auto_load;
343
+ static int rb_mgc_do_not_stop_on_error;
344
+ static int rb_mgc_warning;
345
+
346
+ static ID id_at_flags;
347
+ static ID id_at_paths;
348
+
349
+ static VALUE rb_cMagic;
350
+
351
+ static VALUE rb_mgc_eError;
352
+ static VALUE rb_mgc_eMagicError;
353
+ static VALUE rb_mgc_eLibraryError;
354
+ static VALUE rb_mgc_eNotImplementedError;
355
+ static VALUE rb_mgc_eParameterError;
356
+ static VALUE rb_mgc_eFlagsError;
357
+
358
+ static const rb_data_type_t rb_magic_type;
209
359
 
210
- RUBY_EXTERN VALUE rb_cMagic;
360
+ void Init_magic(void);
211
361
 
212
- RUBY_EXTERN VALUE rb_mgc_eError;
213
- RUBY_EXTERN VALUE rb_mgc_eMagicError;
214
- RUBY_EXTERN VALUE rb_mgc_eLibraryError;
215
- RUBY_EXTERN VALUE rb_mgc_eFlagsError;
216
- RUBY_EXTERN VALUE rb_mgc_eNotImplementedError;
362
+ VALUE rb_mgc_get_do_not_auto_load_global(VALUE object);
363
+ VALUE rb_mgc_set_do_not_auto_load_global(VALUE object, VALUE value);
364
+ VALUE rb_mgc_get_do_not_stop_on_error_global(VALUE object);
365
+ VALUE rb_mgc_set_do_not_stop_on_error_global(VALUE object, VALUE value);
217
366
 
218
- RUBY_EXTERN VALUE rb_mgc_initialize(VALUE object, VALUE arguments);
367
+ VALUE rb_mgc_initialize(VALUE object, VALUE arguments);
219
368
 
220
- RUBY_EXTERN VALUE rb_mgc_close(VALUE object);
221
- RUBY_EXTERN VALUE rb_mgc_closed(VALUE object);
369
+ VALUE rb_mgc_get_do_not_stop_on_error(VALUE object);
370
+ VALUE rb_mgc_set_do_not_stop_on_error(VALUE object, VALUE value);
222
371
 
223
- RUBY_EXTERN VALUE rb_mgc_get_path(VALUE object);
372
+ VALUE rb_mgc_open_p(VALUE object);
373
+ VALUE rb_mgc_close(VALUE object);
374
+ VALUE rb_mgc_close_p(VALUE object);
224
375
 
225
- RUBY_EXTERN VALUE rb_mgc_get_flags(VALUE object);
226
- RUBY_EXTERN VALUE rb_mgc_set_flags(VALUE object, VALUE value);
376
+ VALUE rb_mgc_get_paths(VALUE object);
227
377
 
228
- RUBY_EXTERN VALUE rb_mgc_load(VALUE object, VALUE arguments);
229
- RUBY_EXTERN VALUE rb_mgc_compile(VALUE object, VALUE arguments);
230
- RUBY_EXTERN VALUE rb_mgc_check(VALUE object, VALUE arguments);
378
+ VALUE rb_mgc_get_parameter(VALUE object, VALUE tag);
379
+ VALUE rb_mgc_set_parameter(VALUE object, VALUE tag, VALUE value);
231
380
 
232
- RUBY_EXTERN VALUE rb_mgc_file(VALUE object, VALUE value);
233
- RUBY_EXTERN VALUE rb_mgc_buffer(VALUE object, VALUE value);
234
- RUBY_EXTERN VALUE rb_mgc_descriptor(VALUE object, VALUE value);
381
+ VALUE rb_mgc_get_flags(VALUE object);
382
+ VALUE rb_mgc_set_flags(VALUE object, VALUE value);
235
383
 
236
- RUBY_EXTERN VALUE rb_mgc_version(VALUE object);
384
+ VALUE rb_mgc_load(VALUE object, VALUE arguments);
385
+ VALUE rb_mgc_load_buffers(VALUE object, VALUE arguments);
386
+ VALUE rb_mgc_load_p(VALUE object);
387
+
388
+ VALUE rb_mgc_compile(VALUE object, VALUE arguments);
389
+ VALUE rb_mgc_check(VALUE object, VALUE arguments);
390
+
391
+ VALUE rb_mgc_file(VALUE object, VALUE value);
392
+ VALUE rb_mgc_buffer(VALUE object, VALUE value);
393
+ VALUE rb_mgc_descriptor(VALUE object, VALUE value);
394
+
395
+ VALUE rb_mgc_version(VALUE object);
396
+
397
+ static VALUE magic_get_parameter_internal(void *data);
398
+ static VALUE magic_set_parameter_internal(void *data);
399
+
400
+ static VALUE magic_get_flags_internal(void *data);
401
+ static VALUE magic_set_flags_internal(void *data);
402
+
403
+ static VALUE magic_load_internal(void *data);
404
+ static VALUE magic_load_buffers_internal(void *data);
405
+
406
+ static VALUE magic_compile_internal(void *data);
407
+ static VALUE magic_check_internal(void *data);
408
+
409
+ static VALUE magic_file_internal(void *data);
410
+ static VALUE magic_buffer_internal(void *data);
411
+ static VALUE magic_descriptor_internal(void *data);
412
+
413
+ static VALUE magic_close_internal(void *data);
414
+
415
+ static void* nogvl_magic_load(void *data);
416
+ static void* nogvl_magic_compile(void *data);
417
+ static void* nogvl_magic_check(void *data);
418
+ static void* nogvl_magic_file(void *data);
419
+ static void* nogvl_magic_descriptor(void *data);
420
+
421
+ static void* magic_library_open(void);
422
+ static void magic_library_close(void *data);
423
+
424
+ static VALUE magic_allocate(VALUE klass);
425
+ static void magic_mark(void *data);
426
+ static void magic_free(void *data);
427
+ static size_t magic_size(const void *data);
428
+ #if defined(HAVE_RUBY_GC_COMPACT)
429
+ static void magic_compact(void *data);
430
+ #endif
431
+
432
+ static VALUE magic_exception_wrapper(VALUE value);
433
+ static VALUE magic_exception(void *data);
434
+
435
+ static VALUE magic_library_error(VALUE klass, void *data);
436
+ static VALUE magic_generic_error(VALUE klass, int magic_errno,
437
+ const char *magic_error);
438
+
439
+ static VALUE magic_lock(VALUE object, VALUE (*function)(ANYARGS),
440
+ void *data);
441
+ static VALUE magic_unlock(VALUE object);
442
+
443
+ static VALUE magic_return(void *data);
444
+
445
+ static int magic_get_flags(VALUE object);
446
+ static int magic_set_flags(VALUE object, VALUE value);
447
+
448
+ static VALUE magic_set_paths(VALUE object, VALUE value);
237
449
 
238
450
  #if defined(__cplusplus)
239
451
  }
240
452
  #endif
241
453
 
242
454
  #endif /* _RUBY_MAGIC_H */
243
-
244
- /* vim: set ts=8 sw=4 sts=2 et : */