diff options
Diffstat (limited to 'src/lobject.c')
-rw-r--r-- | src/lobject.c | 76 |
1 files changed, 61 insertions, 15 deletions
diff --git a/src/lobject.c b/src/lobject.c index 8d331ef9..0225e2d8 100644 --- a/src/lobject.c +++ b/src/lobject.c @@ -1,9 +1,10 @@ /* -** $Id: lobject.c,v 1.13 1998/06/19 16:14:09 roberto Exp $ +** $Id: lobject.c,v 1.19 1999/04/13 19:28:49 roberto Exp $ ** Some generic functions over Lua objects ** See Copyright Notice in lua.h */ +#include <ctype.h> #include <stdlib.h> #include "lobject.h" @@ -34,14 +35,12 @@ int luaO_redimension (int oldsize) if (dimensions[i] > oldsize) return dimensions[i]; } - lua_error("table overflow"); + lua_error("tableEM"); return 0; /* to avoid warnings */ } -int luaO_equalObj (TObject *t1, TObject *t2) -{ - if (ttype(t1) != ttype(t2)) return 0; +int luaO_equalval (TObject *t1, TObject *t2) { switch (ttype(t1)) { case LUA_T_NIL: return 1; case LUA_T_NUMBER: return nvalue(t1) == nvalue(t2); @@ -64,20 +63,67 @@ void luaO_insertlist (GCnode *root, GCnode *node) node->marked = 0; } + #ifdef OLD_ANSI -void luaO_memup (void *dest, void *src, int size) -{ - char *d = dest; - char *s = src; - while (size--) d[size]=s[size]; +void luaO_memup (void *dest, void *src, int size) { + while (size--) + ((char *)dest)[size]=((char *)src)[size]; } -void luaO_memdown (void *dest, void *src, int size) -{ - char *d = dest; - char *s = src; +void luaO_memdown (void *dest, void *src, int size) { int i; - for (i=0; i<size; i++) d[i]=s[i]; + for (i=0; i<size; i++) + ((char *)dest)[i]=((char *)src)[i]; } #endif + + +static double expten (unsigned int e) { + double exp = 10.0; + double res = 1.0; + for (; e; e>>=1) { + if (e & 1) res *= exp; + exp *= exp; + } + return res; +} + + +double luaO_str2d (char *s) { /* LUA_NUMBER */ + double a = 0.0; + int point = 0; + while (isdigit((unsigned char)*s)) { + a = 10.0*a + (*(s++)-'0'); + } + if (*s == '.') { + s++; + while (isdigit((unsigned char)*s)) { + a = 10.0*a + (*(s++)-'0'); + point++; + } + } + if (toupper((unsigned char)*s) == 'E') { + int e = 0; + int sig = 1; + s++; + if (*s == '-') { + s++; + sig = -1; + } + else if (*s == '+') s++; + if (!isdigit((unsigned char)*s)) return -1; /* no digit in the exponent? */ + do { + e = 10*e + (*(s++)-'0'); + } while (isdigit((unsigned char)*s)); + point -= sig*e; + } + while (isspace((unsigned char)*s)) s++; + if (*s != '\0') return -1; /* invalid trailing characters? */ + if (point > 0) + a /= expten(point); + else if (point < 0) + a *= expten(-point); + return a; +} + |