2 ** $Id: lobject.c,v 2.22 2006/02/10 17:43:52 roberto Exp $
3 ** Some generic functions over Lua objects
4 ** See Copyright Notice in lua.h
28 const TValue luaO_nilobject_
= {{NULL
}, LUA_TNIL
};
32 ** converts an integer to a "floating point byte", represented as
33 ** (eeeeexxx), where the real value is (1xxx) * 2^(eeeee - 1) if
34 ** eeeee != 0 and (xxx) otherwise.
36 int luaO_int2fb (unsigned int x
) {
37 int e
= 0; /* expoent */
43 else return ((e
+1) << 3) | (cast_int(x
) - 8);
48 int luaO_fb2int (int x
) {
49 int e
= (x
>> 3) & 31;
51 else return ((x
& 7)+8) << (e
- 1);
55 int luaO_log2 (unsigned int x
) {
56 static const lu_byte log_2
[256] = {
57 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,
58 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,
59 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,
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 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,
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
67 while (x
>= 256) { l
+= 8; x
>>= 8; }
73 lu_bool
luaO_rawequalObj (const TValue
*t1
, const TValue
*t2
) {
74 if (ttype(t1
) != ttype(t2
)) return 0;
75 else switch (ttype(t1
)) {
81 if (!luai_numeq( nvalue_img_fast(t1
), nvalue_img_fast(t2
) )) return 0;
83 return luai_numeq(nvalue_fast(t1
), nvalue_fast(t2
));
85 return ivalue(t1
) == ivalue(t2
);
87 return luai_numeq(nvalue(t1
), nvalue(t2
));
90 return bvalue(t1
) == bvalue(t2
); /* boolean true must be 1 !! */
91 case LUA_TLIGHTUSERDATA
:
92 return pvalue(t1
) == pvalue(t2
);
94 lua_assert(iscollectable(t1
));
95 return gcvalue(t1
) == gcvalue(t2
);
99 static void pushstr (lua_State
*L
, const char *str
) {
100 setsvalue2s(L
, L
->top
, luaS_new(L
, str
));
105 /* this function handles only `%d', `%c', %f, %p, and `%s' formats */
106 const char *luaO_pushvfstring (lua_State
*L
, const char *fmt
, va_list argp
) {
110 const char *e
= strchr(fmt
, '%');
111 if (e
== NULL
) break;
112 setsvalue2s(L
, L
->top
, luaS_newlstr(L
, fmt
, e
-fmt
));
116 const char *s
= va_arg(argp
, char *);
117 if (s
== NULL
) s
= "(null)";
123 buff
[0] = cast(char, va_arg(argp
, int));
130 //in 5.1.1: setivalue(L->top, va_arg(argp, int));
131 setivalue(L
->top
, (lua_Integer
) va_arg(argp
, l_uacInteger
));
133 setivalue(L
->top
, va_arg(argp
, int));
139 setnvalue(L
->top
, cast_num(va_arg(argp
, l_uacNumber
)));
144 char buff
[4*sizeof(void *) + 8]; /* should be enough space for a `%p' */
145 sprintf(buff
, "%p", va_arg(argp
, void *));
166 luaV_concat(L
, n
+1, cast_int(L
->top
- L
->base
) - 1);
168 return svalue(L
->top
- 1);
172 const char *luaO_pushfstring (lua_State
*L
, const char *fmt
, ...) {
176 msg
= luaO_pushvfstring(L
, fmt
, argp
);
182 void luaO_chunkid (char *out
, const char *source
, size_t bufflen
) {
183 if (*source
== '=') {
184 strncpy(out
, source
+1, bufflen
); /* remove first char */
185 out
[bufflen
-1] = '\0'; /* ensures null termination */
187 else { /* out = "source", or "...source" */
188 if (*source
== '@') {
190 source
++; /* skip the `@' */
191 bufflen
-= sizeof(" '...' ");
195 source
+= (l
-bufflen
); /* get last part of file name */
200 else { /* out = [string "string"] */
201 size_t len
= strcspn(source
, "\n\r"); /* stop at first newline */
202 bufflen
-= sizeof(" [string \"...\"] ");
203 if (len
> bufflen
) len
= bufflen
;
204 strcpy(out
, "[string \"");
205 if (source
[len
] != '\0') { /* must truncate? */
206 strncat(out
, source
, len
);