Commit d714f42ebb08bccac7466c7b0925b1334b88995c

Authored by perry.werneck@gmail.com
1 parent 5c448d47
Exists in master

Criando projeto codeblocks para testar a lib3270 separada da parte GUI facilitan…

…do a identificação de erros de memória e o desenvolvimento paralelo de duas GUIs.
src/lib/Makefile.in
... ... @@ -123,7 +123,11 @@ version.c: ./mkversion.sh
123 123 @chmod +x ./mkversion.sh
124 124 @./mkversion.sh
125 125  
126   -$(OBJDIR)/fallbacks@OBJEXT@: $(BINDIR)/mkfb@EXEEXT@ X3270.xad
  126 +fallbacks.c: $(BINDIR)/mkfb.exe X3270.xad
  127 + @mkdir -p $(TMPDIR)
  128 + @$(BINDIR)/mkfb.exe -c X3270.xad falbacks.c
  129 +
  130 +$(OBJDIR)/fallbacks@OBJEXT@: fallbacks.c
127 131 @echo $@ ...
128 132 @mkdir -p `dirname $@`
129 133 @mkdir -p $(TMPDIR)
... ... @@ -146,6 +150,7 @@ distclean:
146 150  
147 151 clean:
148 152 @rm -f version.c
  153 + @rm -f fallbacks.c
149 154 @rm -fr debian
150 155 @rm -fr .tmp
151 156  
... ...
src/lib/globals.h
... ... @@ -348,5 +348,6 @@ enum state_change
348 348 #endif /*]*/
349 349  
350 350 /* Library internal calls */
  351 +void key_ACharacter(unsigned char c, enum keytype keytype, enum iaction cause,Boolean *skipped);
351 352  
352 353  
... ...
src/lib/glue.c
... ... @@ -186,9 +186,10 @@ void lib3270_session_init(H3270 *hSession, const char *model)
186 186  
187 187 /*
188 188 * Sort out model and color modes, based on the model number resource.
189   - */
190   - if(*appres.model)
  189 + */ /*
  190 + if(appres.model && *appres.model)
191 191 model = appres.model;
  192 + */
192 193  
193 194 if(!*model)
194 195 model = "2"; // No model, use the default one
... ... @@ -1057,6 +1058,13 @@ popup_an_errno(int errn, const char *fmt, ...)
1057 1058 Error(vmsgbuf);
1058 1059 }
1059 1060  
  1061 +#ifdef DEBUG
  1062 +extern void lib3270_initialize(void)
  1063 +{
  1064 + initialize();
  1065 +}
  1066 +#endif
  1067 +
