From 85b370fa378241ad7024c8a081d57d8c8bdba5ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Sat, 25 Sep 2021 20:00:08 -0700 Subject: [PATCH] Updated cgltf. --- 3rdparty/cgltf/cgltf.h | 67 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/3rdparty/cgltf/cgltf.h b/3rdparty/cgltf/cgltf.h index 785869749..565003801 100644 --- a/3rdparty/cgltf/cgltf.h +++ b/3rdparty/cgltf/cgltf.h @@ -779,6 +779,7 @@ cgltf_result cgltf_load_buffers( cgltf_result cgltf_load_buffer_base64(const cgltf_options* options, cgltf_size size, const char* base64, void** out_data); +void cgltf_decode_string(char* string); void cgltf_decode_uri(char* uri); cgltf_result cgltf_validate(cgltf_data* data); @@ -1265,6 +1266,72 @@ static int cgltf_unhex(char ch) -1; } +void cgltf_decode_string(char* string) +{ + char* read = strchr(string, '\\'); + if (read == NULL) + { + return; + } + char* write = string; + char* last = string; + + while (read) + { + // Copy characters since last escaped sequence + cgltf_size written = read - last; + strncpy(write, last, written); + write += written; + + // jsmn already checked that all escape sequences are valid + ++read; + switch (*read++) + { + case '\"': *write++ = '\"'; break; + case '/': *write++ = '/'; break; + case '\\': *write++ = '\\'; break; + case 'b': *write++ = '\b'; break; + case 'f': *write++ = '\f'; break; + case 'r': *write++ = '\r'; break; + case 'n': *write++ = '\n'; break; + case 't': *write++ = '\t'; break; + case 'u': + { + // UCS-2 codepoint \uXXXX to UTF-8 + int character = 0; + for (cgltf_size i = 0; i < 4; ++i) + { + character = (character << 4) + cgltf_unhex(*read++); + } + + if (character <= 0x7F) + { + *write++ = character & 0xFF; + } + else if (character <= 0x7FF) + { + *write++ = 0xC0 | ((character >> 6) & 0xFF); + *write++ = 0x80 | (character & 0x3F); + } + else + { + *write++ = 0xE0 | ((character >> 12) & 0xFF); + *write++ = 0x80 | ((character >> 6) & 0x3F); + *write++ = 0x80 | (character & 0x3F); + } + break; + } + default: + break; + } + + last = read; + read = strchr(read, '\\'); + } + + strcpy(write, last); +} + void cgltf_decode_uri(char* uri) { char* write = uri;