aboutsummaryrefslogtreecommitdiff
path: root/libX11/modules/lc/xlocale
diff options
context:
space:
mode:
Diffstat (limited to 'libX11/modules/lc/xlocale')
-rw-r--r--libX11/modules/lc/xlocale/Makefile.am33
-rw-r--r--libX11/modules/lc/xlocale/Makefile.in563
-rw-r--r--libX11/modules/lc/xlocale/lcEuc.c1539
-rw-r--r--libX11/modules/lc/xlocale/lcJis.c947
-rw-r--r--libX11/modules/lc/xlocale/lcSjis.c1614
5 files changed, 4696 insertions, 0 deletions
diff --git a/libX11/modules/lc/xlocale/Makefile.am b/libX11/modules/lc/xlocale/Makefile.am
new file mode 100644
index 000000000..be8dd41c1
--- /dev/null
+++ b/libX11/modules/lc/xlocale/Makefile.am
@@ -0,0 +1,33 @@
+AM_CFLAGS= \
+ -I$(top_srcdir)/include \
+ -I$(top_srcdir)/include/X11 \
+ -I$(top_builddir)/include \
+ -I$(top_builddir)/include/X11 \
+ -I$(top_srcdir)/src/xcms \
+ -I$(top_srcdir)/src/xkb \
+ -I$(top_srcdir)/src/xlibi18n \
+ $(X11_CFLAGS) \
+ $(BIGFONT_CFLAGS) \
+ $(XDMCP_CFLAGS) \
+ -D_BSD_SOURCE
+
+if XLIB_LOADABLE_I18N
+
+commonlibdir = $(X11_LOCALELIBDIR)/common
+commonlib_LTLIBRARIES=xlocale.la
+xlocale_la_LDFLAGS = -module -version-number 2:0:0
+xlocale_la_LIBADD = $(I18N_MODULE_LIBS)
+
+else
+
+noinst_LTLIBRARIES = libxlocale.la
+
+endif
+
+
+xlocale_la_SOURCES = \
+ lcEuc.c \
+ lcJis.c \
+ lcSjis.c
+
+libxlocale_la_SOURCES = $(xlocale_la_SOURCES)
diff --git a/libX11/modules/lc/xlocale/Makefile.in b/libX11/modules/lc/xlocale/Makefile.in
new file mode 100644
index 000000000..c0bba3ee1
--- /dev/null
+++ b/libX11/modules/lc/xlocale/Makefile.in
@@ -0,0 +1,563 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = modules/lc/xlocale
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/config.h \
+ $(top_builddir)/include/X11/XlibConf.h
+CONFIG_CLEAN_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(commonlibdir)"
+commonlibLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(commonlib_LTLIBRARIES) $(noinst_LTLIBRARIES)
+libxlocale_la_LIBADD =
+am__objects_1 = lcEuc.lo lcJis.lo lcSjis.lo
+am_libxlocale_la_OBJECTS = $(am__objects_1)
+libxlocale_la_OBJECTS = $(am_libxlocale_la_OBJECTS)
+@XLIB_LOADABLE_I18N_FALSE@am_libxlocale_la_rpath =
+am__DEPENDENCIES_1 =
+@XLIB_LOADABLE_I18N_TRUE@xlocale_la_DEPENDENCIES = \
+@XLIB_LOADABLE_I18N_TRUE@ $(am__DEPENDENCIES_1)
+am_xlocale_la_OBJECTS = lcEuc.lo lcJis.lo lcSjis.lo
+xlocale_la_OBJECTS = $(am_xlocale_la_OBJECTS)
+xlocale_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(xlocale_la_LDFLAGS) $(LDFLAGS) -o $@
+@XLIB_LOADABLE_I18N_TRUE@am_xlocale_la_rpath = -rpath $(commonlibdir)
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/include/X11
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+SOURCES = $(libxlocale_la_SOURCES) $(xlocale_la_SOURCES)
+DIST_SOURCES = $(libxlocale_la_SOURCES) $(xlocale_la_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ADMIN_MAN_DIR = @ADMIN_MAN_DIR@
+ADMIN_MAN_SUFFIX = @ADMIN_MAN_SUFFIX@
+AMTAR = @AMTAR@
+APP_MAN_DIR = @APP_MAN_DIR@
+APP_MAN_SUFFIX = @APP_MAN_SUFFIX@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BIGFONT_CFLAGS = @BIGFONT_CFLAGS@
+BIGFONT_LIBS = @BIGFONT_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DRIVER_MAN_DIR = @DRIVER_MAN_DIR@
+DRIVER_MAN_SUFFIX = @DRIVER_MAN_SUFFIX@
+DSYMUTIL = @DSYMUTIL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+FILE_MAN_DIR = @FILE_MAN_DIR@
+FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@
+GREP = @GREP@
+I18N_MODULE_LIBS = @I18N_MODULE_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KEYSYMDEF = @KEYSYMDEF@
+LAUNCHD = @LAUNCHD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIB_MAN_DIR = @LIB_MAN_DIR@
+LIB_MAN_SUFFIX = @LIB_MAN_SUFFIX@
+LINT = @LINT@
+LINTLIB = @LINTLIB@
+LINT_FLAGS = @LINT_FLAGS@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MALLOC_ZERO_CFLAGS = @MALLOC_ZERO_CFLAGS@
+MISC_MAN_DIR = @MISC_MAN_DIR@
+MISC_MAN_SUFFIX = @MISC_MAN_SUFFIX@
+MKDIR_P = @MKDIR_P@
+NMEDIT = @NMEDIT@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+RAWCPP = @RAWCPP@
+RAWCPPFLAGS = @RAWCPPFLAGS@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+WCHAR32 = @WCHAR32@
+X11_CFLAGS = @X11_CFLAGS@
+X11_DATADIR = @X11_DATADIR@
+X11_EXTRA_DEPS = @X11_EXTRA_DEPS@
+X11_LIBDIR = @X11_LIBDIR@
+X11_LIBS = @X11_LIBS@
+X11_LOCALEDATADIR = @X11_LOCALEDATADIR@
+X11_LOCALEDIR = @X11_LOCALEDIR@
+X11_LOCALELIBDIR = @X11_LOCALELIBDIR@
+XDMCP_CFLAGS = @XDMCP_CFLAGS@
+XDMCP_LIBS = @XDMCP_LIBS@
+XERRORDB = @XERRORDB@
+XKBPROTO_CFLAGS = @XKBPROTO_CFLAGS@
+XKBPROTO_LIBS = @XKBPROTO_LIBS@
+XKBPROTO_REQUIRES = @XKBPROTO_REQUIRES@
+XKEYSYMDB = @XKEYSYMDB@
+XLOCALEDATADIR = @XLOCALEDATADIR@
+XLOCALEDIR = @XLOCALEDIR@
+XLOCALELIBDIR = @XLOCALELIBDIR@
+XMALLOC_ZERO_CFLAGS = @XMALLOC_ZERO_CFLAGS@
+XPROTO_CFLAGS = @XPROTO_CFLAGS@
+XPROTO_LIBS = @XPROTO_LIBS@
+XTHREADLIB = @XTHREADLIB@
+XTHREADS = @XTHREADS@
+XTHREAD_CFLAGS = @XTHREAD_CFLAGS@
+XTMALLOC_ZERO_CFLAGS = @XTMALLOC_ZERO_CFLAGS@
+XUSE_MTSAFE_API = @XUSE_MTSAFE_API@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AM_CFLAGS = \
+ -I$(top_srcdir)/include \
+ -I$(top_srcdir)/include/X11 \
+ -I$(top_builddir)/include \
+ -I$(top_builddir)/include/X11 \
+ -I$(top_srcdir)/src/xcms \
+ -I$(top_srcdir)/src/xkb \
+ -I$(top_srcdir)/src/xlibi18n \
+ $(X11_CFLAGS) \
+ $(BIGFONT_CFLAGS) \
+ $(XDMCP_CFLAGS) \
+ -D_BSD_SOURCE
+
+@XLIB_LOADABLE_I18N_TRUE@commonlibdir = $(X11_LOCALELIBDIR)/common
+@XLIB_LOADABLE_I18N_TRUE@commonlib_LTLIBRARIES = xlocale.la
+@XLIB_LOADABLE_I18N_TRUE@xlocale_la_LDFLAGS = -module -version-number 2:0:0
+@XLIB_LOADABLE_I18N_TRUE@xlocale_la_LIBADD = $(I18N_MODULE_LIBS)
+@XLIB_LOADABLE_I18N_FALSE@noinst_LTLIBRARIES = libxlocale.la
+xlocale_la_SOURCES = \
+ lcEuc.c \
+ lcJis.c \
+ lcSjis.c
+
+libxlocale_la_SOURCES = $(xlocale_la_SOURCES)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign modules/lc/xlocale/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign modules/lc/xlocale/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-commonlibLTLIBRARIES: $(commonlib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(commonlibdir)" || $(MKDIR_P) "$(DESTDIR)$(commonlibdir)"
+ @list='$(commonlib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(commonlibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(commonlibdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(commonlibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(commonlibdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-commonlibLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(commonlib_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(commonlibdir)/$$p'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(commonlibdir)/$$p"; \
+ done
+
+clean-commonlibLTLIBRARIES:
+ -test -z "$(commonlib_LTLIBRARIES)" || rm -f $(commonlib_LTLIBRARIES)
+ @list='$(commonlib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libxlocale.la: $(libxlocale_la_OBJECTS) $(libxlocale_la_DEPENDENCIES)
+ $(LINK) $(am_libxlocale_la_rpath) $(libxlocale_la_OBJECTS) $(libxlocale_la_LIBADD) $(LIBS)
+xlocale.la: $(xlocale_la_OBJECTS) $(xlocale_la_DEPENDENCIES)
+ $(xlocale_la_LINK) $(am_xlocale_la_rpath) $(xlocale_la_OBJECTS) $(xlocale_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lcEuc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lcJis.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lcSjis.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES)
+installdirs:
+ for dir in "$(DESTDIR)$(commonlibdir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-commonlibLTLIBRARIES clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-commonlibLTLIBRARIES
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-commonlibLTLIBRARIES
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean \
+ clean-commonlibLTLIBRARIES clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-commonlibLTLIBRARIES install-data install-data-am \
+ install-dvi install-dvi-am install-exec install-exec-am \
+ install-html install-html-am install-info install-info-am \
+ install-man install-pdf install-pdf-am install-ps \
+ install-ps-am install-strip installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+ uninstall-am uninstall-commonlibLTLIBRARIES
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/libX11/modules/lc/xlocale/lcEuc.c b/libX11/modules/lc/xlocale/lcEuc.c
new file mode 100644
index 000000000..1b54508be
--- /dev/null
+++ b/libX11/modules/lc/xlocale/lcEuc.c
@@ -0,0 +1,1539 @@
+/* $Xorg: lcEuc.c,v 1.3 2000/08/17 19:45:17 cpqbld Exp $ */
+/******************************************************************
+
+ Copyright 1992, 1993 by FUJITSU LIMITED
+ Copyright 1993 by Fujitsu Open Systems Solutions, Inc.
+
+Permission to use, copy, modify, distribute and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and
+that both that copyright notice and this permission notice appear
+in supporting documentation, and that the name of FUJITSU LIMITED and
+Fujitsu Open Systems Solutions, Inc. not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.
+FUJITSU LIMITED and Fujitsu Open Systems Solutions, Inc. makes no
+representations about the suitability of this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED AND FUJITSU OPEN SYSTEMS SOLUTIONS, INC. DISCLAIMS ALL
+WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL FUJITSU OPEN SYSTEMS
+SOLUTIONS, INC. AND FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT
+OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+OF THIS SOFTWARE.
+
+ Authors: Shigeru Yamada (yamada@ossi.com)
+ Jeffrey Bloomfield (jeffb@ossi.com)
+ Yoshiyuki Segawa (segawa@ossi.com)
+
+*****************************************************************/
+/* $XFree86: xc/lib/X11/lcEuc.c,v 3.12 2003/01/20 04:05:30 dawes Exp $ */
+
+/*
+ * An EUC locale.
+ * Supports: all locales with codeset eucJP, eucKR, eucCN, eucTW.
+ * How: Provides converters for euc*.
+ * Platforms: Only those defining X_LOCALE (only Lynx, Linux-libc5, OS/2).
+ */
+
+#ifdef X_LOCALE
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcGeneric.h"
+
+#include <ctype.h>
+#ifdef WIN32
+#define isascii __isascii
+#endif
+
+#define CS0 codesets[0] /* Codeset 0 - 7-bit ASCII */
+#define CS1 codesets[1] /* Codeset 1 - Kanji */
+#define CS2 codesets[2] /* Codeset 2 - Half-Kana */
+#define CS3 codesets[3] /* Codeset 3 - User defined */
+
+#define SS2 0x8e /* Single-shift char: CS2 */
+#define SS3 0x8f /* Single-shift char: CS3 */
+
+#define ASCII_CODESET 0
+#define KANJI_CODESET 1
+#define KANA_CODESET 2
+#define USERDEF_CODESET 3
+#define MAX_CODESETS
+
+#define GR 0x80 /* begins right-side (non-ascii) region */
+#define GL 0x7f /* ends left-side (ascii) region */
+
+#define isleftside(c) (((c) & GR) ? 0 : 1)
+#define isrightside(c) (!isleftside(c))
+
+#define BIT8OFF(c) ((c) & GL)
+#define BIT8ON(c) ((c) | GR)
+
+typedef unsigned char Uchar;
+typedef unsigned long Ulong;
+typedef unsigned int Uint;
+
+static CodeSet GetCodeSetFromCharSet (XLCd lcd, XlcCharSet charset);
+static CodeSet wc_codeset (XLCd lcd, wchar_t wch);
+
+#define BADCHAR(min_ch, c) (BIT8OFF(c) < (char)min_ch && BIT8OFF(c) != 0x0 && \
+ BIT8OFF(c) != '\t' && BIT8OFF(c) != '\n' && \
+ BIT8OFF(c) != 0x1b)
+
+/*
+ * Notes:
+ * 1. Defining FORCE_INDIRECT_CONVERTER (see _XlcEucLoader())
+ * forces indirect (charset) conversions (e.g. wcstocs()<->cstombs()).
+ * 2. Using direct converters (e.g. mbstowcs()) decreases conversion
+ * times by 20-40% (depends on specific converter used).
+ */
+
+static int
+euc_mbstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd)conv->state;
+
+ Uchar ch;
+ int chr_len = 0;
+ int sshift = False;
+ int shift_mult = 0;
+ Uint chrcode;
+
+ Uint wc_encode = 0;
+ Uint wc_tmp = 0;
+
+ int cs0flg = False;
+ int cs1flg = False;
+ int length = 0;
+ int unconv_num = 0;
+
+ Bool new_char;
+
+ const char *inbufptr = *from;
+ wchar_t *outbufptr = (wchar_t *) *to;
+
+ CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+ int codeset_num = XLC_GENERIC(lcd, codeset_num);
+ Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+ for (new_char = True; *from_left > 0 && *to_left > 0;) {
+
+ ch = *inbufptr++;
+
+ if (isleftside(ch)) { /* CS0 */
+ if (ASCII_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ if( cs0flg == True) {
+ new_char = True;
+ cs0flg = False;
+ }
+ length = CS0->length;
+ *outbufptr++ = (wchar_t)ch;
+ (*from_left)--;
+ (*to_left)--;
+ continue;
+ }
+ else if (ch == SS2) { /* CS2 */
+ if (KANA_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ if (sshift == True || cs1flg == True) {
+ cs1flg = False;
+ unconv_num++;
+ continue;
+ }
+ length = CS2->length;
+ wc_encode = CS2->wc_encoding;
+ chrcode = 0;
+ sshift = True;
+ cs0flg = True;
+ (*from_left)--;
+ continue;
+ }
+ else if (ch == SS3) { /* CS3 */
+ if (USERDEF_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ if (sshift == True || cs1flg == True) {
+ cs1flg = False;
+ unconv_num++;
+ continue;
+ }
+ length = CS3->length;
+ if (*from_left < 1 )
+ unconv_num++;
+ wc_encode = CS3->wc_encoding;
+ chrcode = 0;
+ sshift = True;
+ cs0flg = True;
+ (*from_left)--;
+ continue;
+
+ } else { /* CS1 */
+ if (KANJI_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ if (sshift == False) {
+ length = CS1->length;
+ if (*from_left < 1)
+ unconv_num++;
+ wc_encode = CS1->wc_encoding;
+ }
+ chrcode = BIT8OFF(ch);
+ cs0flg = True;
+ cs1flg = True;
+ (*from_left)--;
+ }
+
+ if (new_char) { /* begin new character */
+ chr_len = length;
+ shift_mult = length - 1;
+ new_char = False;
+ }
+
+ chrcode <<= (wc_shift * shift_mult);
+ shift_mult--;
+ wc_tmp |= chrcode;
+
+ if (--chr_len == 0) {
+ wc_tmp |= wc_encode;
+ *outbufptr++ = wc_tmp;
+ (*to_left)--;
+
+ new_char = True;
+ sshift = False;
+ cs0flg = False;
+ cs1flg = False;
+ wc_tmp = (Uint)0;
+ }
+
+ } /* end for */
+
+ *to = (XPointer)outbufptr;
+
+ if (cs0flg == True || cs1flg == True) /* error check on last char */
+ unconv_num++;
+
+ return unconv_num;
+}
+
+
+static int
+euc_wcstombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const wchar_t *inbufptr = (const wchar_t *) *from;
+ XPointer outbufptr = *to;
+ wchar_t wch;
+ int length;
+ Uchar tmp;
+ int unconv_num = 0;
+
+ XLCd lcd = (XLCd)conv->state;
+ CodeSet codeset;
+ Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+ for (; *from_left > 0 && *to_left > 0; (*from_left)-- ) {
+
+ wch = *inbufptr++;
+
+ if (!(codeset = wc_codeset(lcd, wch))) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+
+ length = codeset->length;
+ wch ^= (wchar_t)codeset->wc_encoding;
+
+ if (codeset->parse_info) { /* put out SS2 or SS3 */
+ if (*to_left < length + 1) {
+ unconv_num++;
+ break;
+ }
+ *outbufptr++ = *codeset->parse_info->encoding;
+ (*to_left)--;
+ } else {
+ if (*to_left < length) {
+ unconv_num++;
+ break;
+ }
+ }
+
+ do {
+ length--;
+ tmp = (wch>>(wchar_t)(length * wc_shift));
+
+ if (codeset->side == XlcGR)
+ tmp = BIT8ON(tmp);
+
+ *outbufptr++ = (Uchar)tmp;
+ (*to_left)--;
+ } while (length);
+ }
+
+ *to = (XPointer)outbufptr;
+
+ return unconv_num;
+}
+
+
+static int
+euc_mbtocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd)conv->state;
+ XlcCharSet charset;
+ CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+ int codeset_num = XLC_GENERIC(lcd, codeset_num);
+ int length;
+ int unconv_num = 0;
+ int min_ch = 0;
+ const char *src = *from;
+ char *dst = *to;
+
+ if (isleftside(*src)) { /* 7-bit (CS0) */
+ if (ASCII_CODESET >= codeset_num)
+ return -1;
+ charset = *CS0->charset_list;
+ }
+ else if ((Uchar)*src == SS2) { /* half-kana (CS2) */
+ if (KANA_CODESET >= codeset_num)
+ return -1;
+ charset = *CS2->charset_list;
+ src++;
+ (*from_left)--;
+ }
+ else if ((Uchar)*src == SS3) { /* user-def */
+ if (USERDEF_CODESET >= codeset_num)
+ return -1;
+ charset = *CS3->charset_list;
+ src++;
+ (*from_left)--;
+ }
+ else { /* Kanji (CS1) */
+ if (KANJI_CODESET >= codeset_num)
+ return -1;
+ charset = *CS1->charset_list;
+ }
+
+ if(*from_left < charset->char_size || *to_left < charset->char_size)
+ return -1;
+
+ min_ch = 0x20;
+ if (charset->set_size == 94)
+ if (charset->char_size > 1 || charset->side == XlcGR)
+ min_ch = 0x21;
+
+ length = charset->char_size;
+ do {
+ if(BADCHAR(min_ch, *src)) {
+ unconv_num++;
+ src++;
+ break;
+ }
+ switch (charset->side) {
+ case XlcGL:
+ *dst++ = BIT8OFF(*src++);
+ break;
+ case XlcGR:
+ *dst++ = BIT8ON(*src++);
+ break;
+ default:
+ *dst++ = *src++;
+ break;
+ }
+ } while (--length);
+
+ *to = dst;
+ *from = (XPointer) src;
+ *from_left -= charset->char_size;
+ *to_left -= charset->char_size - length;
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = charset;
+
+ return unconv_num;
+}
+
+
+static int
+euc_mbstocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const char *tmp_from;
+ char *tmp_to;
+ int tmp_from_left, tmp_to_left;
+ XlcCharSet charset, tmp_charset;
+ XPointer tmp_args[1];
+ int unconv_num = 0, ret;
+
+/* Determine the charset of the segment and convert one characater: */
+
+ tmp_args[0] = (XPointer) &charset; /* charset from euc_mbtocs() */
+ while
+ ((ret = euc_mbtocs(conv, from, from_left, to, to_left, tmp_args, 1)) > 0)
+ unconv_num += ret;
+ if ( ret < 0 )
+ return ret;
+
+ tmp_from = *from;
+ tmp_from_left = *from_left;
+ tmp_to_left = *to_left;
+ tmp_to = *to;
+
+/* Convert remainder of the segment: */
+
+ tmp_args[0] = (XPointer) &tmp_charset;
+ while( (ret = euc_mbtocs(conv, (XPointer *) &tmp_from, &tmp_from_left,
+ (XPointer *) &tmp_to, &tmp_to_left, tmp_args, 1)) >= 0 ) {
+
+ if (ret > 0) {
+ unconv_num += ret;
+ continue;
+ }
+
+ if (tmp_charset != charset) /* quit on end of segment */
+ break;
+
+ *from = (XPointer) tmp_from;
+ *from_left = tmp_from_left;
+ *to = (XPointer) tmp_to;
+ *to_left = tmp_to_left;
+ }
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = charset;
+
+ return unconv_num;
+}
+
+
+static int
+euc_wcstocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd)conv->state;
+ const wchar_t *wcptr = (const wchar_t *) *from;
+ char *bufptr = (char *) *to;
+ wchar_t wch;
+ char *tmpptr;
+ int length;
+ CodeSet codeset;
+ Ulong wc_encoding;
+ int wcstr_len = *from_left, buf_len = *to_left;
+
+ if (!(codeset = wc_codeset(lcd, *wcptr)))
+ return -1;
+
+ wc_encoding = codeset->wc_encoding;
+
+ if (wcstr_len < buf_len / codeset->length)
+ buf_len = wcstr_len * codeset->length;
+
+ for ( ; wcstr_len > 0 && buf_len > 0; wcptr++, wcstr_len--) {
+ wch = *wcptr;
+
+ if ((wch & XLC_GENERIC(lcd, wc_encode_mask)) != wc_encoding)
+ break;
+
+ length = codeset->length;
+
+ buf_len -= length;
+ bufptr += length;
+ tmpptr = bufptr - 1;
+
+ while (length--) {
+ *tmpptr-- = codeset->length == 1 && codeset->side == XlcGR ?
+ BIT8ON(wch) : BIT8OFF(wch);
+ wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits);
+ }
+ }
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = *codeset->charset_list;
+
+ *from_left -= wcptr - (wchar_t *) *from;
+ *from = (XPointer) wcptr;
+
+ *to_left -= bufptr - *to;
+ *to = bufptr;
+
+ return 0;
+}
+
+
+static int
+euc_cstombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd)conv->state;
+ const char *csptr = *from;
+ char *bufptr = *to;
+ int csstr_len = *from_left;
+ int buf_len = *to_left;
+ int length;
+ CodeSet codeset;
+ int cvt_length;
+
+ if (num_args < 1)
+ return -1;
+
+ if (!(codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0])))
+ return -1;
+
+ cvt_length = 0;
+ csstr_len /= codeset->length;
+ buf_len /= codeset->length;
+
+ if (codeset->parse_info)
+ csstr_len *= 2;
+
+ if (csstr_len < buf_len)
+ buf_len = csstr_len;
+
+ cvt_length += buf_len * codeset->length;
+
+ if (bufptr) {
+ while (buf_len--) {
+ if (codeset->parse_info) /* put out SS2 or SS3 */
+ *bufptr++ = *codeset->parse_info->encoding;
+
+ length = codeset->length;
+ while (length--)
+ *bufptr++ = codeset->side == XlcGR ?
+ BIT8ON(*csptr++) : BIT8OFF(*csptr++);
+ }
+ }
+
+ *from_left -= csptr - *from;
+ *from = (XPointer) csptr;
+ if (bufptr)
+ *to += cvt_length;
+ *to_left -= cvt_length;
+
+ return 0;
+}
+
+
+static int
+euc_cstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd)conv->state;
+ const char *csptr = *from;
+ wchar_t *bufptr = (wchar_t *) *to;
+ wchar_t *toptr = (wchar_t *) *to;
+ int csstr_len = *from_left;
+ int buf_len = *to_left;
+ wchar_t wch;
+ int length;
+ Ulong wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
+ CodeSet codeset;
+
+ if (num_args < 1)
+ return -1;
+
+ if (!(codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0])))
+ return -1;
+
+ csstr_len /= codeset->length;
+ if (csstr_len < buf_len)
+ buf_len = csstr_len;
+ *to_left -= buf_len;
+
+ if (bufptr) {
+
+ toptr += buf_len;
+ *to = (XPointer) toptr;
+
+ while (buf_len--) {
+
+ wch = (wchar_t) BIT8OFF(*csptr);
+ csptr++;
+
+ length = codeset->length - 1;
+ while (length--) {
+ wch = (wch << wc_shift_bits) | BIT8OFF(*csptr);
+ csptr++;
+ }
+ *bufptr++ = wch | codeset->wc_encoding;
+ }
+ }
+ *from_left -= csptr - *from;
+ *from = (XPointer) csptr;
+
+ return 0;
+}
+
+
+static CodeSet
+wc_codeset(
+ XLCd lcd,
+ wchar_t wch)
+{
+ CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+ int end = XLC_GENERIC(lcd, codeset_num);
+ Ulong widech = (Ulong)(wch & XLC_GENERIC(lcd, wc_encode_mask));
+
+ for (; --end >= 0; codesets++)
+ if ( widech == (*codesets)->wc_encoding )
+ return *codesets;
+
+ return NULL;
+}
+
+
+static CodeSet
+GetCodeSetFromCharSet(
+ XLCd lcd,
+ XlcCharSet charset)
+{
+ CodeSet *codeset = XLC_GENERIC(lcd, codeset_list);
+ XlcCharSet *charset_list;
+ int codeset_num, num_charsets;
+
+ codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+ for ( ; codeset_num-- > 0; codeset++) {
+ num_charsets = (*codeset)->num_charsets;
+ charset_list = (*codeset)->charset_list;
+
+ for ( ; num_charsets-- > 0; charset_list++)
+ if (*charset_list == charset)
+ return *codeset;
+ }
+
+ return (CodeSet) NULL;
+}
+
+
+static XlcConv
+create_conv(
+ XLCd lcd,
+ XlcConvMethods methods)
+{
+ XlcConv conv;
+
+ conv = (XlcConv) Xmalloc(sizeof(XlcConvRec));
+ if (conv == NULL)
+ return (XlcConv) NULL;
+
+ conv->methods = methods;
+ conv->state = (XPointer) lcd;
+ return conv;
+}
+
+
+/*
+ * Stripped down Direct CT converters for EUC
+ *
+ */
+
+typedef struct _CTDataRec {
+ int side;
+ int length;
+ char *name;
+ Ulong wc_encoding;
+ char sshift;
+ char *ct_encoding;
+ int ct_encoding_len;
+ int set_size;
+ Uchar min_ch;
+ Uchar ct_type;
+} CTDataRec, *CTData;
+
+typedef struct _StateRec {
+ CTData GL_charset;
+ CTData GR_charset;
+ CTData charset;
+} StateRec, *State;
+
+#define CT_STD 0
+#define CT_NSTD 1
+#define CT_DIR 2
+#define CT_EXT0 3
+#define CT_EXT1 4
+#define CT_EXT2 5
+#define CT_VER 6
+
+static CTDataRec ctdata[] =
+{
+ { XlcGL, 1, "ISO8859-1:GL", 0, 0, "\033(B" , 3, 0, 0, CT_STD },
+ { XlcGR, 1, "ISO8859-1:GR", 0, 0, "\033-A" , 3, 0, 0, CT_STD },
+ { XlcGL, 1, "JISX0201.1976-0:GL", 0, 0, "\033(J" , 3, 0, 0, CT_STD },
+ { XlcGR, 1, "JISX0201.1976-0:GR", 0, 0, "\033)I" , 3, 0, 0, CT_STD },
+ { XlcGL, 2, "JISX0208.1983-0:GL", 0, 0, "\033$(B" , 4, 0, 0, CT_STD },
+ { XlcGR, 2, "JISX0208.1983-0:GR", 0, 0, "\033$)B" , 4, 0, 0, CT_STD },
+ { XlcGL, 2, "JISX0212.1990-0:GL", 0, 0, "\033$(D" , 4, 0, 0, CT_STD },
+ { XlcGR, 2, "JISX0212.1990-0:GR", 0, 0, "\033$)D" , 4, 0, 0, CT_STD },
+ { XlcUnknown, 0, "Ignore-Ext-Status?", 0, 0, "\033#" , 2, 0, 0, CT_VER },
+ { XlcUnknown, 0, "NonStd-?-OctetChar", 0, 0, "\033%/0" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 1, "NonStd-1-OctetChar", 0, 0, "\033%/1" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 2, "NonStd-2-OctetChar", 0, 0, "\033%/2" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 3, "NonStd-3-OctetChar", 0, 0, "\033%/3" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 4, "NonStd-4-OctetChar", 0, 0, "\033%/4" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 0, "Extension-2" , 0, 0, "\033%/" , 3, 0, 0, CT_EXT2 },
+ { XlcUnknown, 0, "Extension-0" , 0, 0, "\033" , 1, 0, 0, CT_EXT0 },
+ { XlcUnknown, 0, "Begin-L-to-R-Text", 0, 0, "\2331]" , 3, 0, 0, CT_DIR },
+ { XlcUnknown, 0, "Begin-R-to-L-Text", 0, 0, "\2332]" , 3, 0, 0, CT_DIR },
+ { XlcUnknown, 0, "End-Of-String", 0, 0, "\233]" , 2, 0, 0, CT_DIR },
+ { XlcUnknown, 0, "Extension-1" , 0, 0, "\233" , 1, 0, 0, CT_EXT1 },
+};
+
+/* Note on above table: euc_ctstombs() and euc_ctstowcs() parser depends on
+ * certain table entries occuring in decreasing string length--
+ * 1. CT_EXT2 and CT_EXT0 entries must occur after CT_NSTD entries.
+ * 2. CT_DIR and CT_EXT1 entries must occur after CT_DIR entries.
+ */
+
+static CTData ctd_endp = ctdata + ((sizeof(ctdata) / sizeof(CTDataRec))) - 1;
+static CTData ctdptr[sizeof(ctdata) / sizeof(CTDataRec)];
+
+#define Ascii 0
+#define Kanji 1
+#define Kana 2
+#define Userdef 3
+
+/*
+ * initCTptr(): Set ctdptr[] to point at ctdata[], indexed by codeset_num.
+ */
+static void
+initCTptr(
+ XLCd lcd)
+{
+ int num_codesets = XLC_GENERIC(lcd, codeset_num);
+ int num_charsets;
+ int i, j;
+ CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+ CodeSet codeset;
+ XlcCharSet charset;
+ CTData ctdp = ctdata;
+
+ ctdptr[Ascii] = &ctdata[0]; /* failsafe */
+
+ for (i = 0; i < num_codesets; i++) {
+
+ codeset = codesets[i];
+ num_charsets = codeset->num_charsets;
+
+ for (j = 0; j < num_charsets; j++) {
+
+ charset = codeset->charset_list[j];
+
+ for (ctdp = ctdata; ctdp <= ctd_endp; ctdp++)
+
+ if (! strcmp(ctdp->name, charset->name)) {
+
+ ctdptr[codeset->cs_num] = ctdp;
+
+ ctdptr[codeset->cs_num]->wc_encoding = codeset->wc_encoding;
+
+ ctdptr[codeset->cs_num]->set_size =
+ charset->set_size;
+
+ ctdptr[codeset->cs_num]->min_ch =
+ charset->set_size == 94 &&
+ (ctdptr[codeset->cs_num]->length > 1 ||
+ ctdptr[codeset->cs_num]->side == XlcGR) ? 0x21 : 0x20;
+
+ if (codeset->parse_info) {
+ ctdptr[codeset->cs_num]->sshift =
+ *codeset->parse_info->encoding;
+ }
+
+ break;
+ }
+ }
+ }
+}
+
+
+#define SKIP_I(str) while (*(str) >= 0x20 && *(str) <= 0x2f) (str)++;
+#define SKIP_P(str) while (*(str) >= 0x30 && *(str) <= 0x3f) (str)++;
+
+static int
+euc_ctstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd)conv->state;
+ Ulong wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
+ const char *inbufptr = *from;
+ const char *inbuf_base;
+ wchar_t *outbufptr = (wchar_t *) *to;
+ wchar_t *outbuf_base = outbufptr;
+ int clen, length;
+ int unconv_num = 0;
+ unsigned int ct_seglen = 0;
+ Uchar ct_type = 0;
+ int shift_mult;
+ wchar_t wc_tmp;
+ wchar_t wch;
+ Ulong wc_encoding;
+ CTData ctdp = ctdata;
+ CTData GL_ctdp = ctdp; /* GL ctdp save */
+ CTData GR_ctdp = ctdp; /* GR ctdp save */
+ Bool save_outbuf = True;
+ /* If outbufptr is NULL, doen't save output, but just counts
+ a length to hold the output */
+ if (outbufptr == NULL) save_outbuf = False;
+
+ for (length = ctdata[Ascii].length; *from_left > 0; (*from_left) -= length)
+ {
+ ct_type = CT_STD;
+ /* change GL/GR charset */
+ if(ctdp->side == XlcGR && isleftside(*inbufptr)){
+ /* select GL side */
+ ctdp = GL_ctdp;
+ length = ctdp->length;
+ ct_type = ctdp->ct_type;
+ }else if(ctdp->side == XlcGL && isrightside(*inbufptr)){
+ /* select GR side */
+ ctdp = GR_ctdp;
+ length = ctdp->length;
+ ct_type = ctdp->ct_type;
+ }
+ if (*inbufptr == '\033' || *inbufptr == (char)'\233') {
+ for (ctdp = ctdata; ctdp <= ctd_endp ; ctdp++) {
+
+ if(!strncmp(inbufptr, ctdp->ct_encoding, ctdp->ct_encoding_len))
+ {
+ inbufptr += ctdp->ct_encoding_len;
+ (*from_left) -= ctdp->ct_encoding_len;
+ if (ctdp->length) {
+ length = ctdp->length;
+ if( *from_left < length ) {
+ *to = (XPointer)outbufptr;
+ *to_left -= outbufptr - outbuf_base;
+ return( unconv_num + *from_left );
+ }
+ }
+ ct_type = ctdp->ct_type;
+ if(ctdp->side == XlcGL){
+ GL_ctdp = ctdp; /* save GL ctdp */
+ }else{
+ GR_ctdp = ctdp; /* save GR ctdp */
+ }
+ break;
+ }
+ }
+ if (ctdp > ctd_endp) /* failed to match CT sequence */
+ unconv_num++;
+ }
+
+/* The following code insures that non-standard encodings, direction, extension,
+ * and version strings are ignored; subject to change in future.
+ */
+ switch (ct_type) {
+ case CT_STD:
+ break;
+ case CT_EXT2:
+ inbufptr++;
+ (*from_left)--;
+ case CT_NSTD:
+ ct_seglen = (BIT8OFF(*inbufptr) << 7) + BIT8OFF(*(inbufptr+1)) + 2;
+ inbufptr += ct_seglen;
+ (*from_left) -= ct_seglen;
+ continue;
+ case CT_EXT0:
+ inbuf_base = inbufptr;
+ SKIP_I(inbufptr);
+ inbufptr++;
+ ct_seglen = (unsigned)(inbufptr - inbuf_base);
+ *(from_left) -= ct_seglen;
+ continue;
+ case CT_EXT1:
+ inbuf_base = inbufptr;
+ SKIP_P(inbufptr);
+ SKIP_I(inbufptr);
+ inbufptr++;
+ ct_seglen = (unsigned)(inbufptr - inbuf_base);
+ *(from_left) -= ct_seglen;
+ continue;
+ case CT_DIR:
+ continue;
+ case CT_VER:
+ inbufptr += 2;
+ *(from_left) -= 2;
+ continue;
+ }
+
+ wc_encoding = (ctdp == ctdptr[Kana] && isleftside(*inbufptr)) ?
+ ctdptr[Ascii]->wc_encoding: ctdp->wc_encoding;
+
+ shift_mult = length - 1;
+ wch = (wchar_t)0;
+ clen = length;
+
+ do {
+ wc_tmp = BIT8OFF(*inbufptr++) << (wc_shift_bits * shift_mult);
+ wch |= wc_tmp;
+ shift_mult--;
+ } while (--clen);
+
+ if (save_outbuf == True)
+ *outbufptr++ = wch | wc_encoding;
+ if (--*to_left == 0 && *from_left != length) {
+ *to = (XPointer)outbufptr;
+ unconv_num = *from_left;
+ return unconv_num;
+ }
+ }
+
+ *to = (XPointer)outbufptr;
+
+ return unconv_num;
+
+}
+
+
+#define byte1 (length == codeset->length - 1)
+#define byte2 (byte1 == 0)
+#define kanji (codeset->cs_num == 1)
+#define kana (codeset->cs_num == 2)
+#define userdef (codeset->cs_num == 3)
+
+static int
+euc_wcstocts(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ int ct_len = *to_left;
+ const wchar_t *inbufptr = (const wchar_t *) *from;
+ char *ctptr = *to;
+ XPointer ct_base = ctptr;
+ wchar_t wch;
+ int length;
+ int unconv_num = 0;
+ Uchar tmp;
+ Uchar t1 = 0;
+ int num_conv;
+
+ StateRec ct_state;
+ XLCd lcd = (XLCd)conv->state;
+ CTData charset;
+ CodeSet codeset;
+ Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+/* Initial State: */
+ ct_state.GL_charset = ctdptr[0]; /* Codeset 0 */
+ ct_state.GR_charset = NULL;
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ for (; *from_left > 0 ; (*from_left)-- ) {
+
+ wch = *inbufptr++;
+
+ if (!(codeset = wc_codeset(lcd, wch))) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+
+ charset = ctdptr[codeset->cs_num];
+
+ length = codeset->length;
+ wch ^= (wchar_t)codeset->wc_encoding;
+
+ if ( (charset->side == XlcGR && charset != ct_state.GR_charset) ||
+ (charset->side == XlcGL && charset != ct_state.GL_charset) ) {
+
+ ct_len -= ctdptr[codeset->cs_num]->ct_encoding_len;
+
+ if (ct_len < 0) {
+ unconv_num++;
+ break;
+ }
+
+ if (ctptr) {
+ strcpy(ctptr, ctdptr[codeset->cs_num]->ct_encoding);
+ ctptr += ctdptr[codeset->cs_num]->ct_encoding_len;
+ }
+ }
+
+ if (charset->side == XlcGR) {
+ ct_state.GR_charset = charset;
+ ct_state.GL_charset = NULL;
+ } else if (charset->side == XlcGL) {
+ ct_state.GL_charset = charset;
+ ct_state.GR_charset = NULL;
+ }
+
+ do {
+
+ length--;
+ tmp = wch>>(wchar_t)( (Ulong)length * wc_shift);
+
+ if (kana) {
+ if (BADCHAR(charset->min_ch, (char)tmp)) {
+ unconv_num++;
+ break;
+ }
+ *ctptr++ = (char)BIT8ON(tmp);
+ }
+
+ else if (byte1 && (kanji || userdef))
+ t1 = tmp;
+
+ else if (byte2 && (kanji || userdef)) {
+ if (BADCHAR(charset->min_ch, (char)t1) ||
+ BADCHAR(charset->min_ch, (char)tmp)) {
+ unconv_num++;
+ break;
+ }
+ if (charset->side == XlcGR) {
+ *ctptr++ = (char)BIT8ON(t1);
+ *ctptr++ = (char)BIT8ON(tmp);
+ } else {
+ *ctptr++ = (char)BIT8OFF(t1);
+ *ctptr++ = (char)BIT8OFF(tmp);
+ }
+ }
+
+ else {
+ if (BADCHAR(charset->min_ch, (char)tmp)) {
+ unconv_num++;
+ break;
+ }
+ *ctptr++ = (char)tmp;
+ }
+
+
+ } while (length);
+
+ } /* end for */
+
+ *to = (XPointer)ctptr;
+
+ if ((num_conv = (int)(ctptr - ct_base)) > 0)
+ (*to_left) -= num_conv;
+
+ return unconv_num;
+}
+#undef byte1
+#undef byte2
+#undef kana
+#undef kanji
+#undef userdef
+
+
+#define byte1 (ctdp->length == clen)
+#define kana (ctdp == ctdptr[Kana] && isrightside(*inbufptr))
+/* #define kanji (ctdp == ctdptr[Kanji]) */
+#define kanji (strstr(ctdp->name, "JISX0208"))
+#define userdef (ctdp == ctdptr[Userdef])
+
+static int
+euc_ctstombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ char *inbufptr = *from;
+ XPointer outbufptr = *to;
+ const char *inbuf_base;
+ XPointer outbuf_base = outbufptr;
+ int clen, length;
+ int unconv_num = 0;
+ unsigned int ct_seglen = 0;
+ Uchar ct_type = 0;
+ CTData ctdp = &ctdata[0]; /* default */
+ CTData GL_ctdp = ctdp; /* GL ctdp save */
+ CTData GR_ctdp = ctdp; /* GR ctdp save */
+ Bool save_outbuf = True;
+ /* If outbufptr is NULL, doen't save output, but just counts
+ a length to hold the output */
+ if (outbufptr == NULL) save_outbuf = False;
+
+ for (length = ctdata[Ascii].length; *from_left > 0; (*from_left) -= length)
+ {
+ ct_type = CT_STD;
+ /* change GL/GR charset */
+ if(ctdp->side == XlcGR && isleftside(*inbufptr)){
+ /* select GL side */
+ ctdp = GL_ctdp;
+ length = ctdp->length;
+ ct_type = ctdp->ct_type;
+ }else if(ctdp->side == XlcGL && isrightside(*inbufptr)){
+ /* select GR side */
+ ctdp = GR_ctdp;
+ length = ctdp->length;
+ ct_type = ctdp->ct_type;
+ }
+ if (*inbufptr == '\033' || *inbufptr == (char)'\233') {
+
+ for (ctdp = ctdata; ctdp <= ctd_endp ; ctdp++) {
+
+ if(!strncmp(inbufptr, ctdp->ct_encoding, ctdp->ct_encoding_len))
+ {
+ inbufptr += ctdp->ct_encoding_len;
+ (*from_left) -= ctdp->ct_encoding_len;
+ if (ctdp->length) {
+ length = ctdp->length;
+ if( *from_left < length ) {
+ *to = (XPointer)outbufptr;
+ *to_left -= outbufptr - outbuf_base;
+ return( unconv_num + *from_left );
+ }
+ }
+ ct_type = ctdp->ct_type;
+ if(ctdp->side == XlcGL){
+ GL_ctdp = ctdp; /* save GL ctdp */
+ }else{
+ GR_ctdp = ctdp; /* save GR ctdp */
+ }
+ break;
+ }
+ }
+ if (ctdp > ctd_endp) /* failed to match CT sequence */
+ unconv_num++;
+ }
+
+/* The following code insures that non-standard encodings, direction, extension,
+ * and version strings are ignored; subject to change in future.
+ */
+ switch (ct_type) {
+ case CT_STD:
+ break;
+ case CT_EXT2:
+ inbufptr++;
+ (*from_left)--;
+ case CT_NSTD:
+ ct_seglen = (BIT8OFF(*inbufptr) << 7) + BIT8OFF(*(inbufptr+1)) + 2;
+ inbufptr += ct_seglen;
+ (*from_left) -= ct_seglen;
+ continue;
+ case CT_EXT0:
+ inbuf_base = inbufptr;
+ SKIP_I(inbufptr);
+ inbufptr++;
+ ct_seglen = (unsigned)(inbufptr - inbuf_base);
+ *(from_left) -= ct_seglen;
+ continue;
+ case CT_EXT1:
+ inbuf_base = inbufptr;
+ SKIP_P(inbufptr);
+ SKIP_I(inbufptr);
+ inbufptr++;
+ ct_seglen = (unsigned)(inbufptr - inbuf_base);
+ *(from_left) -= ct_seglen;
+ continue;
+ case CT_DIR:
+ continue;
+ case CT_VER:
+ inbufptr += 2;
+ *(from_left) -= 2;
+ continue;
+ }
+
+ clen = length;
+ do {
+
+ if (byte1) {
+ if (kanji) {
+ /* FIXME: assignment of read-only location */
+ *inbufptr = BIT8ON(*inbufptr);
+ *(inbufptr+1) = BIT8ON(*(inbufptr+1));
+ }
+ else if (kana || userdef) {
+ if (save_outbuf == True) {
+ *outbufptr++ = ctdp->sshift;
+ }
+ (*to_left)--;
+ }
+ }
+ if (save_outbuf == True) {
+ *outbufptr++ = *inbufptr;
+ }
+ (*to_left)--;
+ inbufptr++;
+
+ if (*to_left == 0 && *from_left != length) {
+ *to = (XPointer)outbufptr;
+ unconv_num = *from_left;
+ return unconv_num;
+ }
+ } while (--clen);
+ }
+
+ *to = outbufptr;
+
+ return unconv_num;
+
+}
+#undef byte1
+#undef kana
+#undef kanji
+#undef userdef
+
+
+static int
+euc_mbstocts(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ int ct_len = *to_left;
+ int cs_num;
+ int clen, length = 0;
+ int unconv_num = 0;
+ int num_conv;
+ const char *inbufptr = *from;
+ char *ctptr = *to;
+ XPointer ct_base = ctptr;
+
+ StateRec ct_state;
+ CTData charset;
+ XLCd lcd = (XLCd) conv->state;
+ int codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+/* Initial State: */
+ ct_state.GL_charset = NULL;
+ ct_state.GR_charset = NULL;
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ for (;*from_left > 0; (*from_left) -= length) {
+
+ if (isleftside(*inbufptr)) { /* 7-bit (CS0) */
+ if (ASCII_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ cs_num = Ascii;
+ charset = ctdptr[Ascii];
+ }
+ else if ((Uchar)*inbufptr == SS2) { /* Kana */
+ if (KANA_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ cs_num = Kana;
+ charset = ctdptr[Kana];
+ inbufptr++;
+ (*from_left)--;
+ }
+ else if ((Uchar)*inbufptr == SS3) { /* Userdef */
+ if (USERDEF_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ cs_num = Userdef;
+ charset = ctdptr[Userdef];
+ inbufptr++;
+ (*from_left)--;
+ }
+ else {
+ if (KANJI_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ cs_num = Kanji;
+ charset = ctdptr[Kanji];
+ }
+
+ length = charset->length;
+
+ if (BADCHAR(charset->min_ch, *inbufptr))
+ continue;
+
+ if ( (charset->side == XlcGR && charset != ct_state.GR_charset) ||
+ (charset->side == XlcGL && charset != ct_state.GL_charset) ) {
+
+ ct_len -= ctdptr[cs_num]->ct_encoding_len;
+ if (ct_len < 0) {
+ unconv_num++;
+ break;
+ }
+
+ if (ctptr) {
+ strcpy(ctptr, ctdptr[cs_num]->ct_encoding);
+ ctptr += ctdptr[cs_num]->ct_encoding_len;
+ }
+ }
+
+ if (charset->side == XlcGR) {
+ ct_state.GR_charset = charset;
+ ct_state.GL_charset = NULL;
+ } else if (charset->side == XlcGL) {
+ ct_state.GL_charset = charset;
+ ct_state.GR_charset = NULL;
+ }
+
+ clen = length;
+
+ do {
+ *ctptr++ = charset == ct_state.GR_charset ?
+ BIT8ON(*inbufptr++) : BIT8OFF(*inbufptr++);
+ } while (--clen);
+ }
+
+ *to = (XPointer)ctptr;
+
+ if ((num_conv = (int)(ctptr - ct_base)) > 0)
+ (*to_left) -= num_conv;
+ return unconv_num;
+
+}
+
+
+static void
+close_converter(
+ XlcConv conv)
+{
+ Xfree((char *) conv);
+}
+
+enum { MBSTOCS, WCSTOCS, MBTOCS, CSTOMBS, CSTOWCS, MBSTOWCS, WCSTOMBS,
+ CTSTOWCS, CTSTOMBS, WCSTOCTS, MBSTOCTS };
+
+static XlcConvMethodsRec conv_methods[] = {
+ {close_converter, euc_mbstocs, NULL },
+ {close_converter, euc_wcstocs, NULL },
+ {close_converter, euc_mbtocs, NULL },
+ {close_converter, euc_cstombs, NULL },
+ {close_converter, euc_cstowcs, NULL },
+ {close_converter, euc_mbstowcs, NULL },
+ {close_converter, euc_wcstombs, NULL },
+ {close_converter, euc_ctstowcs, NULL },
+ {close_converter, euc_ctstombs, NULL },
+ {close_converter, euc_wcstocts, NULL },
+ {close_converter, euc_mbstocts, NULL },
+};
+
+
+static XlcConv
+open_mbstocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[MBSTOCS]);
+}
+
+static XlcConv
+open_wcstocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[WCSTOCS]);
+}
+
+static XlcConv
+open_mbtocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[MBTOCS]);
+}
+
+static XlcConv
+open_cstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[CSTOMBS]);
+}
+
+static XlcConv
+open_cstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[CSTOWCS]);
+}
+
+static XlcConv
+open_mbstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[MBSTOWCS]);
+}
+
+static XlcConv
+open_wcstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[WCSTOMBS]);
+}
+
+static XlcConv
+open_ctstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[CTSTOWCS]);
+}
+
+static XlcConv
+open_ctstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[CTSTOMBS]);
+}
+
+static XlcConv
+open_wcstocts(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[WCSTOCTS]);
+}
+
+static XlcConv
+open_mbstocts(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[MBSTOCTS]);
+}
+
+XLCd
+_XlcEucLoader(
+ const char *name)
+{
+ XLCd lcd;
+
+ lcd = _XlcCreateLC(name, _XlcGenericMethods);
+ if (lcd == NULL)
+ return lcd;
+
+ if (!XLC_PUBLIC_PART(lcd)->codeset ||
+ (_XlcNCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "euc", 3))) {
+ _XlcDestroyLC(lcd);
+ return (XLCd) NULL;
+ }
+
+ initCTptr(lcd);
+
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs);
+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs);
+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs);
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbtocs);
+
+#ifndef FORCE_INDIRECT_CONVERTER
+ _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNMultiByte, open_ctstombs);
+ _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar, open_ctstowcs);
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCompoundText, open_mbstocts);
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_mbstowcs);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCompoundText, open_wcstocts);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_wcstombs);
+#endif
+
+ _XlcAddUtf8Converters(lcd);
+
+ return lcd;
+}
+
+#else
+typedef int dummy;
+#endif /* X_LOCALE */
diff --git a/libX11/modules/lc/xlocale/lcJis.c b/libX11/modules/lc/xlocale/lcJis.c
new file mode 100644
index 000000000..bdd46e36e
--- /dev/null
+++ b/libX11/modules/lc/xlocale/lcJis.c
@@ -0,0 +1,947 @@
+/* $Xorg: lcJis.c,v 1.3 2000/08/17 19:45:18 cpqbld Exp $ */
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ *
+ * Author: Katsuhisa Yano TOSHIBA Corp.
+ * mopi@osa.ilab.toshiba.co.jp
+ */
+/* $XFree86: xc/lib/X11/lcJis.c,v 1.9 2002/04/10 16:20:06 tsi Exp $ */
+
+/*
+ * A Japanese JIS locale.
+ * Supports: all locales with codeset JIS7.
+ * How: Provides converters for JIS.
+ * Platforms: Only those defining X_LOCALE (only Lynx, Linux-libc5, OS/2).
+ */
+
+#ifdef X_LOCALE
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcGeneric.h"
+#include <stdio.h>
+
+#if !defined(macII) && !defined(X_LOCALE)
+#define STDCVT
+#endif
+
+typedef struct _StateRec {
+ XLCd lcd;
+ XlcCharSet charset;
+ XlcCharSet GL_charset;
+ XlcCharSet GR_charset;
+} StateRec, *State;
+
+static void
+init_state(
+ XlcConv conv)
+{
+ State state = (State) conv->state;
+ XLCdGenericPart *gen = XLC_GENERIC_PART(state->lcd);
+ CodeSet codeset;
+
+ codeset = gen->initial_state_GL;
+ if (codeset && codeset->charset_list)
+ state->GL_charset = *codeset->charset_list;
+ codeset = gen->initial_state_GR;
+ if (codeset && codeset->charset_list)
+ state->GR_charset = *codeset->charset_list;
+
+ if (state->GL_charset == NULL)
+ if ((codeset = *gen->codeset_list) != NULL)
+ state->GL_charset = *codeset->charset_list;
+}
+
+static int
+compare(
+ const char *src,
+ const char *encoding,
+ int length)
+{
+ const char *start = src;
+
+ while (length-- > 0) {
+ if (*src++ != *encoding++)
+ return 0;
+ if (*encoding == '\0')
+ return src - start;
+ }
+
+ return 0;
+}
+
+static int
+mbtocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ XLCd lcd = state->lcd;
+ const char *src;
+ char *dst;
+ unsigned char *mb_parse_table;
+ ParseInfo *parse_list, parse_info;
+ XlcCharSet charset;
+ int length, number, encoding_len = 0;
+ int i;
+
+ src = *((const char **) from);
+ dst = *((char **) to);
+
+ mb_parse_table = XLC_GENERIC(lcd, mb_parse_table);
+ if (mb_parse_table != NULL) {
+ number = mb_parse_table[(unsigned char) *src];
+ if (number > 0) {
+ parse_list = XLC_GENERIC(lcd, mb_parse_list) + number - 1;
+ for ( ; (parse_info = *parse_list) != NULL; parse_list++) {
+ encoding_len = compare(src, parse_info->encoding, *from_left);
+ if (encoding_len > 0) {
+ switch (parse_info->type) {
+ case E_SS:
+ src += encoding_len;
+ charset = *parse_info->codeset->charset_list;
+ goto found;
+ case E_LSL:
+ case E_LSR:
+ src += encoding_len;
+ charset = *parse_info->codeset->charset_list;
+ if (parse_info->type == E_LSL)
+ state->GL_charset = charset;
+ else
+ state->GR_charset = charset;
+ length = 0;
+ goto end;
+ case E_GL:
+ charset = state->GL_charset;
+ goto found;
+ case E_GR:
+ charset = state->GR_charset;
+ goto found;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if ((*src & 0x80) && state->GR_charset)
+ charset = state->GR_charset;
+ else
+ charset = state->GL_charset;
+
+found:
+ if (charset == NULL ||
+ (num_args == 2 && (XlcCharSet) args[1] != charset))
+ return -1;
+
+ length = charset->char_size;
+ if (length > *from_left - encoding_len)
+ return -1;
+
+ if (dst) {
+ if (length > *to_left)
+ return -1;
+ if (charset->side == XlcGL) {
+ for (i = 0; i < length; i++)
+ *dst++ = *src++ & 0x7f;
+ } else if (charset->side == XlcGR) {
+ for (i = 0; i < length; i++)
+ *dst++ = *src++ | 0x80;
+ } else {
+ for (i = 0; i < length; i++)
+ *dst++ = *src++;
+ }
+ *to = (XPointer) dst;
+ *to_left -= length;
+ }
+end:
+ *from = (XPointer) src;
+ *from_left -= encoding_len + length;
+ state->charset = charset;
+ if (num_args == 1)
+ *((XlcCharSet *) args[0]) = charset;
+
+ return 0;
+}
+
+static int
+mbstocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XlcCharSet charset = NULL;
+ XPointer tmp_args[2], save_from = *from;
+ int ret, unconv_num = 0, tmp_num = 1;
+
+ tmp_args[0] = (XPointer) &charset;
+
+ while (*from_left > 0 && *to_left > 0) {
+ ret = mbtocs(conv, from, from_left, to, to_left, tmp_args, tmp_num);
+ if (ret < 0)
+ break;
+ unconv_num += ret;
+ if (tmp_num == 1 && charset) {
+ tmp_args[1] = (XPointer) charset;
+ tmp_num = 2;
+ }
+ }
+
+ if (save_from == *from)
+ return -1;
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = charset;
+
+ return unconv_num;
+}
+
+static CodeSet
+wc_parse_codeset(
+ XLCd lcd,
+ const wchar_t *wcstr)
+{
+ CodeSet *codeset;
+ unsigned long wc_encoding;
+ int num;
+
+ wc_encoding = *wcstr & XLC_GENERIC(lcd, wc_encode_mask);
+ num = XLC_GENERIC(lcd, codeset_num);
+ codeset = XLC_GENERIC(lcd, codeset_list);
+ while (num-- > 0) {
+ if (wc_encoding == (*codeset)->wc_encoding)
+ return *codeset;
+ codeset++;
+ }
+
+ return NULL;
+}
+
+static int
+wcstocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ XLCd lcd = state->lcd;
+ const wchar_t *wcptr;
+ char *bufptr;
+ wchar_t wch;
+ char *tmpptr;
+ int length;
+ CodeSet codeset;
+ unsigned long wc_encoding;
+ int wcstr_len, buf_len;
+
+ if (from == NULL || *from == NULL)
+ return 0;
+
+ wcptr = *((const wchar_t **) from);
+ bufptr = *((char **) to);
+ wcstr_len = *from_left;
+ buf_len = *to_left;
+
+ codeset = wc_parse_codeset(lcd, wcptr);
+ if (codeset == NULL)
+ return -1;
+ wc_encoding = codeset->wc_encoding;
+
+ if (wcstr_len < buf_len / codeset->length)
+ buf_len = wcstr_len * codeset->length;
+
+ for ( ; wcstr_len > 0 && buf_len > 0; wcptr++, wcstr_len--) {
+ wch = *wcptr;
+ if ((wch & XLC_GENERIC(lcd, wc_encode_mask)) != wc_encoding)
+ break;
+ length = codeset->length;
+ buf_len -= length;
+ bufptr += length;
+
+ tmpptr = bufptr - 1;
+ if ((*codeset->charset_list)->side == XlcGL) {
+ while (length--) {
+ *tmpptr-- = (unsigned char) (wch & 0x7f);
+ wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits);
+ }
+ } else if ((*codeset->charset_list)->side == XlcGR) {
+ while (length--) {
+ *tmpptr-- = (unsigned char) (wch | 0x80);
+ wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits);
+ }
+ } else {
+ while (length--) {
+ *tmpptr-- = (unsigned char) wch;
+ wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits);
+ }
+ }
+ }
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = *codeset->charset_list;
+
+ *from_left -= wcptr - *((wchar_t **) from);
+ *from = (XPointer) wcptr;
+
+ *to_left -= bufptr - *((char **) to);
+ *to = bufptr;
+
+ return 0;
+}
+
+static CodeSet
+GetCodeSetFromCharSet(
+ XLCd lcd,
+ XlcCharSet charset)
+{
+ CodeSet *codeset = XLC_GENERIC(lcd, codeset_list);
+ XlcCharSet *charset_list;
+ int codeset_num, num_charsets;
+
+ codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+ for ( ; codeset_num-- > 0; codeset++) {
+ num_charsets = (*codeset)->num_charsets;
+ charset_list = (*codeset)->charset_list;
+
+ for ( ; num_charsets-- > 0; charset_list++)
+ if (*charset_list == charset)
+ return *codeset;
+ }
+
+ return (CodeSet) NULL;
+}
+
+static int
+cstombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ const char *csptr;
+ char *bufptr;
+ int csstr_len;
+ int buf_len;
+ int num, encoding_len = 0;
+ CodeSet codeset;
+ XlcCharSet charset;
+ EncodingType type;
+ int cvt_length;
+
+ csptr = *((const char **) from);
+ bufptr = *((char **) to);
+ csstr_len = *from_left;
+ buf_len = *to_left;
+
+ if (num_args < 1)
+ return -1;
+
+ charset = (XlcCharSet) args[0];
+
+ codeset = GetCodeSetFromCharSet(state->lcd, charset);
+ if (codeset == NULL)
+ return -1;
+
+ cvt_length = 0;
+ if (codeset->parse_info) {
+ switch (type = codeset->parse_info->type) {
+ case E_SS:
+ encoding_len = strlen(codeset->parse_info->encoding);
+ break;
+ case E_LSL:
+ case E_LSR:
+ if (type == E_LSL) {
+ if (charset == state->GL_charset)
+ break;
+ } else {
+ if (charset == state->GR_charset)
+ break;
+ }
+ encoding_len = strlen(codeset->parse_info->encoding);
+ if (encoding_len > buf_len)
+ return -1;
+ cvt_length += encoding_len;
+ if (bufptr) {
+ strcpy(bufptr, codeset->parse_info->encoding);
+ bufptr += encoding_len;
+ }
+ buf_len -= encoding_len;
+ encoding_len = 0;
+ if (type == E_LSL)
+ state->GL_charset = charset;
+ else
+ state->GR_charset = charset;
+ break;
+ default:
+ break;
+ }
+ }
+
+ csstr_len /= codeset->length;
+ buf_len /= codeset->length + encoding_len;
+ if (csstr_len < buf_len)
+ buf_len = csstr_len;
+
+ cvt_length += buf_len * (encoding_len + codeset->length);
+ if (bufptr) {
+ while (buf_len--) {
+ if (encoding_len) {
+ strcpy(bufptr, codeset->parse_info->encoding);
+ bufptr += encoding_len;
+ }
+ num = codeset->length;
+ if (codeset->side == XlcGL) {
+ while (num--)
+ *bufptr++ = *csptr++ & 0x7f;
+ } else if (codeset->side == XlcGR) {
+ while (num--)
+ *bufptr++ = *csptr++ | 0x80;
+ } else {
+ while (num--)
+ *bufptr++ = *csptr++;
+ }
+ }
+ }
+
+ *from_left -= csptr - *((char **) from);
+ *from = (XPointer) csptr;
+
+ if (bufptr)
+ *to = (XPointer) bufptr;
+ *to_left -= cvt_length;
+
+ return 0;
+}
+
+static int
+cstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ XLCd lcd = state->lcd;
+ const char *csptr;
+ wchar_t *bufptr;
+ int csstr_len;
+ int buf_len;
+ wchar_t wch;
+ unsigned long code_mask, wc_encoding;
+ int num, length, wc_shift_bits;
+ CodeSet codeset;
+
+ csptr = *((const char **) from);
+ bufptr = *((wchar_t **) to);
+ csstr_len = *from_left;
+ buf_len = *to_left;
+
+ if (num_args < 1)
+ return -1;
+
+ codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0]);
+ if (codeset == NULL)
+ return -1;
+
+ length = codeset->length;
+ csstr_len /= length;
+ if (csstr_len < buf_len)
+ buf_len = csstr_len;
+
+ code_mask = ~XLC_GENERIC(lcd, wc_encode_mask);
+ wc_encoding = codeset->wc_encoding;
+ wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
+
+ *to_left -= buf_len;
+
+ if (bufptr) {
+ while (buf_len--) {
+ wch = (wchar_t) (*csptr++ & 0x7f);
+ num = length - 1;
+ while (num--)
+ wch = (wch << wc_shift_bits) | (*csptr++ & 0x7f);
+
+ *bufptr++ = (wch & code_mask) | wc_encoding;
+ }
+ }
+
+ *from_left -= csptr - *((char **) from);
+ *from = (XPointer) csptr;
+
+ if (bufptr)
+ *to = (XPointer) bufptr;
+
+ return 0;
+}
+
+
+static void
+close_converter(
+ XlcConv conv)
+{
+ if (conv->state) {
+ Xfree((char *) conv->state);
+ }
+
+ Xfree((char *) conv);
+}
+
+static XlcConv
+create_conv(
+ XLCd lcd,
+ XlcConvMethods methods)
+{
+ XlcConv conv;
+ State state;
+
+ conv = (XlcConv) Xmalloc(sizeof(XlcConvRec));
+ if (conv == NULL)
+ return (XlcConv) NULL;
+
+ conv->methods = (XlcConvMethods) Xmalloc(sizeof(XlcConvMethodsRec));
+ if (conv->methods == NULL)
+ goto err;
+ *conv->methods = *methods;
+ if (XLC_PUBLIC(lcd, is_state_depend))
+ conv->methods->reset = init_state;
+
+ conv->state = (XPointer) Xmalloc(sizeof(StateRec));
+ if (conv->state == NULL)
+ goto err;
+ bzero((char *) conv->state, sizeof(StateRec));
+
+ state = (State) conv->state;
+ state->lcd = lcd;
+ init_state(conv);
+
+ return conv;
+
+err:
+ close_converter(conv);
+
+ return (XlcConv) NULL;
+}
+
+static XlcConvMethodsRec mbstocs_methods = {
+ close_converter,
+ mbstocs,
+ NULL
+};
+
+static XlcConv
+open_mbstocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &mbstocs_methods);
+}
+
+static XlcConvMethodsRec wcstocs_methods = {
+ close_converter,
+ wcstocs,
+ NULL
+};
+
+static XlcConv
+open_wcstocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &wcstocs_methods);
+}
+
+static XlcConvMethodsRec mbtocs_methods = {
+ close_converter,
+ mbtocs,
+ NULL
+};
+
+static XlcConv
+open_mbtocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &mbtocs_methods);
+}
+
+static XlcConvMethodsRec cstombs_methods = {
+ close_converter,
+ cstombs,
+ NULL
+};
+
+static XlcConv
+open_cstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &cstombs_methods);
+}
+
+static XlcConvMethodsRec cstowcs_methods = {
+ close_converter,
+ cstowcs,
+ NULL
+};
+
+static XlcConv
+open_cstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &cstowcs_methods);
+}
+
+#ifdef STDCVT
+static int
+stdc_mbstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const char *src = *((const char **) from);
+ wchar_t *dst = *((wchar_t **) to);
+ int src_left = *from_left;
+ int dst_left = *to_left;
+ int length;
+
+ while (src_left > 0 && dst_left > 0) {
+ length = mbtowc(dst, src, src_left);
+ if (length < 0)
+ break;
+
+ src += length;
+ src_left -= length;
+ if (dst)
+ dst++;
+ dst_left--;
+
+ if (length == 0) {
+ src++;
+ src_left--;
+ break;
+ }
+ }
+
+ if (*from_left == src_left)
+ return -1;
+
+ *from = (XPointer) src;
+ if (dst)
+ *to = (XPointer) dst;
+ *from_left = src_left;
+ *to_left = dst_left;
+
+ return 0;
+}
+
+static int
+stdc_wcstombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const wchar_t *src = *((const wchar_t **) from);
+ char *dst = *((char **) to);
+ int src_left = *from_left;
+ int dst_left = *to_left;
+ int length;
+
+ while (src_left > 0 && dst_left > 0) {
+ length = wctomb(dst, *src); /* XXX */
+ if (length < 0 || dst_left < length)
+ break;
+
+ src++;
+ src_left--;
+ dst += length;
+ dst_left -= length;
+
+ if (length == 0) {
+ dst++;
+ dst_left--;
+ break;
+ }
+ }
+
+ if (*from_left == src_left)
+ return -1;
+
+ *from = (XPointer) src;
+ *to = (XPointer) dst;
+ *from_left = src_left;
+ *to_left = dst_left;
+
+ return 0;
+}
+
+static int
+stdc_wcstocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const wchar_t *src = *((const wchar_t **) from);
+ wchar_t wch;
+ XlcCharSet charset = NULL;
+ XPointer tmp_args[2], tmp_from, save_from = *from;
+ char tmp[32];
+ int length, ret, src_left = *from_left;
+ int unconv_num = 0, tmp_num = 1;
+
+ tmp_args[0] = (XPointer) &charset;
+
+ while (src_left > 0 && *to_left > 0) {
+ if (wch = *src) {
+ length = wctomb(tmp, wch);
+ } else {
+ length = 1;
+ *tmp = '\0';
+ }
+
+ if (length < 0)
+ break;
+
+ tmp_from = (XPointer) tmp;
+ ret = mbtocs(conv, &tmp_from, &length, to, to_left, tmp_args, tmp_num);
+ if (ret < 0)
+ break;
+ unconv_num += ret;
+ if (tmp_num == 1 && charset) {
+ tmp_args[1] = (XPointer) charset;
+ tmp_num = 2;
+ }
+
+ src++;
+ src_left--;
+ }
+
+ if (save_from == (XPointer) src)
+ return -1;
+
+ *from = (XPointer) src;
+ *from_left = src_left;
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = charset;
+
+ return unconv_num;
+}
+
+#define DefineLocalBuf char local_buf[BUFSIZ]
+#define AllocLocalBuf(length) (length > BUFSIZ ? (char*) Xmalloc(length) : local_buf)
+#define FreeLocalBuf(ptr) if (ptr != local_buf) Xfree(ptr)
+
+static int
+stdc_cstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = ((State) conv->state)->lcd;
+ DefineLocalBuf;
+ XPointer buf, save_buf;
+ int length, left, ret;
+
+ left = length = *to_left * XLC_PUBLIC(lcd, mb_cur_max);
+ buf = save_buf = (XPointer) AllocLocalBuf(length);
+ if (buf == NULL)
+ return -1;
+
+ ret = cstombs(conv, from, from_left, &buf, &left, args, num_args);
+ if (ret < 0)
+ goto err;
+
+ buf = save_buf;
+ length -= left;
+ if (stdc_mbstowcs(conv, &buf, &length, to, to_left, args, num_args) < 0)
+ ret = -1;
+
+err:
+ FreeLocalBuf(save_buf);
+
+ return ret;
+}
+
+static XlcConvMethodsRec stdc_mbstowcs_methods = {
+ close_converter,
+ stdc_mbstowcs,
+ NULL
+};
+
+static XlcConv
+open_stdc_mbstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &stdc_mbstowcs_methods);
+}
+
+static XlcConvMethodsRec stdc_wcstombs_methods = {
+ close_converter,
+ stdc_wcstombs,
+ NULL
+};
+
+static XlcConv
+open_stdc_wcstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &stdc_wcstombs_methods);
+}
+
+static XlcConvMethodsRec stdc_wcstocs_methods = {
+ close_converter,
+ stdc_wcstocs,
+ NULL
+};
+
+static XlcConv
+open_stdc_wcstocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &stdc_wcstocs_methods);
+}
+
+static XlcConvMethodsRec stdc_cstowcs_methods = {
+ close_converter,
+ stdc_cstowcs,
+ NULL
+};
+
+static XlcConv
+open_stdc_cstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &stdc_cstowcs_methods);
+}
+#endif /* STDCVT */
+
+XLCd
+_XlcJisLoader(
+ const char *name)
+{
+ XLCd lcd;
+#ifdef STDCVT
+ XLCdGenericPart *gen;
+#endif
+
+ lcd = _XlcCreateLC(name, _XlcGenericMethods);
+ if (lcd == NULL)
+ return lcd;
+
+ if (!XLC_PUBLIC_PART(lcd)->codeset ||
+ (_XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "JIS7"))) {
+ _XlcDestroyLC(lcd);
+ return (XLCd) NULL;
+ }
+
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbtocs);
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs);
+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs);
+
+#ifdef STDCVT
+ gen = XLC_GENERIC_PART(lcd);
+
+ if (gen->use_stdc_env == True) {
+ _XlcSetConverter(lcd,XlcNMultiByte,lcd,XlcNWideChar,open_stdc_mbstowcs);
+ _XlcSetConverter(lcd,XlcNWideChar,lcd,XlcNMultiByte,open_stdc_wcstombs);
+ }
+ if (gen->force_convert_to_mb == True) {
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet,open_stdc_wcstocs);
+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar,open_stdc_cstowcs);
+ } else {
+#endif
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs);
+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs);
+#ifdef STDCVT
+ }
+#endif
+
+ _XlcAddUtf8Converters(lcd);
+
+ return lcd;
+}
+
+#else
+typedef int dummy;
+#endif /* X_LOCALE */
diff --git a/libX11/modules/lc/xlocale/lcSjis.c b/libX11/modules/lc/xlocale/lcSjis.c
new file mode 100644
index 000000000..6adb2945d
--- /dev/null
+++ b/libX11/modules/lc/xlocale/lcSjis.c
@@ -0,0 +1,1614 @@
+/* $Xorg: lcSjis.c,v 1.3 2000/08/17 19:45:19 cpqbld Exp $ */
+/****************************************************************
+
+ Copyright 1992, 1993 by FUJITSU LIMITED
+ Copyright 1993 by Fujitsu Open Systems Solutions, Inc.
+ Copyright 1994 by Sony Corporation
+
+Permission to use, copy, modify, distribute and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and
+that both that copyright notice and this permission notice appear
+in supporting documentation, and that the name of FUJITSU LIMITED,
+Fujitsu Open Systems Solutions, Inc. and Sony Corporation not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+FUJITSU LIMITED, Fujitsu Open Systems Solutions, Inc. and
+Sony Corporation make no representations about the suitability of
+this software for any purpose. It is provided "as is" without
+express or implied warranty.
+
+FUJITSU LIMITED, FUJITSU OPEN SYSTEMS SOLUTIONS, INC. AND SONY
+CORPORATION DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
+IN NO EVENT SHALL FUJITSU OPEN SYSTEMS SOLUTIONS, INC., FUJITSU LIMITED
+AND SONY CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
+OR PERFORMANCE OF THIS SOFTWARE.
+
+ Authors: Jeffrey Bloomfield (jeffb@ossi.com)
+ Shigeru Yamada (yamada@ossi.com)
+ Yoshiyuki Segawa (segawa@ossi.com)
+ Modifier:Makoto Wakamatsu Sony Corporation
+ makoto@sm.sony.co.jp
+
+*****************************************************************/
+/* $XFree86: xc/lib/X11/lcSjis.c,v 3.9 2002/04/10 16:20:06 tsi Exp $ */
+
+/*
+ * A Japanese SJIS locale.
+ * Supports: all locales with codeset SJIS.
+ * How: Provides converters for SJIS.
+ * Platforms: Only those defining X_LOCALE (only Lynx, Linux-libc5, OS/2).
+ */
+
+#ifdef X_LOCALE
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcGeneric.h"
+
+#include <ctype.h>
+#ifdef WIN32
+#define isascii __isascii
+#endif
+
+#define CS0 codesets[0] /* Codeset 0 - 7-bit ASCII */
+#define CS1 codesets[1] /* Codeset 1 - Kanji */
+#define CS2 codesets[2] /* Codeset 2 - Half-Kana */
+#define CS3 codesets[3] /* Codeset 3 - User defined */
+
+#define ascii (codeset->cs_num == 0)
+#define kanji (codeset->cs_num == 1)
+#define kana (codeset->cs_num == 2)
+#define userdef (codeset->cs_num == 3)
+
+#define ASCII_CODESET 0
+#define KANJI_CODESET 1
+#define KANA_CODESET 2
+#define USERDEF_CODESET 3
+#define MAX_CODESETS 4
+
+#define GR 0x80 /* begins right-side (non-ascii) region */
+#define GL 0x7f /* ends left-side (ascii) region */
+
+#define isleftside(c) (((c) & GR) ? 0 : 1)
+#define isrightside(c) (!isleftside(c))
+
+typedef unsigned char Uchar;
+typedef unsigned long Ulong;
+typedef unsigned int Uint;
+
+/* Acceptable range for 2nd byte of SJIS multibyte char */
+#define VALID_MULTIBYTE(c) \
+ ((0x40<=((Uchar)c) && ((Uchar)c)<=0x7e) \
+ || (0x80<=((Uchar)c) && ((Uchar)c)<=0xfc))
+
+#ifndef iskanji
+#define iskanji(c) ((0x81<=((Uchar)c) && ((Uchar)c)<=0x9f) \
+ || (0xe0<=((Uchar)c) && ((Uchar)c)<=0xef))
+#endif /* !iskanji */
+
+#ifndef iskana
+#define iskana(c) (0xa1<=((Uchar)c) && ((Uchar)c)<=0xdf)
+#endif /* !iskana */
+
+#define isuserdef(c) (0xf0<=((Uchar)c) && ((Uchar)c)<=0xfc)
+
+#define BIT8OFF(c) ((c) & GL)
+#define BIT8ON(c) ((c) | GR)
+
+
+static void jis_to_sjis (Uchar *p1, Uchar *p2);
+static void sjis_to_jis (Uchar *p1, Uchar *p2);
+static CodeSet wc_codeset (XLCd lcd, wchar_t wch);
+
+
+/*
+ * Notes:
+ * 1. 16-bit widechar format is limited to 14 data bits. Since the 2nd byte
+ * of SJIS multibyte chars are in the ranges of 0x40 - 7E and 0x80 - 0xFC,
+ * SJIS cannot map directly into 16 bit widechar format within the confines
+ * of a single codeset. Therefore, for SJIS widechar conversion, SJIS Kanji
+ * is mapped into the JIS codeset. (The algorithms used in jis_to_sjis()
+ * and sjis_to_jis() are from Ken Lunde (lunde@mv.us.adobe.com) and are in
+ * the public domain.)
+ * 2. Defining FORCE_INDIRECT_CONVERTER (see _XlcEucLoader())
+ * forces indirect (charset) conversions (e.g. wcstocs()<->cstombs()).
+ * 3. Using direct converters (e.g. mbstowcs()) decreases conversion
+ * times by 20-40% (depends on specific converter used).
+ */
+
+
+static int
+sjis_mbstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+
+ XLCd lcd = (XLCd)conv->state;
+
+ int chr_len = 0;
+ int shift_mult = 0;
+ Uint chrcode = 0;
+
+ Uchar ch, ch2;
+ Uint wc_encode = 0;
+ Uint wc_tmp = 0;
+
+ Bool new_char;
+
+ int firstbyte;
+ int length = 0;
+ int num_conv;
+ int unconv_num = 0;
+
+ const char *inbufptr = *from;
+ wchar_t *outbufptr = (wchar_t *) *to;
+ wchar_t *outbuf_base = outbufptr;
+
+ CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+ int codeset_num = XLC_GENERIC(lcd, codeset_num);
+ Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ for (new_char = True, firstbyte = True; *from_left > 0; (*from_left)--) {
+
+ ch = *inbufptr++;
+
+ if (firstbyte) {
+ if (ASCII_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ if (isascii(ch)) {
+ length = CS0->length;
+ *outbufptr++ = (wchar_t)ch;
+ continue;
+ }
+ else if (iskanji(ch)) {
+ if (KANJI_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ firstbyte = False;
+ length = CS1->length;
+ if (*from_left < length || *to_left < length)
+ return -1;
+ wc_encode = CS1->wc_encoding;
+ ch2 = *inbufptr;
+ sjis_to_jis(&ch, &ch2);
+ chrcode = ch;
+ }
+ else if (iskana(ch)) {
+ if (KANA_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ length = CS2->length;
+ wc_encode = CS2->wc_encoding;
+ chrcode = BIT8OFF(ch);
+ }
+ else if (isuserdef(ch)) {
+ if (USERDEF_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ firstbyte = False;
+ length = CS3->length;
+ if (*from_left < length || *to_left < length)
+ return -1;
+ wc_encode = CS3->wc_encoding;
+ ch2 = *inbufptr;
+ sjis_to_jis(&ch, &ch2);
+ chrcode = ch;
+ }
+ else /* unknown */ {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ } else { /* 2nd byte of multibyte char */
+ if (!VALID_MULTIBYTE((Uchar) *(inbufptr-1))) {
+ unconv_num++;
+ firstbyte = True;
+ }
+ chrcode = ch2;
+ }
+
+ if (new_char) {
+ chr_len = length;
+ shift_mult = length - 1;
+ new_char = False;
+ }
+
+ chrcode <<= (wc_shift * shift_mult);
+ shift_mult--;
+ wc_tmp |= chrcode;
+ if (--chr_len == 0) {
+ wc_tmp |= wc_encode;
+ *outbufptr++ = wc_tmp;
+
+ firstbyte = True;
+ new_char = True;
+ wc_tmp = (Uint)0;
+ }
+
+ } /* end for */
+
+ *to = (XPointer)outbufptr;
+
+ if ((num_conv = outbufptr - outbuf_base) > 0)
+ (*to_left) -= num_conv;
+
+ return unconv_num;
+}
+
+
+#define byte1 (length == codeset->length - 1)
+#define byte2 (byte1 == 0)
+
+static int
+sjis_wcstombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const wchar_t *inbufptr = (const wchar_t *) *from;
+ XPointer outbufptr = *to;
+ XPointer outbuf_base = outbufptr;
+ wchar_t wch;
+ int length;
+ Uchar tmp;
+ Uchar t1, t2;
+ int num_conv;
+ int unconv_num = 0;
+
+ XLCd lcd = (XLCd)conv->state;
+ CodeSet codeset;
+ Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ for (; *from_left > 0 ; (*from_left)-- ) {
+
+ wch = *inbufptr++;
+
+ if (!(codeset = wc_codeset(lcd, wch))) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+
+ length = codeset->length;
+ wch ^= (wchar_t)codeset->wc_encoding;
+
+ do {
+ length--;
+ tmp = wch>>(wchar_t)( (Ulong)length * wc_shift);
+
+ if (kana)
+ tmp = BIT8ON(tmp);
+
+ else if (byte1 && (kanji || userdef)) {
+ t1 = BIT8OFF(tmp);
+ continue;
+ }
+
+ else if (byte2 && (kanji || userdef)) {
+ t2 = BIT8OFF(tmp);
+ jis_to_sjis(&t1, &t2);
+ *outbufptr++ = (char)t1;
+ tmp = t2;
+ }
+
+ *outbufptr++ = (char)tmp;
+ } while (length);
+
+ } /* end for */
+
+ *to = (XPointer)outbufptr;
+
+ if ((num_conv = (int)(outbufptr - outbuf_base)) > 0)
+ (*to_left) -= num_conv;
+
+ return unconv_num;
+}
+#undef byte1
+#undef byte2
+
+/*
+ * sjis<->jis conversion for widechar kanji (See Note at top of file)
+ */
+static void
+sjis_to_jis(
+ Uchar *p1,
+ Uchar *p2)
+{
+ Uchar c1 = *p1;
+ Uchar c2 = *p2;
+ Uchar adjust = c2 < 0x9f;
+ Uchar rowOffset = c1 < 0xa0 ? 0x70 : 0xb0;
+ Uchar cellOffset = adjust ? (0x1f + (c2 > 0x7f)) : 0x7e;
+
+ *p1 = ((c1 - rowOffset) << 1) - adjust;
+ *p2 -= cellOffset;
+}
+
+static void
+jis_to_sjis(
+ Uchar *p1,
+ Uchar *p2)
+{
+ Uchar c1 = *p1;
+ Uchar c2 = *p2;
+ Uchar rowOffset = c1 < 0x5f ? 0x70 : 0xb0;
+ Uchar cellOffset = c1 % 2 ? 0x1f + (c2 > 0x5f) : 0x7e;
+
+ *p1 = ((Uchar)(c1 + 1) >> 1) + rowOffset;
+ *p2 = c2 + cellOffset;
+}
+
+static CodeSet
+wc_codeset(
+ XLCd lcd,
+ wchar_t wch)
+{
+ CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+#if !defined(__sony_news) || defined(SVR4)
+ int end = XLC_GENERIC(lcd, codeset_num);
+ Ulong widech = (Ulong)(wch & XLC_GENERIC(lcd, wc_encode_mask));
+
+ for (; --end >= 0; codesets++)
+ if ( widech == (*codesets)->wc_encoding )
+ return *codesets;
+
+ return NULL;
+#else
+ if( iskanji(wch >> 8) )
+ return( codesets[1] );
+ if( iskana(wch & 0xff) )
+ return( codesets[2] );
+ return( codesets[0] );
+#endif
+}
+
+
+static int
+sjis_mbtocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd)conv->state;
+ XlcCharSet charset = NULL;
+ int char_size = 0;
+ int unconv_num = 0;
+ const char *src = *from;
+ char *dst = *to;
+ CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+ int codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+ if (iskanji(*src)) {
+ if (KANJI_CODESET >= codeset_num)
+ return -1;
+ charset = *CS1->charset_list;
+ char_size = charset->char_size;
+
+ if (*from_left >= char_size && *to_left >= char_size) {
+ *dst++ = *src++;
+ *dst++ = *src++;
+ if (!VALID_MULTIBYTE((Uchar) *(src-1))) /* check 2nd byte */
+ unconv_num++;
+ sjis_to_jis((Uchar *)(dst-2), (Uchar *)(dst-1));
+ } else
+ return -1;
+ }
+ else if (isuserdef(*src)) {
+ if (USERDEF_CODESET >= codeset_num)
+ return -1;
+ charset = *CS3->charset_list;
+ char_size = charset->char_size;
+
+ if (*from_left >= char_size && *to_left >= char_size) {
+ *dst++ = *src++;
+ *dst++ = *src++;
+ if (!VALID_MULTIBYTE((Uchar) *(src-1))) /* check 2nd byte */
+ unconv_num++;
+ sjis_to_jis((Uchar *)(dst-2), (Uchar *)(dst-1));
+ } else
+ return -1;
+ }
+ else if (isascii(*src)) {
+ if (ASCII_CODESET >= codeset_num)
+ return -1;
+ charset = *CS0->charset_list;
+ char_size = charset->char_size;
+
+ if (*from_left >= char_size && *to_left >= char_size)
+ *dst++ = *src++;
+ else
+ return -1;
+ }
+ else if (iskana(*src)) {
+ if (KANA_CODESET >= codeset_num)
+ return -1;
+ charset = *CS2->charset_list;
+ char_size = charset->char_size;
+
+ if (*from_left >= char_size && *to_left >= char_size)
+ *dst++ = *src++;
+ else
+ return -1;
+ }
+ else /* unknown */
+ return -1;
+
+ *from_left -= char_size;
+ *to_left -= char_size;
+
+ *to = (XPointer) dst;
+ *from = (XPointer) src;
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = charset;
+
+ return unconv_num;
+}
+
+
+static int
+sjis_mbstocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const char *tmp_from;
+ char *tmp_to;
+ int tmp_from_left, tmp_to_left;
+ XlcCharSet charset, tmp_charset;
+ XPointer tmp_args[1];
+ int unconv_num = 0, ret;
+
+/* Determine the charset of the segment and convert one character: */
+
+ tmp_args[0] = (XPointer) &charset; /* charset from sjis_mbtocs() */
+ while
+ ((ret = sjis_mbtocs(conv, from, from_left, to, to_left, tmp_args, 1)) > 0)
+ unconv_num += ret;
+ if ( ret < 0 )
+ return ret;
+
+ tmp_from = *from;
+ tmp_from_left = *from_left;
+ tmp_to_left = *to_left;
+ tmp_to = *to;
+
+/* Convert remainder of the segment: */
+
+ tmp_args[0] = (XPointer) &tmp_charset;
+ while( (ret = sjis_mbtocs(conv, (XPointer *) &tmp_from, &tmp_from_left,
+ (XPointer *) &tmp_to, &tmp_to_left, tmp_args, 1)) >= 0 ) {
+
+ if (ret > 0) {
+ unconv_num += ret;
+ continue;
+ }
+
+ if (tmp_charset != charset) /* quit on end of segment */
+ break;
+
+ *from = (XPointer) tmp_from;
+ *from_left = tmp_from_left;
+ *to = (XPointer) tmp_to;
+ *to_left = tmp_to_left;
+ }
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = charset;
+
+ return unconv_num;
+}
+
+static int
+sjis_wcstocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd) conv->state;
+ const wchar_t *wcptr = *((const wchar_t **)from);
+ char *bufptr = *((char **) to);
+ wchar_t wch;
+ char *tmpptr;
+ int length;
+ CodeSet codeset;
+ Ulong wc_encoding;
+ int buf_len = *to_left;
+ int wcstr_len = *from_left;
+
+ if (!(codeset = wc_codeset(lcd, *wcptr)))
+ return -1;
+
+ if (wcstr_len < buf_len / codeset->length)
+ buf_len = wcstr_len * codeset->length;
+
+#if !defined(__sony_news) || defined(SVR4)
+ wc_encoding = codeset->wc_encoding;
+
+ for ( ; wcstr_len > 0 && buf_len > 0; wcptr++, wcstr_len--) {
+ wch = *wcptr;
+
+ if ((wch & XLC_GENERIC(lcd, wc_encode_mask)) != wc_encoding)
+ break;
+
+ length = codeset->length;
+
+ buf_len -= length;
+ bufptr += length;
+ tmpptr = bufptr - 1;
+
+ while (length--) {
+ *tmpptr-- = kana ? BIT8ON(wch) : BIT8OFF(wch);
+ wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits);
+ }
+ }
+#else
+ length = codeset->length;
+ for( ; wcstr_len > 0 && buf_len > 0; wcptr++, wcstr_len-- ) {
+ wch = *wcptr;
+ if( codeset != wc_codeset( lcd, wch ) )
+ break;
+
+ buf_len -= length;
+ if( length == 2 ) {
+ unsigned short code;
+
+ code = sjis2jis( wch & 0xffff );
+ *bufptr++ = code >> 8;
+ *bufptr++ = code & 0xff;
+ }
+ else
+ *bufptr++ = wch & 0xff;
+ }
+#endif
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = *codeset->charset_list;
+
+ *from_left -= wcptr - (wchar_t *) *from;
+ *from = (XPointer) wcptr;
+
+ *to_left -= bufptr - *to;
+ *to = bufptr;
+
+ return 0;
+}
+
+static CodeSet
+GetCodeSetFromCharSet(
+ XLCd lcd,
+ XlcCharSet charset)
+{
+ CodeSet *codeset = XLC_GENERIC(lcd, codeset_list);
+ XlcCharSet *charset_list;
+ int codeset_num, num_charsets;
+
+ codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+ for ( ; codeset_num-- > 0; codeset++) {
+ num_charsets = (*codeset)->num_charsets;
+ charset_list = (*codeset)->charset_list;
+
+ for ( ; num_charsets-- > 0; charset_list++)
+ if (*charset_list == charset)
+ return *codeset;
+ }
+
+ return (CodeSet) NULL;
+}
+
+
+static int
+sjis_cstombs(
+ XlcConv conv,
+ char **from,
+ int *from_left,
+ char **to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd) conv->state;
+ const char *csptr = *from;
+ char *bufptr = *to;
+ int csstr_len = *from_left;
+ int buf_len = *to_left;
+ int length;
+ CodeSet codeset;
+ int cvt_length = 0;
+
+ if (num_args < 1)
+ return -1;
+
+ if (!(codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0])))
+ return -1;
+
+ csstr_len /= codeset->length;
+ buf_len /= codeset->length;
+ if (csstr_len < buf_len)
+ buf_len = csstr_len;
+
+ cvt_length += buf_len * codeset->length;
+
+ if (bufptr) {
+ while (buf_len--) {
+ length = codeset->length;
+ while (length--)
+ *bufptr++ = codeset->length == 1 && codeset->side == XlcGR ?
+ BIT8ON(*csptr++) : BIT8OFF(*csptr++);
+
+ if (codeset->length == 2)
+ jis_to_sjis((Uchar *)(bufptr-2), (Uchar *)(bufptr-1));
+ }
+ }
+
+ *from_left -= csptr - *from;
+ *from = (XPointer) csptr;
+
+ if (bufptr)
+ *to += cvt_length;
+ *to_left -= cvt_length;
+
+
+ return 0;
+}
+
+static int
+sjis_cstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd) conv->state;
+ const char *csptr = (const char *) *from;
+ wchar_t *bufptr = (wchar_t *) *to;
+ wchar_t *toptr = (wchar_t *) *to;
+ int csstr_len = *from_left;
+ int buf_len = *to_left;
+ wchar_t wch;
+ int length;
+ Ulong wc_shift_bits = (int)XLC_GENERIC(lcd, wc_shift_bits);
+ CodeSet codeset;
+
+ if (num_args < 1)
+ return -1;
+
+ if (!(codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0])))
+ return -1;
+
+ csstr_len /= codeset->length;
+ if (csstr_len < buf_len)
+ buf_len = csstr_len;
+
+ *to_left -= buf_len;
+
+ if (bufptr) {
+
+ toptr += buf_len;
+ *to = (XPointer) toptr;
+
+ while (buf_len--) {
+ wch = (wchar_t) BIT8OFF(*csptr);
+ csptr++;
+
+ length = codeset->length - 1;
+ while (length--) {
+ wch = (wch << wc_shift_bits) | BIT8OFF(*csptr);
+ csptr++;
+ }
+ *bufptr++ = wch | codeset->wc_encoding;
+ }
+ }
+
+ *from_left -= csptr - *from;
+ *from = (XPointer) csptr;
+
+ return 0;
+}
+
+
+/*
+ * Stripped down Direct CT converters for SJIS
+ *
+ */
+
+#define BADCHAR(min_ch, c) (BIT8OFF(c) < (char)min_ch && BIT8OFF(c) != 0x0 && \
+ BIT8OFF(c) != '\t' && BIT8OFF(c) != '\n' && \
+ BIT8OFF(c) != 0x1b)
+
+typedef struct _CTDataRec {
+ int side;
+ int length;
+ char *name;
+ Ulong wc_encoding;
+ char *ct_encoding;
+ int ct_encoding_len;
+ int set_size;
+ Uchar min_ch;
+ Uchar ct_type;
+} CTDataRec, *CTData;
+
+typedef struct _StateRec {
+ CTData GL_charset;
+ CTData GR_charset;
+ CTData charset;
+} StateRec, *State;
+
+#define CT_STD 0
+#define CT_NSTD 1
+#define CT_DIR 2
+#define CT_EXT0 3
+#define CT_EXT1 4
+#define CT_EXT2 5
+#define CT_VER 6
+
+static CTDataRec ctdata[] =
+{
+ { XlcGL, 1, "ISO8859-1:GL", 0, "\033(B" , 3, 0, 0, CT_STD },
+ { XlcGR, 1, "ISO8859-1:GR", 0, "\033-A" , 3, 0, 0, CT_STD },
+ { XlcGL, 1, "JISX0201.1976-0:GL", 0, "\033(J" , 3, 0, 0, CT_STD },
+ { XlcGR, 1, "JISX0201.1976-0:GR", 0, "\033)I" , 3, 0, 0, CT_STD },
+ { XlcGL, 2, "JISX0208.1983-0:GL", 0, "\033$(B" , 4, 0, 0, CT_STD },
+ { XlcGR, 2, "JISX0208.1983-0:GR", 0, "\033$)B" , 4, 0, 0, CT_STD },
+ { XlcGL, 2, "JISX0212.1990-0:GL", 0, "\033$(D" , 4, 0, 0, CT_STD },
+ { XlcGR, 2, "JISX0212.1990-0:GR", 0, "\033$)D" , 4, 0, 0, CT_STD },
+ { XlcUnknown, 0, "Ignore-Ext-Status?", 0, "\033#" , 2, 0, 0, CT_VER },
+ { XlcUnknown, 0, "NonStd-?-OctetChar", 0, "\033%/0" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 1, "NonStd-1-OctetChar", 0, "\033%/1" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 2, "NonStd-2-OctetChar", 0, "\033%/2" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 3, "NonStd-3-OctetChar", 0, "\033%/3" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 4, "NonStd-4-OctetChar", 0, "\033%/4" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 0, "Extension-2" , 0, "\033%/" , 3, 0, 0, CT_EXT2 },
+ { XlcUnknown, 0, "Extension-0" , 0, "\033" , 1, 0, 0, CT_EXT0 },
+ { XlcUnknown, 0, "Begin-L-to-R-Text", 0, "\2331]" , 3, 0, 0, CT_DIR },
+ { XlcUnknown, 0, "Begin-R-to-L-Text", 0, "\2332]" , 3, 0, 0, CT_DIR },
+ { XlcUnknown, 0, "End-Of-String", 0, "\233]" , 2, 0, 0, CT_DIR },
+ { XlcUnknown, 0, "Extension-1" , 0, "\233" , 1, 0, 0, CT_EXT1 },
+};
+
+/* Note on above table: sjis_ctstombs() and sjis_ctstowcs() parser depends on
+ * certain table entries occuring in decreasing string length--
+ * 1. CT_EXT2 and CT_EXT0 entries must occur after CT_NSTD entries.
+ * 2. CT_DIR and CT_EXT1 entries must occur after CT_DIR entries.
+ */
+
+static CTData ctdptr[sizeof(ctdata) / sizeof(CTDataRec)];
+static CTData ctd_endp = ctdata + ((sizeof(ctdata) / sizeof(CTDataRec))) - 1;
+
+#define Ascii 0
+#define Kanji 1
+#define Kana 2
+#define Userdef 3
+
+/*
+ * initCTptr(): Set ctptr[] to point at ctdata[], indexed by codeset_num.
+ */
+static void
+initCTptr(
+ XLCd lcd)
+{
+ int num_codesets = XLC_GENERIC(lcd, codeset_num);
+ int num_charsets;
+ int i, j;
+ CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+ CodeSet codeset;
+ XlcCharSet charset;
+ CTData ctdp = ctdata;
+
+ ctdptr[Ascii] = &ctdata[0]; /* failsafe */
+
+ for (i = 0; i < num_codesets; i++) {
+
+ codeset = codesets[i];
+ num_charsets = codeset->num_charsets;
+
+ for (j = 0; j < num_charsets; j++) {
+
+ charset = codeset->charset_list[j];
+
+ for (ctdp = ctdata; ctdp <= ctd_endp; ctdp++)
+
+ if (! strcmp(ctdp->name, charset->name)) {
+
+ ctdptr[codeset->cs_num] = ctdp;
+
+ ctdptr[codeset->cs_num]->wc_encoding = codeset->wc_encoding;
+
+ ctdptr[codeset->cs_num]->set_size =
+ charset->set_size;
+
+ ctdptr[codeset->cs_num]->min_ch =
+ charset->set_size == 94 &&
+ (ctdptr[codeset->cs_num]->length > 1 ||
+ ctdptr[codeset->cs_num]->side == XlcGR) ? 0x21 : 0x20;
+
+ break;
+ }
+ }
+ }
+}
+
+
+static int
+sjis_mbstocts(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ int ct_len = *to_left;
+ int cs_num;
+ int clen;
+ int unconv_num = 0;
+ int num_conv;
+ const char *inbufptr = *from;
+ char *ctptr = *to;
+ XPointer ct_base = ctptr;
+
+ StateRec ct_state;
+ CTData charset = NULL;
+ XLCd lcd = (XLCd) conv->state;
+ int codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+/* Initial State: */
+
+ ct_state.GL_charset = ctdptr[Ascii];
+ ct_state.GR_charset = NULL;
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ for (;*from_left > 0; (*from_left) -= charset->length) {
+
+ if (iskanji(*inbufptr)) {
+ if (KANJI_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ cs_num = Kanji;
+ charset = ctdptr[Kanji];
+ if (!VALID_MULTIBYTE((Uchar) *(inbufptr+1)))
+ unconv_num++;
+ }
+ else if (isuserdef(*inbufptr)) {
+ if (USERDEF_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ cs_num = Userdef;
+ charset = ctdptr[Userdef];
+ if (!VALID_MULTIBYTE((Uchar) *(inbufptr+1)))
+ unconv_num++;
+ }
+ else if (isascii(*inbufptr)) {
+ if (ASCII_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ cs_num = Ascii;
+ charset = ctdptr[Ascii];
+ }
+ else if (iskana(*inbufptr)) {
+ if (KANA_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ cs_num = Kana;
+ charset = ctdptr[Kana];
+ }
+ else { /* unknown */
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+
+ if ( (charset->side == XlcGR && charset != ct_state.GR_charset) ||
+ (charset->side == XlcGL && charset != ct_state.GL_charset) ) {
+
+ ct_len -= ctdptr[cs_num]->ct_encoding_len;
+ if (ct_len < 0) {
+ unconv_num++;
+ break;
+ }
+
+ if (ctptr) {
+ strcpy(ctptr, ctdptr[cs_num]->ct_encoding);
+ ctptr += ctdptr[cs_num]->ct_encoding_len;
+ }
+ }
+
+ clen = charset->length;
+ do {
+ *ctptr++ = *inbufptr++;
+ } while (--clen);
+
+ if (charset->length >= 2) {
+ sjis_to_jis((Uchar *)(ctptr-2), (Uchar *)(ctptr-1));
+ if (BADCHAR(charset->min_ch, *(ctptr-2)) ||
+ BADCHAR(charset->min_ch, *(ctptr-1))) {
+ unconv_num++;
+ continue;
+ }
+ }
+ else
+ if (BADCHAR(charset->min_ch, *(ctptr-1))) {
+ unconv_num++;
+ continue;
+ }
+
+ if (charset->side == XlcGR)
+ ct_state.GR_charset = charset;
+ else if (charset->side == XlcGL)
+ ct_state.GL_charset = charset;
+
+ if (charset->side == XlcGR) {
+ clen = charset->length;
+ do {
+ (*(Uchar *)(ctptr-clen)) = BIT8ON(*(Uchar *)(ctptr-clen));
+ } while (--clen);
+ }
+ }
+
+ *to = (XPointer)ctptr;
+
+ if ((num_conv = (int)(ctptr - ct_base)) > 0)
+ (*to_left) -= num_conv;
+
+ return unconv_num;
+
+}
+
+
+#define byte1 (length == codeset->length - 1)
+#define byte2 (byte1 == 0)
+
+static int
+sjis_wcstocts(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ int ct_len = *to_left;
+ const wchar_t *inbufptr = (const wchar_t *) *from;
+ char *ctptr = *to;
+ XPointer ct_base = ctptr;
+ wchar_t wch;
+ int length;
+ Uchar tmp;
+ Uchar t1 = 0;
+ int num_conv;
+
+ StateRec ct_state;
+ XLCd lcd = (XLCd)conv->state;
+ CTData charset;
+ CodeSet codeset;
+ int unconv_num = 0;
+ Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+/* Initial State: */
+ ct_state.GL_charset = ctdptr[0]; /* Codeset 0 */
+ ct_state.GR_charset = NULL;
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ for (; *from_left > 0 ; (*from_left)-- ) {
+
+ wch = *inbufptr++;
+
+ if (!(codeset = wc_codeset(lcd, wch))) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+
+ charset = ctdptr[codeset->cs_num];
+
+ length = codeset->length;
+ wch ^= (wchar_t)codeset->wc_encoding;
+
+ if ( (charset->side == XlcGR && charset != ct_state.GR_charset) ||
+ (charset->side == XlcGL && charset != ct_state.GL_charset) ) {
+
+ ct_len -= ctdptr[codeset->cs_num]->ct_encoding_len;
+ if (ct_len < 0) {
+ unconv_num++;
+ break;
+ }
+
+ if (ctptr) {
+ strcpy(ctptr, ctdptr[codeset->cs_num]->ct_encoding);
+ ctptr += ctdptr[codeset->cs_num]->ct_encoding_len;
+ }
+
+ }
+
+ if (charset->side == XlcGR)
+ ct_state.GR_charset = charset;
+ else if (charset->side == XlcGL)
+ ct_state.GL_charset = charset;
+
+ do {
+ length--;
+ tmp = wch>>(wchar_t)( (Ulong)length * wc_shift);
+
+ if (kana) {
+ if (BADCHAR(charset->min_ch, (char)tmp)) {
+ unconv_num++;
+ break;
+ }
+ *ctptr++ = (char)BIT8ON(tmp);
+ }
+
+ else if (byte1 && (kanji || userdef)) {
+ t1 = tmp;
+ }
+
+ else if (byte2 && (kanji || userdef)) {
+ if (BADCHAR(charset->min_ch, (char)t1) ||
+ BADCHAR(charset->min_ch, (char)tmp)) {
+ unconv_num++;
+ break;
+ }
+
+ *ctptr++ = (char)BIT8OFF(t1);
+ *ctptr++ = (char)BIT8OFF(tmp);
+ }
+
+ else {
+ if (BADCHAR(charset->min_ch, (char)tmp)) {
+ unconv_num++;
+ break;
+ }
+ *ctptr++ = (char)tmp;
+ }
+ } while (length);
+
+ } /* end for */
+
+ *to = (XPointer)ctptr;
+
+ if ((num_conv = (int)(ctptr - ct_base)) > 0)
+ (*to_left) -= num_conv;
+
+ return unconv_num;
+}
+#undef byte1
+#undef byte2
+
+#define SKIP_I(str) while (*(str) >= 0x20 && *(str) <= 0x2f) (str)++;
+#define SKIP_P(str) while (*(str) >= 0x30 && *(str) <= 0x3f) (str)++;
+
+static int
+sjis_ctstombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const char *inbufptr = *from;
+ XPointer outbufptr = *to;
+ const char *inbuf_base;
+ XPointer outbuf_base = outbufptr;
+ int clen, length;
+ int unconv_num = 0;
+ int num_conv;
+ unsigned int ct_seglen = 0;
+ Uchar ct_type;
+ CTData ctdp = ctdata; /* default */
+ CTData GL_ctdp = ctdp; /* GL ctdp save */
+ CTData GR_ctdp = ctdp; /* GR ctdp save */
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ for (length = ctdata[Ascii].length; *from_left > 0 ; (*from_left) -= length)
+ {
+ ct_type = CT_STD;
+ /* change GL/GR charset */
+ if(ctdp->side == XlcGR && isleftside(*inbufptr)){
+ /* select GL side */
+ ctdp = GL_ctdp;
+ length = ctdp->length;
+ ct_type = ctdp->ct_type;
+ }else if(ctdp->side == XlcGL && isrightside(*inbufptr)){
+ /* select GR side */
+ ctdp = GR_ctdp;
+ length = ctdp->length;
+ ct_type = ctdp->ct_type;
+ }
+ if (*inbufptr == '\033' || *inbufptr == (char)'\233') {
+
+ for (ctdp = ctdata; ctdp <= ctd_endp ; ctdp++) {
+
+ if(!strncmp(inbufptr, ctdp->ct_encoding, ctdp->ct_encoding_len))
+ {
+ inbufptr += ctdp->ct_encoding_len;
+ (*from_left) -= ctdp->ct_encoding_len;
+ if( ctdp->length ) {
+ length = ctdp->length;
+ if( *from_left < length ) {
+ *to = (XPointer)outbufptr;
+ *to_left -= outbufptr - outbuf_base;
+ return( unconv_num + *from_left );
+ }
+ }
+ ct_type = ctdp->ct_type;
+ if(ctdp->side == XlcGL){
+ GL_ctdp = ctdp; /* save GL ctdp */
+ }else{
+ GR_ctdp = ctdp; /* save GR ctdp */
+ }
+ break;
+ }
+ }
+ if (ctdp > ctd_endp) /* failed to match CT sequence */
+ unconv_num++;
+ }
+
+/* The following code insures that non-standard encodings, direction, extension,
+ * and version strings are ignored; subject to change in future.
+ */
+ switch (ct_type) {
+ case CT_STD:
+ break;
+ case CT_EXT2:
+ inbufptr++;
+ (*from_left)--;
+ case CT_NSTD:
+ ct_seglen = (BIT8OFF(*inbufptr) << 7) + BIT8OFF(*(inbufptr+1)) + 2;
+ inbufptr += ct_seglen;
+ (*from_left) -= ct_seglen;
+ continue;
+ case CT_EXT0:
+ inbuf_base = inbufptr;
+ SKIP_I(inbufptr);
+ inbufptr++;
+ ct_seglen = (unsigned)(inbufptr - inbuf_base);
+ (*from_left) -= ct_seglen;
+ continue;
+ case CT_EXT1:
+ inbuf_base = inbufptr;
+ SKIP_P(inbufptr);
+ SKIP_I(inbufptr);
+ inbufptr++;
+ ct_seglen = (unsigned)(inbufptr - inbuf_base);
+ (*from_left) -= ct_seglen;
+ continue;
+ case CT_DIR:
+ continue;
+ case CT_VER:
+ inbufptr += 2;
+ (*from_left) -= 2;
+ continue;
+ }
+
+ if (ctdp->side == XlcGL || isrightside (*inbufptr)) {
+ clen = length;
+ } else {
+ clen = 1;
+ *from_left += length - clen;
+ }
+ do {
+ Uchar mask = (length == 2) ? GL : -1;
+ *outbufptr++ = *inbufptr++ & mask;
+ } while (--clen);
+
+ if (length >= 2)
+ jis_to_sjis((Uchar *)(outbufptr-2), (Uchar *)(outbufptr-1));
+ }
+
+ *to = (XPointer)outbufptr;
+
+ if ((num_conv = (int)(outbufptr - outbuf_base)) > 0)
+ (*to_left) -= num_conv;
+
+ return unconv_num;
+}
+
+
+static int
+sjis_ctstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd)conv->state;
+ Ulong wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
+ const char *inbufptr = *from;
+ const char *inbuf_base;
+ wchar_t *outbufptr = (wchar_t *) *to;
+ wchar_t *outbuf_base = outbufptr;
+ int clen, length;
+ int num_conv;
+ int unconv_num = 0;
+ unsigned int ct_seglen = 0;
+ Uchar ct_type = 0;
+ int shift_mult;
+ wchar_t wc_tmp;
+ wchar_t wch;
+ Ulong wc_encoding;
+ CTData ctdp = ctdata;
+ CTData GL_ctdp = ctdp; /* GL ctdp save */
+ CTData GR_ctdp = ctdp; /* GR ctdp save */
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ for (length = ctdata[Ascii].length; *from_left > 0; (*from_left) -= length )
+ {
+ ct_type = CT_STD;
+ /* change GL/GR charset */
+ if(ctdp->side == XlcGR && isleftside(*inbufptr)){
+ /* select GL side */
+ ctdp = GL_ctdp;
+ length = ctdp->length;
+ ct_type = ctdp->ct_type;
+ }else if(ctdp->side == XlcGL && isrightside(*inbufptr)){
+ /* select GR side */
+ ctdp = GR_ctdp;
+ length = ctdp->length;
+ ct_type = ctdp->ct_type;
+ }
+ if (*inbufptr == '\033' || *inbufptr == (char)'\233') {
+ for (ctdp = ctdata; ctdp <= ctd_endp ; ctdp++) {
+
+ if(!strncmp(inbufptr, ctdp->ct_encoding, ctdp->ct_encoding_len))
+ {
+ inbufptr += ctdp->ct_encoding_len;
+ (*from_left) -= ctdp->ct_encoding_len;
+ if( ctdp->length ) {
+ length = ctdp->length;
+ if( *from_left < length ) {
+ *to = (XPointer)outbufptr;
+ *to_left -= outbufptr - outbuf_base;
+ return( unconv_num + *from_left );
+ }
+ }
+ ct_type = ctdp->ct_type;
+ if(ctdp->side == XlcGL){
+ GL_ctdp = ctdp; /* save GL ctdp */
+ }else{
+ GR_ctdp = ctdp; /* save GR ctdp */
+ }
+ break;
+ }
+ }
+ if (ctdp > ctd_endp) /* failed to match CT sequence */
+ unconv_num++;
+ }
+
+/* The following block of code insures that non-standard encodings, direction,
+ * extension, and version strings are ignored; subject to change in future.
+ */
+ switch (ct_type) {
+ case CT_STD:
+ break;
+ case CT_EXT2:
+ inbufptr++;
+ (*from_left)--;
+ case CT_NSTD:
+ ct_seglen = (BIT8OFF(*inbufptr) << 7) + BIT8OFF(*(inbufptr+1)) + 2;
+ inbufptr += ct_seglen;
+ (*from_left) -= ct_seglen;
+ continue;
+ case CT_EXT0:
+ inbuf_base = inbufptr;
+ SKIP_I(inbufptr);
+ inbufptr++;
+ ct_seglen = (unsigned)(inbufptr - inbuf_base);
+ (*from_left) -= ct_seglen;
+ continue;
+ case CT_EXT1:
+ inbuf_base = inbufptr;
+ SKIP_P(inbufptr);
+ SKIP_I(inbufptr);
+ inbufptr++;
+ ct_seglen = (unsigned)(inbufptr - inbuf_base);
+ (*from_left) -= ct_seglen;
+ continue;
+ case CT_DIR:
+ continue;
+ case CT_VER:
+ inbufptr += 2;
+ (*from_left) -= 2;
+ continue;
+ }
+#if !defined(__sony_news) || defined(SVR4)
+ if (ctdp->side == XlcGL || isrightside (*inbufptr)) {
+ clen = length;
+ wc_encoding = ctdp->wc_encoding;
+ } else {
+ clen = 1;
+ *from_left += length - clen;
+ wc_encoding = ctdptr[Ascii]->wc_encoding;
+ }
+ shift_mult = clen - 1;
+ wch = (wchar_t)0;
+
+ do {
+ wc_tmp = BIT8OFF(*inbufptr++) << (wc_shift_bits * shift_mult);
+ wch |= wc_tmp;
+ shift_mult--;
+ } while (--clen);
+ *outbufptr++ = wch | wc_encoding;
+#else
+ if( length == 1 )
+ *outbufptr++ = (unsigned char)*inbufptr++;
+ else if( length == 2 ) {
+ unsigned short code;
+ code = (*inbufptr << 8) | *(inbufptr+1);
+ *outbufptr++ = jis2sjis( code );
+ inbufptr += 2;
+ }
+#endif
+ }
+ *to = (XPointer)outbufptr;
+
+ if ((num_conv = (int)(outbufptr - outbuf_base)) > 0)
+ (*to_left) -= num_conv ;
+
+ return unconv_num;
+
+}
+#undef BADCHAR
+
+static void
+close_converter(
+ XlcConv conv)
+{
+ Xfree((char *) conv);
+}
+
+
+static XlcConv
+create_conv(
+ XLCd lcd,
+ XlcConvMethods methods)
+{
+ XlcConv conv;
+
+ conv = (XlcConv) Xmalloc(sizeof(XlcConvRec));
+ if (conv == NULL)
+ return (XlcConv) NULL;
+
+ conv->methods = methods;
+ conv->state = (XPointer) lcd;
+ return conv;
+}
+
+
+enum { MBSTOCS, WCSTOCS, MBTOCS, CSTOMBS, CSTOWCS, MBSTOWCS, WCSTOMBS,
+ WCSTOCTS, MBSTOCTS, CTSTOMBS, CTSTOWCS };
+
+static XlcConvMethodsRec conv_methods[] = {
+ {close_converter, sjis_mbstocs, NULL },
+ {close_converter, sjis_wcstocs, NULL },
+ {close_converter, sjis_mbtocs, NULL },
+ {close_converter, sjis_cstombs, NULL },
+ {close_converter, sjis_cstowcs, NULL },
+ {close_converter, sjis_mbstowcs, NULL },
+ {close_converter, sjis_wcstombs, NULL },
+ {close_converter, sjis_wcstocts, NULL },
+ {close_converter, sjis_mbstocts, NULL },
+ {close_converter, sjis_ctstombs, NULL },
+ {close_converter, sjis_ctstowcs, NULL },
+};
+
+
+static XlcConv
+open_mbstocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[MBSTOCS]);
+}
+
+static XlcConv
+open_wcstocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[WCSTOCS]);
+}
+
+static XlcConv
+open_mbtocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[MBTOCS]);
+}
+
+static XlcConv
+open_cstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[CSTOMBS]);
+}
+
+static XlcConv
+open_cstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[CSTOWCS]);
+}
+
+static XlcConv
+open_mbstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[MBSTOWCS]);
+}
+
+static XlcConv
+open_wcstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[WCSTOMBS]);
+}
+
+static XlcConv
+open_wcstocts(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[WCSTOCTS]);
+}
+
+static XlcConv
+open_mbstocts(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[MBSTOCTS]);
+}
+
+static XlcConv
+open_ctstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[CTSTOMBS]);
+}
+
+static XlcConv
+open_ctstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[CTSTOWCS]);
+}
+
+XLCd
+_XlcSjisLoader(
+ const char *name)
+{
+ XLCd lcd;
+
+ lcd = _XlcCreateLC(name, _XlcGenericMethods);
+ if (lcd == NULL)
+ return lcd;
+
+ if (!XLC_PUBLIC_PART(lcd)->codeset ||
+ (_XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "SJIS"))) {
+ _XlcDestroyLC(lcd);
+ return (XLCd) NULL;
+ }
+
+ initCTptr(lcd);
+
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs);
+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs);
+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs);
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbtocs);
+
+#ifndef FORCE_INDIRECT_CONVERTER
+ _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNMultiByte, open_ctstombs);
+ _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar, open_ctstowcs);
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCompoundText, open_mbstocts);
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_mbstowcs);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCompoundText, open_wcstocts);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_wcstombs);
+#endif
+
+ _XlcAddUtf8Converters(lcd);
+
+ return lcd;
+}
+
+#else
+typedef int dummy;
+#endif /* X_LOCALE */