1060 1068 void
1061 1069 action_output(const char *fmt, ...)
1062 1070 {
... ...
src/lib/host.c
... ... @@ -83,6 +83,7 @@
83 83  
84 84 static void try_reconnect(H3270 *session);
85 85  
  86 +/*
86 87 static char * stoken(char **s)
87 88 {
88 89 char *r;
... ... @@ -101,7 +102,7 @@ static char * stoken(char **s)
101 102 *s = ss;
102 103 return r;
103 104 }
104   -
  105 +*/
105 106  
106 107 /*
107 108 * Read the host file
... ... @@ -490,7 +491,7 @@ static int do_connect(H3270 *hSession, const char *n)
490 491 char nb[2048]; /* name buffer */
491 492 char *s; /* temporary */
492 493 const char *chost; /* to whom we will connect */
493   - char *target_name;
  494 +// char *target_name;
494 495 char *ps = CN;
495 496 char *port = CN;
496 497 Boolean resolving;
... ...
src/lib/kybd.c
... ... @@ -103,7 +103,7 @@ static Boolean key_Character(int code, Boolean with_ge, Boolean pasting,
103 103 static Boolean flush_ta(void);
104 104 static void key_AID(unsigned char aid_code);
105 105 static void kybdlock_set(unsigned int bits, const char *cause);
106   -static KeySym MyStringToKeysym(char *s, enum keytype *keytypep);
  106 +// static KeySym MyStringToKeysym(char *s, enum keytype *keytypep);
107 107  
108 108 #if defined(X3270_DBCS) /*[*/
109 109 Boolean key_WCharacter(unsigned char code[], Boolean *skipped);
... ... @@ -1289,9 +1289,7 @@ retry:
1289 1289 /*
1290 1290 * Handle an ordinary character key, given an ASCII code.
1291 1291 */
1292   -void
1293   -key_ACharacter(unsigned char c, enum keytype keytype, enum iaction cause,
1294   - Boolean *skipped)
  1292 +void key_ACharacter(unsigned char c, enum keytype keytype, enum iaction cause,Boolean *skipped)
1295 1293 {
1296 1294 // register int i;
1297 1295 struct akeysym ak;
... ...
src/lib/lib3270.cbp 0 → 100644
... ... @@ -0,0 +1,211 @@
  1 +<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
  2 +<CodeBlocks_project_file>
  3 + <FileVersion major="1" minor="6" />
  4 + <Project>
  5 + <Option title="lib3270" />
  6 + <Option pch_mode="2" />
  7 + <Option compiler="gcc" />
  8 + <Build>
  9 + <Target title="Debug">
  10 + <Option output=".bin\Debug\lib3270" prefix_auto="1" extension_auto="1" />
  11 + <Option object_output=".obj\Debug\" />
  12 + <Option type="1" />
  13 + <Option compiler="gcc" />
  14 + <Compiler>
  15 + <Add option="-g" />
  16 + <Add option="-DDEBUG=1" />
  17 + </Compiler>
  18 + </Target>
  19 + <Target title="Release">
  20 + <Option output=".bin\Release\lib3270" prefix_auto="1" extension_auto="1" />
  21 + <Option object_output=".obj\Release\" />
  22 + <Option type="3" />
  23 + <Option compiler="gcc" />
  24 + <Option createDefFile="1" />
  25 + <Option createStaticLib="1" />
  26 + <Compiler>
  27 + <Add option="-O2" />
  28 + </Compiler>
  29 + <Linker>
  30 + <Add option="-s" />
  31 + </Linker>
  32 + </Target>
  33 + </Build>
  34 + <Compiler>
  35 + <Add option="-Wall" />
  36 + <Add directory="..\include" />
  37 + <Add directory="..\include\lib3270" />
  38 + </Compiler>
  39 + <Unit filename="Makefile.in" />
  40 + <Unit filename="XtGlue.c">
  41 + <Option compilerVar="CC" />
  42 + </Unit>
  43 + <Unit filename="actions.c">
  44 + <Option compilerVar="CC" />
  45 + </Unit>
  46 + <Unit filename="actionsc.h" />
  47 + <Unit filename="ansi.c">
  48 + <Option compilerVar="CC" />
  49 + </Unit>
  50 + <Unit filename="ansic.h" />
  51 + <Unit filename="apl.c">
  52 + <Option compilerVar="CC" />
  53 + </Unit>
  54 + <Unit filename="aplc.h" />
  55 + <Unit filename="appres.h" />
  56 + <Unit filename="arpa_telnet.h" />
  57 + <Unit filename="cg.h" />
  58 + <Unit filename="charset.c">
  59 + <Option compilerVar="CC" />
  60 + </Unit>
  61 + <Unit filename="charsetc.h" />
  62 + <Unit filename="childc.h" />
  63 + <Unit filename="control.in" />
  64 + <Unit filename="ctlr.c">
  65 + <Option compilerVar="CC" />
  66 + </Unit>
  67 + <Unit filename="ctlr.h" />
  68 + <Unit filename="ctlrc.h" />
  69 + <Unit filename="dialogc.h" />
  70 + <Unit filename="falbacks.c">
  71 + <Option compilerVar="CC" />
  72 + </Unit>
  73 + <Unit filename="ft.c">
  74 + <Option compilerVar="CC" />
  75 + </Unit>
  76 + <Unit filename="ft_cut.c">
  77 + <Option compilerVar="CC" />
  78 + </Unit>
  79 + <Unit filename="ft_cut_ds.h" />
  80 + <Unit filename="ft_cutc.h" />
  81 + <Unit filename="ft_dft.c">
  82 + <Option compilerVar="CC" />
  83 + </Unit>
  84 + <Unit filename="ft_dft_ds.h" />
  85 + <Unit filename="ft_dftc.h" />
  86 + <Unit filename="ftc.h" />
  87 + <Unit filename="globals.h" />
  88 + <Unit filename="glue.c">
  89 + <Option compilerVar="CC" />
  90 + </Unit>
  91 + <Unit filename="gluec.h" />
  92 + <Unit filename="host.c">
  93 + <Option compilerVar="CC" />
  94 + </Unit>
  95 + <Unit filename="hostc.h" />
  96 + <Unit filename="icmdc.h" />
  97 + <Unit filename="keypadc.h" />
  98 + <Unit filename="kybd.c">
  99 + <Option compilerVar="CC" />
  100 + </Unit>
  101 + <Unit filename="kybdc.h" />
  102 + <Unit filename="localdefs.h" />
  103 + <Unit filename="log.c">
  104 + <Option compilerVar="CC" />
  105 + </Unit>
  106 + <Unit filename="macros.c">
  107 + <Option compilerVar="CC" />
  108 + </Unit>
  109 + <Unit filename="menubarc.h" />
  110 + <Unit filename="mkversion.sh.in" />
  111 + <Unit filename="objects.h" />
  112 + <Unit filename="paste.c">
  113 + <Option compilerVar="CC" />
  114 + </Unit>
  115 + <Unit filename="popupsc.h" />
  116 + <Unit filename="print.c">
  117 + <Option compilerVar="CC" />
  118 + </Unit>
  119 + <Unit filename="printc.h" />
  120 + <Unit filename="printer.c">
  121 + <Option compilerVar="CC" />
  122 + </Unit>
  123 + <Unit filename="printerc.h" />
  124 + <Unit filename="proxy.c">
  125 + <Option compilerVar="CC" />
  126 + </Unit>
  127 + <Unit filename="proxyc.h" />
  128 + <Unit filename="resolver.c">
  129 + <Option compilerVar="CC" />
  130 + </Unit>
  131 + <Unit filename="resolverc.h" />
  132 + <Unit filename="resources.c">
  133 + <Option compilerVar="CC" />
  134 + </Unit>
  135 + <Unit filename="resources.h" />
  136 + <Unit filename="rpq.c">
  137 + <Option compilerVar="CC" />
  138 + </Unit>
  139 + <Unit filename="savec.h" />
  140 + <Unit filename="screen.c">
  141 + <Option compilerVar="CC" />
  142 + </Unit>
  143 + <Unit filename="screen.h" />
  144 + <Unit filename="screenc.h" />
  145 + <Unit filename="scrollc.h" />
  146 + <Unit filename="see.c">
  147 + <Option compilerVar="CC" />
  148 + </Unit>
  149 + <Unit filename="seec.h" />
  150 + <Unit filename="selectc.h" />
  151 + <Unit filename="session.h" />
  152 + <Unit filename="sf.c">
  153 + <Option compilerVar="CC" />
  154 + </Unit>
  155 + <Unit filename="sfc.h" />
  156 + <Unit filename="shlobj_missing.h" />
  157 + <Unit filename="statusc.h" />
  158 + <Unit filename="tables.c">
  159 + <Option compilerVar="CC" />
  160 + </Unit>
  161 + <Unit filename="tablesc.h" />
  162 + <Unit filename="telnet.c">
  163 + <Option compilerVar="CC" />
  164 + </Unit>
  165 + <Unit filename="telnetc.h" />
  166 + <Unit filename="tesprogram.c">
  167 + <Option compilerVar="CC" />
  168 + <Option target="Debug" />
  169 + </Unit>
  170 + <Unit filename="tn3270e.h" />
  171 + <Unit filename="toggles.c">
  172 + <Option compilerVar="CC" />
  173 + </Unit>
  174 + <Unit filename="togglesc.h" />
  175 + <Unit filename="trace_ds.c">
  176 + <Option compilerVar="CC" />
  177 + </Unit>
  178 + <Unit filename="trace_dsc.h" />
  179 + <Unit filename="utf8.c">
  180 + <Option compilerVar="CC" />
  181 + </Unit>
  182 + <Unit filename="utf8c.h" />
  183 + <Unit filename="util.c">
  184 + <Option compilerVar="CC" />
  185 + </Unit>
  186 + <Unit filename="utilc.h" />
  187 + <Unit filename="version.c">
  188 + <Option compilerVar="CC" />
  189 + </Unit>
  190 + <Unit filename="w3misc.c">
  191 + <Option compilerVar="CC" />
  192 + </Unit>
  193 + <Unit filename="w3miscc.h" />
  194 + <Unit filename="widec.h" />
  195 + <Unit filename="winvers.c">
  196 + <Option compilerVar="CC" />
  197 + </Unit>
  198 + <Unit filename="winversc.h" />
  199 + <Unit filename="xio.c">
  200 + <Option compilerVar="CC" />
  201 + </Unit>
  202 + <Unit filename="xioc.h" />
  203 + <Unit filename="xl.h" />
  204 + <Extensions>
  205 + <code_completion />
  206 + <envvars />
  207 + <debugger />
  208 + <lib_finder disable_auto="1" />
  209 + </Extensions>
  210 + </Project>
  211 +</CodeBlocks_project_file>
... ...
src/lib/macros.c
... ... @@ -59,12 +59,14 @@
59 59 return macro_list;
60 60 }
61 61  
  62 +/*
62 63 static char * value_as_string(int val)
63 64 {
64 65 char buffer[10];
65 66 snprintf(buffer,9,"%d",val);
66 67 return strdup(buffer);
67 68 }
  69 +*/
68 70  
69 71 static const char * get_state(H3270 *h)
70 72 {
... ... @@ -313,6 +315,6 @@
313 315  
314 316 LIB3270_MACRO( disconnect )
315 317 {
316   - host_disconnect(hSession,0);
  318 + lib3270_disconnect(hSession);
317 319 return strdup("0");
318 320 }
... ...
src/lib/proxy.c
... ... @@ -707,7 +707,7 @@ proxy_socks5(int fd, char *host, unsigned short port, int force_d)
707 707 trace_dsn("SOCKS5 Proxy: xmit version 5 nmethods 1 (no auth)\n");
708 708 trace_netdata('>', rbuf, 3);
709 709 #endif /*]*/
710   - if (send(fd, rbuf, 3, 0) < 0) {
  710 + if (send(fd, (const char *) rbuf, 3, 0) < 0) {
711 711 popup_a_sockerr("SOCKS5 Proxy: send error");
712 712 return -1;
713 713 }
... ... @@ -734,7 +734,7 @@ proxy_socks5(int fd, char *host, unsigned short port, int force_d)
734 734 return -1;
735 735 }
736 736  
737   - nr = recv(fd, &rbuf[nread], 1, 0);
  737 + nr = recv(fd, (char *) &rbuf[nread], 1, 0);
738 738 if (nr < 0) {
739 739 popup_a_sockerr("SOCKS5 Proxy: receive error");
740 740 #if defined(X3270_TRACE) /*[*/
... ... @@ -839,7 +839,7 @@ proxy_socks5(int fd, char *host, unsigned short port, int force_d)
839 839 return -1;
840 840 }
841 841  
842   - nr = recv(fd, &r, 1, 0);
  842 + nr = recv(fd, (char *) &r, 1, 0);
843 843 if (nr < 0) {
844 844 popup_a_sockerr("SOCKS5 Proxy: receive error");
845 845 #if defined(X3270_TRACE) /*[*/
... ...
src/lib/tesprogram.c
1 1  
  2 +#include <stdio.h>
2 3 #include <lib3270.h>
3 4  
4 5 int main(int numpar, char *param[])
5 6 {
6 7 H3270 *h;
7 8  
  9 + lib3270_initialize();
  10 +
8 11 h = lib3270_session_new("");
  12 + printf("3270 session %p created\n",h);
9 13  
10 14  
11 15  
12 16  
  17 + printf("Ending 3270 session %p\n",h);
13 18 lib3270_session_free(h);
14 19  
15 20 return 0;
... ...
src/lib/wide.c
... ... @@ -1,530 +0,0 @@
1   -/*
2   - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
3   - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
4   - * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob o nome G3270.
5   - *
6   - * Copyright (C) <2008> <Banco do Brasil S.A.>
7   - *
8   - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
9   - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
10   - * Free Software Foundation.
11   - *
12   - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
13   - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
14   - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
15   - * obter mais detalhes.
16   - *
17   - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
18   - * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple
19   - * Place, Suite 330, Boston, MA, 02111-1307, USA
20   - *
21   - * Este programa está nomeado como wide.c e possui 530 linhas de código.
22   - *
23   - * Contatos:
24   - *
25   - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
26   - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
27   - * licinio@bb.com.br (Licínio Luis Branco)
28   - * kraucer@bb.com.br (Kraucer Fernandes Mazuco)
29   - * macmiranda@bb.com.br (Marco Aurélio Caldas Miranda)
30   - *
31   - */
32   -
33   -/*
34   - * wide.c
35   - * A 3270 Terminal Emulator for X11
36   - * Wide character translation functions.
37   - */
38   -
39   -#include "globals.h"
40   -#include <errno.h>
41   -#include <locale.h>
42   -#include <langinfo.h>
43   -
44   -#include "3270ds.h"
45   -#if !defined(PR3287) /*[*/
46   -#include "appres.h"
47   -#endif /*]*/
48   -
49   -#include "popupsc.h"
50   -#include "tablesc.h"
51   -#include "trace_dsc.h"
52   -#if !defined(PR3287) /*[*/
53   -#include "utilc.h"
54   -#endif /*]*/
55   -
56   -#include "widec.h"
57   -
58   -#define ICU_DATA "ICU_DATA"
59   -
60   -char *local_encoding = CN;
61   -
62   -static UConverter *dbcs_converter = NULL;
63   -static char *dbcs_converter_name = CN;
64   -static UConverter *sbcs_converter = NULL;
65   -static char *sbcs_converter_name = CN;
66   -static UConverter *local_converter = NULL;
67   -#if defined(X3270_DISPLAY) /*[*/
68   -static UConverter *wdisplay_converter = NULL;
69   -#endif /*]*/
70   -static Boolean same_converter = False;
71   -
72   -/* Initialize, or reinitialize the EBCDIC DBCS converters. */
73   -int
74   -wide_init(char *converter_names, char *local_name)
75   -{
76   - UErrorCode err = U_ZERO_ERROR;
77   - char *cur_path = CN;
78   - Boolean lib_ok = False;
79   - Boolean dot_ok = False;
80   - char *cn_copy, *buf, *token;
81   - char *sbcs_converters = NULL;
82   - char *dbcs_converters = NULL;
83   - int n_converter_sets = 0;
84   - int n_sbcs_converters = 0;
85   - int n_dbcs_converters = 0;
86   -
87   - /* This may be a reinit. */
88   - if (local_converter != NULL) {
89   - ucnv_close(local_converter);
90   - local_converter = NULL;
91   - }
92   - Replace(local_encoding, CN);
93   - if (sbcs_converter != NULL) {
94   - ucnv_close(sbcs_converter);
95   - sbcs_converter = NULL;
96   - }
97   - Replace(sbcs_converter_name, CN);
98   - if (dbcs_converter != NULL) {
99   - ucnv_close(dbcs_converter);
100   - dbcs_converter = NULL;
101   - }
102   - Replace(dbcs_converter_name, CN);
103   -#if defined(X3270_DISPLAY) /*[*/
104   - if (wdisplay_converter != NULL) {
105   - ucnv_close(wdisplay_converter);
106   - wdisplay_converter = NULL;
107   - }
108   -#endif /*]*/
109   - same_converter = False;
110   -
111   - /* Make sure that $ICU_DATA has LIBX3270DIR and . in it. */
112   - cur_path = getenv(ICU_DATA);
113   - if (cur_path != CN) {
114   - char *t = NewString(cur_path);
115   - char *token;
116   - char *buf = t;
117   -
118   - while (!(lib_ok && dot_ok) &&
119   - (token = strtok(buf, ":")) != CN) {
120   - buf = CN;
121   - if (!strcmp(token, LIBX3270DIR)) {
122   - lib_ok = True;
123   - } else if (!strcmp(token, ".")) {
124   - dot_ok = True;
125   - }
126   - }
127   - Free(t);
128   - }
129   - if (!lib_ok || !dot_ok) {
130   - char *s, *new_path;
131   -
132   - s = new_path = Malloc(strlen(ICU_DATA) +
133   - (cur_path? strlen(cur_path): 0) +
134   - strlen(LIBX3270DIR) + 5 /* ICU_DATA=*:*:.\n */);
135   -
136   - s += sprintf(s, "%s=", ICU_DATA);
137   - if (cur_path != CN)
138   - s += sprintf(s, "%s", cur_path);
139   - if (!lib_ok) {
140   - if (s[-1] != '=' && s[-1] != ':')
141   - *s++ = ':';
142   - s += sprintf(s, "%s", LIBX3270DIR);
143   - }
144   - if (!dot_ok) {
145   - if (s[-1] != '=' && s[-1] != ':')
146   - *s++ = ':';
147   - *s++ = '.';
148   - }
149   - *s = '\0';
150   - if (putenv(new_path) < 0) {
151   - popup_an_errno(errno, "putenv for " ICU_DATA " failed");
152   - return -1;
153   - }
154   - }
155   -
156   - /* Decode local converter name. */
157   - if (local_name == CN) {
158   - (void) setlocale(LC_CTYPE, "");
159   - local_name = nl_langinfo(CODESET);
160   - }
161   - if (local_name != CN) {
162   - err = U_ZERO_ERROR;
163   - local_converter = ucnv_open(local_name, &err);
164   - if (local_converter == NULL) {
165   - popup_an_error("Cannot find ICU converter for "
166   - "local encoding:\n%s",
167   - local_name);
168   - }
169   - Replace(local_encoding, NewString(local_name));
170   - }
171   -
172   - /* Decode host and display converter names. */
173   - if (converter_names == CN)
174   - return 0;
175   -
176   - /*
177   - * Split into SBCS and DBCS converters, separated by '+'. If only one
178   - * converter is specified, it's the DBCS converter.
179   - */
180   - n_converter_sets = 0;
181   - buf = cn_copy = NewString(converter_names);
182   - while ((token = strtok(buf, "+")) != CN) {
183   - buf = CN;
184   - switch (n_converter_sets) {
185   - case 0: /* DBCS or SBCS */
186   - dbcs_converters = token;
187   - break;
188   - case 1: /* DBCS */
189   - sbcs_converters = dbcs_converters;
190   - dbcs_converters = token;
191   - break;
192   - default: /* extra */
193   - popup_an_error("Extra converter set '%s' ignored", token);
194   - break;
195   - }
196   - n_converter_sets++;
197   - }
198   -
199   - if (sbcs_converters != NULL) {
200   - n_sbcs_converters = 0;
201   - buf = sbcs_converters;
202   - while ((token = strtok(buf, ",")) != CN) {
203   - buf = CN;
204   - switch (n_sbcs_converters) {
205   - case 0: /* EBCDIC */
206   - err = U_ZERO_ERROR;
207   - sbcs_converter = ucnv_open(token, &err);
208   - if (sbcs_converter == NULL) {
209   - popup_an_error("Cannot find ICU converter "
210   - "for host SBCS:\n%s", token);
211   - Free(cn_copy);
212   - return -1;
213   - }
214   - Replace(sbcs_converter_name, NewString(token));
215   - break;
216   - default: /* extra */
217   - popup_an_error("Extra converter name '%s' ignored",
218   - token);
219   - break;
220   - }
221   - n_sbcs_converters++;
222   - }
223   - }
224   -
225   - if (dbcs_converters != NULL) {
226   - n_dbcs_converters = 0;
227   - buf = dbcs_converters;
228   - while ((token = strtok(buf, ",")) != CN) {
229   - buf = CN;
230   - switch (n_dbcs_converters) {
231   - case 0: /* EBCDIC */
232   - err = U_ZERO_ERROR;
233   - dbcs_converter = ucnv_open(token, &err);
234   - if (dbcs_converter == NULL) {
235   - popup_an_error("Cannot find ICU converter "
236   - "for host DBCS:\n%s", token);
237   - Free(cn_copy);
238   - return -1;
239   - }
240   - Replace(dbcs_converter_name, NewString(token));
241   - break;
242   - case 1: /* display */
243   -#if defined(X3270_DISPLAY) /*[*/
244   - err = U_ZERO_ERROR;
245   - wdisplay_converter = ucnv_open(token, &err);
246   - if (wdisplay_converter == NULL) {
247   - popup_an_error("Cannot find ICU converter "
248   - "for display DBCS:\n%s", token);
249   - Free(cn_copy);
250   - return -1;
251   - }
252   -#endif /*]*/
253   - break;
254   - default: /* extra */
255   - popup_an_error("Extra converter name '%s' ignored",
256   - token);
257   - break;
258   - }
259   - n_dbcs_converters++;
260   - }
261   - }
262   -
263   - Free(cn_copy);
264   -
265   - if (n_dbcs_converters < 2) {
266   - popup_an_error("Missing DBCS converter value");
267   - return -1;
268   - }
269   - if (dbcs_converter_name != CN &&
270   - sbcs_converter_name != CN &&
271   - !strcmp(dbcs_converter_name, sbcs_converter_name)) {
272   - same_converter = True;
273   - }
274   -
275   - return 0;
276   -}
277   -
278   -static void
279   -xlate1(unsigned char from0, unsigned char from1, unsigned char to_buf[],
280   - UConverter *from_cnv, const char *from_name,
281   - UConverter *to_cnv, const char *to_name)
282   -{
283   - UErrorCode err = U_ZERO_ERROR;
284   - UChar Ubuf[2];
285   - char from_buf[4];
286   - int from_len;
287   - char tmp_to_buf[3];
288   - int32_t len;
289   -#if defined(WIDE_DEBUG) /*[*/
290   - int i;
291   -#endif /*]*/
292   -
293   - /* Do something reasonable in case of failure. */
294   - to_buf[0] = to_buf[1] = 0;
295   -
296   - /* Convert string from source to Unicode. */
297   - if (same_converter) {
298   - from_buf[0] = EBC_so;
299   - from_buf[1] = from0;
300   - from_buf[2] = from1;
301   - from_buf[3] = EBC_si;
302   - from_len = 4;
303   - } else {
304   - from_buf[0] = from0;
305   - from_buf[1] = from1;
306   - from_len = 2;
307   - }
308   - len = ucnv_toUChars(from_cnv, Ubuf, 2, from_buf, from_len, &err);
309   - if (err != U_ZERO_ERROR) {
310   - trace_ds("[%s toUnicode of DBCS X'%02x%02x' failed, ICU "
311   - "error %d]\n", from_name, from0, from1, (int)err);
312   - return;
313   - }
314   - if (Ubuf[0] == 0xfffd) {
315   - /* No translation. */
316   - trace_ds("[%s toUnicode of DBCS X'%02x%02x' failed]\n",
317   - from_name, from0, from1);
318   - return;
319   - }
320   -#if defined(WIDE_DEBUG) /*[*/
321   - printf("Got Unicode %x\n", Ubuf[0]);
322   -#endif /*]*/
323   -
324   - if (to_cnv != NULL) {
325   - /* Convert string from Unicode to Destination. */
326   - len = ucnv_fromUChars(to_cnv, tmp_to_buf, 3, Ubuf, len, &err);
327   - if (err != U_ZERO_ERROR) {
328   - trace_ds("[fromUnicode of U+%04x to %s failed, ICU "
329   - "error %d]\n", Ubuf[0], to_name, (int)err);
330   - return;
331   - }
332   - to_buf[0] = tmp_to_buf[0];
333   - to_buf[1] = tmp_to_buf[1];
334   -#if defined(WIDE_DEBUG) /*[*/
335   - printf("Got %u %s characters:", len, to_name);
336   - for (i = 0; i < len; i++) {
337   - printf(" %02x", to_buf[i]);
338   - }
339   - printf("\n");
340   -#endif /*]*/
341   - } else {
342   - to_buf[0] = (Ubuf[0] >> 8) & 0xff;
343   - to_buf[1] = Ubuf[0] & 0xff;
344   - }
345   -}
346   -
347   -#if defined(X3270_DISPLAY) /*[*/
348   -/* Translate a DBCS EBCDIC character to a display character. */
349   -void
350   -dbcs_to_display(unsigned char ebc1, unsigned char ebc2, unsigned char c[])
351   -{
352   - xlate1(ebc1, ebc2, c, dbcs_converter, "host DBCS", wdisplay_converter,
353   - "wide display");
354   -}
355   -#endif /*]*/
356   -
357   -/* Translate a DBCS EBCDIC character to a 2-byte Unicode character. */
358   -void
359   -dbcs_to_unicode16(unsigned char ebc1, unsigned char ebc2, unsigned char c[])
360   -{
361   - xlate1(ebc1, ebc2, c, dbcs_converter, "host DBCS", NULL, NULL);
362   -}
363   -
364   -/*
365   - * Translate a DBCS EBCDIC character to a local multi-byte character.
366   - * Returns -1 for error, or the mb length. NULL terminates.
367   - */
368   -int
369   -dbcs_to_mb(unsigned char ebc1, unsigned char ebc2, char *mb)
370   -{
371   - UErrorCode err = U_ZERO_ERROR;
372   - unsigned char w[2];
373   - UChar Ubuf;
374   - int len;
375   -
376   - if (local_converter == NULL) {
377   - *mb = '?';
378   - *(mb + 1) = '\0';
379   - return 1;
380   - }
381   -
382   - /* Translate to Unicode first. */
383   - dbcs_to_unicode16(ebc1, ebc2, w);
384   - Ubuf = (w[0] << 8) | w[1];
385   -
386   - /* Then translate to the local encoding. */
387   - len = ucnv_fromUChars(local_converter, mb, 16, &Ubuf, 1, &err);
388   - if (err != U_ZERO_ERROR) {
389   - trace_ds("[fromUnicode of U+%04x to local failed, ICU "
390   - "error %d]\n", Ubuf, (int)err);
391   - return -1;
392   - }
393   - return len;
394   -}
395   -
396   -/*
397   - * Translate an SBCS EBCDIC character to a local multi-byte character.
398   - * Returns -1 for error, or the mb length. NULL terminates.
399   - */
400   -int
401   -sbcs_to_mb(unsigned char ebc, char *mb)
402   -{
403   - UErrorCode err = U_ZERO_ERROR;
404   - UChar Ubuf;
405   - int len;
406   -
407   - if (sbcs_converter == NULL) {
408   - /* No SBCS converter, do EBCDIC to latin-1. */
409   - if (local_converter == NULL) {
410   - /* No local converter either, latin-1 is it. */
411   - *mb = ebc2asc[ebc];
412   - *(mb + 1) = '\0';
413   - return 1;
414   - }
415   -
416   - /* Have a local converter; use it below. */
417   - Ubuf = ebc2asc[ebc];
418   - } else {
419   - /* Have an SBCS converter. Convert from SBCS to Unicode. */
420   - err = U_ZERO_ERROR;
421   - len = ucnv_toUChars(sbcs_converter, &Ubuf, 1, (char *)&ebc, 1,
422   - &err);
423   - if (err != U_ZERO_ERROR &&
424   - err != U_STRING_NOT_TERMINATED_WARNING) {
425   - trace_ds("[toUChars failed, ICU error %d]\n",
426   - (int)err);
427   - return -1;
428   - }
429   - }
430   -
431   - /* Convert from Unicode to the local encoding. */
432   - len = ucnv_fromUChars(local_converter, mb, 16, &Ubuf, 1, &err);
433   - if (err != U_ZERO_ERROR) {
434   - trace_ds("[fromUnicode of U+%04x to local failed, ICU "
435   - "error %d]\n", Ubuf, (int)err);
436   - return -1;
437   - }
438   - return len;
439   -}
440   -
441   -/*
442   - * Translate a local multi-byte string to Unicode characters.
443   - * Returns -1 for error, or the length. NULL terminates.
444   - */
445   -int
446   -mb_to_unicode(char *mb, int mblen, UChar *u, int ulen, UErrorCode *err)
447   -{
448   - UErrorCode local_err;
449   - int len;
450   - Boolean print_errs = False;
451   -
452   - if (local_converter == NULL) {
453   - int i;
454   -
455   - for (i = 0; i < mblen; i++) {
456   - u[i] = mb[i] & 0xff;
457   - }
458   - return mblen;
459   - }
460   - if (err == NULL) {
461   - err = &local_err;
462   - print_errs = True;
463   - }
464   - *err = U_ZERO_ERROR;
465   - len = ucnv_toUChars(local_converter, u, ulen, mb, mblen, err);
466   - if (*err != U_ZERO_ERROR && *err != U_STRING_NOT_TERMINATED_WARNING) {
467   - if (print_errs)
468   - trace_ds("[toUChars failed, ICU error %d]\n",
469   - (int)*err);
470   - return -1;
471   - }
472   - return len;
473   -}
474   -
475   -/*
476   - * Try to map a Unicode character to the Host SBCS character set.
477   - * Returns ASCII in cp[0].
478   - */
479   -int
480   -dbcs_map8(UChar u, unsigned char *cp)
481   -{
482   - UErrorCode err = U_ZERO_ERROR;
483   - int len;
484   -
485   - if (!(u & ~0xff)) {
486   - *cp = u;
487   - return 1;
488   - }
489   - if (sbcs_converter != NULL) {
490   - len = ucnv_fromUChars(sbcs_converter, (char *)cp, 1, &u, 1,
491   - &err);
492   - if ((err != U_ZERO_ERROR &&
493   - err != U_STRING_NOT_TERMINATED_WARNING) ||
494   - (*cp == '?' && u != '?')) {
495   - *cp = ebc2asc[*cp];
496   - return 0;
497   - } else
498   - return 1;
499   - }
500   - return 0;
501   -}
502   -
503   -/*
504   - * Try to map a Unicode character to the Host DBCS character set.
505   - * Returns EBCDIC in cp[].
506   - */
507   -int
508   -dbcs_map16(UChar u, unsigned char *cp)
509   -{
510   - UErrorCode err = U_ZERO_ERROR;
511   - int len;
512   -
513   - if (same_converter) {
514   - char tmp_cp[5];
515   -
516   - len = ucnv_fromUChars(dbcs_converter, tmp_cp, 5, &u, 1, &err);
517   - if (err != U_ZERO_ERROR ||
518   - len < 3 ||
519   - tmp_cp[0] != EBC_so)
520   - return 0;
521   - cp[0] = tmp_cp[1];
522   - cp[1] = tmp_cp[2];
523   - return 1;
524   - } else {
525   - len = ucnv_fromUChars(dbcs_converter, (char *)cp, 2, &u, 1,
526   - &err);
527   - return (err == U_ZERO_ERROR ||
528   - err == U_STRING_NOT_TERMINATED_WARNING);
529   - }
530   -}
src/lib/wide.c.unused 0 → 100644
... ... @@ -0,0 +1,530 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple
  19 + * Place, Suite 330, Boston, MA, 02111-1307, USA
  20 + *
  21 + * Este programa está nomeado como wide.c e possui 530 linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + * licinio@bb.com.br (Licínio Luis Branco)
  28 + * kraucer@bb.com.br (Kraucer Fernandes Mazuco)
  29 + * macmiranda@bb.com.br (Marco Aurélio Caldas Miranda)
  30 + *
  31 + */
  32 +
  33 +/*
  34 + * wide.c
  35 + * A 3270 Terminal Emulator for X11
  36 + * Wide character translation functions.
  37 + */
  38 +
  39 +#include "globals.h"
  40 +#include <errno.h>
  41 +#include <locale.h>
  42 +#include <langinfo.h>
  43 +
  44 +#include "3270ds.h"
  45 +#if !defined(PR3287) /*[*/
  46 +#include "appres.h"
  47 +#endif /*]*/
  48 +
  49 +#include "popupsc.h"
  50 +#include "tablesc.h"
  51 +#include "trace_dsc.h"
  52 +#if !defined(PR3287) /*[*/
  53 +#include "utilc.h"
  54 +#endif /*]*/
  55 +
  56 +#include "widec.h"
  57 +
  58 +#define ICU_DATA "ICU_DATA"
  59 +
  60 +char *local_encoding = CN;
  61 +
  62 +static UConverter *dbcs_converter = NULL;
  63 +static char *dbcs_converter_name = CN;
  64 +static UConverter *sbcs_converter = NULL;
  65 +static char *sbcs_converter_name = CN;
  66 +static UConverter *local_converter = NULL;
  67 +#if defined(X3270_DISPLAY) /*[*/
  68 +static UConverter *wdisplay_converter = NULL;
  69 +#endif /*]*/
  70 +static Boolean same_converter = False;
  71 +
  72 +/* Initialize, or reinitialize the EBCDIC DBCS converters. */
  73 +int
  74 +wide_init(char *converter_names, char *local_name)
  75 +{
  76 + UErrorCode err = U_ZERO_ERROR;
  77 + char *cur_path = CN;
  78 + Boolean lib_ok = False;
  79 + Boolean dot_ok = False;
  80 + char *cn_copy, *buf, *token;
  81 + char *sbcs_converters = NULL;
  82 + char *dbcs_converters = NULL;
  83 + int n_converter_sets = 0;
  84 + int n_sbcs_converters = 0;
  85 + int n_dbcs_converters = 0;
  86 +
  87 + /* This may be a reinit. */
  88 + if (local_converter != NULL) {
  89 + ucnv_close(local_converter);
  90 + local_converter = NULL;
  91 + }
  92 + Replace(local_encoding, CN);
  93 + if (sbcs_converter != NULL) {
  94 + ucnv_close(sbcs_converter);
  95 + sbcs_converter = NULL;
  96 + }
  97 + Replace(sbcs_converter_name, CN);
  98 + if (dbcs_converter != NULL) {
  99 + ucnv_close(dbcs_converter);
  100 + dbcs_converter = NULL;
  101 + }
  102 + Replace(dbcs_converter_name, CN);
  103 +#if defined(X3270_DISPLAY) /*[*/
  104 + if (wdisplay_converter != NULL) {
  105 + ucnv_close(wdisplay_converter);
  106 + wdisplay_converter = NULL;
  107 + }
  108 +#endif /*]*/
  109 + same_converter = False;
  110 +
  111 + /* Make sure that $ICU_DATA has LIBX3270DIR and . in it. */
  112 + cur_path = getenv(ICU_DATA);
  113 + if (cur_path != CN) {
  114 + char *t = NewString(cur_path);
  115 + char *token;
  116 + char *buf = t;
  117 +
  118 + while (!(lib_ok && dot_ok) &&
  119 + (token = strtok(buf, ":")) != CN) {
  120 + buf = CN;
  121 + if (!strcmp(token, LIBX3270DIR)) {
  122 + lib_ok = True;
  123 + } else if (!strcmp(token, ".")) {
  124 + dot_ok = True;
  125 + }
  126 + }
  127 + Free(t);
  128 + }
  129 + if (!lib_ok || !dot_ok) {
  130 + char *s, *new_path;
  131 +
  132 + s = new_path = Malloc(strlen(ICU_DATA) +
  133 + (cur_path? strlen(cur_path): 0) +
  134 + strlen(LIBX3270DIR) + 5 /* ICU_DATA=*:*:.\n */);
  135 +
  136 + s += sprintf(s, "%s=", ICU_DATA);
  137 + if (cur_path != CN)
  138 + s += sprintf(s, "%s", cur_path);
  139 + if (!lib_ok) {
  140 + if (s[-1] != '=' && s[-1] != ':')
  141 + *s++ = ':';
  142 + s += sprintf(s, "%s", LIBX3270DIR);
  143 + }
  144 + if (!dot_ok) {
  145 + if (s[-1] != '=' && s[-1] != ':')
  146 + *s++ = ':';
  147 + *s++ = '.';
  148 + }
  149 + *s = '\0';
  150 + if (putenv(new_path) < 0) {
  151 + popup_an_errno(errno, "putenv for " ICU_DATA " failed");
  152 + return -1;
  153 + }
  154 + }
  155 +
  156 + /* Decode local converter name. */
  157 + if (local_name == CN) {
  158 + (void) setlocale(LC_CTYPE, "");
  159 + local_name = nl_langinfo(CODESET);
  160 + }
  161 + if (local_name != CN) {
  162 + err = U_ZERO_ERROR;
  163 + local_converter = ucnv_open(local_name, &err);
  164 + if (local_converter == NULL) {
  165 + popup_an_error("Cannot find ICU converter for "
  166 + "local encoding:\n%s",
  167 + local_name);
  168 + }
  169 + Replace(local_encoding, NewString(local_name));
  170 + }
  171 +
  172 + /* Decode host and display converter names. */
  173 + if (converter_names == CN)
  174 + return 0;
  175 +
  176 + /*
  177 + * Split into SBCS and DBCS converters, separated by '+'. If only one
  178 + * converter is specified, it's the DBCS converter.
  179 + */
  180 + n_converter_sets = 0;
  181 + buf = cn_copy = NewString(converter_names);
  182 + while ((token = strtok(buf, "+")) != CN) {
  183 + buf = CN;
  184 + switch (n_converter_sets) {
  185 + case 0: /* DBCS or SBCS */
  186 + dbcs_converters = token;
  187 + break;
  188 + case 1: /* DBCS */
  189 + sbcs_converters = dbcs_converters;
  190 + dbcs_converters = token;
  191 + break;
  192 + default: /* extra */
  193 + popup_an_error("Extra converter set '%s' ignored", token);
  194 + break;
  195 + }
  196 + n_converter_sets++;
  197 + }
  198 +
  199 + if (sbcs_converters != NULL) {
  200 + n_sbcs_converters = 0;
  201 + buf = sbcs_converters;
  202 + while ((token = strtok(buf, ",")) != CN) {
  203 + buf = CN;
  204 + switch (n_sbcs_converters) {
  205 + case 0: /* EBCDIC */
  206 + err = U_ZERO_ERROR;
  207 + sbcs_converter = ucnv_open(token, &err);
  208 + if (sbcs_converter == NULL) {
  209 + popup_an_error("Cannot find ICU converter "
  210 + "for host SBCS:\n%s", token);
  211 + Free(cn_copy);
  212 + return -1;
  213 + }
  214 + Replace(sbcs_converter_name, NewString(token));
  215 + break;
  216 + default: /* extra */
  217 + popup_an_error("Extra converter name '%s' ignored",
  218 + token);
  219 + break;
  220 + }
  221 + n_sbcs_converters++;
  222 + }
  223 + }
  224 +
  225 + if (dbcs_converters != NULL) {
  226 + n_dbcs_converters = 0;
  227 + buf = dbcs_converters;
  228 + while ((token = strtok(buf, ",")) != CN) {
  229 + buf = CN;
  230 + switch (n_dbcs_converters) {
  231 + case 0: /* EBCDIC */
  232 + err = U_ZERO_ERROR;
  233 + dbcs_converter = ucnv_open(token, &err);
  234 + if (dbcs_converter == NULL) {
  235 + popup_an_error("Cannot find ICU converter "
  236 + "for host DBCS:\n%s", token);
  237 + Free(cn_copy);
  238 + return -1;
  239 + }
  240 + Replace(dbcs_converter_name, NewString(token));
  241 + break;
  242 + case 1: /* display */
  243 +#if defined(X3270_DISPLAY) /*[*/
  244 + err = U_ZERO_ERROR;
  245 + wdisplay_converter = ucnv_open(token, &err);
  246 + if (wdisplay_converter == NULL) {
  247 + popup_an_error("Cannot find ICU converter "
  248 + "for display DBCS:\n%s", token);
  249 + Free(cn_copy);
  250 + return -1;
  251 + }
  252 +#endif /*]*/
  253 + break;
  254 + default: /* extra */
  255 + popup_an_error("Extra converter name '%s' ignored",
  256 + token);
  257 + break;
  258 + }
  259 + n_dbcs_converters++;
  260 + }
  261 + }
  262 +
  263 + Free(cn_copy);
  264 +
  265 + if (n_dbcs_converters < 2) {
  266 + popup_an_error("Missing DBCS converter value");
  267 + return -1;
  268 + }
  269 + if (dbcs_converter_name != CN &&
  270 + sbcs_converter_name != CN &&
  271 + !strcmp(dbcs_converter_name, sbcs_converter_name)) {
  272 + same_converter = True;
  273 + }
  274 +
  275 + return 0;
  276 +}
  277 +
  278 +static void
  279 +xlate1(unsigned char from0, unsigned char from1, unsigned char to_buf[],
  280 + UConverter *from_cnv, const char *from_name,
  281 + UConverter *to_cnv, const char *to_name)
  282 +{
  283 + UErrorCode err = U_ZERO_ERROR;
  284 + UChar Ubuf[2];
  285 + char from_buf[4];
  286 + int from_len;
  287 + char tmp_to_buf[3];
  288 + int32_t len;
  289 +#if defined(WIDE_DEBUG) /*[*/
  290 + int i;
  291 +#endif /*]*/
  292 +
  293 + /* Do something reasonable in case of failure. */
  294 + to_buf[0] = to_buf[1] = 0;
  295 +
  296 + /* Convert string from source to Unicode. */
  297 + if (same_converter) {
  298 + from_buf[0] = EBC_so;
  299 + from_buf[1] = from0;
  300 + from_buf[2] = from1;
  301 + from_buf[3] = EBC_si;
  302 + from_len = 4;
  303 + } else {
  304 + from_buf[0] = from0;
  305 + from_buf[1] = from1;
  306 + from_len = 2;
  307 + }
  308 + len = ucnv_toUChars(from_cnv, Ubuf, 2, from_buf, from_len, &err);
  309 + if (err != U_ZERO_ERROR) {
  310 + trace_ds("[%s toUnicode of DBCS X'%02x%02x' failed, ICU "
  311 + "error %d]\n", from_name, from0, from1, (int)err);
  312 + return;
  313 + }
  314 + if (Ubuf[0] == 0xfffd) {
  315 + /* No translation. */
  316 + trace_ds("[%s toUnicode of DBCS X'%02x%02x' failed]\n",
  317 + from_name, from0, from1);
  318 + return;
  319 + }
  320 +#if defined(WIDE_DEBUG) /*[*/
  321 + printf("Got Unicode %x\n", Ubuf[0]);
  322 +#endif /*]*/
  323 +
  324 + if (to_cnv != NULL) {
  325 + /* Convert string from Unicode to Destination. */
  326 + len = ucnv_fromUChars(to_cnv, tmp_to_buf, 3, Ubuf, len, &err);
  327 + if (err != U_ZERO_ERROR) {
  328 + trace_ds("[fromUnicode of U+%04x to %s failed, ICU "
  329 + "error %d]\n", Ubuf[0], to_name, (int)err);
  330 + return;
  331 + }
  332 + to_buf[0] = tmp_to_buf[0];
  333 + to_buf[1] = tmp_to_buf[1];
  334 +#if defined(WIDE_DEBUG) /*[*/
  335 + printf("Got %u %s characters:", len, to_name);
  336 + for (i = 0; i < len; i++) {
  337 + printf(" %02x", to_buf[i]);
  338 + }
  339 + printf("\n");
  340 +#endif /*]*/
  341 + } else {
  342 + to_buf[0] = (Ubuf[0] >> 8) & 0xff;
  343 + to_buf[1] = Ubuf[0] & 0xff;
  344 + }
  345 +}
  346 +
  347 +#if defined(X3270_DISPLAY) /*[*/
  348 +/* Translate a DBCS EBCDIC character to a display character. */
  349 +void
  350 +dbcs_to_display(unsigned char ebc1, unsigned char ebc2, unsigned char c[])
  351 +{
  352 + xlate1(ebc1, ebc2, c, dbcs_converter, "host DBCS", wdisplay_converter,
  353 + "wide display");
  354 +}
  355 +#endif /*]*/
  356 +
  357 +/* Translate a DBCS EBCDIC character to a 2-byte Unicode character. */
  358 +void
  359 +dbcs_to_unicode16(unsigned char ebc1, unsigned char ebc2, unsigned char c[])
  360 +{
  361 + xlate1(ebc1, ebc2, c, dbcs_converter, "host DBCS", NULL, NULL);
  362 +}
  363 +
  364 +/*
  365 + * Translate a DBCS EBCDIC character to a local multi-byte character.
  366 + * Returns -1 for error, or the mb length. NULL terminates.
  367 + */
  368 +int
  369 +dbcs_to_mb(unsigned char ebc1, unsigned char ebc2, char *mb)
  370 +{
  371 + UErrorCode err = U_ZERO_ERROR;
  372 + unsigned char w[2];
  373 + UChar Ubuf;
  374 + int len;
  375 +
  376 + if (local_converter == NULL) {
  377 + *mb = '?';
  378 + *(mb + 1) = '\0';
  379 + return 1;
  380 + }
  381 +
  382 + /* Translate to Unicode first. */
  383 + dbcs_to_unicode16(ebc1, ebc2, w);
  384 + Ubuf = (w[0] << 8) | w[1];
  385 +
  386 + /* Then translate to the local encoding. */
  387 + len = ucnv_fromUChars(local_converter, mb, 16, &Ubuf, 1, &err);
  388 + if (err != U_ZERO_ERROR) {
  389 + trace_ds("[fromUnicode of U+%04x to local failed, ICU "
  390 + "error %d]\n", Ubuf, (int)err);
  391 + return -1;
  392 + }
  393 + return len;
  394 +}
  395 +
  396 +/*
  397 + * Translate an SBCS EBCDIC character to a local multi-byte character.
  398 + * Returns -1 for error, or the mb length. NULL terminates.
  399 + */
  400 +int
  401 +sbcs_to_mb(unsigned char ebc, char *mb)
  402 +{
  403 + UErrorCode err = U_ZERO_ERROR;
  404 + UChar Ubuf;
  405 + int len;
  406 +
  407 + if (sbcs_converter == NULL) {
  408 + /* No SBCS converter, do EBCDIC to latin-1. */
  409 + if (local_converter == NULL) {
  410 + /* No local converter either, latin-1 is it. */
  411 + *mb = ebc2asc[ebc];
  412 + *(mb + 1) = '\0';
  413 + return 1;
  414 + }
  415 +
  416 + /* Have a local converter; use it below. */
  417 + Ubuf = ebc2asc[ebc];
  418 + } else {
  419 + /* Have an SBCS converter. Convert from SBCS to Unicode. */
  420 + err = U_ZERO_ERROR;
  421 + len = ucnv_toUChars(sbcs_converter, &Ubuf, 1, (char *)&ebc, 1,
  422 + &err);
  423 + if (err != U_ZERO_ERROR &&
  424 + err != U_STRING_NOT_TERMINATED_WARNING) {
  425 + trace_ds("[toUChars failed, ICU error %d]\n",
  426 + (int)err);
  427 + return -1;
  428 + }
  429 + }
  430 +
  431 + /* Convert from Unicode to the local encoding. */
  432 + len = ucnv_fromUChars(local_converter, mb, 16, &Ubuf, 1, &err);
  433 + if (err != U_ZERO_ERROR) {
  434 + trace_ds("[fromUnicode of U+%04x to local failed, ICU "
  435 + "error %d]\n", Ubuf, (int)err);
  436 + return -1;
  437 + }
  438 + return len;
  439 +}
  440 +
  441 +/*
  442 + * Translate a local multi-byte string to Unicode characters.
  443 + * Returns -1 for error, or the length. NULL terminates.
  444 + */
  445 +int
  446 +mb_to_unicode(char *mb, int mblen, UChar *u, int ulen, UErrorCode *err)
  447 +{
  448 + UErrorCode local_err;
  449 + int len;
  450 + Boolean print_errs = False;
  451 +
  452 + if (local_converter == NULL) {
  453 + int i;
  454 +
  455 + for (i = 0; i < mblen; i++) {
  456 + u[i] = mb[i] & 0xff;
  457 + }
  458 + return mblen;
  459 + }
  460 + if (err == NULL) {
  461 + err = &local_err;
  462 + print_errs = True;
  463 + }
  464 + *err = U_ZERO_ERROR;
  465 + len = ucnv_toUChars(local_converter, u, ulen, mb, mblen, err);
  466 + if (*err != U_ZERO_ERROR && *err != U_STRING_NOT_TERMINATED_WARNING) {
  467 + if (print_errs)
  468 + trace_ds("[toUChars failed, ICU error %d]\n",
  469 + (int)*err);
  470 + return -1;
  471 + }
  472 + return len;
  473 +}
  474 +
  475 +/*
  476 + * Try to map a Unicode character to the Host SBCS character set.
  477 + * Returns ASCII in cp[0].
  478 + */
  479 +int
  480 +dbcs_map8(UChar u, unsigned char *cp)
  481 +{
  482 + UErrorCode err = U_ZERO_ERROR;
  483 + int len;
  484 +
  485 + if (!(u & ~0xff)) {
  486 + *cp = u;
  487 + return 1;
  488 + }
  489 + if (sbcs_converter != NULL) {
  490 + len = ucnv_fromUChars(sbcs_converter, (char *)cp, 1, &u, 1,
  491 + &err);
  492 + if ((err != U_ZERO_ERROR &&
  493 + err != U_STRING_NOT_TERMINATED_WARNING) ||
  494 + (*cp == '?' && u != '?')) {
  495 + *cp = ebc2asc[*cp];
  496 + return 0;
  497 + } else
  498 + return 1;
  499 + }
  500 + return 0;
  501 +}
  502 +
  503 +/*
  504 + * Try to map a Unicode character to the Host DBCS character set.
  505 + * Returns EBCDIC in cp[].
  506 + */
  507 +int
  508 +dbcs_map16(UChar u, unsigned char *cp)
  509 +{
  510 + UErrorCode err = U_ZERO_ERROR;
  511 + int len;
  512 +
  513 + if (same_converter) {
  514 + char tmp_cp[5];
  515 +
  516 + len = ucnv_fromUChars(dbcs_converter, tmp_cp, 5, &u, 1, &err);
  517 + if (err != U_ZERO_ERROR ||
  518 + len < 3 ||
  519 + tmp_cp[0] != EBC_so)
  520 + return 0;
  521 + cp[0] = tmp_cp[1];
  522 + cp[1] = tmp_cp[2];
  523 + return 1;
  524 + } else {
  525 + len = ucnv_fromUChars(dbcs_converter, (char *)cp, 2, &u, 1,
  526 + &err);
  527 + return (err == U_ZERO_ERROR ||
  528 + err == U_STRING_NOT_TERMINATED_WARNING);
  529 + }
  530 +}
... ...