X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=src%2Futf.c;h=92484d025da1658320da8a13d68f9f23b5fd038c;hb=29ee3832cf1cee4cfebad8e440b58877437c4615;hp=cf2e8e4e9877c3af5f3e90565825b6db9eea93e9;hpb=2f4d6f8ae768886f8ee831bae169763856b5a827;p=jansson.git diff --git a/src/utf.c b/src/utf.c index cf2e8e4..92484d0 100644 --- a/src/utf.c +++ b/src/utf.c @@ -1,13 +1,14 @@ /* - * Copyright (c) 2009 Petri Lehtinen + * Copyright (c) 2009, 2010 Petri Lehtinen * * Jansson is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. */ #include +#include "utf.h" -int utf8_encode(int codepoint, char *buffer, int *size) +int utf8_encode(int32_t codepoint, char *buffer, int *size) { if(codepoint < 0) return -1; @@ -79,9 +80,10 @@ int utf8_check_first(char byte) } } -int utf8_check_full(const char *buffer, int size) +int utf8_check_full(const char *buffer, int size, int32_t *codepoint) { - int i, value = 0; + int i; + int32_t value = 0; unsigned char u = (unsigned char)buffer[0]; if(size == 2) @@ -128,9 +130,38 @@ int utf8_check_full(const char *buffer, int size) return 0; } + if(codepoint) + *codepoint = value; + return 1; } +const char *utf8_iterate(const char *buffer, int32_t *codepoint) +{ + int count; + int32_t value; + + if(!*buffer) + return buffer; + + count = utf8_check_first(buffer[0]); + if(count <= 0) + return NULL; + + if(count == 1) + value = (unsigned char)buffer[0]; + else + { + if(!utf8_check_full(buffer, count, &value)) + return NULL; + } + + if(codepoint) + *codepoint = value; + + return buffer + count; +} + int utf8_check_string(const char *string, int length) { int i; @@ -148,7 +179,7 @@ int utf8_check_string(const char *string, int length) if(i + count > length) return 0; - if(!utf8_check_full(&string[i], count)) + if(!utf8_check_full(&string[i], count, NULL)) return 0; i += count - 1;