aboutsummaryrefslogtreecommitdiff
path: root/llex.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-04-30 13:48:44 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-04-30 13:48:44 -0300
commit5388aa9fc0185b5d7a852e679484e26ba53e5d4d (patch)
tree2085a65550d299ee37369985f47af4fd9f5c951e /llex.c
parentb123a88673fcf37ebfcc8ea866a3d27da6cdf82e (diff)
downloadlua-5388aa9fc0185b5d7a852e679484e26ba53e5d4d.tar.gz
lua-5388aa9fc0185b5d7a852e679484e26ba53e5d4d.tar.bz2
lua-5388aa9fc0185b5d7a852e679484e26ba53e5d4d.zip
'luaO_str2d' + 'luaO_str2int' replaced by 'luaO_str2num' (which converts
to float or integer according to the string syntax)
Diffstat (limited to 'llex.c')
-rw-r--r--llex.c52
1 files changed, 25 insertions, 27 deletions
diff --git a/llex.c b/llex.c
index a9a2db04..ff3c3781 100644
--- a/llex.c
+++ b/llex.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: llex.c,v 2.73 2014/02/06 15:59:24 roberto Exp roberto $ 2** $Id: llex.c,v 2.74 2014/02/14 15:23:51 roberto Exp roberto $
3** Lexical Analyzer 3** Lexical Analyzer
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -196,10 +196,12 @@ static int check_next (LexState *ls, const char *set) {
196** change all characters 'from' in buffer to 'to' 196** change all characters 'from' in buffer to 'to'
197*/ 197*/
198static void buffreplace (LexState *ls, char from, char to) { 198static void buffreplace (LexState *ls, char from, char to) {
199 size_t n = luaZ_bufflen(ls->buff); 199 if (from != to) {
200 char *p = luaZ_buffer(ls->buff); 200 size_t n = luaZ_bufflen(ls->buff);
201 while (n--) 201 char *p = luaZ_buffer(ls->buff);
202 if (p[n] == from) p[n] = to; 202 while (n--)
203 if (p[n] == from) p[n] = to;
204 }
203} 205}
204 206
205 207
@@ -208,17 +210,17 @@ static void buffreplace (LexState *ls, char from, char to) {
208#endif 210#endif
209 211
210 212
211#define buff2d(b,e) luaO_str2d(luaZ_buffer(b), luaZ_bufflen(b) - 1, e) 213#define buff2num(b,o) luaO_str2num(luaZ_buffer(b), luaZ_bufflen(b) - 1, o)
212 214
213/* 215/*
214** in case of format error, try to change decimal point separator to 216** in case of format error, try to change decimal point separator to
215** the one defined in the current locale and check again 217** the one defined in the current locale and check again
216*/ 218*/
217static void trydecpoint (LexState *ls, SemInfo *seminfo) { 219static void trydecpoint (LexState *ls, TValue *o) {
218 char old = ls->decpoint; 220 char old = ls->decpoint;
219 ls->decpoint = getlocaledecpoint(); 221 ls->decpoint = getlocaledecpoint();
220 buffreplace(ls, old, ls->decpoint); /* try new decimal separator */ 222 buffreplace(ls, old, ls->decpoint); /* try new decimal separator */
221 if (!buff2d(ls->buff, &seminfo->r)) { 223 if (!buff2num(ls->buff, o)) {
222 /* format error with correct decimal point: no more options */ 224 /* format error with correct decimal point: no more options */
223 buffreplace(ls, ls->decpoint, '.'); /* undo change (for error message) */ 225 buffreplace(ls, ls->decpoint, '.'); /* undo change (for error message) */
224 lexerror(ls, "malformed number", TK_FLT); 226 lexerror(ls, "malformed number", TK_FLT);
@@ -228,11 +230,11 @@ static void trydecpoint (LexState *ls, SemInfo *seminfo) {
228 230
229/* LUA_NUMBER */ 231/* LUA_NUMBER */
230/* 232/*
231** this function is quite liberal in what it accepts, as 'luaO_str2d' 233** this function is quite liberal in what it accepts, as 'luaO_str2num'
232** will reject ill-formed numerals. 'isf' means the numeral is not 234** will reject ill-formed numerals.
233** an integer (it has a dot or an exponent).
234*/ 235*/
235static int read_numeral (LexState *ls, SemInfo *seminfo, int isf) { 236static int read_numeral (LexState *ls, SemInfo *seminfo) {
237 TValue obj;
236 const char *expo = "Ee"; 238 const char *expo = "Ee";
237 int first = ls->current; 239 int first = ls->current;
238 lua_assert(lisdigit(ls->current)); 240 lua_assert(lisdigit(ls->current));
@@ -240,29 +242,25 @@ static int read_numeral (LexState *ls, SemInfo *seminfo, int isf) {
240 if (first == '0' && check_next(ls, "Xx")) /* hexadecimal? */ 242 if (first == '0' && check_next(ls, "Xx")) /* hexadecimal? */
241 expo = "Pp"; 243 expo = "Pp";
242 for (;;) { 244 for (;;) {
243 if (check_next(ls, expo)) { /* exponent part? */ 245 if (check_next(ls, expo)) /* exponent part? */
244 check_next(ls, "+-"); /* optional exponent sign */ 246 check_next(ls, "+-"); /* optional exponent sign */
245 isf = 1;
246 }
247 if (lisxdigit(ls->current)) 247 if (lisxdigit(ls->current))
248 save_and_next(ls); 248 save_and_next(ls);
249 else if (ls->current == '.') { 249 else if (ls->current == '.')
250 save_and_next(ls); 250 save_and_next(ls);
251 isf = 1;
252 }
253 else break; 251 else break;
254 } 252 }
255 save(ls, '\0'); 253 save(ls, '\0');
256 if (!isf) { 254 buffreplace(ls, '.', ls->decpoint); /* follow locale for decimal point */
257 if (!luaO_str2int(luaZ_buffer(ls->buff), luaZ_bufflen(ls->buff) - 1, 255 if (!buff2num(ls->buff, &obj)) /* format error? */
258 &seminfo->i)) 256 trydecpoint(ls, &obj); /* try to update decimal point separator */
259 lexerror(ls, "malformed number", TK_INT); 257 if (ttisinteger(&obj)) {
258 seminfo->i = ivalue(&obj);
260 return TK_INT; 259 return TK_INT;
261 } 260 }
262 else { 261 else {
263 buffreplace(ls, '.', ls->decpoint); /* follow locale for decimal point */ 262 lua_assert(ttisfloat(&obj));
264 if (!buff2d(ls->buff, &seminfo->r)) /* format error? */ 263 seminfo->r = fltvalue(&obj);
265 trydecpoint(ls, seminfo); /* try to update decimal point separator */
266 return TK_FLT; 264 return TK_FLT;
267 } 265 }
268} 266}
@@ -530,11 +528,11 @@ static int llex (LexState *ls, SemInfo *seminfo) {
530 else return TK_CONCAT; /* '..' */ 528 else return TK_CONCAT; /* '..' */
531 } 529 }
532 else if (!lisdigit(ls->current)) return '.'; 530 else if (!lisdigit(ls->current)) return '.';
533 else return read_numeral(ls, seminfo, 1); 531 else return read_numeral(ls, seminfo);
534 } 532 }
535 case '0': case '1': case '2': case '3': case '4': 533 case '0': case '1': case '2': case '3': case '4':
536 case '5': case '6': case '7': case '8': case '9': { 534 case '5': case '6': case '7': case '8': case '9': {
537 return read_numeral(ls, seminfo, 0); 535 return read_numeral(ls, seminfo);
538 } 536 }
539 case EOZ: { 537 case EOZ: {
540 return TK_EOS; 538 return TK_EOS;