From f7b1ab90917838d7f63e39281149b616f850e5c3 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Wed, 10 Dec 2008 05:06:56 -0500 Subject: [PATCH] Handle exponents in number parsing. Now "-3.03e-3" parses. Fun. --- mojoshader_assembler.c | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/mojoshader_assembler.c b/mojoshader_assembler.c index 363d57c3..48ad7a4f 100644 --- a/mojoshader_assembler.c +++ b/mojoshader_assembler.c @@ -930,15 +930,54 @@ static int parse_num(Context *ctx, const int floatok, uint32 *token) else if (!ui32fromstr(ctx->token, &fraction)) return fail(ctx, "Expected number"); + uint32 exponent = 0; + int negexp = 0; + if (nexttoken(ctx, 0, 1, 1, 1) == FAIL) + return FAIL; + else if (strcmp(ctx->token, "e") != 0) + pushback(ctx); + else if (!floatok) + return fail(ctx, "Exponent on whole number"); // !!! FIXME: illegal? + else if (nexttoken(ctx, 0, 1, 0, 0) == FAIL) + return FAIL; + else + { + if (strcmp(ctx->token, "-") != 0) + pushback(ctx); + else + negexp = 1; + + if (nexttoken(ctx, 0, 1, 0, 0) == FAIL) + return FAIL; + else if (!ui32fromstr(ctx->token, &exponent)) + return fail(ctx, "Expected exponent"); + } // else + if (!floatok) cvt.si32 = ((int32) val) * negative; else { // !!! FIXME: this is lame. char buf[128]; - snprintf(buf, sizeof (buf), "%s%u.%u", (negative == -1) ? "-" : "", + snprintf(buf, sizeof (buf), "%s%u.%u", (negative < 0) ? "-" : "", (uint) val, (uint) fraction); sscanf(buf, "%f", &cvt.f); + cvt.f *= (float) negative; + + if (exponent) + { + int i; + if (negexp) + { + for (i = 0; i > exponent; i--) + cvt.f /= 10.0f; + } // if + else + { + for (i = 0; i < exponent; i++) + cvt.f *= 10.0f; + } // else + } // if } // else *token = cvt.ui32;