diff options
| author | Mark Lobodzinski <mark@lunarg.com> | 2016-01-11 14:17:05 -0700 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2016-02-08 13:57:36 -0700 |
| commit | 19e65b4732bd6d1df86ce84949f3fc0fbe84197b (patch) | |
| tree | 6911f6760fadf58d1a3dd1892439cc29bb780586 /layers/vk_layer_utils.cpp | |
| parent | 7ee1c6d9619fa9dc66939ccd8756c393a18117f8 (diff) | |
| download | usermoji-19e65b4732bd6d1df86ce84949f3fc0fbe84197b.tar.xz | |
layers: Add UTF-8 String validation utility
Diffstat (limited to 'layers/vk_layer_utils.cpp')
| -rw-r--r-- | layers/vk_layer_utils.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/layers/vk_layer_utils.cpp b/layers/vk_layer_utils.cpp index db433dc7..2452b0ec 100644 --- a/layers/vk_layer_utils.cpp +++ b/layers/vk_layer_utils.cpp @@ -601,3 +601,48 @@ VkDeviceSize vk_safe_modulo(VkDeviceSize dividend, VkDeviceSize divisor) } +static const char UTF8_ONE_BYTE_CODE = 0xC0; +static const char UTF8_ONE_BYTE_MASK = 0xE0; +static const char UTF8_TWO_BYTE_CODE = 0xE0; +static const char UTF8_TWO_BYTE_MASK = 0xF0; +static const char UTF8_THREE_BYTE_CODE = 0xF0; +static const char UTF8_THREE_BYTE_MASK = 0xF8; +static const char UTF8_DATA_BYTE_CODE = 0x80; +static const char UTF8_DATA_BYTE_MASK = 0xC0; + +VkStringErrorFlags vk_string_validate(const int max_length, char *utf8) +{ + VkStringErrorFlags result = VK_STRING_ERROR_NONE; + int code; + int num_char_bytes; + int i,j; + + for (i = 0; i < max_length; i++) + { + if (utf8[i] == 0) { + break; + } else if ((utf8[i] > 0x20) && (utf8[i] < 0x7f)) { + num_char_bytes = 0; + } else if ((utf8[i] & UTF8_ONE_BYTE_MASK) == UTF8_ONE_BYTE_CODE) { + num_char_bytes = 1; + } else if ((utf8[i] & UTF8_TWO_BYTE_MASK) == UTF8_TWO_BYTE_CODE) { + num_char_bytes = 2; + } else if ((utf8[i] & UTF8_THREE_BYTE_MASK) == UTF8_THREE_BYTE_CODE) { + num_char_bytes = 3; + } else { + result = VK_STRING_ERROR_BAD_DATA; + } + + // Validate the following num_char_bytes of data + for (j = 0; (j < num_char_bytes) && (i < max_length); j++) { + if (++i == max_length) { + result |= VK_STRING_ERROR_LENGTH; + break; + } + if ((utf8[i] & UTF8_DATA_BYTE_MASK) != UTF8_DATA_BYTE_CODE) { + result |= VK_STRING_ERROR_BAD_DATA; + } + } + } + return result; +} |
