2 ** $Id: lobject.c,v 2.22.1.1 2007/12/27 13:02:25 roberto Exp $
3 ** Some generic functions over Lua objects
4 ** See Copyright Notice in lua.h
29 const TValue luaO_nilobject_
= {{NULL
}, LUA_TNIL
};
33 ** converts an integer to a "floating point byte", represented as
34 ** (eeeeexxx), where the real value is (1xxx) * 2^(eeeee - 1) if
35 ** eeeee != 0 and (xxx) otherwise.
37 int luaO_int2fb (unsigned int x
) {
38 int e
= 0; /* expoent */
44 else return ((e
+1) << 3) | (cast_int(x
) - 8);
49 int luaO_fb2int (int x
) {
50 int e
= (x
>> 3) & 31;
52 else return ((x
& 7)+8) << (e
- 1);
56 int luaO_log2 (unsigned int x
) {
57 static const lu_byte log_2
[256] = {
58 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
59 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
60 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
61 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
62 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
63 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
64 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
65 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
68 while (x
>= 256) { l
+= 8; x
>>= 8; }
74 int luaO_rawequalObj (const TValue
*t1
, const TValue
*t2
) {
75 if (ttype(t1
) != ttype(t2
)) return 0;
76 else switch (ttype(t1
)) {
80 return luai_numeq(nvalue(t1
), nvalue(t2
));
82 return bvalue(t1
) == bvalue(t2
); /* boolean true must be 1 !! */
83 case LUA_TLIGHTUSERDATA
:
84 return pvalue(t1
) == pvalue(t2
);
86 lua_assert(iscollectable(t1
));
87 return gcvalue(t1
) == gcvalue(t2
);
92 int luaO_str2d (const char *s
, lua_Number
*result
) {
94 *result
= lua_str2number(s
, &endptr
);
95 if (endptr
== s
) return 0; /* conversion failed */
96 if (*endptr
== 'x' || *endptr
== 'X') /* maybe an hexadecimal constant? */
97 *result
= cast_num(strtoul(s
, &endptr
, 16));
98 if (*endptr
== '\0') return 1; /* most common case */
99 while (isspace(cast(unsigned char, *endptr
))) endptr
++;
100 if (*endptr
!= '\0') return 0; /* invalid trailing characters? */
106 static void pushstr (lua_State
*L
, const char *str
) {
107 setsvalue2s(L
, L
->top
, luaS_new(L
, str
));
112 /* this function handles only `%d', `%c', %f, %p, and `%s' formats */
113 const char *luaO_pushvfstring (lua_State
*L
, const char *fmt
, va_list argp
) {
117 const char *e
= strchr(fmt
, '%');
118 if (e
== NULL
) break;
119 setsvalue2s(L
, L
->top
, luaS_newlstr(L
, fmt
, e
-fmt
));
123 const char *s
= va_arg(argp
, char *);
124 if (s
== NULL
) s
= "(null)";
130 buff
[0] = cast(char, va_arg(argp
, int));
136 setnvalue(L
->top
, cast_num(va_arg(argp
, int)));
141 setnvalue(L
->top
, cast_num(va_arg(argp
, l_uacNumber
)));
146 char buff
[4*sizeof(void *) + 8]; /* should be enough space for a `%p' */
147 snprintf(buff
, sizeof (buff
), "%p", va_arg(argp
, void *));
168 luaV_concat(L
, n
+1, cast_int(L
->top
- L
->base
) - 1);
170 return svalue(L
->top
- 1);
174 const char *luaO_pushfstring (lua_State
*L
, const char *fmt
, ...) {
178 msg
= luaO_pushvfstring(L
, fmt
, argp
);
184 void luaO_chunkid (char *out
, const char *source
, size_t bufflen
) {
185 if (*source
== '=') {
186 strncpy(out
, source
+1, bufflen
); /* remove first char */
187 out
[bufflen
-1] = '\0'; /* ensures null termination */
189 else { /* out = "source", or "...source" */
190 if (*source
== '@') {
192 source
++; /* skip the `@' */
193 bufflen
-= sizeof(" '...' ");
197 source
+= (l
-bufflen
); /* get last part of file name */
202 else { /* out = [string "string"] */
203 size_t len
= strcspn(source
, "\n\r"); /* stop at first newline */
204 bufflen
-= sizeof(" [string \"...\"] ");
205 if (len
> bufflen
) len
= bufflen
;
206 strcpy(out
, "[string \"");
207 if (source
[len
] != '\0') { /* must truncate? */
208 strncat(out
, source
, len
);