|
|
@@ -0,0 +1,340 @@
|
|
|
+// SPDX-License-Identifier: ISC
|
|
|
+/*
|
|
|
+ * Copyright (C) 2025 Felix Fietkau <[email protected]>
|
|
|
+ */
|
|
|
+#include <stdio.h>
|
|
|
+#include <stdlib.h>
|
|
|
+#include <string.h>
|
|
|
+#include <ctype.h>
|
|
|
+#include <errno.h>
|
|
|
+#include <unistd.h>
|
|
|
+#include <stdint.h>
|
|
|
+#include <wchar.h>
|
|
|
+
|
|
|
+#include "private.h"
|
|
|
+
|
|
|
+#ifndef USE_SYSTEM_WCHAR
|
|
|
+/*
|
|
|
+ * adapted from musl code:
|
|
|
+ *
|
|
|
+ * Copyright © 2005-2020 Rich Felker, et al.
|
|
|
+ *
|
|
|
+ * Permission is hereby granted, free of charge, to any person obtaining
|
|
|
+ * a copy of this software and associated documentation files (the
|
|
|
+ * "Software"), to deal in the Software without restriction, including
|
|
|
+ * without limitation the rights to use, copy, modify, merge, publish,
|
|
|
+ * distribute, sublicense, and/or sell copies of the Software, and to
|
|
|
+ * permit persons to whom the Software is furnished to do so, subject to
|
|
|
+ * the following conditions:
|
|
|
+ *
|
|
|
+ * The above copyright notice and this permission notice shall be
|
|
|
+ * included in all copies or substantial portions of the Software.
|
|
|
+ *
|
|
|
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
|
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
|
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
|
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
|
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
|
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
+ */
|
|
|
+
|
|
|
+#undef MB_CUR_MAX
|
|
|
+#define MB_CUR_MAX 4
|
|
|
+
|
|
|
+static const unsigned char table[] = {
|
|
|
+16,16,16,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,16,33,16,16,16,34,35,36,
|
|
|
+37,38,39,40,16,16,41,16,16,16,16,16,16,16,16,16,16,16,42,43,16,16,44,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,16,45,16,46,47,48,49,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,50,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,51,16,16,52,
|
|
|
+53,16,54,55,56,16,16,16,16,16,16,57,16,16,58,16,59,60,61,62,63,64,65,66,67,68,
|
|
|
+69,70,16,71,72,73,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,74,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,75,76,16,16,16,77,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,78,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,79,80,16,16,16,16,16,16,16,81,16,16,16,16,16,82,83,84,16,16,16,16,16,85,
|
|
|
+86,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,
|
|
|
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
|
|
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
|
|
+255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,248,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,254,255,255,255,255,191,182,0,0,0,0,0,0,0,63,0,255,23,0,0,0,0,0,248,255,
|
|
|
+255,0,0,1,0,0,0,0,0,0,0,0,0,0,0,192,191,159,61,0,0,0,128,2,0,0,0,255,255,255,
|
|
|
+7,0,0,0,0,0,0,0,0,0,0,192,255,1,0,0,0,0,0,0,248,15,32,0,0,192,251,239,62,0,0,
|
|
|
+0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,255,255,255,255,
|
|
|
+255,7,0,0,0,0,0,0,20,254,33,254,0,12,0,0,0,2,0,0,0,0,0,0,16,30,32,0,0,12,0,0,
|
|
|
+64,6,0,0,0,0,0,0,16,134,57,2,0,0,0,35,0,6,0,0,0,0,0,0,16,190,33,0,0,12,0,0,
|
|
|
+252,2,0,0,0,0,0,0,144,30,32,64,0,12,0,0,0,4,0,0,0,0,0,0,0,1,32,0,0,0,0,0,0,17,
|
|
|
+0,0,0,0,0,0,192,193,61,96,0,12,0,0,0,2,0,0,0,0,0,0,144,64,48,0,0,12,0,0,0,3,0,
|
|
|
+0,0,0,0,0,24,30,32,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,4,92,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+242,7,128,127,0,0,0,0,0,0,0,0,0,0,0,0,242,31,0,63,0,0,0,0,0,0,0,0,0,3,0,0,160,
|
|
|
+2,0,0,0,0,0,0,254,127,223,224,255,254,255,255,255,31,64,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,224,253,102,0,0,0,195,1,0,30,0,100,32,0,32,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
|
|
+255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,28,0,0,0,28,0,0,0,12,0,0,0,12,0,0,0,0,0,0,0,176,63,64,254,
|
|
|
+15,32,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,0,0,2,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,135,1,4,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+128,9,0,0,0,0,0,0,64,127,229,31,248,159,0,0,0,0,0,0,255,127,0,0,0,0,0,0,0,0,
|
|
|
+15,0,0,0,0,0,208,23,4,0,0,0,0,248,15,0,3,0,0,0,60,59,0,0,0,0,0,0,64,163,3,0,0,
|
|
|
+0,0,0,0,240,207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,255,253,33,16,
|
|
|
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,
|
|
|
+251,0,248,0,0,0,124,0,0,0,0,0,0,223,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,
|
|
|
+255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,3,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,
|
|
|
+0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,128,247,63,0,0,0,192,0,0,0,0,0,0,0,0,0,0,3,0,68,8,0,0,96,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,255,255,3,128,0,0,0,0,192,63,0,0,128,255,3,0,
|
|
|
+0,0,0,0,7,0,0,0,0,0,200,51,0,0,0,0,32,0,0,
|
|
|
+0,0,0,0,0,0,126,102,0,8,16,0,0,0,0,0,16,0,0,0,0,0,0,157,193,2,0,0,0,0,48,64,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,33,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,0,0,0,
|
|
|
+64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,
|
|
|
+255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,1,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,240,0,
|
|
|
+0,0,0,0,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,0,0,0,0,0,240,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,255,1,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,255,127,0,0,0,0,0,0,128,
|
|
|
+3,0,0,0,0,0,120,38,0,32,0,0,0,0,0,0,7,0,0,0,128,239,31,0,0,0,0,0,0,0,8,0,3,0,
|
|
|
+0,0,0,0,192,127,0,30,0,0,0,0,0,0,0,0,0,0,0,128,211,64,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,128,248,7,0,0,3,0,0,0,0,0,0,24,1,0,0,0,192,31,31,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,255,92,0,0,64,0,0,0,0,0,0,0,0,0,0,248,133,13,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,176,1,0,0,48,0,0,0,0,0,0,0,0,0,0,
|
|
|
+248,167,1,0,0,0,0,0,0,0,0,0,0,0,0,40,191,0,0,0,0,0,0,0,0,0,0,0,0,224,188,15,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,255,6,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,240,12,1,0,0,0,254,7,0,0,0,0,248,121,128,0,126,14,0,0,0,0,0,252,
|
|
|
+127,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,191,0,0,0,0,0,0,0,0,0,0,252,255,
|
|
|
+255,252,109,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,126,180,191,0,0,0,0,0,0,0,0,0,163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,255,
|
|
|
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,7,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,15,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,3,248,255,231,15,0,0,0,60,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,
|
|
|
+255,255,255,255,127,248,255,255,255,255,255,31,32,0,16,0,0,248,254,255,0,0,0,
|
|
|
+0,0,0,0,0,0,0,127,255,255,249,219,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,240,7,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
|
|
|
+
|
|
|
+static const unsigned char wtable[] = {
|
|
|
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,18,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,19,16,20,21,22,16,16,16,23,16,16,24,25,26,27,28,17,
|
|
|
+17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,29,
|
|
|
+17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
|
|
|
+17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
|
|
|
+17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
|
|
|
+17,17,17,17,17,17,17,17,30,16,16,16,16,31,16,16,17,17,17,17,17,17,17,17,17,17,
|
|
|
+17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
|
|
|
+17,17,17,17,17,17,17,32,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,16,16,16,33,
|
|
|
+34,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,35,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
|
|
|
+17,17,17,17,17,17,36,17,17,37,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,38,39,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
|
|
+16,16,16,16,16,16,16,40,41,42,43,44,45,46,47,16,48,49,16,16,16,16,
|
|
|
+16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,
|
|
|
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
|
|
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
|
|
+255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,6,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,48,0,0,0,0,0,0,255,15,0,0,0,0,128,0,0,8,
|
|
|
+0,2,12,0,96,48,64,16,0,0,4,44,36,32,12,0,0,0,1,0,0,0,80,184,0,0,0,0,0,0,0,224,
|
|
|
+0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,33,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,251,255,255,255,255,255,255,255,
|
|
|
+255,255,255,15,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
|
|
+255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,255,15,255,255,255,255,
|
|
|
+255,255,255,127,254,255,255,255,255,255,255,255,255,255,127,254,255,255,255,
|
|
|
+255,255,255,255,255,255,255,255,255,224,255,255,255,255,255,254,255,255,255,
|
|
|
+255,255,255,255,255,255,255,127,255,255,255,255,255,7,255,255,255,255,15,0,
|
|
|
+255,255,255,255,255,127,255,255,255,255,255,0,255,255,255,255,255,255,255,255,
|
|
|
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
|
|
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,
|
|
|
+0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
|
|
+255,31,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,
|
|
|
+255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
|
|
+255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,255,3,0,0,255,255,255,255,247,255,127,15,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,255,255,255,255,255,255,255,
|
|
|
+255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,255,255,255,255,255,255,255,255,255,255,255,
|
|
|
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
|
|
+255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
|
|
+255,255,255,255,255,255,255,255,255,255,255,255,7,0,255,255,255,127,0,0,0,0,0,
|
|
|
+0,7,0,240,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
|
|
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
|
|
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
|
|
+15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,0,64,254,7,0,0,0,0,0,0,0,0,0,0,0,0,7,0,255,255,255,
|
|
|
+255,255,15,255,1,3,0,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,
|
|
|
+1,224,191,255,255,255,255,255,255,255,255,223,255,255,15,0,255,255,255,255,
|
|
|
+255,135,15,0,255,255,17,255,255,255,255,255,255,255,255,127,253,255,255,255,
|
|
|
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
|
|
+159,255,255,255,255,255,255,255,63,0,120,255,255,255,0,0,4,0,0,96,0,16,0,0,0,
|
|
|
+0,0,0,0,0,0,0,248,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,255,255,
|
|
|
+255,255,255,255,255,255,63,16,39,0,0,24,240,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,0,0,0,0,0,0,0,0,0,0,0,255,15,0,
|
|
|
+0,0,224,255,255,255,255,255,255,255,255,255,255,255,255,123,252,255,255,255,
|
|
|
+255,231,199,255,255,255,231,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+0,15,7,7,0,63,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
+};
|
|
|
+
|
|
|
+/* Upper 6 state bits are a negative integer offset to bound-check next byte */
|
|
|
+/* equivalent to: ( (b-0x80) | (b+offset) ) & ~0x3f */
|
|
|
+#define OOB(c,b) (((((b)>>3)-0x10)|(((b)>>3)+((int32_t)(c)>>26))) & ~7)
|
|
|
+
|
|
|
+/* Interval [a,b). Either a must be 80 or b must be c0, lower 3 bits clear. */
|
|
|
+#define R(a,b) ((uint32_t)((a==0x80 ? 0x40u-b : 0u-a) << 23))
|
|
|
+#define FAILSTATE R(0x80,0x80)
|
|
|
+
|
|
|
+#define SA 0xc2u
|
|
|
+#define SB 0xf4u
|
|
|
+
|
|
|
+/* Arbitrary encoding for representing code units instead of characters. */
|
|
|
+#define CODEUNIT(c) (0xdfff & (signed char)(c))
|
|
|
+#define IS_CODEUNIT(c) ((unsigned)(c)-0xdf80 < 0x80)
|
|
|
+
|
|
|
+static int
|
|
|
+internal_mbtowc(wchar_t *restrict wc, const char *restrict src, size_t n)
|
|
|
+{
|
|
|
+#define C(x) ( x<2 ? -1 : ( R(0x80,0xc0) | x ) )
|
|
|
+#define D(x) C((x+16))
|
|
|
+#define E(x) ( ( x==0 ? R(0xa0,0xc0) : \
|
|
|
+ x==0xd ? R(0x80,0xa0) : \
|
|
|
+ R(0x80,0xc0) ) \
|
|
|
+ | ( R(0x80,0xc0) >> 6 ) \
|
|
|
+ | x )
|
|
|
+#define F(x) ( ( x>=5 ? 0 : \
|
|
|
+ x==0 ? R(0x90,0xc0) : \
|
|
|
+ x==4 ? R(0x80,0x90) : \
|
|
|
+ R(0x80,0xc0) ) \
|
|
|
+ | ( R(0x80,0xc0) >> 6 ) \
|
|
|
+ | ( R(0x80,0xc0) >> 12 ) \
|
|
|
+ | x )
|
|
|
+
|
|
|
+ static const uint32_t bittab[] = {
|
|
|
+ C(0x2),C(0x3),C(0x4),C(0x5),C(0x6),C(0x7),
|
|
|
+ C(0x8),C(0x9),C(0xa),C(0xb),C(0xc),C(0xd),C(0xe),C(0xf),
|
|
|
+ D(0x0),D(0x1),D(0x2),D(0x3),D(0x4),D(0x5),D(0x6),D(0x7),
|
|
|
+ D(0x8),D(0x9),D(0xa),D(0xb),D(0xc),D(0xd),D(0xe),D(0xf),
|
|
|
+ E(0x0),E(0x1),E(0x2),E(0x3),E(0x4),E(0x5),E(0x6),E(0x7),
|
|
|
+ E(0x8),E(0x9),E(0xa),E(0xb),E(0xc),E(0xd),E(0xe),E(0xf),
|
|
|
+ F(0x0),F(0x1),F(0x2),F(0x3),F(0x4)
|
|
|
+ };
|
|
|
+ unsigned c;
|
|
|
+ const unsigned char *s = (const void *)src;
|
|
|
+ wchar_t dummy;
|
|
|
+
|
|
|
+ if (!s) return 0;
|
|
|
+ if (!n) goto ilseq;
|
|
|
+ if (!wc) wc = &dummy;
|
|
|
+
|
|
|
+ if (*s < 0x80) return !!(*wc = *s);
|
|
|
+ if (MB_CUR_MAX==1) return (*wc = CODEUNIT(*s)), 1;
|
|
|
+ if (*s-SA > SB-SA) goto ilseq;
|
|
|
+ c = bittab[*s++-SA];
|
|
|
+
|
|
|
+ /* Avoid excessive checks against n: If shifting the state n-1
|
|
|
+ * times does not clear the high bit, then the value of n is
|
|
|
+ * insufficient to read a character */
|
|
|
+ if (n<4 && ((c<<(6*n-6)) & (1U<<31))) goto ilseq;
|
|
|
+
|
|
|
+ if (OOB(c,*s)) goto ilseq;
|
|
|
+ c = c<<6 | *s++-0x80;
|
|
|
+ if (!(c&(1U<<31))) {
|
|
|
+ *wc = c;
|
|
|
+ return 2;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (*s-0x80u >= 0x40) goto ilseq;
|
|
|
+ c = c<<6 | *s++-0x80;
|
|
|
+ if (!(c&(1U<<31))) {
|
|
|
+ *wc = c;
|
|
|
+ return 3;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (*s-0x80u >= 0x40) goto ilseq;
|
|
|
+ *wc = c<<6 | *s++-0x80;
|
|
|
+ return 4;
|
|
|
+
|
|
|
+ilseq:
|
|
|
+ errno = EILSEQ;
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+static int internal_wcwidth(wchar_t wc)
|
|
|
+{
|
|
|
+ if (wc < 0xff)
|
|
|
+ return (wc+1 & 0x7f) >= 0x21 ? 1 : wc ? -1 : 0;
|
|
|
+ if ((wc & 0xfffeffffU) < 0xfffe) {
|
|
|
+ if ((table[table[wc>>8]*32+((wc&255)>>3)]>>(wc&7))&1)
|
|
|
+ return 0;
|
|
|
+ if ((wtable[wtable[wc>>8]*32+((wc&255)>>3)]>>(wc&7))&1)
|
|
|
+ return 2;
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ if ((wc & 0xfffe) == 0xfffe)
|
|
|
+ return -1;
|
|
|
+ if (wc-0x20000U < 0x20000)
|
|
|
+ return 2;
|
|
|
+ if (wc == 0xe0001 || wc-0xe0020U < 0x5f || wc-0xe0100U < 0xef)
|
|
|
+ return 0;
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+#define mbtowc internal_mbtowc
|
|
|
+#define wcwidth internal_wcwidth
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+ssize_t utf8_nsyms(const char *str, size_t len)
|
|
|
+{
|
|
|
+ size_t nsyms = 0;
|
|
|
+ size_t ofs = 0;
|
|
|
+
|
|
|
+ while (ofs < len) {
|
|
|
+ wchar_t sym;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = mbtowc(&sym, str + ofs, len - ofs);
|
|
|
+ if (ret <= 0) {
|
|
|
+ ret = 1;
|
|
|
+ sym = 'A';
|
|
|
+ } else if ((size_t)ret > len) {
|
|
|
+ ret = len;
|
|
|
+ }
|
|
|
+
|
|
|
+ ofs += ret;
|
|
|
+ ret = wcwidth(sym);
|
|
|
+ if (ret < 0)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ nsyms += ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return nsyms;
|
|
|
+}
|