Jacek Caban : jscript: Make parse_decimal a more generic helper.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jan 28 10:06:44 CST 2016


Module: wine
Branch: master
Commit: b1197a15eca8e7a5b483e53068f3896c0af08b76
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b1197a15eca8e7a5b483e53068f3896c0af08b76

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Jan 27 20:42:52 2016 +0100

jscript: Make parse_decimal a more generic helper.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/jscript/lex.c | 84 ++++++++++++++++++++++++++++++------------------------
 1 file changed, 47 insertions(+), 37 deletions(-)

diff --git a/dlls/jscript/lex.c b/dlls/jscript/lex.c
index 57ab033..dd788f0 100644
--- a/dlls/jscript/lex.c
+++ b/dlls/jscript/lex.c
@@ -406,14 +406,14 @@ literal_t *new_boolean_literal(parser_ctx_t *ctx, BOOL bval)
     return ret;
 }
 
-static BOOL parse_double_literal(parser_ctx_t *ctx, LONG int_part, double *ret)
+static HRESULT parse_decimal(const WCHAR **iter, const WCHAR *end, double *ret)
 {
-    LONGLONG d, hlp;
+    const WCHAR *ptr = *iter;
+    LONGLONG d = 0, hlp;
     int exp = 0;
 
-    d = int_part;
-    while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) {
-        hlp = d*10 + *(ctx->ptr++) - '0';
+    while(ptr < end && isdigitW(*ptr)) {
+        hlp = d*10 + *(ptr++) - '0';
         if(d>MAXLONGLONG/10 || hlp<0) {
             exp++;
             break;
@@ -421,51 +421,48 @@ static BOOL parse_double_literal(parser_ctx_t *ctx, LONG int_part, double *ret)
         else
             d = hlp;
     }
-    while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) {
+    while(ptr < end && isdigitW(*ptr)) {
         exp++;
-        ctx->ptr++;
+        ptr++;
     }
 
-    if(*ctx->ptr == '.') {
-        ctx->ptr++;
+    if(*ptr == '.') {
+        ptr++;
 
-        while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) {
-            hlp = d*10 + *(ctx->ptr++) - '0';
+        while(ptr < end && isdigitW(*ptr)) {
+            hlp = d*10 + *(ptr++) - '0';
             if(d>MAXLONGLONG/10 || hlp<0)
                 break;
 
             d = hlp;
             exp--;
         }
-        while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr))
-            ctx->ptr++;
+        while(ptr < end && isdigitW(*ptr))
+            ptr++;
     }
 
-    if(ctx->ptr < ctx->end && (*ctx->ptr == 'e' || *ctx->ptr == 'E')) {
+    if(ptr < end && (*ptr == 'e' || *ptr == 'E')) {
         int sign = 1, e = 0;
 
-        ctx->ptr++;
-        if(ctx->ptr < ctx->end) {
-            if(*ctx->ptr == '+') {
-                ctx->ptr++;
-            }else if(*ctx->ptr == '-') {
+        if(++ptr < end) {
+            if(*ptr == '+') {
+                ptr++;
+            }else if(*ptr == '-') {
                 sign = -1;
-                ctx->ptr++;
-            }else if(!isdigitW(*ctx->ptr)) {
+                ptr++;
+            }else if(!isdigitW(*ptr)) {
                 WARN("Expected exponent part\n");
-                lex_error(ctx, E_FAIL);
-                return FALSE;
+                return E_FAIL;
             }
         }
 
-        if(ctx->ptr == ctx->end) {
+        if(ptr == end) {
             WARN("unexpected end of file\n");
-            lex_error(ctx, E_FAIL);
-            return FALSE;
+            return E_FAIL;
         }
 
-        while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) {
-            if(e > INT_MAX/10 || (e = e*10 + *ctx->ptr++ - '0')<0)
+        while(ptr < end && isdigitW(*ptr)) {
+            if(e > INT_MAX/10 || (e = e*10 + *ptr++ - '0')<0)
                 e = INT_MAX;
         }
         e *= sign;
@@ -475,22 +472,25 @@ static BOOL parse_double_literal(parser_ctx_t *ctx, LONG int_part, double *ret)
         else exp += e;
     }
 
-    if(is_identifier_char(*ctx->ptr)) {
+    if(is_identifier_char(*ptr)) {
         WARN("wrong char after zero\n");
-        lex_error(ctx, JS_E_MISSING_SEMICOLON);
-        return FALSE;
+        return JS_E_MISSING_SEMICOLON;
     }
 
     *ret = exp>=0 ? d*pow(10, exp) : d/pow(10, -exp);
-    return TRUE;
+    *iter = ptr;
+    return S_OK;
 }
 
 static BOOL parse_numeric_literal(parser_ctx_t *ctx, double *ret)
 {
-    LONG l, d;
+    HRESULT hres;
+
+    if(*ctx->ptr == '0') {
+        LONG d, l = 0;
+
+        ctx->ptr++;
 
-    l = *ctx->ptr++ - '0';
-    if(!l) {
         if(*ctx->ptr == 'x' || *ctx->ptr == 'X') {
             if(++ctx->ptr == ctx->end) {
                 ERR("unexpected end of file\n");
@@ -546,7 +546,13 @@ static BOOL parse_numeric_literal(parser_ctx_t *ctx, double *ret)
         }
     }
 
-    return parse_double_literal(ctx, l, ret);
+    hres = parse_decimal(&ctx->ptr, ctx->end, ret);
+    if(FAILED(hres)) {
+        lex_error(ctx, hres);
+        return FALSE;
+    }
+
+    return TRUE;
 }
 
 static int next_token(parser_ctx_t *ctx, void *lval)
@@ -599,8 +605,12 @@ static int next_token(parser_ctx_t *ctx, void *lval)
     case '.':
         if(++ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) {
             double n;
-            if(!parse_double_literal(ctx, 0, &n))
+            HRESULT hres;
+            hres = parse_decimal(&ctx->ptr, ctx->end, &n);
+            if(FAILED(hres)) {
+                lex_error(ctx, hres);
                 return -1;
+            }
             *(literal_t**)lval = new_double_literal(ctx, n);
             return tNumericLiteral;
         }




More information about the wine-cvs mailing list