diff options
author | David Robillard <d@drobilla.net> | 2011-01-20 07:31:58 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2011-01-20 07:31:58 +0000 |
commit | 0a62fc5f6aafd3e3f67d861634014d7e894c7bfd (patch) | |
tree | 570127d89143a64009bb753b2b6550507ae09cfa /src/string.c | |
parent | fc2fe593097a523919ee71742081cbc6f3fc4c2c (diff) | |
download | serd-0a62fc5f6aafd3e3f67d861634014d7e894c7bfd.tar.gz serd-0a62fc5f6aafd3e3f67d861634014d7e894c7bfd.tar.bz2 serd-0a62fc5f6aafd3e3f67d861634014d7e894c7bfd.zip |
Rework character reading functions to support reading multi-byte characters (take a string dest parameter instead of returning uchar).
Escape ntriples output.
Pass all good read tests with output verification.
git-svn-id: http://svn.drobilla.net/serd/trunk@8 490d8e77-9747-427b-9fa3-0b8f29cee8a0
Diffstat (limited to 'src/string.c')
-rw-r--r-- | src/string.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/string.c b/src/string.c new file mode 100644 index 00000000..301a98cc --- /dev/null +++ b/src/string.c @@ -0,0 +1,65 @@ +/* Serd, an RDF serialisation library. + * Copyright 2011 David Robillard <d@drobilla.net> + * + * Serd is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Serd is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <assert.h> +#include <stdbool.h> +#include <stdlib.h> +#include <string.h> + +#include "serd/serd.h" + +static inline size_t +utf8_strlen(const uint8_t* utf8, size_t* out_n_bytes) +{ + size_t n_chars = 0; + size_t i = 0; + for (; utf8[i]; ++i) { + if ((utf8[i] & 0xC0) != 0x80) { + // Does not start with `10', start of a new character + ++n_chars; + } + } + if (out_n_bytes) { + *out_n_bytes = i + 1; + } + return n_chars; +} + +SERD_API +SerdString* +serd_string_new(const uint8_t* utf8) +{ + size_t n_bytes; + size_t n_chars = utf8_strlen(utf8, &n_bytes); + SerdString* const str = malloc(sizeof(SerdString) + n_bytes); + str->n_bytes = n_bytes; + str->n_chars = n_chars; + memcpy(str->buf, utf8, str->n_bytes); + return str; +} + +SERD_API +SerdString* +serd_string_copy(const SerdString* s) +{ + if (s) { + SerdString* const copy = malloc(sizeof(SerdString) + s->n_bytes); + memcpy(copy, s, sizeof(SerdString) + s->n_bytes); + return copy; + } + return NULL; +} |