lcGenConv.c revision d8e76104
11ab64890Smrg/* 21ab64890Smrg * Copyright 1992, 1993 by TOSHIBA Corp. 31ab64890Smrg * 41ab64890Smrg * Permission to use, copy, modify, and distribute this software and its 51ab64890Smrg * documentation for any purpose and without fee is hereby granted, provided 61ab64890Smrg * that the above copyright notice appear in all copies and that both that 71ab64890Smrg * copyright notice and this permission notice appear in supporting 81ab64890Smrg * documentation, and that the name of TOSHIBA not be used in advertising 91ab64890Smrg * or publicity pertaining to distribution of the software without specific, 101ab64890Smrg * written prior permission. TOSHIBA make no representations about the 111ab64890Smrg * suitability of this software for any purpose. It is provided "as is" 121ab64890Smrg * without express or implied warranty. 131ab64890Smrg * 141ab64890Smrg * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 151ab64890Smrg * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 161ab64890Smrg * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 171ab64890Smrg * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 181ab64890Smrg * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 191ab64890Smrg * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 201ab64890Smrg * SOFTWARE. 211ab64890Smrg * 221ab64890Smrg * Author: Katsuhisa Yano TOSHIBA Corp. 231ab64890Smrg * mopi@osa.ilab.toshiba.co.jp 241ab64890Smrg */ 251ab64890Smrg/* 261ab64890Smrg * (c) Copyright 1995 FUJITSU LIMITED 271ab64890Smrg * This is source code modified by FUJITSU LIMITED under the Joint 281ab64890Smrg * Development Agreement for the CDE/Motif PST. 291ab64890Smrg * 301ab64890Smrg * Modifier: Masayoshi Shimamura FUJITSU LIMITED 311ab64890Smrg * 321ab64890Smrg */ 331ab64890Smrg/* 3461b2299dSmrg * 2000 351ab64890Smrg * Modifier: Ivan Pascal The XFree86 Project 361ab64890Smrg */ 371ab64890Smrg 381ab64890Smrg/* 391ab64890Smrg * A generic locale loader for all kinds of ISO-2022 based codesets. 401ab64890Smrg * Supports: all locales. 411ab64890Smrg * How: Provides generic converters for ISO-2022 based codesets. Extensible as 421ab64890Smrg * far as ISO-2022 is extensible: codesets can be given by name in the 431ab64890Smrg * stream. Overall distinction between GL (0x00..0x7f) and GR (0x80..0xff). 441ab64890Smrg * In every chunk between escape sequences, the number of bytes per 451ab64890Smrg * character (char_size) is constant. 461ab64890Smrg * Platforms: all systems. 471ab64890Smrg */ 481ab64890Smrg 491ab64890Smrg#ifdef HAVE_CONFIG_H 501ab64890Smrg#include <config.h> 511ab64890Smrg#endif 521ab64890Smrg#include "Xlibint.h" 531ab64890Smrg#include "XlcGeneric.h" 541ab64890Smrg#include <stdio.h> 551ab64890Smrg 562e9c7c8cSmrg#if !defined(Lynx_22) && !defined(X_LOCALE) 571ab64890Smrg#define STDCVT 581ab64890Smrg#endif 591ab64890Smrg 601ab64890Smrgtypedef struct _CTDataRec { 611ab64890Smrg const char *name; 621ab64890Smrg const char *encoding; /* Compound Text encoding */ 631ab64890Smrg} CTDataRec, *CTData; 641ab64890Smrg 651ab64890Smrgstatic CTDataRec directionality_data[] = 661ab64890Smrg{ 671ab64890Smrg { "BEGIN_LEFT-TO-RIGHT_TEXT", "\2331]" }, 681ab64890Smrg { "BEGIN_RIGHT-TO-LEFT_TEXT", "\2332]" }, 691ab64890Smrg { "END_OF_STRING", "\233]" }, 701ab64890Smrg}; 711ab64890Smrg 721ab64890Smrgtypedef struct _StateRec { 731ab64890Smrg XLCd lcd; 741ab64890Smrg /* CT state */ 751ab64890Smrg XlcCharSet charset; /* charset of current state */ 761ab64890Smrg XlcCharSet GL_charset; /* charset of initial state in GL */ 771ab64890Smrg XlcCharSet GR_charset; /* charset of initial state in GR */ 781ab64890Smrg /* MB shift state */ 791ab64890Smrg CodeSet GL_codeset; 801ab64890Smrg CodeSet GR_codeset; 811ab64890Smrg} StateRec, *State; 821ab64890Smrg 831ab64890Smrg#define GR 0x80 /* begins right-side (non-ascii) region */ 841ab64890Smrg#define GL 0x7f /* ends left-side (ascii) region */ 851ab64890Smrg#define ESC 0x1b 861ab64890Smrg#define CSI 0x9b 871ab64890Smrg#define STX 0x02 881ab64890Smrg 891ab64890Smrg#define isrightside(c) ((c) & GR) 901ab64890Smrg#define isleftside(c) (!isrightside(c)) 911ab64890Smrg 921ab64890Smrg/* Forward declarations for local routines. */ 931ab64890Smrgstatic int mbstocts (XlcConv conv, XPointer *from, int *from_left, 941ab64890Smrg XPointer *to, int *to_left, XPointer *args, int num_args); 951ab64890Smrgstatic int ctstombs (XlcConv conv, XPointer *from, int *from_left, 961ab64890Smrg XPointer *to, int *to_left, XPointer *args, int num_args); 971ab64890Smrgstatic int cstombs (XlcConv conv, XPointer *from, int *from_left, 981ab64890Smrg XPointer *to, int *to_left, XPointer *args, int num_args); 991ab64890Smrg 1001ab64890Smrg/* ------------------------------------------------------------------------- */ 1011ab64890Smrg/* Misc */ 1021ab64890Smrg/* ------------------------------------------------------------------------- */ 1031ab64890Smrg 1041ab64890Smrgstatic int 1051ab64890Smrgcompare( 1061ab64890Smrg const char *src, 1071ab64890Smrg const char *encoding, 1081ab64890Smrg int length) 1091ab64890Smrg{ 1101ab64890Smrg const char *start = src; 1111ab64890Smrg 1121ab64890Smrg while (length-- > 0) { 1131ab64890Smrg if (*src++ != *encoding++) 1141ab64890Smrg return 0; 1151ab64890Smrg if (*encoding == '\0') 1161ab64890Smrg return src - start; 1171ab64890Smrg } 1181ab64890Smrg 1191ab64890Smrg return 0; 1201ab64890Smrg} 1211ab64890Smrg 1221ab64890Smrgstatic unsigned long 1231ab64890Smrgconv_to_dest( 1241ab64890Smrg Conversion conv, 1251ab64890Smrg unsigned long code) 1261ab64890Smrg{ 1271ab64890Smrg int i; 1281ab64890Smrg int conv_num = conv->conv_num; 1291ab64890Smrg FontScope convlist = conv->convlist; 1301ab64890Smrg 1311ab64890Smrg for (i = 0; i < conv_num; i++) { 1321ab64890Smrg if (convlist[i].start <= code && code <= convlist[i].end) { 1331ab64890Smrg switch (convlist[i].shift_direction) { 1341ab64890Smrg case '+': 1351ab64890Smrg return(code + convlist[i].shift); 1361ab64890Smrg case '-': 1371ab64890Smrg return(code - convlist[i].shift); 1381ab64890Smrg default: 1391ab64890Smrg return(code); 1401ab64890Smrg } 1411ab64890Smrg } 1421ab64890Smrg } 1431ab64890Smrg 1441ab64890Smrg return(code); 1451ab64890Smrg} 1461ab64890Smrg 1471ab64890Smrgstatic unsigned long 1481ab64890Smrgconv_to_source( 1491ab64890Smrg Conversion conv, 1501ab64890Smrg unsigned long code) 1511ab64890Smrg{ 1521ab64890Smrg int i; 1531ab64890Smrg int conv_num; 1541ab64890Smrg FontScope convlist; 1551ab64890Smrg unsigned long start_p; 1561ab64890Smrg unsigned long start_m; 1571ab64890Smrg unsigned long end_p; 1581ab64890Smrg unsigned long end_m; 1591ab64890Smrg 1601ab64890Smrg if (!conv) 1611ab64890Smrg return(code); 1621ab64890Smrg 1631ab64890Smrg conv_num = conv->conv_num; 1641ab64890Smrg convlist = conv->convlist; 1651ab64890Smrg 1661ab64890Smrg for (i = 0; i < conv_num; i++) { 1671ab64890Smrg switch (convlist[i].shift_direction) { 1681ab64890Smrg case '+': 1691ab64890Smrg start_p = convlist[i].start + convlist[i].shift; 1701ab64890Smrg end_p = convlist[i].end + convlist[i].shift; 1711ab64890Smrg if (start_p <= code && code <= end_p) 1721ab64890Smrg return(code - convlist[i].shift); 1731ab64890Smrg break; 1741ab64890Smrg case '-': 1751ab64890Smrg start_m = convlist[i].start - convlist[i].shift; 1761ab64890Smrg end_m = convlist[i].end - convlist[i].shift; 1771ab64890Smrg if (start_m <= code && code <= end_m) 1781ab64890Smrg return(code + convlist[i].shift); 1791ab64890Smrg break; 1801ab64890Smrg default: 1811ab64890Smrg continue; 1821ab64890Smrg } 1831ab64890Smrg } 1841ab64890Smrg 1851ab64890Smrg return(code); 1861ab64890Smrg} 1871ab64890Smrg 1881ab64890Smrgstatic unsigned long 1891ab64890Smrgmb_to_gi( 1901ab64890Smrg unsigned long mb, 1911ab64890Smrg CodeSet codeset) 1921ab64890Smrg{ 1931ab64890Smrg int i; 1941ab64890Smrg unsigned long mb_tmp, mask = 0; 1951ab64890Smrg 1961ab64890Smrg if (codeset->mbconv) { 1971ab64890Smrg mb_tmp = conv_to_dest(codeset->mbconv, mb); 1981ab64890Smrg if (mb_tmp != mb) 1991ab64890Smrg return(mb_tmp); 2001ab64890Smrg } 2011ab64890Smrg 20261b2299dSmrg if (codeset->side == XlcC0 || codeset->side == XlcGL || 2031ab64890Smrg codeset->side == XlcC1 || codeset->side == XlcGR) { 2041ab64890Smrg 2051ab64890Smrg for (i = 0; i < codeset->length; i++) 2061ab64890Smrg mask = (mask << 8) | GL; 2071ab64890Smrg mb = mb & mask; 2081ab64890Smrg } 2091ab64890Smrg 2101ab64890Smrg return(mb); 2111ab64890Smrg} 2121ab64890Smrg 2131ab64890Smrgstatic unsigned long 2141ab64890Smrggi_to_mb( 2151ab64890Smrg unsigned long glyph_index, 2161ab64890Smrg CodeSet codeset) 2171ab64890Smrg{ 2181ab64890Smrg int i; 2191ab64890Smrg unsigned long mask = 0; 2201ab64890Smrg 2211ab64890Smrg if (codeset->side == XlcC1 || codeset->side == XlcGR) { 2221ab64890Smrg for (i = 0; i < codeset->length; i++) 2231ab64890Smrg mask = (mask << 8) | GR; 2241ab64890Smrg glyph_index = glyph_index | mask; 2251ab64890Smrg } 2261ab64890Smrg 2271ab64890Smrg if (codeset->mbconv) 2281ab64890Smrg return( conv_to_source(codeset->mbconv, glyph_index) ); 2291ab64890Smrg 2301ab64890Smrg return(glyph_index); 2311ab64890Smrg} 2321ab64890Smrg 2331ab64890Smrgstatic Bool 2341ab64890Smrggi_to_wc( 2351ab64890Smrg XLCd lcd, 2361ab64890Smrg unsigned long glyph_index, 2371ab64890Smrg CodeSet codeset, 2381ab64890Smrg wchar_t *wc) 2391ab64890Smrg{ 2401ab64890Smrg unsigned char mask = 0; 2411ab64890Smrg unsigned long wc_encoding = codeset->wc_encoding; 2421ab64890Smrg int length = codeset->length; 2431ab64890Smrg unsigned long wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits); 2441ab64890Smrg 2451ab64890Smrg mask = (1 << wc_shift_bits) - 1 ; 2461ab64890Smrg 2471ab64890Smrg for (*wc = 0, length--; length >= 0; length--) 2481ab64890Smrg *wc = (*wc << wc_shift_bits) | ((glyph_index >> (length * 8 )) & mask); 2491ab64890Smrg 2501ab64890Smrg *wc = *wc | wc_encoding; 2511ab64890Smrg 2521ab64890Smrg return(True); 2531ab64890Smrg} 2541ab64890Smrg 2551ab64890Smrgstatic Bool 2561ab64890Smrgwc_to_gi( 2571ab64890Smrg XLCd lcd, 2581ab64890Smrg wchar_t wc, 2591ab64890Smrg unsigned long *glyph_index, 2601ab64890Smrg CodeSet *codeset) 2611ab64890Smrg{ 2621ab64890Smrg int i; 2631ab64890Smrg unsigned char mask = 0; 2641ab64890Smrg unsigned long wc_encoding; 2651ab64890Smrg unsigned long wc_encode_mask = XLC_GENERIC(lcd, wc_encode_mask); 2661ab64890Smrg unsigned long wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits); 2671ab64890Smrg int codeset_num = XLC_GENERIC(lcd, codeset_num); 2681ab64890Smrg CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list); 2691ab64890Smrg 2701ab64890Smrg wc_encoding = wc & wc_encode_mask; 2711ab64890Smrg for (*codeset = NULL, i = 0; i < codeset_num; i++) { 2721ab64890Smrg if (wc_encoding == codeset_list[i]->wc_encoding) { 2731ab64890Smrg *codeset = codeset_list[i]; 2741ab64890Smrg break; 2751ab64890Smrg } 2761ab64890Smrg } 2771ab64890Smrg if (*codeset == NULL) 2781ab64890Smrg return(False); 2791ab64890Smrg 2801ab64890Smrg mask = (1 << wc_shift_bits) - 1 ; 2811ab64890Smrg 2821ab64890Smrg wc = wc & ~wc_encode_mask; 2831ab64890Smrg for (*glyph_index = 0, i = (*codeset)->length - 1; i >= 0; i--) 28461b2299dSmrg *glyph_index = (*glyph_index << 8) | 2851ab64890Smrg ( ((unsigned long)wc >> (i * wc_shift_bits)) & mask ); 2861ab64890Smrg 2871ab64890Smrg return(True); 2881ab64890Smrg} 2891ab64890Smrg 2901ab64890Smrgstatic CodeSet 2911ab64890Smrgmb_parse_codeset( 2921ab64890Smrg State state, 2931ab64890Smrg int num, 2941ab64890Smrg const char **inbufptr, 2951ab64890Smrg int *from_left) 2961ab64890Smrg{ 2971ab64890Smrg int len; 2981ab64890Smrg int from_len = (*from_left) + 1; 2991ab64890Smrg const char *src = (*inbufptr) - 1; 3001ab64890Smrg ParseInfo *mb_parse_list = XLC_GENERIC(state->lcd, mb_parse_list); 3011ab64890Smrg ParseInfo parse_info; 3021ab64890Smrg CodeSet codeset; 30361b2299dSmrg 3041ab64890Smrg for (--num ; (parse_info = mb_parse_list[num]) != NULL; num++) { 3051ab64890Smrg len = compare(src, parse_info->encoding, from_len); 3061ab64890Smrg if (len > 0) { 3071ab64890Smrg codeset = parse_info->codeset; 3081ab64890Smrg if (parse_info->type == E_LSL) 3091ab64890Smrg state->GL_codeset = codeset; 3101ab64890Smrg else if (parse_info->type == E_LSR) 3111ab64890Smrg state->GR_codeset = codeset; 3121ab64890Smrg --len; 3131ab64890Smrg *inbufptr += len; 3141ab64890Smrg *from_left -= len; 3151ab64890Smrg return codeset; 3161ab64890Smrg } 3171ab64890Smrg } 3181ab64890Smrg return (CodeSet) NULL; 3191ab64890Smrg} 3201ab64890Smrg 3211ab64890Smrgstatic CodeSet 3221ab64890SmrgbyteM_parse_codeset( 3231ab64890Smrg XLCd lcd, 3241ab64890Smrg const char *inbufptr) 3251ab64890Smrg{ 3261ab64890Smrg unsigned char ch; 3271ab64890Smrg CodeSet codeset; 3281ab64890Smrg ByteInfoList byteM; 3291ab64890Smrg ByteInfoListRec byteM_rec; 3301ab64890Smrg ByteInfo byteinfo; 3311ab64890Smrg ByteInfoRec byteinfo_rec; 3321ab64890Smrg Bool hit = False; 3331ab64890Smrg int i, j, k; 3341ab64890Smrg 3351ab64890Smrg int codeset_num = XLC_GENERIC(lcd, codeset_num); 3361ab64890Smrg CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list); 3371ab64890Smrg 3381ab64890Smrg for (i = 0; i < codeset_num; i++) { 3391ab64890Smrg codeset = codeset_list[i]; 3401ab64890Smrg byteM = codeset->byteM; 3411ab64890Smrg if (codeset->side != XlcNONE || byteM == NULL) 3421ab64890Smrg continue; 3431ab64890Smrg 3441ab64890Smrg for (j = 0; j < codeset->length; j++) { 34561b2299dSmrg ch = *((unsigned char *)(inbufptr + j)); 3461ab64890Smrg byteM_rec = byteM[j]; 3471ab64890Smrg byteinfo = byteM_rec.byteinfo; 3481ab64890Smrg 3491ab64890Smrg for (hit = False, k = 0; k < byteM_rec.byteinfo_num; k++) { 3501ab64890Smrg byteinfo_rec = byteinfo[k]; 3511ab64890Smrg if (byteinfo_rec.start <= ch && ch <= byteinfo_rec.end) { 3521ab64890Smrg hit = True; 3531ab64890Smrg break; 3541ab64890Smrg } 3551ab64890Smrg } 3561ab64890Smrg 3571ab64890Smrg if (!hit) 3581ab64890Smrg break; 3591ab64890Smrg } 3601ab64890Smrg 3611ab64890Smrg if (hit) 3621ab64890Smrg return(codeset); 3631ab64890Smrg } 3641ab64890Smrg 3651ab64890Smrg return(NULL); 36661b2299dSmrg} 3671ab64890Smrg 3681ab64890Smrg#define GLGR_parse_codeset(ch) \ 3691ab64890Smrg (isrightside(ch) ? (state->GR_codeset) : \ 3701ab64890Smrg (state->GL_codeset) ) 3711ab64890Smrg 3721ab64890Smrgstatic XlcCharSet 3731ab64890Smrggi_parse_charset( 3741ab64890Smrg unsigned long glyph_index, 3751ab64890Smrg CodeSet codeset) 3761ab64890Smrg{ 3771ab64890Smrg int i; 3781ab64890Smrg XlcCharSet *charset_list = codeset->charset_list; 3791ab64890Smrg int num_charsets = codeset->num_charsets; 3801ab64890Smrg ExtdSegment ctextseg = codeset->ctextseg; 3811ab64890Smrg XlcCharSet charset = NULL; 3821ab64890Smrg int area_num; 3831ab64890Smrg FontScope area; 3841ab64890Smrg 3851ab64890Smrg /* lockup ct sequence */ 3861ab64890Smrg for (i = 0; i < num_charsets; i++) { 3871ab64890Smrg charset = charset_list[i]; 3881ab64890Smrg if (*charset->ct_sequence != '\0') 3891ab64890Smrg break; 3901ab64890Smrg } 3911ab64890Smrg if (i >= num_charsets) 3921ab64890Smrg return(NULL); 3931ab64890Smrg 3941ab64890Smrg if (charset->source != CSsrcStd) 3951ab64890Smrg return (charset); 3961ab64890Smrg 3971ab64890Smrg if (!ctextseg) 3981ab64890Smrg return(charset); 3991ab64890Smrg 4001ab64890Smrg area = ctextseg->area; 4011ab64890Smrg area_num = ctextseg->area_num; 4021ab64890Smrg 4031ab64890Smrg for (i = 0; i < area_num; i++) { 4041ab64890Smrg 4051ab64890Smrg if (area[i].start <= glyph_index && glyph_index <= area[i].end) { 4061ab64890Smrg 4071ab64890Smrg charset = ctextseg->charset; 4081ab64890Smrg 4091ab64890Smrg if (*charset->ct_sequence == '\0') 4101ab64890Smrg return(NULL); 4111ab64890Smrg 4121ab64890Smrg break; 4131ab64890Smrg } 4141ab64890Smrg } 4151ab64890Smrg 4161ab64890Smrg return(charset); 4171ab64890Smrg} 4181ab64890Smrg 4191ab64890Smrgstatic Bool 4201ab64890Smrgct_parse_csi( 4211ab64890Smrg const char *inbufptr, 4221ab64890Smrg int *ctr_seq_len) 4231ab64890Smrg{ 4241ab64890Smrg int i; 4251ab64890Smrg int num = sizeof(directionality_data) / sizeof(directionality_data[0]); 4261ab64890Smrg 4271ab64890Smrg for (i = 0; i < num; i++) { 4281ab64890Smrg if ( !(*ctr_seq_len = strlen(directionality_data[i].encoding)) ) 4291ab64890Smrg continue; 4301ab64890Smrg 43161b2299dSmrg if ( strncmp(inbufptr, directionality_data[i].encoding, 4321ab64890Smrg *ctr_seq_len) == 0) 4331ab64890Smrg return(True); 4341ab64890Smrg } 4351ab64890Smrg 4361ab64890Smrg return(False); 4371ab64890Smrg} 4381ab64890Smrg 4391ab64890Smrgstatic int 4401ab64890Smrgcmp_esc_sequence( 4411ab64890Smrg const char *inbufptr, 4421ab64890Smrg XlcCharSet charset) 4431ab64890Smrg{ 4441ab64890Smrg int seq_len, name_len, total_len; 4451ab64890Smrg unsigned char byte_m, byte_l; 4461ab64890Smrg const char *ct_sequence = charset->ct_sequence; 4471ab64890Smrg const char *encoding_name = charset->encoding_name; 4481ab64890Smrg 4491ab64890Smrg /* check esc sequence */ 4501ab64890Smrg if ( !(seq_len = strlen(ct_sequence) ) ) 4511ab64890Smrg return(0); 4521ab64890Smrg if ( strncmp(inbufptr, ct_sequence, seq_len) != 0) 4531ab64890Smrg return(0); 4541ab64890Smrg 4551ab64890Smrg /* Standard Character Set Encoding ? */ 4561ab64890Smrg if (charset->source == CSsrcStd) 4571ab64890Smrg return(seq_len); 4581ab64890Smrg 4591ab64890Smrg /* 4601ab64890Smrg * Non-Standard Character Set Encoding 4611ab64890Smrg * 4621ab64890Smrg * +--- ---+-----+-----+-----+---- ----+-----+-----+------- ------+ 4631ab64890Smrg * | ctseq | M | L | encoding name | STX | contents | 4641ab64890Smrg * +--- ---+-----+-----+-----+---- ----+-----+-----+------- ------+ 4651ab64890Smrg * 4bytes 1byte 1byte variable length 1byte variable length 4661ab64890Smrg * | | 4671ab64890Smrg * +----------------------------------------------+ 4681ab64890Smrg * rest length = ((M - 128) * 128) + (L - 128) 4691ab64890Smrg */ 4701ab64890Smrg 4711ab64890Smrg /* get length of encoding name */ 4721ab64890Smrg inbufptr += seq_len; 4731ab64890Smrg byte_m = *inbufptr++; 4741ab64890Smrg byte_l = *inbufptr++; 4751ab64890Smrg name_len = strlen(encoding_name); 4761ab64890Smrg 4771ab64890Smrg if (((byte_m - 128) * 128 + (byte_l - 128) - 1) < name_len) 4781ab64890Smrg return(0); 4791ab64890Smrg 4801ab64890Smrg if ( _XlcNCompareISOLatin1(inbufptr, encoding_name, name_len) != 0 ) 4811ab64890Smrg return(0); 4821ab64890Smrg 4831ab64890Smrg /* check STX (Start of Text) */ 4841ab64890Smrg inbufptr = inbufptr + name_len; 4851ab64890Smrg if ( *inbufptr != STX ) 4861ab64890Smrg return(0); 4871ab64890Smrg 4881ab64890Smrg total_len = seq_len + name_len + 3; 4891ab64890Smrg return(total_len); 4901ab64890Smrg} 4911ab64890Smrg 4921ab64890Smrgstatic Bool 4931ab64890Smrgct_parse_charset( 4941ab64890Smrg XLCd lcd, 4951ab64890Smrg const char *inbufptr, 4961ab64890Smrg XlcCharSet *charset, 4971ab64890Smrg int *ctr_seq_len) 4981ab64890Smrg{ 4991ab64890Smrg int i, j; 5001ab64890Smrg ExtdSegment ctextseg; 5011ab64890Smrg int num_charsets; 5021ab64890Smrg XlcCharSet *charset_list; 5031ab64890Smrg CodeSet codeset; 5041ab64890Smrg int codeset_num = XLC_GENERIC(lcd, codeset_num); 5051ab64890Smrg CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list); 5061ab64890Smrg int segment_conv_num = XLC_GENERIC(lcd, segment_conv_num); 5071ab64890Smrg SegConv segment_conv = XLC_GENERIC(lcd, segment_conv); 5081ab64890Smrg 5091ab64890Smrg /* get charset from XLC_XLOCALE by escape sequence */ 5101ab64890Smrg 5111ab64890Smrg for (i = 0; i < codeset_num; i++) { 5121ab64890Smrg codeset = codeset_list[i]; 5131ab64890Smrg 5141ab64890Smrg num_charsets = codeset->num_charsets; 5151ab64890Smrg charset_list = codeset->charset_list; 5161ab64890Smrg ctextseg = codeset->ctextseg; 5171ab64890Smrg 5181ab64890Smrg for (j = 0; j < num_charsets; j++) { 5191ab64890Smrg *charset = charset_list[j]; 5201ab64890Smrg if ((*ctr_seq_len = cmp_esc_sequence(inbufptr, *charset))) 5211ab64890Smrg return(True); 5221ab64890Smrg } 5231ab64890Smrg 5241ab64890Smrg if (ctextseg) { 5251ab64890Smrg *charset = ctextseg->charset; 5261ab64890Smrg if ((*ctr_seq_len = cmp_esc_sequence(inbufptr, *charset))) 5271ab64890Smrg return(True); 5281ab64890Smrg } 5291ab64890Smrg } 5301ab64890Smrg 5311ab64890Smrg /* get charset from XLC_SEGMENTCONVERSION by escape sequence */ 5321ab64890Smrg 5331ab64890Smrg if (!segment_conv) 5341ab64890Smrg return(False); 5351ab64890Smrg 5361ab64890Smrg for (i = 0; i < segment_conv_num; i++) { 5371ab64890Smrg *charset = segment_conv[i].source; 5381ab64890Smrg if ((*ctr_seq_len = cmp_esc_sequence(inbufptr, *charset))) 5391ab64890Smrg return(True); 5401ab64890Smrg *charset = segment_conv[i].dest; 5411ab64890Smrg if ((*ctr_seq_len = cmp_esc_sequence(inbufptr, *charset))) 5421ab64890Smrg return(True); 5431ab64890Smrg } 5441ab64890Smrg 5451ab64890Smrg return(False); 5461ab64890Smrg} 5471ab64890Smrg 5481ab64890Smrgstatic Bool 5491ab64890Smrgsegment_conversion( 5501ab64890Smrg XLCd lcd, 5511ab64890Smrg XlcCharSet *charset, 5521ab64890Smrg unsigned long *glyph_index) 5531ab64890Smrg{ 5541ab64890Smrg int i; 5551ab64890Smrg int segment_conv_num = XLC_GENERIC(lcd, segment_conv_num); 5561ab64890Smrg SegConv segment_conv = XLC_GENERIC(lcd, segment_conv); 5571ab64890Smrg FontScopeRec range; 5581ab64890Smrg ConversionRec conv_rec; 5591ab64890Smrg 5601ab64890Smrg if (!segment_conv) 5611ab64890Smrg return(True); 5621ab64890Smrg 5631ab64890Smrg for (i = 0; i < segment_conv_num; i++) { 5641ab64890Smrg if (segment_conv[i].source == *charset) 5651ab64890Smrg break; 5661ab64890Smrg } 5671ab64890Smrg 5681ab64890Smrg if (i >= segment_conv_num) 5691ab64890Smrg return(True); 5701ab64890Smrg 5711ab64890Smrg range = segment_conv[i].range; 5721ab64890Smrg if (*glyph_index < range.start || range.end < *glyph_index) 5731ab64890Smrg return(True); 57461b2299dSmrg 5751ab64890Smrg *charset = segment_conv[i].dest; 5761ab64890Smrg conv_rec.conv_num = segment_conv[i].conv_num; 5771ab64890Smrg conv_rec.convlist = segment_conv[i].conv; 5781ab64890Smrg *glyph_index = conv_to_dest(&conv_rec, *glyph_index); 5791ab64890Smrg 5801ab64890Smrg return(True); 5811ab64890Smrg} 5821ab64890Smrg 5831ab64890Smrgstatic CodeSet 5841ab64890Smrg_XlcGetCodeSetFromName( 5851ab64890Smrg XLCd lcd, 5861ab64890Smrg const char *name) 5871ab64890Smrg{ 5881ab64890Smrg int i, j; 5891ab64890Smrg XlcCharSet charset; 5901ab64890Smrg int num_charsets; 5911ab64890Smrg XlcCharSet *charset_list; 5921ab64890Smrg CodeSet codeset; 5931ab64890Smrg 5941ab64890Smrg int codeset_num = XLC_GENERIC(lcd, codeset_num); 5951ab64890Smrg CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list); 5961ab64890Smrg 5971ab64890Smrg for (i = 0; i < codeset_num; i++) { 5981ab64890Smrg codeset = codeset_list[i]; 5991ab64890Smrg 6001ab64890Smrg num_charsets = codeset->num_charsets; 6011ab64890Smrg charset_list = codeset->charset_list; 6021ab64890Smrg 6031ab64890Smrg for (j = 0; j < num_charsets; j++) { 6041ab64890Smrg charset = charset_list[j]; 6051ab64890Smrg 6061ab64890Smrg if (!strlen(charset->name)) 6071ab64890Smrg continue; 6081ab64890Smrg if ( strcmp(charset->name, name) == 0) 6091ab64890Smrg return(codeset); 6101ab64890Smrg } 6111ab64890Smrg } 6121ab64890Smrg 6131ab64890Smrg return(NULL); 6141ab64890Smrg} 6151ab64890Smrg 6161ab64890Smrgstatic Bool 6171ab64890Smrg_XlcGetCodeSetFromCharSet( 6181ab64890Smrg XLCd lcd, 6191ab64890Smrg XlcCharSet charset, 6201ab64890Smrg CodeSet *codeset, 6211ab64890Smrg unsigned long *glyph_index) 6221ab64890Smrg{ 6231ab64890Smrg int j, num; 6241ab64890Smrg CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list); 6251ab64890Smrg XlcCharSet *charset_list; 6261ab64890Smrg int codeset_num, num_charsets; 6271ab64890Smrg Conversion ctconv; 6281ab64890Smrg unsigned long glyph_index_tmp = 0; 6291ab64890Smrg ExtdSegment ctextseg; 6301ab64890Smrg 6311ab64890Smrg codeset_num = XLC_GENERIC(lcd, codeset_num); 6321ab64890Smrg 6331ab64890Smrg for (num = 0 ; num < codeset_num; num++) { 6341ab64890Smrg *codeset = codeset_list[num]; 6351ab64890Smrg ctconv = (*codeset)->ctconv; 6361ab64890Smrg ctextseg = (*codeset)->ctextseg; 6371ab64890Smrg 6381ab64890Smrg num_charsets = (*codeset)->num_charsets; 6391ab64890Smrg charset_list = (*codeset)->charset_list; 6401ab64890Smrg 6411ab64890Smrg glyph_index_tmp = conv_to_source(ctconv, *glyph_index); 6421ab64890Smrg 6431ab64890Smrg if (charset->source == CSsrcStd) { 6441ab64890Smrg 6451ab64890Smrg /* Standard Character Set Encoding */ 6461ab64890Smrg if (glyph_index_tmp == *glyph_index) { 6471ab64890Smrg for (j = 0; j < num_charsets; j++) { 6481ab64890Smrg if (charset_list[j] == charset) { 6491ab64890Smrg goto end_loop; 6501ab64890Smrg } 6511ab64890Smrg } 6521ab64890Smrg } 6531ab64890Smrg 6541ab64890Smrg } else { 6551ab64890Smrg 6561ab64890Smrg /* Non-Standard Character Set Encoding */ 6571ab64890Smrg for (j = 0; j < num_charsets; j++) { 6581ab64890Smrg if (charset_list[j] == charset) { 6591ab64890Smrg goto end_loop; 6601ab64890Smrg } 6611ab64890Smrg } 6621ab64890Smrg 6631ab64890Smrg if (glyph_index_tmp != *glyph_index) { 6641ab64890Smrg if (ctextseg && ctextseg->charset == charset) { 6651ab64890Smrg goto end_loop; 6661ab64890Smrg } 6671ab64890Smrg } 6681ab64890Smrg 6691ab64890Smrg } 6701ab64890Smrg 6711ab64890Smrg } 6721ab64890Smrg 6731ab64890Smrgend_loop: 6741ab64890Smrg if (num < codeset_num) { 6751ab64890Smrg *glyph_index = glyph_index_tmp; 6761ab64890Smrg return(True); 6771ab64890Smrg } 6781ab64890Smrg 6791ab64890Smrg return(False); 6801ab64890Smrg} 6811ab64890Smrg 6821ab64890Smrg#define check_string_encoding(codeset) (codeset->string_encoding) 6831ab64890Smrg 6841ab64890Smrgstatic void 6851ab64890Smrgoutput_ulong_value( 6861ab64890Smrg char *outbufptr, 6871ab64890Smrg unsigned long code, 6881ab64890Smrg int length, 6891ab64890Smrg XlcSide side) 6901ab64890Smrg{ 6911ab64890Smrg int i; 6921ab64890Smrg 6931ab64890Smrg for (i = (length - 1) * 8; i >= 0; i -= 8) { 6941ab64890Smrg *outbufptr = ( code >> i) & 0xff; 6951ab64890Smrg 6961ab64890Smrg if (side == XlcC0 || side == XlcGL) { 6971ab64890Smrg *outbufptr = *outbufptr & GL; 6981ab64890Smrg } else if (side == XlcC1 || side == XlcGR) { 6991ab64890Smrg *outbufptr = *outbufptr | GR; 7001ab64890Smrg } 7011ab64890Smrg 7021ab64890Smrg outbufptr++; 7031ab64890Smrg } 7041ab64890Smrg} 7051ab64890Smrg 7061ab64890Smrg/* -------------------------------------------------------------------------- */ 7071ab64890Smrg/* Init */ 7081ab64890Smrg/* -------------------------------------------------------------------------- */ 7091ab64890Smrg 7101ab64890Smrgstatic XlcCharSet default_GL_charset = 0; 7111ab64890Smrgstatic XlcCharSet default_GR_charset = 0; 7121ab64890Smrg 7131ab64890Smrgstatic void 7141ab64890Smrginit_state( 7151ab64890Smrg XlcConv conv) 7161ab64890Smrg{ 7171ab64890Smrg State state = (State) conv->state; 7181ab64890Smrg 7191ab64890Smrg /* for CT */ 7201ab64890Smrg state->charset = NULL; 7211ab64890Smrg state->GL_charset = default_GL_charset; 7221ab64890Smrg state->GR_charset = default_GR_charset; 7231ab64890Smrg 7241ab64890Smrg /* for MB shift state */ 7251ab64890Smrg state->GL_codeset = XLC_GENERIC(state->lcd, initial_state_GL); 7261ab64890Smrg state->GR_codeset = XLC_GENERIC(state->lcd, initial_state_GR); 7271ab64890Smrg} 7281ab64890Smrg 7291ab64890Smrg/* -------------------------------------------------------------------------- */ 7301ab64890Smrg/* Convert */ 7311ab64890Smrg/* -------------------------------------------------------------------------- */ 7321ab64890Smrg 7331ab64890Smrgstatic int 7341ab64890Smrgmbstowcs_org( 7351ab64890Smrg XlcConv conv, 7361ab64890Smrg XPointer *from, 7371ab64890Smrg int *from_left, 7381ab64890Smrg XPointer *to, 7391ab64890Smrg int *to_left, 7401ab64890Smrg XPointer *args, 7411ab64890Smrg int num_args) 7421ab64890Smrg{ 7431ab64890Smrg State state = (State) conv->state; 7441ab64890Smrg XLCd lcd = state->lcd; 7451ab64890Smrg 7461ab64890Smrg unsigned char ch; 7471ab64890Smrg unsigned long mb = 0; 7481ab64890Smrg wchar_t wc; 7491ab64890Smrg 7501ab64890Smrg int length = 0, len_left = 0; 7511ab64890Smrg int unconv_num = 0; 7521ab64890Smrg int num; 7531ab64890Smrg 7541ab64890Smrg CodeSet codeset = NULL; 7551ab64890Smrg 7561ab64890Smrg const char *inbufptr = *from; 7571ab64890Smrg wchar_t *outbufptr = (wchar_t *) *to; 7581ab64890Smrg int from_size = *from_left; 7591ab64890Smrg 7601ab64890Smrg unsigned char *mb_parse_table = XLC_GENERIC(lcd, mb_parse_table); 7611ab64890Smrg 7621ab64890Smrg if (from == NULL || *from == NULL) { 7631ab64890Smrg _XlcResetConverter(conv); 7641ab64890Smrg return( 0 ); 7651ab64890Smrg } 7661ab64890Smrg 76737e7fe2cSchristos#ifdef notdef 7681ab64890Smrg if (*from_left > *to_left) 7691ab64890Smrg *from_left = *to_left; 77037e7fe2cSchristos#endif 7711ab64890Smrg 7721ab64890Smrg while (*from_left && *to_left) { 7731ab64890Smrg 7741ab64890Smrg ch = *inbufptr++; 7751ab64890Smrg (*from_left)--; 7761ab64890Smrg 7771ab64890Smrg /* null ? */ 7781ab64890Smrg if (!ch) { 7791ab64890Smrg if (outbufptr) {*outbufptr++ = L'\0';} 7801ab64890Smrg (*to_left)--; 7811ab64890Smrg 7821ab64890Smrg /* error check */ 7831ab64890Smrg if (len_left) { 7841ab64890Smrg unconv_num += (length - len_left); 7851ab64890Smrg len_left = 0; 7861ab64890Smrg } 7871ab64890Smrg 7881ab64890Smrg continue; 7891ab64890Smrg } 7901ab64890Smrg 7911ab64890Smrg /* same mb char data */ 7921ab64890Smrg if (len_left) 7931ab64890Smrg goto output_one_wc; 7941ab64890Smrg 7951ab64890Smrg /* next mb char data for single shift ? */ 7961ab64890Smrg if (mb_parse_table && (num = mb_parse_table[ch]) ) { 7971ab64890Smrg codeset = mb_parse_codeset(state, num, &inbufptr, from_left); 7981ab64890Smrg if (codeset != NULL) { 7991ab64890Smrg length = len_left = codeset->length; 8001ab64890Smrg mb = 0; 8011ab64890Smrg continue; 8021ab64890Smrg } 8031ab64890Smrg } 80461b2299dSmrg 8051ab64890Smrg /* next mb char data for byteM ? */ 8061ab64890Smrg if ((codeset = byteM_parse_codeset(lcd, (inbufptr - 1)))) 8071ab64890Smrg goto next_mb_char; 8081ab64890Smrg 8091ab64890Smrg /* next mb char data for GL or GR side ? */ 8101ab64890Smrg if ((codeset = GLGR_parse_codeset(ch))) 8111ab64890Smrg goto next_mb_char; 81261b2299dSmrg 8131ab64890Smrg /* can't find codeset for the ch */ 8141ab64890Smrg unconv_num++; 8151ab64890Smrg continue; 8161ab64890Smrg 8171ab64890Smrgnext_mb_char: 8181ab64890Smrg length = len_left = codeset->length; 8191ab64890Smrg mb = 0; 8201ab64890Smrg 8211ab64890Smrgoutput_one_wc: 8221ab64890Smrg mb = (mb << 8) | ch; /* 1 byte left shift */ 8231ab64890Smrg len_left--; 8241ab64890Smrg 8251ab64890Smrg /* last of one mb char data */ 8261ab64890Smrg if (!len_left) { 8271ab64890Smrg gi_to_wc(lcd, mb_to_gi(mb, codeset), codeset, &wc); 8281ab64890Smrg if (outbufptr) {*outbufptr++ = wc;} 8291ab64890Smrg (*to_left)--; 8301ab64890Smrg } 8311ab64890Smrg 8321ab64890Smrg } /* end of while */ 8331ab64890Smrg 8341ab64890Smrg /* error check on last char */ 8351ab64890Smrg if (len_left) { 8361ab64890Smrg inbufptr -= (length - len_left); 8371ab64890Smrg (*from_left) += (length - len_left); 8381ab64890Smrg unconv_num += (length - len_left); 8391ab64890Smrg } 8401ab64890Smrg 8411ab64890Smrg *from = (XPointer) ((const char *) *from + from_size); 8421ab64890Smrg *from_left = 0; 8431ab64890Smrg *to = (XPointer) outbufptr; 8441ab64890Smrg 8451ab64890Smrg return unconv_num; 8461ab64890Smrg} 8471ab64890Smrg 8481ab64890Smrgstatic int 8491ab64890Smrgstdc_mbstowcs( 8501ab64890Smrg XlcConv conv, 8511ab64890Smrg XPointer *from, 8521ab64890Smrg int *from_left, 8531ab64890Smrg XPointer *to, 8541ab64890Smrg int *to_left, 8551ab64890Smrg XPointer *args, 8561ab64890Smrg int num_args) 8571ab64890Smrg{ 8581ab64890Smrg const char *src = *((const char **) from); 8591ab64890Smrg wchar_t *dst = *((wchar_t **) to); 8601ab64890Smrg int src_left = *from_left; 8611ab64890Smrg int dst_left = *to_left; 8621ab64890Smrg int length, unconv_num = 0; 8631ab64890Smrg 8641ab64890Smrg while (src_left > 0 && dst_left > 0) { 8651ab64890Smrg length = mbtowc(dst, src, src_left); 8661ab64890Smrg 8671ab64890Smrg if (length > 0) { 8681ab64890Smrg src += length; 8691ab64890Smrg src_left -= length; 8701ab64890Smrg if (dst) 8711ab64890Smrg dst++; 8721ab64890Smrg dst_left--; 8731ab64890Smrg } else if (length < 0) { 8741ab64890Smrg src++; 8751ab64890Smrg src_left--; 8761ab64890Smrg unconv_num++; 8771ab64890Smrg } else { 8781ab64890Smrg /* null ? */ 8791ab64890Smrg src++; 8801ab64890Smrg src_left--; 88161b2299dSmrg if (dst) 8821ab64890Smrg *dst++ = L'\0'; 8831ab64890Smrg dst_left--; 8841ab64890Smrg } 8851ab64890Smrg } 8861ab64890Smrg 8871ab64890Smrg *from = (XPointer) src; 8881ab64890Smrg if (dst) 8891ab64890Smrg *to = (XPointer) dst; 8901ab64890Smrg *from_left = src_left; 8911ab64890Smrg *to_left = dst_left; 8921ab64890Smrg 8931ab64890Smrg return unconv_num; 8941ab64890Smrg} 8951ab64890Smrg 8961ab64890Smrgstatic int 8971ab64890Smrgwcstombs_org( 8981ab64890Smrg XlcConv conv, 8991ab64890Smrg XPointer *from, 9001ab64890Smrg int *from_left, 9011ab64890Smrg XPointer *to, 9021ab64890Smrg int *to_left, 9031ab64890Smrg XPointer *args, 9041ab64890Smrg int num_args) 9051ab64890Smrg{ 9061ab64890Smrg State state = (State) conv->state; 9071ab64890Smrg XLCd lcd = state->lcd; 9081ab64890Smrg 9091ab64890Smrg char *encoding; 9101ab64890Smrg unsigned long mb, glyph_index; 9111ab64890Smrg wchar_t wc; 9121ab64890Smrg 9131ab64890Smrg int length; 9141ab64890Smrg int unconv_num = 0; 9151ab64890Smrg 9161ab64890Smrg CodeSet codeset; 9171ab64890Smrg 9181ab64890Smrg const wchar_t *inbufptr = (const wchar_t *) *from; 9191ab64890Smrg char *outbufptr = *to; 9201ab64890Smrg int from_size = *from_left; 92161b2299dSmrg 9221ab64890Smrg const char *default_string = XLC_PUBLIC(lcd, default_string); 9231ab64890Smrg int defstr_len = strlen(default_string); 9241ab64890Smrg 9251ab64890Smrg 92637e7fe2cSchristos#ifdef notdef 9271ab64890Smrg if (*from_left > *to_left) 9281ab64890Smrg *from_left = *to_left; 92937e7fe2cSchristos#endif 9301ab64890Smrg 9311ab64890Smrg while (*from_left && *to_left) { 9321ab64890Smrg 9331ab64890Smrg wc = *inbufptr++; 9341ab64890Smrg (*from_left)--; 9351ab64890Smrg 9361ab64890Smrg /* null ? */ 9371ab64890Smrg if (!wc) { 9381ab64890Smrg if (outbufptr) {*outbufptr++ = '\0';} 9391ab64890Smrg (*to_left)--; 9401ab64890Smrg 9411ab64890Smrg continue; 9421ab64890Smrg } 9431ab64890Smrg 9441ab64890Smrg /* convert */ 9451ab64890Smrg if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) { 9461ab64890Smrg 9471ab64890Smrg /* output default_string of XDefaultString() */ 9481ab64890Smrg if (*to_left < defstr_len) 9491ab64890Smrg break; 9501ab64890Smrg if (outbufptr) { 9511ab64890Smrg strncpy((char *)outbufptr, default_string, defstr_len); 9521ab64890Smrg outbufptr += defstr_len; 9531ab64890Smrg } 9541ab64890Smrg (*to_left) -= defstr_len; 9551ab64890Smrg 9561ab64890Smrg unconv_num++; 9571ab64890Smrg 9581ab64890Smrg } else { 9591ab64890Smrg mb = gi_to_mb(glyph_index, codeset); 9601ab64890Smrg if (codeset->parse_info) { 9611ab64890Smrg Bool need_shift = False; 9621ab64890Smrg switch (codeset->parse_info->type) { 9631ab64890Smrg case E_LSL : 9641ab64890Smrg if (codeset != state->GL_codeset) { 9651ab64890Smrg need_shift = True; 9661ab64890Smrg state->GL_codeset = codeset; 9671ab64890Smrg } 9681ab64890Smrg break; 9691ab64890Smrg case E_LSR : 9701ab64890Smrg if (codeset != state->GR_codeset) { 9711ab64890Smrg need_shift = True; 9721ab64890Smrg state->GR_codeset = codeset; 9731ab64890Smrg } 9741ab64890Smrg break; 9751ab64890Smrg /* case E_SS */ 9761ab64890Smrg default: 9771ab64890Smrg need_shift = True; 9781ab64890Smrg } 9791ab64890Smrg 9801ab64890Smrg /* output shift sequence */ 9811ab64890Smrg if (need_shift) { 9821ab64890Smrg encoding = codeset->parse_info->encoding; 9831ab64890Smrg length = strlen(encoding); 9841ab64890Smrg if (*to_left < length) 9851ab64890Smrg break; 9861ab64890Smrg if (outbufptr) { 9871ab64890Smrg strncpy((char *)outbufptr, encoding, length); 9881ab64890Smrg outbufptr += length; 9891ab64890Smrg } 9901ab64890Smrg (*to_left) -= length; 9911ab64890Smrg } 9921ab64890Smrg } 9931ab64890Smrg 9941ab64890Smrg /* output characters */ 9951ab64890Smrg length = codeset->length; 9961ab64890Smrg if (*to_left < length) 9971ab64890Smrg break; 9981ab64890Smrg 9991ab64890Smrg if (outbufptr) { 10001ab64890Smrg output_ulong_value(outbufptr, mb, length, XlcNONE); 10011ab64890Smrg outbufptr += length; 10021ab64890Smrg } 10031ab64890Smrg 10041ab64890Smrg (*to_left) -= length; 10051ab64890Smrg } 10061ab64890Smrg 10071ab64890Smrg } /* end of while */ 10081ab64890Smrg 10091ab64890Smrg *from = (XPointer) ((const wchar_t *) *from + from_size); 10101ab64890Smrg *from_left = 0; 10111ab64890Smrg *to = (XPointer) outbufptr; 10121ab64890Smrg 10131ab64890Smrg return unconv_num; 10141ab64890Smrg} 10151ab64890Smrg 10161ab64890Smrgstatic int 10171ab64890Smrgstdc_wcstombs( 10181ab64890Smrg XlcConv conv, 10191ab64890Smrg XPointer *from, 10201ab64890Smrg int *from_left, 10211ab64890Smrg XPointer *to, 10221ab64890Smrg int *to_left, 10231ab64890Smrg XPointer *args, 10241ab64890Smrg int num_args) 10251ab64890Smrg{ 10261ab64890Smrg const wchar_t *src = *((const wchar_t **) from); 10271ab64890Smrg char *dst = *((char **) to); 10281ab64890Smrg int src_left = *from_left; 10291ab64890Smrg int dst_left = *to_left; 10301ab64890Smrg int length, unconv_num = 0; 10311ab64890Smrg 10321ab64890Smrg while (src_left > 0 && dst_left >= MB_CUR_MAX) { 10331ab64890Smrg length = wctomb(dst, *src); /* XXX */ 10341ab64890Smrg 10351ab64890Smrg if (length > 0) { 10361ab64890Smrg src++; 10371ab64890Smrg src_left--; 103861b2299dSmrg if (dst) 10391ab64890Smrg dst += length; 10401ab64890Smrg dst_left -= length; 10411ab64890Smrg } else if (length < 0) { 10421ab64890Smrg src++; 10431ab64890Smrg src_left--; 10441ab64890Smrg unconv_num++; 104561b2299dSmrg } 10461ab64890Smrg } 10471ab64890Smrg 10481ab64890Smrg *from = (XPointer) src; 10491ab64890Smrg if (dst) 10501ab64890Smrg *to = (XPointer) dst; 10511ab64890Smrg *from_left = src_left; 10521ab64890Smrg *to_left = dst_left; 10531ab64890Smrg 10541ab64890Smrg return unconv_num; 10551ab64890Smrg} 10561ab64890Smrg 10571ab64890Smrgstatic int 10581ab64890Smrgwcstocts( 10591ab64890Smrg XlcConv conv, 10601ab64890Smrg XPointer *from, 10611ab64890Smrg int *from_left, 10621ab64890Smrg XPointer *to, 10631ab64890Smrg int *to_left, 10641ab64890Smrg XPointer *args, 10651ab64890Smrg int num_args) 10661ab64890Smrg{ 10671ab64890Smrg State state = (State) conv->state; 10681ab64890Smrg XLCd lcd = state->lcd; 10691ab64890Smrg 10701ab64890Smrg unsigned long glyph_index; 10711ab64890Smrg wchar_t wc; 10721ab64890Smrg 10731ab64890Smrg int total_len, seq_len, name_len; 10741ab64890Smrg int unconv_num = 0; 10751ab64890Smrg Bool first_flag = True, standard_flag; 10761ab64890Smrg XlcSide side; 10771ab64890Smrg 10781ab64890Smrg CodeSet codeset; 10791ab64890Smrg XlcCharSet charset, old_charset = NULL; 10801ab64890Smrg const char *ct_sequence; 10811ab64890Smrg 10821ab64890Smrg const wchar_t *inbufptr = (const wchar_t *) *from; 10831ab64890Smrg char *outbufptr = *to; 10841ab64890Smrg int from_size = *from_left; 10851ab64890Smrg char *ext_seg_len = NULL; 10861ab64890Smrg 108737e7fe2cSchristos#ifdef notdef 10881ab64890Smrg if (*from_left > *to_left) 10891ab64890Smrg *from_left = *to_left; 109037e7fe2cSchristos#endif 10911ab64890Smrg 10921ab64890Smrg while (*from_left && *to_left) { 10931ab64890Smrg 10941ab64890Smrg wc = *inbufptr++; 10951ab64890Smrg (*from_left)--; 10961ab64890Smrg 10971ab64890Smrg /* null ? */ 10981ab64890Smrg if (!wc) { 10991ab64890Smrg if (outbufptr) {*outbufptr++ = '\0';} 11001ab64890Smrg (*to_left)--; 11011ab64890Smrg 11021ab64890Smrg continue; 11031ab64890Smrg } 11041ab64890Smrg 11051ab64890Smrg /* convert */ 11061ab64890Smrg if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) { 11071ab64890Smrg unconv_num++; 11081ab64890Smrg continue; 11091ab64890Smrg } 11101ab64890Smrg 11111ab64890Smrg /* parse charset */ 11121ab64890Smrg if ( !(charset = gi_parse_charset(glyph_index, codeset)) ) { 11131ab64890Smrg unconv_num++; 11141ab64890Smrg continue; 11151ab64890Smrg } 11161ab64890Smrg 11171ab64890Smrg /* Standard Character Set Encoding ? */ 11181ab64890Smrg standard_flag = charset->source == CSsrcStd ? True : False; 11191ab64890Smrg 11201ab64890Smrg /* 11211ab64890Smrg * Non-Standard Character Set Encoding 11221ab64890Smrg * 11231ab64890Smrg * +-----+-----+-----+-----+-----+-----+-----+---- ----+-----+-----+ 11241ab64890Smrg * | esc sequence | M | L | encoding name | STX | 11251ab64890Smrg * +-----+-----+-----+-----+-----+-----+-----+---- ----+-----+-----+ 112661b2299dSmrg * 4bytes 1byte 1byte variable length 1byte 11271ab64890Smrg * | | 11281ab64890Smrg * +-----------------------------------------+ 11291ab64890Smrg * name length = ((M - 128) * 128) + (L - 128) 11301ab64890Smrg */ 11311ab64890Smrg 11321ab64890Smrg /* make encoding data */ 11331ab64890Smrg ct_sequence = charset->ct_sequence; 11341ab64890Smrg side = charset->side; 11351ab64890Smrg seq_len = strlen(ct_sequence); 11361ab64890Smrg if (standard_flag) { 11371ab64890Smrg name_len = 0; 11381ab64890Smrg total_len = seq_len; 11391ab64890Smrg } else { 11401ab64890Smrg name_len = strlen(charset->encoding_name) + 1; 11411ab64890Smrg total_len = seq_len + name_len + 2; 11421ab64890Smrg } 11431ab64890Smrg 11441ab64890Smrg /* output escape sequence of CT */ 11451ab64890Smrg if ( (charset != old_charset) && 11461ab64890Smrg !(first_flag && charset->string_encoding) ){ 11471ab64890Smrg 11481ab64890Smrg if ( (ext_seg_len != NULL) && outbufptr) { 11491ab64890Smrg int i = (outbufptr - ext_seg_len) - 2; 11501ab64890Smrg *ext_seg_len++ = i / 128 + 128; 11511ab64890Smrg *ext_seg_len = i % 128 + 128; 11521ab64890Smrg ext_seg_len = NULL; 11531ab64890Smrg } 115461b2299dSmrg 11551ab64890Smrg if (*to_left < total_len + 1) { 11561ab64890Smrg unconv_num++; 11571ab64890Smrg break; 11581ab64890Smrg } 11591ab64890Smrg 11601ab64890Smrg if (outbufptr) { 11611ab64890Smrg strcpy((char *)outbufptr, ct_sequence); 11621ab64890Smrg outbufptr += seq_len; 11631ab64890Smrg 11641ab64890Smrg if (!standard_flag) { 11651ab64890Smrg const char *i = charset->encoding_name; 11661ab64890Smrg ext_seg_len = outbufptr; 11671ab64890Smrg outbufptr += 2; 11681ab64890Smrg for (; *i ; i++) 11691ab64890Smrg *outbufptr++ = ((*i >= 'A') && (*i <= 'Z')) ? 11701ab64890Smrg *i - 'A' + 'a' : *i; 11711ab64890Smrg *outbufptr++ = STX; 11721ab64890Smrg } 11731ab64890Smrg } 11741ab64890Smrg 11751ab64890Smrg (*to_left) -= total_len; 11761ab64890Smrg 11771ab64890Smrg first_flag = False; 11781ab64890Smrg old_charset = charset; 11791ab64890Smrg } 11801ab64890Smrg 11811ab64890Smrg /* output glyph index */ 11821ab64890Smrg if (codeset->ctconv) 11831ab64890Smrg glyph_index = conv_to_dest(codeset->ctconv, glyph_index); 11841ab64890Smrg if (*to_left < charset->char_size) { 11851ab64890Smrg unconv_num++; 11861ab64890Smrg break; 11871ab64890Smrg } 11881ab64890Smrg 11891ab64890Smrg if (outbufptr) { 11901ab64890Smrg output_ulong_value(outbufptr, glyph_index, charset->char_size, side); 11911ab64890Smrg outbufptr += charset->char_size; 11921ab64890Smrg } 11931ab64890Smrg 11941ab64890Smrg (*to_left) -= charset->char_size; 11951ab64890Smrg 11961ab64890Smrg } /* end of while */ 11971ab64890Smrg 11981ab64890Smrg if ( (ext_seg_len != NULL) && outbufptr) { 11991ab64890Smrg int i = (outbufptr - ext_seg_len) - 2; 12001ab64890Smrg *ext_seg_len++ = i / 128 + 128; 12011ab64890Smrg *ext_seg_len = i % 128 + 128; 12021ab64890Smrg } 12031ab64890Smrg 12041ab64890Smrg *from = (XPointer) ((const wchar_t *) *from + from_size); 12051ab64890Smrg *from_left = 0; 12061ab64890Smrg *to = (XPointer) outbufptr; 12071ab64890Smrg 12081ab64890Smrg return unconv_num; 12091ab64890Smrg} 12101ab64890Smrg 12111ab64890Smrgstatic int 12121ab64890Smrgstdc_wcstocts( 12131ab64890Smrg XlcConv conv, 12141ab64890Smrg XPointer *from, 12151ab64890Smrg int *from_left, 12161ab64890Smrg XPointer *to, 12171ab64890Smrg int *to_left, 12181ab64890Smrg XPointer *args, 12191ab64890Smrg int num_args) 12201ab64890Smrg{ 12211ab64890Smrg XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX); 12221ab64890Smrg char *buf_ptr1 = buf; 12231ab64890Smrg int buf_left1 = (*from_left) * MB_CUR_MAX; 12241ab64890Smrg char *buf_ptr2 = buf_ptr1; 12251ab64890Smrg int buf_left2; 12261ab64890Smrg int unconv_num1 = 0, unconv_num2 = 0; 12271ab64890Smrg 122861b2299dSmrg unconv_num1 = stdc_wcstombs(conv, 12291ab64890Smrg from, from_left, &buf_ptr1, &buf_left1, args, num_args); 12301ab64890Smrg if (unconv_num1 < 0) 12311ab64890Smrg goto ret; 12321ab64890Smrg 12331ab64890Smrg buf_left2 = buf_ptr1 - buf_ptr2; 12341ab64890Smrg 123561b2299dSmrg unconv_num2 = mbstocts(conv, 12361ab64890Smrg &buf_ptr2, &buf_left2, to, to_left, args, num_args); 12371ab64890Smrg if (unconv_num2 < 0) 12381ab64890Smrg goto ret; 12391ab64890Smrg 12401ab64890Smrgret: 12411ab64890Smrg if (buf) 12421ab64890Smrg Xfree((char *)buf); 12431ab64890Smrg 12441ab64890Smrg return (unconv_num1 + unconv_num2); 12451ab64890Smrg} 12461ab64890Smrg 12471ab64890Smrgstatic int 12481ab64890Smrgctstowcs( 12491ab64890Smrg XlcConv conv, 12501ab64890Smrg XPointer *from, 12511ab64890Smrg int *from_left, 12521ab64890Smrg XPointer *to, 12531ab64890Smrg int *to_left, 12541ab64890Smrg XPointer *args, 12551ab64890Smrg int num_args) 12561ab64890Smrg{ 12571ab64890Smrg State state = (State) conv->state; 12581ab64890Smrg XLCd lcd = state->lcd; 12591ab64890Smrg 12601ab64890Smrg unsigned char ch; 12611ab64890Smrg unsigned long glyph_index = 0; 12621ab64890Smrg wchar_t wc; 12631ab64890Smrg 12641ab64890Smrg int ctr_seq_len = 0, gi_len_left = 0, gi_len = 0; 12651ab64890Smrg int unconv_num = 0; 12661ab64890Smrg 12671ab64890Smrg CodeSet codeset = NULL; 12681ab64890Smrg XlcCharSet charset_tmp; 12691ab64890Smrg 12701ab64890Smrg const char *inbufptr = *from; 12711ab64890Smrg wchar_t *outbufptr = (wchar_t *) *to; 12721ab64890Smrg int from_size = *from_left; 12731ab64890Smrg 12741ab64890Smrg _XlcResetConverter(conv); /* ??? */ 12751ab64890Smrg 12761ab64890Smrg if (from == NULL || *from == NULL) { 12771ab64890Smrg _XlcResetConverter(conv); 12781ab64890Smrg return( 0 ); 12791ab64890Smrg } 12801ab64890Smrg 128137e7fe2cSchristos#ifdef notdef 12821ab64890Smrg if (*from_left > *to_left) 12831ab64890Smrg *from_left = *to_left; 128437e7fe2cSchristos#endif 12851ab64890Smrg 12861ab64890Smrg while (*from_left && *to_left) { 12871ab64890Smrg 12881ab64890Smrg ch = *inbufptr++; 12891ab64890Smrg (*from_left)--; 12901ab64890Smrg 12911ab64890Smrg /* null ? */ 12921ab64890Smrg if (!ch) { 12931ab64890Smrg if (outbufptr) {*outbufptr++ = L'\0';} 12941ab64890Smrg (*to_left)--; 12951ab64890Smrg 12961ab64890Smrg /* error check */ 12971ab64890Smrg if (gi_len_left) { 12981ab64890Smrg unconv_num += (gi_len - gi_len_left); 12991ab64890Smrg gi_len_left = 0; 13001ab64890Smrg } 13011ab64890Smrg 13021ab64890Smrg continue; 13031ab64890Smrg } 13041ab64890Smrg 13051ab64890Smrg /* same glyph_index data */ 13061ab64890Smrg if (gi_len_left) 13071ab64890Smrg goto output_one_wc; 13081ab64890Smrg 13091ab64890Smrg /* control sequence ? */ 13101ab64890Smrg if (ch == CSI) { 13111ab64890Smrg if ( !ct_parse_csi(inbufptr - 1, &ctr_seq_len) ) 13121ab64890Smrg goto skip_the_seg; 13131ab64890Smrg 13141ab64890Smrg if (*from_left + 1 < ctr_seq_len) { 13151ab64890Smrg inbufptr--; 13161ab64890Smrg (*from_left)++; 13171ab64890Smrg unconv_num += *from_left; 13181ab64890Smrg break; 13191ab64890Smrg } 13201ab64890Smrg 13211ab64890Smrg /* skip the control sequence */ 13221ab64890Smrg inbufptr += (ctr_seq_len - 1); 13231ab64890Smrg *from_left -= (ctr_seq_len - 1); 13241ab64890Smrg 13251ab64890Smrg continue; 13261ab64890Smrg } 13271ab64890Smrg 13281ab64890Smrg /* escape sequence ? */ 13291ab64890Smrg if (ch == ESC) { 133061b2299dSmrg if ( !ct_parse_charset(lcd, 13311ab64890Smrg inbufptr - 1, &state->charset, &ctr_seq_len) ) 13321ab64890Smrg goto skip_the_seg; 13331ab64890Smrg 133461b2299dSmrg if (state->charset->side == XlcC0 || 13351ab64890Smrg state->charset->side == XlcGL) 13361ab64890Smrg { 13371ab64890Smrg state->GL_charset = state->charset; 13381ab64890Smrg } 133961b2299dSmrg else if (state->charset->side == XlcC1 || 13401ab64890Smrg state->charset->side == XlcGR) 13411ab64890Smrg { 13421ab64890Smrg state->GR_charset = state->charset; 134361b2299dSmrg } 13441ab64890Smrg else if (state->charset->side == XlcGLGR) 13451ab64890Smrg { 13461ab64890Smrg state->GL_charset = state->charset; 13471ab64890Smrg state->GR_charset = state->charset; 134861b2299dSmrg } 13491ab64890Smrg 13501ab64890Smrg if (*from_left + 1 < ctr_seq_len) { 13511ab64890Smrg inbufptr--; 13521ab64890Smrg (*from_left)++; 13531ab64890Smrg unconv_num += *from_left; 13541ab64890Smrg break; 13551ab64890Smrg } 13561ab64890Smrg 13571ab64890Smrg /* skip the escape sequence */ 13581ab64890Smrg inbufptr += (ctr_seq_len - 1); 13591ab64890Smrg *from_left -= (ctr_seq_len - 1); 13601ab64890Smrg 13611ab64890Smrg continue; 136261b2299dSmrg } 13631ab64890Smrg 13641ab64890Smrg /* check current state */ 13651ab64890Smrg if (isleftside(ch)) 13661ab64890Smrg state->charset = state->GL_charset; 13671ab64890Smrg else 13681ab64890Smrg state->charset = state->GR_charset; 13691ab64890Smrg 13701ab64890Smrg gi_len = gi_len_left = state->charset->char_size; 13711ab64890Smrg glyph_index = 0; 13721ab64890Smrg 13731ab64890Smrgoutput_one_wc: 13741ab64890Smrg if (state->charset->side == XlcC1 || state->charset->side == XlcGR) 13751ab64890Smrg glyph_index = (glyph_index << 8) | (ch & GL); 13761ab64890Smrg else 13771ab64890Smrg glyph_index = (glyph_index << 8) | ch; 13781ab64890Smrg 13791ab64890Smrg gi_len_left--; 13801ab64890Smrg 13811ab64890Smrg /* last of one glyph_index data */ 13821ab64890Smrg if (!gi_len_left) { 13831ab64890Smrg 13841ab64890Smrg /* segment conversion */ 13851ab64890Smrg charset_tmp = state->charset; 13861ab64890Smrg segment_conversion(lcd, &charset_tmp, &glyph_index); 13871ab64890Smrg 13881ab64890Smrg /* get codeset */ 138961b2299dSmrg if ( !_XlcGetCodeSetFromCharSet(lcd, charset_tmp, 13901ab64890Smrg &codeset, &glyph_index) ) { 13911ab64890Smrg unconv_num += gi_len; 13921ab64890Smrg continue; 13931ab64890Smrg } 13941ab64890Smrg 13951ab64890Smrg /* convert glyph index to wicd char */ 13961ab64890Smrg gi_to_wc(lcd, glyph_index, codeset, &wc); 13971ab64890Smrg if (outbufptr) {*outbufptr++ = wc;} 13981ab64890Smrg (*to_left)--; 13991ab64890Smrg } 14001ab64890Smrg 14011ab64890Smrg continue; 14021ab64890Smrg 14031ab64890Smrgskip_the_seg: 14041ab64890Smrg /* skip until next escape or control sequence */ 14051ab64890Smrg while ( *from_left ) { 14061ab64890Smrg ch = *inbufptr++; 14071ab64890Smrg (*from_left)--; 14081ab64890Smrg unconv_num++; 14091ab64890Smrg 14101ab64890Smrg if (ch == ESC || ch == CSI) { 14111ab64890Smrg inbufptr--; 14121ab64890Smrg (*from_left)++; 14131ab64890Smrg unconv_num--; 14141ab64890Smrg break; 14151ab64890Smrg } 14161ab64890Smrg } 14171ab64890Smrg 14181ab64890Smrg if ( !(*from_left) ) 14191ab64890Smrg break; 14201ab64890Smrg 14211ab64890Smrg } /* end of while */ 14221ab64890Smrg 14231ab64890Smrg /* error check on last char */ 14241ab64890Smrg if (gi_len_left) { 14251ab64890Smrg inbufptr -= (gi_len - gi_len_left); 14261ab64890Smrg (*from_left) += (gi_len - gi_len_left); 14271ab64890Smrg unconv_num += (gi_len - gi_len_left); 14281ab64890Smrg } 14291ab64890Smrg 14301ab64890Smrg *from = (XPointer) ((const char *) *from + from_size); 14311ab64890Smrg *from_left = 0; 14321ab64890Smrg *to = (XPointer) outbufptr; 14331ab64890Smrg 14341ab64890Smrg return unconv_num; 14351ab64890Smrg} 14361ab64890Smrg 14371ab64890Smrgstatic int 14381ab64890Smrgcstowcs( 14391ab64890Smrg XlcConv conv, 14401ab64890Smrg XPointer *from, 14411ab64890Smrg int *from_left, 14421ab64890Smrg XPointer *to, 14431ab64890Smrg int *to_left, 14441ab64890Smrg XPointer *args, 14451ab64890Smrg int num_args) 14461ab64890Smrg{ 14471ab64890Smrg State state = (State) conv->state; 14481ab64890Smrg XLCd lcd = state->lcd; 14491ab64890Smrg 14501ab64890Smrg unsigned char ch; 14511ab64890Smrg unsigned long glyph_index = 0; 14521ab64890Smrg wchar_t wc; 14531ab64890Smrg int gi_len_left = 0, gi_len = 0; 14541ab64890Smrg 14551ab64890Smrg int unconv_num = 0; 14561ab64890Smrg 14571ab64890Smrg CodeSet codeset = NULL; 14581ab64890Smrg XlcCharSet charset, charset_tmp; 14591ab64890Smrg 14601ab64890Smrg const char *inbufptr = *from; 14611ab64890Smrg wchar_t *outbufptr = (wchar_t *) *to; 14621ab64890Smrg int from_size = *from_left; 14631ab64890Smrg 14641ab64890Smrg if (from == NULL || *from == NULL) { 14651ab64890Smrg return( 0 ); 14661ab64890Smrg } 14671ab64890Smrg 14681ab64890Smrg charset = (XlcCharSet) args[0]; 14691ab64890Smrg 14701ab64890Smrg while (*from_left && *to_left) { 14711ab64890Smrg 14721ab64890Smrg if (!gi_len_left) { 14731ab64890Smrg gi_len_left = gi_len = charset->char_size; 14741ab64890Smrg glyph_index = 0; 14751ab64890Smrg } 14761ab64890Smrg 14771ab64890Smrg ch = *inbufptr++; 14781ab64890Smrg (*from_left)--; 14791ab64890Smrg 14801ab64890Smrg /* null ? */ 14811ab64890Smrg if (!ch) { 14821ab64890Smrg if (outbufptr) {*outbufptr++ = L'\0';} 14831ab64890Smrg (*to_left)--; 14841ab64890Smrg 14851ab64890Smrg /* error check */ 14861ab64890Smrg if (gi_len_left) { 14871ab64890Smrg unconv_num += (gi_len - gi_len_left); 14881ab64890Smrg gi_len_left = 0; 14891ab64890Smrg } 14901ab64890Smrg continue; 14911ab64890Smrg } 14921ab64890Smrg 14931ab64890Smrg if (charset->side == XlcC1 || charset->side == XlcGR) 14941ab64890Smrg glyph_index = (glyph_index << 8) | (ch & GL); 14951ab64890Smrg else 14961ab64890Smrg glyph_index = (glyph_index << 8) | ch; 14971ab64890Smrg 14981ab64890Smrg gi_len_left--; 14991ab64890Smrg 15001ab64890Smrg /* last of one glyph_index data */ 15011ab64890Smrg if (!gi_len_left) { 15021ab64890Smrg 15031ab64890Smrg /* segment conversion */ 15041ab64890Smrg charset_tmp = charset; 15051ab64890Smrg segment_conversion(lcd, &charset_tmp, &glyph_index); 15061ab64890Smrg 15071ab64890Smrg /* get codeset */ 150861b2299dSmrg if ( !_XlcGetCodeSetFromCharSet(lcd, charset_tmp, 15091ab64890Smrg &codeset, &glyph_index) ) { 15101ab64890Smrg unconv_num += gi_len; 15111ab64890Smrg continue; 15121ab64890Smrg } 15131ab64890Smrg 15141ab64890Smrg /* convert glyph index to wicd char */ 15151ab64890Smrg gi_to_wc(lcd, glyph_index, codeset, &wc); 15161ab64890Smrg if (outbufptr) {*outbufptr++ = wc;} 15171ab64890Smrg (*to_left)--; 15181ab64890Smrg } 15191ab64890Smrg 15201ab64890Smrg } /* end of while */ 15211ab64890Smrg 15221ab64890Smrg /* error check on last char */ 15231ab64890Smrg if (gi_len_left) { 15241ab64890Smrg inbufptr -= (gi_len - gi_len_left); 15251ab64890Smrg (*from_left) += (gi_len - gi_len_left); 15261ab64890Smrg unconv_num += (gi_len - gi_len_left); 15271ab64890Smrg } 15281ab64890Smrg 15291ab64890Smrg *from = (XPointer) ((const char *) *from + from_size); 15301ab64890Smrg *from_left = 0; 15311ab64890Smrg *to = (XPointer) outbufptr; 15321ab64890Smrg 15331ab64890Smrg return unconv_num; 15341ab64890Smrg} 15351ab64890Smrg 15361ab64890Smrgstatic int 15371ab64890Smrgstdc_ctstowcs( 15381ab64890Smrg XlcConv conv, 15391ab64890Smrg XPointer *from, 15401ab64890Smrg int *from_left, 15411ab64890Smrg XPointer *to, 15421ab64890Smrg int *to_left, 15431ab64890Smrg XPointer *args, 15441ab64890Smrg int num_args) 15451ab64890Smrg{ 15461ab64890Smrg XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX); 15471ab64890Smrg char *buf_ptr1 = buf; 15481ab64890Smrg int buf_left1 = (*from_left) * MB_CUR_MAX; 15491ab64890Smrg char *buf_ptr2 = buf_ptr1; 15501ab64890Smrg int buf_left2; 15511ab64890Smrg int unconv_num1 = 0, unconv_num2 = 0; 15521ab64890Smrg 155361b2299dSmrg unconv_num1 = ctstombs(conv, 15541ab64890Smrg from, from_left, &buf_ptr1, &buf_left1, args, num_args); 15551ab64890Smrg if (unconv_num1 < 0) 15561ab64890Smrg goto ret; 15571ab64890Smrg 15581ab64890Smrg buf_left2 = buf_ptr1 - buf_ptr2; 15591ab64890Smrg 156061b2299dSmrg unconv_num2 = stdc_mbstowcs(conv, 15611ab64890Smrg &buf_ptr2, &buf_left2, to, to_left, args, num_args); 15621ab64890Smrg if (unconv_num2 < 0) 15631ab64890Smrg goto ret; 15641ab64890Smrg 15651ab64890Smrgret: 15661ab64890Smrg if (buf) 15671ab64890Smrg Xfree((char *)buf); 15681ab64890Smrg 15691ab64890Smrg return (unconv_num1 + unconv_num2); 15701ab64890Smrg} 15711ab64890Smrg 15721ab64890Smrgstatic int 15731ab64890Smrgstdc_cstowcs( 15741ab64890Smrg XlcConv conv, 15751ab64890Smrg XPointer *from, 15761ab64890Smrg int *from_left, 15771ab64890Smrg XPointer *to, 15781ab64890Smrg int *to_left, 15791ab64890Smrg XPointer *args, 15801ab64890Smrg int num_args) 15811ab64890Smrg{ 15821ab64890Smrg XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX); 15831ab64890Smrg char *buf_ptr1 = buf; 15841ab64890Smrg int buf_left1 = (*from_left) * MB_CUR_MAX; 15851ab64890Smrg char *buf_ptr2 = buf_ptr1; 15861ab64890Smrg int buf_left2; 15871ab64890Smrg int unconv_num1 = 0, unconv_num2 = 0; 15881ab64890Smrg 158961b2299dSmrg unconv_num1 = cstombs(conv, 15901ab64890Smrg from, from_left, &buf_ptr1, &buf_left1, args, num_args); 15911ab64890Smrg if (unconv_num1 < 0) 15921ab64890Smrg goto ret; 15931ab64890Smrg 15941ab64890Smrg buf_left2 = buf_ptr1 - buf_ptr2; 15951ab64890Smrg 159661b2299dSmrg unconv_num2 = stdc_mbstowcs(conv, 15971ab64890Smrg &buf_ptr2, &buf_left2, to, to_left, args, num_args); 15981ab64890Smrg if (unconv_num2 < 0) 15991ab64890Smrg goto ret; 16001ab64890Smrg 16011ab64890Smrgret: 16021ab64890Smrg if (buf) 16031ab64890Smrg Xfree((char *)buf); 16041ab64890Smrg 16051ab64890Smrg return (unconv_num1 + unconv_num2); 16061ab64890Smrg} 16071ab64890Smrg 16081ab64890Smrgstatic int 16091ab64890Smrgmbstocts( 16101ab64890Smrg XlcConv conv, 16111ab64890Smrg XPointer *from, 16121ab64890Smrg int *from_left, 16131ab64890Smrg XPointer *to, 16141ab64890Smrg int *to_left, 16151ab64890Smrg XPointer *args, 16161ab64890Smrg int num_args) 16171ab64890Smrg{ 16181ab64890Smrg XPointer buf = Xmalloc((*from_left) * sizeof(wchar_t)); 16191ab64890Smrg char *buf_ptr1 = buf; 16201ab64890Smrg int buf_left1 = (*from_left); 16211ab64890Smrg char *buf_ptr2 = buf_ptr1; 16221ab64890Smrg int buf_left2; 16231ab64890Smrg int unconv_num1 = 0, unconv_num2 = 0; 16241ab64890Smrg 162561b2299dSmrg unconv_num1 = mbstowcs_org(conv, 16261ab64890Smrg from, from_left, &buf_ptr1, &buf_left1, args, num_args); 16271ab64890Smrg if (unconv_num1 < 0) 16281ab64890Smrg goto ret; 16291ab64890Smrg 16301ab64890Smrg buf_left2 = (buf_ptr1 - buf_ptr2) / sizeof(wchar_t); 16311ab64890Smrg 163261b2299dSmrg unconv_num2 += wcstocts(conv, 16331ab64890Smrg &buf_ptr2, &buf_left2, to, to_left, args, num_args); 16341ab64890Smrg if (unconv_num2 < 0) 16351ab64890Smrg goto ret; 16361ab64890Smrg 16371ab64890Smrgret: 16381ab64890Smrg if (buf) 16391ab64890Smrg Xfree((char *)buf); 16401ab64890Smrg 16411ab64890Smrg return (unconv_num1 + unconv_num2); 16421ab64890Smrg} 16431ab64890Smrg 16441ab64890Smrgstatic int 16451ab64890Smrgmbstostr( 16461ab64890Smrg XlcConv conv, 16471ab64890Smrg XPointer *from, 16481ab64890Smrg int *from_left, 16491ab64890Smrg XPointer *to, 16501ab64890Smrg int *to_left, 16511ab64890Smrg XPointer *args, 16521ab64890Smrg int num_args) 16531ab64890Smrg{ 16541ab64890Smrg State state = (State) conv->state; 16551ab64890Smrg XLCd lcd = state->lcd; 16561ab64890Smrg 16571ab64890Smrg unsigned char ch; 16581ab64890Smrg unsigned long mb = 0; 16591ab64890Smrg 16601ab64890Smrg int length = 0, len_left = 0; 16611ab64890Smrg int unconv_num = 0; 16621ab64890Smrg int num; 16631ab64890Smrg 16641ab64890Smrg CodeSet codeset = NULL; 16651ab64890Smrg 16661ab64890Smrg const char *inbufptr = *from; 16671ab64890Smrg char *outbufptr = *to; 16681ab64890Smrg int from_size = *from_left; 16691ab64890Smrg 16701ab64890Smrg unsigned char *mb_parse_table = XLC_GENERIC(lcd, mb_parse_table); 16711ab64890Smrg 16721ab64890Smrg if (from == NULL || *from == NULL) { 16731ab64890Smrg _XlcResetConverter(conv); 16741ab64890Smrg return( 0 ); 16751ab64890Smrg } 16761ab64890Smrg 167737e7fe2cSchristos#ifdef notdef 16781ab64890Smrg if (*from_left > *to_left) 16791ab64890Smrg *from_left = *to_left; 168037e7fe2cSchristos#endif 16811ab64890Smrg 16821ab64890Smrg while (*from_left && *to_left) { 16831ab64890Smrg 16841ab64890Smrg ch = *inbufptr++; 16851ab64890Smrg (*from_left)--; 16861ab64890Smrg 16871ab64890Smrg /* null ? */ 16881ab64890Smrg if (!ch) { 16891ab64890Smrg if (outbufptr) {*outbufptr++ = '\0';} 16901ab64890Smrg (*to_left)--; 16911ab64890Smrg 16921ab64890Smrg /* error check */ 16931ab64890Smrg if (len_left) { 16941ab64890Smrg unconv_num += (length - len_left); 16951ab64890Smrg len_left = 0; 16961ab64890Smrg } 16971ab64890Smrg 16981ab64890Smrg continue; 16991ab64890Smrg } 17001ab64890Smrg 17011ab64890Smrg /* same mb char data */ 17021ab64890Smrg if (len_left) 17031ab64890Smrg goto output_one_mb; 17041ab64890Smrg 17051ab64890Smrg /* next mb char data for single shift ? */ 17061ab64890Smrg if (mb_parse_table && (num = mb_parse_table[ch]) ) { 17071ab64890Smrg codeset = mb_parse_codeset(state, num, &inbufptr, from_left); 17081ab64890Smrg if (codeset != NULL) { 17091ab64890Smrg length = len_left = codeset->length; 17101ab64890Smrg mb = 0; 17111ab64890Smrg continue; 17121ab64890Smrg } 17131ab64890Smrg } 17141ab64890Smrg 17151ab64890Smrg /* next char data : byteM ? */ 17161ab64890Smrg if ((codeset = byteM_parse_codeset(lcd, (inbufptr - 1)))) 17171ab64890Smrg goto next_mb_char; 17181ab64890Smrg 17191ab64890Smrg /* next char data : GL or GR side ? */ 17201ab64890Smrg if ((codeset = GLGR_parse_codeset(ch))) 17211ab64890Smrg goto next_mb_char; 172261b2299dSmrg 17231ab64890Smrg /* can't find codeset for the ch */ 17241ab64890Smrg unconv_num++; 17251ab64890Smrg continue; 17261ab64890Smrg 17271ab64890Smrgnext_mb_char: 17281ab64890Smrg length = len_left = codeset->length; 17291ab64890Smrg mb = 0; 17301ab64890Smrg 17311ab64890Smrgoutput_one_mb: 17321ab64890Smrg mb = (mb << 8) | ch; /* 1 byte left shift */ 17331ab64890Smrg len_left--; 17341ab64890Smrg 17351ab64890Smrg /* last of one mb char data */ 17361ab64890Smrg if (!len_left) { 17371ab64890Smrg if (check_string_encoding(codeset)) { 17381ab64890Smrg if (outbufptr) {*outbufptr++ = mb & 0xff;} 17391ab64890Smrg (*to_left)--; 17401ab64890Smrg } else { 17411ab64890Smrg unconv_num++; 17421ab64890Smrg } 17431ab64890Smrg } 17441ab64890Smrg 17451ab64890Smrg } /* end of while */ 17461ab64890Smrg 17471ab64890Smrg /* error check on last char */ 17481ab64890Smrg if (len_left) { 17491ab64890Smrg inbufptr -= (length - len_left); 17501ab64890Smrg (*from_left) += (length - len_left); 17511ab64890Smrg unconv_num += (length - len_left); 17521ab64890Smrg } 17531ab64890Smrg 17541ab64890Smrg *from = (XPointer) ((const char *) *from + from_size); 17551ab64890Smrg *from_left = 0; 17561ab64890Smrg *to = (XPointer) outbufptr; 17571ab64890Smrg 17581ab64890Smrg return unconv_num; 17591ab64890Smrg} 17601ab64890Smrg 17611ab64890Smrgstatic int 17621ab64890Smrgmbtocs( 17631ab64890Smrg XlcConv conv, 17641ab64890Smrg XPointer *from, 17651ab64890Smrg int *from_left, 17661ab64890Smrg XPointer *to, 17671ab64890Smrg int *to_left, 17681ab64890Smrg XPointer *args, 17691ab64890Smrg int num_args) 17701ab64890Smrg{ 17711ab64890Smrg State state = (State) conv->state; 17721ab64890Smrg XLCd lcd = state->lcd; 17731ab64890Smrg 17741ab64890Smrg unsigned char ch; 17751ab64890Smrg unsigned long mb = 0; 17761ab64890Smrg unsigned long glyph_index; 17771ab64890Smrg 17781ab64890Smrg int length = 0, len_left = 0, char_len; 17791ab64890Smrg int unconv_num = 0; 17801ab64890Smrg int num; 17811ab64890Smrg XlcSide side; 17821ab64890Smrg 17831ab64890Smrg CodeSet codeset = NULL; 17841ab64890Smrg XlcCharSet charset = NULL; 17851ab64890Smrg 17861ab64890Smrg const char *inbufptr = *from; 17871ab64890Smrg char *outbufptr = *to; 17881ab64890Smrg int from_size = *from_left; 17891ab64890Smrg 17901ab64890Smrg unsigned char *mb_parse_table = XLC_GENERIC(lcd, mb_parse_table); 17911ab64890Smrg 17921ab64890Smrg if (from == NULL || *from == NULL) { 17931ab64890Smrg _XlcResetConverter(conv); 17941ab64890Smrg return( 0 ); 17951ab64890Smrg } 17961ab64890Smrg 179737e7fe2cSchristos#ifdef notdef 17981ab64890Smrg if (*from_left > *to_left) 17991ab64890Smrg *from_left = *to_left; 180037e7fe2cSchristos#endif 18011ab64890Smrg 18021ab64890Smrg while (*from_left && *to_left) { 18031ab64890Smrg 18041ab64890Smrg ch = *inbufptr++; 18051ab64890Smrg (*from_left)--; 18061ab64890Smrg 18071ab64890Smrg /* null ? */ 18081ab64890Smrg if (!ch) { 18091ab64890Smrg unconv_num = 1; 18101ab64890Smrg if (len_left) 18111ab64890Smrg unconv_num += (length - len_left); 18121ab64890Smrg break; 18131ab64890Smrg } 18141ab64890Smrg 18151ab64890Smrg /* same mb char data */ 18161ab64890Smrg if (len_left) 18171ab64890Smrg goto output; 18181ab64890Smrg 18191ab64890Smrg /* next mb char data for single shift ? */ 18201ab64890Smrg if (mb_parse_table && (num = mb_parse_table[ch]) ) { 18211ab64890Smrg codeset = mb_parse_codeset(state, num, &inbufptr, from_left); 18221ab64890Smrg if (codeset != NULL) { 18231ab64890Smrg length = len_left = codeset->length; 18241ab64890Smrg mb = 0; 18251ab64890Smrg continue; 18261ab64890Smrg } 18271ab64890Smrg } 18281ab64890Smrg 18291ab64890Smrg /* next mb char data for byteM ? */ 18301ab64890Smrg if ((codeset = byteM_parse_codeset(lcd, (inbufptr - 1)))) 18311ab64890Smrg goto next_mb_char; 18321ab64890Smrg 18331ab64890Smrg /* next mb char data for GL or GR side ? */ 18341ab64890Smrg if ((codeset = GLGR_parse_codeset(ch))) 18351ab64890Smrg goto next_mb_char; 183661b2299dSmrg 18371ab64890Smrg /* can't find codeset for the ch */ 18381ab64890Smrg unconv_num = 1; 18391ab64890Smrg break; 18401ab64890Smrg 18411ab64890Smrgnext_mb_char: 18421ab64890Smrg length = len_left = codeset->length; 18431ab64890Smrg mb = 0; 18441ab64890Smrg 18451ab64890Smrgoutput: 18461ab64890Smrg mb = (mb << 8) | ch; /* 1 byte left shift */ 18471ab64890Smrg len_left--; 18481ab64890Smrg 18491ab64890Smrg /* last of one mb char data */ 18501ab64890Smrg if (!len_left) { 18511ab64890Smrg glyph_index = mb_to_gi(mb, codeset); 18521ab64890Smrg if (!(charset = gi_parse_charset(glyph_index, codeset))) { 18531ab64890Smrg unconv_num = length; 18541ab64890Smrg break; 18551ab64890Smrg } 18561ab64890Smrg char_len = charset->char_size; 18571ab64890Smrg side = charset->side; 18581ab64890Smrg 18591ab64890Smrg /* output glyph index */ 18601ab64890Smrg if (codeset->ctconv) 18611ab64890Smrg glyph_index = conv_to_dest(codeset->ctconv, glyph_index); 18621ab64890Smrg if (*to_left < char_len) { 18631ab64890Smrg unconv_num = length; 18641ab64890Smrg break; 18651ab64890Smrg } 18661ab64890Smrg 18671ab64890Smrg if (outbufptr) { 18681ab64890Smrg output_ulong_value(outbufptr, glyph_index, char_len, side); 18691ab64890Smrg outbufptr += char_len; 18701ab64890Smrg } 18711ab64890Smrg 18721ab64890Smrg (*to_left) -= char_len; 18731ab64890Smrg 18741ab64890Smrg break; 18751ab64890Smrg } 18761ab64890Smrg 18771ab64890Smrg } /* end of while */ 18781ab64890Smrg 18791ab64890Smrg /* error end */ 18801ab64890Smrg if (unconv_num) { 18811ab64890Smrg *from = (XPointer) ((const char *) *from + from_size); 18821ab64890Smrg *from_left = 0; 18831ab64890Smrg *to = (XPointer) outbufptr; 18841ab64890Smrg return -1; 18851ab64890Smrg } 18861ab64890Smrg 18871ab64890Smrg /* nomal end */ 18881ab64890Smrg *from = (XPointer) inbufptr; 18891ab64890Smrg *to = (XPointer) outbufptr; 18901ab64890Smrg 18911ab64890Smrg if (num_args > 0) 18921ab64890Smrg *((XlcCharSet *) args[0]) = charset; 18931ab64890Smrg 18941ab64890Smrg return 0; 18951ab64890Smrg} 18961ab64890Smrg 18971ab64890Smrgstatic int 18981ab64890Smrgmbstocs( 18991ab64890Smrg XlcConv conv, 19001ab64890Smrg XPointer *from, 19011ab64890Smrg int *from_left, 19021ab64890Smrg XPointer *to, 19031ab64890Smrg int *to_left, 19041ab64890Smrg XPointer *args, 19051ab64890Smrg int num_args) 19061ab64890Smrg{ 19071ab64890Smrg int ret; 19081ab64890Smrg XlcCharSet charset_old, charset = NULL; 19091ab64890Smrg XPointer tmp_args[1]; 19101ab64890Smrg 19111ab64890Smrg const char *inbufptr; 19121ab64890Smrg int in_left; 19131ab64890Smrg char *outbufptr; 19141ab64890Smrg int out_left; 19151ab64890Smrg tmp_args[0] = (XPointer) &charset; 19161ab64890Smrg 19171ab64890Smrg ret = mbtocs(conv, from, from_left, to, to_left, tmp_args, 1); 19181ab64890Smrg charset_old = charset; 191961b2299dSmrg 19201ab64890Smrg while ( ret == 0 && *from_left && *to_left) { 19211ab64890Smrg inbufptr = *from; 19221ab64890Smrg in_left = *from_left; 19231ab64890Smrg outbufptr = *to; 19241ab64890Smrg out_left = *to_left; 19251ab64890Smrg ret = mbtocs(conv, from, from_left, to, to_left, tmp_args, 1); 19261ab64890Smrg if (charset_old != charset) { 19271ab64890Smrg *from = (XPointer) inbufptr; 19281ab64890Smrg *from_left = in_left; 19291ab64890Smrg *to = (XPointer) outbufptr; 19301ab64890Smrg *to_left = out_left; 19311ab64890Smrg break; 19321ab64890Smrg } 19331ab64890Smrg } 19341ab64890Smrg 19351ab64890Smrg if (num_args > 0) 19361ab64890Smrg *((XlcCharSet *) args[0]) = charset_old; 19371ab64890Smrg 19381ab64890Smrg /* error end */ 19391ab64890Smrg if (ret != 0) 19401ab64890Smrg return( -1 ); 19411ab64890Smrg 19421ab64890Smrg return(0); 19431ab64890Smrg} 19441ab64890Smrg 19451ab64890Smrgstatic int 19461ab64890Smrgwcstostr( 19471ab64890Smrg XlcConv conv, 19481ab64890Smrg XPointer *from, 19491ab64890Smrg int *from_left, 19501ab64890Smrg XPointer *to, 19511ab64890Smrg int *to_left, 19521ab64890Smrg XPointer *args, 19531ab64890Smrg int num_args) 19541ab64890Smrg{ 19551ab64890Smrg State state = (State) conv->state; 19561ab64890Smrg XLCd lcd = state->lcd; 19571ab64890Smrg 19581ab64890Smrg char *encoding; 19591ab64890Smrg unsigned long mb, glyph_index; 19601ab64890Smrg wchar_t wc; 19611ab64890Smrg 19621ab64890Smrg int length; 19631ab64890Smrg int unconv_num = 0; 19641ab64890Smrg 19651ab64890Smrg CodeSet codeset; 19661ab64890Smrg 19671ab64890Smrg const wchar_t *inbufptr = (const wchar_t *) *from; 19681ab64890Smrg char *outbufptr = *to; 19691ab64890Smrg int from_size = *from_left; 197061b2299dSmrg 19711ab64890Smrg const char *default_string = XLC_PUBLIC(lcd, default_string); 19721ab64890Smrg int defstr_len = strlen(default_string); 19731ab64890Smrg 19741ab64890Smrg 197537e7fe2cSchristos#ifdef notdef 19761ab64890Smrg if (*from_left > *to_left) 19771ab64890Smrg *from_left = *to_left; 197837e7fe2cSchristos#endif 19791ab64890Smrg 19801ab64890Smrg while (*from_left && *to_left) { 19811ab64890Smrg 19821ab64890Smrg wc = *inbufptr++; 19831ab64890Smrg (*from_left)--; 19841ab64890Smrg 19851ab64890Smrg /* null ? */ 19861ab64890Smrg if (!wc) { 19871ab64890Smrg if (outbufptr) {*outbufptr++ = '\0';} 19881ab64890Smrg (*to_left)--; 19891ab64890Smrg 19901ab64890Smrg continue; 19911ab64890Smrg } 19921ab64890Smrg 19931ab64890Smrg /* convert */ 19941ab64890Smrg if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) { 19951ab64890Smrg 19961ab64890Smrg /* output default_string of XDefaultString() */ 19971ab64890Smrg if (*to_left < defstr_len) 19981ab64890Smrg break; 19991ab64890Smrg if (outbufptr) { 20001ab64890Smrg strncpy((char *)outbufptr, default_string, defstr_len); 20011ab64890Smrg outbufptr += defstr_len; 20021ab64890Smrg } 20031ab64890Smrg (*to_left) -= defstr_len; 20041ab64890Smrg 20051ab64890Smrg unconv_num++; 20061ab64890Smrg 20071ab64890Smrg } else { 20081ab64890Smrg mb = gi_to_mb(glyph_index, codeset); 20091ab64890Smrg 20101ab64890Smrg if (check_string_encoding(codeset)) { 20111ab64890Smrg if (codeset->parse_info) { 20121ab64890Smrg Bool need_shift = False; 20131ab64890Smrg switch (codeset->parse_info->type) { 20141ab64890Smrg case E_LSL : 20151ab64890Smrg if (codeset != state->GL_codeset) { 20161ab64890Smrg need_shift = True; 20171ab64890Smrg state->GL_codeset = codeset; 20181ab64890Smrg } 20191ab64890Smrg break; 20201ab64890Smrg case E_LSR : 20211ab64890Smrg if (codeset != state->GR_codeset) { 20221ab64890Smrg need_shift = True; 20231ab64890Smrg state->GR_codeset = codeset; 20241ab64890Smrg } 20251ab64890Smrg break; 20261ab64890Smrg /* case E_SS */ 20271ab64890Smrg default: 20281ab64890Smrg need_shift = True; 20291ab64890Smrg } 20301ab64890Smrg 20311ab64890Smrg /* output shift sequence */ 20321ab64890Smrg if (need_shift) { 20331ab64890Smrg encoding = codeset->parse_info->encoding; 20341ab64890Smrg length = strlen(encoding); 20351ab64890Smrg if (*to_left < length) 20361ab64890Smrg break; 20371ab64890Smrg 20381ab64890Smrg if (outbufptr) { 20391ab64890Smrg strncpy((char *)outbufptr, encoding, length); 20401ab64890Smrg outbufptr += length; 20411ab64890Smrg } 20421ab64890Smrg (*to_left) -= length; 20431ab64890Smrg } 20441ab64890Smrg } 20451ab64890Smrg 20461ab64890Smrg /* output characters */ 20471ab64890Smrg length = codeset->length; 20481ab64890Smrg if (*to_left < length) 20491ab64890Smrg break; 20501ab64890Smrg 20511ab64890Smrg if (outbufptr) { 20521ab64890Smrg output_ulong_value(outbufptr, mb, length, XlcNONE); 20531ab64890Smrg outbufptr += length; 20541ab64890Smrg } 20551ab64890Smrg 20561ab64890Smrg (*to_left) -= length; 20571ab64890Smrg } else { 20581ab64890Smrg unconv_num++; 20591ab64890Smrg } 20601ab64890Smrg } 20611ab64890Smrg 20621ab64890Smrg } /* end of while */ 20631ab64890Smrg 20641ab64890Smrg *from = (XPointer) ((const wchar_t *) *from + from_size); 20651ab64890Smrg *from_left = 0; 20661ab64890Smrg *to = (XPointer) outbufptr; 20671ab64890Smrg 20681ab64890Smrg return unconv_num; 20691ab64890Smrg} 20701ab64890Smrg 20711ab64890Smrgstatic int 20721ab64890Smrgstdc_wcstostr( 20731ab64890Smrg XlcConv conv, 20741ab64890Smrg XPointer *from, 20751ab64890Smrg int *from_left, 20761ab64890Smrg XPointer *to, 20771ab64890Smrg int *to_left, 20781ab64890Smrg XPointer *args, 20791ab64890Smrg int num_args) 20801ab64890Smrg{ 20811ab64890Smrg XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX); 20821ab64890Smrg char *buf_ptr1 = buf; 20831ab64890Smrg int buf_left1 = (*from_left) * MB_CUR_MAX; 20841ab64890Smrg char *buf_ptr2 = buf_ptr1; 20851ab64890Smrg int buf_left2; 20861ab64890Smrg int unconv_num1 = 0, unconv_num2 = 0; 20871ab64890Smrg 208861b2299dSmrg unconv_num1 = stdc_wcstombs(conv, 20891ab64890Smrg from, from_left, &buf_ptr1, &buf_left1, args, num_args); 20901ab64890Smrg if (unconv_num1 < 0) 20911ab64890Smrg goto ret; 20921ab64890Smrg 20931ab64890Smrg buf_left2 = buf_ptr1 - buf_ptr2; 20941ab64890Smrg 209561b2299dSmrg unconv_num2 = mbstostr(conv, 20961ab64890Smrg &buf_ptr2, &buf_left2, to, to_left, args, num_args); 20971ab64890Smrg if (unconv_num2 < 0) 20981ab64890Smrg goto ret; 20991ab64890Smrg 21001ab64890Smrgret: 21011ab64890Smrg if (buf) 21021ab64890Smrg Xfree((char *)buf); 21031ab64890Smrg 21041ab64890Smrg return (unconv_num1 + unconv_num2); 21051ab64890Smrg} 21061ab64890Smrg 21071ab64890Smrgstatic int 21081ab64890Smrgwctocs( 21091ab64890Smrg XlcConv conv, 21101ab64890Smrg XPointer *from, 21111ab64890Smrg int *from_left, 21121ab64890Smrg XPointer *to, 21131ab64890Smrg int *to_left, 21141ab64890Smrg XPointer *args, 21151ab64890Smrg int num_args) 21161ab64890Smrg{ 21171ab64890Smrg State state = (State) conv->state; 21181ab64890Smrg XLCd lcd = state->lcd; 21191ab64890Smrg 21201ab64890Smrg wchar_t wc; 21211ab64890Smrg unsigned long glyph_index; 21221ab64890Smrg 21231ab64890Smrg int char_len; 21241ab64890Smrg int unconv_num = 0; 21251ab64890Smrg XlcSide side; 21261ab64890Smrg 21271ab64890Smrg CodeSet codeset; 21281ab64890Smrg XlcCharSet charset = NULL; 21291ab64890Smrg 21301ab64890Smrg const wchar_t *inbufptr = (const wchar_t *) *from; 21311ab64890Smrg char *outbufptr = *to; 21321ab64890Smrg int from_size = *from_left; 21331ab64890Smrg 213437e7fe2cSchristos#ifdef notdef 21351ab64890Smrg if (*from_left > *to_left) 21361ab64890Smrg *from_left = *to_left; 213737e7fe2cSchristos#endif 21381ab64890Smrg 21391ab64890Smrg if (*from_left && *to_left) { 21401ab64890Smrg 21411ab64890Smrg wc = *inbufptr++; 21421ab64890Smrg (*from_left)--; 21431ab64890Smrg 21441ab64890Smrg /* null ? */ 21451ab64890Smrg if (!wc) { 21461ab64890Smrg unconv_num = 1; 21471ab64890Smrg goto end; 21481ab64890Smrg } 21491ab64890Smrg 21501ab64890Smrg /* convert */ 21511ab64890Smrg if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) { 21521ab64890Smrg unconv_num = 1; 21531ab64890Smrg goto end; 21541ab64890Smrg } 21551ab64890Smrg 21561ab64890Smrg if ( !(charset = gi_parse_charset(glyph_index, codeset)) ) { 21571ab64890Smrg unconv_num = 1; 21581ab64890Smrg goto end; 21591ab64890Smrg } 21601ab64890Smrg char_len = charset->char_size; 21611ab64890Smrg side = charset->side; 21621ab64890Smrg 21631ab64890Smrg /* output glyph index */ 21641ab64890Smrg if (codeset->ctconv) 21651ab64890Smrg glyph_index = conv_to_dest(codeset->ctconv, glyph_index); 21661ab64890Smrg if (*to_left < char_len) { 21671ab64890Smrg unconv_num++; 21681ab64890Smrg goto end; 21691ab64890Smrg } 21701ab64890Smrg 21711ab64890Smrg if (outbufptr) { 21721ab64890Smrg output_ulong_value(outbufptr, glyph_index, char_len, side); 21731ab64890Smrg outbufptr += char_len; 21741ab64890Smrg } 21751ab64890Smrg 21761ab64890Smrg (*to_left) -= char_len; 21771ab64890Smrg 21781ab64890Smrg } 21791ab64890Smrg 21801ab64890Smrgend: 21811ab64890Smrg 21821ab64890Smrg /* error end */ 21831ab64890Smrg if (unconv_num) { 21841ab64890Smrg *from = (XPointer) ((const wchar_t *) *from + from_size); 21851ab64890Smrg *from_left = 0; 21861ab64890Smrg *to = (XPointer) outbufptr; 21871ab64890Smrg return -1; 21881ab64890Smrg } 21891ab64890Smrg 21901ab64890Smrg /* nomal end */ 21911ab64890Smrg *from = (XPointer) inbufptr; 21921ab64890Smrg *to = (XPointer) outbufptr; 21931ab64890Smrg 21941ab64890Smrg if (num_args > 0) 21951ab64890Smrg *((XlcCharSet *) args[0]) = charset; 21961ab64890Smrg 21971ab64890Smrg return 0; 21981ab64890Smrg} 21991ab64890Smrg 22001ab64890Smrgstatic int 22011ab64890Smrgstdc_wctocs( 22021ab64890Smrg XlcConv conv, 22031ab64890Smrg XPointer *from, 22041ab64890Smrg int *from_left, 22051ab64890Smrg XPointer *to, 22061ab64890Smrg int *to_left, 22071ab64890Smrg XPointer *args, 22081ab64890Smrg int num_args) 22091ab64890Smrg{ 22101ab64890Smrg const wchar_t *src = *((const wchar_t **) from); 22111ab64890Smrg wchar_t wch; 22121ab64890Smrg XPointer tmp_from, save_from = *from; 22131ab64890Smrg char tmp[32]; 22141ab64890Smrg int length, ret, src_left = *from_left; 22151ab64890Smrg int from_size = *from_left; 22161ab64890Smrg 22171ab64890Smrg if (src_left > 0 && *to_left > 0) { 22181ab64890Smrg if ((wch = *src)) { 22191ab64890Smrg length = wctomb(tmp, wch); 22201ab64890Smrg } else { 22211ab64890Smrg goto end; 22221ab64890Smrg } 222361b2299dSmrg 22241ab64890Smrg if (length < 0) 22251ab64890Smrg goto end; 22261ab64890Smrg 22271ab64890Smrg tmp_from = (XPointer) tmp; 22281ab64890Smrg ret = mbtocs(conv, &tmp_from, &length, to, to_left, args, num_args); 22291ab64890Smrg if (ret < 0) 22301ab64890Smrg goto end; 22311ab64890Smrg 22321ab64890Smrg src++; 22331ab64890Smrg src_left--; 22341ab64890Smrg } 22351ab64890Smrg 22361ab64890Smrgend: 22371ab64890Smrg /* error end */ 22381ab64890Smrg if (save_from == (XPointer) src) { 22391ab64890Smrg *from = (XPointer) ((const wchar_t *) *from + from_size); 22401ab64890Smrg *from_left = 0; 22411ab64890Smrg return -1; 22421ab64890Smrg } 22431ab64890Smrg 22441ab64890Smrg /* nomal end */ 22451ab64890Smrg *from = (XPointer) src; 22461ab64890Smrg *from_left = src_left; 22471ab64890Smrg 22481ab64890Smrg return 0; 22491ab64890Smrg} 22501ab64890Smrg 22511ab64890Smrgstatic int 22521ab64890Smrgwcstocs( 22531ab64890Smrg XlcConv conv, 22541ab64890Smrg XPointer *from, 22551ab64890Smrg int *from_left, 22561ab64890Smrg XPointer *to, 22571ab64890Smrg int *to_left, 22581ab64890Smrg XPointer *args, 22591ab64890Smrg int num_args) 22601ab64890Smrg{ 22611ab64890Smrg int ret; 22621ab64890Smrg XlcCharSet charset_old, charset = NULL; 22631ab64890Smrg XPointer tmp_args[1]; 22641ab64890Smrg 22651ab64890Smrg const wchar_t *inbufptr; 22661ab64890Smrg int in_left; 22671ab64890Smrg XPointer outbufptr; 22681ab64890Smrg int out_left; 22691ab64890Smrg tmp_args[0] = (XPointer) &charset; 22701ab64890Smrg 22711ab64890Smrg ret = wctocs(conv, from, from_left, to, to_left, tmp_args, 1); 22721ab64890Smrg charset_old = charset; 22731ab64890Smrg 22741ab64890Smrg while ( ret == 0 && *from_left && *to_left) { 22751ab64890Smrg inbufptr = (const wchar_t *) *from; 22761ab64890Smrg in_left = *from_left; 22771ab64890Smrg outbufptr = *to; 22781ab64890Smrg out_left = *to_left; 22791ab64890Smrg ret = wctocs(conv, from, from_left, to, to_left, tmp_args, 1); 22801ab64890Smrg if (charset_old != charset) { 22811ab64890Smrg *from = (XPointer) inbufptr; 22821ab64890Smrg *from_left = in_left; 22831ab64890Smrg *to = (XPointer) outbufptr; 22841ab64890Smrg *to_left = out_left; 22851ab64890Smrg break; 22861ab64890Smrg } 22871ab64890Smrg } 22881ab64890Smrg 22891ab64890Smrg if (num_args > 0) 22901ab64890Smrg *((XlcCharSet *) args[0]) = charset_old; 22911ab64890Smrg 22921ab64890Smrg /* error end */ 22931ab64890Smrg if (ret != 0) 22941ab64890Smrg return( -1 ); 22951ab64890Smrg 22961ab64890Smrg return(0); 22971ab64890Smrg} 22981ab64890Smrg 22991ab64890Smrg#ifdef STDCVT 23001ab64890Smrg 23011ab64890Smrgstatic int 23021ab64890Smrgstdc_wcstocs( 23031ab64890Smrg XlcConv conv, 23041ab64890Smrg XPointer *from, 23051ab64890Smrg int *from_left, 23061ab64890Smrg XPointer *to, 23071ab64890Smrg int *to_left, 23081ab64890Smrg XPointer *args, 23091ab64890Smrg int num_args) 23101ab64890Smrg{ 23111ab64890Smrg int ret; 23121ab64890Smrg XlcCharSet charset_old, charset = NULL; 23131ab64890Smrg XPointer tmp_args[1]; 23141ab64890Smrg 23151ab64890Smrg const wchar_t *inbufptr; 23161ab64890Smrg int in_left; 23171ab64890Smrg XPointer outbufptr; 23181ab64890Smrg int out_left; 23191ab64890Smrg tmp_args[0] = (XPointer) &charset; 23201ab64890Smrg 23211ab64890Smrg ret = stdc_wctocs(conv, from, from_left, to, to_left, tmp_args, 1); 23221ab64890Smrg charset_old = charset; 23231ab64890Smrg 23241ab64890Smrg while ( ret == 0 && *from_left && *to_left ) { 23251ab64890Smrg inbufptr = (const wchar_t *) *from; 23261ab64890Smrg in_left = *from_left; 23271ab64890Smrg outbufptr = *to; 23281ab64890Smrg out_left = *to_left; 23291ab64890Smrg ret = stdc_wctocs(conv, from, from_left, to, to_left, tmp_args, 1); 23301ab64890Smrg if (charset_old != charset) { 23311ab64890Smrg *from = (XPointer) inbufptr; 23321ab64890Smrg *from_left = in_left; 23331ab64890Smrg *to = (XPointer) outbufptr; 23341ab64890Smrg *to_left = out_left; 23351ab64890Smrg break; 23361ab64890Smrg } 23371ab64890Smrg } 23381ab64890Smrg 23391ab64890Smrg if (num_args > 0) 23401ab64890Smrg *((XlcCharSet *) args[0]) = charset_old; 23411ab64890Smrg 23421ab64890Smrg /* error end */ 23431ab64890Smrg if (ret != 0) 23441ab64890Smrg return( -1 ); 23451ab64890Smrg 23461ab64890Smrg return(0); 23471ab64890Smrg} 23481ab64890Smrg 23491ab64890Smrg#endif 23501ab64890Smrg 23511ab64890Smrgstatic int 23521ab64890Smrgctstombs( 23531ab64890Smrg XlcConv conv, 23541ab64890Smrg XPointer *from, 23551ab64890Smrg int *from_left, 23561ab64890Smrg XPointer *to, 23571ab64890Smrg int *to_left, 23581ab64890Smrg XPointer *args, 23591ab64890Smrg int num_args) 23601ab64890Smrg{ 23611ab64890Smrg XPointer buf = Xmalloc((*from_left) * sizeof(wchar_t)); 23621ab64890Smrg char *buf_ptr1 = buf; 23631ab64890Smrg int buf_left1 = (*from_left); 23641ab64890Smrg char *buf_ptr2 = buf_ptr1; 23651ab64890Smrg int buf_left2; 23661ab64890Smrg int unconv_num1 = 0, unconv_num2 = 0; 23671ab64890Smrg 236861b2299dSmrg unconv_num1 = ctstowcs(conv, 23691ab64890Smrg from, from_left, &buf_ptr1, &buf_left1, args, num_args); 23701ab64890Smrg if (unconv_num1 < 0) 23711ab64890Smrg goto ret; 23721ab64890Smrg 23731ab64890Smrg buf_left2 = (buf_ptr1 - buf_ptr2) / sizeof(wchar_t); 23741ab64890Smrg 237561b2299dSmrg unconv_num2 += wcstombs_org(conv, 23761ab64890Smrg &buf_ptr2, &buf_left2, to, to_left, args, num_args); 23771ab64890Smrg if (unconv_num2 < 0) 23781ab64890Smrg goto ret; 23791ab64890Smrg 23801ab64890Smrgret: 23811ab64890Smrg if (buf) 23821ab64890Smrg Xfree((char *)buf); 23831ab64890Smrg 23841ab64890Smrg return (unconv_num1 + unconv_num2); 23851ab64890Smrg} 23861ab64890Smrg 23871ab64890Smrgstatic int 23881ab64890Smrgcstombs( 23891ab64890Smrg XlcConv conv, 23901ab64890Smrg XPointer *from, 23911ab64890Smrg int *from_left, 23921ab64890Smrg XPointer *to, 23931ab64890Smrg int *to_left, 23941ab64890Smrg XPointer *args, 23951ab64890Smrg int num_args) 23961ab64890Smrg{ 23971ab64890Smrg XPointer buf = Xmalloc((*from_left) * sizeof(wchar_t)); 23981ab64890Smrg char *buf_ptr1 = buf; 23991ab64890Smrg int buf_left1 = (*from_left); 24001ab64890Smrg char *buf_ptr2 = buf_ptr1; 24011ab64890Smrg int buf_left2; 24021ab64890Smrg int unconv_num1 = 0, unconv_num2 = 0; 24031ab64890Smrg 240461b2299dSmrg unconv_num1 = cstowcs(conv, 24051ab64890Smrg from, from_left, &buf_ptr1, &buf_left1, args, num_args); 24061ab64890Smrg if (unconv_num1 < 0) 24071ab64890Smrg goto ret; 24081ab64890Smrg 24091ab64890Smrg buf_left2 = (buf_ptr1 - buf_ptr2) / sizeof(wchar_t); 24101ab64890Smrg 241161b2299dSmrg unconv_num2 += wcstombs_org(conv, 24121ab64890Smrg &buf_ptr2, &buf_left2, to, to_left, args, num_args); 24131ab64890Smrg if (unconv_num2 < 0) 24141ab64890Smrg goto ret; 24151ab64890Smrg 24161ab64890Smrgret: 24171ab64890Smrg if (buf) 24181ab64890Smrg Xfree((char *)buf); 24191ab64890Smrg 24201ab64890Smrg return (unconv_num1 + unconv_num2); 24211ab64890Smrg} 24221ab64890Smrg 24231ab64890Smrgstatic int 24241ab64890Smrgstrtombs( 24251ab64890Smrg XlcConv conv, 24261ab64890Smrg XPointer *from, 24271ab64890Smrg int *from_left, 24281ab64890Smrg XPointer *to, 24291ab64890Smrg int *to_left, 24301ab64890Smrg XPointer *args, 24311ab64890Smrg int num_args) 24321ab64890Smrg{ 24331ab64890Smrg State state = (State) conv->state; 24341ab64890Smrg XLCd lcd = state->lcd; 24351ab64890Smrg 24361ab64890Smrg char *encoding; 24371ab64890Smrg unsigned long mb, glyph_index; 24381ab64890Smrg unsigned char ch; 24391ab64890Smrg 24401ab64890Smrg int length; 24411ab64890Smrg int unconv_num = 0; 24421ab64890Smrg 24431ab64890Smrg CodeSet codeset; 24441ab64890Smrg 24451ab64890Smrg const char *inbufptr = *from; 24461ab64890Smrg char *outbufptr = *to; 24471ab64890Smrg int from_size = *from_left; 24481ab64890Smrg 244937e7fe2cSchristos#ifdef notdef 24501ab64890Smrg if (*from_left > *to_left) 24511ab64890Smrg *from_left = *to_left; 245237e7fe2cSchristos#endif 24531ab64890Smrg 24541ab64890Smrg while (*from_left && *to_left) { 24551ab64890Smrg 24561ab64890Smrg ch = *inbufptr++; 24571ab64890Smrg (*from_left)--; 24581ab64890Smrg 24591ab64890Smrg /* null ? */ 24601ab64890Smrg if (!ch) { 24611ab64890Smrg if (outbufptr) {*outbufptr++ = '\0';} 24621ab64890Smrg (*to_left)--; 24631ab64890Smrg 24641ab64890Smrg continue; 24651ab64890Smrg } 24661ab64890Smrg 24671ab64890Smrg /* convert */ 24681ab64890Smrg if (isleftside(ch)) { 24691ab64890Smrg glyph_index = ch; 24701ab64890Smrg codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GL"); 24711ab64890Smrg } else { 24721ab64890Smrg glyph_index = ch & GL; 24731ab64890Smrg codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GR"); 24741ab64890Smrg } 24751ab64890Smrg 24761ab64890Smrg if (!codeset) { 24771ab64890Smrg unconv_num++; 24781ab64890Smrg continue; 24791ab64890Smrg } 24801ab64890Smrg 24811ab64890Smrg mb = gi_to_mb(glyph_index, codeset); 24821ab64890Smrg if (codeset->parse_info) { 24831ab64890Smrg Bool need_shift = False; 24841ab64890Smrg switch (codeset->parse_info->type) { 24851ab64890Smrg case E_LSL : 24861ab64890Smrg if (codeset != state->GL_codeset) { 24871ab64890Smrg need_shift = True; 24881ab64890Smrg state->GL_codeset = codeset; 24891ab64890Smrg } 24901ab64890Smrg break; 24911ab64890Smrg case E_LSR : 24921ab64890Smrg if (codeset != state->GR_codeset) { 24931ab64890Smrg need_shift = True; 24941ab64890Smrg state->GR_codeset = codeset; 24951ab64890Smrg } 24961ab64890Smrg break; 24971ab64890Smrg /* case E_SS */ 24981ab64890Smrg default: 24991ab64890Smrg need_shift = True; 25001ab64890Smrg } 25011ab64890Smrg 25021ab64890Smrg /* output shift sequence */ 25031ab64890Smrg if (need_shift) { 25041ab64890Smrg encoding = codeset->parse_info->encoding; 25051ab64890Smrg length = strlen(encoding); 25061ab64890Smrg if (*to_left < length) 25071ab64890Smrg break; 25081ab64890Smrg if (outbufptr) { 25091ab64890Smrg strncpy((char *)outbufptr, encoding, length); 25101ab64890Smrg outbufptr += length; 25111ab64890Smrg } 25121ab64890Smrg (*to_left) -= length; 25131ab64890Smrg } 25141ab64890Smrg } 25151ab64890Smrg 25161ab64890Smrg /* output characters */ 25171ab64890Smrg length = codeset->length; 25181ab64890Smrg if (*to_left < length) 25191ab64890Smrg break; 25201ab64890Smrg 25211ab64890Smrg if (outbufptr) { 25221ab64890Smrg output_ulong_value(outbufptr, mb, length, XlcNONE); 25231ab64890Smrg outbufptr += length; 25241ab64890Smrg } 25251ab64890Smrg 25261ab64890Smrg (*to_left) -= length; 25271ab64890Smrg 25281ab64890Smrg } /* end of while */ 25291ab64890Smrg 25301ab64890Smrg *from = (XPointer) ((const char *) *from + from_size); 25311ab64890Smrg *from_left = 0; 25321ab64890Smrg *to = (XPointer) outbufptr; 25331ab64890Smrg 25341ab64890Smrg return unconv_num; 25351ab64890Smrg} 25361ab64890Smrg 25371ab64890Smrgstatic int 25381ab64890Smrgstrtowcs( 25391ab64890Smrg XlcConv conv, 25401ab64890Smrg XPointer *from, 25411ab64890Smrg int *from_left, 25421ab64890Smrg XPointer *to, 25431ab64890Smrg int *to_left, 25441ab64890Smrg XPointer *args, 25451ab64890Smrg int num_args) 25461ab64890Smrg{ 25471ab64890Smrg State state = (State) conv->state; 25481ab64890Smrg XLCd lcd = state->lcd; 25491ab64890Smrg 25501ab64890Smrg unsigned char ch; 25511ab64890Smrg unsigned long glyph_index; 25521ab64890Smrg wchar_t wc; 25531ab64890Smrg 25541ab64890Smrg int unconv_num = 0; 25551ab64890Smrg CodeSet codeset; 25561ab64890Smrg 25571ab64890Smrg const char *inbufptr = *from; 25581ab64890Smrg wchar_t *outbufptr = (wchar_t *)*to; 25591ab64890Smrg int from_size = *from_left; 25601ab64890Smrg 256137e7fe2cSchristos#ifdef notdef 25621ab64890Smrg if (*from_left > *to_left) 25631ab64890Smrg *from_left = *to_left; 256437e7fe2cSchristos#endif 25651ab64890Smrg 25661ab64890Smrg while (*from_left && *to_left) { 25671ab64890Smrg 25681ab64890Smrg ch = *inbufptr++; 25691ab64890Smrg (*from_left)--; 25701ab64890Smrg 25711ab64890Smrg /* null ? */ 25721ab64890Smrg if (!ch) { 25731ab64890Smrg if (outbufptr) {*outbufptr++ = L'\0';} 25741ab64890Smrg (*to_left)--; 25751ab64890Smrg 25761ab64890Smrg continue; 25771ab64890Smrg } 25781ab64890Smrg 25791ab64890Smrg /* convert */ 25801ab64890Smrg if (isleftside(ch)) { 25811ab64890Smrg glyph_index = ch; 25821ab64890Smrg codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GL"); 25831ab64890Smrg } else { 25841ab64890Smrg glyph_index = ch & GL; 25851ab64890Smrg codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GR"); 25861ab64890Smrg } 25871ab64890Smrg 25881ab64890Smrg if (!codeset) { 25891ab64890Smrg unconv_num++; 25901ab64890Smrg continue; 25911ab64890Smrg } 25921ab64890Smrg 25931ab64890Smrg gi_to_wc(lcd, glyph_index, codeset, &wc); 25941ab64890Smrg if (outbufptr) {*outbufptr++ = wc;} 25951ab64890Smrg (*to_left)--; 25961ab64890Smrg 25971ab64890Smrg } /* end of while */ 25981ab64890Smrg 25991ab64890Smrg *from = (XPointer) ((const char *) *from + from_size); 26001ab64890Smrg *from_left = 0; 26011ab64890Smrg *to = (XPointer) outbufptr; 26021ab64890Smrg 26031ab64890Smrg return unconv_num; 26041ab64890Smrg} 26051ab64890Smrg 26061ab64890Smrgstatic int 26071ab64890Smrgstdc_strtowcs( 26081ab64890Smrg XlcConv conv, 26091ab64890Smrg XPointer *from, 26101ab64890Smrg int *from_left, 26111ab64890Smrg XPointer *to, 26121ab64890Smrg int *to_left, 26131ab64890Smrg XPointer *args, 26141ab64890Smrg int num_args) 26151ab64890Smrg{ 26161ab64890Smrg XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX); 26171ab64890Smrg char *buf_ptr1 = buf; 26181ab64890Smrg int buf_left1 = (*from_left) * MB_CUR_MAX; 26191ab64890Smrg char *buf_ptr2 = buf_ptr1; 26201ab64890Smrg int buf_left2; 26211ab64890Smrg int unconv_num1 = 0, unconv_num2 = 0; 26221ab64890Smrg 262361b2299dSmrg unconv_num1 = strtombs(conv, 26241ab64890Smrg from, from_left, &buf_ptr1, &buf_left1, args, num_args); 26251ab64890Smrg if (unconv_num1 < 0) 26261ab64890Smrg goto ret; 26271ab64890Smrg 26281ab64890Smrg buf_left2 = buf_ptr1 - buf_ptr2; 26291ab64890Smrg 263061b2299dSmrg unconv_num2 = stdc_mbstowcs(conv, 26311ab64890Smrg &buf_ptr2, &buf_left2, to, to_left, args, num_args); 26321ab64890Smrg if (unconv_num2 < 0) 26331ab64890Smrg goto ret; 26341ab64890Smrg 26351ab64890Smrgret: 26361ab64890Smrg if (buf) 26371ab64890Smrg Xfree((char *)buf); 26381ab64890Smrg 26391ab64890Smrg return (unconv_num1 + unconv_num2); 26401ab64890Smrg} 26411ab64890Smrg 26421ab64890Smrg/* -------------------------------------------------------------------------- */ 26431ab64890Smrg/* Close */ 26441ab64890Smrg/* -------------------------------------------------------------------------- */ 26451ab64890Smrg 26461ab64890Smrgstatic void 26471ab64890Smrgclose_converter( 26481ab64890Smrg XlcConv conv) 26491ab64890Smrg{ 26501ab64890Smrg if (conv->state) { 26511ab64890Smrg Xfree((char *) conv->state); 26521ab64890Smrg } 26531ab64890Smrg 26541ab64890Smrg if (conv->methods) { 26551ab64890Smrg Xfree((char *) conv->methods); 26561ab64890Smrg } 26571ab64890Smrg 26581ab64890Smrg Xfree((char *) conv); 26591ab64890Smrg} 26601ab64890Smrg 26611ab64890Smrg/* -------------------------------------------------------------------------- */ 26621ab64890Smrg/* Open */ 26631ab64890Smrg/* -------------------------------------------------------------------------- */ 26641ab64890Smrg 26651ab64890Smrgstatic XlcConv 26661ab64890Smrgcreate_conv( 26671ab64890Smrg XLCd lcd, 26681ab64890Smrg XlcConvMethods methods) 26691ab64890Smrg{ 26701ab64890Smrg XlcConv conv; 26711ab64890Smrg State state; 26721ab64890Smrg 2673c17aa6b1Smrg conv = (XlcConv) Xcalloc(1, sizeof(XlcConvRec)); 26741ab64890Smrg if (conv == NULL) 26751ab64890Smrg return (XlcConv) NULL; 267661b2299dSmrg 26771ab64890Smrg conv->methods = (XlcConvMethods) Xmalloc(sizeof(XlcConvMethodsRec)); 26781ab64890Smrg if (conv->methods == NULL) 26791ab64890Smrg goto err; 26801ab64890Smrg *conv->methods = *methods; 268161b2299dSmrg conv->methods->reset = init_state; 26821ab64890Smrg 2683d8e76104Smrg conv->state = Xcalloc(1, sizeof(StateRec)); 26841ab64890Smrg if (conv->state == NULL) 26851ab64890Smrg goto err; 268661b2299dSmrg 26871ab64890Smrg state = (State) conv->state; 26881ab64890Smrg state->lcd = lcd; 268961b2299dSmrg 26901ab64890Smrg _XlcResetConverter(conv); 269161b2299dSmrg 26921ab64890Smrg return conv; 26931ab64890Smrg 26941ab64890Smrgerr: 26951ab64890Smrg close_converter(conv); 26961ab64890Smrg 26971ab64890Smrg return (XlcConv) NULL; 26981ab64890Smrg} 26991ab64890Smrg 27001ab64890Smrgstatic XlcConvMethodsRec mbstocts_methods = { 27011ab64890Smrg close_converter, 27021ab64890Smrg mbstocts, 27031ab64890Smrg NULL 27041ab64890Smrg}; 27051ab64890Smrg 27061ab64890Smrgstatic XlcConv 27071ab64890Smrgopen_mbstocts( 27081ab64890Smrg XLCd from_lcd, 27091ab64890Smrg const char *from_type, 27101ab64890Smrg XLCd to_lcd, 27111ab64890Smrg const char *to_type) 27121ab64890Smrg{ 27131ab64890Smrg return create_conv(from_lcd, &mbstocts_methods); 27141ab64890Smrg} 27151ab64890Smrg 27161ab64890Smrgstatic XlcConvMethodsRec mbstostr_methods = { 27171ab64890Smrg close_converter, 27181ab64890Smrg mbstostr, 27191ab64890Smrg NULL 27201ab64890Smrg}; 27211ab64890Smrg 27221ab64890Smrgstatic XlcConv 27231ab64890Smrgopen_mbstostr( 27241ab64890Smrg XLCd from_lcd, 27251ab64890Smrg const char *from_type, 27261ab64890Smrg XLCd to_lcd, 27271ab64890Smrg const char *to_type) 27281ab64890Smrg{ 27291ab64890Smrg return create_conv(from_lcd, &mbstostr_methods); 27301ab64890Smrg} 27311ab64890Smrg 27321ab64890Smrgstatic XlcConvMethodsRec mbstocs_methods = { 27331ab64890Smrg close_converter, 27341ab64890Smrg mbstocs, 27351ab64890Smrg NULL 27361ab64890Smrg}; 27371ab64890Smrg 27381ab64890Smrgstatic XlcConv 27391ab64890Smrgopen_mbstocs( 27401ab64890Smrg XLCd from_lcd, 27411ab64890Smrg const char *from_type, 27421ab64890Smrg XLCd to_lcd, 27431ab64890Smrg const char *to_type) 27441ab64890Smrg{ 27451ab64890Smrg return create_conv(from_lcd, &mbstocs_methods); 27461ab64890Smrg} 27471ab64890Smrg 27481ab64890Smrgstatic XlcConvMethodsRec mbtocs_methods = { 27491ab64890Smrg close_converter, 27501ab64890Smrg mbtocs, 27511ab64890Smrg NULL 27521ab64890Smrg}; 27531ab64890Smrg 27541ab64890Smrgstatic XlcConv 27551ab64890Smrgopen_mbtocs( 27561ab64890Smrg XLCd from_lcd, 27571ab64890Smrg const char *from_type, 27581ab64890Smrg XLCd to_lcd, 27591ab64890Smrg const char *to_type) 27601ab64890Smrg{ 27611ab64890Smrg return create_conv(from_lcd, &mbtocs_methods); 27621ab64890Smrg} 27631ab64890Smrg 27641ab64890Smrgstatic XlcConvMethodsRec ctstombs_methods = { 27651ab64890Smrg close_converter, 27661ab64890Smrg ctstombs, 27671ab64890Smrg NULL 27681ab64890Smrg}; 27691ab64890Smrg 27701ab64890Smrgstatic XlcConv 27711ab64890Smrgopen_ctstombs( 27721ab64890Smrg XLCd from_lcd, 27731ab64890Smrg const char *from_type, 27741ab64890Smrg XLCd to_lcd, 27751ab64890Smrg const char *to_type) 27761ab64890Smrg{ 27771ab64890Smrg return create_conv(from_lcd, &ctstombs_methods); 27781ab64890Smrg} 27791ab64890Smrg 27801ab64890Smrgstatic XlcConvMethodsRec cstombs_methods = { 27811ab64890Smrg close_converter, 27821ab64890Smrg cstombs, 27831ab64890Smrg NULL 27841ab64890Smrg}; 27851ab64890Smrg 27861ab64890Smrgstatic XlcConv 27871ab64890Smrgopen_cstombs( 27881ab64890Smrg XLCd from_lcd, 27891ab64890Smrg const char *from_type, 27901ab64890Smrg XLCd to_lcd, 27911ab64890Smrg const char *to_type) 27921ab64890Smrg{ 27931ab64890Smrg return create_conv(from_lcd, &cstombs_methods); 27941ab64890Smrg} 27951ab64890Smrg 27961ab64890Smrgstatic XlcConvMethodsRec strtombs_methods = { 27971ab64890Smrg close_converter, 27981ab64890Smrg strtombs, 27991ab64890Smrg NULL 28001ab64890Smrg}; 28011ab64890Smrg 28021ab64890Smrgstatic XlcConv 28031ab64890Smrgopen_strtombs( 28041ab64890Smrg XLCd from_lcd, 28051ab64890Smrg const char *from_type, 28061ab64890Smrg XLCd to_lcd, 28071ab64890Smrg const char *to_type) 28081ab64890Smrg{ 28091ab64890Smrg return create_conv(from_lcd, &strtombs_methods); 28101ab64890Smrg} 28111ab64890Smrg 28121ab64890Smrg#ifdef STDCVT 28131ab64890Smrg 28141ab64890Smrgstatic XlcConvMethodsRec stdc_mbstowcs_methods = { 28151ab64890Smrg close_converter, 28161ab64890Smrg stdc_mbstowcs, 28171ab64890Smrg NULL 28181ab64890Smrg}; 28191ab64890Smrg 28201ab64890Smrgstatic XlcConv 28211ab64890Smrgopen_stdc_mbstowcs( 28221ab64890Smrg XLCd from_lcd, 28231ab64890Smrg const char *from_type, 28241ab64890Smrg XLCd to_lcd, 28251ab64890Smrg const char *to_type) 28261ab64890Smrg{ 28271ab64890Smrg return create_conv(from_lcd, &stdc_mbstowcs_methods); 28281ab64890Smrg} 28291ab64890Smrg 28301ab64890Smrgstatic XlcConvMethodsRec stdc_wcstombs_methods = { 28311ab64890Smrg close_converter, 28321ab64890Smrg stdc_wcstombs, 28331ab64890Smrg NULL 28341ab64890Smrg}; 28351ab64890Smrg 28361ab64890Smrgstatic XlcConv 28371ab64890Smrgopen_stdc_wcstombs( 28381ab64890Smrg XLCd from_lcd, 28391ab64890Smrg const char *from_type, 28401ab64890Smrg XLCd to_lcd, 28411ab64890Smrg const char *to_type) 28421ab64890Smrg{ 28431ab64890Smrg return create_conv(from_lcd, &stdc_wcstombs_methods); 28441ab64890Smrg} 28451ab64890Smrg 28461ab64890Smrgstatic XlcConvMethodsRec stdc_wcstocts_methods = { 28471ab64890Smrg close_converter, 28481ab64890Smrg stdc_wcstocts, 28491ab64890Smrg NULL 28501ab64890Smrg}; 28511ab64890Smrg 28521ab64890Smrgstatic XlcConv 28531ab64890Smrgopen_stdc_wcstocts( 28541ab64890Smrg XLCd from_lcd, 28551ab64890Smrg const char *from_type, 28561ab64890Smrg XLCd to_lcd, 28571ab64890Smrg const char *to_type) 28581ab64890Smrg{ 28591ab64890Smrg return create_conv(from_lcd, &stdc_wcstocts_methods); 28601ab64890Smrg} 28611ab64890Smrg 28621ab64890Smrgstatic XlcConvMethodsRec stdc_wcstostr_methods = { 28631ab64890Smrg close_converter, 28641ab64890Smrg stdc_wcstostr, 28651ab64890Smrg NULL 28661ab64890Smrg}; 28671ab64890Smrg 28681ab64890Smrgstatic XlcConv 28691ab64890Smrgopen_stdc_wcstostr( 28701ab64890Smrg XLCd from_lcd, 28711ab64890Smrg const char *from_type, 28721ab64890Smrg XLCd to_lcd, 28731ab64890Smrg const char *to_type) 28741ab64890Smrg{ 28751ab64890Smrg return create_conv(from_lcd, &stdc_wcstostr_methods); 28761ab64890Smrg} 28771ab64890Smrg 28781ab64890Smrgstatic XlcConvMethodsRec stdc_wcstocs_methods = { 28791ab64890Smrg close_converter, 28801ab64890Smrg stdc_wcstocs, 28811ab64890Smrg NULL 28821ab64890Smrg}; 28831ab64890Smrg 28841ab64890Smrgstatic XlcConv 28851ab64890Smrgopen_stdc_wcstocs( 28861ab64890Smrg XLCd from_lcd, 28871ab64890Smrg const char *from_type, 28881ab64890Smrg XLCd to_lcd, 28891ab64890Smrg const char *to_type) 28901ab64890Smrg{ 28911ab64890Smrg return create_conv(from_lcd, &stdc_wcstocs_methods); 28921ab64890Smrg} 28931ab64890Smrg 28941ab64890Smrgstatic XlcConvMethodsRec stdc_wctocs_methods = { 28951ab64890Smrg close_converter, 28961ab64890Smrg stdc_wctocs, 28971ab64890Smrg NULL 28981ab64890Smrg}; 28991ab64890Smrg 29001ab64890Smrgstatic XlcConv 29011ab64890Smrgopen_stdc_wctocs( 29021ab64890Smrg XLCd from_lcd, 29031ab64890Smrg const char *from_type, 29041ab64890Smrg XLCd to_lcd, 29051ab64890Smrg const char *to_type) 29061ab64890Smrg{ 29071ab64890Smrg return create_conv(from_lcd, &stdc_wctocs_methods); 29081ab64890Smrg} 29091ab64890Smrg 29101ab64890Smrgstatic XlcConvMethodsRec stdc_ctstowcs_methods = { 29111ab64890Smrg close_converter, 29121ab64890Smrg stdc_ctstowcs, 29131ab64890Smrg NULL 29141ab64890Smrg}; 29151ab64890Smrg 29161ab64890Smrgstatic XlcConv 29171ab64890Smrgopen_stdc_ctstowcs( 29181ab64890Smrg XLCd from_lcd, 29191ab64890Smrg const char *from_type, 29201ab64890Smrg XLCd to_lcd, 29211ab64890Smrg const char *to_type) 29221ab64890Smrg{ 29231ab64890Smrg return create_conv(from_lcd, &stdc_ctstowcs_methods); 29241ab64890Smrg} 29251ab64890Smrg 29261ab64890Smrgstatic XlcConvMethodsRec stdc_cstowcs_methods = { 29271ab64890Smrg close_converter, 29281ab64890Smrg stdc_cstowcs, 29291ab64890Smrg NULL 29301ab64890Smrg}; 29311ab64890Smrg 29321ab64890Smrgstatic XlcConv 29331ab64890Smrgopen_stdc_cstowcs( 29341ab64890Smrg XLCd from_lcd, 29351ab64890Smrg const char *from_type, 29361ab64890Smrg XLCd to_lcd, 29371ab64890Smrg const char *to_type) 29381ab64890Smrg{ 29391ab64890Smrg return create_conv(from_lcd, &stdc_cstowcs_methods); 29401ab64890Smrg} 29411ab64890Smrg 29421ab64890Smrgstatic XlcConvMethodsRec stdc_strtowcs_methods = { 29431ab64890Smrg close_converter, 29441ab64890Smrg stdc_strtowcs, 29451ab64890Smrg NULL 29461ab64890Smrg}; 29471ab64890Smrg 29481ab64890Smrgstatic XlcConv 29491ab64890Smrgopen_stdc_strtowcs( 29501ab64890Smrg XLCd from_lcd, 29511ab64890Smrg const char *from_type, 29521ab64890Smrg XLCd to_lcd, 29531ab64890Smrg const char *to_type) 29541ab64890Smrg{ 29551ab64890Smrg return create_conv(from_lcd, &stdc_strtowcs_methods); 29561ab64890Smrg} 29571ab64890Smrg 29581ab64890Smrg#endif /* STDCVT */ 29591ab64890Smrg 29601ab64890Smrgstatic XlcConvMethodsRec mbstowcs_methods = { 29611ab64890Smrg close_converter, 29621ab64890Smrg mbstowcs_org, 29631ab64890Smrg NULL 29641ab64890Smrg}; 29651ab64890Smrg 29661ab64890Smrgstatic XlcConv 29671ab64890Smrgopen_mbstowcs( 29681ab64890Smrg XLCd from_lcd, 29691ab64890Smrg const char *from_type, 29701ab64890Smrg XLCd to_lcd, 29711ab64890Smrg const char *to_type) 29721ab64890Smrg{ 29731ab64890Smrg return create_conv(from_lcd, &mbstowcs_methods); 29741ab64890Smrg} 29751ab64890Smrg 29761ab64890Smrgstatic XlcConvMethodsRec wcstombs_methods = { 29771ab64890Smrg close_converter, 29781ab64890Smrg wcstombs_org, 29791ab64890Smrg NULL 29801ab64890Smrg}; 29811ab64890Smrg 29821ab64890Smrgstatic XlcConv 29831ab64890Smrgopen_wcstombs( 29841ab64890Smrg XLCd from_lcd, 29851ab64890Smrg const char *from_type, 29861ab64890Smrg XLCd to_lcd, 29871ab64890Smrg const char *to_type) 29881ab64890Smrg{ 29891ab64890Smrg return create_conv(from_lcd, &wcstombs_methods); 29901ab64890Smrg} 29911ab64890Smrg 29921ab64890Smrgstatic XlcConvMethodsRec wcstocts_methods = { 29931ab64890Smrg close_converter, 29941ab64890Smrg wcstocts, 29951ab64890Smrg NULL 29961ab64890Smrg}; 29971ab64890Smrg 29981ab64890Smrgstatic XlcConv 29991ab64890Smrgopen_wcstocts( 30001ab64890Smrg XLCd from_lcd, 30011ab64890Smrg const char *from_type, 30021ab64890Smrg XLCd to_lcd, 30031ab64890Smrg const char *to_type) 30041ab64890Smrg{ 30051ab64890Smrg return create_conv(from_lcd, &wcstocts_methods); 30061ab64890Smrg} 30071ab64890Smrg 30081ab64890Smrgstatic XlcConvMethodsRec wcstostr_methods = { 30091ab64890Smrg close_converter, 30101ab64890Smrg wcstostr, 30111ab64890Smrg NULL 30121ab64890Smrg}; 30131ab64890Smrg 30141ab64890Smrgstatic XlcConv 30151ab64890Smrgopen_wcstostr( 30161ab64890Smrg XLCd from_lcd, 30171ab64890Smrg const char *from_type, 30181ab64890Smrg XLCd to_lcd, 30191ab64890Smrg const char *to_type) 30201ab64890Smrg{ 30211ab64890Smrg return create_conv(from_lcd, &wcstostr_methods); 30221ab64890Smrg} 30231ab64890Smrg 30241ab64890Smrgstatic XlcConvMethodsRec wcstocs_methods = { 30251ab64890Smrg close_converter, 30261ab64890Smrg wcstocs, 30271ab64890Smrg NULL 30281ab64890Smrg}; 30291ab64890Smrg 30301ab64890Smrgstatic XlcConv 30311ab64890Smrgopen_wcstocs( 30321ab64890Smrg XLCd from_lcd, 30331ab64890Smrg const char *from_type, 30341ab64890Smrg XLCd to_lcd, 30351ab64890Smrg const char *to_type) 30361ab64890Smrg{ 30371ab64890Smrg return create_conv(from_lcd, &wcstocs_methods); 30381ab64890Smrg} 30391ab64890Smrg 30401ab64890Smrgstatic XlcConvMethodsRec wctocs_methods = { 30411ab64890Smrg close_converter, 30421ab64890Smrg wctocs, 30431ab64890Smrg NULL 30441ab64890Smrg}; 30451ab64890Smrg 30461ab64890Smrgstatic XlcConv 30471ab64890Smrgopen_wctocs( 30481ab64890Smrg XLCd from_lcd, 30491ab64890Smrg const char *from_type, 30501ab64890Smrg XLCd to_lcd, 30511ab64890Smrg const char *to_type) 30521ab64890Smrg{ 30531ab64890Smrg return create_conv(from_lcd, &wctocs_methods); 30541ab64890Smrg} 30551ab64890Smrg 30561ab64890Smrgstatic XlcConvMethodsRec ctstowcs_methods = { 30571ab64890Smrg close_converter, 30581ab64890Smrg ctstowcs, 30591ab64890Smrg NULL 30601ab64890Smrg}; 30611ab64890Smrg 30621ab64890Smrgstatic XlcConv 30631ab64890Smrgopen_ctstowcs( 30641ab64890Smrg XLCd from_lcd, 30651ab64890Smrg const char *from_type, 30661ab64890Smrg XLCd to_lcd, 30671ab64890Smrg const char *to_type) 30681ab64890Smrg{ 30691ab64890Smrg return create_conv(from_lcd, &ctstowcs_methods); 30701ab64890Smrg} 30711ab64890Smrg 30721ab64890Smrgstatic XlcConvMethodsRec cstowcs_methods = { 30731ab64890Smrg close_converter, 30741ab64890Smrg cstowcs, 30751ab64890Smrg NULL 30761ab64890Smrg}; 30771ab64890Smrg 30781ab64890Smrgstatic XlcConv 30791ab64890Smrgopen_cstowcs( 30801ab64890Smrg XLCd from_lcd, 30811ab64890Smrg const char *from_type, 30821ab64890Smrg XLCd to_lcd, 30831ab64890Smrg const char *to_type) 30841ab64890Smrg{ 30851ab64890Smrg return create_conv(from_lcd, &cstowcs_methods); 30861ab64890Smrg} 30871ab64890Smrg 30881ab64890Smrgstatic XlcConvMethodsRec strtowcs_methods = { 30891ab64890Smrg close_converter, 30901ab64890Smrg strtowcs, 30911ab64890Smrg NULL 30921ab64890Smrg}; 30931ab64890Smrg 30941ab64890Smrgstatic XlcConv 30951ab64890Smrgopen_strtowcs( 30961ab64890Smrg XLCd from_lcd, 30971ab64890Smrg const char *from_type, 30981ab64890Smrg XLCd to_lcd, 30991ab64890Smrg const char *to_type) 31001ab64890Smrg{ 31011ab64890Smrg return create_conv(from_lcd, &strtowcs_methods); 31021ab64890Smrg} 31031ab64890Smrg 31041ab64890Smrg/* -------------------------------------------------------------------------- */ 31051ab64890Smrg/* Loader */ 31061ab64890Smrg/* -------------------------------------------------------------------------- */ 31071ab64890Smrg 31081ab64890SmrgXLCd 31091ab64890Smrg_XlcGenericLoader( 31101ab64890Smrg const char *name) 31111ab64890Smrg{ 31121ab64890Smrg XLCd lcd; 31131ab64890Smrg#ifdef STDCVT 31141ab64890Smrg XLCdGenericPart *gen; 31151ab64890Smrg#endif 31161ab64890Smrg 31171ab64890Smrg lcd = _XlcCreateLC(name, _XlcGenericMethods); 31181ab64890Smrg 31191ab64890Smrg if (lcd == NULL) 31201ab64890Smrg return lcd; 31211ab64890Smrg 31221ab64890Smrg default_GL_charset = _XlcGetCharSet("ISO8859-1:GL"); 31231ab64890Smrg default_GR_charset = _XlcGetCharSet("ISO8859-1:GR"); 31241ab64890Smrg 31251ab64890Smrg _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCompoundText, open_mbstocts); 31261ab64890Smrg _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNString, open_mbstostr); 31271ab64890Smrg _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs); 31281ab64890Smrg _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbtocs); 31291ab64890Smrg _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNMultiByte, open_ctstombs); 31301ab64890Smrg _XlcSetConverter(lcd, XlcNString, lcd, XlcNMultiByte, open_strtombs); 31311ab64890Smrg _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs); 313261b2299dSmrg 31331ab64890Smrg#ifdef STDCVT 31341ab64890Smrg gen = XLC_GENERIC_PART(lcd); 31351ab64890Smrg 31361ab64890Smrg if (gen->use_stdc_env != True) { 31371ab64890Smrg#endif 31381ab64890Smrg _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_mbstowcs); 31391ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_wcstombs); 31401ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCompoundText, open_wcstocts); 31411ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNString, open_wcstostr); 31421ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs); 31431ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNChar, open_wctocs); 31441ab64890Smrg _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar, open_ctstowcs); 31451ab64890Smrg _XlcSetConverter(lcd, XlcNString, lcd, XlcNWideChar, open_strtowcs); 31461ab64890Smrg _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs); 31471ab64890Smrg#ifdef STDCVT 31481ab64890Smrg } 31491ab64890Smrg#endif 31501ab64890Smrg 31511ab64890Smrg#ifdef STDCVT 31521ab64890Smrg if (gen->use_stdc_env == True) { 31531ab64890Smrg _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_stdc_mbstowcs); 31541ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_stdc_wcstombs); 31551ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCompoundText, open_stdc_wcstocts); 31561ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNString, open_stdc_wcstostr); 31571ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_stdc_wcstocs); 31581ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNChar, open_stdc_wctocs); 31591ab64890Smrg _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar, open_stdc_ctstowcs); 31601ab64890Smrg _XlcSetConverter(lcd, XlcNString, lcd, XlcNWideChar, open_stdc_strtowcs); 31611ab64890Smrg _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_stdc_cstowcs); 31621ab64890Smrg } 31631ab64890Smrg#endif 31641ab64890Smrg 31651ab64890Smrg _XlcAddUtf8Converters(lcd); 31661ab64890Smrg 31671ab64890Smrg return lcd; 31681ab64890Smrg} 3169