=> Building devel/libuninum Started : Sunday, 7 JUL 2019 at 17:50:51 UTC Platform: 5.7-DEVELOPMENT DragonFly v5.7.0.83.g49866-DEVELOPMENT #40: Sun Jun 30 03:00:04 PDT 2019 root@pkgbox64.dragonflybsd.org:/usr/obj/usr/src/sys/X86_64_GENERIC x86_64 -------------------------------------------------- -- Environment -------------------------------------------------- UNAME_r=5.4-SYNTH UNAME_m=x86_64 UNAME_p=x86_64 UNAME_v=DragonFly 5.4-SYNTH UNAME_s=DragonFly PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin SSL_NO_VERIFY_PEER=1 TERM=dumb PKG_CACHEDIR=/var/cache/pkg8 PKG_DBDIR=/var/db/pkg8 PORTSDIR=/xports LANG=C HOME=/root USER=root -------------------------------------------------- -- Options -------------------------------------------------- -------------------------------------------------- -- CONFIGURE_ENV -------------------------------------------------- XDG_DATA_HOME=/construction/devel/libuninum XDG_CONFIG_HOME=/construction/devel/libuninum HOME=/construction/devel/libuninum TMPDIR="/tmp" PATH=/construction/devel/libuninum/.bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin SHELL=/bin/sh CONFIG_SHELL=/bin/sh CCVER=gcc80 CMAKE_PREFIX_PATH="/usr/local" CONFIG_SITE=/xports/Templates/config.site lt_cv_sys_max_cmd_len=262144 -------------------------------------------------- -- CONFIGURE_ARGS -------------------------------------------------- --prefix=/usr/local ${_LATE_CONFIGURE_ARGS} -------------------------------------------------- -- MAKE_ENV -------------------------------------------------- XDG_DATA_HOME=/construction/devel/libuninum XDG_CONFIG_HOME=/construction/devel/libuninum HOME=/construction/devel/libuninum TMPDIR="/tmp" PATH=/construction/devel/libuninum/.bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin NO_PIE=yes MK_DEBUG_FILES=no MK_KERNEL_SYMBOLS=no SHELL=/bin/sh NO_LINT=YES CCVER=gcc80 PREFIX=/usr/local LOCALBASE=/usr/local NOPROFILE=1 CC="cc" CFLAGS="-pipe -O2 -isystem /usr/local/include -fno-strict-aliasing " CPP="cpp" CPPFLAGS="-isystem /usr/local/include" LDFLAGS=" " LIBS="-L/usr/local/lib" CXX="c++" CXXFLAGS=" -pipe -O2 -isystem /usr/local/include -fno-strict-aliasing -isystem /usr/local/include " MANPREFIX="/usr/local" BSD_INSTALL_PROGRAM="install -s -m 555" BSD_INSTALL_LIB="install -s -m 0644" BSD_INSTALL_SCRIPT="install -m 555" BSD_INSTALL_DATA="install -m 0644" BSD_INSTALL_MAN="install -m 444" -------------------------------------------------- -- MAKE_ARGS -------------------------------------------------- DESTDIR=/construction/devel/libuninum/stage -------------------------------------------------- -- PLIST_SUB -------------------------------------------------- OSREL=5.4 PREFIX=%D LOCALBASE=/usr/local RESETPREFIX=/usr/local LIB32DIR=lib PROFILE="@comment " DOCSDIR="share/doc/libuninum" EXAMPLESDIR="share/examples/libuninum" DATADIR="share/libuninum" WWWDIR="www/libuninum" ETCDIR="etc/libuninum" -------------------------------------------------- -- SUB_LIST -------------------------------------------------- PREFIX=/usr/local LOCALBASE=/usr/local DATADIR=/usr/local/share/libuninum DOCSDIR=/usr/local/share/doc/libuninum EXAMPLESDIR=/usr/local/share/examples/libuninum WWWDIR=/usr/local/www/libuninum ETCDIR=/usr/local/etc/libuninum -------------------------------------------------- -- /etc/make.conf -------------------------------------------------- SYNTHPROFILE=Release-5.4 USE_PACKAGE_DEPENDS_ONLY=yes PACKAGE_BUILDING=yes BATCH=yes PKG_CREATE_VERBOSE=yes PORTSDIR=/xports DISTDIR=/distfiles WRKDIRPREFIX=/construction PORT_DBDIR=/options PACKAGES=/packages MAKE_JOBS_NUMBER_LIMIT=5 HAVE_COMPAT_IA32_KERN= CONFIGURE_MAX_CMD_LEN=262144 _PERL5_FROM_BIN=5.28.1 _ALTCCVERSION_921dbbb2=none _OBJC_ALTCCVERSION_921dbbb2=none _SMP_CPUS=8 UID=0 ARCH=x86_64 OPSYS=DragonFly DFLYVERSION=500400 OSVERSION=9999999 OSREL=5.4 _OSRELEASE=5.4-SYNTH PYTHONBASE=/usr/local _PKG_CHECKED=1 -------------------------------------------------------------------------------- -- Phase: check-sanity -------------------------------------------------------------------------------- ===> NOTICE: The libuninum port currently does not have a maintainer. As a result, it is more likely to have unresolved issues, not be up-to-date, or even be removed in the future. To volunteer to maintain this port, please create an issue at: https://bugs.freebsd.org/bugzilla More information about port maintainership is available at: https://www.freebsd.org/doc/en/articles/contributing/ports-contributing.html#maintain-port -------------------------------------------------------------------------------- -- Phase: pkg-depends -------------------------------------------------------------------------------- ===> libuninum-2.7_4 depends on file: /usr/local/sbin/pkg - not found ===> Installing existing package /packages/All/pkg-1.11.1.txz Installing pkg-1.11.1... Extracting pkg-1.11.1: .......... done ===> libuninum-2.7_4 depends on file: /usr/local/sbin/pkg - found ===> Returning to build of libuninum-2.7_4 -------------------------------------------------------------------------------- -- Phase: fetch-depends -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Phase: fetch -------------------------------------------------------------------------------- ===> NOTICE: The libuninum port currently does not have a maintainer. As a result, it is more likely to have unresolved issues, not be up-to-date, or even be removed in the future. To volunteer to maintain this port, please create an issue at: https://bugs.freebsd.org/bugzilla More information about port maintainership is available at: https://www.freebsd.org/doc/en/articles/contributing/ports-contributing.html#maintain-port ===> Fetching all distfiles required by libuninum-2.7_4 for building -------------------------------------------------------------------------------- -- Phase: checksum -------------------------------------------------------------------------------- ===> NOTICE: The libuninum port currently does not have a maintainer. As a result, it is more likely to have unresolved issues, not be up-to-date, or even be removed in the future. To volunteer to maintain this port, please create an issue at: https://bugs.freebsd.org/bugzilla More information about port maintainership is available at: https://www.freebsd.org/doc/en/articles/contributing/ports-contributing.html#maintain-port ===> Fetching all distfiles required by libuninum-2.7_4 for building => SHA256 Checksum OK for libuninum-2.7.tar.bz2. -------------------------------------------------------------------------------- -- Phase: extract-depends -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Phase: extract -------------------------------------------------------------------------------- ===> NOTICE: The libuninum port currently does not have a maintainer. As a result, it is more likely to have unresolved issues, not be up-to-date, or even be removed in the future. To volunteer to maintain this port, please create an issue at: https://bugs.freebsd.org/bugzilla More information about port maintainership is available at: https://www.freebsd.org/doc/en/articles/contributing/ports-contributing.html#maintain-port ===> Fetching all distfiles required by libuninum-2.7_4 for building ===> Extracting for libuninum-2.7_4 => SHA256 Checksum OK for libuninum-2.7.tar.bz2. -------------------------------------------------------------------------------- -- Phase: patch-depends -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Phase: patch -------------------------------------------------------------------------------- ===> Patching for libuninum-2.7_4 -------------------------------------------------------------------------------- -- Phase: build-depends -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Phase: lib-depends -------------------------------------------------------------------------------- ===> libuninum-2.7_4 depends on shared library: libgmp.so - not found ===> Installing existing package /packages/All/gmp-6.1.2_1.txz Installing gmp-6.1.2_1... `-- Installing indexinfo-0.3.1... `-- Extracting indexinfo-0.3.1: .... done Extracting gmp-6.1.2_1: .......... done ===> libuninum-2.7_4 depends on shared library: libgmp.so - found (/usr/local/lib/libgmp.so) ===> Returning to build of libuninum-2.7_4 -------------------------------------------------------------------------------- -- Phase: configure -------------------------------------------------------------------------------- ===> Configuring for libuninum-2.7_4 configure: loading site script /xports/Templates/config.site checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for gawk... (cached) /usr/bin/awk checking whether make sets $(MAKE)... yes checking for gcc... cc checking for C compiler default output file name... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no checking for suffix of executables... checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether cc accepts -g... yes checking for cc option to accept ANSI C... none needed checking for style of include used by make... GNU checking dependency style of cc... gcc3 checking for a BSD-compatible install... /usr/bin/install -c checking build system type... x86_64-portbld-dragonfly5.4 checking host system type... x86_64-portbld-dragonfly5.4 checking for a sed that does not truncate output... /usr/bin/sed checking for egrep... grep -E checking for ld used by cc... /usr/bin/ld checking if the linker (/usr/bin/ld) is GNU ld... yes checking for /usr/bin/ld option to reload object files... -r checking for BSD-compatible nm... /usr/bin/nm -B checking whether ln -s works... yes checking how to recognise dependent libraries... pass_all checking how to run the C preprocessor... cpp checking for ANSI C header files... (cached) yes checking for sys/types.h... (cached) yes checking for sys/stat.h... (cached) yes checking for stdlib.h... (cached) yes checking for string.h... (cached) yes checking for memory.h... (cached) yes checking for strings.h... (cached) yes checking for inttypes.h... (cached) yes checking for stdint.h... (cached) yes checking for unistd.h... (cached) yes checking for dlfcn.h... (cached) yes checking whether we are using the GNU C++ compiler... yes checking whether c++ accepts -g... yes checking dependency style of c++... gcc3 checking how to run the C++ preprocessor... c++ -E checking for g77... no checking for f77... no checking for xlf... no checking for frt... no checking for pgf77... no checking for fort77... no checking for fl32... no checking for af77... no checking for f90... no checking for xlf90... no checking for pgf90... no checking for epcf90... no checking for f95... no checking for fort... no checking for xlf95... no checking for ifc... no checking for efc... no checking for pgf95... no checking for lf95... no checking for gfortran... no checking whether we are using the GNU Fortran 77 compiler... no checking whether accepts -g... no checking the maximum length of command line arguments... (cached) 262144 checking command to parse /usr/bin/nm -B output from cc object... ok checking for objdir... .libs checking for ar... ar checking for ranlib... ranlib checking for strip... strip checking if cc supports -fno-rtti -fno-exceptions... no checking for cc option to produce PIC... -fPIC checking if cc PIC flag -fPIC works... yes checking if cc static flag -static works... yes checking if cc supports -c -o file.o... yes checking whether the cc linker (/usr/bin/ld) supports shared libraries... yes checking whether -lc should be explicitly linked in... no checking dynamic linker characteristics... dragonfly5.4 ld.so checking how to hardcode library paths into programs... immediate checking whether stripping libraries is possible... yes checking if libtool supports shared libraries... yes checking whether to build shared libraries... yes checking whether to build static libraries... yes configure: creating libtool appending configuration tag "CXX" to libtool checking for ld used by c++... /usr/bin/ld checking if the linker (/usr/bin/ld) is GNU ld... yes checking whether the c++ linker (/usr/bin/ld) supports shared libraries... yes checking for c++ option to produce PIC... -fPIC checking if c++ PIC flag -fPIC works... yes checking if c++ static flag -static works... yes checking if c++ supports -c -o file.o... yes checking whether the c++ linker (/usr/bin/ld) supports shared libraries... yes checking dynamic linker characteristics... dragonfly5.4 ld.so checking how to hardcode library paths into programs... immediate appending configuration tag "F77" to libtool checking for ANSI C header files... (cached) yes checking for alloca.h... (cached) no checking for ctype.h... (cached) yes checking gmp.h usability... yes checking gmp.h presence... yes checking for gmp.h... yes checking for langinfo.h... (cached) yes checking for limits.h... (cached) yes checking for locale.h... (cached) yes checking for math.h... (cached) yes checking for stddef.h... (cached) yes checking for stdlib.h... (cached) yes checking for string.h... (cached) yes checking for strings.h... (cached) yes checking for unistd.h... (cached) yes checking for wchar.h... (cached) yes checking for an ANSI C-conforming const... yes checking for inline... inline checking for size_t... (cached) yes checking for working alloca.h... no checking for alloca... yes checking for stdlib.h... (cached) yes checking for GNU libc compatible malloc... (cached) yes checking for getopt_long... yes checking for localeconv... yes checking for setlocale... (cached) yes checking for strrchr... (cached) yes checking for wcschr... yes checking for __gmpz_init in -lgmp... yes configure: creating ./config.status config.status: creating Makefile config.status: creating config.h config.status: executing depfiles commands -------------------------------------------------------------------------------- -- Phase: build -------------------------------------------------------------------------------- ===> Building for libuninum-2.7_4 --- all --- /usr/bin/make all-am --- uninum.lo --- --- numconv.o --- --- uniio.o --- --- wcgetline.o --- --- ExplicateBadUTF8.o --- --- uninum.lo --- if /bin/sh ./libtool --tag=CC --mode=compile cc -DHAVE_CONFIG_H -I. -I. -I. -isystem /usr/local/include -DALLOCAOK -std=gnu99 -pipe -O2 -isystem /usr/local/include -fno-strict-aliasing -MT uninum.lo -MD -MP -MF ".deps/uninum.Tpo" -c -o uninum.lo uninum.c; then mv -f ".deps/uninum.Tpo" ".deps/uninum.Plo"; else rm -f ".deps/uninum.Tpo"; exit 1; fi --- numconv.o --- if cc -DHAVE_CONFIG_H -I. -I. -I. -isystem /usr/local/include -DALLOCAOK -std=gnu99 -pipe -O2 -isystem /usr/local/include -fno-strict-aliasing -MT numconv.o -MD -MP -MF ".deps/numconv.Tpo" -c -o numconv.o numconv.c; then mv -f ".deps/numconv.Tpo" ".deps/numconv.Po"; else rm -f ".deps/numconv.Tpo"; exit 1; fi --- uniio.o --- if cc -DHAVE_CONFIG_H -I. -I. -I. -isystem /usr/local/include -DALLOCAOK -std=gnu99 -pipe -O2 -isystem /usr/local/include -fno-strict-aliasing -MT uniio.o -MD -MP -MF ".deps/uniio.Tpo" -c -o uniio.o uniio.c; then mv -f ".deps/uniio.Tpo" ".deps/uniio.Po"; else rm -f ".deps/uniio.Tpo"; exit 1; fi --- wcgetline.o --- if cc -DHAVE_CONFIG_H -I. -I. -I. -isystem /usr/local/include -DALLOCAOK -std=gnu99 -pipe -O2 -isystem /usr/local/include -fno-strict-aliasing -MT wcgetline.o -MD -MP -MF ".deps/wcgetline.Tpo" -c -o wcgetline.o wcgetline.c; then mv -f ".deps/wcgetline.Tpo" ".deps/wcgetline.Po"; else rm -f ".deps/wcgetline.Tpo"; exit 1; fi --- ExplicateBadUTF8.o --- if cc -DHAVE_CONFIG_H -I. -I. -I. -isystem /usr/local/include -DALLOCAOK -std=gnu99 -pipe -O2 -isystem /usr/local/include -fno-strict-aliasing -MT ExplicateBadUTF8.o -MD -MP -MF ".deps/ExplicateBadUTF8.Tpo" -c -o ExplicateBadUTF8.o ExplicateBadUTF8.c; then mv -f ".deps/ExplicateBadUTF8.Tpo" ".deps/ExplicateBadUTF8.Po"; else rm -f ".deps/ExplicateBadUTF8.Tpo"; exit 1; fi --- binfmt.o --- if cc -DHAVE_CONFIG_H -I. -I. -I. -isystem /usr/local/include -DALLOCAOK -std=gnu99 -pipe -O2 -isystem /usr/local/include -fno-strict-aliasing -MT binfmt.o -MD -MP -MF ".deps/binfmt.Tpo" -c -o binfmt.o binfmt.c; then mv -f ".deps/binfmt.Tpo" ".deps/binfmt.Po"; else rm -f ".deps/binfmt.Tpo"; exit 1; fi --- uninum.lo --- mkdir .libs cc -DHAVE_CONFIG_H -I. -I. -I. -isystem /usr/local/include -DALLOCAOK -std=gnu99 -pipe -O2 -isystem /usr/local/include -fno-strict-aliasing -MT uninum.lo -MD -MP -MF .deps/uninum.Tpo -c uninum.c -fPIC -DPIC -o .libs/uninum.o uninum.c: In function 'wcsrev': uninum.c:38:26: warning: passing argument 1 of 'wcslen' from incompatible pointer type [-Wincompatible-pointer-types] #define ucslen(x) wcslen((signed long *) x) ^~~~~~~~~~~~~~~~~~ #define ucscpy(x,y) (UTF32 *)wcscpy((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucscat(x,y) (UTF32 *)wcscat((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucschr(x,y) (UTF32 *)wcschr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucsrchr(x,y) (UTF32 *)wcsrchr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define UNINUM ~~~~~~~~~~~~~~ #include "config.h" ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~ #include "unicode.h" ~~~~~~~~~~~~~~~~~~~~ #include "uninum.h" ~~~~~~~~~~~~~~~~~~~ #include "nsdefs.h" ~~~~~~~~~~~~~~~~~~~ #include "exitcode.h" ~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_LOCALE_H ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ int uninum_err; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 tcl_uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short uninum_ns_type; /* Exported for sanity-checking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Exported for parameter setting */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Input_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_General_Group_Size = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_First_Group_Size = 3; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 Uninum_Output_Group_Separator = 0x002C; /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Generate_Roman_With_Bar_P = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We're currently not dealing with non-integers - this is just forward-looking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static UTF32 Uninum_Output_Decimal_Separator = 0x002E; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* (10^97)-1, in hex for compactness and speed of conversion to binary */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MAXCHINESEHEX "4AE825771DC07672DDD0F8E8AC39250971AC4210CECB6F656CAEB9109FFFFFFFFFFFFFFFFFFFFFFFF" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_THOUSANDS_SIGN 0x0482 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_TITLO 0x0483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DECIMAL_MARKER 0xE06C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_MARKER 0xE06D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_LSD_MARKER 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DEC 0xE06A ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_EL 0xE06B ~~~~~~~~~~~~~~~~~~~~~~~~~~ char *uninum_version(void) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return(VERSION); ~~~~~~~~~~~~~~~~ } ~ #ifdef HAVE_LOCALECONV ~~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_SETLOCALE ~~~~~~~~~~~~~~~~~~~~~ void GetLocaleGroupInfo (){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct lconv *lcptr; ~~~~~~~~~~~~~~~~~~~~ setlocale(LC_NUMERIC,""); ~~~~~~~~~~~~~~~~~~~~~~~~~ lcptr = localeconv(); ~~~~~~~~~~~~~~~~~~~~~ if(lcptr == NULL) { ~~~~~~~~~~~~~~~~~~~ fprintf(stderr,"Attempt to obtain locale information was unsuccessful.\n"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ Uninum_Output_Group_Separator = (UTF16) (lcptr->thousands_sep[0]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Uninum_Output_First_Group_Size = lcptr->grouping[0]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(lcptr->grouping[1] != 0) Uninum_Output_General_Group_Size = lcptr->grouping[1]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Uninum_Output_General_Group_Size = Uninum_Output_First_Group_Size; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ #endif ~~~~~~ #endif ~~~~~~ /* Auxiliary functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long ipow(int base, int cnt) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ unsigned long Result; ~~~~~~~~~~~~~~~~~~~~~ i = 1; ~~~~~~ Result = 1; ~~~~~~~~~~~ while (i++ <= cnt) Result *= base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return Result; ~~~~~~~~~~~~~~ } ~ /* ~~ * Copy a string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static char *strpcpy(char *dest, const char *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *t; ~~~~~~~~ const char *s; ~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0) { ~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0; ~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Case-insenstive ascii string comparison. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Emulates BSD 4.4 function emulated by GNU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static int mystrcasecmp(char *a, char *b) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char ac; ~~~~~~~~ char bc; ~~~~~~~~ while(*a != '\0') { ~~~~~~~~~~~~~~~~~~~ ac = tolower(*a++); ~~~~~~~~~~~~~~~~~~~ bc = tolower(*b++); ~~~~~~~~~~~~~~~~~~~ if(ac < bc) return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~ if(ac > bc) return (1); ~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(*b != '\0') return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (0); ~~~~~~~~~~~ } ~ /* ~~ * Copy a wide string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ * This emulates the GNU extension wcpcpy(). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *ucpcpy(UTF32 *dest, const UTF32 *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ const UTF32 *s; ~~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Reverse a wide string in place. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *wcsrev(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *q; ~~~~~~~~~ UTF32 *h; ~~~~~~~~~ UTF32 t; ~~~~~~~~ p = s; ~~~~~~ q = s + ucslen(s)-1; ~~~~~~~~~~~~~~~~ uninum.c:192:11: note: in expansion of macro 'ucslen' q = s + ucslen(s)-1; ^~~~~~ In file included from uninum.c:53: /usr/include/wchar.h:174:15: note: expected 'const wchar_t *' {aka 'const int *'} but argument is of type 'long int *' size_t wcslen(const wchar_t *) __pure; ^~~~~~~~~~~~~~~ uninum.c:38:26: warning: passing argument 1 of 'wcslen' from incompatible pointer type [-Wincompatible-pointer-types] #define ucslen(x) wcslen((signed long *) x) ^~~~~~~~~~~~~~~~~~ #define ucscpy(x,y) (UTF32 *)wcscpy((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucscat(x,y) (UTF32 *)wcscat((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucschr(x,y) (UTF32 *)wcschr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucsrchr(x,y) (UTF32 *)wcsrchr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define UNINUM ~~~~~~~~~~~~~~ #include "config.h" ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~ #include "unicode.h" ~~~~~~~~~~~~~~~~~~~~ #include "uninum.h" ~~~~~~~~~~~~~~~~~~~ #include "nsdefs.h" ~~~~~~~~~~~~~~~~~~~ #include "exitcode.h" ~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_LOCALE_H ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ int uninum_err; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 tcl_uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short uninum_ns_type; /* Exported for sanity-checking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Exported for parameter setting */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Input_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_General_Group_Size = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_First_Group_Size = 3; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 Uninum_Output_Group_Separator = 0x002C; /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Generate_Roman_With_Bar_P = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We're currently not dealing with non-integers - this is just forward-looking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static UTF32 Uninum_Output_Decimal_Separator = 0x002E; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* (10^97)-1, in hex for compactness and speed of conversion to binary */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MAXCHINESEHEX "4AE825771DC07672DDD0F8E8AC39250971AC4210CECB6F656CAEB9109FFFFFFFFFFFFFFFFFFFFFFFF" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_THOUSANDS_SIGN 0x0482 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_TITLO 0x0483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DECIMAL_MARKER 0xE06C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_MARKER 0xE06D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_LSD_MARKER 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DEC 0xE06A ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_EL 0xE06B ~~~~~~~~~~~~~~~~~~~~~~~~~~ char *uninum_version(void) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return(VERSION); ~~~~~~~~~~~~~~~~ } ~ #ifdef HAVE_LOCALECONV ~~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_SETLOCALE ~~~~~~~~~~~~~~~~~~~~~ void GetLocaleGroupInfo (){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct lconv *lcptr; ~~~~~~~~~~~~~~~~~~~~ setlocale(LC_NUMERIC,""); ~~~~~~~~~~~~~~~~~~~~~~~~~ lcptr = localeconv(); ~~~~~~~~~~~~~~~~~~~~~ if(lcptr == NULL) { ~~~~~~~~~~~~~~~~~~~ fprintf(stderr,"Attempt to obtain locale information was unsuccessful.\n"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ Uninum_Output_Group_Separator = (UTF16) (lcptr->thousands_sep[0]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Uninum_Output_First_Group_Size = lcptr->grouping[0]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(lcptr->grouping[1] != 0) Uninum_Output_General_Group_Size = lcptr->grouping[1]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Uninum_Output_General_Group_Size = Uninum_Output_First_Group_Size; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ #endif ~~~~~~ #endif ~~~~~~ /* Auxiliary functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long ipow(int base, int cnt) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ unsigned long Result; ~~~~~~~~~~~~~~~~~~~~~ i = 1; ~~~~~~ Result = 1; ~~~~~~~~~~~ while (i++ <= cnt) Result *= base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return Result; ~~~~~~~~~~~~~~ } ~ /* ~~ * Copy a string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static char *strpcpy(char *dest, const char *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *t; ~~~~~~~~ const char *s; ~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0) { ~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0; ~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Case-insenstive ascii string comparison. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Emulates BSD 4.4 function emulated by GNU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static int mystrcasecmp(char *a, char *b) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char ac; ~~~~~~~~ char bc; ~~~~~~~~ while(*a != '\0') { ~~~~~~~~~~~~~~~~~~~ ac = tolower(*a++); ~~~~~~~~~~~~~~~~~~~ bc = tolower(*b++); ~~~~~~~~~~~~~~~~~~~ if(ac < bc) return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~ if(ac > bc) return (1); ~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(*b != '\0') return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (0); ~~~~~~~~~~~ } ~ /* ~~ * Copy a wide string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ * This emulates the GNU extension wcpcpy(). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *ucpcpy(UTF32 *dest, const UTF32 *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ const UTF32 *s; ~~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Reverse a wide string in place. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *wcsrev(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *q; ~~~~~~~~~ UTF32 *h; ~~~~~~~~~ UTF32 t; ~~~~~~~~ p = s; ~~~~~~ q = s + ucslen(s)-1; ~~~~~~~~~~~~~~~~~~~~ h = s + (ucslen(s)/2); ~~~~~~~~~~~~~~~~~ uninum.c:193:12: note: in expansion of macro 'ucslen' h = s + (ucslen(s)/2); ^~~~~~ In file included from uninum.c:53: /usr/include/wchar.h:174:15: note: expected 'const wchar_t *' {aka 'const int *'} but argument is of type 'long int *' size_t wcslen(const wchar_t *) __pure; ^~~~~~~~~~~~~~~ uninum.c: In function 'Prepend': uninum.c:38:26: warning: passing argument 1 of 'wcslen' from incompatible pointer type [-Wincompatible-pointer-types] #define ucslen(x) wcslen((signed long *) x) ^~~~~~~~~~~~~~~~~~ #define ucscpy(x,y) (UTF32 *)wcscpy((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucscat(x,y) (UTF32 *)wcscat((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucschr(x,y) (UTF32 *)wcschr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucsrchr(x,y) (UTF32 *)wcsrchr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define UNINUM ~~~~~~~~~~~~~~ #include "config.h" ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~ #include "unicode.h" ~~~~~~~~~~~~~~~~~~~~ #include "uninum.h" ~~~~~~~~~~~~~~~~~~~ #include "nsdefs.h" ~~~~~~~~~~~~~~~~~~~ #include "exitcode.h" ~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_LOCALE_H ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ int uninum_err; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 tcl_uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short uninum_ns_type; /* Exported for sanity-checking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Exported for parameter setting */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Input_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_General_Group_Size = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_First_Group_Size = 3; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 Uninum_Output_Group_Separator = 0x002C; /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Generate_Roman_With_Bar_P = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We're currently not dealing with non-integers - this is just forward-looking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static UTF32 Uninum_Output_Decimal_Separator = 0x002E; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* (10^97)-1, in hex for compactness and speed of conversion to binary */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MAXCHINESEHEX "4AE825771DC07672DDD0F8E8AC39250971AC4210CECB6F656CAEB9109FFFFFFFFFFFFFFFFFFFFFFFF" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_THOUSANDS_SIGN 0x0482 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_TITLO 0x0483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DECIMAL_MARKER 0xE06C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_MARKER 0xE06D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_LSD_MARKER 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DEC 0xE06A ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_EL 0xE06B ~~~~~~~~~~~~~~~~~~~~~~~~~~ char *uninum_version(void) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return(VERSION); ~~~~~~~~~~~~~~~~ } ~ #ifdef HAVE_LOCALECONV ~~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_SETLOCALE ~~~~~~~~~~~~~~~~~~~~~ void GetLocaleGroupInfo (){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct lconv *lcptr; ~~~~~~~~~~~~~~~~~~~~ setlocale(LC_NUMERIC,""); ~~~~~~~~~~~~~~~~~~~~~~~~~ lcptr = localeconv(); ~~~~~~~~~~~~~~~~~~~~~ if(lcptr == NULL) { ~~~~~~~~~~~~~~~~~~~ fprintf(stderr,"Attempt to obtain locale information was unsuccessful.\n"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ Uninum_Output_Group_Separator = (UTF16) (lcptr->thousands_sep[0]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Uninum_Output_First_Group_Size = lcptr->grouping[0]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(lcptr->grouping[1] != 0) Uninum_Output_General_Group_Size = lcptr->grouping[1]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Uninum_Output_General_Group_Size = Uninum_Output_First_Group_Size; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ #endif ~~~~~~ #endif ~~~~~~ /* Auxiliary functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long ipow(int base, int cnt) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ unsigned long Result; ~~~~~~~~~~~~~~~~~~~~~ i = 1; ~~~~~~ Result = 1; ~~~~~~~~~~~ while (i++ <= cnt) Result *= base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return Result; ~~~~~~~~~~~~~~ } ~ /* ~~ * Copy a string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static char *strpcpy(char *dest, const char *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *t; ~~~~~~~~ const char *s; ~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0) { ~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0; ~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Case-insenstive ascii string comparison. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Emulates BSD 4.4 function emulated by GNU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static int mystrcasecmp(char *a, char *b) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char ac; ~~~~~~~~ char bc; ~~~~~~~~ while(*a != '\0') { ~~~~~~~~~~~~~~~~~~~ ac = tolower(*a++); ~~~~~~~~~~~~~~~~~~~ bc = tolower(*b++); ~~~~~~~~~~~~~~~~~~~ if(ac < bc) return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~ if(ac > bc) return (1); ~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(*b != '\0') return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (0); ~~~~~~~~~~~ } ~ /* ~~ * Copy a wide string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ * This emulates the GNU extension wcpcpy(). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *ucpcpy(UTF32 *dest, const UTF32 *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ const UTF32 *s; ~~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Reverse a wide string in place. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *wcsrev(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *q; ~~~~~~~~~ UTF32 *h; ~~~~~~~~~ UTF32 t; ~~~~~~~~ p = s; ~~~~~~ q = s + ucslen(s)-1; ~~~~~~~~~~~~~~~~~~~~ h = s + (ucslen(s)/2); ~~~~~~~~~~~~~~~~~~~~~~ while (q >= h) { ~~~~~~~~~~~~~~~~ t = *p; ~~~~~~~ *p++ = *q; ~~~~~~~~~~ *q-- = t; ~~~~~~~~~ } ~ return(s); ~~~~~~~~~~ } ~ /* ~~ * Prepend a character to a string, returning new storage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * and freeing the old. ~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *Prepend(UTF32 *s, UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ len = ucslen(s); ~~~~~~~~~~~~~~ uninum.c:210:9: note: in expansion of macro 'ucslen' len = ucslen(s); ^~~~~~ In file included from uninum.c:53: /usr/include/wchar.h:174:15: note: expected 'const wchar_t *' {aka 'const int *'} but argument is of type 'long int *' size_t wcslen(const wchar_t *) __pure; ^~~~~~~~~~~~~~~ uninum.c:215:15: warning: passing argument 1 of 'wcscpy' from incompatible pointer type [-Wincompatible-pointer-types] #define ucscpy(x,y) (UTF32 *)wcscpy((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucscat(x,y) (UTF32 *)wcscat((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucschr(x,y) (UTF32 *)wcschr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucsrchr(x,y) (UTF32 *)wcsrchr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define UNINUM ~~~~~~~~~~~~~~ #include "config.h" ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~ #include "unicode.h" ~~~~~~~~~~~~~~~~~~~~ #include "uninum.h" ~~~~~~~~~~~~~~~~~~~ #include "nsdefs.h" ~~~~~~~~~~~~~~~~~~~ #include "exitcode.h" ~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_LOCALE_H ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ int uninum_err; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 tcl_uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short uninum_ns_type; /* Exported for sanity-checking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Exported for parameter setting */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Input_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_General_Group_Size = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_First_Group_Size = 3; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 Uninum_Output_Group_Separator = 0x002C; /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Generate_Roman_With_Bar_P = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We're currently not dealing with non-integers - this is just forward-looking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static UTF32 Uninum_Output_Decimal_Separator = 0x002E; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* (10^97)-1, in hex for compactness and speed of conversion to binary */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MAXCHINESEHEX "4AE825771DC07672DDD0F8E8AC39250971AC4210CECB6F656CAEB9109FFFFFFFFFFFFFFFFFFFFFFFF" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_THOUSANDS_SIGN 0x0482 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_TITLO 0x0483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DECIMAL_MARKER 0xE06C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_MARKER 0xE06D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_LSD_MARKER 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DEC 0xE06A ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_EL 0xE06B ~~~~~~~~~~~~~~~~~~~~~~~~~~ char *uninum_version(void) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return(VERSION); ~~~~~~~~~~~~~~~~ } ~ #ifdef HAVE_LOCALECONV ~~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_SETLOCALE ~~~~~~~~~~~~~~~~~~~~~ void GetLocaleGroupInfo (){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct lconv *lcptr; ~~~~~~~~~~~~~~~~~~~~ setlocale(LC_NUMERIC,""); ~~~~~~~~~~~~~~~~~~~~~~~~~ lcptr = localeconv(); ~~~~~~~~~~~~~~~~~~~~~ if(lcptr == NULL) { ~~~~~~~~~~~~~~~~~~~ fprintf(stderr,"Attempt to obtain locale information was unsuccessful.\n"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ Uninum_Output_Group_Separator = (UTF16) (lcptr->thousands_sep[0]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Uninum_Output_First_Group_Size = lcptr->grouping[0]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(lcptr->grouping[1] != 0) Uninum_Output_General_Group_Size = lcptr->grouping[1]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Uninum_Output_General_Group_Size = Uninum_Output_First_Group_Size; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ #endif ~~~~~~ #endif ~~~~~~ /* Auxiliary functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long ipow(int base, int cnt) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ unsigned long Result; ~~~~~~~~~~~~~~~~~~~~~ i = 1; ~~~~~~ Result = 1; ~~~~~~~~~~~ while (i++ <= cnt) Result *= base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return Result; ~~~~~~~~~~~~~~ } ~ /* ~~ * Copy a string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static char *strpcpy(char *dest, const char *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *t; ~~~~~~~~ const char *s; ~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0) { ~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0; ~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Case-insenstive ascii string comparison. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Emulates BSD 4.4 function emulated by GNU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static int mystrcasecmp(char *a, char *b) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char ac; ~~~~~~~~ char bc; ~~~~~~~~ while(*a != '\0') { ~~~~~~~~~~~~~~~~~~~ ac = tolower(*a++); ~~~~~~~~~~~~~~~~~~~ bc = tolower(*b++); ~~~~~~~~~~~~~~~~~~~ if(ac < bc) return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~ if(ac > bc) return (1); ~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(*b != '\0') return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (0); ~~~~~~~~~~~ } ~ /* ~~ * Copy a wide string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ * This emulates the GNU extension wcpcpy(). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *ucpcpy(UTF32 *dest, const UTF32 *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ const UTF32 *s; ~~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Reverse a wide string in place. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *wcsrev(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *q; ~~~~~~~~~ UTF32 *h; ~~~~~~~~~ UTF32 t; ~~~~~~~~ p = s; ~~~~~~ q = s + ucslen(s)-1; ~~~~~~~~~~~~~~~~~~~~ h = s + (ucslen(s)/2); ~~~~~~~~~~~~~~~~~~~~~~ while (q >= h) { ~~~~~~~~~~~~~~~~ t = *p; ~~~~~~~ *p++ = *q; ~~~~~~~~~~ *q-- = t; ~~~~~~~~~ } ~ return(s); ~~~~~~~~~~ } ~ /* ~~ * Prepend a character to a string, returning new storage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * and freeing the old. ~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *Prepend(UTF32 *s, UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ new = malloc(sizeof(UTF32) * (len + 2)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new) { ~~~~~~~~~ new[0] = c; ~~~~~~~~~~~ new[1] = 0x0000; ~~~~~~~~~~~~~~~~ ucscpy(new+1,s); ~~~~~~~~~~^~ uninum.c:39:52: note: in definition of macro 'ucscpy' #define ucscpy(x,y) (UTF32 *)wcscpy((signed long *)x,(signed long *)y) ^ In file included from uninum.c:53: /usr/include/wchar.h:170:10: note: expected 'wchar_t * restrict' {aka 'int * restrict'} but argument is of type 'long int *' wchar_t *wcscpy(wchar_t * __restrict, const wchar_t * __restrict); ^~~~~~ uninum.c:39:54: warning: passing argument 2 of 'wcscpy' from incompatible pointer type [-Wincompatible-pointer-types] #define ucscpy(x,y) (UTF32 *)wcscpy((signed long *)x,(signed long *)y) ^~~~~~~~~~~~~~~~~ #define ucscat(x,y) (UTF32 *)wcscat((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucschr(x,y) (UTF32 *)wcschr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucsrchr(x,y) (UTF32 *)wcsrchr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define UNINUM ~~~~~~~~~~~~~~ #include "config.h" ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~ #include "unicode.h" ~~~~~~~~~~~~~~~~~~~~ #include "uninum.h" ~~~~~~~~~~~~~~~~~~~ #include "nsdefs.h" ~~~~~~~~~~~~~~~~~~~ #include "exitcode.h" ~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_LOCALE_H ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ int uninum_err; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 tcl_uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short uninum_ns_type; /* Exported for sanity-checking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Exported for parameter setting */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Input_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_General_Group_Size = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_First_Group_Size = 3; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 Uninum_Output_Group_Separator = 0x002C; /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Generate_Roman_With_Bar_P = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We're currently not dealing with non-integers - this is just forward-looking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static UTF32 Uninum_Output_Decimal_Separator = 0x002E; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* (10^97)-1, in hex for compactness and speed of conversion to binary */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MAXCHINESEHEX "4AE825771DC07672DDD0F8E8AC39250971AC4210CECB6F656CAEB9109FFFFFFFFFFFFFFFFFFFFFFFF" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_THOUSANDS_SIGN 0x0482 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_TITLO 0x0483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DECIMAL_MARKER 0xE06C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_MARKER 0xE06D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_LSD_MARKER 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DEC 0xE06A ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_EL 0xE06B ~~~~~~~~~~~~~~~~~~~~~~~~~~ char *uninum_version(void) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return(VERSION); ~~~~~~~~~~~~~~~~ } ~ #ifdef HAVE_LOCALECONV ~~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_SETLOCALE ~~~~~~~~~~~~~~~~~~~~~ void GetLocaleGroupInfo (){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct lconv *lcptr; ~~~~~~~~~~~~~~~~~~~~ setlocale(LC_NUMERIC,""); ~~~~~~~~~~~~~~~~~~~~~~~~~ lcptr = localeconv(); ~~~~~~~~~~~~~~~~~~~~~ if(lcptr == NULL) { ~~~~~~~~~~~~~~~~~~~ fprintf(stderr,"Attempt to obtain locale information was unsuccessful.\n"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ Uninum_Output_Group_Separator = (UTF16) (lcptr->thousands_sep[0]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Uninum_Output_First_Group_Size = lcptr->grouping[0]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(lcptr->grouping[1] != 0) Uninum_Output_General_Group_Size = lcptr->grouping[1]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Uninum_Output_General_Group_Size = Uninum_Output_First_Group_Size; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ #endif ~~~~~~ #endif ~~~~~~ /* Auxiliary functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long ipow(int base, int cnt) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ unsigned long Result; ~~~~~~~~~~~~~~~~~~~~~ i = 1; ~~~~~~ Result = 1; ~~~~~~~~~~~ while (i++ <= cnt) Result *= base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return Result; ~~~~~~~~~~~~~~ } ~ /* ~~ * Copy a string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static char *strpcpy(char *dest, const char *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *t; ~~~~~~~~ const char *s; ~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0) { ~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0; ~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Case-insenstive ascii string comparison. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Emulates BSD 4.4 function emulated by GNU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static int mystrcasecmp(char *a, char *b) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char ac; ~~~~~~~~ char bc; ~~~~~~~~ while(*a != '\0') { ~~~~~~~~~~~~~~~~~~~ ac = tolower(*a++); ~~~~~~~~~~~~~~~~~~~ bc = tolower(*b++); ~~~~~~~~~~~~~~~~~~~ if(ac < bc) return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~ if(ac > bc) return (1); ~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(*b != '\0') return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (0); ~~~~~~~~~~~ } ~ /* ~~ * Copy a wide string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ * This emulates the GNU extension wcpcpy(). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *ucpcpy(UTF32 *dest, const UTF32 *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ const UTF32 *s; ~~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Reverse a wide string in place. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *wcsrev(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *q; ~~~~~~~~~ UTF32 *h; ~~~~~~~~~ UTF32 t; ~~~~~~~~ p = s; ~~~~~~ q = s + ucslen(s)-1; ~~~~~~~~~~~~~~~~~~~~ h = s + (ucslen(s)/2); ~~~~~~~~~~~~~~~~~~~~~~ while (q >= h) { ~~~~~~~~~~~~~~~~ t = *p; ~~~~~~~ *p++ = *q; ~~~~~~~~~~ *q-- = t; ~~~~~~~~~ } ~ return(s); ~~~~~~~~~~ } ~ /* ~~ * Prepend a character to a string, returning new storage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * and freeing the old. ~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *Prepend(UTF32 *s, UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ new = malloc(sizeof(UTF32) * (len + 2)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new) { ~~~~~~~~~ new[0] = c; ~~~~~~~~~~~ new[1] = 0x0000; ~~~~~~~~~~~~~~~~ ucscpy(new+1,s); ~~~~~~~~~~~~~~ uninum.c:215:5: note: in expansion of macro 'ucscpy' ucscpy(new+1,s); ^~~~~~ In file included from uninum.c:53: /usr/include/wchar.h:170:10: note: expected 'const wchar_t * restrict' {aka 'const int * restrict'} but argument is of type 'long int *' wchar_t *wcscpy(wchar_t * __restrict, const wchar_t * __restrict); ^~~~~~ uninum.c: In function 'wcDelimitNumber': uninum.c:38:26: warning: passing argument 1 of 'wcslen' from incompatible pointer type [-Wincompatible-pointer-types] #define ucslen(x) wcslen((signed long *) x) ^~~~~~~~~~~~~~~~~~ #define ucscpy(x,y) (UTF32 *)wcscpy((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucscat(x,y) (UTF32 *)wcscat((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucschr(x,y) (UTF32 *)wcschr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucsrchr(x,y) (UTF32 *)wcsrchr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define UNINUM ~~~~~~~~~~~~~~ #include "config.h" ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~ #include "unicode.h" ~~~~~~~~~~~~~~~~~~~~ #include "uninum.h" ~~~~~~~~~~~~~~~~~~~ #include "nsdefs.h" ~~~~~~~~~~~~~~~~~~~ #include "exitcode.h" ~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_LOCALE_H ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ int uninum_err; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 tcl_uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short uninum_ns_type; /* Exported for sanity-checking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Exported for parameter setting */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Input_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_General_Group_Size = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_First_Group_Size = 3; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 Uninum_Output_Group_Separator = 0x002C; /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Generate_Roman_With_Bar_P = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We're currently not dealing with non-integers - this is just forward-looking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static UTF32 Uninum_Output_Decimal_Separator = 0x002E; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* (10^97)-1, in hex for compactness and speed of conversion to binary */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MAXCHINESEHEX "4AE825771DC07672DDD0F8E8AC39250971AC4210CECB6F656CAEB9109FFFFFFFFFFFFFFFFFFFFFFFF" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_THOUSANDS_SIGN 0x0482 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_TITLO 0x0483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DECIMAL_MARKER 0xE06C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_MARKER 0xE06D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_LSD_MARKER 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DEC 0xE06A ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_EL 0xE06B ~~~~~~~~~~~~~~~~~~~~~~~~~~ char *uninum_version(void) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return(VERSION); ~~~~~~~~~~~~~~~~ } ~ #ifdef HAVE_LOCALECONV ~~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_SETLOCALE ~~~~~~~~~~~~~~~~~~~~~ void GetLocaleGroupInfo (){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct lconv *lcptr; ~~~~~~~~~~~~~~~~~~~~ setlocale(LC_NUMERIC,""); ~~~~~~~~~~~~~~~~~~~~~~~~~ lcptr = localeconv(); ~~~~~~~~~~~~~~~~~~~~~ if(lcptr == NULL) { ~~~~~~~~~~~~~~~~~~~ fprintf(stderr,"Attempt to obtain locale information was unsuccessful.\n"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ Uninum_Output_Group_Separator = (UTF16) (lcptr->thousands_sep[0]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Uninum_Output_First_Group_Size = lcptr->grouping[0]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(lcptr->grouping[1] != 0) Uninum_Output_General_Group_Size = lcptr->grouping[1]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Uninum_Output_General_Group_Size = Uninum_Output_First_Group_Size; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ #endif ~~~~~~ #endif ~~~~~~ /* Auxiliary functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long ipow(int base, int cnt) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ unsigned long Result; ~~~~~~~~~~~~~~~~~~~~~ i = 1; ~~~~~~ Result = 1; ~~~~~~~~~~~ while (i++ <= cnt) Result *= base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return Result; ~~~~~~~~~~~~~~ } ~ /* ~~ * Copy a string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static char *strpcpy(char *dest, const char *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *t; ~~~~~~~~ const char *s; ~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0) { ~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0; ~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Case-insenstive ascii string comparison. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Emulates BSD 4.4 function emulated by GNU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static int mystrcasecmp(char *a, char *b) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char ac; ~~~~~~~~ char bc; ~~~~~~~~ while(*a != '\0') { ~~~~~~~~~~~~~~~~~~~ ac = tolower(*a++); ~~~~~~~~~~~~~~~~~~~ bc = tolower(*b++); ~~~~~~~~~~~~~~~~~~~ if(ac < bc) return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~ if(ac > bc) return (1); ~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(*b != '\0') return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (0); ~~~~~~~~~~~ } ~ /* ~~ * Copy a wide string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ * This emulates the GNU extension wcpcpy(). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *ucpcpy(UTF32 *dest, const UTF32 *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ const UTF32 *s; ~~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Reverse a wide string in place. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *wcsrev(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *q; ~~~~~~~~~ UTF32 *h; ~~~~~~~~~ UTF32 t; ~~~~~~~~ p = s; ~~~~~~ q = s + ucslen(s)-1; ~~~~~~~~~~~~~~~~~~~~ h = s + (ucslen(s)/2); ~~~~~~~~~~~~~~~~~~~~~~ while (q >= h) { ~~~~~~~~~~~~~~~~ t = *p; ~~~~~~~ *p++ = *q; ~~~~~~~~~~ *q-- = t; ~~~~~~~~~ } ~ return(s); ~~~~~~~~~~ } ~ /* ~~ * Prepend a character to a string, returning new storage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * and freeing the old. ~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *Prepend(UTF32 *s, UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ new = malloc(sizeof(UTF32) * (len + 2)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new) { ~~~~~~~~~ new[0] = c; ~~~~~~~~~~~ new[1] = 0x0000; ~~~~~~~~~~~~~~~~ ucscpy(new+1,s); ~~~~~~~~~~~~~~~~ } ~ free(s); ~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ /* Remove "thousands separator"s */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *wcStripSeparators(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *o; ~~~~~~~~~ UTF32 c; ~~~~~~~~ o = t = s; ~~~~~~~~~~ while ((c = *s++) != 0x0000){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch(c) { ~~~~~~~~~~~ case 0x0020: /* Space */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x0027: /* Apostrophe */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002C: /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002E: /* Period */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x066C: /* Arabic thousands separator */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x1361: /* Ethiopic wordspace */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3000: /* Ideographic space */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We can't add the Braille comma U+2802 here because Russian Braille uses ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ the same character for the digit "1" */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ *t++ = c; ~~~~~~~~~ } ~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return o; ~~~~~~~~~ } ~ /* ~~ * It is the caller's responsability to free the original storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ UTF32 *wcDelimitNumber( ~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *number, ~~~~~~~~~~~~~~ UTF16 gs, /* Group separator character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 ds, /* Decimal point character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GroupSize, /* Number of digits in groups in general */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int FirstGroupSize /* Number of digits in low-order group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ) ~ { ~ int New_Size; /* Characters needed for delimited string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int length; /* Length of input string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int commas; /* Number of delimiters to insert */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Comma_Cnt; /* Number of delimiters inserted so far */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int digits; /* Number of digits preceding decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int cnt; /* Number of digits processed */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ UTF32 *new; /* String in which to write delimited number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *point; /* Location of decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *pos; /* Current position in original number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *npos; /* Current position in new number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *Non_Space_Number; /* Location of first non-space character in number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Sanity check */ ~~~~~~~~~~~~~~~~~~ if( (GroupSize < 2) || (FirstGroupSize < 2)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 0; ~~~~~~~~~~~ goto newmem; ~~~~~~~~~~~~ } ~ length = ucslen(number); ~~~~~~~~~~~~~~~~~~~~~~ uninum.c:279:12: note: in expansion of macro 'ucslen' length = ucslen(number); ^~~~~~ In file included from uninum.c:53: /usr/include/wchar.h:174:15: note: expected 'const wchar_t *' {aka 'const int *'} but argument is of type 'long int *' size_t wcslen(const wchar_t *) __pure; ^~~~~~~~~~~~~~~ uninum.c:42:39: warning: passing argument 1 of 'wcsrchr' from incompatible pointer type [-Wincompatible-pointer-types] #define ucsrchr(x,y) (UTF32 *)wcsrchr((signed long *)x,(signed long)y) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define UNINUM ~~~~~~~~~~~~~~ #include "config.h" ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~ #include "unicode.h" ~~~~~~~~~~~~~~~~~~~~ #include "uninum.h" ~~~~~~~~~~~~~~~~~~~ #include "nsdefs.h" ~~~~~~~~~~~~~~~~~~~ #include "exitcode.h" ~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_LOCALE_H ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ int uninum_err; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 tcl_uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short uninum_ns_type; /* Exported for sanity-checking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Exported for parameter setting */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Input_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_General_Group_Size = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_First_Group_Size = 3; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 Uninum_Output_Group_Separator = 0x002C; /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Generate_Roman_With_Bar_P = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We're currently not dealing with non-integers - this is just forward-looking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static UTF32 Uninum_Output_Decimal_Separator = 0x002E; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* (10^97)-1, in hex for compactness and speed of conversion to binary */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MAXCHINESEHEX "4AE825771DC07672DDD0F8E8AC39250971AC4210CECB6F656CAEB9109FFFFFFFFFFFFFFFFFFFFFFFF" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_THOUSANDS_SIGN 0x0482 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_TITLO 0x0483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DECIMAL_MARKER 0xE06C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_MARKER 0xE06D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_LSD_MARKER 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DEC 0xE06A ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_EL 0xE06B ~~~~~~~~~~~~~~~~~~~~~~~~~~ char *uninum_version(void) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return(VERSION); ~~~~~~~~~~~~~~~~ } ~ #ifdef HAVE_LOCALECONV ~~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_SETLOCALE ~~~~~~~~~~~~~~~~~~~~~ void GetLocaleGroupInfo (){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct lconv *lcptr; ~~~~~~~~~~~~~~~~~~~~ setlocale(LC_NUMERIC,""); ~~~~~~~~~~~~~~~~~~~~~~~~~ lcptr = localeconv(); ~~~~~~~~~~~~~~~~~~~~~ if(lcptr == NULL) { ~~~~~~~~~~~~~~~~~~~ fprintf(stderr,"Attempt to obtain locale information was unsuccessful.\n"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ Uninum_Output_Group_Separator = (UTF16) (lcptr->thousands_sep[0]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Uninum_Output_First_Group_Size = lcptr->grouping[0]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(lcptr->grouping[1] != 0) Uninum_Output_General_Group_Size = lcptr->grouping[1]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Uninum_Output_General_Group_Size = Uninum_Output_First_Group_Size; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ #endif ~~~~~~ #endif ~~~~~~ /* Auxiliary functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long ipow(int base, int cnt) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ unsigned long Result; ~~~~~~~~~~~~~~~~~~~~~ i = 1; ~~~~~~ Result = 1; ~~~~~~~~~~~ while (i++ <= cnt) Result *= base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return Result; ~~~~~~~~~~~~~~ } ~ /* ~~ * Copy a string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static char *strpcpy(char *dest, const char *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *t; ~~~~~~~~ const char *s; ~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0) { ~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0; ~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Case-insenstive ascii string comparison. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Emulates BSD 4.4 function emulated by GNU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static int mystrcasecmp(char *a, char *b) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char ac; ~~~~~~~~ char bc; ~~~~~~~~ while(*a != '\0') { ~~~~~~~~~~~~~~~~~~~ ac = tolower(*a++); ~~~~~~~~~~~~~~~~~~~ bc = tolower(*b++); ~~~~~~~~~~~~~~~~~~~ if(ac < bc) return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~ if(ac > bc) return (1); ~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(*b != '\0') return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (0); ~~~~~~~~~~~ } ~ /* ~~ * Copy a wide string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ * This emulates the GNU extension wcpcpy(). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *ucpcpy(UTF32 *dest, const UTF32 *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ const UTF32 *s; ~~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Reverse a wide string in place. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *wcsrev(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *q; ~~~~~~~~~ UTF32 *h; ~~~~~~~~~ UTF32 t; ~~~~~~~~ p = s; ~~~~~~ q = s + ucslen(s)-1; ~~~~~~~~~~~~~~~~~~~~ h = s + (ucslen(s)/2); ~~~~~~~~~~~~~~~~~~~~~~ while (q >= h) { ~~~~~~~~~~~~~~~~ t = *p; ~~~~~~~ *p++ = *q; ~~~~~~~~~~ *q-- = t; ~~~~~~~~~ } ~ return(s); ~~~~~~~~~~ } ~ /* ~~ * Prepend a character to a string, returning new storage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * and freeing the old. ~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *Prepend(UTF32 *s, UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ new = malloc(sizeof(UTF32) * (len + 2)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new) { ~~~~~~~~~ new[0] = c; ~~~~~~~~~~~ new[1] = 0x0000; ~~~~~~~~~~~~~~~~ ucscpy(new+1,s); ~~~~~~~~~~~~~~~~ } ~ free(s); ~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ /* Remove "thousands separator"s */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *wcStripSeparators(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *o; ~~~~~~~~~ UTF32 c; ~~~~~~~~ o = t = s; ~~~~~~~~~~ while ((c = *s++) != 0x0000){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch(c) { ~~~~~~~~~~~ case 0x0020: /* Space */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x0027: /* Apostrophe */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002C: /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002E: /* Period */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x066C: /* Arabic thousands separator */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x1361: /* Ethiopic wordspace */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3000: /* Ideographic space */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We can't add the Braille comma U+2802 here because Russian Braille uses ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ the same character for the digit "1" */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ *t++ = c; ~~~~~~~~~ } ~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return o; ~~~~~~~~~ } ~ /* ~~ * It is the caller's responsability to free the original storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ UTF32 *wcDelimitNumber( ~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *number, ~~~~~~~~~~~~~~ UTF16 gs, /* Group separator character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 ds, /* Decimal point character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GroupSize, /* Number of digits in groups in general */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int FirstGroupSize /* Number of digits in low-order group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ) ~ { ~ int New_Size; /* Characters needed for delimited string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int length; /* Length of input string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int commas; /* Number of delimiters to insert */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Comma_Cnt; /* Number of delimiters inserted so far */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int digits; /* Number of digits preceding decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int cnt; /* Number of digits processed */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ UTF32 *new; /* String in which to write delimited number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *point; /* Location of decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *pos; /* Current position in original number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *npos; /* Current position in new number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *Non_Space_Number; /* Location of first non-space character in number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Sanity check */ ~~~~~~~~~~~~~~~~~~ if( (GroupSize < 2) || (FirstGroupSize < 2)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 0; ~~~~~~~~~~~ goto newmem; ~~~~~~~~~~~~ } ~ length = ucslen(number); ~~~~~~~~~~~~~~~~~~~~~~~~ point = ucsrchr(number,(UTF32) '.'); ~~~~~~~~~~~~~~~~~~~~~~ uninum.c:280:11: note: in expansion of macro 'ucsrchr' point = ucsrchr(number,(UTF32) '.'); ^~~~~~~ In file included from uninum.c:53: /usr/include/wchar.h:180:10: note: expected 'const wchar_t *' {aka 'const int *'} but argument is of type 'long int *' wchar_t *wcsrchr(const wchar_t *, wchar_t) __pure; ^~~~~~~ uninum.c:42:39: warning: passing argument 1 of 'wcsrchr' from incompatible pointer type [-Wincompatible-pointer-types] #define ucsrchr(x,y) (UTF32 *)wcsrchr((signed long *)x,(signed long)y) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define UNINUM ~~~~~~~~~~~~~~ #include "config.h" ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~ #include "unicode.h" ~~~~~~~~~~~~~~~~~~~~ #include "uninum.h" ~~~~~~~~~~~~~~~~~~~ #include "nsdefs.h" ~~~~~~~~~~~~~~~~~~~ #include "exitcode.h" ~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_LOCALE_H ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ int uninum_err; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 tcl_uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short uninum_ns_type; /* Exported for sanity-checking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Exported for parameter setting */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Input_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_General_Group_Size = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_First_Group_Size = 3; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 Uninum_Output_Group_Separator = 0x002C; /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Generate_Roman_With_Bar_P = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We're currently not dealing with non-integers - this is just forward-looking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static UTF32 Uninum_Output_Decimal_Separator = 0x002E; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* (10^97)-1, in hex for compactness and speed of conversion to binary */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MAXCHINESEHEX "4AE825771DC07672DDD0F8E8AC39250971AC4210CECB6F656CAEB9109FFFFFFFFFFFFFFFFFFFFFFFF" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_THOUSANDS_SIGN 0x0482 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_TITLO 0x0483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DECIMAL_MARKER 0xE06C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_MARKER 0xE06D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_LSD_MARKER 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DEC 0xE06A ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_EL 0xE06B ~~~~~~~~~~~~~~~~~~~~~~~~~~ char *uninum_version(void) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return(VERSION); ~~~~~~~~~~~~~~~~ } ~ #ifdef HAVE_LOCALECONV ~~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_SETLOCALE ~~~~~~~~~~~~~~~~~~~~~ void GetLocaleGroupInfo (){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct lconv *lcptr; ~~~~~~~~~~~~~~~~~~~~ setlocale(LC_NUMERIC,""); ~~~~~~~~~~~~~~~~~~~~~~~~~ lcptr = localeconv(); ~~~~~~~~~~~~~~~~~~~~~ if(lcptr == NULL) { ~~~~~~~~~~~~~~~~~~~ fprintf(stderr,"Attempt to obtain locale information was unsuccessful.\n"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ Uninum_Output_Group_Separator = (UTF16) (lcptr->thousands_sep[0]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Uninum_Output_First_Group_Size = lcptr->grouping[0]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(lcptr->grouping[1] != 0) Uninum_Output_General_Group_Size = lcptr->grouping[1]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Uninum_Output_General_Group_Size = Uninum_Output_First_Group_Size; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ #endif ~~~~~~ #endif ~~~~~~ /* Auxiliary functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long ipow(int base, int cnt) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ unsigned long Result; ~~~~~~~~~~~~~~~~~~~~~ i = 1; ~~~~~~ Result = 1; ~~~~~~~~~~~ while (i++ <= cnt) Result *= base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return Result; ~~~~~~~~~~~~~~ } ~ /* ~~ * Copy a string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static char *strpcpy(char *dest, const char *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *t; ~~~~~~~~ const char *s; ~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0) { ~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0; ~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Case-insenstive ascii string comparison. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Emulates BSD 4.4 function emulated by GNU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static int mystrcasecmp(char *a, char *b) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char ac; ~~~~~~~~ char bc; ~~~~~~~~ while(*a != '\0') { ~~~~~~~~~~~~~~~~~~~ ac = tolower(*a++); ~~~~~~~~~~~~~~~~~~~ bc = tolower(*b++); ~~~~~~~~~~~~~~~~~~~ if(ac < bc) return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~ if(ac > bc) return (1); ~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(*b != '\0') return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (0); ~~~~~~~~~~~ } ~ /* ~~ * Copy a wide string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ * This emulates the GNU extension wcpcpy(). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *ucpcpy(UTF32 *dest, const UTF32 *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ const UTF32 *s; ~~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Reverse a wide string in place. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *wcsrev(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *q; ~~~~~~~~~ UTF32 *h; ~~~~~~~~~ UTF32 t; ~~~~~~~~ p = s; ~~~~~~ q = s + ucslen(s)-1; ~~~~~~~~~~~~~~~~~~~~ h = s + (ucslen(s)/2); ~~~~~~~~~~~~~~~~~~~~~~ while (q >= h) { ~~~~~~~~~~~~~~~~ t = *p; ~~~~~~~ *p++ = *q; ~~~~~~~~~~ *q-- = t; ~~~~~~~~~ } ~ return(s); ~~~~~~~~~~ } ~ /* ~~ * Prepend a character to a string, returning new storage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * and freeing the old. ~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *Prepend(UTF32 *s, UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ new = malloc(sizeof(UTF32) * (len + 2)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new) { ~~~~~~~~~ new[0] = c; ~~~~~~~~~~~ new[1] = 0x0000; ~~~~~~~~~~~~~~~~ ucscpy(new+1,s); ~~~~~~~~~~~~~~~~ } ~ free(s); ~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ /* Remove "thousands separator"s */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *wcStripSeparators(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *o; ~~~~~~~~~ UTF32 c; ~~~~~~~~ o = t = s; ~~~~~~~~~~ while ((c = *s++) != 0x0000){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch(c) { ~~~~~~~~~~~ case 0x0020: /* Space */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x0027: /* Apostrophe */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002C: /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002E: /* Period */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x066C: /* Arabic thousands separator */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x1361: /* Ethiopic wordspace */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3000: /* Ideographic space */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We can't add the Braille comma U+2802 here because Russian Braille uses ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ the same character for the digit "1" */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ *t++ = c; ~~~~~~~~~ } ~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return o; ~~~~~~~~~ } ~ /* ~~ * It is the caller's responsability to free the original storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ UTF32 *wcDelimitNumber( ~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *number, ~~~~~~~~~~~~~~ UTF16 gs, /* Group separator character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 ds, /* Decimal point character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GroupSize, /* Number of digits in groups in general */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int FirstGroupSize /* Number of digits in low-order group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ) ~ { ~ int New_Size; /* Characters needed for delimited string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int length; /* Length of input string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int commas; /* Number of delimiters to insert */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Comma_Cnt; /* Number of delimiters inserted so far */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int digits; /* Number of digits preceding decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int cnt; /* Number of digits processed */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ UTF32 *new; /* String in which to write delimited number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *point; /* Location of decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *pos; /* Current position in original number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *npos; /* Current position in new number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *Non_Space_Number; /* Location of first non-space character in number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Sanity check */ ~~~~~~~~~~~~~~~~~~ if( (GroupSize < 2) || (FirstGroupSize < 2)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 0; ~~~~~~~~~~~ goto newmem; ~~~~~~~~~~~~ } ~ length = ucslen(number); ~~~~~~~~~~~~~~~~~~~~~~~~ point = ucsrchr(number,(UTF32) '.'); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(point == NULL) point = number+(length-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else point-=1; /* Point now points at last digit preceding decimal/end */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Non_Space_Number = ucsrchr(number,0x0020); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum.c:283:22: note: in expansion of macro 'ucsrchr' Non_Space_Number = ucsrchr(number,0x0020); ^~~~~~~ In file included from uninum.c:53: /usr/include/wchar.h:180:10: note: expected 'const wchar_t *' {aka 'const int *'} but argument is of type 'long int *' wchar_t *wcsrchr(const wchar_t *, wchar_t) __pure; ^~~~~~~ uninum.c:39:37: warning: passing argument 1 of 'wcscpy' from incompatible pointer type [-Wincompatible-pointer-types] #define ucscpy(x,y) (UTF32 *)wcscpy((signed long *)x,(signed long *)y) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucscat(x,y) (UTF32 *)wcscat((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucschr(x,y) (UTF32 *)wcschr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucsrchr(x,y) (UTF32 *)wcsrchr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define UNINUM ~~~~~~~~~~~~~~ #include "config.h" ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~ #include "unicode.h" ~~~~~~~~~~~~~~~~~~~~ #include "uninum.h" ~~~~~~~~~~~~~~~~~~~ #include "nsdefs.h" ~~~~~~~~~~~~~~~~~~~ #include "exitcode.h" ~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_LOCALE_H ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ int uninum_err; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 tcl_uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short uninum_ns_type; /* Exported for sanity-checking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Exported for parameter setting */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Input_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_General_Group_Size = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_First_Group_Size = 3; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 Uninum_Output_Group_Separator = 0x002C; /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Generate_Roman_With_Bar_P = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We're currently not dealing with non-integers - this is just forward-looking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static UTF32 Uninum_Output_Decimal_Separator = 0x002E; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* (10^97)-1, in hex for compactness and speed of conversion to binary */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MAXCHINESEHEX "4AE825771DC07672DDD0F8E8AC39250971AC4210CECB6F656CAEB9109FFFFFFFFFFFFFFFFFFFFFFFF" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_THOUSANDS_SIGN 0x0482 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_TITLO 0x0483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DECIMAL_MARKER 0xE06C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_MARKER 0xE06D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_LSD_MARKER 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DEC 0xE06A ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_EL 0xE06B ~~~~~~~~~~~~~~~~~~~~~~~~~~ char *uninum_version(void) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return(VERSION); ~~~~~~~~~~~~~~~~ } ~ #ifdef HAVE_LOCALECONV ~~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_SETLOCALE ~~~~~~~~~~~~~~~~~~~~~ void GetLocaleGroupInfo (){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct lconv *lcptr; ~~~~~~~~~~~~~~~~~~~~ setlocale(LC_NUMERIC,""); ~~~~~~~~~~~~~~~~~~~~~~~~~ lcptr = localeconv(); ~~~~~~~~~~~~~~~~~~~~~ if(lcptr == NULL) { ~~~~~~~~~~~~~~~~~~~ fprintf(stderr,"Attempt to obtain locale information was unsuccessful.\n"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ Uninum_Output_Group_Separator = (UTF16) (lcptr->thousands_sep[0]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Uninum_Output_First_Group_Size = lcptr->grouping[0]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(lcptr->grouping[1] != 0) Uninum_Output_General_Group_Size = lcptr->grouping[1]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Uninum_Output_General_Group_Size = Uninum_Output_First_Group_Size; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ #endif ~~~~~~ #endif ~~~~~~ /* Auxiliary functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long ipow(int base, int cnt) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ unsigned long Result; ~~~~~~~~~~~~~~~~~~~~~ i = 1; ~~~~~~ Result = 1; ~~~~~~~~~~~ while (i++ <= cnt) Result *= base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return Result; ~~~~~~~~~~~~~~ } ~ /* ~~ * Copy a string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static char *strpcpy(char *dest, const char *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *t; ~~~~~~~~ const char *s; ~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0) { ~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0; ~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Case-insenstive ascii string comparison. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Emulates BSD 4.4 function emulated by GNU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static int mystrcasecmp(char *a, char *b) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char ac; ~~~~~~~~ char bc; ~~~~~~~~ while(*a != '\0') { ~~~~~~~~~~~~~~~~~~~ ac = tolower(*a++); ~~~~~~~~~~~~~~~~~~~ bc = tolower(*b++); ~~~~~~~~~~~~~~~~~~~ if(ac < bc) return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~ if(ac > bc) return (1); ~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(*b != '\0') return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (0); ~~~~~~~~~~~ } ~ /* ~~ * Copy a wide string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ * This emulates the GNU extension wcpcpy(). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *ucpcpy(UTF32 *dest, const UTF32 *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ const UTF32 *s; ~~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Reverse a wide string in place. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *wcsrev(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *q; ~~~~~~~~~ UTF32 *h; ~~~~~~~~~ UTF32 t; ~~~~~~~~ p = s; ~~~~~~ q = s + ucslen(s)-1; ~~~~~~~~~~~~~~~~~~~~ h = s + (ucslen(s)/2); ~~~~~~~~~~~~~~~~~~~~~~ while (q >= h) { ~~~~~~~~~~~~~~~~ t = *p; ~~~~~~~ *p++ = *q; ~~~~~~~~~~ *q-- = t; ~~~~~~~~~ } ~ return(s); ~~~~~~~~~~ } ~ /* ~~ * Prepend a character to a string, returning new storage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * and freeing the old. ~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *Prepend(UTF32 *s, UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ new = malloc(sizeof(UTF32) * (len + 2)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new) { ~~~~~~~~~ new[0] = c; ~~~~~~~~~~~ new[1] = 0x0000; ~~~~~~~~~~~~~~~~ ucscpy(new+1,s); ~~~~~~~~~~~~~~~~ } ~ free(s); ~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ /* Remove "thousands separator"s */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *wcStripSeparators(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *o; ~~~~~~~~~ UTF32 c; ~~~~~~~~ o = t = s; ~~~~~~~~~~ while ((c = *s++) != 0x0000){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch(c) { ~~~~~~~~~~~ case 0x0020: /* Space */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x0027: /* Apostrophe */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002C: /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002E: /* Period */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x066C: /* Arabic thousands separator */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x1361: /* Ethiopic wordspace */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3000: /* Ideographic space */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We can't add the Braille comma U+2802 here because Russian Braille uses ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ the same character for the digit "1" */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ *t++ = c; ~~~~~~~~~ } ~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return o; ~~~~~~~~~ } ~ /* ~~ * It is the caller's responsability to free the original storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ UTF32 *wcDelimitNumber( ~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *number, ~~~~~~~~~~~~~~ UTF16 gs, /* Group separator character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 ds, /* Decimal point character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GroupSize, /* Number of digits in groups in general */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int FirstGroupSize /* Number of digits in low-order group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ) ~ { ~ int New_Size; /* Characters needed for delimited string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int length; /* Length of input string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int commas; /* Number of delimiters to insert */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Comma_Cnt; /* Number of delimiters inserted so far */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int digits; /* Number of digits preceding decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int cnt; /* Number of digits processed */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ UTF32 *new; /* String in which to write delimited number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *point; /* Location of decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *pos; /* Current position in original number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *npos; /* Current position in new number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *Non_Space_Number; /* Location of first non-space character in number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Sanity check */ ~~~~~~~~~~~~~~~~~~ if( (GroupSize < 2) || (FirstGroupSize < 2)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 0; ~~~~~~~~~~~ goto newmem; ~~~~~~~~~~~~ } ~ length = ucslen(number); ~~~~~~~~~~~~~~~~~~~~~~~~ point = ucsrchr(number,(UTF32) '.'); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(point == NULL) point = number+(length-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else point-=1; /* Point now points at last digit preceding decimal/end */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Non_Space_Number = ucsrchr(number,0x0020); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(Non_Space_Number == NULL) Non_Space_Number = number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Non_Space_Number+=1; ~~~~~~~~~~~~~~~~~~~~~~~~~ digits = 1+point - Non_Space_Number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(digits > FirstGroupSize) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 1 + ((digits-FirstGroupSize-1)/GroupSize); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ else commas = 0; ~~~~~~~~~~~~~~~~ newmem: ~~~~~~~ New_Size = length + commas; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ new = (UTF32 *) malloc((New_Size + 1) * sizeof(UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new){ ~~~~~~~~ if (commas == 0) return ucscpy(new,number); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum.c:297:29: note: in expansion of macro 'ucscpy' if (commas == 0) return ucscpy(new,number); ^~~~~~ In file included from uninum.c:53: /usr/include/wchar.h:170:10: note: expected 'wchar_t * restrict' {aka 'int * restrict'} but argument is of type 'long int *' wchar_t *wcscpy(wchar_t * __restrict, const wchar_t * __restrict); ^~~~~~ uninum.c:39:54: warning: passing argument 2 of 'wcscpy' from incompatible pointer type [-Wincompatible-pointer-types] #define ucscpy(x,y) (UTF32 *)wcscpy((signed long *)x,(signed long *)y) ^~~~~~~~~~~~~~~~~ #define ucscat(x,y) (UTF32 *)wcscat((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucschr(x,y) (UTF32 *)wcschr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucsrchr(x,y) (UTF32 *)wcsrchr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define UNINUM ~~~~~~~~~~~~~~ #include "config.h" ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~ #include "unicode.h" ~~~~~~~~~~~~~~~~~~~~ #include "uninum.h" ~~~~~~~~~~~~~~~~~~~ #include "nsdefs.h" ~~~~~~~~~~~~~~~~~~~ #include "exitcode.h" ~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_LOCALE_H ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ int uninum_err; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 tcl_uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short uninum_ns_type; /* Exported for sanity-checking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Exported for parameter setting */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Input_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_General_Group_Size = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_First_Group_Size = 3; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 Uninum_Output_Group_Separator = 0x002C; /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Generate_Roman_With_Bar_P = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We're currently not dealing with non-integers - this is just forward-looking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static UTF32 Uninum_Output_Decimal_Separator = 0x002E; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* (10^97)-1, in hex for compactness and speed of conversion to binary */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MAXCHINESEHEX "4AE825771DC07672DDD0F8E8AC39250971AC4210CECB6F656CAEB9109FFFFFFFFFFFFFFFFFFFFFFFF" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_THOUSANDS_SIGN 0x0482 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_TITLO 0x0483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DECIMAL_MARKER 0xE06C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_MARKER 0xE06D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_LSD_MARKER 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DEC 0xE06A ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_EL 0xE06B ~~~~~~~~~~~~~~~~~~~~~~~~~~ char *uninum_version(void) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return(VERSION); ~~~~~~~~~~~~~~~~ } ~ #ifdef HAVE_LOCALECONV ~~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_SETLOCALE ~~~~~~~~~~~~~~~~~~~~~ void GetLocaleGroupInfo (){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct lconv *lcptr; ~~~~~~~~~~~~~~~~~~~~ setlocale(LC_NUMERIC,""); ~~~~~~~~~~~~~~~~~~~~~~~~~ lcptr = localeconv(); ~~~~~~~~~~~~~~~~~~~~~ if(lcptr == NULL) { ~~~~~~~~~~~~~~~~~~~ fprintf(stderr,"Attempt to obtain locale information was unsuccessful.\n"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ Uninum_Output_Group_Separator = (UTF16) (lcptr->thousands_sep[0]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Uninum_Output_First_Group_Size = lcptr->grouping[0]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(lcptr->grouping[1] != 0) Uninum_Output_General_Group_Size = lcptr->grouping[1]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Uninum_Output_General_Group_Size = Uninum_Output_First_Group_Size; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ #endif ~~~~~~ #endif ~~~~~~ /* Auxiliary functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long ipow(int base, int cnt) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ unsigned long Result; ~~~~~~~~~~~~~~~~~~~~~ i = 1; ~~~~~~ Result = 1; ~~~~~~~~~~~ while (i++ <= cnt) Result *= base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return Result; ~~~~~~~~~~~~~~ } ~ /* ~~ * Copy a string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static char *strpcpy(char *dest, const char *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *t; ~~~~~~~~ const char *s; ~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0) { ~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0; ~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Case-insenstive ascii string comparison. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Emulates BSD 4.4 function emulated by GNU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static int mystrcasecmp(char *a, char *b) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char ac; ~~~~~~~~ char bc; ~~~~~~~~ while(*a != '\0') { ~~~~~~~~~~~~~~~~~~~ ac = tolower(*a++); ~~~~~~~~~~~~~~~~~~~ bc = tolower(*b++); ~~~~~~~~~~~~~~~~~~~ if(ac < bc) return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~ if(ac > bc) return (1); ~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(*b != '\0') return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (0); ~~~~~~~~~~~ } ~ /* ~~ * Copy a wide string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ * This emulates the GNU extension wcpcpy(). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *ucpcpy(UTF32 *dest, const UTF32 *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ const UTF32 *s; ~~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Reverse a wide string in place. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *wcsrev(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *q; ~~~~~~~~~ UTF32 *h; ~~~~~~~~~ UTF32 t; ~~~~~~~~ p = s; ~~~~~~ q = s + ucslen(s)-1; ~~~~~~~~~~~~~~~~~~~~ h = s + (ucslen(s)/2); ~~~~~~~~~~~~~~~~~~~~~~ while (q >= h) { ~~~~~~~~~~~~~~~~ t = *p; ~~~~~~~ *p++ = *q; ~~~~~~~~~~ *q-- = t; ~~~~~~~~~ } ~ return(s); ~~~~~~~~~~ } ~ /* ~~ * Prepend a character to a string, returning new storage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * and freeing the old. ~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *Prepend(UTF32 *s, UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ new = malloc(sizeof(UTF32) * (len + 2)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new) { ~~~~~~~~~ new[0] = c; ~~~~~~~~~~~ new[1] = 0x0000; ~~~~~~~~~~~~~~~~ ucscpy(new+1,s); ~~~~~~~~~~~~~~~~ } ~ free(s); ~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ /* Remove "thousands separator"s */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *wcStripSeparators(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *o; ~~~~~~~~~ UTF32 c; ~~~~~~~~ o = t = s; ~~~~~~~~~~ while ((c = *s++) != 0x0000){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch(c) { ~~~~~~~~~~~ case 0x0020: /* Space */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x0027: /* Apostrophe */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002C: /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002E: /* Period */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x066C: /* Arabic thousands separator */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x1361: /* Ethiopic wordspace */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3000: /* Ideographic space */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We can't add the Braille comma U+2802 here because Russian Braille uses ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ the same character for the digit "1" */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ *t++ = c; ~~~~~~~~~ } ~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return o; ~~~~~~~~~ } ~ /* ~~ * It is the caller's responsability to free the original storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ UTF32 *wcDelimitNumber( ~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *number, ~~~~~~~~~~~~~~ UTF16 gs, /* Group separator character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 ds, /* Decimal point character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GroupSize, /* Number of digits in groups in general */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int FirstGroupSize /* Number of digits in low-order group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ) ~ { ~ int New_Size; /* Characters needed for delimited string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int length; /* Length of input string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int commas; /* Number of delimiters to insert */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Comma_Cnt; /* Number of delimiters inserted so far */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int digits; /* Number of digits preceding decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int cnt; /* Number of digits processed */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ UTF32 *new; /* String in which to write delimited number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *point; /* Location of decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *pos; /* Current position in original number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *npos; /* Current position in new number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *Non_Space_Number; /* Location of first non-space character in number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Sanity check */ ~~~~~~~~~~~~~~~~~~ if( (GroupSize < 2) || (FirstGroupSize < 2)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 0; ~~~~~~~~~~~ goto newmem; ~~~~~~~~~~~~ } ~ length = ucslen(number); ~~~~~~~~~~~~~~~~~~~~~~~~ point = ucsrchr(number,(UTF32) '.'); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(point == NULL) point = number+(length-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else point-=1; /* Point now points at last digit preceding decimal/end */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Non_Space_Number = ucsrchr(number,0x0020); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(Non_Space_Number == NULL) Non_Space_Number = number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Non_Space_Number+=1; ~~~~~~~~~~~~~~~~~~~~~~~~~ digits = 1+point - Non_Space_Number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(digits > FirstGroupSize) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 1 + ((digits-FirstGroupSize-1)/GroupSize); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ else commas = 0; ~~~~~~~~~~~~~~~~ newmem: ~~~~~~~ New_Size = length + commas; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ new = (UTF32 *) malloc((New_Size + 1) * sizeof(UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new){ ~~~~~~~~ if (commas == 0) return ucscpy(new,number); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum.c:297:29: note: in expansion of macro 'ucscpy' if (commas == 0) return ucscpy(new,number); ^~~~~~ In file included from uninum.c:53: /usr/include/wchar.h:170:10: note: expected 'const wchar_t * restrict' {aka 'const int * restrict'} but argument is of type 'long int *' wchar_t *wcscpy(wchar_t * __restrict, const wchar_t * __restrict); ^~~~~~ uninum.c: In function 'GuessNumberSystem': uninum.c:38:26: warning: passing argument 1 of 'wcslen' from incompatible pointer type [-Wincompatible-pointer-types] #define ucslen(x) wcslen((signed long *) x) ^~~~~~~~~~~~~~~~~~ #define ucscpy(x,y) (UTF32 *)wcscpy((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucscat(x,y) (UTF32 *)wcscat((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucschr(x,y) (UTF32 *)wcschr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucsrchr(x,y) (UTF32 *)wcsrchr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define UNINUM ~~~~~~~~~~~~~~ #include "config.h" ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~ #include "unicode.h" ~~~~~~~~~~~~~~~~~~~~ #include "uninum.h" ~~~~~~~~~~~~~~~~~~~ #include "nsdefs.h" ~~~~~~~~~~~~~~~~~~~ #include "exitcode.h" ~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_LOCALE_H ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ int uninum_err; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 tcl_uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short uninum_ns_type; /* Exported for sanity-checking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Exported for parameter setting */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Input_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_General_Group_Size = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_First_Group_Size = 3; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 Uninum_Output_Group_Separator = 0x002C; /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Generate_Roman_With_Bar_P = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We're currently not dealing with non-integers - this is just forward-looking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static UTF32 Uninum_Output_Decimal_Separator = 0x002E; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* (10^97)-1, in hex for compactness and speed of conversion to binary */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MAXCHINESEHEX "4AE825771DC07672DDD0F8E8AC39250971AC4210CECB6F656CAEB9109FFFFFFFFFFFFFFFFFFFFFFFF" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_THOUSANDS_SIGN 0x0482 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_TITLO 0x0483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DECIMAL_MARKER 0xE06C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_MARKER 0xE06D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_LSD_MARKER 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DEC 0xE06A ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_EL 0xE06B ~~~~~~~~~~~~~~~~~~~~~~~~~~ char *uninum_version(void) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return(VERSION); ~~~~~~~~~~~~~~~~ } ~ #ifdef HAVE_LOCALECONV ~~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_SETLOCALE ~~~~~~~~~~~~~~~~~~~~~ void GetLocaleGroupInfo (){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct lconv *lcptr; ~~~~~~~~~~~~~~~~~~~~ setlocale(LC_NUMERIC,""); ~~~~~~~~~~~~~~~~~~~~~~~~~ lcptr = localeconv(); ~~~~~~~~~~~~~~~~~~~~~ if(lcptr == NULL) { ~~~~~~~~~~~~~~~~~~~ fprintf(stderr,"Attempt to obtain locale information was unsuccessful.\n"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ Uninum_Output_Group_Separator = (UTF16) (lcptr->thousands_sep[0]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Uninum_Output_First_Group_Size = lcptr->grouping[0]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(lcptr->grouping[1] != 0) Uninum_Output_General_Group_Size = lcptr->grouping[1]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Uninum_Output_General_Group_Size = Uninum_Output_First_Group_Size; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ #endif ~~~~~~ #endif ~~~~~~ /* Auxiliary functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long ipow(int base, int cnt) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ unsigned long Result; ~~~~~~~~~~~~~~~~~~~~~ i = 1; ~~~~~~ Result = 1; ~~~~~~~~~~~ while (i++ <= cnt) Result *= base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return Result; ~~~~~~~~~~~~~~ } ~ /* ~~ * Copy a string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static char *strpcpy(char *dest, const char *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *t; ~~~~~~~~ const char *s; ~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0) { ~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0; ~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Case-insenstive ascii string comparison. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Emulates BSD 4.4 function emulated by GNU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static int mystrcasecmp(char *a, char *b) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char ac; ~~~~~~~~ char bc; ~~~~~~~~ while(*a != '\0') { ~~~~~~~~~~~~~~~~~~~ ac = tolower(*a++); ~~~~~~~~~~~~~~~~~~~ bc = tolower(*b++); ~~~~~~~~~~~~~~~~~~~ if(ac < bc) return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~ if(ac > bc) return (1); ~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(*b != '\0') return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (0); ~~~~~~~~~~~ } ~ /* ~~ * Copy a wide string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ * This emulates the GNU extension wcpcpy(). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *ucpcpy(UTF32 *dest, const UTF32 *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ const UTF32 *s; ~~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Reverse a wide string in place. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *wcsrev(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *q; ~~~~~~~~~ UTF32 *h; ~~~~~~~~~ UTF32 t; ~~~~~~~~ p = s; ~~~~~~ q = s + ucslen(s)-1; ~~~~~~~~~~~~~~~~~~~~ h = s + (ucslen(s)/2); ~~~~~~~~~~~~~~~~~~~~~~ while (q >= h) { ~~~~~~~~~~~~~~~~ t = *p; ~~~~~~~ *p++ = *q; ~~~~~~~~~~ *q-- = t; ~~~~~~~~~ } ~ return(s); ~~~~~~~~~~ } ~ /* ~~ * Prepend a character to a string, returning new storage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * and freeing the old. ~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *Prepend(UTF32 *s, UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ new = malloc(sizeof(UTF32) * (len + 2)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new) { ~~~~~~~~~ new[0] = c; ~~~~~~~~~~~ new[1] = 0x0000; ~~~~~~~~~~~~~~~~ ucscpy(new+1,s); ~~~~~~~~~~~~~~~~ } ~ free(s); ~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ /* Remove "thousands separator"s */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *wcStripSeparators(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *o; ~~~~~~~~~ UTF32 c; ~~~~~~~~ o = t = s; ~~~~~~~~~~ while ((c = *s++) != 0x0000){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch(c) { ~~~~~~~~~~~ case 0x0020: /* Space */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x0027: /* Apostrophe */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002C: /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002E: /* Period */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x066C: /* Arabic thousands separator */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x1361: /* Ethiopic wordspace */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3000: /* Ideographic space */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We can't add the Braille comma U+2802 here because Russian Braille uses ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ the same character for the digit "1" */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ *t++ = c; ~~~~~~~~~ } ~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return o; ~~~~~~~~~ } ~ /* ~~ * It is the caller's responsability to free the original storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ UTF32 *wcDelimitNumber( ~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *number, ~~~~~~~~~~~~~~ UTF16 gs, /* Group separator character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 ds, /* Decimal point character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GroupSize, /* Number of digits in groups in general */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int FirstGroupSize /* Number of digits in low-order group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ) ~ { ~ int New_Size; /* Characters needed for delimited string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int length; /* Length of input string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int commas; /* Number of delimiters to insert */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Comma_Cnt; /* Number of delimiters inserted so far */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int digits; /* Number of digits preceding decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int cnt; /* Number of digits processed */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ UTF32 *new; /* String in which to write delimited number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *point; /* Location of decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *pos; /* Current position in original number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *npos; /* Current position in new number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *Non_Space_Number; /* Location of first non-space character in number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Sanity check */ ~~~~~~~~~~~~~~~~~~ if( (GroupSize < 2) || (FirstGroupSize < 2)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 0; ~~~~~~~~~~~ goto newmem; ~~~~~~~~~~~~ } ~ length = ucslen(number); ~~~~~~~~~~~~~~~~~~~~~~~~ point = ucsrchr(number,(UTF32) '.'); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(point == NULL) point = number+(length-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else point-=1; /* Point now points at last digit preceding decimal/end */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Non_Space_Number = ucsrchr(number,0x0020); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(Non_Space_Number == NULL) Non_Space_Number = number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Non_Space_Number+=1; ~~~~~~~~~~~~~~~~~~~~~~~~~ digits = 1+point - Non_Space_Number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(digits > FirstGroupSize) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 1 + ((digits-FirstGroupSize-1)/GroupSize); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ else commas = 0; ~~~~~~~~~~~~~~~~ newmem: ~~~~~~~ New_Size = length + commas; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ new = (UTF32 *) malloc((New_Size + 1) * sizeof(UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new){ ~~~~~~~~ if (commas == 0) return ucscpy(new,number); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* First copy right hand part of number, up to and including decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pos = number+length; ~~~~~~~~~~~~~~~~~~~~ npos = new+New_Size; ~~~~~~~~~~~~~~~~~~~~ for(; pos > point;) *npos-- = *pos--; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Now copy lefthand part, inserting delimiters as we go */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Comma_Cnt = cnt = 0; ~~~~~~~~~~~~~~~~~~~~ if(FirstGroupSize != GroupSize) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ for (i = 0; i < FirstGroupSize; i++) *npos-- = *pos--; /* Copy low group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *npos-- = (UTF32) gs; ~~~~~~~~~~~~~~~~~~~~~ *npos-- = *pos--; /* Low digit of second group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Comma_Cnt = cnt = 1; ~~~~~~~~~~~~~~~~~~~~ } ~ while(pos >= Non_Space_Number){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *npos-- = *pos--; ~~~~~~~~~~~~~~~~~ if( (++cnt % GroupSize == 0) && (Comma_Cnt++ < commas )) *npos-- = (UTF32) gs; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ while(pos >= number) *npos-- = *pos--; /* Copy leading spaces, if any */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ } ~ /* ~~ * Returns a null-terminated wide string containing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * the specified character. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *MakeSingleDigitString(UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ new = malloc(sizeof(UTF32) * 2); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) { ~~~~~~~~~~ uninum_err = NS_ERROR_OUTOFMEMORY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NULL; ~~~~~~~~~~~~ } ~ new[0] = c; ~~~~~~~~~~~ new[1] = 0L; ~~~~~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ struct ns {char *s; int c; short type;}; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static struct ns NumberSystemList[] = { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Aegean",NS_AEGEAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "All",NS_ALL,NS_TYPE_SPECIAL, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Any",NS_ANY,NS_TYPE_SPECIAL, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Alphabetic",NS_ARABIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Persian",NS_PERSO_ARABIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Western",NS_ARABIC_WESTERN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Armenian",NS_ARMENIAN_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Balinese",NS_BALINESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Bengali",NS_BENGALI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Burmese",NS_BURMESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese",NS_CHINESE_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Early",NS_CHINESE_COUNTING_ROD_EARLY_WITH_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Late",NS_CHINESE_COUNTING_ROD_LATE_WITH_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Early_No_Zero",NS_CHINESE_COUNTING_ROD_EARLY_WITHOUT_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Late_No_Zero",NS_CHINESE_COUNTING_ROD_LATE_WITHOUT_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Legal_Simplified",NS_CHINESE_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Legal_Traditional",NS_CHINESE_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Simplified",NS_CHINESE_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Traditional",NS_CHINESE_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Place",NS_CHINESE_REGULAR_PLACE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Common_Braille",NS_COMMON_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Counting_Rod",NS_CHINESE_COUNTING_ROD_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Cyrillic",NS_CYRILLIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Devanagari",NS_DEVANAGARI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Egyptian",NS_EGYPTIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ethiopic",NS_ETHIOPIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ewellic_Decimal",NS_EWELLIC_DECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ewellic_Hexadecimal",NS_EWELLIC_HEX,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "French_Braille",NS_FRENCH_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Glagolitic",NS_GLAGOLITIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek",NS_GREEK_ALPHABETIC_UPPER,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek_Lower",NS_GREEK_ALPHABETIC_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek_Upper",NS_GREEK_ALPHABETIC_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Gujarati",NS_GUJARATI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Gurmukhi",NS_GURMUKHI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew",NS_HEBREW_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew_Early",NS_HEBREW_EARLY,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew_Late",NS_HEBREW_LATE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal",NS_HEX,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal_Lower",NS_HEX_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal_Upper",NS_HEX_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Regular_Simplified",NS_CHINESE_JAPANESE_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Regular_Traditional",NS_CHINESE_JAPANESE_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Legal_Simplified",NS_CHINESE_JAPANESE_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Legal_Traditional",NS_CHINESE_JAPANESE_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Western_Mixed",NS_CHINESE_JAPANESE_WESTERN_MIX,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kannada",NS_KANNADA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kayah_Li", NS_KAYAH_LI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kharoshthi",NS_KHAROSHTHI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Khmer",NS_KHMER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Klingon",NS_KLINGON,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Lao",NS_LAO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Lepcha",NS_LEPCHA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Limbu",NS_LIMBU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Malayalam",NS_MALAYALAM,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Legal_Simplified",NS_CHINESE_MANDARIN_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Legal_Traditional",NS_CHINESE_MANDARIN_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Regular_Simplified",NS_CHINESE_MANDARIN_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Regular_Traditional",NS_CHINESE_MANDARIN_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mongolian",NS_MONGOLIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mxedruli",NS_MXEDRULI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "New_Tai_Lue",NS_NEW_TAI_LUE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Nko",NS_NKO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ol_Chiki",NS_OL_CHIKI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Old_Italic",NS_OLD_ITALIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Old_Persian",NS_OLD_PERSIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Oriya",NS_ORIYA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Osmanya",NS_OSMANYA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Phoenician",NS_PHOENICIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman",NS_ROMAN_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman_Lower",NS_ROMAN_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman_Upper",NS_ROMAN_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Russian_Braille",NS_RUSSIAN_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Saurashtra",NS_SAURASHTRA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Shan",NS_SHAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Sinhala",NS_SINHALA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Sundanese",NS_SUNDANESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Suzhou",NS_CHINESE_SUZHOU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil",NS_TAMIL_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil_Place",NS_TAMIL_PLACE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil_Traditional",NS_TAMIL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Telugu",NS_TELUGU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tengwar_Decimal",NS_TENGWAR_DECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tengwar_Duodecimal",NS_TENGWAR_DUODECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Thai",NS_THAI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tibetan",NS_TIBETAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Vai",NS_VAI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Verdurian",NS_VERDURIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western",NS_WESTERN_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western_Lower",NS_WESTERN_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western_Upper",NS_WESTERN_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Xucuri_Lower",NS_XUCURI_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Xucuri_Upper",NS_XUCURI_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Unknown",NS_UNKNOWN,NS_TYPE_GUESS, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "All_Zero",NS_ALLZERO,NS_TYPE_GUESS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ }; ~~ /* ~~ * Generate the list of available writing systems, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * returning the next string on each call unless ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * the flag is 0, which resets to the start of the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * sequence. ~~~~~~~~~~~ * ~ * which = 0 -> list specific names usable in both directions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * which = 1 -> list cover terms suitable only for conversion of string to int ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ char *ListNumberSystems (int flag, int which) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static int i = 0; ~~~~~~~~~~~~~~~~~ if(flag == 0) i = 0; /* reset */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ top: if (i < (sizeof(NumberSystemList)/sizeof(struct ns))) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (NumberSystemList[i].type == (which? 2:1)) return NumberSystemList[i++].s; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else { ~~~~~~ i++; ~~~~ goto top; ~~~~~~~~~ } ~ } ~ i = 0; ~~~~~~ return NULL; ~~~~~~~~~~~~ } ~ /* ~~ * We just use linear search for the time being. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Could switch to binary search for greater speed. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ int StringToNumberSystem (char *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ for (i=0; i < (sizeof(NumberSystemList)/sizeof(struct ns)); i++) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (mystrcasecmp(s,NumberSystemList[i].s) == 0){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_ns_type = NumberSystemList[i].type; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (NumberSystemList[i].c); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ } ~ return NS_UNKNOWN; ~~~~~~~~~~~~~~~~~~ } ~ /* ~~ * We just use linear search for the time being. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Could switch to binary search for greater speed. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ char *NumberSystemToString (int ns) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ for (i=0; i < (sizeof(NumberSystemList)/sizeof(struct ns)); i++) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (NumberSystemList[i].c == ns) return NumberSystemList[i].s; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ return NULL; ~~~~~~~~~~~~ } ~ /* ~~ * Return the maximum value expressible in the specified number system. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * as a decimal ascii string, or if there is no limit, "unlimited". ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ #define AEGEAN_LIMIT 99999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_LIMIT 1999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EGYPTIAN_LIMIT 9999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_LIMIT 999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_LIMIT 10000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ROMAN_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_LIMIT 999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LIMIT 10000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *UninumStringMaximumValue(int ns) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *new; ~~~~~~~~~~ mpz_t MaxChinese; ~~~~~~~~~~~~~~~~~ mpz_t Limit; ~~~~~~~~~~~~ mpz_init(Limit); ~~~~~~~~~~~~~~~~ switch(ns) { ~~~~~~~~~~~~ case NS_CHINESE_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_WESTERN_MIX: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init_set_str(MaxChinese,MAXCHINESEHEX,16); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ new = malloc((mpz_sizeinbase(MaxChinese,10) + 1) * sizeof(char)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (void) mpz_get_str(new,10,MaxChinese); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(MaxChinese); ~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ case NS_AEGEAN: ~~~~~~~~~~~~~~~ mpz_set_ui(Limit,AEGEAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ARABIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ARABIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ARMENIAN_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ARMENIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_CYRILLIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,CYRILLIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_EGYPTIAN: ~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,EGYPTIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_GLAGOLITIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,GLAGOLITIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_GREEK_ALPHABETIC_UPPER: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_GREEK_ALPHABETIC_LOWER: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,GREEK_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_HEBREW_EARLY: ~~~~~~~~~~~~~~~~~~~~~ case NS_HEBREW_LATE: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,HEBREW_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_KHAROSHTHI: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,KHAROSHTHI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_MXEDRULI: ~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,MXEDRULI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_OLD_ITALIC: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,OLD_ITALIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_OLD_PERSIAN: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,OLD_PERSIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_PHOENICIAN: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,PHOENICIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ROMAN_UPPER: ~~~~~~~~~~~~~~~~~~~~ case NS_ROMAN_LOWER: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ROMAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_SINHALA: ~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,SINHALA_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_TAMIL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,TAMIL_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_XUCURI_LOWER: ~~~~~~~~~~~~~~~~~~~~~ case NS_XUCURI_UPPER: ~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,XUCURI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ new = malloc (sizeof(char) * (1 + strlen("unlimited"))); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sprintf(new,"%s","unlimited"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ new = malloc((mpz_sizeinbase(Limit,10) + 1) * sizeof(char)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (void) mpz_get_str(new,10,Limit); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Limit); ~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ #define AEGEAN_BEGIN 0x10107 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define AEGEAN_END 0x10133 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_BEGIN 0x0660 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_END 0x066C ~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_ALPHABETIC_BEGIN 0x0627 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_ALPHABETIC_END 0x064A ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PERSO_ARABIC_BEGIN 0x06F0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PERSO_ARABIC_END 0x06F9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_ALPHABETIC_UPPER_BEGIN 0x0531 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_ALPHABETIC_UPPER_END 0x554 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BALINESE_BEGIN 0x1B50 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BALINESE_END 0x1B59 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BENGALI_BEGIN 0x09E6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BENGALI_END 0x09EF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BURMESE_BEGIN 0x1040 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BURMESE_END 0x1049 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_COUNTING_ROD_BEGIN 0x1D360 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_COUNTING_ROD_END 0x1D371 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_A_BEGIN 0x4E00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_A_END 0x9FBB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_B_BEGIN 0x20000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_B_END 0x2A6D6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_ALPHABETIC_UPPER_BEGIN 0x0400 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_ALPHABETIC_UPPER_END 0x04FF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define DEVANAGARI_BEGIN 0x0966 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define DEVANAGARI_END 0x096F ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define COMMON_BRAILLE_BEGIN 0x2801 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define COMMON_BRAILLE_END 0x281B ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ETHIOPIC_BEGIN 0x1369 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ETHIOPIC_END 0x137C ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_BEGIN 0xE6C0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_DECIMAL_END 0xE6C9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_END 0xE6CF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_ALPHABETIC_BEGIN 0x2C00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_ALPHABETIC_END 0x2C1E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_BEGIN 0x03B1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_END 0x03C9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_BEGIN 0x0391 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_END 0x03A9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_DIGAMMA 0x03DD ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_DIGAMMA 0x03DC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_KOPPA 0x03DF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_KOPPA 0x03DE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_SAN 0x03FB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_SAN 0x03FA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_STIGMA 0x03DB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_STIGMA 0x03DA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_RIGHT_KERAIA 0x0374 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LEFT_KERAIA 0x0375 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GUJARATI_BEGIN 0x0AE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GUJARATI_END 0x0AEF ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GURMUKHI_BEGIN 0x0A66 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GURMUKHI_END 0x0A6F ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_BEGIN 0x0590 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_END 0x05FF ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KAYAH_LI_BEGIN 0xA900 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KAYAH_LI_END 0xA909 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KANNADA_BEGIN 0x0CE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KANNADA_END 0x0CEF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_BEGIN 0x10A40 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_END 0x10A47 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHMER_BEGIN 0x17E0 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHMER_END 0x17E9 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KLINGON_BEGIN 0xF8F0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KLINGON_END 0xF8F9 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LAO_BEGIN 0x0ED0 ~~~~~~~~~~~~~~~~~~~~~~~~ #define LAO_END 0x0ED9 ~~~~~~~~~~~~~~~~~~~~~~ #define LEPCHA_BEGIN 0x1C40 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LEPCHA_END 0x1C49 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define LIMBU_BEGIN 0x1946 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LIMBU_END 0x194F ~~~~~~~~~~~~~~~~~~~~~~~~ #define MALAYALAM_BEGIN 0x0D00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MALAYALAM_END 0x0D7F ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MONGOLIAN_BEGIN 0x1810 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MONGOLIAN_END 0x1819 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_BEGIN 0x10D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_END 0x10F5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NEW_TAI_LUE_BEGIN 0x19D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NEW_TAI_LUE_END 0x19D9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NKO_BEGIN 0x07C0 ~~~~~~~~~~~~~~~~~~~~~~~~ #define NKO_END 0x07C9 ~~~~~~~~~~~~~~~~~~~~~~ #define OL_CHIKI_BEGIN 0x1C50 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OL_CHIKI_END 0x1C59 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_BEGIN 0x10320 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_END 0x10323 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_BEGIN 0x103D1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_END 0x103D5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ORIYA_BEGIN 0x0B66 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ORIYA_END 0x0B6F ~~~~~~~~~~~~~~~~~~~~~~~~ #define OSMANYA_BEGIN 0x104A0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OSMANYA_END 0x104A9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_BEGIN 0x10916 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_END 0x10919 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SAURASHTRA_BEGIN 0xA8D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SAURASHTRA_END 0xA8D9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SHAN_BEGIN 0x1090 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define SHAN_END 0x1099 ~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_BEGIN 0x0DE7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_END 0x0DFA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUNDANESE_BEGIN 0x1BB0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUNDANESE_END 0x1BB9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUZHOU_BEGIN 0x3021 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUZHOU_END 0x3029 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_BEGIN 0x0BE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_END 0x0BF2 ~~~~~~~~~~~~~~~~~~~~~~~~ #define TELUGU_BEGIN 0x0C66 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TELUGU_END 0x0C6F ~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_BEGIN 0xE030 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_END 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define THAI_BEGIN 0x0E50 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define THAI_END 0x0E59 ~~~~~~~~~~~~~~~~~~~~~~~ #define TIBETAN_BEGIN 0x0F20 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TIBETAN_END 0x0F29 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define VAI_BEGIN 0xA620 ~~~~~~~~~~~~~~~~~~~~~~~~ #define VAI_END 0xA629 ~~~~~~~~~~~~~~~~~~~~~~ #define VERDURIAN_BEGIN 0xE260 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define VERDURIAN_END 0xE26B ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LOWER_BEGIN 0x2D00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LOWER_END 0x2D25 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_UPPER_BEGIN 0x10A0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_UPPER_END 0x10C5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GuessNumberSystem(UTF32 *str){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ UTF32 *s; ~~~~~~~~~ int WesternCnt = 0; ~~~~~~~~~~~~~~~~~~~ int ZeroCnt = 0; ~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ short FirstIsGraveP = 0; ~~~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (!str) return (NS_UNKNOWN); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ len = ucslen(str); ~~~~~~~~~~~~~~~~ uninum.c:742:9: note: in expansion of macro 'ucslen' len = ucslen(str); ^~~~~~ In file included from uninum.c:53: /usr/include/wchar.h:174:15: note: expected 'const wchar_t *' {aka 'const int *'} but argument is of type 'long int *' size_t wcslen(const wchar_t *) __pure; ^~~~~~~~~~~~~~~ uninum.c: In function 'NormalizeChineseNumbers': uninum.c:38:26: warning: passing argument 1 of 'wcslen' from incompatible pointer type [-Wincompatible-pointer-types] #define ucslen(x) wcslen((signed long *) x) ^~~~~~~~~~~~~~~~~~ #define ucscpy(x,y) (UTF32 *)wcscpy((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucscat(x,y) (UTF32 *)wcscat((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucschr(x,y) (UTF32 *)wcschr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucsrchr(x,y) (UTF32 *)wcsrchr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define UNINUM ~~~~~~~~~~~~~~ #include "config.h" ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~ #include "unicode.h" ~~~~~~~~~~~~~~~~~~~~ #include "uninum.h" ~~~~~~~~~~~~~~~~~~~ #include "nsdefs.h" ~~~~~~~~~~~~~~~~~~~ #include "exitcode.h" ~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_LOCALE_H ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ int uninum_err; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 tcl_uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short uninum_ns_type; /* Exported for sanity-checking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Exported for parameter setting */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Input_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_General_Group_Size = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_First_Group_Size = 3; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 Uninum_Output_Group_Separator = 0x002C; /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Generate_Roman_With_Bar_P = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We're currently not dealing with non-integers - this is just forward-looking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static UTF32 Uninum_Output_Decimal_Separator = 0x002E; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* (10^97)-1, in hex for compactness and speed of conversion to binary */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MAXCHINESEHEX "4AE825771DC07672DDD0F8E8AC39250971AC4210CECB6F656CAEB9109FFFFFFFFFFFFFFFFFFFFFFFF" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_THOUSANDS_SIGN 0x0482 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_TITLO 0x0483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DECIMAL_MARKER 0xE06C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_MARKER 0xE06D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_LSD_MARKER 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DEC 0xE06A ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_EL 0xE06B ~~~~~~~~~~~~~~~~~~~~~~~~~~ char *uninum_version(void) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return(VERSION); ~~~~~~~~~~~~~~~~ } ~ #ifdef HAVE_LOCALECONV ~~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_SETLOCALE ~~~~~~~~~~~~~~~~~~~~~ void GetLocaleGroupInfo (){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct lconv *lcptr; ~~~~~~~~~~~~~~~~~~~~ setlocale(LC_NUMERIC,""); ~~~~~~~~~~~~~~~~~~~~~~~~~ lcptr = localeconv(); ~~~~~~~~~~~~~~~~~~~~~ if(lcptr == NULL) { ~~~~~~~~~~~~~~~~~~~ fprintf(stderr,"Attempt to obtain locale information was unsuccessful.\n"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ Uninum_Output_Group_Separator = (UTF16) (lcptr->thousands_sep[0]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Uninum_Output_First_Group_Size = lcptr->grouping[0]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(lcptr->grouping[1] != 0) Uninum_Output_General_Group_Size = lcptr->grouping[1]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Uninum_Output_General_Group_Size = Uninum_Output_First_Group_Size; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ #endif ~~~~~~ #endif ~~~~~~ /* Auxiliary functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long ipow(int base, int cnt) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ unsigned long Result; ~~~~~~~~~~~~~~~~~~~~~ i = 1; ~~~~~~ Result = 1; ~~~~~~~~~~~ while (i++ <= cnt) Result *= base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return Result; ~~~~~~~~~~~~~~ } ~ /* ~~ * Copy a string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static char *strpcpy(char *dest, const char *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *t; ~~~~~~~~ const char *s; ~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0) { ~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0; ~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Case-insenstive ascii string comparison. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Emulates BSD 4.4 function emulated by GNU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static int mystrcasecmp(char *a, char *b) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char ac; ~~~~~~~~ char bc; ~~~~~~~~ while(*a != '\0') { ~~~~~~~~~~~~~~~~~~~ ac = tolower(*a++); ~~~~~~~~~~~~~~~~~~~ bc = tolower(*b++); ~~~~~~~~~~~~~~~~~~~ if(ac < bc) return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~ if(ac > bc) return (1); ~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(*b != '\0') return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (0); ~~~~~~~~~~~ } ~ /* ~~ * Copy a wide string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ * This emulates the GNU extension wcpcpy(). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *ucpcpy(UTF32 *dest, const UTF32 *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ const UTF32 *s; ~~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Reverse a wide string in place. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *wcsrev(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *q; ~~~~~~~~~ UTF32 *h; ~~~~~~~~~ UTF32 t; ~~~~~~~~ p = s; ~~~~~~ q = s + ucslen(s)-1; ~~~~~~~~~~~~~~~~~~~~ h = s + (ucslen(s)/2); ~~~~~~~~~~~~~~~~~~~~~~ while (q >= h) { ~~~~~~~~~~~~~~~~ t = *p; ~~~~~~~ *p++ = *q; ~~~~~~~~~~ *q-- = t; ~~~~~~~~~ } ~ return(s); ~~~~~~~~~~ } ~ /* ~~ * Prepend a character to a string, returning new storage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * and freeing the old. ~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *Prepend(UTF32 *s, UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ new = malloc(sizeof(UTF32) * (len + 2)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new) { ~~~~~~~~~ new[0] = c; ~~~~~~~~~~~ new[1] = 0x0000; ~~~~~~~~~~~~~~~~ ucscpy(new+1,s); ~~~~~~~~~~~~~~~~ } ~ free(s); ~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ /* Remove "thousands separator"s */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *wcStripSeparators(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *o; ~~~~~~~~~ UTF32 c; ~~~~~~~~ o = t = s; ~~~~~~~~~~ while ((c = *s++) != 0x0000){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch(c) { ~~~~~~~~~~~ case 0x0020: /* Space */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x0027: /* Apostrophe */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002C: /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002E: /* Period */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x066C: /* Arabic thousands separator */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x1361: /* Ethiopic wordspace */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3000: /* Ideographic space */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We can't add the Braille comma U+2802 here because Russian Braille uses ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ the same character for the digit "1" */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ *t++ = c; ~~~~~~~~~ } ~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return o; ~~~~~~~~~ } ~ /* ~~ * It is the caller's responsability to free the original storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ UTF32 *wcDelimitNumber( ~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *number, ~~~~~~~~~~~~~~ UTF16 gs, /* Group separator character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 ds, /* Decimal point character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GroupSize, /* Number of digits in groups in general */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int FirstGroupSize /* Number of digits in low-order group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ) ~ { ~ int New_Size; /* Characters needed for delimited string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int length; /* Length of input string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int commas; /* Number of delimiters to insert */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Comma_Cnt; /* Number of delimiters inserted so far */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int digits; /* Number of digits preceding decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int cnt; /* Number of digits processed */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ UTF32 *new; /* String in which to write delimited number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *point; /* Location of decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *pos; /* Current position in original number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *npos; /* Current position in new number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *Non_Space_Number; /* Location of first non-space character in number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Sanity check */ ~~~~~~~~~~~~~~~~~~ if( (GroupSize < 2) || (FirstGroupSize < 2)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 0; ~~~~~~~~~~~ goto newmem; ~~~~~~~~~~~~ } ~ length = ucslen(number); ~~~~~~~~~~~~~~~~~~~~~~~~ point = ucsrchr(number,(UTF32) '.'); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(point == NULL) point = number+(length-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else point-=1; /* Point now points at last digit preceding decimal/end */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Non_Space_Number = ucsrchr(number,0x0020); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(Non_Space_Number == NULL) Non_Space_Number = number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Non_Space_Number+=1; ~~~~~~~~~~~~~~~~~~~~~~~~~ digits = 1+point - Non_Space_Number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(digits > FirstGroupSize) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 1 + ((digits-FirstGroupSize-1)/GroupSize); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ else commas = 0; ~~~~~~~~~~~~~~~~ newmem: ~~~~~~~ New_Size = length + commas; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ new = (UTF32 *) malloc((New_Size + 1) * sizeof(UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new){ ~~~~~~~~ if (commas == 0) return ucscpy(new,number); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* First copy right hand part of number, up to and including decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pos = number+length; ~~~~~~~~~~~~~~~~~~~~ npos = new+New_Size; ~~~~~~~~~~~~~~~~~~~~ for(; pos > point;) *npos-- = *pos--; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Now copy lefthand part, inserting delimiters as we go */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Comma_Cnt = cnt = 0; ~~~~~~~~~~~~~~~~~~~~ if(FirstGroupSize != GroupSize) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ for (i = 0; i < FirstGroupSize; i++) *npos-- = *pos--; /* Copy low group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *npos-- = (UTF32) gs; ~~~~~~~~~~~~~~~~~~~~~ *npos-- = *pos--; /* Low digit of second group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Comma_Cnt = cnt = 1; ~~~~~~~~~~~~~~~~~~~~ } ~ while(pos >= Non_Space_Number){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *npos-- = *pos--; ~~~~~~~~~~~~~~~~~ if( (++cnt % GroupSize == 0) && (Comma_Cnt++ < commas )) *npos-- = (UTF32) gs; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ while(pos >= number) *npos-- = *pos--; /* Copy leading spaces, if any */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ } ~ /* ~~ * Returns a null-terminated wide string containing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * the specified character. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *MakeSingleDigitString(UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ new = malloc(sizeof(UTF32) * 2); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) { ~~~~~~~~~~ uninum_err = NS_ERROR_OUTOFMEMORY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NULL; ~~~~~~~~~~~~ } ~ new[0] = c; ~~~~~~~~~~~ new[1] = 0L; ~~~~~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ struct ns {char *s; int c; short type;}; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static struct ns NumberSystemList[] = { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Aegean",NS_AEGEAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "All",NS_ALL,NS_TYPE_SPECIAL, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Any",NS_ANY,NS_TYPE_SPECIAL, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Alphabetic",NS_ARABIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Persian",NS_PERSO_ARABIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Western",NS_ARABIC_WESTERN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Armenian",NS_ARMENIAN_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Balinese",NS_BALINESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Bengali",NS_BENGALI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Burmese",NS_BURMESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese",NS_CHINESE_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Early",NS_CHINESE_COUNTING_ROD_EARLY_WITH_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Late",NS_CHINESE_COUNTING_ROD_LATE_WITH_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Early_No_Zero",NS_CHINESE_COUNTING_ROD_EARLY_WITHOUT_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Late_No_Zero",NS_CHINESE_COUNTING_ROD_LATE_WITHOUT_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Legal_Simplified",NS_CHINESE_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Legal_Traditional",NS_CHINESE_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Simplified",NS_CHINESE_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Traditional",NS_CHINESE_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Place",NS_CHINESE_REGULAR_PLACE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Common_Braille",NS_COMMON_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Counting_Rod",NS_CHINESE_COUNTING_ROD_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Cyrillic",NS_CYRILLIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Devanagari",NS_DEVANAGARI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Egyptian",NS_EGYPTIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ethiopic",NS_ETHIOPIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ewellic_Decimal",NS_EWELLIC_DECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ewellic_Hexadecimal",NS_EWELLIC_HEX,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "French_Braille",NS_FRENCH_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Glagolitic",NS_GLAGOLITIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek",NS_GREEK_ALPHABETIC_UPPER,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek_Lower",NS_GREEK_ALPHABETIC_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek_Upper",NS_GREEK_ALPHABETIC_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Gujarati",NS_GUJARATI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Gurmukhi",NS_GURMUKHI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew",NS_HEBREW_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew_Early",NS_HEBREW_EARLY,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew_Late",NS_HEBREW_LATE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal",NS_HEX,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal_Lower",NS_HEX_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal_Upper",NS_HEX_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Regular_Simplified",NS_CHINESE_JAPANESE_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Regular_Traditional",NS_CHINESE_JAPANESE_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Legal_Simplified",NS_CHINESE_JAPANESE_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Legal_Traditional",NS_CHINESE_JAPANESE_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Western_Mixed",NS_CHINESE_JAPANESE_WESTERN_MIX,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kannada",NS_KANNADA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kayah_Li", NS_KAYAH_LI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kharoshthi",NS_KHAROSHTHI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Khmer",NS_KHMER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Klingon",NS_KLINGON,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Lao",NS_LAO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Lepcha",NS_LEPCHA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Limbu",NS_LIMBU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Malayalam",NS_MALAYALAM,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Legal_Simplified",NS_CHINESE_MANDARIN_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Legal_Traditional",NS_CHINESE_MANDARIN_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Regular_Simplified",NS_CHINESE_MANDARIN_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Regular_Traditional",NS_CHINESE_MANDARIN_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mongolian",NS_MONGOLIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mxedruli",NS_MXEDRULI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "New_Tai_Lue",NS_NEW_TAI_LUE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Nko",NS_NKO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ol_Chiki",NS_OL_CHIKI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Old_Italic",NS_OLD_ITALIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Old_Persian",NS_OLD_PERSIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Oriya",NS_ORIYA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Osmanya",NS_OSMANYA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Phoenician",NS_PHOENICIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman",NS_ROMAN_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman_Lower",NS_ROMAN_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman_Upper",NS_ROMAN_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Russian_Braille",NS_RUSSIAN_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Saurashtra",NS_SAURASHTRA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Shan",NS_SHAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Sinhala",NS_SINHALA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Sundanese",NS_SUNDANESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Suzhou",NS_CHINESE_SUZHOU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil",NS_TAMIL_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil_Place",NS_TAMIL_PLACE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil_Traditional",NS_TAMIL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Telugu",NS_TELUGU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tengwar_Decimal",NS_TENGWAR_DECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tengwar_Duodecimal",NS_TENGWAR_DUODECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Thai",NS_THAI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tibetan",NS_TIBETAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Vai",NS_VAI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Verdurian",NS_VERDURIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western",NS_WESTERN_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western_Lower",NS_WESTERN_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western_Upper",NS_WESTERN_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Xucuri_Lower",NS_XUCURI_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Xucuri_Upper",NS_XUCURI_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Unknown",NS_UNKNOWN,NS_TYPE_GUESS, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "All_Zero",NS_ALLZERO,NS_TYPE_GUESS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ }; ~~ /* ~~ * Generate the list of available writing systems, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * returning the next string on each call unless ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * the flag is 0, which resets to the start of the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * sequence. ~~~~~~~~~~~ * ~ * which = 0 -> list specific names usable in both directions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * which = 1 -> list cover terms suitable only for conversion of string to int ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ char *ListNumberSystems (int flag, int which) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static int i = 0; ~~~~~~~~~~~~~~~~~ if(flag == 0) i = 0; /* reset */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ top: if (i < (sizeof(NumberSystemList)/sizeof(struct ns))) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (NumberSystemList[i].type == (which? 2:1)) return NumberSystemList[i++].s; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else { ~~~~~~ i++; ~~~~ goto top; ~~~~~~~~~ } ~ } ~ i = 0; ~~~~~~ return NULL; ~~~~~~~~~~~~ } ~ /* ~~ * We just use linear search for the time being. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Could switch to binary search for greater speed. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ int StringToNumberSystem (char *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ for (i=0; i < (sizeof(NumberSystemList)/sizeof(struct ns)); i++) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (mystrcasecmp(s,NumberSystemList[i].s) == 0){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_ns_type = NumberSystemList[i].type; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (NumberSystemList[i].c); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ } ~ return NS_UNKNOWN; ~~~~~~~~~~~~~~~~~~ } ~ /* ~~ * We just use linear search for the time being. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Could switch to binary search for greater speed. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ char *NumberSystemToString (int ns) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ for (i=0; i < (sizeof(NumberSystemList)/sizeof(struct ns)); i++) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (NumberSystemList[i].c == ns) return NumberSystemList[i].s; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ return NULL; ~~~~~~~~~~~~ } ~ /* ~~ * Return the maximum value expressible in the specified number system. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * as a decimal ascii string, or if there is no limit, "unlimited". ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ #define AEGEAN_LIMIT 99999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_LIMIT 1999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EGYPTIAN_LIMIT 9999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_LIMIT 999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_LIMIT 10000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ROMAN_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_LIMIT 999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LIMIT 10000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *UninumStringMaximumValue(int ns) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *new; ~~~~~~~~~~ mpz_t MaxChinese; ~~~~~~~~~~~~~~~~~ mpz_t Limit; ~~~~~~~~~~~~ mpz_init(Limit); ~~~~~~~~~~~~~~~~ switch(ns) { ~~~~~~~~~~~~ case NS_CHINESE_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_WESTERN_MIX: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init_set_str(MaxChinese,MAXCHINESEHEX,16); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ new = malloc((mpz_sizeinbase(MaxChinese,10) + 1) * sizeof(char)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (void) mpz_get_str(new,10,MaxChinese); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(MaxChinese); ~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ case NS_AEGEAN: ~~~~~~~~~~~~~~~ mpz_set_ui(Limit,AEGEAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ARABIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ARABIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ARMENIAN_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ARMENIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_CYRILLIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,CYRILLIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_EGYPTIAN: ~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,EGYPTIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_GLAGOLITIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,GLAGOLITIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_GREEK_ALPHABETIC_UPPER: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_GREEK_ALPHABETIC_LOWER: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,GREEK_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_HEBREW_EARLY: ~~~~~~~~~~~~~~~~~~~~~ case NS_HEBREW_LATE: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,HEBREW_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_KHAROSHTHI: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,KHAROSHTHI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_MXEDRULI: ~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,MXEDRULI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_OLD_ITALIC: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,OLD_ITALIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_OLD_PERSIAN: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,OLD_PERSIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_PHOENICIAN: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,PHOENICIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ROMAN_UPPER: ~~~~~~~~~~~~~~~~~~~~ case NS_ROMAN_LOWER: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ROMAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_SINHALA: ~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,SINHALA_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_TAMIL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,TAMIL_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_XUCURI_LOWER: ~~~~~~~~~~~~~~~~~~~~~ case NS_XUCURI_UPPER: ~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,XUCURI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ new = malloc (sizeof(char) * (1 + strlen("unlimited"))); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sprintf(new,"%s","unlimited"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ new = malloc((mpz_sizeinbase(Limit,10) + 1) * sizeof(char)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (void) mpz_get_str(new,10,Limit); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Limit); ~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ #define AEGEAN_BEGIN 0x10107 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define AEGEAN_END 0x10133 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_BEGIN 0x0660 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_END 0x066C ~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_ALPHABETIC_BEGIN 0x0627 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_ALPHABETIC_END 0x064A ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PERSO_ARABIC_BEGIN 0x06F0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PERSO_ARABIC_END 0x06F9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_ALPHABETIC_UPPER_BEGIN 0x0531 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_ALPHABETIC_UPPER_END 0x554 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BALINESE_BEGIN 0x1B50 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BALINESE_END 0x1B59 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BENGALI_BEGIN 0x09E6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BENGALI_END 0x09EF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BURMESE_BEGIN 0x1040 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BURMESE_END 0x1049 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_COUNTING_ROD_BEGIN 0x1D360 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_COUNTING_ROD_END 0x1D371 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_A_BEGIN 0x4E00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_A_END 0x9FBB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_B_BEGIN 0x20000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_B_END 0x2A6D6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_ALPHABETIC_UPPER_BEGIN 0x0400 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_ALPHABETIC_UPPER_END 0x04FF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define DEVANAGARI_BEGIN 0x0966 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define DEVANAGARI_END 0x096F ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define COMMON_BRAILLE_BEGIN 0x2801 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define COMMON_BRAILLE_END 0x281B ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ETHIOPIC_BEGIN 0x1369 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ETHIOPIC_END 0x137C ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_BEGIN 0xE6C0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_DECIMAL_END 0xE6C9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_END 0xE6CF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_ALPHABETIC_BEGIN 0x2C00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_ALPHABETIC_END 0x2C1E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_BEGIN 0x03B1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_END 0x03C9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_BEGIN 0x0391 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_END 0x03A9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_DIGAMMA 0x03DD ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_DIGAMMA 0x03DC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_KOPPA 0x03DF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_KOPPA 0x03DE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_SAN 0x03FB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_SAN 0x03FA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_STIGMA 0x03DB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_STIGMA 0x03DA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_RIGHT_KERAIA 0x0374 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LEFT_KERAIA 0x0375 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GUJARATI_BEGIN 0x0AE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GUJARATI_END 0x0AEF ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GURMUKHI_BEGIN 0x0A66 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GURMUKHI_END 0x0A6F ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_BEGIN 0x0590 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_END 0x05FF ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KAYAH_LI_BEGIN 0xA900 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KAYAH_LI_END 0xA909 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KANNADA_BEGIN 0x0CE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KANNADA_END 0x0CEF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_BEGIN 0x10A40 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_END 0x10A47 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHMER_BEGIN 0x17E0 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHMER_END 0x17E9 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KLINGON_BEGIN 0xF8F0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KLINGON_END 0xF8F9 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LAO_BEGIN 0x0ED0 ~~~~~~~~~~~~~~~~~~~~~~~~ #define LAO_END 0x0ED9 ~~~~~~~~~~~~~~~~~~~~~~ #define LEPCHA_BEGIN 0x1C40 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LEPCHA_END 0x1C49 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define LIMBU_BEGIN 0x1946 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LIMBU_END 0x194F ~~~~~~~~~~~~~~~~~~~~~~~~ #define MALAYALAM_BEGIN 0x0D00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MALAYALAM_END 0x0D7F ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MONGOLIAN_BEGIN 0x1810 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MONGOLIAN_END 0x1819 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_BEGIN 0x10D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_END 0x10F5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NEW_TAI_LUE_BEGIN 0x19D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NEW_TAI_LUE_END 0x19D9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NKO_BEGIN 0x07C0 ~~~~~~~~~~~~~~~~~~~~~~~~ #define NKO_END 0x07C9 ~~~~~~~~~~~~~~~~~~~~~~ #define OL_CHIKI_BEGIN 0x1C50 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OL_CHIKI_END 0x1C59 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_BEGIN 0x10320 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_END 0x10323 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_BEGIN 0x103D1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_END 0x103D5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ORIYA_BEGIN 0x0B66 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ORIYA_END 0x0B6F ~~~~~~~~~~~~~~~~~~~~~~~~ #define OSMANYA_BEGIN 0x104A0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OSMANYA_END 0x104A9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_BEGIN 0x10916 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_END 0x10919 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SAURASHTRA_BEGIN 0xA8D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SAURASHTRA_END 0xA8D9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SHAN_BEGIN 0x1090 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define SHAN_END 0x1099 ~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_BEGIN 0x0DE7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_END 0x0DFA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUNDANESE_BEGIN 0x1BB0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUNDANESE_END 0x1BB9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUZHOU_BEGIN 0x3021 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUZHOU_END 0x3029 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_BEGIN 0x0BE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_END 0x0BF2 ~~~~~~~~~~~~~~~~~~~~~~~~ #define TELUGU_BEGIN 0x0C66 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TELUGU_END 0x0C6F ~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_BEGIN 0xE030 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_END 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define THAI_BEGIN 0x0E50 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define THAI_END 0x0E59 ~~~~~~~~~~~~~~~~~~~~~~~ #define TIBETAN_BEGIN 0x0F20 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TIBETAN_END 0x0F29 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define VAI_BEGIN 0xA620 ~~~~~~~~~~~~~~~~~~~~~~~~ #define VAI_END 0xA629 ~~~~~~~~~~~~~~~~~~~~~~ #define VERDURIAN_BEGIN 0xE260 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define VERDURIAN_END 0xE26B ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LOWER_BEGIN 0x2D00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LOWER_END 0x2D25 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_UPPER_BEGIN 0x10A0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_UPPER_END 0x10C5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GuessNumberSystem(UTF32 *str){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ UTF32 *s; ~~~~~~~~~ int WesternCnt = 0; ~~~~~~~~~~~~~~~~~~~ int ZeroCnt = 0; ~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ short FirstIsGraveP = 0; ~~~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (!str) return (NS_UNKNOWN); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ len = ucslen(str); ~~~~~~~~~~~~~~~~~~ s = str; ~~~~~~~~ if((c = *s) == 0x0060) FirstIsGraveP = 1; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ while((c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= AEGEAN_BEGIN) && (c <= AEGEAN_END)) return NS_AEGEAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ARABIC_BEGIN) && (c <= ARABIC_END)) return NS_ARABIC_WESTERN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ARABIC_ALPHABETIC_BEGIN) && ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c <= ARABIC_ALPHABETIC_END)) return NS_ARABIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= PERSO_ARABIC_BEGIN) && ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c <= PERSO_ARABIC_END)) return NS_PERSO_ARABIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= ARMENIAN_ALPHABETIC_UPPER_BEGIN) && (c <= ARMENIAN_ALPHABETIC_UPPER_END))) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NS_ARMENIAN_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= BALINESE_BEGIN) && (c <= BALINESE_END)) return NS_BALINESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= BENGALI_BEGIN) && (c <= BENGALI_END)) return NS_BENGALI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= BURMESE_BEGIN) && (c <= BURMESE_END)) return NS_BURMESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= CHINESE_COUNTING_ROD_BEGIN) && (c <= CHINESE_COUNTING_ROD_END)) return NS_CHINESE_COUNTING_ROD_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ( ((c >= CHINESE_A_BEGIN) && (c <= CHINESE_A_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ((c >= CHINESE_B_BEGIN) && (c <= CHINESE_B_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ( (c >= SUZHOU_BEGIN) && (c <= SUZHOU_END)) ) return NS_CHINESE_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= CYRILLIC_ALPHABETIC_UPPER_BEGIN) && (c <= CYRILLIC_ALPHABETIC_UPPER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == CYRILLIC_THOUSANDS_SIGN) || (c == CYRILLIC_TITLO)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NS_CYRILLIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= DEVANAGARI_BEGIN) && (c <= DEVANAGARI_END)) return NS_DEVANAGARI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= 0x14000) && (c <= 0x143D7)) return NS_EGYPTIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ETHIOPIC_BEGIN) && (c <= ETHIOPIC_END)) return NS_ETHIOPIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c > EWELLIC_DECIMAL_END) && (c <= EWELLIC_END)) return NS_EWELLIC_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= EWELLIC_BEGIN) && (c <= EWELLIC_DECIMAL_END)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(FirstIsGraveP) return NS_EWELLIC_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else return NS_EWELLIC_DECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= GLAGOLITIC_ALPHABETIC_BEGIN) && (c <= GLAGOLITIC_ALPHABETIC_END)) return NS_GLAGOLITIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= GREEK_ALPHABETIC_LOWER_BEGIN) && (c <= GREEK_ALPHABETIC_LOWER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_DIGAMMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_KOPPA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_STIGMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_SAN)) return NS_GREEK_ALPHABETIC_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= GREEK_ALPHABETIC_UPPER_BEGIN) && (c <= GREEK_ALPHABETIC_UPPER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_DIGAMMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_KOPPA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_STIGMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_SAN)) return NS_GREEK_ALPHABETIC_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= GUJARATI_BEGIN) && (c <= GUJARATI_END)) return NS_GUJARATI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= GURMUKHI_BEGIN) && (c <= GURMUKHI_END)) return NS_GURMUKHI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= HEBREW_BEGIN) && (c <= HEBREW_END)) return NS_HEBREW_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KANNADA_BEGIN) && (c <= KANNADA_END)) return NS_KANNADA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KAYAH_LI_BEGIN) && (c <= KAYAH_LI_END)) return NS_KAYAH_LI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KHAROSHTHI_BEGIN) && (c <= KHAROSHTHI_END)) return NS_KHAROSHTHI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KHMER_BEGIN) && (c <= KHMER_END)) return NS_KHMER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KLINGON_BEGIN) && (c <= KLINGON_END)) return NS_KLINGON; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LAO_BEGIN) && (c <= LAO_END)) return NS_LAO; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LEPCHA_BEGIN) && (c <= LEPCHA_END)) return NS_LEPCHA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LIMBU_BEGIN) && (c <= LIMBU_END)) return NS_LIMBU; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MALAYALAM_BEGIN) && (c <= MALAYALAM_END)) return NS_MALAYALAM; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MONGOLIAN_BEGIN) && (c <= MONGOLIAN_END)) return NS_MONGOLIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MXEDRULI_BEGIN) && (c <= MXEDRULI_END)) return NS_MXEDRULI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= NEW_TAI_LUE_BEGIN) && (c <= NEW_TAI_LUE_END)) return NS_NEW_TAI_LUE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= NKO_BEGIN) && (c <= NKO_END)) return NS_NKO; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OL_CHIKI_BEGIN) && (c <= OL_CHIKI_END)) return NS_OL_CHIKI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OLD_ITALIC_BEGIN) && (c <= OLD_ITALIC_END)) return NS_OLD_ITALIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OLD_PERSIAN_BEGIN) && (c <= OLD_PERSIAN_END)) return NS_OLD_PERSIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ORIYA_BEGIN) && (c <= ORIYA_END)) return NS_ORIYA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OSMANYA_BEGIN) && (c <= OSMANYA_END)) return NS_OSMANYA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= PHOENICIAN_BEGIN) && (c <= PHOENICIAN_END)) return NS_PHOENICIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SAURASHTRA_BEGIN) && (c <= SAURASHTRA_END)) return NS_SAURASHTRA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SHAN_BEGIN) && (c <= SHAN_END)) return NS_SHAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SUNDANESE_BEGIN) && (c <= SUNDANESE_END)) return NS_SUNDANESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TAMIL_BEGIN) && (c <= TAMIL_END)) return NS_TAMIL_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TELUGU_BEGIN) && (c <= TELUGU_END)) return NS_TELUGU; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DECIMAL_MARKER) return NS_TENGWAR_DECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DUODECIMAL_MARKER) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DUODECIMAL_LSD_MARKER) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if( (c == TENGWAR_DEC) || (c == TENGWAR_EL)) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= THAI_BEGIN) && (c <= THAI_END)) return NS_THAI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TIBETAN_BEGIN) && (c <= TIBETAN_END)) return NS_TIBETAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= VAI_BEGIN) && (c <= VAI_END)) return NS_VAI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= VERDURIAN_BEGIN) && (c <= VERDURIAN_END)) return NS_VERDURIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= XUCURI_LOWER_BEGIN) && (c <= XUCURI_LOWER_END)) return NS_XUCURI_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= XUCURI_UPPER_BEGIN) && (c <= XUCURI_UPPER_END)) return NS_XUCURI_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x0059) || (c == 0x0079)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (ZeroCnt && (s-1 == str+1)) return NS_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c == 0x0049) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x0056) || ~~~~~~~~~~~~~~~~ (c == 0x0058) || ~~~~~~~~~~~~~~~~ (c == 0x004C) || ~~~~~~~~~~~~~~~~ (c == 0x0043) || ~~~~~~~~~~~~~~~~ (c == 0x0044) || ~~~~~~~~~~~~~~~~ (c == 0x004D) || ~~~~~~~~~~~~~~~~ (c == 0x2183) || ~~~~~~~~~~~~~~~~ ( (c >= 0x2160) && (c <= 0x216F))) return NS_ROMAN_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x0069) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x0076) || ~~~~~~~~~~~~~~~~ (c == 0x0078) || ~~~~~~~~~~~~~~~~ (c == 0x006C) || ~~~~~~~~~~~~~~~~ (c == 0x0063) || ~~~~~~~~~~~~~~~~ (c == 0x0064) || ~~~~~~~~~~~~~~~~ (c == 0x006D) || ~~~~~~~~~~~~~~~~ (c == 0x2184) || ~~~~~~~~~~~~~~~~ ( (c >= 0x2170) && (c <= 0x217F))) return NS_ROMAN_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x281A) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2801) || ~~~~~~~~~~~~~~~~ (c == 0x2803) || ~~~~~~~~~~~~~~~~ (c == 0x2809) || ~~~~~~~~~~~~~~~~ (c == 0x2819) || ~~~~~~~~~~~~~~~~ (c == 0x2811) || ~~~~~~~~~~~~~~~~ (c == 0x280B) || ~~~~~~~~~~~~~~~~ (c == 0x281B) || ~~~~~~~~~~~~~~~~ (c == 0x2813) || ~~~~~~~~~~~~~~~~ (c == 0x280A)) return NS_COMMON_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x283C) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2821) || ~~~~~~~~~~~~~~~~ (c == 0x2823) || ~~~~~~~~~~~~~~~~ (c == 0x2829) || ~~~~~~~~~~~~~~~~ (c == 0x2839) || ~~~~~~~~~~~~~~~~ (c == 0x2831) || ~~~~~~~~~~~~~~~~ (c == 0x282B) || ~~~~~~~~~~~~~~~~ (c == 0x283B) || ~~~~~~~~~~~~~~~~ (c == 0x2833) || ~~~~~~~~~~~~~~~~ (c == 0x282A)) return NS_FRENCH_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x2834) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2802) || ~~~~~~~~~~~~~~~~ (c == 0x2806) || ~~~~~~~~~~~~~~~~ (c == 0x2812) || ~~~~~~~~~~~~~~~~ (c == 0x2832) || ~~~~~~~~~~~~~~~~ (c == 0x2822) || ~~~~~~~~~~~~~~~~ (c == 0x2816) || ~~~~~~~~~~~~~~~~ (c == 0x2836) || ~~~~~~~~~~~~~~~~ (c == 0x2826) || ~~~~~~~~~~~~~~~~ (c == 0x2814)) return NS_RUSSIAN_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= 0x31 ) && (c <= 0x39)) || ((c >= 0xFF10) && (c <= 0xFF19))) {WesternCnt++;continue;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (c == 0x0030) {ZeroCnt++;WesternCnt++;continue;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(ZeroCnt == len) return (NS_ALLZERO); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(WesternCnt == len) return(NS_WESTERN_GENERIC); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (NS_UNKNOWN); ~~~~~~~~~~~~~~~~~~~~ } ~ /* String to Integer conversion functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static void ArabicToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ char *rs; ~~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0660: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0661: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0662: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0663: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0664: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0665: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0666: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0667: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0668: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0669: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void ArabicExtendedToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x06F0: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F1: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F2: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F3: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F4: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F5: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F6: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F7: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F8: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F9: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void ArabicAlphabeticToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0627: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0628: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062C: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062F: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0647: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0648: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0632: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062D: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0637: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x064A: ~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0643: ~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0644: ~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0645: ~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0646: ~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0633: ~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0639: ~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0641: ~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0635: ~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0642: ~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0631: ~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0634: ~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062A: ~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062B: ~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062E: ~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0630: ~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0636: ~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0638: ~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x063A: ~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void AegeanToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x10107: ~~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10108: ~~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10109: ~~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010A: ~~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010B: ~~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010C: ~~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010D: ~~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010E: ~~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010F: ~~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10110: ~~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10111: ~~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10112: ~~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10113: ~~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10114: ~~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10115: ~~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10116: ~~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10117: ~~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10118: ~~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10119: ~~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011A: ~~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011B: ~~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011C: ~~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011D: ~~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011E: ~~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011F: ~~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10120: ~~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10121: ~~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10122: ~~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10123: ~~~~~~~~~~~~~ CurrentValue = 2000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10124: ~~~~~~~~~~~~~ CurrentValue = 3000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10125: ~~~~~~~~~~~~~ CurrentValue = 4000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10126: ~~~~~~~~~~~~~ CurrentValue = 5000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10127: ~~~~~~~~~~~~~ CurrentValue = 6000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10128: ~~~~~~~~~~~~~ CurrentValue = 7000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10129: ~~~~~~~~~~~~~ CurrentValue = 8000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012A: ~~~~~~~~~~~~~ CurrentValue = 9000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012B: ~~~~~~~~~~~~~ CurrentValue = 10000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012C: ~~~~~~~~~~~~~ CurrentValue = 20000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012D: ~~~~~~~~~~~~~ CurrentValue = 30000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012E: ~~~~~~~~~~~~~ CurrentValue = 40000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012F: ~~~~~~~~~~~~~ CurrentValue = 50000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10130: ~~~~~~~~~~~~~ CurrentValue = 60000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10131: ~~~~~~~~~~~~~ CurrentValue = 70000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10132: ~~~~~~~~~~~~~ CurrentValue = 80000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10133: ~~~~~~~~~~~~~ CurrentValue = 90000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void ArmenianAlphabeticToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0531: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0532: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0533: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0534: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0535: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0536: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0537: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0538: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0539: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053A: ~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053B: ~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053C: ~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053D: ~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053E: ~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053F: ~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0540: ~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0541: ~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0542: ~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0543: ~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0544: ~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0545: ~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0546: ~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0547: ~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0548: ~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0549: ~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054A: ~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054B: ~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054C: ~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054D: ~~~~~~~~~~~~ CurrentValue = 2000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054E: ~~~~~~~~~~~~ CurrentValue = 3000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054F: ~~~~~~~~~~~~ CurrentValue = 4000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0550: ~~~~~~~~~~~~ CurrentValue = 5000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0551: ~~~~~~~~~~~~ CurrentValue = 6000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0552: ~~~~~~~~~~~~ CurrentValue = 7000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0553: ~~~~~~~~~~~~ CurrentValue = 8000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0554: ~~~~~~~~~~~~ CurrentValue = 9000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void BalineseToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x1B50: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B51: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B52: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B53: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B54: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B55: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B56: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B57: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B58: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B59: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void BengaliToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x09E6: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E7: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E8: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E9: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EA: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EB: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EC: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09ED: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EE: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EF: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void BurmeseToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x1040: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1041: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1042: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1043: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1044: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1045: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1046: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1047: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1048: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1049: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ /* ~~ * Replaces variant forms of Chinese numbers with their standard traditional counterparts. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Returns a newly allocated string, or a null pointer on failure of storage allocation. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *NormalizeChineseNumbers (UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *tmp; ~~~~~~~~~~~ UTF32 *n; ~~~~~~~~~ int len; ~~~~~~~~ int NewLen; ~~~~~~~~~~~ /* ~~ * It is safe to double the string length for temp space since no ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * substitution does more than replace one character with two. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ len = ucslen(s); ~~~~~~~~~~~~~~ uninum.c:1563:9: note: in expansion of macro 'ucslen' len = ucslen(s); ^~~~~~ In file included from uninum.c:53: /usr/include/wchar.h:174:15: note: expected 'const wchar_t *' {aka 'const int *'} but argument is of type 'long int *' size_t wcslen(const wchar_t *) __pure; ^~~~~~~~~~~~~~~ uninum.c:39:37: warning: passing argument 1 of 'wcscpy' from incompatible pointer type [-Wincompatible-pointer-types] #define ucscpy(x,y) (UTF32 *)wcscpy((signed long *)x,(signed long *)y) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucscat(x,y) (UTF32 *)wcscat((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucschr(x,y) (UTF32 *)wcschr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucsrchr(x,y) (UTF32 *)wcsrchr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define UNINUM ~~~~~~~~~~~~~~ #include "config.h" ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~ #include "unicode.h" ~~~~~~~~~~~~~~~~~~~~ #include "uninum.h" ~~~~~~~~~~~~~~~~~~~ #include "nsdefs.h" ~~~~~~~~~~~~~~~~~~~ #include "exitcode.h" ~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_LOCALE_H ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ int uninum_err; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 tcl_uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short uninum_ns_type; /* Exported for sanity-checking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Exported for parameter setting */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Input_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_General_Group_Size = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_First_Group_Size = 3; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 Uninum_Output_Group_Separator = 0x002C; /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Generate_Roman_With_Bar_P = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We're currently not dealing with non-integers - this is just forward-looking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static UTF32 Uninum_Output_Decimal_Separator = 0x002E; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* (10^97)-1, in hex for compactness and speed of conversion to binary */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MAXCHINESEHEX "4AE825771DC07672DDD0F8E8AC39250971AC4210CECB6F656CAEB9109FFFFFFFFFFFFFFFFFFFFFFFF" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_THOUSANDS_SIGN 0x0482 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_TITLO 0x0483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DECIMAL_MARKER 0xE06C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_MARKER 0xE06D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_LSD_MARKER 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DEC 0xE06A ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_EL 0xE06B ~~~~~~~~~~~~~~~~~~~~~~~~~~ char *uninum_version(void) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return(VERSION); ~~~~~~~~~~~~~~~~ } ~ #ifdef HAVE_LOCALECONV ~~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_SETLOCALE ~~~~~~~~~~~~~~~~~~~~~ void GetLocaleGroupInfo (){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct lconv *lcptr; ~~~~~~~~~~~~~~~~~~~~ setlocale(LC_NUMERIC,""); ~~~~~~~~~~~~~~~~~~~~~~~~~ lcptr = localeconv(); ~~~~~~~~~~~~~~~~~~~~~ if(lcptr == NULL) { ~~~~~~~~~~~~~~~~~~~ fprintf(stderr,"Attempt to obtain locale information was unsuccessful.\n"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ Uninum_Output_Group_Separator = (UTF16) (lcptr->thousands_sep[0]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Uninum_Output_First_Group_Size = lcptr->grouping[0]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(lcptr->grouping[1] != 0) Uninum_Output_General_Group_Size = lcptr->grouping[1]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Uninum_Output_General_Group_Size = Uninum_Output_First_Group_Size; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ #endif ~~~~~~ #endif ~~~~~~ /* Auxiliary functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long ipow(int base, int cnt) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ unsigned long Result; ~~~~~~~~~~~~~~~~~~~~~ i = 1; ~~~~~~ Result = 1; ~~~~~~~~~~~ while (i++ <= cnt) Result *= base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return Result; ~~~~~~~~~~~~~~ } ~ /* ~~ * Copy a string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static char *strpcpy(char *dest, const char *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *t; ~~~~~~~~ const char *s; ~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0) { ~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0; ~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Case-insenstive ascii string comparison. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Emulates BSD 4.4 function emulated by GNU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static int mystrcasecmp(char *a, char *b) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char ac; ~~~~~~~~ char bc; ~~~~~~~~ while(*a != '\0') { ~~~~~~~~~~~~~~~~~~~ ac = tolower(*a++); ~~~~~~~~~~~~~~~~~~~ bc = tolower(*b++); ~~~~~~~~~~~~~~~~~~~ if(ac < bc) return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~ if(ac > bc) return (1); ~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(*b != '\0') return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (0); ~~~~~~~~~~~ } ~ /* ~~ * Copy a wide string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ * This emulates the GNU extension wcpcpy(). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *ucpcpy(UTF32 *dest, const UTF32 *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ const UTF32 *s; ~~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Reverse a wide string in place. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *wcsrev(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *q; ~~~~~~~~~ UTF32 *h; ~~~~~~~~~ UTF32 t; ~~~~~~~~ p = s; ~~~~~~ q = s + ucslen(s)-1; ~~~~~~~~~~~~~~~~~~~~ h = s + (ucslen(s)/2); ~~~~~~~~~~~~~~~~~~~~~~ while (q >= h) { ~~~~~~~~~~~~~~~~ t = *p; ~~~~~~~ *p++ = *q; ~~~~~~~~~~ *q-- = t; ~~~~~~~~~ } ~ return(s); ~~~~~~~~~~ } ~ /* ~~ * Prepend a character to a string, returning new storage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * and freeing the old. ~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *Prepend(UTF32 *s, UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ new = malloc(sizeof(UTF32) * (len + 2)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new) { ~~~~~~~~~ new[0] = c; ~~~~~~~~~~~ new[1] = 0x0000; ~~~~~~~~~~~~~~~~ ucscpy(new+1,s); ~~~~~~~~~~~~~~~~ } ~ free(s); ~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ /* Remove "thousands separator"s */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *wcStripSeparators(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *o; ~~~~~~~~~ UTF32 c; ~~~~~~~~ o = t = s; ~~~~~~~~~~ while ((c = *s++) != 0x0000){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch(c) { ~~~~~~~~~~~ case 0x0020: /* Space */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x0027: /* Apostrophe */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002C: /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002E: /* Period */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x066C: /* Arabic thousands separator */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x1361: /* Ethiopic wordspace */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3000: /* Ideographic space */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We can't add the Braille comma U+2802 here because Russian Braille uses ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ the same character for the digit "1" */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ *t++ = c; ~~~~~~~~~ } ~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return o; ~~~~~~~~~ } ~ /* ~~ * It is the caller's responsability to free the original storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ UTF32 *wcDelimitNumber( ~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *number, ~~~~~~~~~~~~~~ UTF16 gs, /* Group separator character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 ds, /* Decimal point character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GroupSize, /* Number of digits in groups in general */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int FirstGroupSize /* Number of digits in low-order group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ) ~ { ~ int New_Size; /* Characters needed for delimited string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int length; /* Length of input string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int commas; /* Number of delimiters to insert */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Comma_Cnt; /* Number of delimiters inserted so far */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int digits; /* Number of digits preceding decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int cnt; /* Number of digits processed */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ UTF32 *new; /* String in which to write delimited number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *point; /* Location of decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *pos; /* Current position in original number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *npos; /* Current position in new number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *Non_Space_Number; /* Location of first non-space character in number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Sanity check */ ~~~~~~~~~~~~~~~~~~ if( (GroupSize < 2) || (FirstGroupSize < 2)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 0; ~~~~~~~~~~~ goto newmem; ~~~~~~~~~~~~ } ~ length = ucslen(number); ~~~~~~~~~~~~~~~~~~~~~~~~ point = ucsrchr(number,(UTF32) '.'); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(point == NULL) point = number+(length-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else point-=1; /* Point now points at last digit preceding decimal/end */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Non_Space_Number = ucsrchr(number,0x0020); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(Non_Space_Number == NULL) Non_Space_Number = number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Non_Space_Number+=1; ~~~~~~~~~~~~~~~~~~~~~~~~~ digits = 1+point - Non_Space_Number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(digits > FirstGroupSize) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 1 + ((digits-FirstGroupSize-1)/GroupSize); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ else commas = 0; ~~~~~~~~~~~~~~~~ newmem: ~~~~~~~ New_Size = length + commas; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ new = (UTF32 *) malloc((New_Size + 1) * sizeof(UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new){ ~~~~~~~~ if (commas == 0) return ucscpy(new,number); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* First copy right hand part of number, up to and including decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pos = number+length; ~~~~~~~~~~~~~~~~~~~~ npos = new+New_Size; ~~~~~~~~~~~~~~~~~~~~ for(; pos > point;) *npos-- = *pos--; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Now copy lefthand part, inserting delimiters as we go */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Comma_Cnt = cnt = 0; ~~~~~~~~~~~~~~~~~~~~ if(FirstGroupSize != GroupSize) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ for (i = 0; i < FirstGroupSize; i++) *npos-- = *pos--; /* Copy low group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *npos-- = (UTF32) gs; ~~~~~~~~~~~~~~~~~~~~~ *npos-- = *pos--; /* Low digit of second group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Comma_Cnt = cnt = 1; ~~~~~~~~~~~~~~~~~~~~ } ~ while(pos >= Non_Space_Number){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *npos-- = *pos--; ~~~~~~~~~~~~~~~~~ if( (++cnt % GroupSize == 0) && (Comma_Cnt++ < commas )) *npos-- = (UTF32) gs; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ while(pos >= number) *npos-- = *pos--; /* Copy leading spaces, if any */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ } ~ /* ~~ * Returns a null-terminated wide string containing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * the specified character. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *MakeSingleDigitString(UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ new = malloc(sizeof(UTF32) * 2); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) { ~~~~~~~~~~ uninum_err = NS_ERROR_OUTOFMEMORY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NULL; ~~~~~~~~~~~~ } ~ new[0] = c; ~~~~~~~~~~~ new[1] = 0L; ~~~~~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ struct ns {char *s; int c; short type;}; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static struct ns NumberSystemList[] = { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Aegean",NS_AEGEAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "All",NS_ALL,NS_TYPE_SPECIAL, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Any",NS_ANY,NS_TYPE_SPECIAL, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Alphabetic",NS_ARABIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Persian",NS_PERSO_ARABIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Western",NS_ARABIC_WESTERN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Armenian",NS_ARMENIAN_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Balinese",NS_BALINESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Bengali",NS_BENGALI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Burmese",NS_BURMESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese",NS_CHINESE_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Early",NS_CHINESE_COUNTING_ROD_EARLY_WITH_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Late",NS_CHINESE_COUNTING_ROD_LATE_WITH_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Early_No_Zero",NS_CHINESE_COUNTING_ROD_EARLY_WITHOUT_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Late_No_Zero",NS_CHINESE_COUNTING_ROD_LATE_WITHOUT_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Legal_Simplified",NS_CHINESE_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Legal_Traditional",NS_CHINESE_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Simplified",NS_CHINESE_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Traditional",NS_CHINESE_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Place",NS_CHINESE_REGULAR_PLACE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Common_Braille",NS_COMMON_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Counting_Rod",NS_CHINESE_COUNTING_ROD_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Cyrillic",NS_CYRILLIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Devanagari",NS_DEVANAGARI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Egyptian",NS_EGYPTIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ethiopic",NS_ETHIOPIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ewellic_Decimal",NS_EWELLIC_DECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ewellic_Hexadecimal",NS_EWELLIC_HEX,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "French_Braille",NS_FRENCH_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Glagolitic",NS_GLAGOLITIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek",NS_GREEK_ALPHABETIC_UPPER,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek_Lower",NS_GREEK_ALPHABETIC_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek_Upper",NS_GREEK_ALPHABETIC_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Gujarati",NS_GUJARATI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Gurmukhi",NS_GURMUKHI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew",NS_HEBREW_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew_Early",NS_HEBREW_EARLY,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew_Late",NS_HEBREW_LATE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal",NS_HEX,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal_Lower",NS_HEX_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal_Upper",NS_HEX_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Regular_Simplified",NS_CHINESE_JAPANESE_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Regular_Traditional",NS_CHINESE_JAPANESE_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Legal_Simplified",NS_CHINESE_JAPANESE_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Legal_Traditional",NS_CHINESE_JAPANESE_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Western_Mixed",NS_CHINESE_JAPANESE_WESTERN_MIX,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kannada",NS_KANNADA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kayah_Li", NS_KAYAH_LI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kharoshthi",NS_KHAROSHTHI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Khmer",NS_KHMER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Klingon",NS_KLINGON,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Lao",NS_LAO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Lepcha",NS_LEPCHA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Limbu",NS_LIMBU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Malayalam",NS_MALAYALAM,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Legal_Simplified",NS_CHINESE_MANDARIN_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Legal_Traditional",NS_CHINESE_MANDARIN_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Regular_Simplified",NS_CHINESE_MANDARIN_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Regular_Traditional",NS_CHINESE_MANDARIN_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mongolian",NS_MONGOLIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mxedruli",NS_MXEDRULI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "New_Tai_Lue",NS_NEW_TAI_LUE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Nko",NS_NKO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ol_Chiki",NS_OL_CHIKI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Old_Italic",NS_OLD_ITALIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Old_Persian",NS_OLD_PERSIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Oriya",NS_ORIYA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Osmanya",NS_OSMANYA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Phoenician",NS_PHOENICIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman",NS_ROMAN_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman_Lower",NS_ROMAN_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman_Upper",NS_ROMAN_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Russian_Braille",NS_RUSSIAN_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Saurashtra",NS_SAURASHTRA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Shan",NS_SHAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Sinhala",NS_SINHALA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Sundanese",NS_SUNDANESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Suzhou",NS_CHINESE_SUZHOU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil",NS_TAMIL_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil_Place",NS_TAMIL_PLACE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil_Traditional",NS_TAMIL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Telugu",NS_TELUGU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tengwar_Decimal",NS_TENGWAR_DECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tengwar_Duodecimal",NS_TENGWAR_DUODECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Thai",NS_THAI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tibetan",NS_TIBETAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Vai",NS_VAI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Verdurian",NS_VERDURIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western",NS_WESTERN_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western_Lower",NS_WESTERN_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western_Upper",NS_WESTERN_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Xucuri_Lower",NS_XUCURI_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Xucuri_Upper",NS_XUCURI_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Unknown",NS_UNKNOWN,NS_TYPE_GUESS, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "All_Zero",NS_ALLZERO,NS_TYPE_GUESS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ }; ~~ /* ~~ * Generate the list of available writing systems, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * returning the next string on each call unless ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * the flag is 0, which resets to the start of the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * sequence. ~~~~~~~~~~~ * ~ * which = 0 -> list specific names usable in both directions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * which = 1 -> list cover terms suitable only for conversion of string to int ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ char *ListNumberSystems (int flag, int which) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static int i = 0; ~~~~~~~~~~~~~~~~~ if(flag == 0) i = 0; /* reset */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ top: if (i < (sizeof(NumberSystemList)/sizeof(struct ns))) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (NumberSystemList[i].type == (which? 2:1)) return NumberSystemList[i++].s; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else { ~~~~~~ i++; ~~~~ goto top; ~~~~~~~~~ } ~ } ~ i = 0; ~~~~~~ return NULL; ~~~~~~~~~~~~ } ~ /* ~~ * We just use linear search for the time being. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Could switch to binary search for greater speed. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ int StringToNumberSystem (char *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ for (i=0; i < (sizeof(NumberSystemList)/sizeof(struct ns)); i++) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (mystrcasecmp(s,NumberSystemList[i].s) == 0){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_ns_type = NumberSystemList[i].type; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (NumberSystemList[i].c); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ } ~ return NS_UNKNOWN; ~~~~~~~~~~~~~~~~~~ } ~ /* ~~ * We just use linear search for the time being. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Could switch to binary search for greater speed. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ char *NumberSystemToString (int ns) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ for (i=0; i < (sizeof(NumberSystemList)/sizeof(struct ns)); i++) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (NumberSystemList[i].c == ns) return NumberSystemList[i].s; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ return NULL; ~~~~~~~~~~~~ } ~ /* ~~ * Return the maximum value expressible in the specified number system. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * as a decimal ascii string, or if there is no limit, "unlimited". ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ #define AEGEAN_LIMIT 99999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_LIMIT 1999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EGYPTIAN_LIMIT 9999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_LIMIT 999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_LIMIT 10000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ROMAN_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_LIMIT 999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LIMIT 10000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *UninumStringMaximumValue(int ns) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *new; ~~~~~~~~~~ mpz_t MaxChinese; ~~~~~~~~~~~~~~~~~ mpz_t Limit; ~~~~~~~~~~~~ mpz_init(Limit); ~~~~~~~~~~~~~~~~ switch(ns) { ~~~~~~~~~~~~ case NS_CHINESE_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_WESTERN_MIX: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init_set_str(MaxChinese,MAXCHINESEHEX,16); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ new = malloc((mpz_sizeinbase(MaxChinese,10) + 1) * sizeof(char)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (void) mpz_get_str(new,10,MaxChinese); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(MaxChinese); ~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ case NS_AEGEAN: ~~~~~~~~~~~~~~~ mpz_set_ui(Limit,AEGEAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ARABIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ARABIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ARMENIAN_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ARMENIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_CYRILLIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,CYRILLIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_EGYPTIAN: ~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,EGYPTIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_GLAGOLITIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,GLAGOLITIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_GREEK_ALPHABETIC_UPPER: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_GREEK_ALPHABETIC_LOWER: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,GREEK_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_HEBREW_EARLY: ~~~~~~~~~~~~~~~~~~~~~ case NS_HEBREW_LATE: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,HEBREW_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_KHAROSHTHI: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,KHAROSHTHI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_MXEDRULI: ~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,MXEDRULI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_OLD_ITALIC: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,OLD_ITALIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_OLD_PERSIAN: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,OLD_PERSIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_PHOENICIAN: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,PHOENICIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ROMAN_UPPER: ~~~~~~~~~~~~~~~~~~~~ case NS_ROMAN_LOWER: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ROMAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_SINHALA: ~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,SINHALA_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_TAMIL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,TAMIL_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_XUCURI_LOWER: ~~~~~~~~~~~~~~~~~~~~~ case NS_XUCURI_UPPER: ~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,XUCURI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ new = malloc (sizeof(char) * (1 + strlen("unlimited"))); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sprintf(new,"%s","unlimited"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ new = malloc((mpz_sizeinbase(Limit,10) + 1) * sizeof(char)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (void) mpz_get_str(new,10,Limit); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Limit); ~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ #define AEGEAN_BEGIN 0x10107 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define AEGEAN_END 0x10133 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_BEGIN 0x0660 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_END 0x066C ~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_ALPHABETIC_BEGIN 0x0627 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_ALPHABETIC_END 0x064A ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PERSO_ARABIC_BEGIN 0x06F0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PERSO_ARABIC_END 0x06F9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_ALPHABETIC_UPPER_BEGIN 0x0531 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_ALPHABETIC_UPPER_END 0x554 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BALINESE_BEGIN 0x1B50 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BALINESE_END 0x1B59 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BENGALI_BEGIN 0x09E6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BENGALI_END 0x09EF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BURMESE_BEGIN 0x1040 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BURMESE_END 0x1049 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_COUNTING_ROD_BEGIN 0x1D360 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_COUNTING_ROD_END 0x1D371 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_A_BEGIN 0x4E00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_A_END 0x9FBB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_B_BEGIN 0x20000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_B_END 0x2A6D6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_ALPHABETIC_UPPER_BEGIN 0x0400 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_ALPHABETIC_UPPER_END 0x04FF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define DEVANAGARI_BEGIN 0x0966 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define DEVANAGARI_END 0x096F ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define COMMON_BRAILLE_BEGIN 0x2801 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define COMMON_BRAILLE_END 0x281B ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ETHIOPIC_BEGIN 0x1369 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ETHIOPIC_END 0x137C ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_BEGIN 0xE6C0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_DECIMAL_END 0xE6C9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_END 0xE6CF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_ALPHABETIC_BEGIN 0x2C00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_ALPHABETIC_END 0x2C1E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_BEGIN 0x03B1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_END 0x03C9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_BEGIN 0x0391 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_END 0x03A9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_DIGAMMA 0x03DD ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_DIGAMMA 0x03DC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_KOPPA 0x03DF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_KOPPA 0x03DE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_SAN 0x03FB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_SAN 0x03FA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_STIGMA 0x03DB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_STIGMA 0x03DA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_RIGHT_KERAIA 0x0374 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LEFT_KERAIA 0x0375 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GUJARATI_BEGIN 0x0AE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GUJARATI_END 0x0AEF ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GURMUKHI_BEGIN 0x0A66 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GURMUKHI_END 0x0A6F ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_BEGIN 0x0590 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_END 0x05FF ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KAYAH_LI_BEGIN 0xA900 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KAYAH_LI_END 0xA909 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KANNADA_BEGIN 0x0CE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KANNADA_END 0x0CEF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_BEGIN 0x10A40 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_END 0x10A47 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHMER_BEGIN 0x17E0 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHMER_END 0x17E9 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KLINGON_BEGIN 0xF8F0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KLINGON_END 0xF8F9 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LAO_BEGIN 0x0ED0 ~~~~~~~~~~~~~~~~~~~~~~~~ #define LAO_END 0x0ED9 ~~~~~~~~~~~~~~~~~~~~~~ #define LEPCHA_BEGIN 0x1C40 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LEPCHA_END 0x1C49 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define LIMBU_BEGIN 0x1946 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LIMBU_END 0x194F ~~~~~~~~~~~~~~~~~~~~~~~~ #define MALAYALAM_BEGIN 0x0D00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MALAYALAM_END 0x0D7F ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MONGOLIAN_BEGIN 0x1810 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MONGOLIAN_END 0x1819 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_BEGIN 0x10D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_END 0x10F5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NEW_TAI_LUE_BEGIN 0x19D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NEW_TAI_LUE_END 0x19D9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NKO_BEGIN 0x07C0 ~~~~~~~~~~~~~~~~~~~~~~~~ #define NKO_END 0x07C9 ~~~~~~~~~~~~~~~~~~~~~~ #define OL_CHIKI_BEGIN 0x1C50 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OL_CHIKI_END 0x1C59 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_BEGIN 0x10320 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_END 0x10323 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_BEGIN 0x103D1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_END 0x103D5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ORIYA_BEGIN 0x0B66 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ORIYA_END 0x0B6F ~~~~~~~~~~~~~~~~~~~~~~~~ #define OSMANYA_BEGIN 0x104A0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OSMANYA_END 0x104A9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_BEGIN 0x10916 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_END 0x10919 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SAURASHTRA_BEGIN 0xA8D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SAURASHTRA_END 0xA8D9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SHAN_BEGIN 0x1090 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define SHAN_END 0x1099 ~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_BEGIN 0x0DE7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_END 0x0DFA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUNDANESE_BEGIN 0x1BB0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUNDANESE_END 0x1BB9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUZHOU_BEGIN 0x3021 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUZHOU_END 0x3029 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_BEGIN 0x0BE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_END 0x0BF2 ~~~~~~~~~~~~~~~~~~~~~~~~ #define TELUGU_BEGIN 0x0C66 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TELUGU_END 0x0C6F ~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_BEGIN 0xE030 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_END 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define THAI_BEGIN 0x0E50 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define THAI_END 0x0E59 ~~~~~~~~~~~~~~~~~~~~~~~ #define TIBETAN_BEGIN 0x0F20 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TIBETAN_END 0x0F29 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define VAI_BEGIN 0xA620 ~~~~~~~~~~~~~~~~~~~~~~~~ #define VAI_END 0xA629 ~~~~~~~~~~~~~~~~~~~~~~ #define VERDURIAN_BEGIN 0xE260 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define VERDURIAN_END 0xE26B ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LOWER_BEGIN 0x2D00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LOWER_END 0x2D25 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_UPPER_BEGIN 0x10A0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_UPPER_END 0x10C5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GuessNumberSystem(UTF32 *str){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ UTF32 *s; ~~~~~~~~~ int WesternCnt = 0; ~~~~~~~~~~~~~~~~~~~ int ZeroCnt = 0; ~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ short FirstIsGraveP = 0; ~~~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (!str) return (NS_UNKNOWN); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ len = ucslen(str); ~~~~~~~~~~~~~~~~~~ s = str; ~~~~~~~~ if((c = *s) == 0x0060) FirstIsGraveP = 1; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ while((c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= AEGEAN_BEGIN) && (c <= AEGEAN_END)) return NS_AEGEAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ARABIC_BEGIN) && (c <= ARABIC_END)) return NS_ARABIC_WESTERN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ARABIC_ALPHABETIC_BEGIN) && ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c <= ARABIC_ALPHABETIC_END)) return NS_ARABIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= PERSO_ARABIC_BEGIN) && ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c <= PERSO_ARABIC_END)) return NS_PERSO_ARABIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= ARMENIAN_ALPHABETIC_UPPER_BEGIN) && (c <= ARMENIAN_ALPHABETIC_UPPER_END))) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NS_ARMENIAN_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= BALINESE_BEGIN) && (c <= BALINESE_END)) return NS_BALINESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= BENGALI_BEGIN) && (c <= BENGALI_END)) return NS_BENGALI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= BURMESE_BEGIN) && (c <= BURMESE_END)) return NS_BURMESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= CHINESE_COUNTING_ROD_BEGIN) && (c <= CHINESE_COUNTING_ROD_END)) return NS_CHINESE_COUNTING_ROD_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ( ((c >= CHINESE_A_BEGIN) && (c <= CHINESE_A_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ((c >= CHINESE_B_BEGIN) && (c <= CHINESE_B_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ( (c >= SUZHOU_BEGIN) && (c <= SUZHOU_END)) ) return NS_CHINESE_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= CYRILLIC_ALPHABETIC_UPPER_BEGIN) && (c <= CYRILLIC_ALPHABETIC_UPPER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == CYRILLIC_THOUSANDS_SIGN) || (c == CYRILLIC_TITLO)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NS_CYRILLIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= DEVANAGARI_BEGIN) && (c <= DEVANAGARI_END)) return NS_DEVANAGARI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= 0x14000) && (c <= 0x143D7)) return NS_EGYPTIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ETHIOPIC_BEGIN) && (c <= ETHIOPIC_END)) return NS_ETHIOPIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c > EWELLIC_DECIMAL_END) && (c <= EWELLIC_END)) return NS_EWELLIC_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= EWELLIC_BEGIN) && (c <= EWELLIC_DECIMAL_END)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(FirstIsGraveP) return NS_EWELLIC_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else return NS_EWELLIC_DECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= GLAGOLITIC_ALPHABETIC_BEGIN) && (c <= GLAGOLITIC_ALPHABETIC_END)) return NS_GLAGOLITIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= GREEK_ALPHABETIC_LOWER_BEGIN) && (c <= GREEK_ALPHABETIC_LOWER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_DIGAMMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_KOPPA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_STIGMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_SAN)) return NS_GREEK_ALPHABETIC_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= GREEK_ALPHABETIC_UPPER_BEGIN) && (c <= GREEK_ALPHABETIC_UPPER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_DIGAMMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_KOPPA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_STIGMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_SAN)) return NS_GREEK_ALPHABETIC_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= GUJARATI_BEGIN) && (c <= GUJARATI_END)) return NS_GUJARATI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= GURMUKHI_BEGIN) && (c <= GURMUKHI_END)) return NS_GURMUKHI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= HEBREW_BEGIN) && (c <= HEBREW_END)) return NS_HEBREW_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KANNADA_BEGIN) && (c <= KANNADA_END)) return NS_KANNADA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KAYAH_LI_BEGIN) && (c <= KAYAH_LI_END)) return NS_KAYAH_LI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KHAROSHTHI_BEGIN) && (c <= KHAROSHTHI_END)) return NS_KHAROSHTHI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KHMER_BEGIN) && (c <= KHMER_END)) return NS_KHMER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KLINGON_BEGIN) && (c <= KLINGON_END)) return NS_KLINGON; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LAO_BEGIN) && (c <= LAO_END)) return NS_LAO; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LEPCHA_BEGIN) && (c <= LEPCHA_END)) return NS_LEPCHA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LIMBU_BEGIN) && (c <= LIMBU_END)) return NS_LIMBU; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MALAYALAM_BEGIN) && (c <= MALAYALAM_END)) return NS_MALAYALAM; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MONGOLIAN_BEGIN) && (c <= MONGOLIAN_END)) return NS_MONGOLIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MXEDRULI_BEGIN) && (c <= MXEDRULI_END)) return NS_MXEDRULI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= NEW_TAI_LUE_BEGIN) && (c <= NEW_TAI_LUE_END)) return NS_NEW_TAI_LUE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= NKO_BEGIN) && (c <= NKO_END)) return NS_NKO; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OL_CHIKI_BEGIN) && (c <= OL_CHIKI_END)) return NS_OL_CHIKI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OLD_ITALIC_BEGIN) && (c <= OLD_ITALIC_END)) return NS_OLD_ITALIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OLD_PERSIAN_BEGIN) && (c <= OLD_PERSIAN_END)) return NS_OLD_PERSIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ORIYA_BEGIN) && (c <= ORIYA_END)) return NS_ORIYA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OSMANYA_BEGIN) && (c <= OSMANYA_END)) return NS_OSMANYA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= PHOENICIAN_BEGIN) && (c <= PHOENICIAN_END)) return NS_PHOENICIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SAURASHTRA_BEGIN) && (c <= SAURASHTRA_END)) return NS_SAURASHTRA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SHAN_BEGIN) && (c <= SHAN_END)) return NS_SHAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SUNDANESE_BEGIN) && (c <= SUNDANESE_END)) return NS_SUNDANESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TAMIL_BEGIN) && (c <= TAMIL_END)) return NS_TAMIL_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TELUGU_BEGIN) && (c <= TELUGU_END)) return NS_TELUGU; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DECIMAL_MARKER) return NS_TENGWAR_DECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DUODECIMAL_MARKER) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DUODECIMAL_LSD_MARKER) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if( (c == TENGWAR_DEC) || (c == TENGWAR_EL)) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= THAI_BEGIN) && (c <= THAI_END)) return NS_THAI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TIBETAN_BEGIN) && (c <= TIBETAN_END)) return NS_TIBETAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= VAI_BEGIN) && (c <= VAI_END)) return NS_VAI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= VERDURIAN_BEGIN) && (c <= VERDURIAN_END)) return NS_VERDURIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= XUCURI_LOWER_BEGIN) && (c <= XUCURI_LOWER_END)) return NS_XUCURI_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= XUCURI_UPPER_BEGIN) && (c <= XUCURI_UPPER_END)) return NS_XUCURI_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x0059) || (c == 0x0079)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (ZeroCnt && (s-1 == str+1)) return NS_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c == 0x0049) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x0056) || ~~~~~~~~~~~~~~~~ (c == 0x0058) || ~~~~~~~~~~~~~~~~ (c == 0x004C) || ~~~~~~~~~~~~~~~~ (c == 0x0043) || ~~~~~~~~~~~~~~~~ (c == 0x0044) || ~~~~~~~~~~~~~~~~ (c == 0x004D) || ~~~~~~~~~~~~~~~~ (c == 0x2183) || ~~~~~~~~~~~~~~~~ ( (c >= 0x2160) && (c <= 0x216F))) return NS_ROMAN_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x0069) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x0076) || ~~~~~~~~~~~~~~~~ (c == 0x0078) || ~~~~~~~~~~~~~~~~ (c == 0x006C) || ~~~~~~~~~~~~~~~~ (c == 0x0063) || ~~~~~~~~~~~~~~~~ (c == 0x0064) || ~~~~~~~~~~~~~~~~ (c == 0x006D) || ~~~~~~~~~~~~~~~~ (c == 0x2184) || ~~~~~~~~~~~~~~~~ ( (c >= 0x2170) && (c <= 0x217F))) return NS_ROMAN_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x281A) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2801) || ~~~~~~~~~~~~~~~~ (c == 0x2803) || ~~~~~~~~~~~~~~~~ (c == 0x2809) || ~~~~~~~~~~~~~~~~ (c == 0x2819) || ~~~~~~~~~~~~~~~~ (c == 0x2811) || ~~~~~~~~~~~~~~~~ (c == 0x280B) || ~~~~~~~~~~~~~~~~ (c == 0x281B) || ~~~~~~~~~~~~~~~~ (c == 0x2813) || ~~~~~~~~~~~~~~~~ (c == 0x280A)) return NS_COMMON_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x283C) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2821) || ~~~~~~~~~~~~~~~~ (c == 0x2823) || ~~~~~~~~~~~~~~~~ (c == 0x2829) || ~~~~~~~~~~~~~~~~ (c == 0x2839) || ~~~~~~~~~~~~~~~~ (c == 0x2831) || ~~~~~~~~~~~~~~~~ (c == 0x282B) || ~~~~~~~~~~~~~~~~ (c == 0x283B) || ~~~~~~~~~~~~~~~~ (c == 0x2833) || ~~~~~~~~~~~~~~~~ (c == 0x282A)) return NS_FRENCH_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x2834) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2802) || ~~~~~~~~~~~~~~~~ (c == 0x2806) || ~~~~~~~~~~~~~~~~ (c == 0x2812) || ~~~~~~~~~~~~~~~~ (c == 0x2832) || ~~~~~~~~~~~~~~~~ (c == 0x2822) || ~~~~~~~~~~~~~~~~ (c == 0x2816) || ~~~~~~~~~~~~~~~~ (c == 0x2836) || ~~~~~~~~~~~~~~~~ (c == 0x2826) || ~~~~~~~~~~~~~~~~ (c == 0x2814)) return NS_RUSSIAN_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= 0x31 ) && (c <= 0x39)) || ((c >= 0xFF10) && (c <= 0xFF19))) {WesternCnt++;continue;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (c == 0x0030) {ZeroCnt++;WesternCnt++;continue;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(ZeroCnt == len) return (NS_ALLZERO); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(WesternCnt == len) return(NS_WESTERN_GENERIC); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (NS_UNKNOWN); ~~~~~~~~~~~~~~~~~~~~ } ~ /* String to Integer conversion functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static void ArabicToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ char *rs; ~~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0660: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0661: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0662: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0663: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0664: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0665: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0666: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0667: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0668: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0669: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void ArabicExtendedToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x06F0: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F1: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F2: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F3: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F4: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F5: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F6: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F7: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F8: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F9: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void ArabicAlphabeticToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0627: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0628: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062C: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062F: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0647: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0648: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0632: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062D: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0637: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x064A: ~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0643: ~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0644: ~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0645: ~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0646: ~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0633: ~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0639: ~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0641: ~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0635: ~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0642: ~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0631: ~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0634: ~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062A: ~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062B: ~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062E: ~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0630: ~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0636: ~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0638: ~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x063A: ~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void AegeanToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x10107: ~~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10108: ~~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10109: ~~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010A: ~~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010B: ~~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010C: ~~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010D: ~~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010E: ~~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010F: ~~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10110: ~~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10111: ~~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10112: ~~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10113: ~~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10114: ~~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10115: ~~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10116: ~~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10117: ~~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10118: ~~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10119: ~~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011A: ~~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011B: ~~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011C: ~~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011D: ~~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011E: ~~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011F: ~~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10120: ~~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10121: ~~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10122: ~~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10123: ~~~~~~~~~~~~~ CurrentValue = 2000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10124: ~~~~~~~~~~~~~ CurrentValue = 3000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10125: ~~~~~~~~~~~~~ CurrentValue = 4000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10126: ~~~~~~~~~~~~~ CurrentValue = 5000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10127: ~~~~~~~~~~~~~ CurrentValue = 6000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10128: ~~~~~~~~~~~~~ CurrentValue = 7000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10129: ~~~~~~~~~~~~~ CurrentValue = 8000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012A: ~~~~~~~~~~~~~ CurrentValue = 9000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012B: ~~~~~~~~~~~~~ CurrentValue = 10000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012C: ~~~~~~~~~~~~~ CurrentValue = 20000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012D: ~~~~~~~~~~~~~ CurrentValue = 30000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012E: ~~~~~~~~~~~~~ CurrentValue = 40000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012F: ~~~~~~~~~~~~~ CurrentValue = 50000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10130: ~~~~~~~~~~~~~ CurrentValue = 60000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10131: ~~~~~~~~~~~~~ CurrentValue = 70000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10132: ~~~~~~~~~~~~~ CurrentValue = 80000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10133: ~~~~~~~~~~~~~ CurrentValue = 90000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void ArmenianAlphabeticToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0531: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0532: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0533: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0534: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0535: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0536: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0537: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0538: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0539: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053A: ~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053B: ~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053C: ~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053D: ~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053E: ~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053F: ~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0540: ~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0541: ~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0542: ~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0543: ~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0544: ~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0545: ~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0546: ~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0547: ~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0548: ~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0549: ~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054A: ~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054B: ~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054C: ~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054D: ~~~~~~~~~~~~ CurrentValue = 2000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054E: ~~~~~~~~~~~~ CurrentValue = 3000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054F: ~~~~~~~~~~~~ CurrentValue = 4000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0550: ~~~~~~~~~~~~ CurrentValue = 5000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0551: ~~~~~~~~~~~~ CurrentValue = 6000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0552: ~~~~~~~~~~~~ CurrentValue = 7000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0553: ~~~~~~~~~~~~ CurrentValue = 8000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0554: ~~~~~~~~~~~~ CurrentValue = 9000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void BalineseToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x1B50: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B51: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B52: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B53: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B54: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B55: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B56: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B57: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B58: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B59: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void BengaliToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x09E6: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E7: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E8: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E9: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EA: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EB: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EC: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09ED: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EE: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EF: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void BurmeseToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x1040: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1041: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1042: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1043: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1044: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1045: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1046: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1047: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1048: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1049: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ /* ~~ * Replaces variant forms of Chinese numbers with their standard traditional counterparts. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Returns a newly allocated string, or a null pointer on failure of storage allocation. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *NormalizeChineseNumbers (UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *tmp; ~~~~~~~~~~~ UTF32 *n; ~~~~~~~~~ int len; ~~~~~~~~ int NewLen; ~~~~~~~~~~~ /* ~~ * It is safe to double the string length for temp space since no ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * substitution does more than replace one character with two. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ #ifdef ALLOCAOK ~~~~~~~~~~~~~~~ t = alloca (((2 * len) + 1) * sizeof (UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #else ~~~~~ t = malloc (((2 * len) + 1) * sizeof (UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ if (t == NULL) return (t); ~~~~~~~~~~~~~~~~~~~~~~~~~~ tmp = t; ~~~~~~~~ NewLen = len; ~~~~~~~~~~~~~ while( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x96F6: /* Traditional/Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0xF9B2: /* Compatibility */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ =0x3007; /* 0 - Ideographic zero - also used with Suzhou numerals*/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x58F1: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x58F9: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x580C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x4E48: /* Telephone number yao - traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5E7A: /* Telephone number yao - simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3021: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++=0x4E00; /* 1 */ ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x5F0D: /* Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5F10: /* Modern Japanese Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5169: /* liang traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8CAE: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8CB3: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8D30: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x4E24: /* liang simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3022: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0xF978: /* liang - compatibility */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E8C; /* 2 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x53C1: /* Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x53C2: /* Modern Japanese Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x53C3: /* Obsolete Japanese Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x53C4: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5F0E: /* Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3023: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E09; /* 3 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E96: /* Obsolete Japanese variant */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8086: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3024: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x56DB; /* 4 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4F0D: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3025: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E94; /* 5 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x9646: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x9678: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3026: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x516D; /* 6 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x67D2: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x6F06: /* Legal ??????*/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3027: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E03; /* 7 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x634C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3028: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x516B; /* 8 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x7396: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3029: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E5D; /* 9 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x3038: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x4EC0: /* Legal simplified - disfavored */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x62FE: /* Legal traditional*/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x5341; /* 10 */ ~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x5EFF: /* Portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3039: /* Suzhou portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E8C; ~~~~~~~~~~~~~~ *t++ = 0x5341; /* 20 */ ~~~~~~~~~~~~~~~~~~~~~~~~ NewLen++; ~~~~~~~~~ break; ~~~~~~ case 0x5345: /* Portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x303A: /* Suzhou portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E09; ~~~~~~~~~~~~~~ *t++ = 0x5341; /* 30 */ ~~~~~~~~~~~~~~~~~~~~~~~~ NewLen++; ~~~~~~~~~ break; ~~~~~~ case 0x534C: /* Portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x56DB; ~~~~~~~~~~~~~~ *t++ = 0x5341; /* 40 */ ~~~~~~~~~~~~~~~~~~~~~~~~ NewLen++; ~~~~~~~~~ break; ~~~~~~ case 0x4F70: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x964C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x767E; /* 100 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4EDF: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x9621: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x5343; /* 1000 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x842C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E07; /* 10,000 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4EBF: /* Simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x5104; /* 100,000,000 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ *t++ = c; ~~~~~~~~~ } ~ } ~ *t = 0x0000; ~~~~~~~~~~~~ n = malloc ( (NewLen+1) * sizeof(UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (n == NULL) return (n); ~~~~~~~~~~~~~~~~~~~~~~~~~~ ucscpy(n,tmp); ~~~~~~~~ uninum.c:1678:3: note: in expansion of macro 'ucscpy' ucscpy(n,tmp); ^~~~~~ In file included from uninum.c:53: /usr/include/wchar.h:170:10: note: expected 'wchar_t * restrict' {aka 'int * restrict'} but argument is of type 'long int *' wchar_t *wcscpy(wchar_t * __restrict, const wchar_t * __restrict); ^~~~~~ uninum.c:39:54: warning: passing argument 2 of 'wcscpy' from incompatible pointer type [-Wincompatible-pointer-types] #define ucscpy(x,y) (UTF32 *)wcscpy((signed long *)x,(signed long *)y) ^~~~~~~~~~~~~~~~~ #define ucscat(x,y) (UTF32 *)wcscat((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucschr(x,y) (UTF32 *)wcschr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucsrchr(x,y) (UTF32 *)wcsrchr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define UNINUM ~~~~~~~~~~~~~~ #include "config.h" ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~ #include "unicode.h" ~~~~~~~~~~~~~~~~~~~~ #include "uninum.h" ~~~~~~~~~~~~~~~~~~~ #include "nsdefs.h" ~~~~~~~~~~~~~~~~~~~ #include "exitcode.h" ~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_LOCALE_H ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ int uninum_err; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 tcl_uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short uninum_ns_type; /* Exported for sanity-checking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Exported for parameter setting */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Input_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_General_Group_Size = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_First_Group_Size = 3; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 Uninum_Output_Group_Separator = 0x002C; /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Generate_Roman_With_Bar_P = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We're currently not dealing with non-integers - this is just forward-looking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static UTF32 Uninum_Output_Decimal_Separator = 0x002E; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* (10^97)-1, in hex for compactness and speed of conversion to binary */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MAXCHINESEHEX "4AE825771DC07672DDD0F8E8AC39250971AC4210CECB6F656CAEB9109FFFFFFFFFFFFFFFFFFFFFFFF" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_THOUSANDS_SIGN 0x0482 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_TITLO 0x0483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DECIMAL_MARKER 0xE06C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_MARKER 0xE06D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_LSD_MARKER 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DEC 0xE06A ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_EL 0xE06B ~~~~~~~~~~~~~~~~~~~~~~~~~~ char *uninum_version(void) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return(VERSION); ~~~~~~~~~~~~~~~~ } ~ #ifdef HAVE_LOCALECONV ~~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_SETLOCALE ~~~~~~~~~~~~~~~~~~~~~ void GetLocaleGroupInfo (){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct lconv *lcptr; ~~~~~~~~~~~~~~~~~~~~ setlocale(LC_NUMERIC,""); ~~~~~~~~~~~~~~~~~~~~~~~~~ lcptr = localeconv(); ~~~~~~~~~~~~~~~~~~~~~ if(lcptr == NULL) { ~~~~~~~~~~~~~~~~~~~ fprintf(stderr,"Attempt to obtain locale information was unsuccessful.\n"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ Uninum_Output_Group_Separator = (UTF16) (lcptr->thousands_sep[0]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Uninum_Output_First_Group_Size = lcptr->grouping[0]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(lcptr->grouping[1] != 0) Uninum_Output_General_Group_Size = lcptr->grouping[1]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Uninum_Output_General_Group_Size = Uninum_Output_First_Group_Size; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ #endif ~~~~~~ #endif ~~~~~~ /* Auxiliary functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long ipow(int base, int cnt) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ unsigned long Result; ~~~~~~~~~~~~~~~~~~~~~ i = 1; ~~~~~~ Result = 1; ~~~~~~~~~~~ while (i++ <= cnt) Result *= base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return Result; ~~~~~~~~~~~~~~ } ~ /* ~~ * Copy a string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static char *strpcpy(char *dest, const char *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *t; ~~~~~~~~ const char *s; ~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0) { ~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0; ~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Case-insenstive ascii string comparison. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Emulates BSD 4.4 function emulated by GNU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static int mystrcasecmp(char *a, char *b) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char ac; ~~~~~~~~ char bc; ~~~~~~~~ while(*a != '\0') { ~~~~~~~~~~~~~~~~~~~ ac = tolower(*a++); ~~~~~~~~~~~~~~~~~~~ bc = tolower(*b++); ~~~~~~~~~~~~~~~~~~~ if(ac < bc) return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~ if(ac > bc) return (1); ~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(*b != '\0') return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (0); ~~~~~~~~~~~ } ~ /* ~~ * Copy a wide string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ * This emulates the GNU extension wcpcpy(). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *ucpcpy(UTF32 *dest, const UTF32 *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ const UTF32 *s; ~~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Reverse a wide string in place. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *wcsrev(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *q; ~~~~~~~~~ UTF32 *h; ~~~~~~~~~ UTF32 t; ~~~~~~~~ p = s; ~~~~~~ q = s + ucslen(s)-1; ~~~~~~~~~~~~~~~~~~~~ h = s + (ucslen(s)/2); ~~~~~~~~~~~~~~~~~~~~~~ while (q >= h) { ~~~~~~~~~~~~~~~~ t = *p; ~~~~~~~ *p++ = *q; ~~~~~~~~~~ *q-- = t; ~~~~~~~~~ } ~ return(s); ~~~~~~~~~~ } ~ /* ~~ * Prepend a character to a string, returning new storage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * and freeing the old. ~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *Prepend(UTF32 *s, UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ new = malloc(sizeof(UTF32) * (len + 2)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new) { ~~~~~~~~~ new[0] = c; ~~~~~~~~~~~ new[1] = 0x0000; ~~~~~~~~~~~~~~~~ ucscpy(new+1,s); ~~~~~~~~~~~~~~~~ } ~ free(s); ~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ /* Remove "thousands separator"s */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *wcStripSeparators(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *o; ~~~~~~~~~ UTF32 c; ~~~~~~~~ o = t = s; ~~~~~~~~~~ while ((c = *s++) != 0x0000){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch(c) { ~~~~~~~~~~~ case 0x0020: /* Space */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x0027: /* Apostrophe */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002C: /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002E: /* Period */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x066C: /* Arabic thousands separator */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x1361: /* Ethiopic wordspace */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3000: /* Ideographic space */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We can't add the Braille comma U+2802 here because Russian Braille uses ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ the same character for the digit "1" */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ *t++ = c; ~~~~~~~~~ } ~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return o; ~~~~~~~~~ } ~ /* ~~ * It is the caller's responsability to free the original storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ UTF32 *wcDelimitNumber( ~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *number, ~~~~~~~~~~~~~~ UTF16 gs, /* Group separator character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 ds, /* Decimal point character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GroupSize, /* Number of digits in groups in general */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int FirstGroupSize /* Number of digits in low-order group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ) ~ { ~ int New_Size; /* Characters needed for delimited string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int length; /* Length of input string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int commas; /* Number of delimiters to insert */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Comma_Cnt; /* Number of delimiters inserted so far */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int digits; /* Number of digits preceding decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int cnt; /* Number of digits processed */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ UTF32 *new; /* String in which to write delimited number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *point; /* Location of decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *pos; /* Current position in original number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *npos; /* Current position in new number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *Non_Space_Number; /* Location of first non-space character in number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Sanity check */ ~~~~~~~~~~~~~~~~~~ if( (GroupSize < 2) || (FirstGroupSize < 2)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 0; ~~~~~~~~~~~ goto newmem; ~~~~~~~~~~~~ } ~ length = ucslen(number); ~~~~~~~~~~~~~~~~~~~~~~~~ point = ucsrchr(number,(UTF32) '.'); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(point == NULL) point = number+(length-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else point-=1; /* Point now points at last digit preceding decimal/end */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Non_Space_Number = ucsrchr(number,0x0020); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(Non_Space_Number == NULL) Non_Space_Number = number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Non_Space_Number+=1; ~~~~~~~~~~~~~~~~~~~~~~~~~ digits = 1+point - Non_Space_Number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(digits > FirstGroupSize) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 1 + ((digits-FirstGroupSize-1)/GroupSize); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ else commas = 0; ~~~~~~~~~~~~~~~~ newmem: ~~~~~~~ New_Size = length + commas; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ new = (UTF32 *) malloc((New_Size + 1) * sizeof(UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new){ ~~~~~~~~ if (commas == 0) return ucscpy(new,number); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* First copy right hand part of number, up to and including decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pos = number+length; ~~~~~~~~~~~~~~~~~~~~ npos = new+New_Size; ~~~~~~~~~~~~~~~~~~~~ for(; pos > point;) *npos-- = *pos--; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Now copy lefthand part, inserting delimiters as we go */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Comma_Cnt = cnt = 0; ~~~~~~~~~~~~~~~~~~~~ if(FirstGroupSize != GroupSize) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ for (i = 0; i < FirstGroupSize; i++) *npos-- = *pos--; /* Copy low group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *npos-- = (UTF32) gs; ~~~~~~~~~~~~~~~~~~~~~ *npos-- = *pos--; /* Low digit of second group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Comma_Cnt = cnt = 1; ~~~~~~~~~~~~~~~~~~~~ } ~ while(pos >= Non_Space_Number){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *npos-- = *pos--; ~~~~~~~~~~~~~~~~~ if( (++cnt % GroupSize == 0) && (Comma_Cnt++ < commas )) *npos-- = (UTF32) gs; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ while(pos >= number) *npos-- = *pos--; /* Copy leading spaces, if any */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ } ~ /* ~~ * Returns a null-terminated wide string containing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * the specified character. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *MakeSingleDigitString(UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ new = malloc(sizeof(UTF32) * 2); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) { ~~~~~~~~~~ uninum_err = NS_ERROR_OUTOFMEMORY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NULL; ~~~~~~~~~~~~ } ~ new[0] = c; ~~~~~~~~~~~ new[1] = 0L; ~~~~~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ struct ns {char *s; int c; short type;}; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static struct ns NumberSystemList[] = { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Aegean",NS_AEGEAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "All",NS_ALL,NS_TYPE_SPECIAL, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Any",NS_ANY,NS_TYPE_SPECIAL, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Alphabetic",NS_ARABIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Persian",NS_PERSO_ARABIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Western",NS_ARABIC_WESTERN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Armenian",NS_ARMENIAN_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Balinese",NS_BALINESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Bengali",NS_BENGALI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Burmese",NS_BURMESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese",NS_CHINESE_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Early",NS_CHINESE_COUNTING_ROD_EARLY_WITH_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Late",NS_CHINESE_COUNTING_ROD_LATE_WITH_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Early_No_Zero",NS_CHINESE_COUNTING_ROD_EARLY_WITHOUT_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Late_No_Zero",NS_CHINESE_COUNTING_ROD_LATE_WITHOUT_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Legal_Simplified",NS_CHINESE_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Legal_Traditional",NS_CHINESE_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Simplified",NS_CHINESE_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Traditional",NS_CHINESE_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Place",NS_CHINESE_REGULAR_PLACE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Common_Braille",NS_COMMON_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Counting_Rod",NS_CHINESE_COUNTING_ROD_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Cyrillic",NS_CYRILLIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Devanagari",NS_DEVANAGARI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Egyptian",NS_EGYPTIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ethiopic",NS_ETHIOPIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ewellic_Decimal",NS_EWELLIC_DECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ewellic_Hexadecimal",NS_EWELLIC_HEX,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "French_Braille",NS_FRENCH_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Glagolitic",NS_GLAGOLITIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek",NS_GREEK_ALPHABETIC_UPPER,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek_Lower",NS_GREEK_ALPHABETIC_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek_Upper",NS_GREEK_ALPHABETIC_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Gujarati",NS_GUJARATI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Gurmukhi",NS_GURMUKHI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew",NS_HEBREW_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew_Early",NS_HEBREW_EARLY,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew_Late",NS_HEBREW_LATE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal",NS_HEX,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal_Lower",NS_HEX_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal_Upper",NS_HEX_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Regular_Simplified",NS_CHINESE_JAPANESE_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Regular_Traditional",NS_CHINESE_JAPANESE_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Legal_Simplified",NS_CHINESE_JAPANESE_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Legal_Traditional",NS_CHINESE_JAPANESE_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Western_Mixed",NS_CHINESE_JAPANESE_WESTERN_MIX,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kannada",NS_KANNADA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kayah_Li", NS_KAYAH_LI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kharoshthi",NS_KHAROSHTHI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Khmer",NS_KHMER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Klingon",NS_KLINGON,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Lao",NS_LAO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Lepcha",NS_LEPCHA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Limbu",NS_LIMBU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Malayalam",NS_MALAYALAM,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Legal_Simplified",NS_CHINESE_MANDARIN_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Legal_Traditional",NS_CHINESE_MANDARIN_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Regular_Simplified",NS_CHINESE_MANDARIN_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Regular_Traditional",NS_CHINESE_MANDARIN_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mongolian",NS_MONGOLIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mxedruli",NS_MXEDRULI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "New_Tai_Lue",NS_NEW_TAI_LUE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Nko",NS_NKO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ol_Chiki",NS_OL_CHIKI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Old_Italic",NS_OLD_ITALIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Old_Persian",NS_OLD_PERSIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Oriya",NS_ORIYA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Osmanya",NS_OSMANYA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Phoenician",NS_PHOENICIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman",NS_ROMAN_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman_Lower",NS_ROMAN_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman_Upper",NS_ROMAN_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Russian_Braille",NS_RUSSIAN_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Saurashtra",NS_SAURASHTRA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Shan",NS_SHAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Sinhala",NS_SINHALA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Sundanese",NS_SUNDANESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Suzhou",NS_CHINESE_SUZHOU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil",NS_TAMIL_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil_Place",NS_TAMIL_PLACE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil_Traditional",NS_TAMIL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Telugu",NS_TELUGU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tengwar_Decimal",NS_TENGWAR_DECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tengwar_Duodecimal",NS_TENGWAR_DUODECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Thai",NS_THAI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tibetan",NS_TIBETAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Vai",NS_VAI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Verdurian",NS_VERDURIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western",NS_WESTERN_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western_Lower",NS_WESTERN_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western_Upper",NS_WESTERN_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Xucuri_Lower",NS_XUCURI_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Xucuri_Upper",NS_XUCURI_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Unknown",NS_UNKNOWN,NS_TYPE_GUESS, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "All_Zero",NS_ALLZERO,NS_TYPE_GUESS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ }; ~~ /* ~~ * Generate the list of available writing systems, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * returning the next string on each call unless ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * the flag is 0, which resets to the start of the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * sequence. ~~~~~~~~~~~ * ~ * which = 0 -> list specific names usable in both directions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * which = 1 -> list cover terms suitable only for conversion of string to int ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ char *ListNumberSystems (int flag, int which) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static int i = 0; ~~~~~~~~~~~~~~~~~ if(flag == 0) i = 0; /* reset */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ top: if (i < (sizeof(NumberSystemList)/sizeof(struct ns))) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (NumberSystemList[i].type == (which? 2:1)) return NumberSystemList[i++].s; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else { ~~~~~~ i++; ~~~~ goto top; ~~~~~~~~~ } ~ } ~ i = 0; ~~~~~~ return NULL; ~~~~~~~~~~~~ } ~ /* ~~ * We just use linear search for the time being. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Could switch to binary search for greater speed. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ int StringToNumberSystem (char *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ for (i=0; i < (sizeof(NumberSystemList)/sizeof(struct ns)); i++) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (mystrcasecmp(s,NumberSystemList[i].s) == 0){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_ns_type = NumberSystemList[i].type; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (NumberSystemList[i].c); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ } ~ return NS_UNKNOWN; ~~~~~~~~~~~~~~~~~~ } ~ /* ~~ * We just use linear search for the time being. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Could switch to binary search for greater speed. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ char *NumberSystemToString (int ns) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ for (i=0; i < (sizeof(NumberSystemList)/sizeof(struct ns)); i++) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (NumberSystemList[i].c == ns) return NumberSystemList[i].s; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ return NULL; ~~~~~~~~~~~~ } ~ /* ~~ * Return the maximum value expressible in the specified number system. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * as a decimal ascii string, or if there is no limit, "unlimited". ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ #define AEGEAN_LIMIT 99999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_LIMIT 1999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EGYPTIAN_LIMIT 9999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_LIMIT 999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_LIMIT 10000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ROMAN_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_LIMIT 999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LIMIT 10000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *UninumStringMaximumValue(int ns) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *new; ~~~~~~~~~~ mpz_t MaxChinese; ~~~~~~~~~~~~~~~~~ mpz_t Limit; ~~~~~~~~~~~~ mpz_init(Limit); ~~~~~~~~~~~~~~~~ switch(ns) { ~~~~~~~~~~~~ case NS_CHINESE_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_WESTERN_MIX: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init_set_str(MaxChinese,MAXCHINESEHEX,16); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ new = malloc((mpz_sizeinbase(MaxChinese,10) + 1) * sizeof(char)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (void) mpz_get_str(new,10,MaxChinese); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(MaxChinese); ~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ case NS_AEGEAN: ~~~~~~~~~~~~~~~ mpz_set_ui(Limit,AEGEAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ARABIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ARABIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ARMENIAN_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ARMENIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_CYRILLIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,CYRILLIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_EGYPTIAN: ~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,EGYPTIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_GLAGOLITIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,GLAGOLITIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_GREEK_ALPHABETIC_UPPER: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_GREEK_ALPHABETIC_LOWER: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,GREEK_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_HEBREW_EARLY: ~~~~~~~~~~~~~~~~~~~~~ case NS_HEBREW_LATE: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,HEBREW_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_KHAROSHTHI: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,KHAROSHTHI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_MXEDRULI: ~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,MXEDRULI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_OLD_ITALIC: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,OLD_ITALIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_OLD_PERSIAN: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,OLD_PERSIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_PHOENICIAN: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,PHOENICIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ROMAN_UPPER: ~~~~~~~~~~~~~~~~~~~~ case NS_ROMAN_LOWER: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ROMAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_SINHALA: ~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,SINHALA_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_TAMIL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,TAMIL_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_XUCURI_LOWER: ~~~~~~~~~~~~~~~~~~~~~ case NS_XUCURI_UPPER: ~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,XUCURI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ new = malloc (sizeof(char) * (1 + strlen("unlimited"))); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sprintf(new,"%s","unlimited"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ new = malloc((mpz_sizeinbase(Limit,10) + 1) * sizeof(char)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (void) mpz_get_str(new,10,Limit); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Limit); ~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ #define AEGEAN_BEGIN 0x10107 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define AEGEAN_END 0x10133 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_BEGIN 0x0660 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_END 0x066C ~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_ALPHABETIC_BEGIN 0x0627 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_ALPHABETIC_END 0x064A ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PERSO_ARABIC_BEGIN 0x06F0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PERSO_ARABIC_END 0x06F9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_ALPHABETIC_UPPER_BEGIN 0x0531 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_ALPHABETIC_UPPER_END 0x554 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BALINESE_BEGIN 0x1B50 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BALINESE_END 0x1B59 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BENGALI_BEGIN 0x09E6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BENGALI_END 0x09EF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BURMESE_BEGIN 0x1040 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BURMESE_END 0x1049 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_COUNTING_ROD_BEGIN 0x1D360 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_COUNTING_ROD_END 0x1D371 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_A_BEGIN 0x4E00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_A_END 0x9FBB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_B_BEGIN 0x20000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_B_END 0x2A6D6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_ALPHABETIC_UPPER_BEGIN 0x0400 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_ALPHABETIC_UPPER_END 0x04FF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define DEVANAGARI_BEGIN 0x0966 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define DEVANAGARI_END 0x096F ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define COMMON_BRAILLE_BEGIN 0x2801 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define COMMON_BRAILLE_END 0x281B ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ETHIOPIC_BEGIN 0x1369 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ETHIOPIC_END 0x137C ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_BEGIN 0xE6C0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_DECIMAL_END 0xE6C9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_END 0xE6CF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_ALPHABETIC_BEGIN 0x2C00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_ALPHABETIC_END 0x2C1E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_BEGIN 0x03B1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_END 0x03C9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_BEGIN 0x0391 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_END 0x03A9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_DIGAMMA 0x03DD ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_DIGAMMA 0x03DC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_KOPPA 0x03DF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_KOPPA 0x03DE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_SAN 0x03FB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_SAN 0x03FA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_STIGMA 0x03DB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_STIGMA 0x03DA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_RIGHT_KERAIA 0x0374 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LEFT_KERAIA 0x0375 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GUJARATI_BEGIN 0x0AE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GUJARATI_END 0x0AEF ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GURMUKHI_BEGIN 0x0A66 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GURMUKHI_END 0x0A6F ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_BEGIN 0x0590 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_END 0x05FF ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KAYAH_LI_BEGIN 0xA900 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KAYAH_LI_END 0xA909 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KANNADA_BEGIN 0x0CE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KANNADA_END 0x0CEF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_BEGIN 0x10A40 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_END 0x10A47 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHMER_BEGIN 0x17E0 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHMER_END 0x17E9 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KLINGON_BEGIN 0xF8F0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KLINGON_END 0xF8F9 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LAO_BEGIN 0x0ED0 ~~~~~~~~~~~~~~~~~~~~~~~~ #define LAO_END 0x0ED9 ~~~~~~~~~~~~~~~~~~~~~~ #define LEPCHA_BEGIN 0x1C40 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LEPCHA_END 0x1C49 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define LIMBU_BEGIN 0x1946 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LIMBU_END 0x194F ~~~~~~~~~~~~~~~~~~~~~~~~ #define MALAYALAM_BEGIN 0x0D00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MALAYALAM_END 0x0D7F ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MONGOLIAN_BEGIN 0x1810 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MONGOLIAN_END 0x1819 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_BEGIN 0x10D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_END 0x10F5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NEW_TAI_LUE_BEGIN 0x19D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NEW_TAI_LUE_END 0x19D9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NKO_BEGIN 0x07C0 ~~~~~~~~~~~~~~~~~~~~~~~~ #define NKO_END 0x07C9 ~~~~~~~~~~~~~~~~~~~~~~ #define OL_CHIKI_BEGIN 0x1C50 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OL_CHIKI_END 0x1C59 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_BEGIN 0x10320 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_END 0x10323 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_BEGIN 0x103D1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_END 0x103D5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ORIYA_BEGIN 0x0B66 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ORIYA_END 0x0B6F ~~~~~~~~~~~~~~~~~~~~~~~~ #define OSMANYA_BEGIN 0x104A0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OSMANYA_END 0x104A9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_BEGIN 0x10916 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_END 0x10919 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SAURASHTRA_BEGIN 0xA8D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SAURASHTRA_END 0xA8D9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SHAN_BEGIN 0x1090 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define SHAN_END 0x1099 ~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_BEGIN 0x0DE7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_END 0x0DFA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUNDANESE_BEGIN 0x1BB0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUNDANESE_END 0x1BB9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUZHOU_BEGIN 0x3021 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUZHOU_END 0x3029 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_BEGIN 0x0BE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_END 0x0BF2 ~~~~~~~~~~~~~~~~~~~~~~~~ #define TELUGU_BEGIN 0x0C66 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TELUGU_END 0x0C6F ~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_BEGIN 0xE030 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_END 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define THAI_BEGIN 0x0E50 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define THAI_END 0x0E59 ~~~~~~~~~~~~~~~~~~~~~~~ #define TIBETAN_BEGIN 0x0F20 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TIBETAN_END 0x0F29 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define VAI_BEGIN 0xA620 ~~~~~~~~~~~~~~~~~~~~~~~~ #define VAI_END 0xA629 ~~~~~~~~~~~~~~~~~~~~~~ #define VERDURIAN_BEGIN 0xE260 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define VERDURIAN_END 0xE26B ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LOWER_BEGIN 0x2D00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LOWER_END 0x2D25 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_UPPER_BEGIN 0x10A0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_UPPER_END 0x10C5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GuessNumberSystem(UTF32 *str){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ UTF32 *s; ~~~~~~~~~ int WesternCnt = 0; ~~~~~~~~~~~~~~~~~~~ int ZeroCnt = 0; ~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ short FirstIsGraveP = 0; ~~~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (!str) return (NS_UNKNOWN); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ len = ucslen(str); ~~~~~~~~~~~~~~~~~~ s = str; ~~~~~~~~ if((c = *s) == 0x0060) FirstIsGraveP = 1; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ while((c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= AEGEAN_BEGIN) && (c <= AEGEAN_END)) return NS_AEGEAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ARABIC_BEGIN) && (c <= ARABIC_END)) return NS_ARABIC_WESTERN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ARABIC_ALPHABETIC_BEGIN) && ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c <= ARABIC_ALPHABETIC_END)) return NS_ARABIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= PERSO_ARABIC_BEGIN) && ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c <= PERSO_ARABIC_END)) return NS_PERSO_ARABIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= ARMENIAN_ALPHABETIC_UPPER_BEGIN) && (c <= ARMENIAN_ALPHABETIC_UPPER_END))) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NS_ARMENIAN_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= BALINESE_BEGIN) && (c <= BALINESE_END)) return NS_BALINESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= BENGALI_BEGIN) && (c <= BENGALI_END)) return NS_BENGALI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= BURMESE_BEGIN) && (c <= BURMESE_END)) return NS_BURMESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= CHINESE_COUNTING_ROD_BEGIN) && (c <= CHINESE_COUNTING_ROD_END)) return NS_CHINESE_COUNTING_ROD_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ( ((c >= CHINESE_A_BEGIN) && (c <= CHINESE_A_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ((c >= CHINESE_B_BEGIN) && (c <= CHINESE_B_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ( (c >= SUZHOU_BEGIN) && (c <= SUZHOU_END)) ) return NS_CHINESE_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= CYRILLIC_ALPHABETIC_UPPER_BEGIN) && (c <= CYRILLIC_ALPHABETIC_UPPER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == CYRILLIC_THOUSANDS_SIGN) || (c == CYRILLIC_TITLO)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NS_CYRILLIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= DEVANAGARI_BEGIN) && (c <= DEVANAGARI_END)) return NS_DEVANAGARI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= 0x14000) && (c <= 0x143D7)) return NS_EGYPTIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ETHIOPIC_BEGIN) && (c <= ETHIOPIC_END)) return NS_ETHIOPIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c > EWELLIC_DECIMAL_END) && (c <= EWELLIC_END)) return NS_EWELLIC_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= EWELLIC_BEGIN) && (c <= EWELLIC_DECIMAL_END)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(FirstIsGraveP) return NS_EWELLIC_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else return NS_EWELLIC_DECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= GLAGOLITIC_ALPHABETIC_BEGIN) && (c <= GLAGOLITIC_ALPHABETIC_END)) return NS_GLAGOLITIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= GREEK_ALPHABETIC_LOWER_BEGIN) && (c <= GREEK_ALPHABETIC_LOWER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_DIGAMMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_KOPPA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_STIGMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_SAN)) return NS_GREEK_ALPHABETIC_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= GREEK_ALPHABETIC_UPPER_BEGIN) && (c <= GREEK_ALPHABETIC_UPPER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_DIGAMMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_KOPPA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_STIGMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_SAN)) return NS_GREEK_ALPHABETIC_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= GUJARATI_BEGIN) && (c <= GUJARATI_END)) return NS_GUJARATI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= GURMUKHI_BEGIN) && (c <= GURMUKHI_END)) return NS_GURMUKHI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= HEBREW_BEGIN) && (c <= HEBREW_END)) return NS_HEBREW_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KANNADA_BEGIN) && (c <= KANNADA_END)) return NS_KANNADA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KAYAH_LI_BEGIN) && (c <= KAYAH_LI_END)) return NS_KAYAH_LI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KHAROSHTHI_BEGIN) && (c <= KHAROSHTHI_END)) return NS_KHAROSHTHI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KHMER_BEGIN) && (c <= KHMER_END)) return NS_KHMER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KLINGON_BEGIN) && (c <= KLINGON_END)) return NS_KLINGON; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LAO_BEGIN) && (c <= LAO_END)) return NS_LAO; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LEPCHA_BEGIN) && (c <= LEPCHA_END)) return NS_LEPCHA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LIMBU_BEGIN) && (c <= LIMBU_END)) return NS_LIMBU; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MALAYALAM_BEGIN) && (c <= MALAYALAM_END)) return NS_MALAYALAM; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MONGOLIAN_BEGIN) && (c <= MONGOLIAN_END)) return NS_MONGOLIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MXEDRULI_BEGIN) && (c <= MXEDRULI_END)) return NS_MXEDRULI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= NEW_TAI_LUE_BEGIN) && (c <= NEW_TAI_LUE_END)) return NS_NEW_TAI_LUE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= NKO_BEGIN) && (c <= NKO_END)) return NS_NKO; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OL_CHIKI_BEGIN) && (c <= OL_CHIKI_END)) return NS_OL_CHIKI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OLD_ITALIC_BEGIN) && (c <= OLD_ITALIC_END)) return NS_OLD_ITALIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OLD_PERSIAN_BEGIN) && (c <= OLD_PERSIAN_END)) return NS_OLD_PERSIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ORIYA_BEGIN) && (c <= ORIYA_END)) return NS_ORIYA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OSMANYA_BEGIN) && (c <= OSMANYA_END)) return NS_OSMANYA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= PHOENICIAN_BEGIN) && (c <= PHOENICIAN_END)) return NS_PHOENICIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SAURASHTRA_BEGIN) && (c <= SAURASHTRA_END)) return NS_SAURASHTRA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SHAN_BEGIN) && (c <= SHAN_END)) return NS_SHAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SUNDANESE_BEGIN) && (c <= SUNDANESE_END)) return NS_SUNDANESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TAMIL_BEGIN) && (c <= TAMIL_END)) return NS_TAMIL_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TELUGU_BEGIN) && (c <= TELUGU_END)) return NS_TELUGU; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DECIMAL_MARKER) return NS_TENGWAR_DECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DUODECIMAL_MARKER) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DUODECIMAL_LSD_MARKER) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if( (c == TENGWAR_DEC) || (c == TENGWAR_EL)) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= THAI_BEGIN) && (c <= THAI_END)) return NS_THAI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TIBETAN_BEGIN) && (c <= TIBETAN_END)) return NS_TIBETAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= VAI_BEGIN) && (c <= VAI_END)) return NS_VAI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= VERDURIAN_BEGIN) && (c <= VERDURIAN_END)) return NS_VERDURIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= XUCURI_LOWER_BEGIN) && (c <= XUCURI_LOWER_END)) return NS_XUCURI_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= XUCURI_UPPER_BEGIN) && (c <= XUCURI_UPPER_END)) return NS_XUCURI_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x0059) || (c == 0x0079)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (ZeroCnt && (s-1 == str+1)) return NS_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c == 0x0049) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x0056) || ~~~~~~~~~~~~~~~~ (c == 0x0058) || ~~~~~~~~~~~~~~~~ (c == 0x004C) || ~~~~~~~~~~~~~~~~ (c == 0x0043) || ~~~~~~~~~~~~~~~~ (c == 0x0044) || ~~~~~~~~~~~~~~~~ (c == 0x004D) || ~~~~~~~~~~~~~~~~ (c == 0x2183) || ~~~~~~~~~~~~~~~~ ( (c >= 0x2160) && (c <= 0x216F))) return NS_ROMAN_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x0069) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x0076) || ~~~~~~~~~~~~~~~~ (c == 0x0078) || ~~~~~~~~~~~~~~~~ (c == 0x006C) || ~~~~~~~~~~~~~~~~ (c == 0x0063) || ~~~~~~~~~~~~~~~~ (c == 0x0064) || ~~~~~~~~~~~~~~~~ (c == 0x006D) || ~~~~~~~~~~~~~~~~ (c == 0x2184) || ~~~~~~~~~~~~~~~~ ( (c >= 0x2170) && (c <= 0x217F))) return NS_ROMAN_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x281A) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2801) || ~~~~~~~~~~~~~~~~ (c == 0x2803) || ~~~~~~~~~~~~~~~~ (c == 0x2809) || ~~~~~~~~~~~~~~~~ (c == 0x2819) || ~~~~~~~~~~~~~~~~ (c == 0x2811) || ~~~~~~~~~~~~~~~~ (c == 0x280B) || ~~~~~~~~~~~~~~~~ (c == 0x281B) || ~~~~~~~~~~~~~~~~ (c == 0x2813) || ~~~~~~~~~~~~~~~~ (c == 0x280A)) return NS_COMMON_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x283C) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2821) || ~~~~~~~~~~~~~~~~ (c == 0x2823) || ~~~~~~~~~~~~~~~~ (c == 0x2829) || ~~~~~~~~~~~~~~~~ (c == 0x2839) || ~~~~~~~~~~~~~~~~ (c == 0x2831) || ~~~~~~~~~~~~~~~~ (c == 0x282B) || ~~~~~~~~~~~~~~~~ (c == 0x283B) || ~~~~~~~~~~~~~~~~ (c == 0x2833) || ~~~~~~~~~~~~~~~~ (c == 0x282A)) return NS_FRENCH_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x2834) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2802) || ~~~~~~~~~~~~~~~~ (c == 0x2806) || ~~~~~~~~~~~~~~~~ (c == 0x2812) || ~~~~~~~~~~~~~~~~ (c == 0x2832) || ~~~~~~~~~~~~~~~~ (c == 0x2822) || ~~~~~~~~~~~~~~~~ (c == 0x2816) || ~~~~~~~~~~~~~~~~ (c == 0x2836) || ~~~~~~~~~~~~~~~~ (c == 0x2826) || ~~~~~~~~~~~~~~~~ (c == 0x2814)) return NS_RUSSIAN_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= 0x31 ) && (c <= 0x39)) || ((c >= 0xFF10) && (c <= 0xFF19))) {WesternCnt++;continue;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (c == 0x0030) {ZeroCnt++;WesternCnt++;continue;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(ZeroCnt == len) return (NS_ALLZERO); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(WesternCnt == len) return(NS_WESTERN_GENERIC); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (NS_UNKNOWN); ~~~~~~~~~~~~~~~~~~~~ } ~ /* String to Integer conversion functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static void ArabicToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ char *rs; ~~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0660: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0661: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0662: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0663: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0664: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0665: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0666: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0667: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0668: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0669: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void ArabicExtendedToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x06F0: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F1: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F2: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F3: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F4: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F5: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F6: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F7: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F8: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F9: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void ArabicAlphabeticToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0627: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0628: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062C: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062F: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0647: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0648: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0632: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062D: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0637: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x064A: ~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0643: ~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0644: ~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0645: ~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0646: ~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0633: ~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0639: ~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0641: ~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0635: ~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0642: ~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0631: ~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0634: ~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062A: ~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062B: ~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062E: ~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0630: ~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0636: ~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0638: ~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x063A: ~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void AegeanToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x10107: ~~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10108: ~~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10109: ~~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010A: ~~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010B: ~~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010C: ~~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010D: ~~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010E: ~~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010F: ~~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10110: ~~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10111: ~~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10112: ~~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10113: ~~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10114: ~~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10115: ~~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10116: ~~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10117: ~~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10118: ~~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10119: ~~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011A: ~~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011B: ~~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011C: ~~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011D: ~~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011E: ~~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011F: ~~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10120: ~~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10121: ~~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10122: ~~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10123: ~~~~~~~~~~~~~ CurrentValue = 2000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10124: ~~~~~~~~~~~~~ CurrentValue = 3000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10125: ~~~~~~~~~~~~~ CurrentValue = 4000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10126: ~~~~~~~~~~~~~ CurrentValue = 5000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10127: ~~~~~~~~~~~~~ CurrentValue = 6000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10128: ~~~~~~~~~~~~~ CurrentValue = 7000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10129: ~~~~~~~~~~~~~ CurrentValue = 8000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012A: ~~~~~~~~~~~~~ CurrentValue = 9000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012B: ~~~~~~~~~~~~~ CurrentValue = 10000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012C: ~~~~~~~~~~~~~ CurrentValue = 20000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012D: ~~~~~~~~~~~~~ CurrentValue = 30000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012E: ~~~~~~~~~~~~~ CurrentValue = 40000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012F: ~~~~~~~~~~~~~ CurrentValue = 50000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10130: ~~~~~~~~~~~~~ CurrentValue = 60000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10131: ~~~~~~~~~~~~~ CurrentValue = 70000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10132: ~~~~~~~~~~~~~ CurrentValue = 80000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10133: ~~~~~~~~~~~~~ CurrentValue = 90000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void ArmenianAlphabeticToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0531: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0532: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0533: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0534: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0535: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0536: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0537: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0538: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0539: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053A: ~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053B: ~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053C: ~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053D: ~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053E: ~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053F: ~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0540: ~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0541: ~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0542: ~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0543: ~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0544: ~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0545: ~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0546: ~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0547: ~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0548: ~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0549: ~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054A: ~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054B: ~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054C: ~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054D: ~~~~~~~~~~~~ CurrentValue = 2000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054E: ~~~~~~~~~~~~ CurrentValue = 3000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054F: ~~~~~~~~~~~~ CurrentValue = 4000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0550: ~~~~~~~~~~~~ CurrentValue = 5000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0551: ~~~~~~~~~~~~ CurrentValue = 6000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0552: ~~~~~~~~~~~~ CurrentValue = 7000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0553: ~~~~~~~~~~~~ CurrentValue = 8000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0554: ~~~~~~~~~~~~ CurrentValue = 9000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void BalineseToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x1B50: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B51: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B52: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B53: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B54: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B55: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B56: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B57: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B58: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B59: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void BengaliToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x09E6: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E7: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E8: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E9: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EA: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EB: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EC: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09ED: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EE: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EF: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void BurmeseToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x1040: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1041: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1042: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1043: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1044: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1045: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1046: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1047: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1048: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1049: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ /* ~~ * Replaces variant forms of Chinese numbers with their standard traditional counterparts. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Returns a newly allocated string, or a null pointer on failure of storage allocation. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *NormalizeChineseNumbers (UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *tmp; ~~~~~~~~~~~ UTF32 *n; ~~~~~~~~~ int len; ~~~~~~~~ int NewLen; ~~~~~~~~~~~ /* ~~ * It is safe to double the string length for temp space since no ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * substitution does more than replace one character with two. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ #ifdef ALLOCAOK ~~~~~~~~~~~~~~~ t = alloca (((2 * len) + 1) * sizeof (UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #else ~~~~~ t = malloc (((2 * len) + 1) * sizeof (UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ if (t == NULL) return (t); ~~~~~~~~~~~~~~~~~~~~~~~~~~ tmp = t; ~~~~~~~~ NewLen = len; ~~~~~~~~~~~~~ while( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x96F6: /* Traditional/Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0xF9B2: /* Compatibility */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ =0x3007; /* 0 - Ideographic zero - also used with Suzhou numerals*/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x58F1: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x58F9: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x580C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x4E48: /* Telephone number yao - traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5E7A: /* Telephone number yao - simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3021: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++=0x4E00; /* 1 */ ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x5F0D: /* Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5F10: /* Modern Japanese Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5169: /* liang traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8CAE: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8CB3: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8D30: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x4E24: /* liang simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3022: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0xF978: /* liang - compatibility */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E8C; /* 2 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x53C1: /* Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x53C2: /* Modern Japanese Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x53C3: /* Obsolete Japanese Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x53C4: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5F0E: /* Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3023: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E09; /* 3 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E96: /* Obsolete Japanese variant */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8086: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3024: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x56DB; /* 4 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4F0D: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3025: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E94; /* 5 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x9646: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x9678: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3026: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x516D; /* 6 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x67D2: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x6F06: /* Legal ??????*/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3027: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E03; /* 7 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x634C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3028: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x516B; /* 8 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x7396: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3029: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E5D; /* 9 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x3038: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x4EC0: /* Legal simplified - disfavored */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x62FE: /* Legal traditional*/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x5341; /* 10 */ ~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x5EFF: /* Portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3039: /* Suzhou portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E8C; ~~~~~~~~~~~~~~ *t++ = 0x5341; /* 20 */ ~~~~~~~~~~~~~~~~~~~~~~~~ NewLen++; ~~~~~~~~~ break; ~~~~~~ case 0x5345: /* Portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x303A: /* Suzhou portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E09; ~~~~~~~~~~~~~~ *t++ = 0x5341; /* 30 */ ~~~~~~~~~~~~~~~~~~~~~~~~ NewLen++; ~~~~~~~~~ break; ~~~~~~ case 0x534C: /* Portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x56DB; ~~~~~~~~~~~~~~ *t++ = 0x5341; /* 40 */ ~~~~~~~~~~~~~~~~~~~~~~~~ NewLen++; ~~~~~~~~~ break; ~~~~~~ case 0x4F70: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x964C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x767E; /* 100 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4EDF: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x9621: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x5343; /* 1000 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x842C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E07; /* 10,000 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4EBF: /* Simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x5104; /* 100,000,000 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ *t++ = c; ~~~~~~~~~ } ~ } ~ *t = 0x0000; ~~~~~~~~~~~~ n = malloc ( (NewLen+1) * sizeof(UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (n == NULL) return (n); ~~~~~~~~~~~~~~~~~~~~~~~~~~ ucscpy(n,tmp); ~~~~~~~~~~~~ uninum.c:1678:3: note: in expansion of macro 'ucscpy' ucscpy(n,tmp); ^~~~~~ In file included from uninum.c:53: /usr/include/wchar.h:170:10: note: expected 'const wchar_t * restrict' {aka 'const int * restrict'} but argument is of type 'long int *' wchar_t *wcscpy(wchar_t * __restrict, const wchar_t * __restrict); ^~~~~~ uninum.c: In function 'SeekChineseBarrier': uninum.c:41:37: warning: passing argument 1 of 'wcschr' from incompatible pointer type [-Wincompatible-pointer-types] #define ucschr(x,y) (UTF32 *)wcschr((signed long *)x,(signed long)y) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucsrchr(x,y) (UTF32 *)wcsrchr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define UNINUM ~~~~~~~~~~~~~~ #include "config.h" ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~ #include "unicode.h" ~~~~~~~~~~~~~~~~~~~~ #include "uninum.h" ~~~~~~~~~~~~~~~~~~~ #include "nsdefs.h" ~~~~~~~~~~~~~~~~~~~ #include "exitcode.h" ~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_LOCALE_H ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ int uninum_err; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 tcl_uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short uninum_ns_type; /* Exported for sanity-checking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Exported for parameter setting */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Input_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_General_Group_Size = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_First_Group_Size = 3; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 Uninum_Output_Group_Separator = 0x002C; /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Generate_Roman_With_Bar_P = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We're currently not dealing with non-integers - this is just forward-looking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static UTF32 Uninum_Output_Decimal_Separator = 0x002E; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* (10^97)-1, in hex for compactness and speed of conversion to binary */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MAXCHINESEHEX "4AE825771DC07672DDD0F8E8AC39250971AC4210CECB6F656CAEB9109FFFFFFFFFFFFFFFFFFFFFFFF" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_THOUSANDS_SIGN 0x0482 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_TITLO 0x0483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DECIMAL_MARKER 0xE06C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_MARKER 0xE06D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_LSD_MARKER 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DEC 0xE06A ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_EL 0xE06B ~~~~~~~~~~~~~~~~~~~~~~~~~~ char *uninum_version(void) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return(VERSION); ~~~~~~~~~~~~~~~~ } ~ #ifdef HAVE_LOCALECONV ~~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_SETLOCALE ~~~~~~~~~~~~~~~~~~~~~ void GetLocaleGroupInfo (){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct lconv *lcptr; ~~~~~~~~~~~~~~~~~~~~ setlocale(LC_NUMERIC,""); ~~~~~~~~~~~~~~~~~~~~~~~~~ lcptr = localeconv(); ~~~~~~~~~~~~~~~~~~~~~ if(lcptr == NULL) { ~~~~~~~~~~~~~~~~~~~ fprintf(stderr,"Attempt to obtain locale information was unsuccessful.\n"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ Uninum_Output_Group_Separator = (UTF16) (lcptr->thousands_sep[0]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Uninum_Output_First_Group_Size = lcptr->grouping[0]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(lcptr->grouping[1] != 0) Uninum_Output_General_Group_Size = lcptr->grouping[1]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Uninum_Output_General_Group_Size = Uninum_Output_First_Group_Size; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ #endif ~~~~~~ #endif ~~~~~~ /* Auxiliary functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long ipow(int base, int cnt) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ unsigned long Result; ~~~~~~~~~~~~~~~~~~~~~ i = 1; ~~~~~~ Result = 1; ~~~~~~~~~~~ while (i++ <= cnt) Result *= base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return Result; ~~~~~~~~~~~~~~ } ~ /* ~~ * Copy a string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static char *strpcpy(char *dest, const char *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *t; ~~~~~~~~ const char *s; ~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0) { ~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0; ~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Case-insenstive ascii string comparison. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Emulates BSD 4.4 function emulated by GNU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static int mystrcasecmp(char *a, char *b) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char ac; ~~~~~~~~ char bc; ~~~~~~~~ while(*a != '\0') { ~~~~~~~~~~~~~~~~~~~ ac = tolower(*a++); ~~~~~~~~~~~~~~~~~~~ bc = tolower(*b++); ~~~~~~~~~~~~~~~~~~~ if(ac < bc) return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~ if(ac > bc) return (1); ~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(*b != '\0') return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (0); ~~~~~~~~~~~ } ~ /* ~~ * Copy a wide string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ * This emulates the GNU extension wcpcpy(). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *ucpcpy(UTF32 *dest, const UTF32 *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ const UTF32 *s; ~~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Reverse a wide string in place. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *wcsrev(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *q; ~~~~~~~~~ UTF32 *h; ~~~~~~~~~ UTF32 t; ~~~~~~~~ p = s; ~~~~~~ q = s + ucslen(s)-1; ~~~~~~~~~~~~~~~~~~~~ h = s + (ucslen(s)/2); ~~~~~~~~~~~~~~~~~~~~~~ while (q >= h) { ~~~~~~~~~~~~~~~~ t = *p; ~~~~~~~ *p++ = *q; ~~~~~~~~~~ *q-- = t; ~~~~~~~~~ } ~ return(s); ~~~~~~~~~~ } ~ /* ~~ * Prepend a character to a string, returning new storage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * and freeing the old. ~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *Prepend(UTF32 *s, UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ new = malloc(sizeof(UTF32) * (len + 2)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new) { ~~~~~~~~~ new[0] = c; ~~~~~~~~~~~ new[1] = 0x0000; ~~~~~~~~~~~~~~~~ ucscpy(new+1,s); ~~~~~~~~~~~~~~~~ } ~ free(s); ~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ /* Remove "thousands separator"s */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *wcStripSeparators(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *o; ~~~~~~~~~ UTF32 c; ~~~~~~~~ o = t = s; ~~~~~~~~~~ while ((c = *s++) != 0x0000){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch(c) { ~~~~~~~~~~~ case 0x0020: /* Space */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x0027: /* Apostrophe */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002C: /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002E: /* Period */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x066C: /* Arabic thousands separator */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x1361: /* Ethiopic wordspace */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3000: /* Ideographic space */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We can't add the Braille comma U+2802 here because Russian Braille uses ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ the same character for the digit "1" */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ *t++ = c; ~~~~~~~~~ } ~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return o; ~~~~~~~~~ } ~ /* ~~ * It is the caller's responsability to free the original storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ UTF32 *wcDelimitNumber( ~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *number, ~~~~~~~~~~~~~~ UTF16 gs, /* Group separator character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 ds, /* Decimal point character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GroupSize, /* Number of digits in groups in general */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int FirstGroupSize /* Number of digits in low-order group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ) ~ { ~ int New_Size; /* Characters needed for delimited string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int length; /* Length of input string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int commas; /* Number of delimiters to insert */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Comma_Cnt; /* Number of delimiters inserted so far */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int digits; /* Number of digits preceding decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int cnt; /* Number of digits processed */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ UTF32 *new; /* String in which to write delimited number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *point; /* Location of decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *pos; /* Current position in original number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *npos; /* Current position in new number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *Non_Space_Number; /* Location of first non-space character in number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Sanity check */ ~~~~~~~~~~~~~~~~~~ if( (GroupSize < 2) || (FirstGroupSize < 2)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 0; ~~~~~~~~~~~ goto newmem; ~~~~~~~~~~~~ } ~ length = ucslen(number); ~~~~~~~~~~~~~~~~~~~~~~~~ point = ucsrchr(number,(UTF32) '.'); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(point == NULL) point = number+(length-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else point-=1; /* Point now points at last digit preceding decimal/end */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Non_Space_Number = ucsrchr(number,0x0020); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(Non_Space_Number == NULL) Non_Space_Number = number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Non_Space_Number+=1; ~~~~~~~~~~~~~~~~~~~~~~~~~ digits = 1+point - Non_Space_Number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(digits > FirstGroupSize) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 1 + ((digits-FirstGroupSize-1)/GroupSize); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ else commas = 0; ~~~~~~~~~~~~~~~~ newmem: ~~~~~~~ New_Size = length + commas; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ new = (UTF32 *) malloc((New_Size + 1) * sizeof(UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new){ ~~~~~~~~ if (commas == 0) return ucscpy(new,number); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* First copy right hand part of number, up to and including decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pos = number+length; ~~~~~~~~~~~~~~~~~~~~ npos = new+New_Size; ~~~~~~~~~~~~~~~~~~~~ for(; pos > point;) *npos-- = *pos--; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Now copy lefthand part, inserting delimiters as we go */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Comma_Cnt = cnt = 0; ~~~~~~~~~~~~~~~~~~~~ if(FirstGroupSize != GroupSize) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ for (i = 0; i < FirstGroupSize; i++) *npos-- = *pos--; /* Copy low group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *npos-- = (UTF32) gs; ~~~~~~~~~~~~~~~~~~~~~ *npos-- = *pos--; /* Low digit of second group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Comma_Cnt = cnt = 1; ~~~~~~~~~~~~~~~~~~~~ } ~ while(pos >= Non_Space_Number){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *npos-- = *pos--; ~~~~~~~~~~~~~~~~~ if( (++cnt % GroupSize == 0) && (Comma_Cnt++ < commas )) *npos-- = (UTF32) gs; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ while(pos >= number) *npos-- = *pos--; /* Copy leading spaces, if any */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ } ~ /* ~~ * Returns a null-terminated wide string containing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * the specified character. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *MakeSingleDigitString(UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ new = malloc(sizeof(UTF32) * 2); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) { ~~~~~~~~~~ uninum_err = NS_ERROR_OUTOFMEMORY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NULL; ~~~~~~~~~~~~ } ~ new[0] = c; ~~~~~~~~~~~ new[1] = 0L; ~~~~~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ struct ns {char *s; int c; short type;}; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static struct ns NumberSystemList[] = { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Aegean",NS_AEGEAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "All",NS_ALL,NS_TYPE_SPECIAL, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Any",NS_ANY,NS_TYPE_SPECIAL, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Alphabetic",NS_ARABIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Persian",NS_PERSO_ARABIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Western",NS_ARABIC_WESTERN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Armenian",NS_ARMENIAN_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Balinese",NS_BALINESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Bengali",NS_BENGALI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Burmese",NS_BURMESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese",NS_CHINESE_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Early",NS_CHINESE_COUNTING_ROD_EARLY_WITH_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Late",NS_CHINESE_COUNTING_ROD_LATE_WITH_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Early_No_Zero",NS_CHINESE_COUNTING_ROD_EARLY_WITHOUT_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Late_No_Zero",NS_CHINESE_COUNTING_ROD_LATE_WITHOUT_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Legal_Simplified",NS_CHINESE_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Legal_Traditional",NS_CHINESE_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Simplified",NS_CHINESE_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Traditional",NS_CHINESE_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Place",NS_CHINESE_REGULAR_PLACE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Common_Braille",NS_COMMON_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Counting_Rod",NS_CHINESE_COUNTING_ROD_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Cyrillic",NS_CYRILLIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Devanagari",NS_DEVANAGARI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Egyptian",NS_EGYPTIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ethiopic",NS_ETHIOPIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ewellic_Decimal",NS_EWELLIC_DECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ewellic_Hexadecimal",NS_EWELLIC_HEX,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "French_Braille",NS_FRENCH_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Glagolitic",NS_GLAGOLITIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek",NS_GREEK_ALPHABETIC_UPPER,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek_Lower",NS_GREEK_ALPHABETIC_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek_Upper",NS_GREEK_ALPHABETIC_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Gujarati",NS_GUJARATI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Gurmukhi",NS_GURMUKHI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew",NS_HEBREW_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew_Early",NS_HEBREW_EARLY,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew_Late",NS_HEBREW_LATE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal",NS_HEX,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal_Lower",NS_HEX_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal_Upper",NS_HEX_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Regular_Simplified",NS_CHINESE_JAPANESE_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Regular_Traditional",NS_CHINESE_JAPANESE_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Legal_Simplified",NS_CHINESE_JAPANESE_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Legal_Traditional",NS_CHINESE_JAPANESE_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Western_Mixed",NS_CHINESE_JAPANESE_WESTERN_MIX,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kannada",NS_KANNADA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kayah_Li", NS_KAYAH_LI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kharoshthi",NS_KHAROSHTHI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Khmer",NS_KHMER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Klingon",NS_KLINGON,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Lao",NS_LAO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Lepcha",NS_LEPCHA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Limbu",NS_LIMBU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Malayalam",NS_MALAYALAM,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Legal_Simplified",NS_CHINESE_MANDARIN_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Legal_Traditional",NS_CHINESE_MANDARIN_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Regular_Simplified",NS_CHINESE_MANDARIN_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Regular_Traditional",NS_CHINESE_MANDARIN_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mongolian",NS_MONGOLIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mxedruli",NS_MXEDRULI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "New_Tai_Lue",NS_NEW_TAI_LUE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Nko",NS_NKO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ol_Chiki",NS_OL_CHIKI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Old_Italic",NS_OLD_ITALIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Old_Persian",NS_OLD_PERSIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Oriya",NS_ORIYA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Osmanya",NS_OSMANYA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Phoenician",NS_PHOENICIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman",NS_ROMAN_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman_Lower",NS_ROMAN_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman_Upper",NS_ROMAN_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Russian_Braille",NS_RUSSIAN_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Saurashtra",NS_SAURASHTRA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Shan",NS_SHAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Sinhala",NS_SINHALA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Sundanese",NS_SUNDANESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Suzhou",NS_CHINESE_SUZHOU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil",NS_TAMIL_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil_Place",NS_TAMIL_PLACE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil_Traditional",NS_TAMIL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Telugu",NS_TELUGU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tengwar_Decimal",NS_TENGWAR_DECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tengwar_Duodecimal",NS_TENGWAR_DUODECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Thai",NS_THAI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tibetan",NS_TIBETAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Vai",NS_VAI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Verdurian",NS_VERDURIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western",NS_WESTERN_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western_Lower",NS_WESTERN_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western_Upper",NS_WESTERN_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Xucuri_Lower",NS_XUCURI_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Xucuri_Upper",NS_XUCURI_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Unknown",NS_UNKNOWN,NS_TYPE_GUESS, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "All_Zero",NS_ALLZERO,NS_TYPE_GUESS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ }; ~~ /* ~~ * Generate the list of available writing systems, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * returning the next string on each call unless ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * the flag is 0, which resets to the start of the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * sequence. ~~~~~~~~~~~ * ~ * which = 0 -> list specific names usable in both directions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * which = 1 -> list cover terms suitable only for conversion of string to int ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ char *ListNumberSystems (int flag, int which) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static int i = 0; ~~~~~~~~~~~~~~~~~ if(flag == 0) i = 0; /* reset */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ top: if (i < (sizeof(NumberSystemList)/sizeof(struct ns))) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (NumberSystemList[i].type == (which? 2:1)) return NumberSystemList[i++].s; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else { ~~~~~~ i++; ~~~~ goto top; ~~~~~~~~~ } ~ } ~ i = 0; ~~~~~~ return NULL; ~~~~~~~~~~~~ } ~ /* ~~ * We just use linear search for the time being. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Could switch to binary search for greater speed. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ int StringToNumberSystem (char *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ for (i=0; i < (sizeof(NumberSystemList)/sizeof(struct ns)); i++) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (mystrcasecmp(s,NumberSystemList[i].s) == 0){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_ns_type = NumberSystemList[i].type; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (NumberSystemList[i].c); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ } ~ return NS_UNKNOWN; ~~~~~~~~~~~~~~~~~~ } ~ /* ~~ * We just use linear search for the time being. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Could switch to binary search for greater speed. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ char *NumberSystemToString (int ns) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ for (i=0; i < (sizeof(NumberSystemList)/sizeof(struct ns)); i++) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (NumberSystemList[i].c == ns) return NumberSystemList[i].s; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ return NULL; ~~~~~~~~~~~~ } ~ /* ~~ * Return the maximum value expressible in the specified number system. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * as a decimal ascii string, or if there is no limit, "unlimited". ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ #define AEGEAN_LIMIT 99999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_LIMIT 1999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EGYPTIAN_LIMIT 9999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_LIMIT 999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_LIMIT 10000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ROMAN_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_LIMIT 999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LIMIT 10000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *UninumStringMaximumValue(int ns) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *new; ~~~~~~~~~~ mpz_t MaxChinese; ~~~~~~~~~~~~~~~~~ mpz_t Limit; ~~~~~~~~~~~~ mpz_init(Limit); ~~~~~~~~~~~~~~~~ switch(ns) { ~~~~~~~~~~~~ case NS_CHINESE_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_WESTERN_MIX: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init_set_str(MaxChinese,MAXCHINESEHEX,16); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ new = malloc((mpz_sizeinbase(MaxChinese,10) + 1) * sizeof(char)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (void) mpz_get_str(new,10,MaxChinese); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(MaxChinese); ~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ case NS_AEGEAN: ~~~~~~~~~~~~~~~ mpz_set_ui(Limit,AEGEAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ARABIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ARABIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ARMENIAN_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ARMENIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_CYRILLIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,CYRILLIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_EGYPTIAN: ~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,EGYPTIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_GLAGOLITIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,GLAGOLITIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_GREEK_ALPHABETIC_UPPER: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_GREEK_ALPHABETIC_LOWER: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,GREEK_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_HEBREW_EARLY: ~~~~~~~~~~~~~~~~~~~~~ case NS_HEBREW_LATE: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,HEBREW_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_KHAROSHTHI: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,KHAROSHTHI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_MXEDRULI: ~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,MXEDRULI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_OLD_ITALIC: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,OLD_ITALIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_OLD_PERSIAN: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,OLD_PERSIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_PHOENICIAN: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,PHOENICIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ROMAN_UPPER: ~~~~~~~~~~~~~~~~~~~~ case NS_ROMAN_LOWER: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ROMAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_SINHALA: ~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,SINHALA_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_TAMIL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,TAMIL_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_XUCURI_LOWER: ~~~~~~~~~~~~~~~~~~~~~ case NS_XUCURI_UPPER: ~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,XUCURI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ new = malloc (sizeof(char) * (1 + strlen("unlimited"))); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sprintf(new,"%s","unlimited"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ new = malloc((mpz_sizeinbase(Limit,10) + 1) * sizeof(char)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (void) mpz_get_str(new,10,Limit); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Limit); ~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ #define AEGEAN_BEGIN 0x10107 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define AEGEAN_END 0x10133 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_BEGIN 0x0660 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_END 0x066C ~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_ALPHABETIC_BEGIN 0x0627 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_ALPHABETIC_END 0x064A ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PERSO_ARABIC_BEGIN 0x06F0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PERSO_ARABIC_END 0x06F9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_ALPHABETIC_UPPER_BEGIN 0x0531 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_ALPHABETIC_UPPER_END 0x554 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BALINESE_BEGIN 0x1B50 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BALINESE_END 0x1B59 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BENGALI_BEGIN 0x09E6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BENGALI_END 0x09EF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BURMESE_BEGIN 0x1040 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BURMESE_END 0x1049 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_COUNTING_ROD_BEGIN 0x1D360 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_COUNTING_ROD_END 0x1D371 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_A_BEGIN 0x4E00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_A_END 0x9FBB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_B_BEGIN 0x20000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_B_END 0x2A6D6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_ALPHABETIC_UPPER_BEGIN 0x0400 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_ALPHABETIC_UPPER_END 0x04FF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define DEVANAGARI_BEGIN 0x0966 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define DEVANAGARI_END 0x096F ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define COMMON_BRAILLE_BEGIN 0x2801 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define COMMON_BRAILLE_END 0x281B ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ETHIOPIC_BEGIN 0x1369 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ETHIOPIC_END 0x137C ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_BEGIN 0xE6C0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_DECIMAL_END 0xE6C9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_END 0xE6CF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_ALPHABETIC_BEGIN 0x2C00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_ALPHABETIC_END 0x2C1E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_BEGIN 0x03B1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_END 0x03C9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_BEGIN 0x0391 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_END 0x03A9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_DIGAMMA 0x03DD ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_DIGAMMA 0x03DC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_KOPPA 0x03DF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_KOPPA 0x03DE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_SAN 0x03FB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_SAN 0x03FA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_STIGMA 0x03DB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_STIGMA 0x03DA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_RIGHT_KERAIA 0x0374 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LEFT_KERAIA 0x0375 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GUJARATI_BEGIN 0x0AE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GUJARATI_END 0x0AEF ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GURMUKHI_BEGIN 0x0A66 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GURMUKHI_END 0x0A6F ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_BEGIN 0x0590 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_END 0x05FF ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KAYAH_LI_BEGIN 0xA900 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KAYAH_LI_END 0xA909 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KANNADA_BEGIN 0x0CE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KANNADA_END 0x0CEF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_BEGIN 0x10A40 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_END 0x10A47 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHMER_BEGIN 0x17E0 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHMER_END 0x17E9 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KLINGON_BEGIN 0xF8F0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KLINGON_END 0xF8F9 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LAO_BEGIN 0x0ED0 ~~~~~~~~~~~~~~~~~~~~~~~~ #define LAO_END 0x0ED9 ~~~~~~~~~~~~~~~~~~~~~~ #define LEPCHA_BEGIN 0x1C40 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LEPCHA_END 0x1C49 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define LIMBU_BEGIN 0x1946 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LIMBU_END 0x194F ~~~~~~~~~~~~~~~~~~~~~~~~ #define MALAYALAM_BEGIN 0x0D00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MALAYALAM_END 0x0D7F ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MONGOLIAN_BEGIN 0x1810 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MONGOLIAN_END 0x1819 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_BEGIN 0x10D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_END 0x10F5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NEW_TAI_LUE_BEGIN 0x19D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NEW_TAI_LUE_END 0x19D9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NKO_BEGIN 0x07C0 ~~~~~~~~~~~~~~~~~~~~~~~~ #define NKO_END 0x07C9 ~~~~~~~~~~~~~~~~~~~~~~ #define OL_CHIKI_BEGIN 0x1C50 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OL_CHIKI_END 0x1C59 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_BEGIN 0x10320 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_END 0x10323 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_BEGIN 0x103D1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_END 0x103D5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ORIYA_BEGIN 0x0B66 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ORIYA_END 0x0B6F ~~~~~~~~~~~~~~~~~~~~~~~~ #define OSMANYA_BEGIN 0x104A0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OSMANYA_END 0x104A9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_BEGIN 0x10916 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_END 0x10919 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SAURASHTRA_BEGIN 0xA8D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SAURASHTRA_END 0xA8D9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SHAN_BEGIN 0x1090 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define SHAN_END 0x1099 ~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_BEGIN 0x0DE7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_END 0x0DFA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUNDANESE_BEGIN 0x1BB0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUNDANESE_END 0x1BB9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUZHOU_BEGIN 0x3021 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUZHOU_END 0x3029 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_BEGIN 0x0BE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_END 0x0BF2 ~~~~~~~~~~~~~~~~~~~~~~~~ #define TELUGU_BEGIN 0x0C66 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TELUGU_END 0x0C6F ~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_BEGIN 0xE030 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_END 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define THAI_BEGIN 0x0E50 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define THAI_END 0x0E59 ~~~~~~~~~~~~~~~~~~~~~~~ #define TIBETAN_BEGIN 0x0F20 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TIBETAN_END 0x0F29 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define VAI_BEGIN 0xA620 ~~~~~~~~~~~~~~~~~~~~~~~~ #define VAI_END 0xA629 ~~~~~~~~~~~~~~~~~~~~~~ #define VERDURIAN_BEGIN 0xE260 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define VERDURIAN_END 0xE26B ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LOWER_BEGIN 0x2D00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LOWER_END 0x2D25 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_UPPER_BEGIN 0x10A0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_UPPER_END 0x10C5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GuessNumberSystem(UTF32 *str){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ UTF32 *s; ~~~~~~~~~ int WesternCnt = 0; ~~~~~~~~~~~~~~~~~~~ int ZeroCnt = 0; ~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ short FirstIsGraveP = 0; ~~~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (!str) return (NS_UNKNOWN); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ len = ucslen(str); ~~~~~~~~~~~~~~~~~~ s = str; ~~~~~~~~ if((c = *s) == 0x0060) FirstIsGraveP = 1; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ while((c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= AEGEAN_BEGIN) && (c <= AEGEAN_END)) return NS_AEGEAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ARABIC_BEGIN) && (c <= ARABIC_END)) return NS_ARABIC_WESTERN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ARABIC_ALPHABETIC_BEGIN) && ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c <= ARABIC_ALPHABETIC_END)) return NS_ARABIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= PERSO_ARABIC_BEGIN) && ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c <= PERSO_ARABIC_END)) return NS_PERSO_ARABIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= ARMENIAN_ALPHABETIC_UPPER_BEGIN) && (c <= ARMENIAN_ALPHABETIC_UPPER_END))) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NS_ARMENIAN_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= BALINESE_BEGIN) && (c <= BALINESE_END)) return NS_BALINESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= BENGALI_BEGIN) && (c <= BENGALI_END)) return NS_BENGALI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= BURMESE_BEGIN) && (c <= BURMESE_END)) return NS_BURMESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= CHINESE_COUNTING_ROD_BEGIN) && (c <= CHINESE_COUNTING_ROD_END)) return NS_CHINESE_COUNTING_ROD_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ( ((c >= CHINESE_A_BEGIN) && (c <= CHINESE_A_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ((c >= CHINESE_B_BEGIN) && (c <= CHINESE_B_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ( (c >= SUZHOU_BEGIN) && (c <= SUZHOU_END)) ) return NS_CHINESE_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= CYRILLIC_ALPHABETIC_UPPER_BEGIN) && (c <= CYRILLIC_ALPHABETIC_UPPER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == CYRILLIC_THOUSANDS_SIGN) || (c == CYRILLIC_TITLO)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NS_CYRILLIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= DEVANAGARI_BEGIN) && (c <= DEVANAGARI_END)) return NS_DEVANAGARI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= 0x14000) && (c <= 0x143D7)) return NS_EGYPTIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ETHIOPIC_BEGIN) && (c <= ETHIOPIC_END)) return NS_ETHIOPIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c > EWELLIC_DECIMAL_END) && (c <= EWELLIC_END)) return NS_EWELLIC_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= EWELLIC_BEGIN) && (c <= EWELLIC_DECIMAL_END)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(FirstIsGraveP) return NS_EWELLIC_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else return NS_EWELLIC_DECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= GLAGOLITIC_ALPHABETIC_BEGIN) && (c <= GLAGOLITIC_ALPHABETIC_END)) return NS_GLAGOLITIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= GREEK_ALPHABETIC_LOWER_BEGIN) && (c <= GREEK_ALPHABETIC_LOWER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_DIGAMMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_KOPPA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_STIGMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_SAN)) return NS_GREEK_ALPHABETIC_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= GREEK_ALPHABETIC_UPPER_BEGIN) && (c <= GREEK_ALPHABETIC_UPPER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_DIGAMMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_KOPPA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_STIGMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_SAN)) return NS_GREEK_ALPHABETIC_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= GUJARATI_BEGIN) && (c <= GUJARATI_END)) return NS_GUJARATI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= GURMUKHI_BEGIN) && (c <= GURMUKHI_END)) return NS_GURMUKHI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= HEBREW_BEGIN) && (c <= HEBREW_END)) return NS_HEBREW_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KANNADA_BEGIN) && (c <= KANNADA_END)) return NS_KANNADA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KAYAH_LI_BEGIN) && (c <= KAYAH_LI_END)) return NS_KAYAH_LI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KHAROSHTHI_BEGIN) && (c <= KHAROSHTHI_END)) return NS_KHAROSHTHI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KHMER_BEGIN) && (c <= KHMER_END)) return NS_KHMER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KLINGON_BEGIN) && (c <= KLINGON_END)) return NS_KLINGON; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LAO_BEGIN) && (c <= LAO_END)) return NS_LAO; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LEPCHA_BEGIN) && (c <= LEPCHA_END)) return NS_LEPCHA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LIMBU_BEGIN) && (c <= LIMBU_END)) return NS_LIMBU; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MALAYALAM_BEGIN) && (c <= MALAYALAM_END)) return NS_MALAYALAM; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MONGOLIAN_BEGIN) && (c <= MONGOLIAN_END)) return NS_MONGOLIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MXEDRULI_BEGIN) && (c <= MXEDRULI_END)) return NS_MXEDRULI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= NEW_TAI_LUE_BEGIN) && (c <= NEW_TAI_LUE_END)) return NS_NEW_TAI_LUE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= NKO_BEGIN) && (c <= NKO_END)) return NS_NKO; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OL_CHIKI_BEGIN) && (c <= OL_CHIKI_END)) return NS_OL_CHIKI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OLD_ITALIC_BEGIN) && (c <= OLD_ITALIC_END)) return NS_OLD_ITALIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OLD_PERSIAN_BEGIN) && (c <= OLD_PERSIAN_END)) return NS_OLD_PERSIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ORIYA_BEGIN) && (c <= ORIYA_END)) return NS_ORIYA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OSMANYA_BEGIN) && (c <= OSMANYA_END)) return NS_OSMANYA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= PHOENICIAN_BEGIN) && (c <= PHOENICIAN_END)) return NS_PHOENICIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SAURASHTRA_BEGIN) && (c <= SAURASHTRA_END)) return NS_SAURASHTRA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SHAN_BEGIN) && (c <= SHAN_END)) return NS_SHAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SUNDANESE_BEGIN) && (c <= SUNDANESE_END)) return NS_SUNDANESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TAMIL_BEGIN) && (c <= TAMIL_END)) return NS_TAMIL_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TELUGU_BEGIN) && (c <= TELUGU_END)) return NS_TELUGU; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DECIMAL_MARKER) return NS_TENGWAR_DECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DUODECIMAL_MARKER) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DUODECIMAL_LSD_MARKER) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if( (c == TENGWAR_DEC) || (c == TENGWAR_EL)) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= THAI_BEGIN) && (c <= THAI_END)) return NS_THAI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TIBETAN_BEGIN) && (c <= TIBETAN_END)) return NS_TIBETAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= VAI_BEGIN) && (c <= VAI_END)) return NS_VAI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= VERDURIAN_BEGIN) && (c <= VERDURIAN_END)) return NS_VERDURIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= XUCURI_LOWER_BEGIN) && (c <= XUCURI_LOWER_END)) return NS_XUCURI_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= XUCURI_UPPER_BEGIN) && (c <= XUCURI_UPPER_END)) return NS_XUCURI_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x0059) || (c == 0x0079)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (ZeroCnt && (s-1 == str+1)) return NS_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c == 0x0049) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x0056) || ~~~~~~~~~~~~~~~~ (c == 0x0058) || ~~~~~~~~~~~~~~~~ (c == 0x004C) || ~~~~~~~~~~~~~~~~ (c == 0x0043) || ~~~~~~~~~~~~~~~~ (c == 0x0044) || ~~~~~~~~~~~~~~~~ (c == 0x004D) || ~~~~~~~~~~~~~~~~ (c == 0x2183) || ~~~~~~~~~~~~~~~~ ( (c >= 0x2160) && (c <= 0x216F))) return NS_ROMAN_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x0069) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x0076) || ~~~~~~~~~~~~~~~~ (c == 0x0078) || ~~~~~~~~~~~~~~~~ (c == 0x006C) || ~~~~~~~~~~~~~~~~ (c == 0x0063) || ~~~~~~~~~~~~~~~~ (c == 0x0064) || ~~~~~~~~~~~~~~~~ (c == 0x006D) || ~~~~~~~~~~~~~~~~ (c == 0x2184) || ~~~~~~~~~~~~~~~~ ( (c >= 0x2170) && (c <= 0x217F))) return NS_ROMAN_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x281A) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2801) || ~~~~~~~~~~~~~~~~ (c == 0x2803) || ~~~~~~~~~~~~~~~~ (c == 0x2809) || ~~~~~~~~~~~~~~~~ (c == 0x2819) || ~~~~~~~~~~~~~~~~ (c == 0x2811) || ~~~~~~~~~~~~~~~~ (c == 0x280B) || ~~~~~~~~~~~~~~~~ (c == 0x281B) || ~~~~~~~~~~~~~~~~ (c == 0x2813) || ~~~~~~~~~~~~~~~~ (c == 0x280A)) return NS_COMMON_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x283C) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2821) || ~~~~~~~~~~~~~~~~ (c == 0x2823) || ~~~~~~~~~~~~~~~~ (c == 0x2829) || ~~~~~~~~~~~~~~~~ (c == 0x2839) || ~~~~~~~~~~~~~~~~ (c == 0x2831) || ~~~~~~~~~~~~~~~~ (c == 0x282B) || ~~~~~~~~~~~~~~~~ (c == 0x283B) || ~~~~~~~~~~~~~~~~ (c == 0x2833) || ~~~~~~~~~~~~~~~~ (c == 0x282A)) return NS_FRENCH_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x2834) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2802) || ~~~~~~~~~~~~~~~~ (c == 0x2806) || ~~~~~~~~~~~~~~~~ (c == 0x2812) || ~~~~~~~~~~~~~~~~ (c == 0x2832) || ~~~~~~~~~~~~~~~~ (c == 0x2822) || ~~~~~~~~~~~~~~~~ (c == 0x2816) || ~~~~~~~~~~~~~~~~ (c == 0x2836) || ~~~~~~~~~~~~~~~~ (c == 0x2826) || ~~~~~~~~~~~~~~~~ (c == 0x2814)) return NS_RUSSIAN_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= 0x31 ) && (c <= 0x39)) || ((c >= 0xFF10) && (c <= 0xFF19))) {WesternCnt++;continue;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (c == 0x0030) {ZeroCnt++;WesternCnt++;continue;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(ZeroCnt == len) return (NS_ALLZERO); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(WesternCnt == len) return(NS_WESTERN_GENERIC); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (NS_UNKNOWN); ~~~~~~~~~~~~~~~~~~~~ } ~ /* String to Integer conversion functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static void ArabicToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ char *rs; ~~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0660: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0661: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0662: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0663: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0664: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0665: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0666: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0667: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0668: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0669: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void ArabicExtendedToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x06F0: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F1: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F2: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F3: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F4: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F5: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F6: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F7: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F8: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F9: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void ArabicAlphabeticToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0627: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0628: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062C: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062F: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0647: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0648: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0632: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062D: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0637: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x064A: ~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0643: ~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0644: ~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0645: ~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0646: ~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0633: ~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0639: ~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0641: ~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0635: ~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0642: ~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0631: ~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0634: ~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062A: ~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062B: ~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062E: ~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0630: ~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0636: ~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0638: ~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x063A: ~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void AegeanToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x10107: ~~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10108: ~~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10109: ~~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010A: ~~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010B: ~~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010C: ~~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010D: ~~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010E: ~~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010F: ~~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10110: ~~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10111: ~~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10112: ~~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10113: ~~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10114: ~~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10115: ~~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10116: ~~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10117: ~~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10118: ~~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10119: ~~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011A: ~~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011B: ~~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011C: ~~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011D: ~~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011E: ~~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011F: ~~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10120: ~~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10121: ~~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10122: ~~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10123: ~~~~~~~~~~~~~ CurrentValue = 2000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10124: ~~~~~~~~~~~~~ CurrentValue = 3000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10125: ~~~~~~~~~~~~~ CurrentValue = 4000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10126: ~~~~~~~~~~~~~ CurrentValue = 5000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10127: ~~~~~~~~~~~~~ CurrentValue = 6000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10128: ~~~~~~~~~~~~~ CurrentValue = 7000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10129: ~~~~~~~~~~~~~ CurrentValue = 8000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012A: ~~~~~~~~~~~~~ CurrentValue = 9000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012B: ~~~~~~~~~~~~~ CurrentValue = 10000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012C: ~~~~~~~~~~~~~ CurrentValue = 20000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012D: ~~~~~~~~~~~~~ CurrentValue = 30000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012E: ~~~~~~~~~~~~~ CurrentValue = 40000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012F: ~~~~~~~~~~~~~ CurrentValue = 50000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10130: ~~~~~~~~~~~~~ CurrentValue = 60000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10131: ~~~~~~~~~~~~~ CurrentValue = 70000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10132: ~~~~~~~~~~~~~ CurrentValue = 80000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10133: ~~~~~~~~~~~~~ CurrentValue = 90000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void ArmenianAlphabeticToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0531: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0532: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0533: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0534: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0535: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0536: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0537: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0538: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0539: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053A: ~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053B: ~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053C: ~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053D: ~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053E: ~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053F: ~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0540: ~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0541: ~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0542: ~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0543: ~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0544: ~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0545: ~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0546: ~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0547: ~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0548: ~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0549: ~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054A: ~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054B: ~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054C: ~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054D: ~~~~~~~~~~~~ CurrentValue = 2000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054E: ~~~~~~~~~~~~ CurrentValue = 3000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054F: ~~~~~~~~~~~~ CurrentValue = 4000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0550: ~~~~~~~~~~~~ CurrentValue = 5000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0551: ~~~~~~~~~~~~ CurrentValue = 6000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0552: ~~~~~~~~~~~~ CurrentValue = 7000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0553: ~~~~~~~~~~~~ CurrentValue = 8000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0554: ~~~~~~~~~~~~ CurrentValue = 9000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void BalineseToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x1B50: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B51: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B52: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B53: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B54: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B55: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B56: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B57: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B58: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B59: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void BengaliToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x09E6: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E7: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E8: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E9: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EA: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EB: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EC: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09ED: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EE: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EF: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void BurmeseToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x1040: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1041: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1042: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1043: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1044: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1045: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1046: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1047: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1048: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1049: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ /* ~~ * Replaces variant forms of Chinese numbers with their standard traditional counterparts. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Returns a newly allocated string, or a null pointer on failure of storage allocation. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *NormalizeChineseNumbers (UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *tmp; ~~~~~~~~~~~ UTF32 *n; ~~~~~~~~~ int len; ~~~~~~~~ int NewLen; ~~~~~~~~~~~ /* ~~ * It is safe to double the string length for temp space since no ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * substitution does more than replace one character with two. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ #ifdef ALLOCAOK ~~~~~~~~~~~~~~~ t = alloca (((2 * len) + 1) * sizeof (UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #else ~~~~~ t = malloc (((2 * len) + 1) * sizeof (UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ if (t == NULL) return (t); ~~~~~~~~~~~~~~~~~~~~~~~~~~ tmp = t; ~~~~~~~~ NewLen = len; ~~~~~~~~~~~~~ while( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x96F6: /* Traditional/Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0xF9B2: /* Compatibility */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ =0x3007; /* 0 - Ideographic zero - also used with Suzhou numerals*/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x58F1: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x58F9: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x580C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x4E48: /* Telephone number yao - traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5E7A: /* Telephone number yao - simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3021: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++=0x4E00; /* 1 */ ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x5F0D: /* Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5F10: /* Modern Japanese Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5169: /* liang traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8CAE: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8CB3: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8D30: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x4E24: /* liang simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3022: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0xF978: /* liang - compatibility */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E8C; /* 2 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x53C1: /* Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x53C2: /* Modern Japanese Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x53C3: /* Obsolete Japanese Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x53C4: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5F0E: /* Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3023: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E09; /* 3 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E96: /* Obsolete Japanese variant */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8086: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3024: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x56DB; /* 4 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4F0D: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3025: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E94; /* 5 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x9646: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x9678: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3026: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x516D; /* 6 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x67D2: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x6F06: /* Legal ??????*/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3027: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E03; /* 7 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x634C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3028: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x516B; /* 8 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x7396: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3029: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E5D; /* 9 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x3038: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x4EC0: /* Legal simplified - disfavored */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x62FE: /* Legal traditional*/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x5341; /* 10 */ ~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x5EFF: /* Portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3039: /* Suzhou portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E8C; ~~~~~~~~~~~~~~ *t++ = 0x5341; /* 20 */ ~~~~~~~~~~~~~~~~~~~~~~~~ NewLen++; ~~~~~~~~~ break; ~~~~~~ case 0x5345: /* Portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x303A: /* Suzhou portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E09; ~~~~~~~~~~~~~~ *t++ = 0x5341; /* 30 */ ~~~~~~~~~~~~~~~~~~~~~~~~ NewLen++; ~~~~~~~~~ break; ~~~~~~ case 0x534C: /* Portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x56DB; ~~~~~~~~~~~~~~ *t++ = 0x5341; /* 40 */ ~~~~~~~~~~~~~~~~~~~~~~~~ NewLen++; ~~~~~~~~~ break; ~~~~~~ case 0x4F70: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x964C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x767E; /* 100 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4EDF: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x9621: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x5343; /* 1000 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x842C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E07; /* 10,000 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4EBF: /* Simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x5104; /* 100,000,000 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ *t++ = c; ~~~~~~~~~ } ~ } ~ *t = 0x0000; ~~~~~~~~~~~~ n = malloc ( (NewLen+1) * sizeof(UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (n == NULL) return (n); ~~~~~~~~~~~~~~~~~~~~~~~~~~ ucscpy(n,tmp); ~~~~~~~~~~~~~~ #ifndef ALLOCAOK ~~~~~~~~~~~~~~~~ free( (void *) tmp); ~~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ return n; ~~~~~~~~~ } ~ /* ~~ * The Chinese functions expect standard Chinese numbers in traditional characters. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Simplified characters and variants such as Suzhou numbers can be handled ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * by first calling NormalizeChineseNumbers on the input. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static void ChinesePlace (mpz_t Result, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x3007: ~~~~~~~~~~~~ case 0x96F6: ~~~~~~~~~~~~ case 0x0030: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E00: ~~~~~~~~~~~~ case 0x0031: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E8C: ~~~~~~~~~~~~ case 0x0032: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E09: ~~~~~~~~~~~~ case 0x0033: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x56DB: ~~~~~~~~~~~~ case 0x0034: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E94: ~~~~~~~~~~~~ case 0x0035: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x516D: ~~~~~~~~~~~~ case 0x0036: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E03: ~~~~~~~~~~~~ case 0x0037: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x516B: ~~~~~~~~~~~~ case 0x0038: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E5D: ~~~~~~~~~~~~ case 0x0039: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result,Result,10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ return; ~~~~~~~ } ~ static UTF32 ChineseBarriers [] = { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x5341, /* 0 - 10^1 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ 0x767E, /* 1 - 10^2 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ 0x5343, /* 2 - 10^3 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ 0x4E07, /* 3 - 10^4 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ 0x5104, /* 4 - 10^8 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ 0x5146, /* 5 - 10^12 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x4EAC, /* 6 - 10^16 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x5793, /* 7 - 10^20 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x25771, /* 8 - 10^24 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x7A63, /* 9 - 10^28 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x6E9D, /* 10 - 10^32 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x6F97, /* 11 - 10^36 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x6B63, /* 12 - 10^40 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x8F09, /* 13 - 10^44 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x6975, /* 14 - 10^48 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ }; ~~ /* ~~ * We can't just initialize an array of these values since most ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * of them are too large to fit into an unsigned long int, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * some even an unsigned long long int. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static void GetChineseBarrierValue (mpz_t Result,int which) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (which) { ~~~~~~~~~~~~~~~~ case 0: ~~~~~~~ (void) mpz_set_str(Result,"10",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 1: ~~~~~~~ (void) mpz_set_str(Result,"100",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 2: ~~~~~~~ (void) mpz_set_str(Result,"1000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 3: ~~~~~~~ (void) mpz_set_str(Result,"10000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 4: ~~~~~~~ (void) mpz_set_str(Result,"100000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 5: ~~~~~~~ (void) mpz_set_str(Result,"1000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 6: ~~~~~~~ (void) mpz_set_str(Result,"10000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 7: ~~~~~~~ (void) mpz_set_str(Result,"100000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 8: ~~~~~~~ (void) mpz_set_str(Result,"1000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 9: ~~~~~~~ (void) mpz_set_str(Result,"10000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 10: ~~~~~~~~ (void) mpz_set_str(Result,"100000000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 11: ~~~~~~~~ (void) mpz_set_str(Result,"1000000000000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 12: ~~~~~~~~ (void) mpz_set_str(Result,"10000000000000000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 13: ~~~~~~~~ (void) mpz_set_str(Result,"100000000000000000000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 14: ~~~~~~~~ (void) mpz_set_str(Result,"1000000000000000000000000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ default: ~~~~~~~~ (void) mpz_set_str(Result,"0",10); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ } ~ static inline UTF32 *SeekChineseBarrier (UTF32 *s, int *ri) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *ptr; ~~~~~~~~~~~ int bi = (sizeof(ChineseBarriers)/sizeof(UTF32))-1; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ptr = NULL; ~~~~~~~~~~~ while (ptr == NULL && bi >= 0) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ptr = ucschr(s,ChineseBarriers[bi--]); ~~~~~~~~~~~~~~ uninum.c:1818:11: note: in expansion of macro 'ucschr' ptr = ucschr(s,ChineseBarriers[bi--]); ^~~~~~ In file included from uninum.c:53: /usr/include/wchar.h:167:10: note: expected 'const wchar_t *' {aka 'const int *'} but argument is of type 'long int *' wchar_t *wcschr(const wchar_t *, wchar_t) __pure; ^~~~~~ In file included from uninum.c:47: uninum.c: In function 'KharoshthiToInt_NAMPZ': uninum.c:38:26: warning: passing argument 1 of 'wcslen' from incompatible pointer type [-Wincompatible-pointer-types] #define ucslen(x) wcslen((signed long *) x) ^~~~~~~~~~~~~~~~~~ #define ucscpy(x,y) (UTF32 *)wcscpy((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucscat(x,y) (UTF32 *)wcscat((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucschr(x,y) (UTF32 *)wcschr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucsrchr(x,y) (UTF32 *)wcsrchr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define UNINUM ~~~~~~~~~~~~~~ #include "config.h" ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~ #include "unicode.h" ~~~~~~~~~~~~~~~~~~~~ #include "uninum.h" ~~~~~~~~~~~~~~~~~~~ #include "nsdefs.h" ~~~~~~~~~~~~~~~~~~~ #include "exitcode.h" ~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_LOCALE_H ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ int uninum_err; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 tcl_uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short uninum_ns_type; /* Exported for sanity-checking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Exported for parameter setting */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Input_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_General_Group_Size = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_First_Group_Size = 3; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 Uninum_Output_Group_Separator = 0x002C; /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Generate_Roman_With_Bar_P = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We're currently not dealing with non-integers - this is just forward-looking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static UTF32 Uninum_Output_Decimal_Separator = 0x002E; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* (10^97)-1, in hex for compactness and speed of conversion to binary */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MAXCHINESEHEX "4AE825771DC07672DDD0F8E8AC39250971AC4210CECB6F656CAEB9109FFFFFFFFFFFFFFFFFFFFFFFF" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_THOUSANDS_SIGN 0x0482 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_TITLO 0x0483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DECIMAL_MARKER 0xE06C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_MARKER 0xE06D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_LSD_MARKER 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DEC 0xE06A ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_EL 0xE06B ~~~~~~~~~~~~~~~~~~~~~~~~~~ char *uninum_version(void) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return(VERSION); ~~~~~~~~~~~~~~~~ } ~ #ifdef HAVE_LOCALECONV ~~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_SETLOCALE ~~~~~~~~~~~~~~~~~~~~~ void GetLocaleGroupInfo (){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct lconv *lcptr; ~~~~~~~~~~~~~~~~~~~~ setlocale(LC_NUMERIC,""); ~~~~~~~~~~~~~~~~~~~~~~~~~ lcptr = localeconv(); ~~~~~~~~~~~~~~~~~~~~~ if(lcptr == NULL) { ~~~~~~~~~~~~~~~~~~~ fprintf(stderr,"Attempt to obtain locale information was unsuccessful.\n"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ Uninum_Output_Group_Separator = (UTF16) (lcptr->thousands_sep[0]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Uninum_Output_First_Group_Size = lcptr->grouping[0]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(lcptr->grouping[1] != 0) Uninum_Output_General_Group_Size = lcptr->grouping[1]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Uninum_Output_General_Group_Size = Uninum_Output_First_Group_Size; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ #endif ~~~~~~ #endif ~~~~~~ /* Auxiliary functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long ipow(int base, int cnt) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ unsigned long Result; ~~~~~~~~~~~~~~~~~~~~~ i = 1; ~~~~~~ Result = 1; ~~~~~~~~~~~ while (i++ <= cnt) Result *= base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return Result; ~~~~~~~~~~~~~~ } ~ /* ~~ * Copy a string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static char *strpcpy(char *dest, const char *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *t; ~~~~~~~~ const char *s; ~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0) { ~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0; ~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Case-insenstive ascii string comparison. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Emulates BSD 4.4 function emulated by GNU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static int mystrcasecmp(char *a, char *b) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char ac; ~~~~~~~~ char bc; ~~~~~~~~ while(*a != '\0') { ~~~~~~~~~~~~~~~~~~~ ac = tolower(*a++); ~~~~~~~~~~~~~~~~~~~ bc = tolower(*b++); ~~~~~~~~~~~~~~~~~~~ if(ac < bc) return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~ if(ac > bc) return (1); ~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(*b != '\0') return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (0); ~~~~~~~~~~~ } ~ /* ~~ * Copy a wide string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ * This emulates the GNU extension wcpcpy(). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *ucpcpy(UTF32 *dest, const UTF32 *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ const UTF32 *s; ~~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Reverse a wide string in place. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *wcsrev(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *q; ~~~~~~~~~ UTF32 *h; ~~~~~~~~~ UTF32 t; ~~~~~~~~ p = s; ~~~~~~ q = s + ucslen(s)-1; ~~~~~~~~~~~~~~~~~~~~ h = s + (ucslen(s)/2); ~~~~~~~~~~~~~~~~~~~~~~ while (q >= h) { ~~~~~~~~~~~~~~~~ t = *p; ~~~~~~~ *p++ = *q; ~~~~~~~~~~ *q-- = t; ~~~~~~~~~ } ~ return(s); ~~~~~~~~~~ } ~ /* ~~ * Prepend a character to a string, returning new storage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * and freeing the old. ~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *Prepend(UTF32 *s, UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ new = malloc(sizeof(UTF32) * (len + 2)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new) { ~~~~~~~~~ new[0] = c; ~~~~~~~~~~~ new[1] = 0x0000; ~~~~~~~~~~~~~~~~ ucscpy(new+1,s); ~~~~~~~~~~~~~~~~ } ~ free(s); ~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ /* Remove "thousands separator"s */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *wcStripSeparators(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *o; ~~~~~~~~~ UTF32 c; ~~~~~~~~ o = t = s; ~~~~~~~~~~ while ((c = *s++) != 0x0000){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch(c) { ~~~~~~~~~~~ case 0x0020: /* Space */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x0027: /* Apostrophe */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002C: /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002E: /* Period */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x066C: /* Arabic thousands separator */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x1361: /* Ethiopic wordspace */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3000: /* Ideographic space */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We can't add the Braille comma U+2802 here because Russian Braille uses ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ the same character for the digit "1" */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ *t++ = c; ~~~~~~~~~ } ~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return o; ~~~~~~~~~ } ~ /* ~~ * It is the caller's responsability to free the original storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ UTF32 *wcDelimitNumber( ~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *number, ~~~~~~~~~~~~~~ UTF16 gs, /* Group separator character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 ds, /* Decimal point character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GroupSize, /* Number of digits in groups in general */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int FirstGroupSize /* Number of digits in low-order group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ) ~ { ~ int New_Size; /* Characters needed for delimited string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int length; /* Length of input string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int commas; /* Number of delimiters to insert */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Comma_Cnt; /* Number of delimiters inserted so far */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int digits; /* Number of digits preceding decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int cnt; /* Number of digits processed */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ UTF32 *new; /* String in which to write delimited number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *point; /* Location of decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *pos; /* Current position in original number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *npos; /* Current position in new number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *Non_Space_Number; /* Location of first non-space character in number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Sanity check */ ~~~~~~~~~~~~~~~~~~ if( (GroupSize < 2) || (FirstGroupSize < 2)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 0; ~~~~~~~~~~~ goto newmem; ~~~~~~~~~~~~ } ~ length = ucslen(number); ~~~~~~~~~~~~~~~~~~~~~~~~ point = ucsrchr(number,(UTF32) '.'); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(point == NULL) point = number+(length-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else point-=1; /* Point now points at last digit preceding decimal/end */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Non_Space_Number = ucsrchr(number,0x0020); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(Non_Space_Number == NULL) Non_Space_Number = number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Non_Space_Number+=1; ~~~~~~~~~~~~~~~~~~~~~~~~~ digits = 1+point - Non_Space_Number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(digits > FirstGroupSize) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 1 + ((digits-FirstGroupSize-1)/GroupSize); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ else commas = 0; ~~~~~~~~~~~~~~~~ newmem: ~~~~~~~ New_Size = length + commas; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ new = (UTF32 *) malloc((New_Size + 1) * sizeof(UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new){ ~~~~~~~~ if (commas == 0) return ucscpy(new,number); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* First copy right hand part of number, up to and including decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pos = number+length; ~~~~~~~~~~~~~~~~~~~~ npos = new+New_Size; ~~~~~~~~~~~~~~~~~~~~ for(; pos > point;) *npos-- = *pos--; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Now copy lefthand part, inserting delimiters as we go */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Comma_Cnt = cnt = 0; ~~~~~~~~~~~~~~~~~~~~ if(FirstGroupSize != GroupSize) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ for (i = 0; i < FirstGroupSize; i++) *npos-- = *pos--; /* Copy low group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *npos-- = (UTF32) gs; ~~~~~~~~~~~~~~~~~~~~~ *npos-- = *pos--; /* Low digit of second group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Comma_Cnt = cnt = 1; ~~~~~~~~~~~~~~~~~~~~ } ~ while(pos >= Non_Space_Number){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *npos-- = *pos--; ~~~~~~~~~~~~~~~~~ if( (++cnt % GroupSize == 0) && (Comma_Cnt++ < commas )) *npos-- = (UTF32) gs; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ while(pos >= number) *npos-- = *pos--; /* Copy leading spaces, if any */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ } ~ /* ~~ * Returns a null-terminated wide string containing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * the specified character. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *MakeSingleDigitString(UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ new = malloc(sizeof(UTF32) * 2); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) { ~~~~~~~~~~ uninum_err = NS_ERROR_OUTOFMEMORY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NULL; ~~~~~~~~~~~~ } ~ new[0] = c; ~~~~~~~~~~~ new[1] = 0L; ~~~~~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ struct ns {char *s; int c; short type;}; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static struct ns NumberSystemList[] = { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Aegean",NS_AEGEAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "All",NS_ALL,NS_TYPE_SPECIAL, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Any",NS_ANY,NS_TYPE_SPECIAL, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Alphabetic",NS_ARABIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Persian",NS_PERSO_ARABIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Western",NS_ARABIC_WESTERN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Armenian",NS_ARMENIAN_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Balinese",NS_BALINESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Bengali",NS_BENGALI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Burmese",NS_BURMESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese",NS_CHINESE_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Early",NS_CHINESE_COUNTING_ROD_EARLY_WITH_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Late",NS_CHINESE_COUNTING_ROD_LATE_WITH_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Early_No_Zero",NS_CHINESE_COUNTING_ROD_EARLY_WITHOUT_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Late_No_Zero",NS_CHINESE_COUNTING_ROD_LATE_WITHOUT_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Legal_Simplified",NS_CHINESE_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Legal_Traditional",NS_CHINESE_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Simplified",NS_CHINESE_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Traditional",NS_CHINESE_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Place",NS_CHINESE_REGULAR_PLACE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Common_Braille",NS_COMMON_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Counting_Rod",NS_CHINESE_COUNTING_ROD_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Cyrillic",NS_CYRILLIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Devanagari",NS_DEVANAGARI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Egyptian",NS_EGYPTIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ethiopic",NS_ETHIOPIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ewellic_Decimal",NS_EWELLIC_DECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ewellic_Hexadecimal",NS_EWELLIC_HEX,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "French_Braille",NS_FRENCH_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Glagolitic",NS_GLAGOLITIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek",NS_GREEK_ALPHABETIC_UPPER,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek_Lower",NS_GREEK_ALPHABETIC_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek_Upper",NS_GREEK_ALPHABETIC_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Gujarati",NS_GUJARATI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Gurmukhi",NS_GURMUKHI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew",NS_HEBREW_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew_Early",NS_HEBREW_EARLY,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew_Late",NS_HEBREW_LATE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal",NS_HEX,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal_Lower",NS_HEX_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal_Upper",NS_HEX_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Regular_Simplified",NS_CHINESE_JAPANESE_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Regular_Traditional",NS_CHINESE_JAPANESE_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Legal_Simplified",NS_CHINESE_JAPANESE_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Legal_Traditional",NS_CHINESE_JAPANESE_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Western_Mixed",NS_CHINESE_JAPANESE_WESTERN_MIX,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kannada",NS_KANNADA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kayah_Li", NS_KAYAH_LI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kharoshthi",NS_KHAROSHTHI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Khmer",NS_KHMER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Klingon",NS_KLINGON,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Lao",NS_LAO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Lepcha",NS_LEPCHA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Limbu",NS_LIMBU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Malayalam",NS_MALAYALAM,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Legal_Simplified",NS_CHINESE_MANDARIN_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Legal_Traditional",NS_CHINESE_MANDARIN_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Regular_Simplified",NS_CHINESE_MANDARIN_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Regular_Traditional",NS_CHINESE_MANDARIN_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mongolian",NS_MONGOLIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mxedruli",NS_MXEDRULI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "New_Tai_Lue",NS_NEW_TAI_LUE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Nko",NS_NKO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ol_Chiki",NS_OL_CHIKI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Old_Italic",NS_OLD_ITALIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Old_Persian",NS_OLD_PERSIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Oriya",NS_ORIYA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Osmanya",NS_OSMANYA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Phoenician",NS_PHOENICIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman",NS_ROMAN_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman_Lower",NS_ROMAN_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman_Upper",NS_ROMAN_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Russian_Braille",NS_RUSSIAN_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Saurashtra",NS_SAURASHTRA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Shan",NS_SHAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Sinhala",NS_SINHALA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Sundanese",NS_SUNDANESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Suzhou",NS_CHINESE_SUZHOU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil",NS_TAMIL_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil_Place",NS_TAMIL_PLACE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil_Traditional",NS_TAMIL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Telugu",NS_TELUGU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tengwar_Decimal",NS_TENGWAR_DECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tengwar_Duodecimal",NS_TENGWAR_DUODECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Thai",NS_THAI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tibetan",NS_TIBETAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Vai",NS_VAI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Verdurian",NS_VERDURIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western",NS_WESTERN_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western_Lower",NS_WESTERN_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western_Upper",NS_WESTERN_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Xucuri_Lower",NS_XUCURI_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Xucuri_Upper",NS_XUCURI_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Unknown",NS_UNKNOWN,NS_TYPE_GUESS, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "All_Zero",NS_ALLZERO,NS_TYPE_GUESS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ }; ~~ /* ~~ * Generate the list of available writing systems, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * returning the next string on each call unless ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * the flag is 0, which resets to the start of the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * sequence. ~~~~~~~~~~~ * ~ * which = 0 -> list specific names usable in both directions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * which = 1 -> list cover terms suitable only for conversion of string to int ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ char *ListNumberSystems (int flag, int which) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static int i = 0; ~~~~~~~~~~~~~~~~~ if(flag == 0) i = 0; /* reset */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ top: if (i < (sizeof(NumberSystemList)/sizeof(struct ns))) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (NumberSystemList[i].type == (which? 2:1)) return NumberSystemList[i++].s; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else { ~~~~~~ i++; ~~~~ goto top; ~~~~~~~~~ } ~ } ~ i = 0; ~~~~~~ return NULL; ~~~~~~~~~~~~ } ~ /* ~~ * We just use linear search for the time being. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Could switch to binary search for greater speed. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ int StringToNumberSystem (char *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ for (i=0; i < (sizeof(NumberSystemList)/sizeof(struct ns)); i++) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (mystrcasecmp(s,NumberSystemList[i].s) == 0){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_ns_type = NumberSystemList[i].type; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (NumberSystemList[i].c); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ } ~ return NS_UNKNOWN; ~~~~~~~~~~~~~~~~~~ } ~ /* ~~ * We just use linear search for the time being. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Could switch to binary search for greater speed. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ char *NumberSystemToString (int ns) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ for (i=0; i < (sizeof(NumberSystemList)/sizeof(struct ns)); i++) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (NumberSystemList[i].c == ns) return NumberSystemList[i].s; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ return NULL; ~~~~~~~~~~~~ } ~ /* ~~ * Return the maximum value expressible in the specified number system. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * as a decimal ascii string, or if there is no limit, "unlimited". ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ #define AEGEAN_LIMIT 99999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_LIMIT 1999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EGYPTIAN_LIMIT 9999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_LIMIT 999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_LIMIT 10000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ROMAN_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_LIMIT 999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LIMIT 10000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *UninumStringMaximumValue(int ns) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *new; ~~~~~~~~~~ mpz_t MaxChinese; ~~~~~~~~~~~~~~~~~ mpz_t Limit; ~~~~~~~~~~~~ mpz_init(Limit); ~~~~~~~~~~~~~~~~ switch(ns) { ~~~~~~~~~~~~ case NS_CHINESE_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_WESTERN_MIX: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init_set_str(MaxChinese,MAXCHINESEHEX,16); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ new = malloc((mpz_sizeinbase(MaxChinese,10) + 1) * sizeof(char)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (void) mpz_get_str(new,10,MaxChinese); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(MaxChinese); ~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ case NS_AEGEAN: ~~~~~~~~~~~~~~~ mpz_set_ui(Limit,AEGEAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ARABIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ARABIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ARMENIAN_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ARMENIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_CYRILLIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,CYRILLIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_EGYPTIAN: ~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,EGYPTIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_GLAGOLITIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,GLAGOLITIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_GREEK_ALPHABETIC_UPPER: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_GREEK_ALPHABETIC_LOWER: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,GREEK_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_HEBREW_EARLY: ~~~~~~~~~~~~~~~~~~~~~ case NS_HEBREW_LATE: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,HEBREW_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_KHAROSHTHI: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,KHAROSHTHI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_MXEDRULI: ~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,MXEDRULI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_OLD_ITALIC: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,OLD_ITALIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_OLD_PERSIAN: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,OLD_PERSIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_PHOENICIAN: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,PHOENICIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ROMAN_UPPER: ~~~~~~~~~~~~~~~~~~~~ case NS_ROMAN_LOWER: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ROMAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_SINHALA: ~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,SINHALA_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_TAMIL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,TAMIL_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_XUCURI_LOWER: ~~~~~~~~~~~~~~~~~~~~~ case NS_XUCURI_UPPER: ~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,XUCURI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ new = malloc (sizeof(char) * (1 + strlen("unlimited"))); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sprintf(new,"%s","unlimited"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ new = malloc((mpz_sizeinbase(Limit,10) + 1) * sizeof(char)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (void) mpz_get_str(new,10,Limit); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Limit); ~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ #define AEGEAN_BEGIN 0x10107 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define AEGEAN_END 0x10133 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_BEGIN 0x0660 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_END 0x066C ~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_ALPHABETIC_BEGIN 0x0627 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_ALPHABETIC_END 0x064A ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PERSO_ARABIC_BEGIN 0x06F0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PERSO_ARABIC_END 0x06F9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_ALPHABETIC_UPPER_BEGIN 0x0531 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_ALPHABETIC_UPPER_END 0x554 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BALINESE_BEGIN 0x1B50 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BALINESE_END 0x1B59 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BENGALI_BEGIN 0x09E6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BENGALI_END 0x09EF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BURMESE_BEGIN 0x1040 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BURMESE_END 0x1049 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_COUNTING_ROD_BEGIN 0x1D360 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_COUNTING_ROD_END 0x1D371 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_A_BEGIN 0x4E00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_A_END 0x9FBB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_B_BEGIN 0x20000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_B_END 0x2A6D6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_ALPHABETIC_UPPER_BEGIN 0x0400 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_ALPHABETIC_UPPER_END 0x04FF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define DEVANAGARI_BEGIN 0x0966 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define DEVANAGARI_END 0x096F ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define COMMON_BRAILLE_BEGIN 0x2801 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define COMMON_BRAILLE_END 0x281B ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ETHIOPIC_BEGIN 0x1369 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ETHIOPIC_END 0x137C ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_BEGIN 0xE6C0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_DECIMAL_END 0xE6C9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_END 0xE6CF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_ALPHABETIC_BEGIN 0x2C00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_ALPHABETIC_END 0x2C1E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_BEGIN 0x03B1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_END 0x03C9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_BEGIN 0x0391 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_END 0x03A9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_DIGAMMA 0x03DD ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_DIGAMMA 0x03DC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_KOPPA 0x03DF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_KOPPA 0x03DE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_SAN 0x03FB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_SAN 0x03FA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_STIGMA 0x03DB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_STIGMA 0x03DA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_RIGHT_KERAIA 0x0374 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LEFT_KERAIA 0x0375 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GUJARATI_BEGIN 0x0AE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GUJARATI_END 0x0AEF ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GURMUKHI_BEGIN 0x0A66 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GURMUKHI_END 0x0A6F ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_BEGIN 0x0590 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_END 0x05FF ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KAYAH_LI_BEGIN 0xA900 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KAYAH_LI_END 0xA909 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KANNADA_BEGIN 0x0CE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KANNADA_END 0x0CEF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_BEGIN 0x10A40 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_END 0x10A47 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHMER_BEGIN 0x17E0 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHMER_END 0x17E9 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KLINGON_BEGIN 0xF8F0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KLINGON_END 0xF8F9 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LAO_BEGIN 0x0ED0 ~~~~~~~~~~~~~~~~~~~~~~~~ #define LAO_END 0x0ED9 ~~~~~~~~~~~~~~~~~~~~~~ #define LEPCHA_BEGIN 0x1C40 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LEPCHA_END 0x1C49 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define LIMBU_BEGIN 0x1946 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LIMBU_END 0x194F ~~~~~~~~~~~~~~~~~~~~~~~~ #define MALAYALAM_BEGIN 0x0D00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MALAYALAM_END 0x0D7F ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MONGOLIAN_BEGIN 0x1810 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MONGOLIAN_END 0x1819 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_BEGIN 0x10D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_END 0x10F5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NEW_TAI_LUE_BEGIN 0x19D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NEW_TAI_LUE_END 0x19D9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NKO_BEGIN 0x07C0 ~~~~~~~~~~~~~~~~~~~~~~~~ #define NKO_END 0x07C9 ~~~~~~~~~~~~~~~~~~~~~~ #define OL_CHIKI_BEGIN 0x1C50 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OL_CHIKI_END 0x1C59 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_BEGIN 0x10320 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_END 0x10323 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_BEGIN 0x103D1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_END 0x103D5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ORIYA_BEGIN 0x0B66 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ORIYA_END 0x0B6F ~~~~~~~~~~~~~~~~~~~~~~~~ #define OSMANYA_BEGIN 0x104A0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OSMANYA_END 0x104A9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_BEGIN 0x10916 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_END 0x10919 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SAURASHTRA_BEGIN 0xA8D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SAURASHTRA_END 0xA8D9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SHAN_BEGIN 0x1090 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define SHAN_END 0x1099 ~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_BEGIN 0x0DE7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_END 0x0DFA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUNDANESE_BEGIN 0x1BB0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUNDANESE_END 0x1BB9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUZHOU_BEGIN 0x3021 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUZHOU_END 0x3029 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_BEGIN 0x0BE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_END 0x0BF2 ~~~~~~~~~~~~~~~~~~~~~~~~ #define TELUGU_BEGIN 0x0C66 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TELUGU_END 0x0C6F ~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_BEGIN 0xE030 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_END 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define THAI_BEGIN 0x0E50 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define THAI_END 0x0E59 ~~~~~~~~~~~~~~~~~~~~~~~ #define TIBETAN_BEGIN 0x0F20 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TIBETAN_END 0x0F29 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define VAI_BEGIN 0xA620 ~~~~~~~~~~~~~~~~~~~~~~~~ #define VAI_END 0xA629 ~~~~~~~~~~~~~~~~~~~~~~ #define VERDURIAN_BEGIN 0xE260 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define VERDURIAN_END 0xE26B ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LOWER_BEGIN 0x2D00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LOWER_END 0x2D25 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_UPPER_BEGIN 0x10A0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_UPPER_END 0x10C5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GuessNumberSystem(UTF32 *str){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ UTF32 *s; ~~~~~~~~~ int WesternCnt = 0; ~~~~~~~~~~~~~~~~~~~ int ZeroCnt = 0; ~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ short FirstIsGraveP = 0; ~~~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (!str) return (NS_UNKNOWN); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ len = ucslen(str); ~~~~~~~~~~~~~~~~~~ s = str; ~~~~~~~~ if((c = *s) == 0x0060) FirstIsGraveP = 1; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ while((c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= AEGEAN_BEGIN) && (c <= AEGEAN_END)) return NS_AEGEAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ARABIC_BEGIN) && (c <= ARABIC_END)) return NS_ARABIC_WESTERN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ARABIC_ALPHABETIC_BEGIN) && ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c <= ARABIC_ALPHABETIC_END)) return NS_ARABIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= PERSO_ARABIC_BEGIN) && ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c <= PERSO_ARABIC_END)) return NS_PERSO_ARABIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= ARMENIAN_ALPHABETIC_UPPER_BEGIN) && (c <= ARMENIAN_ALPHABETIC_UPPER_END))) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NS_ARMENIAN_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= BALINESE_BEGIN) && (c <= BALINESE_END)) return NS_BALINESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= BENGALI_BEGIN) && (c <= BENGALI_END)) return NS_BENGALI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= BURMESE_BEGIN) && (c <= BURMESE_END)) return NS_BURMESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= CHINESE_COUNTING_ROD_BEGIN) && (c <= CHINESE_COUNTING_ROD_END)) return NS_CHINESE_COUNTING_ROD_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ( ((c >= CHINESE_A_BEGIN) && (c <= CHINESE_A_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ((c >= CHINESE_B_BEGIN) && (c <= CHINESE_B_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ( (c >= SUZHOU_BEGIN) && (c <= SUZHOU_END)) ) return NS_CHINESE_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= CYRILLIC_ALPHABETIC_UPPER_BEGIN) && (c <= CYRILLIC_ALPHABETIC_UPPER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == CYRILLIC_THOUSANDS_SIGN) || (c == CYRILLIC_TITLO)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NS_CYRILLIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= DEVANAGARI_BEGIN) && (c <= DEVANAGARI_END)) return NS_DEVANAGARI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= 0x14000) && (c <= 0x143D7)) return NS_EGYPTIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ETHIOPIC_BEGIN) && (c <= ETHIOPIC_END)) return NS_ETHIOPIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c > EWELLIC_DECIMAL_END) && (c <= EWELLIC_END)) return NS_EWELLIC_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= EWELLIC_BEGIN) && (c <= EWELLIC_DECIMAL_END)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(FirstIsGraveP) return NS_EWELLIC_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else return NS_EWELLIC_DECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= GLAGOLITIC_ALPHABETIC_BEGIN) && (c <= GLAGOLITIC_ALPHABETIC_END)) return NS_GLAGOLITIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= GREEK_ALPHABETIC_LOWER_BEGIN) && (c <= GREEK_ALPHABETIC_LOWER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_DIGAMMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_KOPPA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_STIGMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_SAN)) return NS_GREEK_ALPHABETIC_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= GREEK_ALPHABETIC_UPPER_BEGIN) && (c <= GREEK_ALPHABETIC_UPPER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_DIGAMMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_KOPPA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_STIGMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_SAN)) return NS_GREEK_ALPHABETIC_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= GUJARATI_BEGIN) && (c <= GUJARATI_END)) return NS_GUJARATI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= GURMUKHI_BEGIN) && (c <= GURMUKHI_END)) return NS_GURMUKHI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= HEBREW_BEGIN) && (c <= HEBREW_END)) return NS_HEBREW_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KANNADA_BEGIN) && (c <= KANNADA_END)) return NS_KANNADA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KAYAH_LI_BEGIN) && (c <= KAYAH_LI_END)) return NS_KAYAH_LI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KHAROSHTHI_BEGIN) && (c <= KHAROSHTHI_END)) return NS_KHAROSHTHI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KHMER_BEGIN) && (c <= KHMER_END)) return NS_KHMER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KLINGON_BEGIN) && (c <= KLINGON_END)) return NS_KLINGON; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LAO_BEGIN) && (c <= LAO_END)) return NS_LAO; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LEPCHA_BEGIN) && (c <= LEPCHA_END)) return NS_LEPCHA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LIMBU_BEGIN) && (c <= LIMBU_END)) return NS_LIMBU; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MALAYALAM_BEGIN) && (c <= MALAYALAM_END)) return NS_MALAYALAM; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MONGOLIAN_BEGIN) && (c <= MONGOLIAN_END)) return NS_MONGOLIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MXEDRULI_BEGIN) && (c <= MXEDRULI_END)) return NS_MXEDRULI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= NEW_TAI_LUE_BEGIN) && (c <= NEW_TAI_LUE_END)) return NS_NEW_TAI_LUE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= NKO_BEGIN) && (c <= NKO_END)) return NS_NKO; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OL_CHIKI_BEGIN) && (c <= OL_CHIKI_END)) return NS_OL_CHIKI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OLD_ITALIC_BEGIN) && (c <= OLD_ITALIC_END)) return NS_OLD_ITALIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OLD_PERSIAN_BEGIN) && (c <= OLD_PERSIAN_END)) return NS_OLD_PERSIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ORIYA_BEGIN) && (c <= ORIYA_END)) return NS_ORIYA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OSMANYA_BEGIN) && (c <= OSMANYA_END)) return NS_OSMANYA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= PHOENICIAN_BEGIN) && (c <= PHOENICIAN_END)) return NS_PHOENICIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SAURASHTRA_BEGIN) && (c <= SAURASHTRA_END)) return NS_SAURASHTRA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SHAN_BEGIN) && (c <= SHAN_END)) return NS_SHAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SUNDANESE_BEGIN) && (c <= SUNDANESE_END)) return NS_SUNDANESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TAMIL_BEGIN) && (c <= TAMIL_END)) return NS_TAMIL_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TELUGU_BEGIN) && (c <= TELUGU_END)) return NS_TELUGU; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DECIMAL_MARKER) return NS_TENGWAR_DECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DUODECIMAL_MARKER) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DUODECIMAL_LSD_MARKER) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if( (c == TENGWAR_DEC) || (c == TENGWAR_EL)) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= THAI_BEGIN) && (c <= THAI_END)) return NS_THAI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TIBETAN_BEGIN) && (c <= TIBETAN_END)) return NS_TIBETAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= VAI_BEGIN) && (c <= VAI_END)) return NS_VAI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= VERDURIAN_BEGIN) && (c <= VERDURIAN_END)) return NS_VERDURIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= XUCURI_LOWER_BEGIN) && (c <= XUCURI_LOWER_END)) return NS_XUCURI_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= XUCURI_UPPER_BEGIN) && (c <= XUCURI_UPPER_END)) return NS_XUCURI_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x0059) || (c == 0x0079)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (ZeroCnt && (s-1 == str+1)) return NS_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c == 0x0049) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x0056) || ~~~~~~~~~~~~~~~~ (c == 0x0058) || ~~~~~~~~~~~~~~~~ (c == 0x004C) || ~~~~~~~~~~~~~~~~ (c == 0x0043) || ~~~~~~~~~~~~~~~~ (c == 0x0044) || ~~~~~~~~~~~~~~~~ (c == 0x004D) || ~~~~~~~~~~~~~~~~ (c == 0x2183) || ~~~~~~~~~~~~~~~~ ( (c >= 0x2160) && (c <= 0x216F))) return NS_ROMAN_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x0069) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x0076) || ~~~~~~~~~~~~~~~~ (c == 0x0078) || ~~~~~~~~~~~~~~~~ (c == 0x006C) || ~~~~~~~~~~~~~~~~ (c == 0x0063) || ~~~~~~~~~~~~~~~~ (c == 0x0064) || ~~~~~~~~~~~~~~~~ (c == 0x006D) || ~~~~~~~~~~~~~~~~ (c == 0x2184) || ~~~~~~~~~~~~~~~~ ( (c >= 0x2170) && (c <= 0x217F))) return NS_ROMAN_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x281A) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2801) || ~~~~~~~~~~~~~~~~ (c == 0x2803) || ~~~~~~~~~~~~~~~~ (c == 0x2809) || ~~~~~~~~~~~~~~~~ (c == 0x2819) || ~~~~~~~~~~~~~~~~ (c == 0x2811) || ~~~~~~~~~~~~~~~~ (c == 0x280B) || ~~~~~~~~~~~~~~~~ (c == 0x281B) || ~~~~~~~~~~~~~~~~ (c == 0x2813) || ~~~~~~~~~~~~~~~~ (c == 0x280A)) return NS_COMMON_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x283C) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2821) || ~~~~~~~~~~~~~~~~ (c == 0x2823) || ~~~~~~~~~~~~~~~~ (c == 0x2829) || ~~~~~~~~~~~~~~~~ (c == 0x2839) || ~~~~~~~~~~~~~~~~ (c == 0x2831) || ~~~~~~~~~~~~~~~~ (c == 0x282B) || ~~~~~~~~~~~~~~~~ (c == 0x283B) || ~~~~~~~~~~~~~~~~ (c == 0x2833) || ~~~~~~~~~~~~~~~~ (c == 0x282A)) return NS_FRENCH_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x2834) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2802) || ~~~~~~~~~~~~~~~~ (c == 0x2806) || ~~~~~~~~~~~~~~~~ (c == 0x2812) || ~~~~~~~~~~~~~~~~ (c == 0x2832) || ~~~~~~~~~~~~~~~~ (c == 0x2822) || ~~~~~~~~~~~~~~~~ (c == 0x2816) || ~~~~~~~~~~~~~~~~ (c == 0x2836) || ~~~~~~~~~~~~~~~~ (c == 0x2826) || ~~~~~~~~~~~~~~~~ (c == 0x2814)) return NS_RUSSIAN_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= 0x31 ) && (c <= 0x39)) || ((c >= 0xFF10) && (c <= 0xFF19))) {WesternCnt++;continue;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (c == 0x0030) {ZeroCnt++;WesternCnt++;continue;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(ZeroCnt == len) return (NS_ALLZERO); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(WesternCnt == len) return(NS_WESTERN_GENERIC); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (NS_UNKNOWN); ~~~~~~~~~~~~~~~~~~~~ } ~ /* String to Integer conversion functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static void ArabicToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ char *rs; ~~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0660: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0661: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0662: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0663: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0664: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0665: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0666: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0667: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0668: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0669: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void ArabicExtendedToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x06F0: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F1: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F2: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F3: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F4: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F5: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F6: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F7: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F8: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F9: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void ArabicAlphabeticToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0627: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0628: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062C: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062F: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0647: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0648: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0632: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062D: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0637: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x064A: ~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0643: ~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0644: ~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0645: ~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0646: ~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0633: ~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0639: ~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0641: ~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0635: ~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0642: ~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0631: ~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0634: ~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062A: ~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062B: ~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062E: ~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0630: ~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0636: ~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0638: ~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x063A: ~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void AegeanToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x10107: ~~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10108: ~~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10109: ~~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010A: ~~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010B: ~~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010C: ~~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010D: ~~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010E: ~~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010F: ~~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10110: ~~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10111: ~~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10112: ~~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10113: ~~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10114: ~~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10115: ~~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10116: ~~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10117: ~~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10118: ~~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10119: ~~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011A: ~~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011B: ~~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011C: ~~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011D: ~~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011E: ~~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011F: ~~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10120: ~~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10121: ~~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10122: ~~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10123: ~~~~~~~~~~~~~ CurrentValue = 2000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10124: ~~~~~~~~~~~~~ CurrentValue = 3000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10125: ~~~~~~~~~~~~~ CurrentValue = 4000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10126: ~~~~~~~~~~~~~ CurrentValue = 5000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10127: ~~~~~~~~~~~~~ CurrentValue = 6000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10128: ~~~~~~~~~~~~~ CurrentValue = 7000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10129: ~~~~~~~~~~~~~ CurrentValue = 8000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012A: ~~~~~~~~~~~~~ CurrentValue = 9000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012B: ~~~~~~~~~~~~~ CurrentValue = 10000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012C: ~~~~~~~~~~~~~ CurrentValue = 20000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012D: ~~~~~~~~~~~~~ CurrentValue = 30000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012E: ~~~~~~~~~~~~~ CurrentValue = 40000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012F: ~~~~~~~~~~~~~ CurrentValue = 50000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10130: ~~~~~~~~~~~~~ CurrentValue = 60000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10131: ~~~~~~~~~~~~~ CurrentValue = 70000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10132: ~~~~~~~~~~~~~ CurrentValue = 80000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10133: ~~~~~~~~~~~~~ CurrentValue = 90000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void ArmenianAlphabeticToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0531: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0532: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0533: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0534: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0535: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0536: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0537: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0538: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0539: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053A: ~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053B: ~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053C: ~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053D: ~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053E: ~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053F: ~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0540: ~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0541: ~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0542: ~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0543: ~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0544: ~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0545: ~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0546: ~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0547: ~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0548: ~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0549: ~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054A: ~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054B: ~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054C: ~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054D: ~~~~~~~~~~~~ CurrentValue = 2000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054E: ~~~~~~~~~~~~ CurrentValue = 3000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054F: ~~~~~~~~~~~~ CurrentValue = 4000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0550: ~~~~~~~~~~~~ CurrentValue = 5000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0551: ~~~~~~~~~~~~ CurrentValue = 6000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0552: ~~~~~~~~~~~~ CurrentValue = 7000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0553: ~~~~~~~~~~~~ CurrentValue = 8000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0554: ~~~~~~~~~~~~ CurrentValue = 9000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void BalineseToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x1B50: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B51: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B52: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B53: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B54: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B55: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B56: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B57: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B58: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B59: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void BengaliToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x09E6: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E7: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E8: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E9: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EA: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EB: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EC: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09ED: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EE: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EF: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void BurmeseToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x1040: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1041: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1042: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1043: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1044: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1045: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1046: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1047: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1048: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1049: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ /* ~~ * Replaces variant forms of Chinese numbers with their standard traditional counterparts. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Returns a newly allocated string, or a null pointer on failure of storage allocation. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *NormalizeChineseNumbers (UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *tmp; ~~~~~~~~~~~ UTF32 *n; ~~~~~~~~~ int len; ~~~~~~~~ int NewLen; ~~~~~~~~~~~ /* ~~ * It is safe to double the string length for temp space since no ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * substitution does more than replace one character with two. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ #ifdef ALLOCAOK ~~~~~~~~~~~~~~~ t = alloca (((2 * len) + 1) * sizeof (UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #else ~~~~~ t = malloc (((2 * len) + 1) * sizeof (UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ if (t == NULL) return (t); ~~~~~~~~~~~~~~~~~~~~~~~~~~ tmp = t; ~~~~~~~~ NewLen = len; ~~~~~~~~~~~~~ while( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x96F6: /* Traditional/Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0xF9B2: /* Compatibility */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ =0x3007; /* 0 - Ideographic zero - also used with Suzhou numerals*/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x58F1: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x58F9: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x580C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x4E48: /* Telephone number yao - traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5E7A: /* Telephone number yao - simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3021: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++=0x4E00; /* 1 */ ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x5F0D: /* Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5F10: /* Modern Japanese Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5169: /* liang traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8CAE: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8CB3: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8D30: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x4E24: /* liang simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3022: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0xF978: /* liang - compatibility */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E8C; /* 2 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x53C1: /* Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x53C2: /* Modern Japanese Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x53C3: /* Obsolete Japanese Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x53C4: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5F0E: /* Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3023: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E09; /* 3 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E96: /* Obsolete Japanese variant */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8086: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3024: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x56DB; /* 4 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4F0D: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3025: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E94; /* 5 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x9646: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x9678: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3026: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x516D; /* 6 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x67D2: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x6F06: /* Legal ??????*/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3027: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E03; /* 7 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x634C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3028: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x516B; /* 8 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x7396: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3029: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E5D; /* 9 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x3038: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x4EC0: /* Legal simplified - disfavored */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x62FE: /* Legal traditional*/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x5341; /* 10 */ ~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x5EFF: /* Portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3039: /* Suzhou portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E8C; ~~~~~~~~~~~~~~ *t++ = 0x5341; /* 20 */ ~~~~~~~~~~~~~~~~~~~~~~~~ NewLen++; ~~~~~~~~~ break; ~~~~~~ case 0x5345: /* Portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x303A: /* Suzhou portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E09; ~~~~~~~~~~~~~~ *t++ = 0x5341; /* 30 */ ~~~~~~~~~~~~~~~~~~~~~~~~ NewLen++; ~~~~~~~~~ break; ~~~~~~ case 0x534C: /* Portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x56DB; ~~~~~~~~~~~~~~ *t++ = 0x5341; /* 40 */ ~~~~~~~~~~~~~~~~~~~~~~~~ NewLen++; ~~~~~~~~~ break; ~~~~~~ case 0x4F70: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x964C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x767E; /* 100 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4EDF: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x9621: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x5343; /* 1000 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x842C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E07; /* 10,000 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4EBF: /* Simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x5104; /* 100,000,000 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ *t++ = c; ~~~~~~~~~ } ~ } ~ *t = 0x0000; ~~~~~~~~~~~~ n = malloc ( (NewLen+1) * sizeof(UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (n == NULL) return (n); ~~~~~~~~~~~~~~~~~~~~~~~~~~ ucscpy(n,tmp); ~~~~~~~~~~~~~~ #ifndef ALLOCAOK ~~~~~~~~~~~~~~~~ free( (void *) tmp); ~~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ return n; ~~~~~~~~~ } ~ /* ~~ * The Chinese functions expect standard Chinese numbers in traditional characters. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Simplified characters and variants such as Suzhou numbers can be handled ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * by first calling NormalizeChineseNumbers on the input. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static void ChinesePlace (mpz_t Result, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x3007: ~~~~~~~~~~~~ case 0x96F6: ~~~~~~~~~~~~ case 0x0030: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E00: ~~~~~~~~~~~~ case 0x0031: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E8C: ~~~~~~~~~~~~ case 0x0032: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E09: ~~~~~~~~~~~~ case 0x0033: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x56DB: ~~~~~~~~~~~~ case 0x0034: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E94: ~~~~~~~~~~~~ case 0x0035: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x516D: ~~~~~~~~~~~~ case 0x0036: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E03: ~~~~~~~~~~~~ case 0x0037: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x516B: ~~~~~~~~~~~~ case 0x0038: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E5D: ~~~~~~~~~~~~ case 0x0039: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result,Result,10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ return; ~~~~~~~ } ~ static UTF32 ChineseBarriers [] = { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x5341, /* 0 - 10^1 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ 0x767E, /* 1 - 10^2 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ 0x5343, /* 2 - 10^3 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ 0x4E07, /* 3 - 10^4 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ 0x5104, /* 4 - 10^8 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ 0x5146, /* 5 - 10^12 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x4EAC, /* 6 - 10^16 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x5793, /* 7 - 10^20 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x25771, /* 8 - 10^24 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x7A63, /* 9 - 10^28 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x6E9D, /* 10 - 10^32 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x6F97, /* 11 - 10^36 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x6B63, /* 12 - 10^40 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x8F09, /* 13 - 10^44 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x6975, /* 14 - 10^48 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ }; ~~ /* ~~ * We can't just initialize an array of these values since most ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * of them are too large to fit into an unsigned long int, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * some even an unsigned long long int. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static void GetChineseBarrierValue (mpz_t Result,int which) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (which) { ~~~~~~~~~~~~~~~~ case 0: ~~~~~~~ (void) mpz_set_str(Result,"10",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 1: ~~~~~~~ (void) mpz_set_str(Result,"100",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 2: ~~~~~~~ (void) mpz_set_str(Result,"1000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 3: ~~~~~~~ (void) mpz_set_str(Result,"10000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 4: ~~~~~~~ (void) mpz_set_str(Result,"100000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 5: ~~~~~~~ (void) mpz_set_str(Result,"1000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 6: ~~~~~~~ (void) mpz_set_str(Result,"10000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 7: ~~~~~~~ (void) mpz_set_str(Result,"100000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 8: ~~~~~~~ (void) mpz_set_str(Result,"1000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 9: ~~~~~~~ (void) mpz_set_str(Result,"10000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 10: ~~~~~~~~ (void) mpz_set_str(Result,"100000000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 11: ~~~~~~~~ (void) mpz_set_str(Result,"1000000000000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 12: ~~~~~~~~ (void) mpz_set_str(Result,"10000000000000000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 13: ~~~~~~~~ (void) mpz_set_str(Result,"100000000000000000000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 14: ~~~~~~~~ (void) mpz_set_str(Result,"1000000000000000000000000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ default: ~~~~~~~~ (void) mpz_set_str(Result,"0",10); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ } ~ static inline UTF32 *SeekChineseBarrier (UTF32 *s, int *ri) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *ptr; ~~~~~~~~~~~ int bi = (sizeof(ChineseBarriers)/sizeof(UTF32))-1; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ptr = NULL; ~~~~~~~~~~~ while (ptr == NULL && bi >= 0) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ptr = ucschr(s,ChineseBarriers[bi--]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ *ri = bi+1; ~~~~~~~~~~~ return ptr; ~~~~~~~~~~~ } ~ static void ChineseToInt_MPZ(mpz_t ReturnValue, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *ptr; ~~~~~~~~~~~ UTF32 SavedBarrier; ~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ mpz_t mul; ~~~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ mpz_t RightValue; ~~~~~~~~~~~~~~~~~ mpz_t BarrierValue; ~~~~~~~~~~~~~~~~~~~ mpz_init(BarrierValue); ~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(mul); ~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ mpz_init(RightValue); ~~~~~~~~~~~~~~~~~~~~~ ptr = SeekChineseBarrier(s,&i); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (ptr == NULL) { ~~~~~~~~~~~~~~~~~~ ChinesePlace(ReturnValue,s); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ else { ~~~~~~ SavedBarrier = *ptr; *ptr = 0x0000; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ChineseToInt_MPZ(mul,s); ~~~~~~~~~~~~~~~~~~~~~~~~ *ptr = SavedBarrier; ~~~~~~~~~~~~~~~~~~~~ if (UEQ(mul,0L)) mpz_set_ui(mul,1L); /* If mul = 0, mul <= 1 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GetChineseBarrierValue(BarrierValue,i); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_mul(Result,mul,BarrierValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ChineseToInt_MPZ(RightValue,ptr+1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add(Result,Result,RightValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set(ReturnValue,Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_clear(BarrierValue); ~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ mpz_clear(RightValue); ~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(mul); ~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void ChineseToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ char *rs; ~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ ChineseToInt_MPZ(Result,s); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void ChineseCountingRodToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ char *rs; ~~~~~~~~~ enum ct {EVEN,NEUTRAL,ODD}; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ enum ct PreviousType = NEUTRAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ enum ct CurrentType = NEUTRAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x3007: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ CurrentType = NEUTRAL; ~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D360: ~~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D369: ~~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D361: ~~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D36A: ~~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D362: ~~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D36B: ~~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D363: ~~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D36C: ~~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D364: ~~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D36D: ~~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D365: ~~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D36E: ~~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D366: ~~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D36F: ~~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D367: ~~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D370: ~~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D368: ~~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D371: ~~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ if( (CurrentType == PreviousType) && (CurrentType != NEUTRAL)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_mul_ui(Result, Result, 100L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ else mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PreviousType = CurrentType; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void CyrillicAlphabeticToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue=0L; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ short ThousandP = 0; ~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ((c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch(c) { ~~~~~~~~~~~ case CYRILLIC_TITLO: /* Skip - it just marks numbers*/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case CYRILLIC_THOUSANDS_SIGN: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ThousandP = 1; ~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0426: ~~~~~~~~~~~~ CurrentValue=900; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0460: ~~~~~~~~~~~~ CurrentValue=800; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0470: ~~~~~~~~~~~~ CurrentValue=700; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0425: ~~~~~~~~~~~~ CurrentValue=600; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0424: ~~~~~~~~~~~~ CurrentValue=500; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0478: ~~~~~~~~~~~~ CurrentValue=400; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0422: ~~~~~~~~~~~~ CurrentValue=300; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0421: ~~~~~~~~~~~~ CurrentValue=200; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0420: ~~~~~~~~~~~~ CurrentValue=100; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0427: ~~~~~~~~~~~~ CurrentValue=90; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x041F: ~~~~~~~~~~~~ CurrentValue=80; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x041E: ~~~~~~~~~~~~ CurrentValue=70; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x046E: ~~~~~~~~~~~~ CurrentValue=60; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x041D: ~~~~~~~~~~~~ CurrentValue=50; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x041C: ~~~~~~~~~~~~ CurrentValue=40; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x041B: ~~~~~~~~~~~~ CurrentValue=30; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x041A: ~~~~~~~~~~~~ CurrentValue=20; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0406: ~~~~~~~~~~~~ CurrentValue=10; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0472: ~~~~~~~~~~~~ CurrentValue=9; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0418: ~~~~~~~~~~~~ CurrentValue=8; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0417: ~~~~~~~~~~~~ CurrentValue=7; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0405: ~~~~~~~~~~~~ CurrentValue=6; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0415: ~~~~~~~~~~~~ CurrentValue=5; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0414: ~~~~~~~~~~~~ CurrentValue=4; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0413: ~~~~~~~~~~~~ CurrentValue=3; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0411: /* BE */ ~~~~~~~~~~~~~~~~~~~~~~ CurrentValue=2; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0410: /* A */ ~~~~~~~~~~~~~~~~~~~~~ CurrentValue=1; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result,Result,CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void CommonBrailleToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ if (*s == 0x283C) s++; /* Skip number designator */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x281A: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2801: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2803: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2809: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2819: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2811: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x280B: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x281B: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2813: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x280A: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2802: /* Ignore Braille comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void DevanagariToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0966: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0967: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0968: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0969: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x096A: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x096B: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x096C: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x096D: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x096E: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x096F: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ /* Based on Unicode proposal - not yet final as of Unicode 5.0 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static void EgyptianToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x143A1: ~~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x14353: ~~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1433B: ~~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x141A2: ~~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x140A7: ~~~~~~~~~~~~~ CurrentValue = 10000; ~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x14173: ~~~~~~~~~~~~~ CurrentValue = 100000; ~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x14064: ~~~~~~~~~~~~~ CurrentValue = 1000000; ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void EthiopicToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init_set_ui(mpzResult,0L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_NUMBER_SYSTEM_UNKNOWN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ static void EwellicDecimalToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0xE6C0: ~~~~~~~~~~~~ case 0x0030: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C1: ~~~~~~~~~~~~ case 0x0031: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C2: ~~~~~~~~~~~~ case 0x0032: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C3: ~~~~~~~~~~~~ case 0x0033: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C4: ~~~~~~~~~~~~ case 0x0034: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C5: ~~~~~~~~~~~~ case 0x0035: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C6: ~~~~~~~~~~~~ case 0x0036: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C7: ~~~~~~~~~~~~ case 0x0037: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C8: ~~~~~~~~~~~~ case 0x0038: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C9: ~~~~~~~~~~~~ case 0x0039: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void EwellicHexToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ if( *s == 0x0060) s++; /* Skip Ewellic hex marker */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0xE6C0: ~~~~~~~~~~~~ case 0x0030: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C1: ~~~~~~~~~~~~ case 0x0031: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C2: ~~~~~~~~~~~~ case 0x0032: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C3: ~~~~~~~~~~~~ case 0x0033: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C4: ~~~~~~~~~~~~ case 0x0034: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C5: ~~~~~~~~~~~~ case 0x0035: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C6: ~~~~~~~~~~~~ case 0x0036: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C7: ~~~~~~~~~~~~ case 0x0037: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C8: ~~~~~~~~~~~~ case 0x0038: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C9: ~~~~~~~~~~~~ case 0x0039: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6CA: ~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6CB: ~~~~~~~~~~~~ CurrentValue = 11; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6CC: ~~~~~~~~~~~~ CurrentValue = 12; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6CD: ~~~~~~~~~~~~ CurrentValue = 13; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6CE: ~~~~~~~~~~~~ CurrentValue = 14; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6CF: ~~~~~~~~~~~~ CurrentValue = 15; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 16L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void FrenchBrailleToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ if (*s == 0x2820) s++; /* Skip number designator - D6 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x283C: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2821: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2823: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2829: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2839: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2831: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x282B: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x283B: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2833: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x282A: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2802: /* Ignore Braille comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void GeorgianAlphabeticToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x10A0: ~~~~~~~~~~~~ case 0x2D00: ~~~~~~~~~~~~ case 0x10D0: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10A1: ~~~~~~~~~~~~ case 0x2D01: ~~~~~~~~~~~~ case 0x10D1: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10A2: ~~~~~~~~~~~~ case 0x2D02: ~~~~~~~~~~~~ case 0x10D2: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10A3: ~~~~~~~~~~~~ case 0x2D03: ~~~~~~~~~~~~ case 0x10D3: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10A4: ~~~~~~~~~~~~ case 0x2D04: ~~~~~~~~~~~~ case 0x10D4: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10A5: ~~~~~~~~~~~~ case 0x2D05: ~~~~~~~~~~~~ case 0x10D5: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10A6: ~~~~~~~~~~~~ case 0x2D06: ~~~~~~~~~~~~ case 0x10D6: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10C1: ~~~~~~~~~~~~ case 0x2D21: ~~~~~~~~~~~~ case 0x10F1: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10A7: ~~~~~~~~~~~~ case 0x2D07: ~~~~~~~~~~~~ case 0x10D7: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10A8: ~~~~~~~~~~~~ case 0x2D08: ~~~~~~~~~~~~ case 0x10D8: ~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10A9: ~~~~~~~~~~~~ case 0x2D09: ~~~~~~~~~~~~ case 0x10D9: ~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10AA: ~~~~~~~~~~~~ case 0x2D0A: ~~~~~~~~~~~~ case 0x10DA: ~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10AB: ~~~~~~~~~~~~ case 0x2D0B: ~~~~~~~~~~~~ case 0x10DB: ~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10AC: ~~~~~~~~~~~~ case 0x2D0C: ~~~~~~~~~~~~ case 0x10DC: ~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10C2: ~~~~~~~~~~~~ case 0x2D22: ~~~~~~~~~~~~ case 0x10F2: ~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10AD: ~~~~~~~~~~~~ case 0x2D0D: ~~~~~~~~~~~~ case 0x10DD: ~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10AE: ~~~~~~~~~~~~ case 0x2D0E: ~~~~~~~~~~~~ case 0x10DE: ~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10AF: ~~~~~~~~~~~~ case 0x2D0F: ~~~~~~~~~~~~ case 0x10DF: ~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10B0: ~~~~~~~~~~~~ case 0x2D10: ~~~~~~~~~~~~ case 0x10E0: ~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10B1: ~~~~~~~~~~~~ case 0x2D11: ~~~~~~~~~~~~ case 0x10E1: ~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10B2: ~~~~~~~~~~~~ case 0x2D12: ~~~~~~~~~~~~ case 0x10E2: ~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10B3: ~~~~~~~~~~~~ case 0x2D13: ~~~~~~~~~~~~ case 0x10E3: ~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10B4: ~~~~~~~~~~~~ case 0x2D14: ~~~~~~~~~~~~ case 0x10E4: ~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10B5: ~~~~~~~~~~~~ case 0x2D15: ~~~~~~~~~~~~ case 0x10E5: ~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10B6: ~~~~~~~~~~~~ case 0x2D16: ~~~~~~~~~~~~ case 0x10E6: ~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10B7: ~~~~~~~~~~~~ case 0x2D17: ~~~~~~~~~~~~ case 0x10E7: ~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10B8: ~~~~~~~~~~~~ case 0x2D18: ~~~~~~~~~~~~ case 0x10E8: ~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10B9: ~~~~~~~~~~~~ case 0x2D19: ~~~~~~~~~~~~ case 0x10E9: ~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10BA: ~~~~~~~~~~~~ case 0x2D1A: ~~~~~~~~~~~~ case 0x10EA: ~~~~~~~~~~~~ CurrentValue = 2000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10BB: ~~~~~~~~~~~~ case 0x2D1B: ~~~~~~~~~~~~ case 0x10EB: ~~~~~~~~~~~~ CurrentValue = 3000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10BC: ~~~~~~~~~~~~ case 0x2D1C: ~~~~~~~~~~~~ case 0x10EC: ~~~~~~~~~~~~ CurrentValue = 4000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10BD: ~~~~~~~~~~~~ case 0x2D1D: ~~~~~~~~~~~~ case 0x10ED: ~~~~~~~~~~~~ CurrentValue = 5000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10BE: ~~~~~~~~~~~~ case 0x2D1E: ~~~~~~~~~~~~ case 0x10EE: ~~~~~~~~~~~~ CurrentValue = 6000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10C4: ~~~~~~~~~~~~ case 0x2D24: ~~~~~~~~~~~~ case 0x10F4: ~~~~~~~~~~~~ CurrentValue = 7000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10BF: ~~~~~~~~~~~~ case 0x2D1F: ~~~~~~~~~~~~ case 0x10EF: ~~~~~~~~~~~~ CurrentValue = 8000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10C0: ~~~~~~~~~~~~ case 0x2D20: ~~~~~~~~~~~~ case 0x10F0: ~~~~~~~~~~~~ CurrentValue = 9000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10C5: ~~~~~~~~~~~~ case 0x2D25: ~~~~~~~~~~~~ case 0x10F5: ~~~~~~~~~~~~ CurrentValue = 10000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void GlagoliticAlphabeticToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x2C00: /* AZU */ ~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C01: /* BUKY */ ~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C02: /* VEDE */ ~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C03: /* GLAGOLY */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C04: /* DOBRO */ ~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C05: /* YESTU */ ~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C06: /* ZHIVETE */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C07: /* DZELO */ ~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C08: /* ZEMLJA */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C09: /* IZHE */ ~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C0B: /* I */ ~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C0C: /* DJERVI */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C0D: /* KAKO */ ~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C0E: /* LJUDIE */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C0F: /* MYSLITE */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C10: /* NASHI */ ~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C11: /* ONU */ ~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C12: /* POKOJI */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C13: /* RITSI */ ~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C14: /* SLOVO */ ~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C15: /* TVRIDO */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C16: /* UKU */ ~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C17: /* FRITU */ ~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C18: /* HERU */ ~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C19: /* OTU */ ~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C1B: /* SHTA */ ~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C1C: /* TSI */ ~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C1D: /* CHRIVI */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2C1E: /* SHA */ ~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 2000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void GujaratiToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0AE6: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0AE7: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0AE8: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0AE9: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0AEA: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0AEB: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0AEC: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0AED: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0AEE: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0AEF: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void GreekAlphabeticToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ short LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0375: ~~~~~~~~~~~~ LeftKeraiaP = 1; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0391: ~~~~~~~~~~~~ case 0x03B1: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ if (LeftKeraiaP) CurrentValue *= 1000; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0392: ~~~~~~~~~~~~ case 0x03B2: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ if (LeftKeraiaP) CurrentValue *= 1000; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0393: ~~~~~~~~~~~~ case 0x03B3: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ if (LeftKeraiaP) CurrentValue *= 1000; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0394: ~~~~~~~~~~~~ case 0x03B4: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ if (LeftKeraiaP) CurrentValue *= 1000; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0395: ~~~~~~~~~~~~ case 0x03B5: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ if (LeftKeraiaP) CurrentValue *= 1000; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x03DA: /* Stigma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x03DB: /* Small stigma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x03DC: /* Digamma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x03DD: /* Small digamma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ if (LeftKeraiaP) CurrentValue *= 1000; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0396: ~~~~~~~~~~~~ case 0x03B6: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ if (LeftKeraiaP) CurrentValue *= 1000; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0397: ~~~~~~~~~~~~ case 0x03B7: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ if (LeftKeraiaP) CurrentValue *= 1000; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0398: ~~~~~~~~~~~~ case 0x03B8: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ if (LeftKeraiaP) CurrentValue *= 1000; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0399: ~~~~~~~~~~~~ case 0x03B9: ~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x039A: ~~~~~~~~~~~~ case 0x03BA: ~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x039B: ~~~~~~~~~~~~ case 0x03BB: ~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x039C: ~~~~~~~~~~~~ case 0x03BC: ~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x039D: ~~~~~~~~~~~~ case 0x03BD: ~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x039E: ~~~~~~~~~~~~ case 0x03BE: ~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x039F: ~~~~~~~~~~~~ case 0x03BF: ~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x03A0: ~~~~~~~~~~~~ case 0x03C0: ~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x03D8: /* Koppa */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x03D9: ~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x03A1: ~~~~~~~~~~~~ case 0x03C1: ~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x03A3: ~~~~~~~~~~~~ case 0x03C3: ~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x03A4: ~~~~~~~~~~~~ case 0x03C4: ~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x03A5: ~~~~~~~~~~~~ case 0x03C5: ~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x03A6: ~~~~~~~~~~~~ case 0x03C6: ~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x03A7: ~~~~~~~~~~~~ case 0x03C7: ~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x03A8: ~~~~~~~~~~~~ case 0x03C8: ~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x03A9: ~~~~~~~~~~~~ case 0x03C9: ~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x03E1: /* Small sanpi */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x03E0: /* Sanpi */ ~~~~~~~~~~~~~~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0374: /* Right keraia - just marks numbers - no value */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LeftKeraiaP = 0; ~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void GurmukhiToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0A66: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0A67: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0A68: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0A69: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0A6A: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0A6B: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0A6C: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0A6D: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0A6E: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0A6F: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void HebrewToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ short PrevCharGereshP; ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PrevCharGereshP = 0; ~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x05D0: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05D1: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05D2: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05D3: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05D4: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05D5: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05D6: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05D7: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05D8: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05D9: ~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05DB: ~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05DC: ~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05DE: ~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05E0: ~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05E1: ~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05E2: ~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05E4: ~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05E6: ~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05E7: ~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05E8: ~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05E9: ~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05EA: ~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05DA: ~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05DD: ~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05DF: ~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05E3: ~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05E5: ~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05F3: /* geresh */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x0027: /* apostrophe */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_mul_ui(Result,Result, 1000L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PrevCharGereshP = 1; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x05F4: /* gershayim */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0020: /* space */ ~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ if(!PrevCharGereshP) mpz_add_ui(Result,Result,CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void KannadaToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0CE6: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0CE7: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0CE8: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0CE9: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0CEA: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0CEB: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0CEC: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0CED: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0CEE: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0CEF: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void KayahLiToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0xA900: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xA901: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xA902: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xA903: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xA904: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xA905: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xA906: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xA907: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xA908: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xA909: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ #define KHAROSHTHI_THOUSAND 0x10A47 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_HUNDRED 0x10A46 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_FOUR 0x10A43 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_THREE 0x10A42 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_TWO 0x10A41 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_ONE 0x10A40 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* ~~ * A Kharoshthi number consists maximally of three components: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * (a) a thousand sign and its coefficient, consisting of the numerals following it. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * (b) a hundred sign and its coefficient, consisting of the numerals following it. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * (c) an additive component, consisting of 1s, 2s, 3s, 4s, 10s, and 20s, at the beginning. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static unsigned long KharoshthiToInt_NAMPZ(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long Total; ~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *thptr; ~~~~~~~~~~~~~ UTF32 *huptr; ~~~~~~~~~~~~~ UTF32 *wrkcpy; ~~~~~~~~~~~~~~ Total = 0L; ~~~~~~~~~~~ #ifdef ALLOCAOK ~~~~~~~~~~~~~~~ wrkcpy = alloca(sizeof(UTF32) * (1 + ucslen(s))); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum.c:3307:40: note: in expansion of macro 'ucslen' wrkcpy = alloca(sizeof(UTF32) * (1 + ucslen(s))); ^~~~~~ In file included from uninum.c:53: /usr/include/wchar.h:174:15: note: expected 'const wchar_t *' {aka 'const int *'} but argument is of type 'long int *' size_t wcslen(const wchar_t *) __pure; ^~~~~~~~~~~~~~~ uninum.c:39:37: warning: passing argument 1 of 'wcscpy' from incompatible pointer type [-Wincompatible-pointer-types] #define ucscpy(x,y) (UTF32 *)wcscpy((signed long *)x,(signed long *)y) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucscat(x,y) (UTF32 *)wcscat((signed long *)x,(signed long *)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucschr(x,y) (UTF32 *)wcschr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ucsrchr(x,y) (UTF32 *)wcsrchr((signed long *)x,(signed long)y) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define UNINUM ~~~~~~~~~~~~~~ #include "config.h" ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~ #include "unicode.h" ~~~~~~~~~~~~~~~~~~~~ #include "uninum.h" ~~~~~~~~~~~~~~~~~~~ #include "nsdefs.h" ~~~~~~~~~~~~~~~~~~~ #include "exitcode.h" ~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_LOCALE_H ~~~~~~~~~~~~~~~~~~~~ #include ~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ int uninum_err; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 tcl_uninum_badchar; /* Exported for error detection */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short uninum_ns_type; /* Exported for sanity-checking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Exported for parameter setting */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Input_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_Base = 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_General_Group_Size = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Output_First_Group_Size = 3; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF16 Uninum_Output_Group_Separator = 0x002C; /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Uninum_Generate_Roman_With_Bar_P = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We're currently not dealing with non-integers - this is just forward-looking */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static UTF32 Uninum_Output_Decimal_Separator = 0x002E; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* (10^97)-1, in hex for compactness and speed of conversion to binary */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MAXCHINESEHEX "4AE825771DC07672DDD0F8E8AC39250971AC4210CECB6F656CAEB9109FFFFFFFFFFFFFFFFFFFFFFFF" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_THOUSANDS_SIGN 0x0482 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_TITLO 0x0483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DECIMAL_MARKER 0xE06C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_MARKER 0xE06D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DUODECIMAL_LSD_MARKER 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_DEC 0xE06A ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_EL 0xE06B ~~~~~~~~~~~~~~~~~~~~~~~~~~ char *uninum_version(void) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return(VERSION); ~~~~~~~~~~~~~~~~ } ~ #ifdef HAVE_LOCALECONV ~~~~~~~~~~~~~~~~~~~~~~ #ifdef HAVE_SETLOCALE ~~~~~~~~~~~~~~~~~~~~~ void GetLocaleGroupInfo (){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct lconv *lcptr; ~~~~~~~~~~~~~~~~~~~~ setlocale(LC_NUMERIC,""); ~~~~~~~~~~~~~~~~~~~~~~~~~ lcptr = localeconv(); ~~~~~~~~~~~~~~~~~~~~~ if(lcptr == NULL) { ~~~~~~~~~~~~~~~~~~~ fprintf(stderr,"Attempt to obtain locale information was unsuccessful.\n"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ Uninum_Output_Group_Separator = (UTF16) (lcptr->thousands_sep[0]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Uninum_Output_First_Group_Size = lcptr->grouping[0]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(lcptr->grouping[1] != 0) Uninum_Output_General_Group_Size = lcptr->grouping[1]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Uninum_Output_General_Group_Size = Uninum_Output_First_Group_Size; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ #endif ~~~~~~ #endif ~~~~~~ /* Auxiliary functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long ipow(int base, int cnt) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ unsigned long Result; ~~~~~~~~~~~~~~~~~~~~~ i = 1; ~~~~~~ Result = 1; ~~~~~~~~~~~ while (i++ <= cnt) Result *= base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return Result; ~~~~~~~~~~~~~~ } ~ /* ~~ * Copy a string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static char *strpcpy(char *dest, const char *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *t; ~~~~~~~~ const char *s; ~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0) { ~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0; ~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Case-insenstive ascii string comparison. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Emulates BSD 4.4 function emulated by GNU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static int mystrcasecmp(char *a, char *b) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char ac; ~~~~~~~~ char bc; ~~~~~~~~ while(*a != '\0') { ~~~~~~~~~~~~~~~~~~~ ac = tolower(*a++); ~~~~~~~~~~~~~~~~~~~ bc = tolower(*b++); ~~~~~~~~~~~~~~~~~~~ if(ac < bc) return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~ if(ac > bc) return (1); ~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(*b != '\0') return (-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (0); ~~~~~~~~~~~ } ~ /* ~~ * Copy a wide string and return a pointer to the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * terminal null of the copy. The target must ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * have sufficient storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~ * This emulates the GNU extension wcpcpy(). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *ucpcpy(UTF32 *dest, const UTF32 *src) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ const UTF32 *s; ~~~~~~~~~~~~~~~ s = src; ~~~~~~~~ t = dest; ~~~~~~~~~ while (*s != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~ *t++ = *s++; ~~~~~~~~~~~~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return(t); ~~~~~~~~~~ } ~ /* ~~ * Reverse a wide string in place. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *wcsrev(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *p; ~~~~~~~~~ UTF32 *q; ~~~~~~~~~ UTF32 *h; ~~~~~~~~~ UTF32 t; ~~~~~~~~ p = s; ~~~~~~ q = s + ucslen(s)-1; ~~~~~~~~~~~~~~~~~~~~ h = s + (ucslen(s)/2); ~~~~~~~~~~~~~~~~~~~~~~ while (q >= h) { ~~~~~~~~~~~~~~~~ t = *p; ~~~~~~~ *p++ = *q; ~~~~~~~~~~ *q-- = t; ~~~~~~~~~ } ~ return(s); ~~~~~~~~~~ } ~ /* ~~ * Prepend a character to a string, returning new storage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * and freeing the old. ~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *Prepend(UTF32 *s, UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ new = malloc(sizeof(UTF32) * (len + 2)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new) { ~~~~~~~~~ new[0] = c; ~~~~~~~~~~~ new[1] = 0x0000; ~~~~~~~~~~~~~~~~ ucscpy(new+1,s); ~~~~~~~~~~~~~~~~ } ~ free(s); ~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ /* Remove "thousands separator"s */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *wcStripSeparators(UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *o; ~~~~~~~~~ UTF32 c; ~~~~~~~~ o = t = s; ~~~~~~~~~~ while ((c = *s++) != 0x0000){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch(c) { ~~~~~~~~~~~ case 0x0020: /* Space */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x0027: /* Apostrophe */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002C: /* Comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x002E: /* Period */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x066C: /* Arabic thousands separator */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x1361: /* Ethiopic wordspace */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3000: /* Ideographic space */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* We can't add the Braille comma U+2802 here because Russian Braille uses ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ the same character for the digit "1" */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ *t++ = c; ~~~~~~~~~ } ~ } ~ *t = 0x0000; ~~~~~~~~~~~~ return o; ~~~~~~~~~ } ~ /* ~~ * It is the caller's responsability to free the original storage. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ UTF32 *wcDelimitNumber( ~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *number, ~~~~~~~~~~~~~~ UTF16 gs, /* Group separator character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 ds, /* Decimal point character */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GroupSize, /* Number of digits in groups in general */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int FirstGroupSize /* Number of digits in low-order group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ) ~ { ~ int New_Size; /* Characters needed for delimited string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int length; /* Length of input string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int commas; /* Number of delimiters to insert */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Comma_Cnt; /* Number of delimiters inserted so far */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int digits; /* Number of digits preceding decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int cnt; /* Number of digits processed */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ UTF32 *new; /* String in which to write delimited number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *point; /* Location of decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *pos; /* Current position in original number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *npos; /* Current position in new number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *Non_Space_Number; /* Location of first non-space character in number */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Sanity check */ ~~~~~~~~~~~~~~~~~~ if( (GroupSize < 2) || (FirstGroupSize < 2)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 0; ~~~~~~~~~~~ goto newmem; ~~~~~~~~~~~~ } ~ length = ucslen(number); ~~~~~~~~~~~~~~~~~~~~~~~~ point = ucsrchr(number,(UTF32) '.'); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(point == NULL) point = number+(length-1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else point-=1; /* Point now points at last digit preceding decimal/end */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Non_Space_Number = ucsrchr(number,0x0020); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(Non_Space_Number == NULL) Non_Space_Number = number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else Non_Space_Number+=1; ~~~~~~~~~~~~~~~~~~~~~~~~~ digits = 1+point - Non_Space_Number; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(digits > FirstGroupSize) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commas = 1 + ((digits-FirstGroupSize-1)/GroupSize); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ else commas = 0; ~~~~~~~~~~~~~~~~ newmem: ~~~~~~~ New_Size = length + commas; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ new = (UTF32 *) malloc((New_Size + 1) * sizeof(UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(new){ ~~~~~~~~ if (commas == 0) return ucscpy(new,number); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* First copy right hand part of number, up to and including decimal point */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pos = number+length; ~~~~~~~~~~~~~~~~~~~~ npos = new+New_Size; ~~~~~~~~~~~~~~~~~~~~ for(; pos > point;) *npos-- = *pos--; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Now copy lefthand part, inserting delimiters as we go */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Comma_Cnt = cnt = 0; ~~~~~~~~~~~~~~~~~~~~ if(FirstGroupSize != GroupSize) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ for (i = 0; i < FirstGroupSize; i++) *npos-- = *pos--; /* Copy low group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *npos-- = (UTF32) gs; ~~~~~~~~~~~~~~~~~~~~~ *npos-- = *pos--; /* Low digit of second group */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Comma_Cnt = cnt = 1; ~~~~~~~~~~~~~~~~~~~~ } ~ while(pos >= Non_Space_Number){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *npos-- = *pos--; ~~~~~~~~~~~~~~~~~ if( (++cnt % GroupSize == 0) && (Comma_Cnt++ < commas )) *npos-- = (UTF32) gs; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ while(pos >= number) *npos-- = *pos--; /* Copy leading spaces, if any */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ } ~ /* ~~ * Returns a null-terminated wide string containing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * the specified character. ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *MakeSingleDigitString(UTF32 c) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *new; ~~~~~~~~~~~ new = malloc(sizeof(UTF32) * 2); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) { ~~~~~~~~~~ uninum_err = NS_ERROR_OUTOFMEMORY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NULL; ~~~~~~~~~~~~ } ~ new[0] = c; ~~~~~~~~~~~ new[1] = 0L; ~~~~~~~~~~~~ return(new); ~~~~~~~~~~~~ } ~ struct ns {char *s; int c; short type;}; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static struct ns NumberSystemList[] = { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Aegean",NS_AEGEAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "All",NS_ALL,NS_TYPE_SPECIAL, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Any",NS_ANY,NS_TYPE_SPECIAL, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Alphabetic",NS_ARABIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Persian",NS_PERSO_ARABIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Arabic_Western",NS_ARABIC_WESTERN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Armenian",NS_ARMENIAN_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Balinese",NS_BALINESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Bengali",NS_BENGALI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Burmese",NS_BURMESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese",NS_CHINESE_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Early",NS_CHINESE_COUNTING_ROD_EARLY_WITH_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Late",NS_CHINESE_COUNTING_ROD_LATE_WITH_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Early_No_Zero",NS_CHINESE_COUNTING_ROD_EARLY_WITHOUT_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Counting_Rod_Late_No_Zero",NS_CHINESE_COUNTING_ROD_LATE_WITHOUT_ZERO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Legal_Simplified",NS_CHINESE_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Legal_Traditional",NS_CHINESE_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Simplified",NS_CHINESE_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Traditional",NS_CHINESE_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Chinese_Regular_Place",NS_CHINESE_REGULAR_PLACE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Common_Braille",NS_COMMON_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Counting_Rod",NS_CHINESE_COUNTING_ROD_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Cyrillic",NS_CYRILLIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Devanagari",NS_DEVANAGARI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Egyptian",NS_EGYPTIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ethiopic",NS_ETHIOPIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ewellic_Decimal",NS_EWELLIC_DECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ewellic_Hexadecimal",NS_EWELLIC_HEX,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "French_Braille",NS_FRENCH_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Glagolitic",NS_GLAGOLITIC_ALPHABETIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek",NS_GREEK_ALPHABETIC_UPPER,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek_Lower",NS_GREEK_ALPHABETIC_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Greek_Upper",NS_GREEK_ALPHABETIC_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Gujarati",NS_GUJARATI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Gurmukhi",NS_GURMUKHI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew",NS_HEBREW_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew_Early",NS_HEBREW_EARLY,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hebrew_Late",NS_HEBREW_LATE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal",NS_HEX,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal_Lower",NS_HEX_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Hexadecimal_Upper",NS_HEX_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Regular_Simplified",NS_CHINESE_JAPANESE_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Regular_Traditional",NS_CHINESE_JAPANESE_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Legal_Simplified",NS_CHINESE_JAPANESE_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Legal_Traditional",NS_CHINESE_JAPANESE_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Japanese_Western_Mixed",NS_CHINESE_JAPANESE_WESTERN_MIX,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kannada",NS_KANNADA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kayah_Li", NS_KAYAH_LI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Kharoshthi",NS_KHAROSHTHI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Khmer",NS_KHMER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Klingon",NS_KLINGON,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Lao",NS_LAO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Lepcha",NS_LEPCHA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Limbu",NS_LIMBU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Malayalam",NS_MALAYALAM,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Legal_Simplified",NS_CHINESE_MANDARIN_LEGAL_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Legal_Traditional",NS_CHINESE_MANDARIN_LEGAL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Regular_Simplified",NS_CHINESE_MANDARIN_REGULAR_SIMPLIFIED,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mandarin_Regular_Traditional",NS_CHINESE_MANDARIN_REGULAR_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mongolian",NS_MONGOLIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Mxedruli",NS_MXEDRULI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "New_Tai_Lue",NS_NEW_TAI_LUE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Nko",NS_NKO,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Ol_Chiki",NS_OL_CHIKI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Old_Italic",NS_OLD_ITALIC,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Old_Persian",NS_OLD_PERSIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Oriya",NS_ORIYA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Osmanya",NS_OSMANYA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Phoenician",NS_PHOENICIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman",NS_ROMAN_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman_Lower",NS_ROMAN_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Roman_Upper",NS_ROMAN_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Russian_Braille",NS_RUSSIAN_BRAILLE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Saurashtra",NS_SAURASHTRA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Shan",NS_SHAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Sinhala",NS_SINHALA,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Sundanese",NS_SUNDANESE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Suzhou",NS_CHINESE_SUZHOU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil",NS_TAMIL_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil_Place",NS_TAMIL_PLACE,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tamil_Traditional",NS_TAMIL_TRADITIONAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Telugu",NS_TELUGU,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tengwar_Decimal",NS_TENGWAR_DECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tengwar_Duodecimal",NS_TENGWAR_DUODECIMAL,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Thai",NS_THAI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Tibetan",NS_TIBETAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Vai",NS_VAI,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~ "Verdurian",NS_VERDURIAN,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western",NS_WESTERN_GENERIC,NS_TYPE_COVER, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western_Lower",NS_WESTERN_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Western_Upper",NS_WESTERN_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Xucuri_Lower",NS_XUCURI_LOWER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Xucuri_Upper",NS_XUCURI_UPPER,NS_TYPE_SAFE, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Unknown",NS_UNKNOWN,NS_TYPE_GUESS, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "All_Zero",NS_ALLZERO,NS_TYPE_GUESS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ }; ~~ /* ~~ * Generate the list of available writing systems, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * returning the next string on each call unless ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * the flag is 0, which resets to the start of the ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * sequence. ~~~~~~~~~~~ * ~ * which = 0 -> list specific names usable in both directions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * which = 1 -> list cover terms suitable only for conversion of string to int ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ char *ListNumberSystems (int flag, int which) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static int i = 0; ~~~~~~~~~~~~~~~~~ if(flag == 0) i = 0; /* reset */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ top: if (i < (sizeof(NumberSystemList)/sizeof(struct ns))) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (NumberSystemList[i].type == (which? 2:1)) return NumberSystemList[i++].s; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else { ~~~~~~ i++; ~~~~ goto top; ~~~~~~~~~ } ~ } ~ i = 0; ~~~~~~ return NULL; ~~~~~~~~~~~~ } ~ /* ~~ * We just use linear search for the time being. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Could switch to binary search for greater speed. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ int StringToNumberSystem (char *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ for (i=0; i < (sizeof(NumberSystemList)/sizeof(struct ns)); i++) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (mystrcasecmp(s,NumberSystemList[i].s) == 0){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_ns_type = NumberSystemList[i].type; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (NumberSystemList[i].c); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ } ~ return NS_UNKNOWN; ~~~~~~~~~~~~~~~~~~ } ~ /* ~~ * We just use linear search for the time being. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Could switch to binary search for greater speed. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ char *NumberSystemToString (int ns) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ for (i=0; i < (sizeof(NumberSystemList)/sizeof(struct ns)); i++) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (NumberSystemList[i].c == ns) return NumberSystemList[i].s; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ return NULL; ~~~~~~~~~~~~ } ~ /* ~~ * Return the maximum value expressible in the specified number system. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * as a decimal ascii string, or if there is no limit, "unlimited". ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ #define AEGEAN_LIMIT 99999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_LIMIT 1999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EGYPTIAN_LIMIT 9999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_LIMIT 999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_LIMIT 10000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_LIMIT 999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ROMAN_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_LIMIT 9999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_LIMIT 999999 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LIMIT 10000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *UninumStringMaximumValue(int ns) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ char *new; ~~~~~~~~~~ mpz_t MaxChinese; ~~~~~~~~~~~~~~~~~ mpz_t Limit; ~~~~~~~~~~~~ mpz_init(Limit); ~~~~~~~~~~~~~~~~ switch(ns) { ~~~~~~~~~~~~ case NS_CHINESE_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_MANDARIN_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_REGULAR_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_REGULAR_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_WESTERN_MIX: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_LEGAL_SIMPLIFIED: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_CHINESE_JAPANESE_LEGAL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init_set_str(MaxChinese,MAXCHINESEHEX,16); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ new = malloc((mpz_sizeinbase(MaxChinese,10) + 1) * sizeof(char)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (void) mpz_get_str(new,10,MaxChinese); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(MaxChinese); ~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ case NS_AEGEAN: ~~~~~~~~~~~~~~~ mpz_set_ui(Limit,AEGEAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ARABIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ARABIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ARMENIAN_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ARMENIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_CYRILLIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,CYRILLIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_EGYPTIAN: ~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,EGYPTIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_GLAGOLITIC_ALPHABETIC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,GLAGOLITIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_GREEK_ALPHABETIC_UPPER: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case NS_GREEK_ALPHABETIC_LOWER: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,GREEK_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_HEBREW_EARLY: ~~~~~~~~~~~~~~~~~~~~~ case NS_HEBREW_LATE: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,HEBREW_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_KHAROSHTHI: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,KHAROSHTHI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_MXEDRULI: ~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,MXEDRULI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_OLD_ITALIC: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,OLD_ITALIC_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_OLD_PERSIAN: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,OLD_PERSIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_PHOENICIAN: ~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,PHOENICIAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_ROMAN_UPPER: ~~~~~~~~~~~~~~~~~~~~ case NS_ROMAN_LOWER: ~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,ROMAN_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_SINHALA: ~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,SINHALA_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_TAMIL_TRADITIONAL: ~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,TAMIL_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case NS_XUCURI_LOWER: ~~~~~~~~~~~~~~~~~~~~~ case NS_XUCURI_UPPER: ~~~~~~~~~~~~~~~~~~~~~ mpz_set_ui(Limit,XUCURI_LIMIT); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ new = malloc (sizeof(char) * (1 + strlen("unlimited"))); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sprintf(new,"%s","unlimited"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ new = malloc((mpz_sizeinbase(Limit,10) + 1) * sizeof(char)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!new) {uninum_err = NS_ERROR_OUTOFMEMORY;return NULL;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (void) mpz_get_str(new,10,Limit); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Limit); ~~~~~~~~~~~~~~~~~ return new; ~~~~~~~~~~~ } ~ #define AEGEAN_BEGIN 0x10107 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define AEGEAN_END 0x10133 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_BEGIN 0x0660 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_END 0x066C ~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_ALPHABETIC_BEGIN 0x0627 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARABIC_ALPHABETIC_END 0x064A ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PERSO_ARABIC_BEGIN 0x06F0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PERSO_ARABIC_END 0x06F9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_ALPHABETIC_UPPER_BEGIN 0x0531 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ARMENIAN_ALPHABETIC_UPPER_END 0x554 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BALINESE_BEGIN 0x1B50 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BALINESE_END 0x1B59 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BENGALI_BEGIN 0x09E6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BENGALI_END 0x09EF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BURMESE_BEGIN 0x1040 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define BURMESE_END 0x1049 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_COUNTING_ROD_BEGIN 0x1D360 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_COUNTING_ROD_END 0x1D371 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_A_BEGIN 0x4E00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_A_END 0x9FBB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_B_BEGIN 0x20000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CHINESE_B_END 0x2A6D6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_ALPHABETIC_UPPER_BEGIN 0x0400 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CYRILLIC_ALPHABETIC_UPPER_END 0x04FF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define DEVANAGARI_BEGIN 0x0966 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define DEVANAGARI_END 0x096F ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define COMMON_BRAILLE_BEGIN 0x2801 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define COMMON_BRAILLE_END 0x281B ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ETHIOPIC_BEGIN 0x1369 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ETHIOPIC_END 0x137C ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_BEGIN 0xE6C0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_DECIMAL_END 0xE6C9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define EWELLIC_END 0xE6CF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_ALPHABETIC_BEGIN 0x2C00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GLAGOLITIC_ALPHABETIC_END 0x2C1E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_BEGIN 0x03B1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_END 0x03C9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_BEGIN 0x0391 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_END 0x03A9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_DIGAMMA 0x03DD ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_DIGAMMA 0x03DC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_KOPPA 0x03DF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_KOPPA 0x03DE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_SAN 0x03FB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_SAN 0x03FA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LOWER_STIGMA 0x03DB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_UPPER_STIGMA 0x03DA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_RIGHT_KERAIA 0x0374 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GREEK_ALPHABETIC_LEFT_KERAIA 0x0375 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GUJARATI_BEGIN 0x0AE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GUJARATI_END 0x0AEF ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GURMUKHI_BEGIN 0x0A66 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define GURMUKHI_END 0x0A6F ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_BEGIN 0x0590 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define HEBREW_END 0x05FF ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KAYAH_LI_BEGIN 0xA900 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KAYAH_LI_END 0xA909 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KANNADA_BEGIN 0x0CE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KANNADA_END 0x0CEF ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_BEGIN 0x10A40 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHAROSHTHI_END 0x10A47 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHMER_BEGIN 0x17E0 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KHMER_END 0x17E9 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KLINGON_BEGIN 0xF8F0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define KLINGON_END 0xF8F9 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LAO_BEGIN 0x0ED0 ~~~~~~~~~~~~~~~~~~~~~~~~ #define LAO_END 0x0ED9 ~~~~~~~~~~~~~~~~~~~~~~ #define LEPCHA_BEGIN 0x1C40 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LEPCHA_END 0x1C49 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define LIMBU_BEGIN 0x1946 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define LIMBU_END 0x194F ~~~~~~~~~~~~~~~~~~~~~~~~ #define MALAYALAM_BEGIN 0x0D00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MALAYALAM_END 0x0D7F ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MONGOLIAN_BEGIN 0x1810 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MONGOLIAN_END 0x1819 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_BEGIN 0x10D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define MXEDRULI_END 0x10F5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NEW_TAI_LUE_BEGIN 0x19D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NEW_TAI_LUE_END 0x19D9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define NKO_BEGIN 0x07C0 ~~~~~~~~~~~~~~~~~~~~~~~~ #define NKO_END 0x07C9 ~~~~~~~~~~~~~~~~~~~~~~ #define OL_CHIKI_BEGIN 0x1C50 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OL_CHIKI_END 0x1C59 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_BEGIN 0x10320 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_ITALIC_END 0x10323 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_BEGIN 0x103D1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OLD_PERSIAN_END 0x103D5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ORIYA_BEGIN 0x0B66 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define ORIYA_END 0x0B6F ~~~~~~~~~~~~~~~~~~~~~~~~ #define OSMANYA_BEGIN 0x104A0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define OSMANYA_END 0x104A9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_BEGIN 0x10916 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define PHOENICIAN_END 0x10919 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SAURASHTRA_BEGIN 0xA8D0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SAURASHTRA_END 0xA8D9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SHAN_BEGIN 0x1090 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define SHAN_END 0x1099 ~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_BEGIN 0x0DE7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SINHALA_END 0x0DFA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUNDANESE_BEGIN 0x1BB0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUNDANESE_END 0x1BB9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUZHOU_BEGIN 0x3021 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define SUZHOU_END 0x3029 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_BEGIN 0x0BE6 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TAMIL_END 0x0BF2 ~~~~~~~~~~~~~~~~~~~~~~~~ #define TELUGU_BEGIN 0x0C66 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TELUGU_END 0x0C6F ~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_BEGIN 0xE030 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TENGWAR_END 0xE06E ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define THAI_BEGIN 0x0E50 ~~~~~~~~~~~~~~~~~~~~~~~~~ #define THAI_END 0x0E59 ~~~~~~~~~~~~~~~~~~~~~~~ #define TIBETAN_BEGIN 0x0F20 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define TIBETAN_END 0x0F29 ~~~~~~~~~~~~~~~~~~~~~~~~~~ #define VAI_BEGIN 0xA620 ~~~~~~~~~~~~~~~~~~~~~~~~ #define VAI_END 0xA629 ~~~~~~~~~~~~~~~~~~~~~~ #define VERDURIAN_BEGIN 0xE260 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define VERDURIAN_END 0xE26B ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LOWER_BEGIN 0x2D00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_LOWER_END 0x2D25 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_UPPER_BEGIN 0x10A0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define XUCURI_UPPER_END 0x10C5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int GuessNumberSystem(UTF32 *str){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ UTF32 *s; ~~~~~~~~~ int WesternCnt = 0; ~~~~~~~~~~~~~~~~~~~ int ZeroCnt = 0; ~~~~~~~~~~~~~~~~ int len; ~~~~~~~~ short FirstIsGraveP = 0; ~~~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (!str) return (NS_UNKNOWN); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ len = ucslen(str); ~~~~~~~~~~~~~~~~~~ s = str; ~~~~~~~~ if((c = *s) == 0x0060) FirstIsGraveP = 1; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ while((c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= AEGEAN_BEGIN) && (c <= AEGEAN_END)) return NS_AEGEAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ARABIC_BEGIN) && (c <= ARABIC_END)) return NS_ARABIC_WESTERN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ARABIC_ALPHABETIC_BEGIN) && ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c <= ARABIC_ALPHABETIC_END)) return NS_ARABIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= PERSO_ARABIC_BEGIN) && ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c <= PERSO_ARABIC_END)) return NS_PERSO_ARABIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= ARMENIAN_ALPHABETIC_UPPER_BEGIN) && (c <= ARMENIAN_ALPHABETIC_UPPER_END))) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NS_ARMENIAN_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= BALINESE_BEGIN) && (c <= BALINESE_END)) return NS_BALINESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= BENGALI_BEGIN) && (c <= BENGALI_END)) return NS_BENGALI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= BURMESE_BEGIN) && (c <= BURMESE_END)) return NS_BURMESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= CHINESE_COUNTING_ROD_BEGIN) && (c <= CHINESE_COUNTING_ROD_END)) return NS_CHINESE_COUNTING_ROD_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ( ((c >= CHINESE_A_BEGIN) && (c <= CHINESE_A_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ((c >= CHINESE_B_BEGIN) && (c <= CHINESE_B_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ( (c >= SUZHOU_BEGIN) && (c <= SUZHOU_END)) ) return NS_CHINESE_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= CYRILLIC_ALPHABETIC_UPPER_BEGIN) && (c <= CYRILLIC_ALPHABETIC_UPPER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == CYRILLIC_THOUSANDS_SIGN) || (c == CYRILLIC_TITLO)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return NS_CYRILLIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= DEVANAGARI_BEGIN) && (c <= DEVANAGARI_END)) return NS_DEVANAGARI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= 0x14000) && (c <= 0x143D7)) return NS_EGYPTIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ETHIOPIC_BEGIN) && (c <= ETHIOPIC_END)) return NS_ETHIOPIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c > EWELLIC_DECIMAL_END) && (c <= EWELLIC_END)) return NS_EWELLIC_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= EWELLIC_BEGIN) && (c <= EWELLIC_DECIMAL_END)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(FirstIsGraveP) return NS_EWELLIC_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ else return NS_EWELLIC_DECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c >= GLAGOLITIC_ALPHABETIC_BEGIN) && (c <= GLAGOLITIC_ALPHABETIC_END)) return NS_GLAGOLITIC_ALPHABETIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= GREEK_ALPHABETIC_LOWER_BEGIN) && (c <= GREEK_ALPHABETIC_LOWER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_DIGAMMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_KOPPA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_STIGMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_LOWER_SAN)) return NS_GREEK_ALPHABETIC_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= GREEK_ALPHABETIC_UPPER_BEGIN) && (c <= GREEK_ALPHABETIC_UPPER_END)) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_DIGAMMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_KOPPA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_STIGMA) || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (c == GREEK_ALPHABETIC_UPPER_SAN)) return NS_GREEK_ALPHABETIC_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= GUJARATI_BEGIN) && (c <= GUJARATI_END)) return NS_GUJARATI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= GURMUKHI_BEGIN) && (c <= GURMUKHI_END)) return NS_GURMUKHI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= HEBREW_BEGIN) && (c <= HEBREW_END)) return NS_HEBREW_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KANNADA_BEGIN) && (c <= KANNADA_END)) return NS_KANNADA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KAYAH_LI_BEGIN) && (c <= KAYAH_LI_END)) return NS_KAYAH_LI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KHAROSHTHI_BEGIN) && (c <= KHAROSHTHI_END)) return NS_KHAROSHTHI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KHMER_BEGIN) && (c <= KHMER_END)) return NS_KHMER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= KLINGON_BEGIN) && (c <= KLINGON_END)) return NS_KLINGON; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LAO_BEGIN) && (c <= LAO_END)) return NS_LAO; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LEPCHA_BEGIN) && (c <= LEPCHA_END)) return NS_LEPCHA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= LIMBU_BEGIN) && (c <= LIMBU_END)) return NS_LIMBU; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MALAYALAM_BEGIN) && (c <= MALAYALAM_END)) return NS_MALAYALAM; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MONGOLIAN_BEGIN) && (c <= MONGOLIAN_END)) return NS_MONGOLIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= MXEDRULI_BEGIN) && (c <= MXEDRULI_END)) return NS_MXEDRULI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= NEW_TAI_LUE_BEGIN) && (c <= NEW_TAI_LUE_END)) return NS_NEW_TAI_LUE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= NKO_BEGIN) && (c <= NKO_END)) return NS_NKO; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OL_CHIKI_BEGIN) && (c <= OL_CHIKI_END)) return NS_OL_CHIKI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OLD_ITALIC_BEGIN) && (c <= OLD_ITALIC_END)) return NS_OLD_ITALIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OLD_PERSIAN_BEGIN) && (c <= OLD_PERSIAN_END)) return NS_OLD_PERSIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= ORIYA_BEGIN) && (c <= ORIYA_END)) return NS_ORIYA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= OSMANYA_BEGIN) && (c <= OSMANYA_END)) return NS_OSMANYA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= PHOENICIAN_BEGIN) && (c <= PHOENICIAN_END)) return NS_PHOENICIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SAURASHTRA_BEGIN) && (c <= SAURASHTRA_END)) return NS_SAURASHTRA; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SHAN_BEGIN) && (c <= SHAN_END)) return NS_SHAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= SUNDANESE_BEGIN) && (c <= SUNDANESE_END)) return NS_SUNDANESE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TAMIL_BEGIN) && (c <= TAMIL_END)) return NS_TAMIL_GENERIC; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TELUGU_BEGIN) && (c <= TELUGU_END)) return NS_TELUGU; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DECIMAL_MARKER) return NS_TENGWAR_DECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DUODECIMAL_MARKER) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(c == TENGWAR_DUODECIMAL_LSD_MARKER) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if( (c == TENGWAR_DEC) || (c == TENGWAR_EL)) return NS_TENGWAR_DUODECIMAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= THAI_BEGIN) && (c <= THAI_END)) return NS_THAI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= TIBETAN_BEGIN) && (c <= TIBETAN_END)) return NS_TIBETAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= VAI_BEGIN) && (c <= VAI_END)) return NS_VAI; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= VERDURIAN_BEGIN) && (c <= VERDURIAN_END)) return NS_VERDURIAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= XUCURI_LOWER_BEGIN) && (c <= XUCURI_LOWER_END)) return NS_XUCURI_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c >= XUCURI_UPPER_BEGIN) && (c <= XUCURI_UPPER_END)) return NS_XUCURI_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x0059) || (c == 0x0079)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (ZeroCnt && (s-1 == str+1)) return NS_HEX; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if ((c == 0x0049) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x0056) || ~~~~~~~~~~~~~~~~ (c == 0x0058) || ~~~~~~~~~~~~~~~~ (c == 0x004C) || ~~~~~~~~~~~~~~~~ (c == 0x0043) || ~~~~~~~~~~~~~~~~ (c == 0x0044) || ~~~~~~~~~~~~~~~~ (c == 0x004D) || ~~~~~~~~~~~~~~~~ (c == 0x2183) || ~~~~~~~~~~~~~~~~ ( (c >= 0x2160) && (c <= 0x216F))) return NS_ROMAN_UPPER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x0069) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x0076) || ~~~~~~~~~~~~~~~~ (c == 0x0078) || ~~~~~~~~~~~~~~~~ (c == 0x006C) || ~~~~~~~~~~~~~~~~ (c == 0x0063) || ~~~~~~~~~~~~~~~~ (c == 0x0064) || ~~~~~~~~~~~~~~~~ (c == 0x006D) || ~~~~~~~~~~~~~~~~ (c == 0x2184) || ~~~~~~~~~~~~~~~~ ( (c >= 0x2170) && (c <= 0x217F))) return NS_ROMAN_LOWER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x281A) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2801) || ~~~~~~~~~~~~~~~~ (c == 0x2803) || ~~~~~~~~~~~~~~~~ (c == 0x2809) || ~~~~~~~~~~~~~~~~ (c == 0x2819) || ~~~~~~~~~~~~~~~~ (c == 0x2811) || ~~~~~~~~~~~~~~~~ (c == 0x280B) || ~~~~~~~~~~~~~~~~ (c == 0x281B) || ~~~~~~~~~~~~~~~~ (c == 0x2813) || ~~~~~~~~~~~~~~~~ (c == 0x280A)) return NS_COMMON_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x283C) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2821) || ~~~~~~~~~~~~~~~~ (c == 0x2823) || ~~~~~~~~~~~~~~~~ (c == 0x2829) || ~~~~~~~~~~~~~~~~ (c == 0x2839) || ~~~~~~~~~~~~~~~~ (c == 0x2831) || ~~~~~~~~~~~~~~~~ (c == 0x282B) || ~~~~~~~~~~~~~~~~ (c == 0x283B) || ~~~~~~~~~~~~~~~~ (c == 0x2833) || ~~~~~~~~~~~~~~~~ (c == 0x282A)) return NS_FRENCH_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if ((c == 0x2834) || ~~~~~~~~~~~~~~~~~~~~ (c == 0x2802) || ~~~~~~~~~~~~~~~~ (c == 0x2806) || ~~~~~~~~~~~~~~~~ (c == 0x2812) || ~~~~~~~~~~~~~~~~ (c == 0x2832) || ~~~~~~~~~~~~~~~~ (c == 0x2822) || ~~~~~~~~~~~~~~~~ (c == 0x2816) || ~~~~~~~~~~~~~~~~ (c == 0x2836) || ~~~~~~~~~~~~~~~~ (c == 0x2826) || ~~~~~~~~~~~~~~~~ (c == 0x2814)) return NS_RUSSIAN_BRAILLE; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (((c >= 0x31 ) && (c <= 0x39)) || ((c >= 0xFF10) && (c <= 0xFF19))) {WesternCnt++;continue;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (c == 0x0030) {ZeroCnt++;WesternCnt++;continue;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ if(ZeroCnt == len) return (NS_ALLZERO); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(WesternCnt == len) return(NS_WESTERN_GENERIC); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return (NS_UNKNOWN); ~~~~~~~~~~~~~~~~~~~~ } ~ /* String to Integer conversion functions */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static void ArabicToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ char *rs; ~~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0660: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0661: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0662: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0663: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0664: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0665: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0666: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0667: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0668: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0669: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void ArabicExtendedToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x06F0: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F1: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F2: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F3: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F4: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F5: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F6: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F7: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F8: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x06F9: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void ArabicAlphabeticToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0627: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0628: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062C: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062F: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0647: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0648: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0632: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062D: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0637: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x064A: ~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0643: ~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0644: ~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0645: ~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0646: ~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0633: ~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0639: ~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0641: ~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0635: ~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0642: ~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0631: ~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0634: ~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062A: ~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062B: ~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x062E: ~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0630: ~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0636: ~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0638: ~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x063A: ~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void AegeanToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x10107: ~~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10108: ~~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10109: ~~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010A: ~~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010B: ~~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010C: ~~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010D: ~~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010E: ~~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1010F: ~~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10110: ~~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10111: ~~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10112: ~~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10113: ~~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10114: ~~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10115: ~~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10116: ~~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10117: ~~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10118: ~~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10119: ~~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011A: ~~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011B: ~~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011C: ~~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011D: ~~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011E: ~~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1011F: ~~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10120: ~~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10121: ~~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10122: ~~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10123: ~~~~~~~~~~~~~ CurrentValue = 2000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10124: ~~~~~~~~~~~~~ CurrentValue = 3000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10125: ~~~~~~~~~~~~~ CurrentValue = 4000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10126: ~~~~~~~~~~~~~ CurrentValue = 5000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10127: ~~~~~~~~~~~~~ CurrentValue = 6000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10128: ~~~~~~~~~~~~~ CurrentValue = 7000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10129: ~~~~~~~~~~~~~ CurrentValue = 8000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012A: ~~~~~~~~~~~~~ CurrentValue = 9000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012B: ~~~~~~~~~~~~~ CurrentValue = 10000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012C: ~~~~~~~~~~~~~ CurrentValue = 20000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012D: ~~~~~~~~~~~~~ CurrentValue = 30000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012E: ~~~~~~~~~~~~~ CurrentValue = 40000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1012F: ~~~~~~~~~~~~~ CurrentValue = 50000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10130: ~~~~~~~~~~~~~ CurrentValue = 60000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10131: ~~~~~~~~~~~~~ CurrentValue = 70000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10132: ~~~~~~~~~~~~~ CurrentValue = 80000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x10133: ~~~~~~~~~~~~~ CurrentValue = 90000; ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void ArmenianAlphabeticToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0531: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0532: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0533: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0534: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0535: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0536: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0537: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0538: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0539: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053A: ~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053B: ~~~~~~~~~~~~ CurrentValue = 20; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053C: ~~~~~~~~~~~~ CurrentValue = 30; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053D: ~~~~~~~~~~~~ CurrentValue = 40; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053E: ~~~~~~~~~~~~ CurrentValue = 50; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x053F: ~~~~~~~~~~~~ CurrentValue = 60; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0540: ~~~~~~~~~~~~ CurrentValue = 70; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0541: ~~~~~~~~~~~~ CurrentValue = 80; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0542: ~~~~~~~~~~~~ CurrentValue = 90; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0543: ~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0544: ~~~~~~~~~~~~ CurrentValue = 200; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0545: ~~~~~~~~~~~~ CurrentValue = 300; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0546: ~~~~~~~~~~~~ CurrentValue = 400; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0547: ~~~~~~~~~~~~ CurrentValue = 500; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0548: ~~~~~~~~~~~~ CurrentValue = 600; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0549: ~~~~~~~~~~~~ CurrentValue = 700; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054A: ~~~~~~~~~~~~ CurrentValue = 800; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054B: ~~~~~~~~~~~~ CurrentValue = 900; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054C: ~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054D: ~~~~~~~~~~~~ CurrentValue = 2000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054E: ~~~~~~~~~~~~ CurrentValue = 3000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x054F: ~~~~~~~~~~~~ CurrentValue = 4000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0550: ~~~~~~~~~~~~ CurrentValue = 5000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0551: ~~~~~~~~~~~~ CurrentValue = 6000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0552: ~~~~~~~~~~~~ CurrentValue = 7000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0553: ~~~~~~~~~~~~ CurrentValue = 8000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0554: ~~~~~~~~~~~~ CurrentValue = 9000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void BalineseToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x1B50: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B51: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B52: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B53: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B54: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B55: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B56: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B57: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B58: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1B59: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void BengaliToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x09E6: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E7: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E8: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09E9: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EA: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EB: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EC: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09ED: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EE: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x09EF: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void BurmeseToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x1040: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1041: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1042: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1043: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1044: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1045: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1046: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1047: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1048: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1049: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ /* ~~ * Replaces variant forms of Chinese numbers with their standard traditional counterparts. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Returns a newly allocated string, or a null pointer on failure of storage allocation. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static UTF32 *NormalizeChineseNumbers (UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ UTF32 *t; ~~~~~~~~~ UTF32 *tmp; ~~~~~~~~~~~ UTF32 *n; ~~~~~~~~~ int len; ~~~~~~~~ int NewLen; ~~~~~~~~~~~ /* ~~ * It is safe to double the string length for temp space since no ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * substitution does more than replace one character with two. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ len = ucslen(s); ~~~~~~~~~~~~~~~~ #ifdef ALLOCAOK ~~~~~~~~~~~~~~~ t = alloca (((2 * len) + 1) * sizeof (UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #else ~~~~~ t = malloc (((2 * len) + 1) * sizeof (UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ if (t == NULL) return (t); ~~~~~~~~~~~~~~~~~~~~~~~~~~ tmp = t; ~~~~~~~~ NewLen = len; ~~~~~~~~~~~~~ while( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x96F6: /* Traditional/Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0xF9B2: /* Compatibility */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ =0x3007; /* 0 - Ideographic zero - also used with Suzhou numerals*/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x58F1: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x58F9: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x580C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x4E48: /* Telephone number yao - traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5E7A: /* Telephone number yao - simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3021: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++=0x4E00; /* 1 */ ~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x5F0D: /* Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5F10: /* Modern Japanese Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5169: /* liang traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8CAE: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8CB3: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8D30: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x4E24: /* liang simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3022: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0xF978: /* liang - compatibility */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E8C; /* 2 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x53C1: /* Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x53C2: /* Modern Japanese Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x53C3: /* Obsolete Japanese Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x53C4: /* Legal traditional */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x5F0E: /* Legal simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3023: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E09; /* 3 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E96: /* Obsolete Japanese variant */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x8086: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3024: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x56DB; /* 4 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4F0D: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3025: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E94; /* 5 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x9646: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x9678: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3026: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x516D; /* 6 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x67D2: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x6F06: /* Legal ??????*/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3027: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E03; /* 7 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x634C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3028: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x516B; /* 8 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x7396: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3029: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E5D; /* 9 */ ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x3038: /* Suzhou */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x4EC0: /* Legal simplified - disfavored */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x62FE: /* Legal traditional*/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x5341; /* 10 */ ~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x5EFF: /* Portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x3039: /* Suzhou portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E8C; ~~~~~~~~~~~~~~ *t++ = 0x5341; /* 20 */ ~~~~~~~~~~~~~~~~~~~~~~~~ NewLen++; ~~~~~~~~~ break; ~~~~~~ case 0x5345: /* Portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x303A: /* Suzhou portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E09; ~~~~~~~~~~~~~~ *t++ = 0x5341; /* 30 */ ~~~~~~~~~~~~~~~~~~~~~~~~ NewLen++; ~~~~~~~~~ break; ~~~~~~ case 0x534C: /* Portmanteau */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x56DB; ~~~~~~~~~~~~~~ *t++ = 0x5341; /* 40 */ ~~~~~~~~~~~~~~~~~~~~~~~~ NewLen++; ~~~~~~~~~ break; ~~~~~~ case 0x4F70: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x964C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x767E; /* 100 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4EDF: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ case 0x9621: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x5343; /* 1000 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x842C: /* Legal */ ~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x4E07; /* 10,000 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4EBF: /* Simplified */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *t++ = 0x5104; /* 100,000,000 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: ~~~~~~~~ *t++ = c; ~~~~~~~~~ } ~ } ~ *t = 0x0000; ~~~~~~~~~~~~ n = malloc ( (NewLen+1) * sizeof(UTF32)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (n == NULL) return (n); ~~~~~~~~~~~~~~~~~~~~~~~~~~ ucscpy(n,tmp); ~~~~~~~~~~~~~~ #ifndef ALLOCAOK ~~~~~~~~~~~~~~~~ free( (void *) tmp); ~~~~~~~~~~~~~~~~~~~~ #endif ~~~~~~ return n; ~~~~~~~~~ } ~ /* ~~ * The Chinese functions expect standard Chinese numbers in traditional characters. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Simplified characters and variants such as Suzhou numbers can be handled ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * by first calling NormalizeChineseNumbers on the input. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static void ChinesePlace (mpz_t Result, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x3007: ~~~~~~~~~~~~ case 0x96F6: ~~~~~~~~~~~~ case 0x0030: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E00: ~~~~~~~~~~~~ case 0x0031: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E8C: ~~~~~~~~~~~~ case 0x0032: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E09: ~~~~~~~~~~~~ case 0x0033: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x56DB: ~~~~~~~~~~~~ case 0x0034: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E94: ~~~~~~~~~~~~ case 0x0035: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x516D: ~~~~~~~~~~~~ case 0x0036: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E03: ~~~~~~~~~~~~ case 0x0037: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x516B: ~~~~~~~~~~~~ case 0x0038: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x4E5D: ~~~~~~~~~~~~ case 0x0039: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result,Result,10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ return; ~~~~~~~ } ~ static UTF32 ChineseBarriers [] = { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x5341, /* 0 - 10^1 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ 0x767E, /* 1 - 10^2 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ 0x5343, /* 2 - 10^3 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ 0x4E07, /* 3 - 10^4 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ 0x5104, /* 4 - 10^8 */ ~~~~~~~~~~~~~~~~~~~~~~~~~ 0x5146, /* 5 - 10^12 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x4EAC, /* 6 - 10^16 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x5793, /* 7 - 10^20 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x25771, /* 8 - 10^24 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x7A63, /* 9 - 10^28 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x6E9D, /* 10 - 10^32 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x6F97, /* 11 - 10^36 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x6B63, /* 12 - 10^40 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x8F09, /* 13 - 10^44 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x6975, /* 14 - 10^48 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~ }; ~~ /* ~~ * We can't just initialize an array of these values since most ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * of them are too large to fit into an unsigned long int, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * some even an unsigned long long int. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ~~ static void GetChineseBarrierValue (mpz_t Result,int which) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (which) { ~~~~~~~~~~~~~~~~ case 0: ~~~~~~~ (void) mpz_set_str(Result,"10",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 1: ~~~~~~~ (void) mpz_set_str(Result,"100",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 2: ~~~~~~~ (void) mpz_set_str(Result,"1000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 3: ~~~~~~~ (void) mpz_set_str(Result,"10000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 4: ~~~~~~~ (void) mpz_set_str(Result,"100000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 5: ~~~~~~~ (void) mpz_set_str(Result,"1000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 6: ~~~~~~~ (void) mpz_set_str(Result,"10000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 7: ~~~~~~~ (void) mpz_set_str(Result,"100000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 8: ~~~~~~~ (void) mpz_set_str(Result,"1000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 9: ~~~~~~~ (void) mpz_set_str(Result,"10000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 10: ~~~~~~~~ (void) mpz_set_str(Result,"100000000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 11: ~~~~~~~~ (void) mpz_set_str(Result,"1000000000000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 12: ~~~~~~~~ (void) mpz_set_str(Result,"10000000000000000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 13: ~~~~~~~~ (void) mpz_set_str(Result,"100000000000000000000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case 14: ~~~~~~~~ (void) mpz_set_str(Result,"1000000000000000000000000000000000000000000000000",10);break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ default: ~~~~~~~~ (void) mpz_set_str(Result,"0",10); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ } ~ static inline UTF32 *SeekChineseBarrier (UTF32 *s, int *ri) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *ptr; ~~~~~~~~~~~ int bi = (sizeof(ChineseBarriers)/sizeof(UTF32))-1; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ptr = NULL; ~~~~~~~~~~~ while (ptr == NULL && bi >= 0) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ptr = ucschr(s,ChineseBarriers[bi--]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ *ri = bi+1; ~~~~~~~~~~~ return ptr; ~~~~~~~~~~~ } ~ static void ChineseToInt_MPZ(mpz_t ReturnValue, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 *ptr; ~~~~~~~~~~~ UTF32 SavedBarrier; ~~~~~~~~~~~~~~~~~~~ int i; ~~~~~~ mpz_t mul; ~~~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ mpz_t RightValue; ~~~~~~~~~~~~~~~~~ mpz_t BarrierValue; ~~~~~~~~~~~~~~~~~~~ mpz_init(BarrierValue); ~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(mul); ~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ mpz_init(RightValue); ~~~~~~~~~~~~~~~~~~~~~ ptr = SeekChineseBarrier(s,&i); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (ptr == NULL) { ~~~~~~~~~~~~~~~~~~ ChinesePlace(ReturnValue,s); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ else { ~~~~~~ SavedBarrier = *ptr; *ptr = 0x0000; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ChineseToInt_MPZ(mul,s); ~~~~~~~~~~~~~~~~~~~~~~~~ *ptr = SavedBarrier; ~~~~~~~~~~~~~~~~~~~~ if (UEQ(mul,0L)) mpz_set_ui(mul,1L); /* If mul = 0, mul <= 1 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GetChineseBarrierValue(BarrierValue,i); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_mul(Result,mul,BarrierValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ChineseToInt_MPZ(RightValue,ptr+1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add(Result,Result,RightValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_set(ReturnValue,Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_clear(BarrierValue); ~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ mpz_clear(RightValue); ~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(mul); ~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ static void ChineseToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ char *rs; ~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ ChineseToInt_MPZ(Result,s); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void ChineseCountingRodToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ char *rs; ~~~~~~~~~ enum ct {EVEN,NEUTRAL,ODD}; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ enum ct PreviousType = NEUTRAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ enum ct CurrentType = NEUTRAL; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x3007: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ CurrentType = NEUTRAL; ~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D360: ~~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D369: ~~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D361: ~~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D36A: ~~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D362: ~~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D36B: ~~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D363: ~~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D36C: ~~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D364: ~~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D36D: ~~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D365: ~~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D36E: ~~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D366: ~~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D36F: ~~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D367: ~~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D370: ~~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D368: ~~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ CurrentType = EVEN; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1D371: ~~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ CurrentType = ODD; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ if( (CurrentType == PreviousType) && (CurrentType != NEUTRAL)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_mul_ui(Result, Result, 100L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ else mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PreviousType = CurrentType; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void CyrillicAlphabeticToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue=0L; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ short ThousandP = 0; ~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ((c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch(c) { ~~~~~~~~~~~ case CYRILLIC_TITLO: /* Skip - it just marks numbers*/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case CYRILLIC_THOUSANDS_SIGN: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ThousandP = 1; ~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0426: ~~~~~~~~~~~~ CurrentValue=900; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0460: ~~~~~~~~~~~~ CurrentValue=800; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0470: ~~~~~~~~~~~~ CurrentValue=700; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0425: ~~~~~~~~~~~~ CurrentValue=600; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0424: ~~~~~~~~~~~~ CurrentValue=500; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0478: ~~~~~~~~~~~~ CurrentValue=400; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0422: ~~~~~~~~~~~~ CurrentValue=300; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0421: ~~~~~~~~~~~~ CurrentValue=200; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0420: ~~~~~~~~~~~~ CurrentValue=100; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0427: ~~~~~~~~~~~~ CurrentValue=90; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x041F: ~~~~~~~~~~~~ CurrentValue=80; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x041E: ~~~~~~~~~~~~ CurrentValue=70; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x046E: ~~~~~~~~~~~~ CurrentValue=60; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x041D: ~~~~~~~~~~~~ CurrentValue=50; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x041C: ~~~~~~~~~~~~ CurrentValue=40; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x041B: ~~~~~~~~~~~~ CurrentValue=30; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x041A: ~~~~~~~~~~~~ CurrentValue=20; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0406: ~~~~~~~~~~~~ CurrentValue=10; ~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0472: ~~~~~~~~~~~~ CurrentValue=9; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0418: ~~~~~~~~~~~~ CurrentValue=8; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0417: ~~~~~~~~~~~~ CurrentValue=7; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0405: ~~~~~~~~~~~~ CurrentValue=6; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0415: ~~~~~~~~~~~~ CurrentValue=5; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0414: ~~~~~~~~~~~~ CurrentValue=4; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0413: ~~~~~~~~~~~~ CurrentValue=3; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0411: /* BE */ ~~~~~~~~~~~~~~~~~~~~~~ CurrentValue=2; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0410: /* A */ ~~~~~~~~~~~~~~~~~~~~~ CurrentValue=1; ~~~~~~~~~~~~~~~ if (ThousandP) {CurrentValue *= 1000L; ThousandP = 0;} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result,Result,CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void CommonBrailleToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ if (*s == 0x283C) s++; /* Skip number designator */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x281A: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2801: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2803: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2809: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2819: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2811: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x280B: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x281B: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2813: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x280A: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2802: /* Ignore Braille comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void DevanagariToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x0966: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0967: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0968: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x0969: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x096A: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x096B: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x096C: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x096D: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x096E: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x096F: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ /* Based on Unicode proposal - not yet final as of Unicode 5.0 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ static void EgyptianToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x143A1: ~~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x14353: ~~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x1433B: ~~~~~~~~~~~~~ CurrentValue = 100; ~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x141A2: ~~~~~~~~~~~~~ CurrentValue = 1000; ~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x140A7: ~~~~~~~~~~~~~ CurrentValue = 10000; ~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x14173: ~~~~~~~~~~~~~ CurrentValue = 100000; ~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x14064: ~~~~~~~~~~~~~ CurrentValue = 1000000; ~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void EthiopicToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init_set_ui(mpzResult,0L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_NUMBER_SYSTEM_UNKNOWN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ static void EwellicDecimalToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0xE6C0: ~~~~~~~~~~~~ case 0x0030: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C1: ~~~~~~~~~~~~ case 0x0031: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C2: ~~~~~~~~~~~~ case 0x0032: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C3: ~~~~~~~~~~~~ case 0x0033: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C4: ~~~~~~~~~~~~ case 0x0034: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C5: ~~~~~~~~~~~~ case 0x0035: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C6: ~~~~~~~~~~~~ case 0x0036: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C7: ~~~~~~~~~~~~ case 0x0037: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C8: ~~~~~~~~~~~~ case 0x0038: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C9: ~~~~~~~~~~~~ case 0x0039: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 10L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void EwellicHexToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ if( *s == 0x0060) s++; /* Skip Ewellic hex marker */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0xE6C0: ~~~~~~~~~~~~ case 0x0030: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C1: ~~~~~~~~~~~~ case 0x0031: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C2: ~~~~~~~~~~~~ case 0x0032: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C3: ~~~~~~~~~~~~ case 0x0033: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C4: ~~~~~~~~~~~~ case 0x0034: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C5: ~~~~~~~~~~~~ case 0x0035: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C6: ~~~~~~~~~~~~ case 0x0036: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C7: ~~~~~~~~~~~~ case 0x0037: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C8: ~~~~~~~~~~~~ case 0x0038: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6C9: ~~~~~~~~~~~~ case 0x0039: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6CA: ~~~~~~~~~~~~ CurrentValue = 10; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6CB: ~~~~~~~~~~~~ CurrentValue = 11; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6CC: ~~~~~~~~~~~~ CurrentValue = 12; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6CD: ~~~~~~~~~~~~ CurrentValue = 13; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6CE: ~~~~~~~~~~~~ CurrentValue = 14; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0xE6CF: ~~~~~~~~~~~~ CurrentValue = 15; ~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c; ~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ return; ~~~~~~~ } ~ mpz_mul_ui(Result, Result, 16L); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_add_ui(Result, Result, CurrentValue); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } ~ mpz_init_set(mpzResult, Result); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_clear(Result); ~~~~~~~~~~~~~~~~~~ } ~ static void FrenchBrailleToInt(mpz_t mpzResult, UTF32 *s) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ unsigned long CurrentValue; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ UTF32 c; ~~~~~~~~ mpz_t Result; ~~~~~~~~~~~~~ uninum_err = NS_ERROR_OKAY; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ mpz_init(Result); ~~~~~~~~~~~~~~~~~ if (*s == 0x2820) s++; /* Skip number designator - D6 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ while ( (c = *s++) != 0x0000) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (c) { ~~~~~~~~~~~~ case 0x283C: ~~~~~~~~~~~~ CurrentValue = 0; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2821: ~~~~~~~~~~~~ CurrentValue = 1; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2823: ~~~~~~~~~~~~ CurrentValue = 2; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2829: ~~~~~~~~~~~~ CurrentValue = 3; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2839: ~~~~~~~~~~~~ CurrentValue = 4; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2831: ~~~~~~~~~~~~ CurrentValue = 5; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x282B: ~~~~~~~~~~~~ CurrentValue = 6; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x283B: ~~~~~~~~~~~~ CurrentValue = 7; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2833: ~~~~~~~~~~~~ CurrentValue = 8; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x282A: ~~~~~~~~~~~~ CurrentValue = 9; ~~~~~~~~~~~~~~~~~ break; ~~~~~~ case 0x2802: /* Ignore Braille comma */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ break; ~~~~~~ default: /* Error */ ~~~~~~~~~~~~~~~~~~~~~~ uninum_err = NS_ERROR_BADCHARACTER; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uninum_badchar = c;