From 7ca25e58e99abb3d640b6012d7cbfc9bc9087849 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Wed, 17 May 2006 17:30:49 +0000 Subject: Move utf8 to the public part (libpolyp). git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@909 fefdeb5f-60dc-0310-8127-8f9354f1896f --- src/Makefile.am | 9 ++- src/polyp/utf8.c | 164 +++++++++++++++++++++++++++++++++++++++ src/polyp/utf8.h | 28 +++++++ src/polypcore/protocol-esound.c | 2 +- src/polypcore/protocol-native.c | 2 +- src/polypcore/sink-input.c | 2 +- src/polypcore/sink.c | 2 +- src/polypcore/source-output.c | 2 +- src/polypcore/source.c | 2 +- src/polypcore/utf8.c | 165 ---------------------------------------- src/polypcore/utf8.h | 28 ------- src/tests/utf8-test.c | 2 +- 12 files changed, 204 insertions(+), 204 deletions(-) create mode 100644 src/polyp/utf8.c create mode 100644 src/polyp/utf8.h delete mode 100644 src/polypcore/utf8.c delete mode 100644 src/polypcore/utf8.h (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index afbdedee..72db5f80 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -313,6 +313,7 @@ polypinclude_HEADERS = \ polyp/subscribe.h \ polyp/version.h \ polyp/sample.h \ + polyp/utf8.h \ polyp/volume.h \ polyp/xmalloc.h @@ -358,6 +359,7 @@ libpolyp_la_SOURCES = \ polyp/subscribe.c polyp/subscribe.h \ polyp/sample.c polyp/sample.h \ polyp/volume.c polyp/volume.h \ + polyp/utf8.c polyp/utf8.h \ polyp/mainloop.c polyp/mainloop.h \ polyp/mainloop-signal.c polyp/mainloop-signal.h \ polyp/thread-mainloop.c polyp/thread-mainloop.h \ @@ -485,8 +487,7 @@ polypcoreinclude_HEADERS = \ polypcore/source-output.h \ polypcore/strbuf.h \ polypcore/tokenizer.h \ - polypcore/util.h \ - polypcore/utf8.h + polypcore/util.h lib_LTLIBRARIES += libpolypcore.la @@ -498,6 +499,7 @@ libpolypcore_la_SOURCES = \ polyp/mainloop-signal.c polyp/mainloop-signal.h \ polyp/sample.c polyp/sample.h \ polyp/volume.c polyp/volume.h \ + polyp/utf8.c polyp/utf8.h \ polyp/xmalloc.c polyp/xmalloc.h # Pure core stuff (some are shared in libpolyp though). @@ -546,8 +548,7 @@ libpolypcore_la_SOURCES += \ polypcore/strbuf.c polypcore/strbuf.h \ polypcore/tokenizer.c polypcore/tokenizer.h \ polypcore/util.c polypcore/util.h \ - polypcore/winsock.h \ - polypcore/utf8.c polypcore/utf8.h + polypcore/winsock.h if OS_IS_WIN32 libpolypcore_la_SOURCES += \ diff --git a/src/polyp/utf8.c b/src/polyp/utf8.c new file mode 100644 index 00000000..bb8621e2 --- /dev/null +++ b/src/polyp/utf8.c @@ -0,0 +1,164 @@ +/* $Id */ + +/* This file is based on the GLIB utf8 validation functions. The + * original license text follows. */ + +/* gutf8.c - Operations on UTF-8 strings. + * + * Copyright (C) 1999 Tom Tromey + * Copyright (C) 2000 Red Hat, Inc. + * + * This library 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 2 of the License, or (at your option) any later version. + * + * This library 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 more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include "utf8.h" +#include "xmalloc.h" + +#define FILTER_CHAR '_' + +static inline int is_unicode_valid(uint32_t ch) { + if (ch >= 0x110000) /* End of unicode space */ + return 0; + if ((ch & 0xFFFFF800) == 0xD800) /* Reserved area for UTF-16 */ + return 0; + if ((ch >= 0xFDD0) && (ch <= 0xFDEF)) /* Reserved */ + return 0; + if ((ch & 0xFFFE) == 0xFFFE) /* BOM (Byte Order Mark) */ + return 0; + return 1; +} + +static inline int is_continuation_char(uint8_t ch) { + if ((ch & 0xc0) != 0x80) /* 10xxxxxx */ + return 0; + return 1; +} + +static inline void merge_continuation_char(uint32_t *u_ch, uint8_t ch) { + *u_ch <<= 6; + *u_ch |= ch & 0x3f; +} + +static char* utf8_validate(const char *str, char *output) { + uint32_t val = 0; + uint32_t min = 0; + const uint8_t *p, *last; + int size; + uint8_t *o; + + o = (uint8_t*) output; + for (p = (const uint8_t*) str; *p; p++) { + if (*p < 128) { + if (o) + *o = *p; + } else { + last = p; + + if ((*p & 0xe0) == 0xc0) { /* 110xxxxx two-char seq. */ + size = 2; + min = 128; + val = *p & 0x1e; + goto ONE_REMAINING; + } else if ((*p & 0xf0) == 0xe0) { /* 1110xxxx three-char seq.*/ + size = 3; + min = (1 << 11); + val = *p & 0x0f; + goto TWO_REMAINING; + } else if ((*p & 0xf8) == 0xf0) { /* 11110xxx four-char seq */ + size = 4; + min = (1 << 16); + val = *p & 0x07; + } else { + size = 1; + goto error; + } + + p++; + if (!is_continuation_char(*p)) + goto error; + merge_continuation_char(&val, *p); + +TWO_REMAINING: + p++; + if (!is_continuation_char(*p)) + goto error; + merge_continuation_char(&val, *p); + +ONE_REMAINING: + p++; + if (!is_continuation_char(*p)) + goto error; + merge_continuation_char(&val, *p); + + if (val < min) + goto error; + + if (!is_unicode_valid(val)) + goto error; + + if (o) { + memcpy(o, last, size); + o += size - 1; + } + + if (o) + o++; + + continue; + +error: + if (o) { + *o = FILTER_CHAR; + p = last; /* We retry at the next character */ + } else + goto failure; + } + + if (o) + o++; + } + + if (o) { + *o = '\0'; + return output; + } + + return (char*) str; + +failure: + return NULL; +} + +const char* pa_utf8_valid (const char *str) { + return utf8_validate(str, NULL); +} + +char* pa_utf8_filter (const char *str) { + char *new_str; + + new_str = pa_xnew(char, strlen(str) + 1); + + return utf8_validate(str, new_str); +} diff --git a/src/polyp/utf8.h b/src/polyp/utf8.h new file mode 100644 index 00000000..6d1e4a7d --- /dev/null +++ b/src/polyp/utf8.h @@ -0,0 +1,28 @@ +#ifndef fooutf8hfoo +#define fooutf8hfoo + +/* $Id$ */ + +/*** + This file is part of polypaudio. + + polypaudio 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 2.1 of the + License, or (at your option) any later version. + + polypaudio 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 more details. + + You should have received a copy of the GNU Lesser General Public + License along with polypaudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +const char *pa_utf8_valid(const char *str); +char *pa_utf8_filter(const char *str); + +#endif diff --git a/src/polypcore/protocol-esound.c b/src/polypcore/protocol-esound.c index 86a8c9e3..8f53694e 100644 --- a/src/polypcore/protocol-esound.c +++ b/src/polypcore/protocol-esound.c @@ -31,6 +31,7 @@ #include #include +#include #include #include @@ -46,7 +47,6 @@ #include #include #include -#include #include "endianmacros.h" diff --git a/src/polypcore/protocol-native.c b/src/polypcore/protocol-native.c index b0ad5955..338db002 100644 --- a/src/polypcore/protocol-native.c +++ b/src/polypcore/protocol-native.c @@ -30,6 +30,7 @@ #include #include +#include #include #include @@ -53,7 +54,6 @@ #include #include #include -#include #include "protocol-native.h" diff --git a/src/polypcore/sink-input.c b/src/polypcore/sink-input.c index 5c0caa21..bd2a1dcd 100644 --- a/src/polypcore/sink-input.c +++ b/src/polypcore/sink-input.c @@ -28,12 +28,12 @@ #include #include +#include #include #include #include #include -#include #include "sink-input.h" diff --git a/src/polypcore/sink.c b/src/polypcore/sink.c index a873c00a..6931d396 100644 --- a/src/polypcore/sink.c +++ b/src/polypcore/sink.c @@ -29,6 +29,7 @@ #include #include +#include #include #include @@ -37,7 +38,6 @@ #include #include #include -#include #include "sink.h" diff --git a/src/polypcore/source-output.c b/src/polypcore/source-output.c index c8db870b..8ac3a33d 100644 --- a/src/polypcore/source-output.c +++ b/src/polypcore/source-output.c @@ -28,11 +28,11 @@ #include #include +#include #include #include #include -#include #include "source-output.h" diff --git a/src/polypcore/source.c b/src/polypcore/source.c index 4d96622b..c53bf079 100644 --- a/src/polypcore/source.c +++ b/src/polypcore/source.c @@ -28,6 +28,7 @@ #include #include +#include #include #include @@ -35,7 +36,6 @@ #include #include #include -#include #include "source.h" diff --git a/src/polypcore/utf8.c b/src/polypcore/utf8.c deleted file mode 100644 index 01fbfccd..00000000 --- a/src/polypcore/utf8.c +++ /dev/null @@ -1,165 +0,0 @@ -/* $Id */ - -/* This file is based on the GLIB utf8 validation functions. The - * original license text follows. */ - -/* gutf8.c - Operations on UTF-8 strings. - * - * Copyright (C) 1999 Tom Tromey - * Copyright (C) 2000 Red Hat, Inc. - * - * This library 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 2 of the License, or (at your option) any later version. - * - * This library 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 more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include - -#include - -#include "utf8.h" - -#define FILTER_CHAR '_' - -static inline int is_unicode_valid(uint32_t ch) { - if (ch >= 0x110000) /* End of unicode space */ - return 0; - if ((ch & 0xFFFFF800) == 0xD800) /* Reserved area for UTF-16 */ - return 0; - if ((ch >= 0xFDD0) && (ch <= 0xFDEF)) /* Reserved */ - return 0; - if ((ch & 0xFFFE) == 0xFFFE) /* BOM (Byte Order Mark) */ - return 0; - return 1; -} - -static inline int is_continuation_char(uint8_t ch) { - if ((ch & 0xc0) != 0x80) /* 10xxxxxx */ - return 0; - return 1; -} - -static inline void merge_continuation_char(uint32_t *u_ch, uint8_t ch) { - *u_ch <<= 6; - *u_ch |= ch & 0x3f; -} - -static char* utf8_validate(const char *str, char *output) { - uint32_t val = 0; - uint32_t min = 0; - const uint8_t *p, *last; - int size; - uint8_t *o; - - o = (uint8_t*) output; - for (p = (const uint8_t*) str; *p; p++) { - if (*p < 128) { - if (o) - *o = *p; - } else { - last = p; - - if ((*p & 0xe0) == 0xc0) { /* 110xxxxx two-char seq. */ - size = 2; - min = 128; - val = *p & 0x1e; - goto ONE_REMAINING; - } else if ((*p & 0xf0) == 0xe0) { /* 1110xxxx three-char seq.*/ - size = 3; - min = (1 << 11); - val = *p & 0x0f; - goto TWO_REMAINING; - } else if ((*p & 0xf8) == 0xf0) { /* 11110xxx four-char seq */ - size = 4; - min = (1 << 16); - val = *p & 0x07; - } else { - size = 1; - goto error; - } - - p++; - if (!is_continuation_char(*p)) - goto error; - merge_continuation_char(&val, *p); - -TWO_REMAINING: - p++; - if (!is_continuation_char(*p)) - goto error; - merge_continuation_char(&val, *p); - -ONE_REMAINING: - p++; - if (!is_continuation_char(*p)) - goto error; - merge_continuation_char(&val, *p); - - if (val < min) - goto error; - - if (!is_unicode_valid(val)) - goto error; - - if (o) { - memcpy(o, last, size); - o += size - 1; - } - - if (o) - o++; - - continue; - -error: - if (o) { - *o = FILTER_CHAR; - p = last; /* We retry at the next character */ - } else - goto failure; - } - - if (o) - o++; - } - - if (o) { - *o = '\0'; - return output; - } - - return (char*) str; - -failure: - return NULL; -} - -const char* pa_utf8_valid (const char *str) { - return utf8_validate(str, NULL); -} - -char* pa_utf8_filter (const char *str) { - char *new_str; - - new_str = pa_xnew(char, strlen(str) + 1); - - return utf8_validate(str, new_str); -} diff --git a/src/polypcore/utf8.h b/src/polypcore/utf8.h deleted file mode 100644 index 6d1e4a7d..00000000 --- a/src/polypcore/utf8.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef fooutf8hfoo -#define fooutf8hfoo - -/* $Id$ */ - -/*** - This file is part of polypaudio. - - polypaudio 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 2.1 of the - License, or (at your option) any later version. - - polypaudio 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 more details. - - You should have received a copy of the GNU Lesser General Public - License along with polypaudio; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - USA. -***/ - -const char *pa_utf8_valid(const char *str); -char *pa_utf8_filter(const char *str); - -#endif diff --git a/src/tests/utf8-test.c b/src/tests/utf8-test.c index 57f445c7..2c21613e 100644 --- a/src/tests/utf8-test.c +++ b/src/tests/utf8-test.c @@ -3,8 +3,8 @@ #include #include +#include #include -#include int main(int argc, char *argv[]) { char *c; -- cgit