lcGenConv.c revision 556b6652
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 17971ab64890Smrg while (*from_left && *to_left) { 17981ab64890Smrg 17991ab64890Smrg ch = *inbufptr++; 18001ab64890Smrg (*from_left)--; 18011ab64890Smrg 18021ab64890Smrg /* null ? */ 18031ab64890Smrg if (!ch) { 18041ab64890Smrg unconv_num = 1; 18051ab64890Smrg if (len_left) 18061ab64890Smrg unconv_num += (length - len_left); 18071ab64890Smrg break; 18081ab64890Smrg } 18091ab64890Smrg 18101ab64890Smrg /* same mb char data */ 18111ab64890Smrg if (len_left) 18121ab64890Smrg goto output; 18131ab64890Smrg 18141ab64890Smrg /* next mb char data for single shift ? */ 18151ab64890Smrg if (mb_parse_table && (num = mb_parse_table[ch]) ) { 18161ab64890Smrg codeset = mb_parse_codeset(state, num, &inbufptr, from_left); 18171ab64890Smrg if (codeset != NULL) { 18181ab64890Smrg length = len_left = codeset->length; 18191ab64890Smrg mb = 0; 18201ab64890Smrg continue; 18211ab64890Smrg } 18221ab64890Smrg } 18231ab64890Smrg 18241ab64890Smrg /* next mb char data for byteM ? */ 18251ab64890Smrg if ((codeset = byteM_parse_codeset(lcd, (inbufptr - 1)))) 18261ab64890Smrg goto next_mb_char; 18271ab64890Smrg 18281ab64890Smrg /* next mb char data for GL or GR side ? */ 18291ab64890Smrg if ((codeset = GLGR_parse_codeset(ch))) 18301ab64890Smrg goto next_mb_char; 183161b2299dSmrg 18321ab64890Smrg /* can't find codeset for the ch */ 18331ab64890Smrg unconv_num = 1; 18341ab64890Smrg break; 18351ab64890Smrg 18361ab64890Smrgnext_mb_char: 18371ab64890Smrg length = len_left = codeset->length; 18381ab64890Smrg mb = 0; 18391ab64890Smrg 18401ab64890Smrgoutput: 18411ab64890Smrg mb = (mb << 8) | ch; /* 1 byte left shift */ 18421ab64890Smrg len_left--; 18431ab64890Smrg 18441ab64890Smrg /* last of one mb char data */ 18451ab64890Smrg if (!len_left) { 18461ab64890Smrg glyph_index = mb_to_gi(mb, codeset); 18471ab64890Smrg if (!(charset = gi_parse_charset(glyph_index, codeset))) { 18481ab64890Smrg unconv_num = length; 18491ab64890Smrg break; 18501ab64890Smrg } 18511ab64890Smrg char_len = charset->char_size; 18521ab64890Smrg side = charset->side; 18531ab64890Smrg 18541ab64890Smrg /* output glyph index */ 18551ab64890Smrg if (codeset->ctconv) 18561ab64890Smrg glyph_index = conv_to_dest(codeset->ctconv, glyph_index); 18571ab64890Smrg if (*to_left < char_len) { 18581ab64890Smrg unconv_num = length; 18591ab64890Smrg break; 18601ab64890Smrg } 18611ab64890Smrg 18621ab64890Smrg if (outbufptr) { 18631ab64890Smrg output_ulong_value(outbufptr, glyph_index, char_len, side); 18641ab64890Smrg outbufptr += char_len; 18651ab64890Smrg } 18661ab64890Smrg 18671ab64890Smrg (*to_left) -= char_len; 18681ab64890Smrg 18691ab64890Smrg break; 18701ab64890Smrg } 18711ab64890Smrg 18721ab64890Smrg } /* end of while */ 18731ab64890Smrg 18741ab64890Smrg /* error end */ 18751ab64890Smrg if (unconv_num) { 18761ab64890Smrg *from = (XPointer) ((const char *) *from + from_size); 18771ab64890Smrg *from_left = 0; 18781ab64890Smrg *to = (XPointer) outbufptr; 18791ab64890Smrg return -1; 18801ab64890Smrg } 18811ab64890Smrg 1882556b6652Smrg /* normal end */ 18831ab64890Smrg *from = (XPointer) inbufptr; 18841ab64890Smrg *to = (XPointer) outbufptr; 18851ab64890Smrg 18861ab64890Smrg if (num_args > 0) 18871ab64890Smrg *((XlcCharSet *) args[0]) = charset; 18881ab64890Smrg 18891ab64890Smrg return 0; 18901ab64890Smrg} 18911ab64890Smrg 18921ab64890Smrgstatic int 18931ab64890Smrgmbstocs( 18941ab64890Smrg XlcConv conv, 18951ab64890Smrg XPointer *from, 18961ab64890Smrg int *from_left, 18971ab64890Smrg XPointer *to, 18981ab64890Smrg int *to_left, 18991ab64890Smrg XPointer *args, 19001ab64890Smrg int num_args) 19011ab64890Smrg{ 19021ab64890Smrg int ret; 19031ab64890Smrg XlcCharSet charset_old, charset = NULL; 19041ab64890Smrg XPointer tmp_args[1]; 19051ab64890Smrg 19061ab64890Smrg const char *inbufptr; 19071ab64890Smrg int in_left; 19081ab64890Smrg char *outbufptr; 19091ab64890Smrg int out_left; 19101ab64890Smrg tmp_args[0] = (XPointer) &charset; 19111ab64890Smrg 19121ab64890Smrg ret = mbtocs(conv, from, from_left, to, to_left, tmp_args, 1); 19131ab64890Smrg charset_old = charset; 191461b2299dSmrg 19151ab64890Smrg while ( ret == 0 && *from_left && *to_left) { 19161ab64890Smrg inbufptr = *from; 19171ab64890Smrg in_left = *from_left; 19181ab64890Smrg outbufptr = *to; 19191ab64890Smrg out_left = *to_left; 19201ab64890Smrg ret = mbtocs(conv, from, from_left, to, to_left, tmp_args, 1); 19211ab64890Smrg if (charset_old != charset) { 19221ab64890Smrg *from = (XPointer) inbufptr; 19231ab64890Smrg *from_left = in_left; 19241ab64890Smrg *to = (XPointer) outbufptr; 19251ab64890Smrg *to_left = out_left; 19261ab64890Smrg break; 19271ab64890Smrg } 19281ab64890Smrg } 19291ab64890Smrg 19301ab64890Smrg if (num_args > 0) 19311ab64890Smrg *((XlcCharSet *) args[0]) = charset_old; 19321ab64890Smrg 19331ab64890Smrg /* error end */ 19341ab64890Smrg if (ret != 0) 19351ab64890Smrg return( -1 ); 19361ab64890Smrg 19371ab64890Smrg return(0); 19381ab64890Smrg} 19391ab64890Smrg 19401ab64890Smrgstatic int 19411ab64890Smrgwcstostr( 19421ab64890Smrg XlcConv conv, 19431ab64890Smrg XPointer *from, 19441ab64890Smrg int *from_left, 19451ab64890Smrg XPointer *to, 19461ab64890Smrg int *to_left, 19471ab64890Smrg XPointer *args, 19481ab64890Smrg int num_args) 19491ab64890Smrg{ 19501ab64890Smrg State state = (State) conv->state; 19511ab64890Smrg XLCd lcd = state->lcd; 19521ab64890Smrg 19531ab64890Smrg char *encoding; 19541ab64890Smrg unsigned long mb, glyph_index; 19551ab64890Smrg wchar_t wc; 19561ab64890Smrg 19571ab64890Smrg int length; 19581ab64890Smrg int unconv_num = 0; 19591ab64890Smrg 19601ab64890Smrg CodeSet codeset; 19611ab64890Smrg 19621ab64890Smrg const wchar_t *inbufptr = (const wchar_t *) *from; 19631ab64890Smrg char *outbufptr = *to; 19641ab64890Smrg int from_size = *from_left; 196561b2299dSmrg 19661ab64890Smrg const char *default_string = XLC_PUBLIC(lcd, default_string); 19671ab64890Smrg int defstr_len = strlen(default_string); 19681ab64890Smrg 19691ab64890Smrg 197037e7fe2cSchristos#ifdef notdef 19711ab64890Smrg if (*from_left > *to_left) 19721ab64890Smrg *from_left = *to_left; 197337e7fe2cSchristos#endif 19741ab64890Smrg 19751ab64890Smrg while (*from_left && *to_left) { 19761ab64890Smrg 19771ab64890Smrg wc = *inbufptr++; 19781ab64890Smrg (*from_left)--; 19791ab64890Smrg 19801ab64890Smrg /* null ? */ 19811ab64890Smrg if (!wc) { 19821ab64890Smrg if (outbufptr) {*outbufptr++ = '\0';} 19831ab64890Smrg (*to_left)--; 19841ab64890Smrg 19851ab64890Smrg continue; 19861ab64890Smrg } 19871ab64890Smrg 19881ab64890Smrg /* convert */ 19891ab64890Smrg if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) { 19901ab64890Smrg 19911ab64890Smrg /* output default_string of XDefaultString() */ 19921ab64890Smrg if (*to_left < defstr_len) 19931ab64890Smrg break; 19941ab64890Smrg if (outbufptr) { 19951ab64890Smrg strncpy((char *)outbufptr, default_string, defstr_len); 19961ab64890Smrg outbufptr += defstr_len; 19971ab64890Smrg } 19981ab64890Smrg (*to_left) -= defstr_len; 19991ab64890Smrg 20001ab64890Smrg unconv_num++; 20011ab64890Smrg 20021ab64890Smrg } else { 20031ab64890Smrg mb = gi_to_mb(glyph_index, codeset); 20041ab64890Smrg 20051ab64890Smrg if (check_string_encoding(codeset)) { 20061ab64890Smrg if (codeset->parse_info) { 20071ab64890Smrg Bool need_shift = False; 20081ab64890Smrg switch (codeset->parse_info->type) { 20091ab64890Smrg case E_LSL : 20101ab64890Smrg if (codeset != state->GL_codeset) { 20111ab64890Smrg need_shift = True; 20121ab64890Smrg state->GL_codeset = codeset; 20131ab64890Smrg } 20141ab64890Smrg break; 20151ab64890Smrg case E_LSR : 20161ab64890Smrg if (codeset != state->GR_codeset) { 20171ab64890Smrg need_shift = True; 20181ab64890Smrg state->GR_codeset = codeset; 20191ab64890Smrg } 20201ab64890Smrg break; 20211ab64890Smrg /* case E_SS */ 20221ab64890Smrg default: 20231ab64890Smrg need_shift = True; 20241ab64890Smrg } 20251ab64890Smrg 20261ab64890Smrg /* output shift sequence */ 20271ab64890Smrg if (need_shift) { 20281ab64890Smrg encoding = codeset->parse_info->encoding; 20291ab64890Smrg length = strlen(encoding); 20301ab64890Smrg if (*to_left < length) 20311ab64890Smrg break; 20321ab64890Smrg 20331ab64890Smrg if (outbufptr) { 20341ab64890Smrg strncpy((char *)outbufptr, encoding, length); 20351ab64890Smrg outbufptr += length; 20361ab64890Smrg } 20371ab64890Smrg (*to_left) -= length; 20381ab64890Smrg } 20391ab64890Smrg } 20401ab64890Smrg 20411ab64890Smrg /* output characters */ 20421ab64890Smrg length = codeset->length; 20431ab64890Smrg if (*to_left < length) 20441ab64890Smrg break; 20451ab64890Smrg 20461ab64890Smrg if (outbufptr) { 20471ab64890Smrg output_ulong_value(outbufptr, mb, length, XlcNONE); 20481ab64890Smrg outbufptr += length; 20491ab64890Smrg } 20501ab64890Smrg 20511ab64890Smrg (*to_left) -= length; 20521ab64890Smrg } else { 20531ab64890Smrg unconv_num++; 20541ab64890Smrg } 20551ab64890Smrg } 20561ab64890Smrg 20571ab64890Smrg } /* end of while */ 20581ab64890Smrg 20591ab64890Smrg *from = (XPointer) ((const wchar_t *) *from + from_size); 20601ab64890Smrg *from_left = 0; 20611ab64890Smrg *to = (XPointer) outbufptr; 20621ab64890Smrg 20631ab64890Smrg return unconv_num; 20641ab64890Smrg} 20651ab64890Smrg 20661ab64890Smrgstatic int 20671ab64890Smrgstdc_wcstostr( 20681ab64890Smrg XlcConv conv, 20691ab64890Smrg XPointer *from, 20701ab64890Smrg int *from_left, 20711ab64890Smrg XPointer *to, 20721ab64890Smrg int *to_left, 20731ab64890Smrg XPointer *args, 20741ab64890Smrg int num_args) 20751ab64890Smrg{ 20761ab64890Smrg XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX); 20771ab64890Smrg char *buf_ptr1 = buf; 20781ab64890Smrg int buf_left1 = (*from_left) * MB_CUR_MAX; 20791ab64890Smrg char *buf_ptr2 = buf_ptr1; 20801ab64890Smrg int buf_left2; 20811ab64890Smrg int unconv_num1 = 0, unconv_num2 = 0; 20821ab64890Smrg 208361b2299dSmrg unconv_num1 = stdc_wcstombs(conv, 20841ab64890Smrg from, from_left, &buf_ptr1, &buf_left1, args, num_args); 20851ab64890Smrg if (unconv_num1 < 0) 20861ab64890Smrg goto ret; 20871ab64890Smrg 20881ab64890Smrg buf_left2 = buf_ptr1 - buf_ptr2; 20891ab64890Smrg 209061b2299dSmrg unconv_num2 = mbstostr(conv, 20911ab64890Smrg &buf_ptr2, &buf_left2, to, to_left, args, num_args); 20921ab64890Smrg if (unconv_num2 < 0) 20931ab64890Smrg goto ret; 20941ab64890Smrg 20951ab64890Smrgret: 20961ab64890Smrg if (buf) 20971ab64890Smrg Xfree((char *)buf); 20981ab64890Smrg 20991ab64890Smrg return (unconv_num1 + unconv_num2); 21001ab64890Smrg} 21011ab64890Smrg 21021ab64890Smrgstatic int 21031ab64890Smrgwctocs( 21041ab64890Smrg XlcConv conv, 21051ab64890Smrg XPointer *from, 21061ab64890Smrg int *from_left, 21071ab64890Smrg XPointer *to, 21081ab64890Smrg int *to_left, 21091ab64890Smrg XPointer *args, 21101ab64890Smrg int num_args) 21111ab64890Smrg{ 21121ab64890Smrg State state = (State) conv->state; 21131ab64890Smrg XLCd lcd = state->lcd; 21141ab64890Smrg 21151ab64890Smrg wchar_t wc; 21161ab64890Smrg unsigned long glyph_index; 21171ab64890Smrg 21181ab64890Smrg int char_len; 21191ab64890Smrg int unconv_num = 0; 21201ab64890Smrg XlcSide side; 21211ab64890Smrg 21221ab64890Smrg CodeSet codeset; 21231ab64890Smrg XlcCharSet charset = NULL; 21241ab64890Smrg 21251ab64890Smrg const wchar_t *inbufptr = (const wchar_t *) *from; 21261ab64890Smrg char *outbufptr = *to; 21271ab64890Smrg int from_size = *from_left; 21281ab64890Smrg 212937e7fe2cSchristos#ifdef notdef 21301ab64890Smrg if (*from_left > *to_left) 21311ab64890Smrg *from_left = *to_left; 213237e7fe2cSchristos#endif 21331ab64890Smrg 21341ab64890Smrg if (*from_left && *to_left) { 21351ab64890Smrg 21361ab64890Smrg wc = *inbufptr++; 21371ab64890Smrg (*from_left)--; 21381ab64890Smrg 21391ab64890Smrg /* null ? */ 21401ab64890Smrg if (!wc) { 21411ab64890Smrg unconv_num = 1; 21421ab64890Smrg goto end; 21431ab64890Smrg } 21441ab64890Smrg 21451ab64890Smrg /* convert */ 21461ab64890Smrg if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) { 21471ab64890Smrg unconv_num = 1; 21481ab64890Smrg goto end; 21491ab64890Smrg } 21501ab64890Smrg 21511ab64890Smrg if ( !(charset = gi_parse_charset(glyph_index, codeset)) ) { 21521ab64890Smrg unconv_num = 1; 21531ab64890Smrg goto end; 21541ab64890Smrg } 21551ab64890Smrg char_len = charset->char_size; 21561ab64890Smrg side = charset->side; 21571ab64890Smrg 21581ab64890Smrg /* output glyph index */ 21591ab64890Smrg if (codeset->ctconv) 21601ab64890Smrg glyph_index = conv_to_dest(codeset->ctconv, glyph_index); 21611ab64890Smrg if (*to_left < char_len) { 21621ab64890Smrg unconv_num++; 21631ab64890Smrg goto end; 21641ab64890Smrg } 21651ab64890Smrg 21661ab64890Smrg if (outbufptr) { 21671ab64890Smrg output_ulong_value(outbufptr, glyph_index, char_len, side); 21681ab64890Smrg outbufptr += char_len; 21691ab64890Smrg } 21701ab64890Smrg 21711ab64890Smrg (*to_left) -= char_len; 21721ab64890Smrg 21731ab64890Smrg } 21741ab64890Smrg 21751ab64890Smrgend: 21761ab64890Smrg 21771ab64890Smrg /* error end */ 21781ab64890Smrg if (unconv_num) { 21791ab64890Smrg *from = (XPointer) ((const wchar_t *) *from + from_size); 21801ab64890Smrg *from_left = 0; 21811ab64890Smrg *to = (XPointer) outbufptr; 21821ab64890Smrg return -1; 21831ab64890Smrg } 21841ab64890Smrg 2185556b6652Smrg /* normal end */ 21861ab64890Smrg *from = (XPointer) inbufptr; 21871ab64890Smrg *to = (XPointer) outbufptr; 21881ab64890Smrg 21891ab64890Smrg if (num_args > 0) 21901ab64890Smrg *((XlcCharSet *) args[0]) = charset; 21911ab64890Smrg 21921ab64890Smrg return 0; 21931ab64890Smrg} 21941ab64890Smrg 21951ab64890Smrgstatic int 21961ab64890Smrgstdc_wctocs( 21971ab64890Smrg XlcConv conv, 21981ab64890Smrg XPointer *from, 21991ab64890Smrg int *from_left, 22001ab64890Smrg XPointer *to, 22011ab64890Smrg int *to_left, 22021ab64890Smrg XPointer *args, 22031ab64890Smrg int num_args) 22041ab64890Smrg{ 22051ab64890Smrg const wchar_t *src = *((const wchar_t **) from); 22061ab64890Smrg wchar_t wch; 22071ab64890Smrg XPointer tmp_from, save_from = *from; 22081ab64890Smrg char tmp[32]; 22091ab64890Smrg int length, ret, src_left = *from_left; 22101ab64890Smrg int from_size = *from_left; 22111ab64890Smrg 22121ab64890Smrg if (src_left > 0 && *to_left > 0) { 22131ab64890Smrg if ((wch = *src)) { 22141ab64890Smrg length = wctomb(tmp, wch); 22151ab64890Smrg } else { 22161ab64890Smrg goto end; 22171ab64890Smrg } 221861b2299dSmrg 22191ab64890Smrg if (length < 0) 22201ab64890Smrg goto end; 22211ab64890Smrg 22221ab64890Smrg tmp_from = (XPointer) tmp; 22231ab64890Smrg ret = mbtocs(conv, &tmp_from, &length, to, to_left, args, num_args); 22241ab64890Smrg if (ret < 0) 22251ab64890Smrg goto end; 22261ab64890Smrg 22271ab64890Smrg src++; 22281ab64890Smrg src_left--; 22291ab64890Smrg } 22301ab64890Smrg 22311ab64890Smrgend: 22321ab64890Smrg /* error end */ 22331ab64890Smrg if (save_from == (XPointer) src) { 22341ab64890Smrg *from = (XPointer) ((const wchar_t *) *from + from_size); 22351ab64890Smrg *from_left = 0; 22361ab64890Smrg return -1; 22371ab64890Smrg } 22381ab64890Smrg 2239556b6652Smrg /* normal end */ 22401ab64890Smrg *from = (XPointer) src; 22411ab64890Smrg *from_left = src_left; 22421ab64890Smrg 22431ab64890Smrg return 0; 22441ab64890Smrg} 22451ab64890Smrg 22461ab64890Smrgstatic int 22471ab64890Smrgwcstocs( 22481ab64890Smrg XlcConv conv, 22491ab64890Smrg XPointer *from, 22501ab64890Smrg int *from_left, 22511ab64890Smrg XPointer *to, 22521ab64890Smrg int *to_left, 22531ab64890Smrg XPointer *args, 22541ab64890Smrg int num_args) 22551ab64890Smrg{ 22561ab64890Smrg int ret; 22571ab64890Smrg XlcCharSet charset_old, charset = NULL; 22581ab64890Smrg XPointer tmp_args[1]; 22591ab64890Smrg 22601ab64890Smrg const wchar_t *inbufptr; 22611ab64890Smrg int in_left; 22621ab64890Smrg XPointer outbufptr; 22631ab64890Smrg int out_left; 22641ab64890Smrg tmp_args[0] = (XPointer) &charset; 22651ab64890Smrg 22661ab64890Smrg ret = wctocs(conv, from, from_left, to, to_left, tmp_args, 1); 22671ab64890Smrg charset_old = charset; 22681ab64890Smrg 22691ab64890Smrg while ( ret == 0 && *from_left && *to_left) { 22701ab64890Smrg inbufptr = (const wchar_t *) *from; 22711ab64890Smrg in_left = *from_left; 22721ab64890Smrg outbufptr = *to; 22731ab64890Smrg out_left = *to_left; 22741ab64890Smrg ret = wctocs(conv, from, from_left, to, to_left, tmp_args, 1); 22751ab64890Smrg if (charset_old != charset) { 22761ab64890Smrg *from = (XPointer) inbufptr; 22771ab64890Smrg *from_left = in_left; 22781ab64890Smrg *to = (XPointer) outbufptr; 22791ab64890Smrg *to_left = out_left; 22801ab64890Smrg break; 22811ab64890Smrg } 22821ab64890Smrg } 22831ab64890Smrg 22841ab64890Smrg if (num_args > 0) 22851ab64890Smrg *((XlcCharSet *) args[0]) = charset_old; 22861ab64890Smrg 22871ab64890Smrg /* error end */ 22881ab64890Smrg if (ret != 0) 22891ab64890Smrg return( -1 ); 22901ab64890Smrg 22911ab64890Smrg return(0); 22921ab64890Smrg} 22931ab64890Smrg 22941ab64890Smrg#ifdef STDCVT 22951ab64890Smrg 22961ab64890Smrgstatic int 22971ab64890Smrgstdc_wcstocs( 22981ab64890Smrg XlcConv conv, 22991ab64890Smrg XPointer *from, 23001ab64890Smrg int *from_left, 23011ab64890Smrg XPointer *to, 23021ab64890Smrg int *to_left, 23031ab64890Smrg XPointer *args, 23041ab64890Smrg int num_args) 23051ab64890Smrg{ 23061ab64890Smrg int ret; 23071ab64890Smrg XlcCharSet charset_old, charset = NULL; 23081ab64890Smrg XPointer tmp_args[1]; 23091ab64890Smrg 23101ab64890Smrg const wchar_t *inbufptr; 23111ab64890Smrg int in_left; 23121ab64890Smrg XPointer outbufptr; 23131ab64890Smrg int out_left; 23141ab64890Smrg tmp_args[0] = (XPointer) &charset; 23151ab64890Smrg 23161ab64890Smrg ret = stdc_wctocs(conv, from, from_left, to, to_left, tmp_args, 1); 23171ab64890Smrg charset_old = charset; 23181ab64890Smrg 23191ab64890Smrg while ( ret == 0 && *from_left && *to_left ) { 23201ab64890Smrg inbufptr = (const wchar_t *) *from; 23211ab64890Smrg in_left = *from_left; 23221ab64890Smrg outbufptr = *to; 23231ab64890Smrg out_left = *to_left; 23241ab64890Smrg ret = stdc_wctocs(conv, from, from_left, to, to_left, tmp_args, 1); 23251ab64890Smrg if (charset_old != charset) { 23261ab64890Smrg *from = (XPointer) inbufptr; 23271ab64890Smrg *from_left = in_left; 23281ab64890Smrg *to = (XPointer) outbufptr; 23291ab64890Smrg *to_left = out_left; 23301ab64890Smrg break; 23311ab64890Smrg } 23321ab64890Smrg } 23331ab64890Smrg 23341ab64890Smrg if (num_args > 0) 23351ab64890Smrg *((XlcCharSet *) args[0]) = charset_old; 23361ab64890Smrg 23371ab64890Smrg /* error end */ 23381ab64890Smrg if (ret != 0) 23391ab64890Smrg return( -1 ); 23401ab64890Smrg 23411ab64890Smrg return(0); 23421ab64890Smrg} 23431ab64890Smrg 23441ab64890Smrg#endif 23451ab64890Smrg 23461ab64890Smrgstatic int 23471ab64890Smrgctstombs( 23481ab64890Smrg XlcConv conv, 23491ab64890Smrg XPointer *from, 23501ab64890Smrg int *from_left, 23511ab64890Smrg XPointer *to, 23521ab64890Smrg int *to_left, 23531ab64890Smrg XPointer *args, 23541ab64890Smrg int num_args) 23551ab64890Smrg{ 23561ab64890Smrg XPointer buf = Xmalloc((*from_left) * sizeof(wchar_t)); 23571ab64890Smrg char *buf_ptr1 = buf; 23581ab64890Smrg int buf_left1 = (*from_left); 23591ab64890Smrg char *buf_ptr2 = buf_ptr1; 23601ab64890Smrg int buf_left2; 23611ab64890Smrg int unconv_num1 = 0, unconv_num2 = 0; 23621ab64890Smrg 236361b2299dSmrg unconv_num1 = ctstowcs(conv, 23641ab64890Smrg from, from_left, &buf_ptr1, &buf_left1, args, num_args); 23651ab64890Smrg if (unconv_num1 < 0) 23661ab64890Smrg goto ret; 23671ab64890Smrg 23681ab64890Smrg buf_left2 = (buf_ptr1 - buf_ptr2) / sizeof(wchar_t); 23691ab64890Smrg 237061b2299dSmrg unconv_num2 += wcstombs_org(conv, 23711ab64890Smrg &buf_ptr2, &buf_left2, to, to_left, args, num_args); 23721ab64890Smrg if (unconv_num2 < 0) 23731ab64890Smrg goto ret; 23741ab64890Smrg 23751ab64890Smrgret: 23761ab64890Smrg if (buf) 23771ab64890Smrg Xfree((char *)buf); 23781ab64890Smrg 23791ab64890Smrg return (unconv_num1 + unconv_num2); 23801ab64890Smrg} 23811ab64890Smrg 23821ab64890Smrgstatic int 23831ab64890Smrgcstombs( 23841ab64890Smrg XlcConv conv, 23851ab64890Smrg XPointer *from, 23861ab64890Smrg int *from_left, 23871ab64890Smrg XPointer *to, 23881ab64890Smrg int *to_left, 23891ab64890Smrg XPointer *args, 23901ab64890Smrg int num_args) 23911ab64890Smrg{ 23921ab64890Smrg XPointer buf = Xmalloc((*from_left) * sizeof(wchar_t)); 23931ab64890Smrg char *buf_ptr1 = buf; 23941ab64890Smrg int buf_left1 = (*from_left); 23951ab64890Smrg char *buf_ptr2 = buf_ptr1; 23961ab64890Smrg int buf_left2; 23971ab64890Smrg int unconv_num1 = 0, unconv_num2 = 0; 23981ab64890Smrg 239961b2299dSmrg unconv_num1 = cstowcs(conv, 24001ab64890Smrg from, from_left, &buf_ptr1, &buf_left1, args, num_args); 24011ab64890Smrg if (unconv_num1 < 0) 24021ab64890Smrg goto ret; 24031ab64890Smrg 24041ab64890Smrg buf_left2 = (buf_ptr1 - buf_ptr2) / sizeof(wchar_t); 24051ab64890Smrg 240661b2299dSmrg unconv_num2 += wcstombs_org(conv, 24071ab64890Smrg &buf_ptr2, &buf_left2, to, to_left, args, num_args); 24081ab64890Smrg if (unconv_num2 < 0) 24091ab64890Smrg goto ret; 24101ab64890Smrg 24111ab64890Smrgret: 24121ab64890Smrg if (buf) 24131ab64890Smrg Xfree((char *)buf); 24141ab64890Smrg 24151ab64890Smrg return (unconv_num1 + unconv_num2); 24161ab64890Smrg} 24171ab64890Smrg 24181ab64890Smrgstatic int 24191ab64890Smrgstrtombs( 24201ab64890Smrg XlcConv conv, 24211ab64890Smrg XPointer *from, 24221ab64890Smrg int *from_left, 24231ab64890Smrg XPointer *to, 24241ab64890Smrg int *to_left, 24251ab64890Smrg XPointer *args, 24261ab64890Smrg int num_args) 24271ab64890Smrg{ 24281ab64890Smrg State state = (State) conv->state; 24291ab64890Smrg XLCd lcd = state->lcd; 24301ab64890Smrg 24311ab64890Smrg char *encoding; 24321ab64890Smrg unsigned long mb, glyph_index; 24331ab64890Smrg unsigned char ch; 24341ab64890Smrg 24351ab64890Smrg int length; 24361ab64890Smrg int unconv_num = 0; 24371ab64890Smrg 24381ab64890Smrg CodeSet codeset; 24391ab64890Smrg 24401ab64890Smrg const char *inbufptr = *from; 24411ab64890Smrg char *outbufptr = *to; 24421ab64890Smrg int from_size = *from_left; 24431ab64890Smrg 244437e7fe2cSchristos#ifdef notdef 24451ab64890Smrg if (*from_left > *to_left) 24461ab64890Smrg *from_left = *to_left; 244737e7fe2cSchristos#endif 24481ab64890Smrg 24491ab64890Smrg while (*from_left && *to_left) { 24501ab64890Smrg 24511ab64890Smrg ch = *inbufptr++; 24521ab64890Smrg (*from_left)--; 24531ab64890Smrg 24541ab64890Smrg /* null ? */ 24551ab64890Smrg if (!ch) { 24561ab64890Smrg if (outbufptr) {*outbufptr++ = '\0';} 24571ab64890Smrg (*to_left)--; 24581ab64890Smrg 24591ab64890Smrg continue; 24601ab64890Smrg } 24611ab64890Smrg 24621ab64890Smrg /* convert */ 24631ab64890Smrg if (isleftside(ch)) { 24641ab64890Smrg glyph_index = ch; 24651ab64890Smrg codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GL"); 24661ab64890Smrg } else { 24671ab64890Smrg glyph_index = ch & GL; 24681ab64890Smrg codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GR"); 24691ab64890Smrg } 24701ab64890Smrg 24711ab64890Smrg if (!codeset) { 24721ab64890Smrg unconv_num++; 24731ab64890Smrg continue; 24741ab64890Smrg } 24751ab64890Smrg 24761ab64890Smrg mb = gi_to_mb(glyph_index, codeset); 24771ab64890Smrg if (codeset->parse_info) { 24781ab64890Smrg Bool need_shift = False; 24791ab64890Smrg switch (codeset->parse_info->type) { 24801ab64890Smrg case E_LSL : 24811ab64890Smrg if (codeset != state->GL_codeset) { 24821ab64890Smrg need_shift = True; 24831ab64890Smrg state->GL_codeset = codeset; 24841ab64890Smrg } 24851ab64890Smrg break; 24861ab64890Smrg case E_LSR : 24871ab64890Smrg if (codeset != state->GR_codeset) { 24881ab64890Smrg need_shift = True; 24891ab64890Smrg state->GR_codeset = codeset; 24901ab64890Smrg } 24911ab64890Smrg break; 24921ab64890Smrg /* case E_SS */ 24931ab64890Smrg default: 24941ab64890Smrg need_shift = True; 24951ab64890Smrg } 24961ab64890Smrg 24971ab64890Smrg /* output shift sequence */ 24981ab64890Smrg if (need_shift) { 24991ab64890Smrg encoding = codeset->parse_info->encoding; 25001ab64890Smrg length = strlen(encoding); 25011ab64890Smrg if (*to_left < length) 25021ab64890Smrg break; 25031ab64890Smrg if (outbufptr) { 25041ab64890Smrg strncpy((char *)outbufptr, encoding, length); 25051ab64890Smrg outbufptr += length; 25061ab64890Smrg } 25071ab64890Smrg (*to_left) -= length; 25081ab64890Smrg } 25091ab64890Smrg } 25101ab64890Smrg 25111ab64890Smrg /* output characters */ 25121ab64890Smrg length = codeset->length; 25131ab64890Smrg if (*to_left < length) 25141ab64890Smrg break; 25151ab64890Smrg 25161ab64890Smrg if (outbufptr) { 25171ab64890Smrg output_ulong_value(outbufptr, mb, length, XlcNONE); 25181ab64890Smrg outbufptr += length; 25191ab64890Smrg } 25201ab64890Smrg 25211ab64890Smrg (*to_left) -= length; 25221ab64890Smrg 25231ab64890Smrg } /* end of while */ 25241ab64890Smrg 25251ab64890Smrg *from = (XPointer) ((const char *) *from + from_size); 25261ab64890Smrg *from_left = 0; 25271ab64890Smrg *to = (XPointer) outbufptr; 25281ab64890Smrg 25291ab64890Smrg return unconv_num; 25301ab64890Smrg} 25311ab64890Smrg 25321ab64890Smrgstatic int 25331ab64890Smrgstrtowcs( 25341ab64890Smrg XlcConv conv, 25351ab64890Smrg XPointer *from, 25361ab64890Smrg int *from_left, 25371ab64890Smrg XPointer *to, 25381ab64890Smrg int *to_left, 25391ab64890Smrg XPointer *args, 25401ab64890Smrg int num_args) 25411ab64890Smrg{ 25421ab64890Smrg State state = (State) conv->state; 25431ab64890Smrg XLCd lcd = state->lcd; 25441ab64890Smrg 25451ab64890Smrg unsigned char ch; 25461ab64890Smrg unsigned long glyph_index; 25471ab64890Smrg wchar_t wc; 25481ab64890Smrg 25491ab64890Smrg int unconv_num = 0; 25501ab64890Smrg CodeSet codeset; 25511ab64890Smrg 25521ab64890Smrg const char *inbufptr = *from; 25531ab64890Smrg wchar_t *outbufptr = (wchar_t *)*to; 25541ab64890Smrg int from_size = *from_left; 25551ab64890Smrg 255637e7fe2cSchristos#ifdef notdef 25571ab64890Smrg if (*from_left > *to_left) 25581ab64890Smrg *from_left = *to_left; 255937e7fe2cSchristos#endif 25601ab64890Smrg 25611ab64890Smrg while (*from_left && *to_left) { 25621ab64890Smrg 25631ab64890Smrg ch = *inbufptr++; 25641ab64890Smrg (*from_left)--; 25651ab64890Smrg 25661ab64890Smrg /* null ? */ 25671ab64890Smrg if (!ch) { 25681ab64890Smrg if (outbufptr) {*outbufptr++ = L'\0';} 25691ab64890Smrg (*to_left)--; 25701ab64890Smrg 25711ab64890Smrg continue; 25721ab64890Smrg } 25731ab64890Smrg 25741ab64890Smrg /* convert */ 25751ab64890Smrg if (isleftside(ch)) { 25761ab64890Smrg glyph_index = ch; 25771ab64890Smrg codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GL"); 25781ab64890Smrg } else { 25791ab64890Smrg glyph_index = ch & GL; 25801ab64890Smrg codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GR"); 25811ab64890Smrg } 25821ab64890Smrg 25831ab64890Smrg if (!codeset) { 25841ab64890Smrg unconv_num++; 25851ab64890Smrg continue; 25861ab64890Smrg } 25871ab64890Smrg 25881ab64890Smrg gi_to_wc(lcd, glyph_index, codeset, &wc); 25891ab64890Smrg if (outbufptr) {*outbufptr++ = wc;} 25901ab64890Smrg (*to_left)--; 25911ab64890Smrg 25921ab64890Smrg } /* end of while */ 25931ab64890Smrg 25941ab64890Smrg *from = (XPointer) ((const char *) *from + from_size); 25951ab64890Smrg *from_left = 0; 25961ab64890Smrg *to = (XPointer) outbufptr; 25971ab64890Smrg 25981ab64890Smrg return unconv_num; 25991ab64890Smrg} 26001ab64890Smrg 26011ab64890Smrgstatic int 26021ab64890Smrgstdc_strtowcs( 26031ab64890Smrg XlcConv conv, 26041ab64890Smrg XPointer *from, 26051ab64890Smrg int *from_left, 26061ab64890Smrg XPointer *to, 26071ab64890Smrg int *to_left, 26081ab64890Smrg XPointer *args, 26091ab64890Smrg int num_args) 26101ab64890Smrg{ 26111ab64890Smrg XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX); 26121ab64890Smrg char *buf_ptr1 = buf; 26131ab64890Smrg int buf_left1 = (*from_left) * MB_CUR_MAX; 26141ab64890Smrg char *buf_ptr2 = buf_ptr1; 26151ab64890Smrg int buf_left2; 26161ab64890Smrg int unconv_num1 = 0, unconv_num2 = 0; 26171ab64890Smrg 261861b2299dSmrg unconv_num1 = strtombs(conv, 26191ab64890Smrg from, from_left, &buf_ptr1, &buf_left1, args, num_args); 26201ab64890Smrg if (unconv_num1 < 0) 26211ab64890Smrg goto ret; 26221ab64890Smrg 26231ab64890Smrg buf_left2 = buf_ptr1 - buf_ptr2; 26241ab64890Smrg 262561b2299dSmrg unconv_num2 = stdc_mbstowcs(conv, 26261ab64890Smrg &buf_ptr2, &buf_left2, to, to_left, args, num_args); 26271ab64890Smrg if (unconv_num2 < 0) 26281ab64890Smrg goto ret; 26291ab64890Smrg 26301ab64890Smrgret: 26311ab64890Smrg if (buf) 26321ab64890Smrg Xfree((char *)buf); 26331ab64890Smrg 26341ab64890Smrg return (unconv_num1 + unconv_num2); 26351ab64890Smrg} 26361ab64890Smrg 26371ab64890Smrg/* -------------------------------------------------------------------------- */ 26381ab64890Smrg/* Close */ 26391ab64890Smrg/* -------------------------------------------------------------------------- */ 26401ab64890Smrg 26411ab64890Smrgstatic void 26421ab64890Smrgclose_converter( 26431ab64890Smrg XlcConv conv) 26441ab64890Smrg{ 26451ab64890Smrg if (conv->state) { 26461ab64890Smrg Xfree((char *) conv->state); 26471ab64890Smrg } 26481ab64890Smrg 26491ab64890Smrg if (conv->methods) { 26501ab64890Smrg Xfree((char *) conv->methods); 26511ab64890Smrg } 26521ab64890Smrg 26531ab64890Smrg Xfree((char *) conv); 26541ab64890Smrg} 26551ab64890Smrg 26561ab64890Smrg/* -------------------------------------------------------------------------- */ 26571ab64890Smrg/* Open */ 26581ab64890Smrg/* -------------------------------------------------------------------------- */ 26591ab64890Smrg 26601ab64890Smrgstatic XlcConv 26611ab64890Smrgcreate_conv( 26621ab64890Smrg XLCd lcd, 26631ab64890Smrg XlcConvMethods methods) 26641ab64890Smrg{ 26651ab64890Smrg XlcConv conv; 26661ab64890Smrg State state; 26671ab64890Smrg 2668c17aa6b1Smrg conv = (XlcConv) Xcalloc(1, sizeof(XlcConvRec)); 26691ab64890Smrg if (conv == NULL) 26701ab64890Smrg return (XlcConv) NULL; 267161b2299dSmrg 26721ab64890Smrg conv->methods = (XlcConvMethods) Xmalloc(sizeof(XlcConvMethodsRec)); 26731ab64890Smrg if (conv->methods == NULL) 26741ab64890Smrg goto err; 26751ab64890Smrg *conv->methods = *methods; 267661b2299dSmrg conv->methods->reset = init_state; 26771ab64890Smrg 2678d8e76104Smrg conv->state = Xcalloc(1, sizeof(StateRec)); 26791ab64890Smrg if (conv->state == NULL) 26801ab64890Smrg goto err; 268161b2299dSmrg 26821ab64890Smrg state = (State) conv->state; 26831ab64890Smrg state->lcd = lcd; 268461b2299dSmrg 26851ab64890Smrg _XlcResetConverter(conv); 268661b2299dSmrg 26871ab64890Smrg return conv; 26881ab64890Smrg 26891ab64890Smrgerr: 26901ab64890Smrg close_converter(conv); 26911ab64890Smrg 26921ab64890Smrg return (XlcConv) NULL; 26931ab64890Smrg} 26941ab64890Smrg 26951ab64890Smrgstatic XlcConvMethodsRec mbstocts_methods = { 26961ab64890Smrg close_converter, 26971ab64890Smrg mbstocts, 26981ab64890Smrg NULL 26991ab64890Smrg}; 27001ab64890Smrg 27011ab64890Smrgstatic XlcConv 27021ab64890Smrgopen_mbstocts( 27031ab64890Smrg XLCd from_lcd, 27041ab64890Smrg const char *from_type, 27051ab64890Smrg XLCd to_lcd, 27061ab64890Smrg const char *to_type) 27071ab64890Smrg{ 27081ab64890Smrg return create_conv(from_lcd, &mbstocts_methods); 27091ab64890Smrg} 27101ab64890Smrg 27111ab64890Smrgstatic XlcConvMethodsRec mbstostr_methods = { 27121ab64890Smrg close_converter, 27131ab64890Smrg mbstostr, 27141ab64890Smrg NULL 27151ab64890Smrg}; 27161ab64890Smrg 27171ab64890Smrgstatic XlcConv 27181ab64890Smrgopen_mbstostr( 27191ab64890Smrg XLCd from_lcd, 27201ab64890Smrg const char *from_type, 27211ab64890Smrg XLCd to_lcd, 27221ab64890Smrg const char *to_type) 27231ab64890Smrg{ 27241ab64890Smrg return create_conv(from_lcd, &mbstostr_methods); 27251ab64890Smrg} 27261ab64890Smrg 27271ab64890Smrgstatic XlcConvMethodsRec mbstocs_methods = { 27281ab64890Smrg close_converter, 27291ab64890Smrg mbstocs, 27301ab64890Smrg NULL 27311ab64890Smrg}; 27321ab64890Smrg 27331ab64890Smrgstatic XlcConv 27341ab64890Smrgopen_mbstocs( 27351ab64890Smrg XLCd from_lcd, 27361ab64890Smrg const char *from_type, 27371ab64890Smrg XLCd to_lcd, 27381ab64890Smrg const char *to_type) 27391ab64890Smrg{ 27401ab64890Smrg return create_conv(from_lcd, &mbstocs_methods); 27411ab64890Smrg} 27421ab64890Smrg 27431ab64890Smrgstatic XlcConvMethodsRec mbtocs_methods = { 27441ab64890Smrg close_converter, 27451ab64890Smrg mbtocs, 27461ab64890Smrg NULL 27471ab64890Smrg}; 27481ab64890Smrg 27491ab64890Smrgstatic XlcConv 27501ab64890Smrgopen_mbtocs( 27511ab64890Smrg XLCd from_lcd, 27521ab64890Smrg const char *from_type, 27531ab64890Smrg XLCd to_lcd, 27541ab64890Smrg const char *to_type) 27551ab64890Smrg{ 27561ab64890Smrg return create_conv(from_lcd, &mbtocs_methods); 27571ab64890Smrg} 27581ab64890Smrg 27591ab64890Smrgstatic XlcConvMethodsRec ctstombs_methods = { 27601ab64890Smrg close_converter, 27611ab64890Smrg ctstombs, 27621ab64890Smrg NULL 27631ab64890Smrg}; 27641ab64890Smrg 27651ab64890Smrgstatic XlcConv 27661ab64890Smrgopen_ctstombs( 27671ab64890Smrg XLCd from_lcd, 27681ab64890Smrg const char *from_type, 27691ab64890Smrg XLCd to_lcd, 27701ab64890Smrg const char *to_type) 27711ab64890Smrg{ 27721ab64890Smrg return create_conv(from_lcd, &ctstombs_methods); 27731ab64890Smrg} 27741ab64890Smrg 27751ab64890Smrgstatic XlcConvMethodsRec cstombs_methods = { 27761ab64890Smrg close_converter, 27771ab64890Smrg cstombs, 27781ab64890Smrg NULL 27791ab64890Smrg}; 27801ab64890Smrg 27811ab64890Smrgstatic XlcConv 27821ab64890Smrgopen_cstombs( 27831ab64890Smrg XLCd from_lcd, 27841ab64890Smrg const char *from_type, 27851ab64890Smrg XLCd to_lcd, 27861ab64890Smrg const char *to_type) 27871ab64890Smrg{ 27881ab64890Smrg return create_conv(from_lcd, &cstombs_methods); 27891ab64890Smrg} 27901ab64890Smrg 27911ab64890Smrgstatic XlcConvMethodsRec strtombs_methods = { 27921ab64890Smrg close_converter, 27931ab64890Smrg strtombs, 27941ab64890Smrg NULL 27951ab64890Smrg}; 27961ab64890Smrg 27971ab64890Smrgstatic XlcConv 27981ab64890Smrgopen_strtombs( 27991ab64890Smrg XLCd from_lcd, 28001ab64890Smrg const char *from_type, 28011ab64890Smrg XLCd to_lcd, 28021ab64890Smrg const char *to_type) 28031ab64890Smrg{ 28041ab64890Smrg return create_conv(from_lcd, &strtombs_methods); 28051ab64890Smrg} 28061ab64890Smrg 28071ab64890Smrg#ifdef STDCVT 28081ab64890Smrg 28091ab64890Smrgstatic XlcConvMethodsRec stdc_mbstowcs_methods = { 28101ab64890Smrg close_converter, 28111ab64890Smrg stdc_mbstowcs, 28121ab64890Smrg NULL 28131ab64890Smrg}; 28141ab64890Smrg 28151ab64890Smrgstatic XlcConv 28161ab64890Smrgopen_stdc_mbstowcs( 28171ab64890Smrg XLCd from_lcd, 28181ab64890Smrg const char *from_type, 28191ab64890Smrg XLCd to_lcd, 28201ab64890Smrg const char *to_type) 28211ab64890Smrg{ 28221ab64890Smrg return create_conv(from_lcd, &stdc_mbstowcs_methods); 28231ab64890Smrg} 28241ab64890Smrg 28251ab64890Smrgstatic XlcConvMethodsRec stdc_wcstombs_methods = { 28261ab64890Smrg close_converter, 28271ab64890Smrg stdc_wcstombs, 28281ab64890Smrg NULL 28291ab64890Smrg}; 28301ab64890Smrg 28311ab64890Smrgstatic XlcConv 28321ab64890Smrgopen_stdc_wcstombs( 28331ab64890Smrg XLCd from_lcd, 28341ab64890Smrg const char *from_type, 28351ab64890Smrg XLCd to_lcd, 28361ab64890Smrg const char *to_type) 28371ab64890Smrg{ 28381ab64890Smrg return create_conv(from_lcd, &stdc_wcstombs_methods); 28391ab64890Smrg} 28401ab64890Smrg 28411ab64890Smrgstatic XlcConvMethodsRec stdc_wcstocts_methods = { 28421ab64890Smrg close_converter, 28431ab64890Smrg stdc_wcstocts, 28441ab64890Smrg NULL 28451ab64890Smrg}; 28461ab64890Smrg 28471ab64890Smrgstatic XlcConv 28481ab64890Smrgopen_stdc_wcstocts( 28491ab64890Smrg XLCd from_lcd, 28501ab64890Smrg const char *from_type, 28511ab64890Smrg XLCd to_lcd, 28521ab64890Smrg const char *to_type) 28531ab64890Smrg{ 28541ab64890Smrg return create_conv(from_lcd, &stdc_wcstocts_methods); 28551ab64890Smrg} 28561ab64890Smrg 28571ab64890Smrgstatic XlcConvMethodsRec stdc_wcstostr_methods = { 28581ab64890Smrg close_converter, 28591ab64890Smrg stdc_wcstostr, 28601ab64890Smrg NULL 28611ab64890Smrg}; 28621ab64890Smrg 28631ab64890Smrgstatic XlcConv 28641ab64890Smrgopen_stdc_wcstostr( 28651ab64890Smrg XLCd from_lcd, 28661ab64890Smrg const char *from_type, 28671ab64890Smrg XLCd to_lcd, 28681ab64890Smrg const char *to_type) 28691ab64890Smrg{ 28701ab64890Smrg return create_conv(from_lcd, &stdc_wcstostr_methods); 28711ab64890Smrg} 28721ab64890Smrg 28731ab64890Smrgstatic XlcConvMethodsRec stdc_wcstocs_methods = { 28741ab64890Smrg close_converter, 28751ab64890Smrg stdc_wcstocs, 28761ab64890Smrg NULL 28771ab64890Smrg}; 28781ab64890Smrg 28791ab64890Smrgstatic XlcConv 28801ab64890Smrgopen_stdc_wcstocs( 28811ab64890Smrg XLCd from_lcd, 28821ab64890Smrg const char *from_type, 28831ab64890Smrg XLCd to_lcd, 28841ab64890Smrg const char *to_type) 28851ab64890Smrg{ 28861ab64890Smrg return create_conv(from_lcd, &stdc_wcstocs_methods); 28871ab64890Smrg} 28881ab64890Smrg 28891ab64890Smrgstatic XlcConvMethodsRec stdc_wctocs_methods = { 28901ab64890Smrg close_converter, 28911ab64890Smrg stdc_wctocs, 28921ab64890Smrg NULL 28931ab64890Smrg}; 28941ab64890Smrg 28951ab64890Smrgstatic XlcConv 28961ab64890Smrgopen_stdc_wctocs( 28971ab64890Smrg XLCd from_lcd, 28981ab64890Smrg const char *from_type, 28991ab64890Smrg XLCd to_lcd, 29001ab64890Smrg const char *to_type) 29011ab64890Smrg{ 29021ab64890Smrg return create_conv(from_lcd, &stdc_wctocs_methods); 29031ab64890Smrg} 29041ab64890Smrg 29051ab64890Smrgstatic XlcConvMethodsRec stdc_ctstowcs_methods = { 29061ab64890Smrg close_converter, 29071ab64890Smrg stdc_ctstowcs, 29081ab64890Smrg NULL 29091ab64890Smrg}; 29101ab64890Smrg 29111ab64890Smrgstatic XlcConv 29121ab64890Smrgopen_stdc_ctstowcs( 29131ab64890Smrg XLCd from_lcd, 29141ab64890Smrg const char *from_type, 29151ab64890Smrg XLCd to_lcd, 29161ab64890Smrg const char *to_type) 29171ab64890Smrg{ 29181ab64890Smrg return create_conv(from_lcd, &stdc_ctstowcs_methods); 29191ab64890Smrg} 29201ab64890Smrg 29211ab64890Smrgstatic XlcConvMethodsRec stdc_cstowcs_methods = { 29221ab64890Smrg close_converter, 29231ab64890Smrg stdc_cstowcs, 29241ab64890Smrg NULL 29251ab64890Smrg}; 29261ab64890Smrg 29271ab64890Smrgstatic XlcConv 29281ab64890Smrgopen_stdc_cstowcs( 29291ab64890Smrg XLCd from_lcd, 29301ab64890Smrg const char *from_type, 29311ab64890Smrg XLCd to_lcd, 29321ab64890Smrg const char *to_type) 29331ab64890Smrg{ 29341ab64890Smrg return create_conv(from_lcd, &stdc_cstowcs_methods); 29351ab64890Smrg} 29361ab64890Smrg 29371ab64890Smrgstatic XlcConvMethodsRec stdc_strtowcs_methods = { 29381ab64890Smrg close_converter, 29391ab64890Smrg stdc_strtowcs, 29401ab64890Smrg NULL 29411ab64890Smrg}; 29421ab64890Smrg 29431ab64890Smrgstatic XlcConv 29441ab64890Smrgopen_stdc_strtowcs( 29451ab64890Smrg XLCd from_lcd, 29461ab64890Smrg const char *from_type, 29471ab64890Smrg XLCd to_lcd, 29481ab64890Smrg const char *to_type) 29491ab64890Smrg{ 29501ab64890Smrg return create_conv(from_lcd, &stdc_strtowcs_methods); 29511ab64890Smrg} 29521ab64890Smrg 29531ab64890Smrg#endif /* STDCVT */ 29541ab64890Smrg 29551ab64890Smrgstatic XlcConvMethodsRec mbstowcs_methods = { 29561ab64890Smrg close_converter, 29571ab64890Smrg mbstowcs_org, 29581ab64890Smrg NULL 29591ab64890Smrg}; 29601ab64890Smrg 29611ab64890Smrgstatic XlcConv 29621ab64890Smrgopen_mbstowcs( 29631ab64890Smrg XLCd from_lcd, 29641ab64890Smrg const char *from_type, 29651ab64890Smrg XLCd to_lcd, 29661ab64890Smrg const char *to_type) 29671ab64890Smrg{ 29681ab64890Smrg return create_conv(from_lcd, &mbstowcs_methods); 29691ab64890Smrg} 29701ab64890Smrg 29711ab64890Smrgstatic XlcConvMethodsRec wcstombs_methods = { 29721ab64890Smrg close_converter, 29731ab64890Smrg wcstombs_org, 29741ab64890Smrg NULL 29751ab64890Smrg}; 29761ab64890Smrg 29771ab64890Smrgstatic XlcConv 29781ab64890Smrgopen_wcstombs( 29791ab64890Smrg XLCd from_lcd, 29801ab64890Smrg const char *from_type, 29811ab64890Smrg XLCd to_lcd, 29821ab64890Smrg const char *to_type) 29831ab64890Smrg{ 29841ab64890Smrg return create_conv(from_lcd, &wcstombs_methods); 29851ab64890Smrg} 29861ab64890Smrg 29871ab64890Smrgstatic XlcConvMethodsRec wcstocts_methods = { 29881ab64890Smrg close_converter, 29891ab64890Smrg wcstocts, 29901ab64890Smrg NULL 29911ab64890Smrg}; 29921ab64890Smrg 29931ab64890Smrgstatic XlcConv 29941ab64890Smrgopen_wcstocts( 29951ab64890Smrg XLCd from_lcd, 29961ab64890Smrg const char *from_type, 29971ab64890Smrg XLCd to_lcd, 29981ab64890Smrg const char *to_type) 29991ab64890Smrg{ 30001ab64890Smrg return create_conv(from_lcd, &wcstocts_methods); 30011ab64890Smrg} 30021ab64890Smrg 30031ab64890Smrgstatic XlcConvMethodsRec wcstostr_methods = { 30041ab64890Smrg close_converter, 30051ab64890Smrg wcstostr, 30061ab64890Smrg NULL 30071ab64890Smrg}; 30081ab64890Smrg 30091ab64890Smrgstatic XlcConv 30101ab64890Smrgopen_wcstostr( 30111ab64890Smrg XLCd from_lcd, 30121ab64890Smrg const char *from_type, 30131ab64890Smrg XLCd to_lcd, 30141ab64890Smrg const char *to_type) 30151ab64890Smrg{ 30161ab64890Smrg return create_conv(from_lcd, &wcstostr_methods); 30171ab64890Smrg} 30181ab64890Smrg 30191ab64890Smrgstatic XlcConvMethodsRec wcstocs_methods = { 30201ab64890Smrg close_converter, 30211ab64890Smrg wcstocs, 30221ab64890Smrg NULL 30231ab64890Smrg}; 30241ab64890Smrg 30251ab64890Smrgstatic XlcConv 30261ab64890Smrgopen_wcstocs( 30271ab64890Smrg XLCd from_lcd, 30281ab64890Smrg const char *from_type, 30291ab64890Smrg XLCd to_lcd, 30301ab64890Smrg const char *to_type) 30311ab64890Smrg{ 30321ab64890Smrg return create_conv(from_lcd, &wcstocs_methods); 30331ab64890Smrg} 30341ab64890Smrg 30351ab64890Smrgstatic XlcConvMethodsRec wctocs_methods = { 30361ab64890Smrg close_converter, 30371ab64890Smrg wctocs, 30381ab64890Smrg NULL 30391ab64890Smrg}; 30401ab64890Smrg 30411ab64890Smrgstatic XlcConv 30421ab64890Smrgopen_wctocs( 30431ab64890Smrg XLCd from_lcd, 30441ab64890Smrg const char *from_type, 30451ab64890Smrg XLCd to_lcd, 30461ab64890Smrg const char *to_type) 30471ab64890Smrg{ 30481ab64890Smrg return create_conv(from_lcd, &wctocs_methods); 30491ab64890Smrg} 30501ab64890Smrg 30511ab64890Smrgstatic XlcConvMethodsRec ctstowcs_methods = { 30521ab64890Smrg close_converter, 30531ab64890Smrg ctstowcs, 30541ab64890Smrg NULL 30551ab64890Smrg}; 30561ab64890Smrg 30571ab64890Smrgstatic XlcConv 30581ab64890Smrgopen_ctstowcs( 30591ab64890Smrg XLCd from_lcd, 30601ab64890Smrg const char *from_type, 30611ab64890Smrg XLCd to_lcd, 30621ab64890Smrg const char *to_type) 30631ab64890Smrg{ 30641ab64890Smrg return create_conv(from_lcd, &ctstowcs_methods); 30651ab64890Smrg} 30661ab64890Smrg 30671ab64890Smrgstatic XlcConvMethodsRec cstowcs_methods = { 30681ab64890Smrg close_converter, 30691ab64890Smrg cstowcs, 30701ab64890Smrg NULL 30711ab64890Smrg}; 30721ab64890Smrg 30731ab64890Smrgstatic XlcConv 30741ab64890Smrgopen_cstowcs( 30751ab64890Smrg XLCd from_lcd, 30761ab64890Smrg const char *from_type, 30771ab64890Smrg XLCd to_lcd, 30781ab64890Smrg const char *to_type) 30791ab64890Smrg{ 30801ab64890Smrg return create_conv(from_lcd, &cstowcs_methods); 30811ab64890Smrg} 30821ab64890Smrg 30831ab64890Smrgstatic XlcConvMethodsRec strtowcs_methods = { 30841ab64890Smrg close_converter, 30851ab64890Smrg strtowcs, 30861ab64890Smrg NULL 30871ab64890Smrg}; 30881ab64890Smrg 30891ab64890Smrgstatic XlcConv 30901ab64890Smrgopen_strtowcs( 30911ab64890Smrg XLCd from_lcd, 30921ab64890Smrg const char *from_type, 30931ab64890Smrg XLCd to_lcd, 30941ab64890Smrg const char *to_type) 30951ab64890Smrg{ 30961ab64890Smrg return create_conv(from_lcd, &strtowcs_methods); 30971ab64890Smrg} 30981ab64890Smrg 30991ab64890Smrg/* -------------------------------------------------------------------------- */ 31001ab64890Smrg/* Loader */ 31011ab64890Smrg/* -------------------------------------------------------------------------- */ 31021ab64890Smrg 31031ab64890SmrgXLCd 31041ab64890Smrg_XlcGenericLoader( 31051ab64890Smrg const char *name) 31061ab64890Smrg{ 31071ab64890Smrg XLCd lcd; 31081ab64890Smrg#ifdef STDCVT 31091ab64890Smrg XLCdGenericPart *gen; 31101ab64890Smrg#endif 31111ab64890Smrg 31121ab64890Smrg lcd = _XlcCreateLC(name, _XlcGenericMethods); 31131ab64890Smrg 31141ab64890Smrg if (lcd == NULL) 31151ab64890Smrg return lcd; 31161ab64890Smrg 31171ab64890Smrg default_GL_charset = _XlcGetCharSet("ISO8859-1:GL"); 31181ab64890Smrg default_GR_charset = _XlcGetCharSet("ISO8859-1:GR"); 31191ab64890Smrg 31201ab64890Smrg _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCompoundText, open_mbstocts); 31211ab64890Smrg _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNString, open_mbstostr); 31221ab64890Smrg _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs); 31231ab64890Smrg _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbtocs); 31241ab64890Smrg _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNMultiByte, open_ctstombs); 31251ab64890Smrg _XlcSetConverter(lcd, XlcNString, lcd, XlcNMultiByte, open_strtombs); 31261ab64890Smrg _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs); 312761b2299dSmrg 31281ab64890Smrg#ifdef STDCVT 31291ab64890Smrg gen = XLC_GENERIC_PART(lcd); 31301ab64890Smrg 31311ab64890Smrg if (gen->use_stdc_env != True) { 31321ab64890Smrg#endif 31331ab64890Smrg _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_mbstowcs); 31341ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_wcstombs); 31351ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCompoundText, open_wcstocts); 31361ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNString, open_wcstostr); 31371ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs); 31381ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNChar, open_wctocs); 31391ab64890Smrg _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar, open_ctstowcs); 31401ab64890Smrg _XlcSetConverter(lcd, XlcNString, lcd, XlcNWideChar, open_strtowcs); 31411ab64890Smrg _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs); 31421ab64890Smrg#ifdef STDCVT 31431ab64890Smrg } 31441ab64890Smrg#endif 31451ab64890Smrg 31461ab64890Smrg#ifdef STDCVT 31471ab64890Smrg if (gen->use_stdc_env == True) { 31481ab64890Smrg _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_stdc_mbstowcs); 31491ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_stdc_wcstombs); 31501ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCompoundText, open_stdc_wcstocts); 31511ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNString, open_stdc_wcstostr); 31521ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_stdc_wcstocs); 31531ab64890Smrg _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNChar, open_stdc_wctocs); 31541ab64890Smrg _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar, open_stdc_ctstowcs); 31551ab64890Smrg _XlcSetConverter(lcd, XlcNString, lcd, XlcNWideChar, open_stdc_strtowcs); 31561ab64890Smrg _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_stdc_cstowcs); 31571ab64890Smrg } 31581ab64890Smrg#endif 31591ab64890Smrg 31601ab64890Smrg _XlcAddUtf8Converters(lcd); 31611ab64890Smrg 31621ab64890Smrg return lcd; 31631ab64890Smrg} 3164