gateway: simplify stopping the cleanup timer
[olsrd.git] / lib / tas / src / lua / lobject.c
1
2 /*
3 ** $Id: lobject.c,v 1.97 2003/04/03 13:35:34 roberto Exp $
4 ** Some generic functions over Lua objects
5 ** See Copyright Notice in lua.h
6 */
7
8 #include <ctype.h>
9 #include <stdarg.h>
10 #include <stdlib.h>
11 #include <string.h>
12
13 #define lobject_c
14
15 #include "lua.h"
16
17 #include "ldo.h"
18 #include "lmem.h"
19 #include "lobject.h"
20 #include "lstate.h"
21 #include "lstring.h"
22 #include "lvm.h"
23
24
25 /* function to convert a string to a lua_Number */
26 #ifndef lua_str2number
27 #define lua_str2number(s,p)     strtod((s), (p))
28 #endif
29
30
31 const TObject luaO_nilobject = { LUA_TNIL, {NULL} };
32
33
34 /*
35 ** converts an integer to a "floating point byte", represented as
36 ** (mmmmmxxx), where the real value is (xxx) * 2^(mmmmm)
37 */
38 int
39 luaO_int2fb(unsigned int x)
40 {
41   int m = 0;                           /* mantissa */
42   while (x >= (1 << 3)) {
43     x = (x + 1) >> 1;
44     m++;
45   }
46   return (m << 3) | cast(int, x);
47 }
48
49
50 /* *INDENT-OFF* */
51 int luaO_log2 (unsigned int x) {
52   static const lu_byte log_8[255] = {
53     0,
54     1,1,
55     2,2,2,2,
56     3,3,3,3,3,3,3,3,
57     4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
58     5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,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     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,
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     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,
63     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,
64     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
65   };
66   if (x >= 0x00010000) {
67     if (x >= 0x01000000) return log_8[((x>>24) & 0xff) - 1]+24;
68     else return log_8[((x>>16) & 0xff) - 1]+16;
69   }
70   else {
71     if (x >= 0x00000100) return log_8[((x>>8) & 0xff) - 1]+8;
72     else if (x) return log_8[(x & 0xff) - 1];
73     return -1;  /* special `log' for 0 */
74   }
75 }
76 /* *INDENT-ON* */
77
78
79 int
80 luaO_rawequalObj(const TObject * t1, const TObject * t2)
81 {
82   if (ttype(t1) != ttype(t2))
83     return 0;
84   else
85     switch (ttype(t1)) {
86     case LUA_TNIL:
87       return 1;
88     case LUA_TNUMBER:
89       return nvalue(t1) == nvalue(t2);
90     case LUA_TBOOLEAN:
91       return bvalue(t1) == bvalue(t2);  /* boolean true must be 1 !! */
92     case LUA_TLIGHTUSERDATA:
93       return pvalue(t1) == pvalue(t2);
94     default:
95       lua_assert(iscollectable(t1));
96       return gcvalue(t1) == gcvalue(t2);
97     }
98 }
99
100
101 int
102 luaO_str2d(const char *s, lua_Number * result)
103 {
104   char *endptr;
105   lua_Number res = lua_str2number(s, &endptr);
106   if (endptr == s)
107     return 0;                   /* no conversion */
108   while (isspace((unsigned char)(*endptr)))
109     endptr++;
110   if (*endptr != '\0')
111     return 0;                   /* invalid trailing characters? */
112   *result = res;
113   return 1;
114 }
115
116
117
118 static void
119 pushstr(lua_State * L, const char *str)
120 {
121   setsvalue2s(L->top, luaS_new(L, str));
122   incr_top(L);
123 }
124
125
126 /* this function handles only `%d', `%c', %f, and `%s' formats */
127 const char *
128 luaO_pushvfstring(lua_State * L, const char *fmt, va_list argp)
129 {
130   int n = 1;
131   pushstr(L, "");
132   for (;;) {
133     const char *e = strchr(fmt, '%');
134     if (e == NULL)
135       break;
136     setsvalue2s(L->top, luaS_newlstr(L, fmt, e - fmt));
137     incr_top(L);
138     switch (*(e + 1)) {
139     case 's':
140       pushstr(L, va_arg(argp, char *));
141       break;
142     case 'c':{
143         char buff[2];
144         buff[0] = cast(char, va_arg(argp, int));
145         buff[1] = '\0';
146         pushstr(L, buff);
147         break;
148       }
149     case 'd':
150       setnvalue(L->top, cast(lua_Number, va_arg(argp, int)));
151       incr_top(L);
152       break;
153     case 'f':
154       setnvalue(L->top, cast(lua_Number, va_arg(argp, l_uacNumber)));
155       incr_top(L);
156       break;
157     case '%':
158       pushstr(L, "%");
159       break;
160     default:
161       lua_assert(0);
162     }
163     n += 2;
164     fmt = e + 2;
165   }
166   pushstr(L, fmt);
167   luaV_concat(L, n + 1, L->top - L->base - 1);
168   L->top -= n;
169   return svalue(L->top - 1);
170 }
171
172
173 const char *
174 luaO_pushfstring(lua_State * L, const char *fmt, ...)
175 {
176   const char *msg;
177   va_list argp;
178   va_start(argp, fmt);
179   msg = luaO_pushvfstring(L, fmt, argp);
180   va_end(argp);
181   return msg;
182 }
183
184
185 void
186 luaO_chunkid(char *out, const char *source, int bufflen)
187 {
188   if (*source == '=') {
189     strncpy(out, source + 1, bufflen);  /* remove first char */
190     out[bufflen - 1] = '\0';    /* ensures null termination */
191   } else {                      /* out = "source", or "...source" */
192     if (*source == '@') {
193       int l;
194       source++;                 /* skip the `@' */
195       bufflen -= sizeof(" `...' ");
196       l = strlen(source);
197       strcpy(out, "");
198       if (l > bufflen) {
199         source += (l - bufflen);        /* get last part of file name */
200         strcat(out, "...");
201       }
202       strcat(out, source);
203     } else {                    /* out = [string "string"] */
204       int len = strcspn(source, "\n"); /* stop at first newline */
205       bufflen -= sizeof(" [string \"...\"] ");
206       if (len > bufflen)
207         len = bufflen;
208       strcpy(out, "[string \"");
209       if (source[len] != '\0') {        /* must truncate? */
210         strncat(out, source, len);
211         strcat(out, "...");
212       } else
213         strcat(out, source);
214       strcat(out, "\"]");
215     }
216   }
217 }