diff --git a/src/LWeb.c b/src/LWeb.c index ba70a0d21..84d045eb4 100644 --- a/src/LWeb.c +++ b/src/LWeb.c @@ -85,11 +85,7 @@ static void Json_ConsumeString(struct JsonContext* ctx, String* str) { /* form of \uYYYY */ if (c != 'u' || ctx->left < 4) break; - - if (!PackedCol_Unhex(ctx->cur[0], &h[0])) break; - if (!PackedCol_Unhex(ctx->cur[1], &h[1])) break; - if (!PackedCol_Unhex(ctx->cur[2], &h[2])) break; - if (!PackedCol_Unhex(ctx->cur[3], &h[3])) break; + if (!PackedCol_Unhex(ctx->cur, h, 4)) break; codepoint = (h[0] << 12) | (h[1] << 8) | (h[2] << 4) | h[3]; /* don't want control characters in names/software */ diff --git a/src/PackedCol.c b/src/PackedCol.c index 0b4d341b0..0cb1e530e 100644 --- a/src/PackedCol.c +++ b/src/PackedCol.c @@ -21,16 +21,22 @@ void PackedCol_GetShaded(PackedCol normal, PackedCol* xSide, PackedCol* zSide, P *yMin = PackedCol_Scale(normal, PACKEDCOL_SHADE_YMIN); } -bool PackedCol_Unhex(char hex, int* value) { - *value = 0; +static int PackedCol_DeHex(char hex) { if (hex >= '0' && hex <= '9') { - *value = (hex - '0'); + return (hex - '0'); } else if (hex >= 'a' && hex <= 'f') { - *value = (hex - 'a') + 10; + return (hex - 'a') + 10; } else if (hex >= 'A' && hex <= 'F') { - *value = (hex - 'A') + 10; - } else { - return false; + return (hex - 'A') + 10; + } + return -1; +} + +bool PackedCol_Unhex(const char* src, int* dst, int count) { + int i; + for (i = 0; i < count; i++) { + dst[i] = PackedCol_DeHex(src[i]); + if (dst[i] == -1) return false; } return true; } @@ -42,7 +48,7 @@ void PackedCol_ToHex(String* str, PackedCol value) { } bool PackedCol_TryParseHex(const String* str, PackedCol* value) { - int rH, rL, gH, gL, bH, bL; + int bits[6]; char* buffer; buffer = str->buffer; @@ -51,15 +57,13 @@ bool PackedCol_TryParseHex(const String* str, PackedCol* value) { /* accept XXYYZZ or #XXYYZZ forms */ if (str->length < 6) return false; if (str->length > 6 && (str->buffer[0] != '#' || str->length > 7)) return false; + if (buffer[0] == '#') buffer++; + if (!PackedCol_Unhex(buffer, bits, 6)) return false; - if (!PackedCol_Unhex(buffer[0], &rH) || !PackedCol_Unhex(buffer[1], &rL)) return false; - if (!PackedCol_Unhex(buffer[2], &gH) || !PackedCol_Unhex(buffer[3], &gL)) return false; - if (!PackedCol_Unhex(buffer[4], &bH) || !PackedCol_Unhex(buffer[5], &bL)) return false; - - value->R = (uint8_t)((rH << 4) | rL); - value->G = (uint8_t)((gH << 4) | gL); - value->B = (uint8_t)((bH << 4) | bL); + value->R = (uint8_t)((bits[0] << 4) | bits[1]); + value->G = (uint8_t)((bits[2] << 4) | bits[3]); + value->B = (uint8_t)((bits[4] << 4) | bits[5]); value->A = 255; return true; } diff --git a/src/PackedCol.h b/src/PackedCol.h index 6a2ec4637..9bd5665ce 100644 --- a/src/PackedCol.h +++ b/src/PackedCol.h @@ -30,7 +30,7 @@ CC_API PackedCol PackedCol_Scale(PackedCol value, float t); /* Linearly interpolates RGB components of the two given colours. */ CC_API PackedCol PackedCol_Lerp(PackedCol a, PackedCol b, float t); -CC_NOINLINE bool PackedCol_Unhex(char hex, int* value); +CC_NOINLINE bool PackedCol_Unhex(const char* src, int* dst, int count); CC_NOINLINE void PackedCol_ToHex(String* str, PackedCol value); CC_NOINLINE bool PackedCol_TryParseHex(const String* str, PackedCol* value); diff --git a/src/Platform.c b/src/Platform.c index f5f52fd4b..8510c72f6 100644 --- a/src/Platform.c +++ b/src/Platform.c @@ -2135,7 +2135,7 @@ int Platform_GetCommandLineArgs(int argc, STRING_REF char** argv, String* args) void Platform_SetDefaultCurrentDirectory(void) { struct android_app* app = (struct android_app*)App_Ptr; - const char* storageDir = app->activity->externalDataPath; + const char* storageDir = app->activity->externalDataPath; ReturnCode res = chdir(storageDir) == -1 ? errno : 0; if (res) Logger_Warn(res, "setting current directory");