1 /**********************************************************************
6 created at: Thu Jun 10 14:26:32 JST 1993
8 Copyright (C) 1993-2000 Yukihiro Matsumoto
9 Copyright (C) 2000 Network Applied Communication Laboratory, Inc.
10 Copyright (C) 2000 Information-technology Promotion Agency, Japan
12 **********************************************************************/
17 #if defined(__cplusplus)
37 /* need to include <ctype.h> to use these macros */
39 #define ISPRINT(c) isprint((unsigned char)(c))
40 #define ISSPACE(c) isspace((unsigned char)(c))
41 #define ISUPPER(c) isupper((unsigned char)(c))
42 #define ISLOWER(c) islower((unsigned char)(c))
43 #define ISALNUM(c) isalnum((unsigned char)(c))
44 #define ISALPHA(c) isalpha((unsigned char)(c))
45 #define ISDIGIT(c) isdigit((unsigned char)(c))
46 #define ISXDIGIT(c) isxdigit((unsigned char)(c))
53 #ifdef HAVE_PROTOTYPES
60 #ifdef HAVE_STDARG_PROTOTYPES
61 # define __(args) args
66 #ifdef HAVE_ATTR_NORETURN
67 # define NORETURN __attribute__ ((noreturn))
72 #if defined(HAVE_ALLOCA_H) && !defined(__GNUC__)
80 #if SIZEOF_LONG != SIZEOF_VOIDP
81 ---->> ruby requires sizeof(void*) == sizeof(long) to be compiled. <<----
83 typedef unsigned long VALUE;
84 typedef unsigned long ID;
93 /* assuming 32bit(2's compliment) long */
94 # define LONG_MAX 2147483647
98 # define LONG_MIN (-LONG_MAX-1)
105 #define FIXNUM_MAX (LONG_MAX>>1)
106 #define FIXNUM_MIN RSHIFT((long)LONG_MIN,1)
108 #define FIXNUM_FLAG 0x01
109 #define INT2FIX(i) ((VALUE)(((long)(i))<<1 | FIXNUM_FLAG))
110 #define rb_fix_new(v) INT2FIX(v)
111 VALUE rb_int2inum _((long));
112 #define INT2NUM(v) rb_int2inum(v)
113 #define rb_int_new(v) rb_int2inum(v)
114 VALUE rb_uint2inum _((unsigned long));
115 #define UINT2NUM(v) rb_uint2inum(v)
116 #define rb_uint_new(v) rb_uint2inum(v)
118 #define FIX2LONG(x) RSHIFT((long)x,1)
119 #define FIX2ULONG(x) (((unsigned long)(x))>>1)
120 #define FIXNUM_P(f) (((long)(f))&FIXNUM_FLAG)
121 #define POSFIXABLE(f) ((f) <= FIXNUM_MAX)
122 #define NEGFIXABLE(f) ((f) >= FIXNUM_MIN)
123 #define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f))
125 #define IMMEDIATE_MASK 0x03
126 #define IMMEDIATE_P(x) ((VALUE)(x) & IMMEDIATE_MASK)
128 #define SYMBOL_FLAG 0x0e
129 #define SYMBOL_P(x) (((VALUE)(x)&0xff)==SYMBOL_FLAG)
130 #define ID2SYM(x) ((VALUE)(((long)(x))<<8|SYMBOL_FLAG))
131 #define SYM2ID(x) RSHIFT((long)x,8)
133 /* special contants - i.e. non-zero and non-fixnum constants */
137 #define Qundef 6 /* undefined value for placeholder */
139 #define RTEST(v) (((VALUE)(v) & ~Qnil) != 0)
140 #define NIL_P(v) ((VALUE)(v) == Qnil)
142 #define CLASS_OF(v) rb_class_of((VALUE)(v))
147 #define T_OBJECT 0x02
149 #define T_ICLASS 0x04
150 #define T_MODULE 0x05
152 #define T_STRING 0x07
153 #define T_REGEXP 0x08
155 #define T_FIXNUM 0x0a
157 #define T_STRUCT 0x0c
158 #define T_BIGNUM 0x0d
165 #define T_SYMBOL 0x24
167 #define T_BLKTAG 0x3b
169 #define T_VARMAP 0x3d
175 #define BUILTIN_TYPE(x) (((struct RBasic*)(x))->flags & T_MASK)
177 #define TYPE(x) rb_type((VALUE)(x))
179 void rb_check_type _((VALUE,int));
180 #define Check_Type(v,t) rb_check_type((VALUE)(v),t)
181 void rb_check_safe_str _((VALUE));
182 #define Check_SafeStr(v) rb_check_safe_str((VALUE)(v))
183 void rb_secure _((int));
185 EXTERN int ruby_safe_level;
186 #define rb_safe_level() (ruby_safe_level)
187 void rb_set_safe_level _((int));
189 long rb_num2long _((VALUE));
190 unsigned long rb_num2ulong _((VALUE));
191 #define NUM2LONG(x) (FIXNUM_P(x)?FIX2LONG(x):rb_num2long((VALUE)x))
192 #define NUM2ULONG(x) rb_num2ulong((VALUE)x)
193 #if SIZEOF_INT < SIZEOF_LONG
194 int rb_num2int _((VALUE));
195 #define NUM2INT(x) (FIXNUM_P(x)?FIX2INT(x):rb_num2int((VALUE)x))
196 int rb_fix2int _((VALUE));
197 #define FIX2INT(x) rb_fix2int((VALUE)x)
198 #define NUM2UINT(x) ((unsigned int)NUM2INT(x))
199 #define FIX2UINT(x) ((unsigned int)FIX2INT(x))
201 #define NUM2INT(x) NUM2LONG(x)
202 #define NUM2UINT(x) NUM2ULONG(x)
203 #define FIX2INT(x) FIX2LONG(x)
204 #define FIX2UINT(x) FIX2ULONG(x)
207 double rb_num2dbl _((VALUE));
208 #define NUM2DBL(x) rb_num2dbl((VALUE)(x))
210 char *rb_str2cstr _((VALUE,int*));
211 #define str2cstr(x,l) rb_str2cstr((VALUE)(x),(l))
212 #define STR2CSTR(x) rb_str2cstr((VALUE)(x),0)
214 #define NUM2CHR(x) (((TYPE(x) == T_STRING)&&(RSTRING(x)->len>=1))?\
215 RSTRING(x)->ptr[0]:(char)(NUM2INT(x)&0xff))
216 #define CHR2FIX(x) INT2FIX((long)((x)&0xff))
218 VALUE rb_newobj _((void));
219 #define NEWOBJ(obj,type) type *obj = (type*)rb_newobj()
220 #define OBJSETUP(obj,c,t) {\
221 RBASIC(obj)->flags = (t);\
222 RBASIC(obj)->klass = (c);\
223 if (rb_safe_level() >= 3) FL_SET(obj, FL_TAINT);\
225 #define CLONESETUP(clone,obj) do {\
226 OBJSETUP(clone,rb_singleton_class_clone(RBASIC(obj)->klass),RBASIC(obj)->flags);\
227 rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);\
228 if (FL_TEST(obj, FL_EXIVAR)) rb_clone_generic_ivar((VALUE)clone,(VALUE)obj);\
238 struct st_table *iv_tbl;
243 struct st_table *iv_tbl;
244 struct st_table *m_tbl;
268 struct re_pattern_buffer *ptr;
275 struct st_table *tbl;
282 struct OpenFile *fptr;
287 void (*dmark) _((void*));
288 void (*dfree) _((void*));
292 #define DATA_PTR(dta) (RDATA(dta)->data)
295 #define RUBY_DATA_FUNC(func) ((void (*)_((void*)))func)
297 typedef void (*RUBY_DATA_FUNC) _((void*));
299 VALUE rb_data_object_alloc _((VALUE,void*,RUBY_DATA_FUNC,RUBY_DATA_FUNC));
301 #define Data_Wrap_Struct(klass,mark,free,sval) (\
302 rb_data_object_alloc(klass,sval,(RUBY_DATA_FUNC)mark,(RUBY_DATA_FUNC)free)\
305 #define Data_Make_Struct(klass,type,mark,free,sval) (\
307 memset(sval, 0, sizeof(type)),\
308 Data_Wrap_Struct(klass,mark,free,sval)\
311 #define Data_Get_Struct(obj,type,sval) {\
312 Check_Type(obj, T_DATA); \
313 sval = (type*)DATA_PTR(obj);\
329 #define R_CAST(st) (struct st*)
330 #define RBASIC(obj) (R_CAST(RBasic)(obj))
331 #define ROBJECT(obj) (R_CAST(RObject)(obj))
332 #define RCLASS(obj) (R_CAST(RClass)(obj))
333 #define RMODULE(obj) RCLASS(obj)
334 #define RFLOAT(obj) (R_CAST(RFloat)(obj))
335 #define RSTRING(obj) (R_CAST(RString)(obj))
336 #define RREGEXP(obj) (R_CAST(RRegexp)(obj))
337 #define RARRAY(obj) (R_CAST(RArray)(obj))
338 #define RHASH(obj) (R_CAST(RHash)(obj))
339 #define RDATA(obj) (R_CAST(RData)(obj))
340 #define RSTRUCT(obj) (R_CAST(RStruct)(obj))
341 #define RBIGNUM(obj) (R_CAST(RBignum)(obj))
342 #define RFILE(obj) (R_CAST(RFile)(obj))
344 #define FL_SINGLETON FL_USER0
345 #define FL_MARK (1<<6)
346 #define FL_FINALIZE (1<<7)
347 #define FL_TAINT (1<<8)
348 #define FL_EXIVAR (1<<9)
349 #define FL_FREEZE (1<<10)
353 #define FL_USER0 (1<<(FL_USHIFT+0))
354 #define FL_USER1 (1<<(FL_USHIFT+1))
355 #define FL_USER2 (1<<(FL_USHIFT+2))
356 #define FL_USER3 (1<<(FL_USHIFT+3))
357 #define FL_USER4 (1<<(FL_USHIFT+4))
358 #define FL_USER5 (1<<(FL_USHIFT+5))
359 #define FL_USER6 (1<<(FL_USHIFT+6))
360 #define FL_USER7 (1<<(FL_USHIFT+7))
362 #define FL_UMASK (0xff<<FL_USHIFT)
364 #define SPECIAL_CONST_P(x) (IMMEDIATE_P(x) || !RTEST(x))
366 #define FL_ABLE(x) (!SPECIAL_CONST_P(x))
367 #define FL_TEST(x,f) (FL_ABLE(x)?(RBASIC(x)->flags&(f)):0)
368 #define FL_SET(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags |= (f);} while (0)
369 #define FL_UNSET(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags &= ~(f);} while (0)
370 #define FL_REVERSE(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags ^= (f);} while (0)
372 #define OBJ_TAINTED(x) FL_TEST((x), FL_TAINT)
373 #define OBJ_TAINT(x) FL_SET((x), FL_TAINT)
374 #define OBJ_INFECT(x,s) do {if (FL_ABLE(x) && FL_ABLE(s)) RBASIC(x)->flags |= RBASIC(s)->flags & FL_TAINT;} while (0)
376 #define OBJ_FROZEN(x) FL_TEST((x), FL_FREEZE)
377 #define OBJ_FREEZE(x) FL_SET((x), FL_FREEZE)
379 #define xmalloc ruby_xmalloc
380 #define xcalloc ruby_xcalloc
381 #define xrealloc ruby_xrealloc
382 #define xfree ruby_xfree
384 void *xmalloc _((long));
385 void *xcalloc _((long,long));
386 void *xrealloc _((void*,long));
387 void xfree _((void*));
389 #define ALLOC_N(type,n) (type*)xmalloc(sizeof(type)*(n))
390 #define ALLOC(type) (type*)xmalloc(sizeof(type))
391 #define REALLOC_N(var,type,n) (var)=(type*)xrealloc((char*)(var),sizeof(type)*(n))
393 #define ALLOCA_N(type,n) (type*)alloca(sizeof(type)*(n))
395 #define MEMZERO(p,type,n) memset((p), 0, sizeof(type)*(n))
396 #define MEMCPY(p1,p2,type,n) memcpy((p1), (p2), sizeof(type)*(n))
397 #define MEMMOVE(p1,p2,type,n) memmove((p1), (p2), sizeof(type)*(n))
398 #define MEMCMP(p1,p2,type,n) memcmp((p1), (p2), sizeof(type)*(n))
400 void rb_glob _((char*,void(*)(),VALUE));
401 void rb_iglob _((char*,void(*)(),VALUE));
403 VALUE rb_define_class _((const char*,VALUE));
404 VALUE rb_define_module _((const char*));
405 VALUE rb_define_class_under _((VALUE, const char*, VALUE));
406 VALUE rb_define_module_under _((VALUE, const char*));
408 void rb_include_module _((VALUE,VALUE));
409 void rb_extend_object _((VALUE,VALUE));
411 void rb_define_variable _((const char*,VALUE*));
412 void rb_define_virtual_variable _((const char*,VALUE(*)(),void(*)()));
413 void rb_define_hooked_variable _((const char*,VALUE*,VALUE(*)(),void(*)()));
414 void rb_define_readonly_variable _((const char*,VALUE*));
415 void rb_define_const _((VALUE,const char*,VALUE));
416 void rb_define_global_const _((const char*,VALUE));
418 #define RUBY_METHOD_FUNC(func) ((VALUE (*)__((...)))func)
419 void rb_define_method _((VALUE,const char*,VALUE(*)(),int));
420 void rb_define_module_function _((VALUE,const char*,VALUE(*)(),int));
421 void rb_define_global_function _((const char*,VALUE(*)(),int));
423 void rb_undef_method _((VALUE,const char*));
424 void rb_define_alias _((VALUE,const char*,const char*));
425 void rb_define_attr _((VALUE,const char*,int,int));
427 void rb_global_variable _((VALUE*));
428 void rb_gc_register_address _((VALUE*));
429 void rb_gc_unregister_address _((VALUE*));
431 ID rb_intern _((const char*));
432 char *rb_id2name _((ID));
433 ID rb_to_id _((VALUE));
435 char *rb_class2name _((VALUE));
437 void rb_p _((VALUE));
439 VALUE rb_eval_string _((const char*));
440 VALUE rb_eval_string_protect _((const char*, int*));
441 VALUE rb_eval_string_wrap _((const char*, int*));
442 VALUE rb_funcall __((VALUE, ID, int, ...));
443 VALUE rb_funcall2 _((VALUE, ID, int, VALUE*));
444 VALUE rb_funcall3 _((VALUE, ID, int, VALUE*));
445 int rb_scan_args __((int, VALUE*, const char*, ...));
446 VALUE rb_call_super _((int, VALUE*));
448 VALUE rb_gv_set _((const char*, VALUE));
449 VALUE rb_gv_get _((const char*));
450 VALUE rb_iv_get _((VALUE, const char*));
451 VALUE rb_iv_set _((VALUE, const char*, VALUE));
453 VALUE rb_equal _((VALUE,VALUE));
455 EXTERN VALUE ruby_verbose, ruby_debug;
457 void rb_raise __((VALUE, const char*, ...)) NORETURN;
458 void rb_fatal __((const char*, ...)) NORETURN;
459 void rb_bug __((const char*, ...)) NORETURN;
460 void rb_sys_fail _((const char*)) NORETURN;
461 void rb_iter_break _((void)) NORETURN;
462 void rb_exit _((int)) NORETURN;
463 void rb_notimplement _((void)) NORETURN;
465 void rb_warn __((const char*, ...));
466 void rb_warning __((const char*, ...)); /* reports if `-w' specified */
468 VALUE rb_each _((VALUE));
469 VALUE rb_yield _((VALUE));
470 int rb_block_given_p _((void));
471 VALUE rb_iterate _((VALUE(*)(),VALUE,VALUE(*)(),VALUE));
472 VALUE rb_rescue _((VALUE(*)(),VALUE,VALUE(*)(),VALUE));
473 VALUE rb_rescue2 __((VALUE(*)(),VALUE,VALUE(*)(),VALUE,...));
474 VALUE rb_ensure _((VALUE(*)(),VALUE,VALUE(*)(),VALUE));
475 VALUE rb_catch _((const char*,VALUE(*)(),VALUE));
476 void rb_throw _((const char*,VALUE)) NORETURN;
478 VALUE rb_require _((const char*));
480 void ruby_init _((void));
481 void ruby_options _((int, char**));
482 void ruby_run _((void));
484 EXTERN VALUE rb_mKernel;
485 EXTERN VALUE rb_mComparable;
486 EXTERN VALUE rb_mEnumerable;
487 EXTERN VALUE rb_mPrecision;
488 EXTERN VALUE rb_mErrno;
489 EXTERN VALUE rb_mFileTest;
491 EXTERN VALUE rb_mMath;
492 EXTERN VALUE rb_mProcess;
494 EXTERN VALUE rb_cObject;
495 EXTERN VALUE rb_cArray;
496 EXTERN VALUE rb_cBignum;
497 EXTERN VALUE rb_cClass;
498 EXTERN VALUE rb_cDir;
499 EXTERN VALUE rb_cData;
500 EXTERN VALUE rb_cFalseClass;
501 EXTERN VALUE rb_cFile;
502 EXTERN VALUE rb_cFixnum;
503 EXTERN VALUE rb_cFloat;
504 EXTERN VALUE rb_cHash;
505 EXTERN VALUE rb_cInteger;
507 EXTERN VALUE rb_cModule;
508 EXTERN VALUE rb_cNilClass;
509 EXTERN VALUE rb_cNumeric;
510 EXTERN VALUE rb_cProc;
511 EXTERN VALUE rb_cRange;
512 EXTERN VALUE rb_cRegexp;
513 EXTERN VALUE rb_cString;
514 EXTERN VALUE rb_cSymbol;
515 EXTERN VALUE rb_cThread;
516 EXTERN VALUE rb_cTime;
517 EXTERN VALUE rb_cTrueClass;
518 EXTERN VALUE rb_cStruct;
520 EXTERN VALUE rb_eException;
521 EXTERN VALUE rb_eStandardError;
522 EXTERN VALUE rb_eSystemExit;
523 EXTERN VALUE rb_eInterrupt;
524 EXTERN VALUE rb_eSignal;
525 EXTERN VALUE rb_eFatal;
526 EXTERN VALUE rb_eArgError;
527 EXTERN VALUE rb_eEOFError;
528 EXTERN VALUE rb_eIndexError;
529 EXTERN VALUE rb_eRangeError;
530 EXTERN VALUE rb_eIOError;
531 EXTERN VALUE rb_eRuntimeError;
532 EXTERN VALUE rb_eSecurityError;
533 EXTERN VALUE rb_eSystemCallError;
534 EXTERN VALUE rb_eTypeError;
535 EXTERN VALUE rb_eZeroDivError;
536 EXTERN VALUE rb_eNotImpError;
537 EXTERN VALUE rb_eNoMemError;
538 EXTERN VALUE rb_eFloatDomainError;
540 EXTERN VALUE rb_eScriptError;
541 EXTERN VALUE rb_eNameError;
542 EXTERN VALUE rb_eSyntaxError;
543 EXTERN VALUE rb_eLoadError;
546 #if defined(__cplusplus)
547 rb_class_of(VALUE obj)
553 if (FIXNUM_P(obj)) return rb_cFixnum;
554 if (obj == Qnil) return rb_cNilClass;
555 if (obj == Qfalse) return rb_cFalseClass;
556 if (obj == Qtrue) return rb_cTrueClass;
557 if (SYMBOL_P(obj)) return rb_cSymbol;
559 return RBASIC(obj)->klass;
563 #if defined(__cplusplus)
570 if (FIXNUM_P(obj)) return T_FIXNUM;
571 if (obj == Qnil) return T_NIL;
572 if (obj == Qfalse) return T_FALSE;
573 if (obj == Qtrue) return T_TRUE;
574 if (obj == Qundef) return T_UNDEF;
575 if (SYMBOL_P(obj)) return T_SYMBOL;
576 return BUILTIN_TYPE(obj);
580 #if defined(__cplusplus)
581 rb_special_const_p(VALUE obj)
583 rb_special_const_p(obj)
587 if (SPECIAL_CONST_P(obj)) return Qtrue;
593 #if defined(EXTLIB) && defined(USE_DLN_A_OUT)
594 /* hook for external modules */
595 static char *dln_libs_to_be_linked[] = { EXTLIB, 0 };
599 #define rb_sys_stat stat
602 #if defined(__cplusplus)
606 #endif /* ifndef RUBY_H */