From d714f42ebb08bccac7466c7b0925b1334b88995c Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Wed, 29 Feb 2012 01:31:46 +0000 Subject: [PATCH] Criando projeto codeblocks para testar a lib3270 separada da parte GUI facilitando a identificação de erros de memória e o desenvolvimento paralelo de duas GUIs. --- src/lib/Makefile.in | 7 ++++++- src/lib/globals.h | 1 + src/lib/glue.c | 12 ++++++++++-- src/lib/host.c | 5 +++-- src/lib/kybd.c | 6 ++---- src/lib/lib3270.cbp | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib/macros.c | 4 +++- src/lib/proxy.c | 6 +++--- src/lib/tesprogram.c | 5 +++++ src/lib/wide.c | 530 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/lib/wide.c.unused | 530 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 11 files changed, 774 insertions(+), 543 deletions(-) create mode 100644 src/lib/lib3270.cbp delete mode 100644 src/lib/wide.c create mode 100644 src/lib/wide.c.unused diff --git a/src/lib/Makefile.in b/src/lib/Makefile.in index 74d7510..a7a4fa9 100644 --- a/src/lib/Makefile.in +++ b/src/lib/Makefile.in @@ -123,7 +123,11 @@ version.c: ./mkversion.sh @chmod +x ./mkversion.sh @./mkversion.sh -$(OBJDIR)/fallbacks@OBJEXT@: $(BINDIR)/mkfb@EXEEXT@ X3270.xad +fallbacks.c: $(BINDIR)/mkfb.exe X3270.xad + @mkdir -p $(TMPDIR) + @$(BINDIR)/mkfb.exe -c X3270.xad falbacks.c + +$(OBJDIR)/fallbacks@OBJEXT@: fallbacks.c @echo $@ ... @mkdir -p `dirname $@` @mkdir -p $(TMPDIR) @@ -146,6 +150,7 @@ distclean: clean: @rm -f version.c + @rm -f fallbacks.c @rm -fr debian @rm -fr .tmp diff --git a/src/lib/globals.h b/src/lib/globals.h index cea630d..c01e567 100644 --- a/src/lib/globals.h +++ b/src/lib/globals.h @@ -348,5 +348,6 @@ enum state_change #endif /*]*/ /* Library internal calls */ +void key_ACharacter(unsigned char c, enum keytype keytype, enum iaction cause,Boolean *skipped); diff --git a/src/lib/glue.c b/src/lib/glue.c index f10dce1..c6093fa 100644 --- a/src/lib/glue.c +++ b/src/lib/glue.c @@ -186,9 +186,10 @@ void lib3270_session_init(H3270 *hSession, const char *model) /* * Sort out model and color modes, based on the model number resource. - */ - if(*appres.model) + */ /* + if(appres.model && *appres.model) model = appres.model; + */ if(!*model) model = "2"; // No model, use the default one @@ -1057,6 +1058,13 @@ popup_an_errno(int errn, const char *fmt, ...) Error(vmsgbuf); } +#ifdef DEBUG +extern void lib3270_initialize(void) +{ + initialize(); +} +#endif + void action_output(const char *fmt, ...) { diff --git a/src/lib/host.c b/src/lib/host.c index e135e8a..c73b5e9 100644 --- a/src/lib/host.c +++ b/src/lib/host.c @@ -83,6 +83,7 @@ static void try_reconnect(H3270 *session); +/* static char * stoken(char **s) { char *r; @@ -101,7 +102,7 @@ static char * stoken(char **s) *s = ss; return r; } - +*/ /* * Read the host file @@ -490,7 +491,7 @@ static int do_connect(H3270 *hSession, const char *n) char nb[2048]; /* name buffer */ char *s; /* temporary */ const char *chost; /* to whom we will connect */ - char *target_name; +// char *target_name; char *ps = CN; char *port = CN; Boolean resolving; diff --git a/src/lib/kybd.c b/src/lib/kybd.c index c643dab..4fe311b 100644 --- a/src/lib/kybd.c +++ b/src/lib/kybd.c @@ -103,7 +103,7 @@ static Boolean key_Character(int code, Boolean with_ge, Boolean pasting, static Boolean flush_ta(void); static void key_AID(unsigned char aid_code); static void kybdlock_set(unsigned int bits, const char *cause); -static KeySym MyStringToKeysym(char *s, enum keytype *keytypep); +// static KeySym MyStringToKeysym(char *s, enum keytype *keytypep); #if defined(X3270_DBCS) /*[*/ Boolean key_WCharacter(unsigned char code[], Boolean *skipped); @@ -1289,9 +1289,7 @@ retry: /* * Handle an ordinary character key, given an ASCII code. */ -void -key_ACharacter(unsigned char c, enum keytype keytype, enum iaction cause, - Boolean *skipped) +void key_ACharacter(unsigned char c, enum keytype keytype, enum iaction cause,Boolean *skipped) { // register int i; struct akeysym ak; diff --git a/src/lib/lib3270.cbp b/src/lib/lib3270.cbp new file mode 100644 index 0000000..053300f --- /dev/null +++ b/src/lib/lib3270.cbp @@ -0,0 +1,211 @@ + + + + + + diff --git a/src/lib/macros.c b/src/lib/macros.c index d25d725..901932c 100644 --- a/src/lib/macros.c +++ b/src/lib/macros.c @@ -59,12 +59,14 @@ return macro_list; } +/* static char * value_as_string(int val) { char buffer[10]; snprintf(buffer,9,"%d",val); return strdup(buffer); } +*/ static const char * get_state(H3270 *h) { @@ -313,6 +315,6 @@ LIB3270_MACRO( disconnect ) { - host_disconnect(hSession,0); + lib3270_disconnect(hSession); return strdup("0"); } diff --git a/src/lib/proxy.c b/src/lib/proxy.c index d1b6ac2..7340e90 100644 --- a/src/lib/proxy.c +++ b/src/lib/proxy.c @@ -707,7 +707,7 @@ proxy_socks5(int fd, char *host, unsigned short port, int force_d) trace_dsn("SOCKS5 Proxy: xmit version 5 nmethods 1 (no auth)\n"); trace_netdata('>', rbuf, 3); #endif /*]*/ - if (send(fd, rbuf, 3, 0) < 0) { + if (send(fd, (const char *) rbuf, 3, 0) < 0) { popup_a_sockerr("SOCKS5 Proxy: send error"); return -1; } @@ -734,7 +734,7 @@ proxy_socks5(int fd, char *host, unsigned short port, int force_d) return -1; } - nr = recv(fd, &rbuf[nread], 1, 0); + nr = recv(fd, (char *) &rbuf[nread], 1, 0); if (nr < 0) { popup_a_sockerr("SOCKS5 Proxy: receive error"); #if defined(X3270_TRACE) /*[*/ @@ -839,7 +839,7 @@ proxy_socks5(int fd, char *host, unsigned short port, int force_d) return -1; } - nr = recv(fd, &r, 1, 0); + nr = recv(fd, (char *) &r, 1, 0); if (nr < 0) { popup_a_sockerr("SOCKS5 Proxy: receive error"); #if defined(X3270_TRACE) /*[*/ diff --git a/src/lib/tesprogram.c b/src/lib/tesprogram.c index cd95032..72f2a19 100644 --- a/src/lib/tesprogram.c +++ b/src/lib/tesprogram.c @@ -1,15 +1,20 @@ +#include #include int main(int numpar, char *param[]) { H3270 *h; + lib3270_initialize(); + h = lib3270_session_new(""); + printf("3270 session %p created\n",h); + printf("Ending 3270 session %p\n",h); lib3270_session_free(h); return 0; diff --git a/src/lib/wide.c b/src/lib/wide.c deleted file mode 100644 index 3889473..0000000 --- a/src/lib/wide.c +++ /dev/null @@ -1,530 +0,0 @@ -/* - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a - * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob o nome G3270. - * - * Copyright (C) <2008> - * - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela - * Free Software Foundation. - * - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para - * obter mais detalhes. - * - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este - * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA, 02111-1307, USA - * - * Este programa está nomeado como wide.c e possui 530 linhas de código. - * - * Contatos: - * - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) - * licinio@bb.com.br (Licínio Luis Branco) - * kraucer@bb.com.br (Kraucer Fernandes Mazuco) - * macmiranda@bb.com.br (Marco Aurélio Caldas Miranda) - * - */ - -/* - * wide.c - * A 3270 Terminal Emulator for X11 - * Wide character translation functions. - */ - -#include "globals.h" -#include -#include -#include - -#include "3270ds.h" -#if !defined(PR3287) /*[*/ -#include "appres.h" -#endif /*]*/ - -#include "popupsc.h" -#include "tablesc.h" -#include "trace_dsc.h" -#if !defined(PR3287) /*[*/ -#include "utilc.h" -#endif /*]*/ - -#include "widec.h" - -#define ICU_DATA "ICU_DATA" - -char *local_encoding = CN; - -static UConverter *dbcs_converter = NULL; -static char *dbcs_converter_name = CN; -static UConverter *sbcs_converter = NULL; -static char *sbcs_converter_name = CN; -static UConverter *local_converter = NULL; -#if defined(X3270_DISPLAY) /*[*/ -static UConverter *wdisplay_converter = NULL; -#endif /*]*/ -static Boolean same_converter = False; - -/* Initialize, or reinitialize the EBCDIC DBCS converters. */ -int -wide_init(char *converter_names, char *local_name) -{ - UErrorCode err = U_ZERO_ERROR; - char *cur_path = CN; - Boolean lib_ok = False; - Boolean dot_ok = False; - char *cn_copy, *buf, *token; - char *sbcs_converters = NULL; - char *dbcs_converters = NULL; - int n_converter_sets = 0; - int n_sbcs_converters = 0; - int n_dbcs_converters = 0; - - /* This may be a reinit. */ - if (local_converter != NULL) { - ucnv_close(local_converter); - local_converter = NULL; - } - Replace(local_encoding, CN); - if (sbcs_converter != NULL) { - ucnv_close(sbcs_converter); - sbcs_converter = NULL; - } - Replace(sbcs_converter_name, CN); - if (dbcs_converter != NULL) { - ucnv_close(dbcs_converter); - dbcs_converter = NULL; - } - Replace(dbcs_converter_name, CN); -#if defined(X3270_DISPLAY) /*[*/ - if (wdisplay_converter != NULL) { - ucnv_close(wdisplay_converter); - wdisplay_converter = NULL; - } -#endif /*]*/ - same_converter = False; - - /* Make sure that $ICU_DATA has LIBX3270DIR and . in it. */ - cur_path = getenv(ICU_DATA); - if (cur_path != CN) { - char *t = NewString(cur_path); - char *token; - char *buf = t; - - while (!(lib_ok && dot_ok) && - (token = strtok(buf, ":")) != CN) { - buf = CN; - if (!strcmp(token, LIBX3270DIR)) { - lib_ok = True; - } else if (!strcmp(token, ".")) { - dot_ok = True; - } - } - Free(t); - } - if (!lib_ok || !dot_ok) { - char *s, *new_path; - - s = new_path = Malloc(strlen(ICU_DATA) + - (cur_path? strlen(cur_path): 0) + - strlen(LIBX3270DIR) + 5 /* ICU_DATA=*:*:.\n */); - - s += sprintf(s, "%s=", ICU_DATA); - if (cur_path != CN) - s += sprintf(s, "%s", cur_path); - if (!lib_ok) { - if (s[-1] != '=' && s[-1] != ':') - *s++ = ':'; - s += sprintf(s, "%s", LIBX3270DIR); - } - if (!dot_ok) { - if (s[-1] != '=' && s[-1] != ':') - *s++ = ':'; - *s++ = '.'; - } - *s = '\0'; - if (putenv(new_path) < 0) { - popup_an_errno(errno, "putenv for " ICU_DATA " failed"); - return -1; - } - } - - /* Decode local converter name. */ - if (local_name == CN) { - (void) setlocale(LC_CTYPE, ""); - local_name = nl_langinfo(CODESET); - } - if (local_name != CN) { - err = U_ZERO_ERROR; - local_converter = ucnv_open(local_name, &err); - if (local_converter == NULL) { - popup_an_error("Cannot find ICU converter for " - "local encoding:\n%s", - local_name); - } - Replace(local_encoding, NewString(local_name)); - } - - /* Decode host and display converter names. */ - if (converter_names == CN) - return 0; - - /* - * Split into SBCS and DBCS converters, separated by '+'. If only one - * converter is specified, it's the DBCS converter. - */ - n_converter_sets = 0; - buf = cn_copy = NewString(converter_names); - while ((token = strtok(buf, "+")) != CN) { - buf = CN; - switch (n_converter_sets) { - case 0: /* DBCS or SBCS */ - dbcs_converters = token; - break; - case 1: /* DBCS */ - sbcs_converters = dbcs_converters; - dbcs_converters = token; - break; - default: /* extra */ - popup_an_error("Extra converter set '%s' ignored", token); - break; - } - n_converter_sets++; - } - - if (sbcs_converters != NULL) { - n_sbcs_converters = 0; - buf = sbcs_converters; - while ((token = strtok(buf, ",")) != CN) { - buf = CN; - switch (n_sbcs_converters) { - case 0: /* EBCDIC */ - err = U_ZERO_ERROR; - sbcs_converter = ucnv_open(token, &err); - if (sbcs_converter == NULL) { - popup_an_error("Cannot find ICU converter " - "for host SBCS:\n%s", token); - Free(cn_copy); - return -1; - } - Replace(sbcs_converter_name, NewString(token)); - break; - default: /* extra */ - popup_an_error("Extra converter name '%s' ignored", - token); - break; - } - n_sbcs_converters++; - } - } - - if (dbcs_converters != NULL) { - n_dbcs_converters = 0; - buf = dbcs_converters; - while ((token = strtok(buf, ",")) != CN) { - buf = CN; - switch (n_dbcs_converters) { - case 0: /* EBCDIC */ - err = U_ZERO_ERROR; - dbcs_converter = ucnv_open(token, &err); - if (dbcs_converter == NULL) { - popup_an_error("Cannot find ICU converter " - "for host DBCS:\n%s", token); - Free(cn_copy); - return -1; - } - Replace(dbcs_converter_name, NewString(token)); - break; - case 1: /* display */ -#if defined(X3270_DISPLAY) /*[*/ - err = U_ZERO_ERROR; - wdisplay_converter = ucnv_open(token, &err); - if (wdisplay_converter == NULL) { - popup_an_error("Cannot find ICU converter " - "for display DBCS:\n%s", token); - Free(cn_copy); - return -1; - } -#endif /*]*/ - break; - default: /* extra */ - popup_an_error("Extra converter name '%s' ignored", - token); - break; - } - n_dbcs_converters++; - } - } - - Free(cn_copy); - - if (n_dbcs_converters < 2) { - popup_an_error("Missing DBCS converter value"); - return -1; - } - if (dbcs_converter_name != CN && - sbcs_converter_name != CN && - !strcmp(dbcs_converter_name, sbcs_converter_name)) { - same_converter = True; - } - - return 0; -} - -static void -xlate1(unsigned char from0, unsigned char from1, unsigned char to_buf[], - UConverter *from_cnv, const char *from_name, - UConverter *to_cnv, const char *to_name) -{ - UErrorCode err = U_ZERO_ERROR; - UChar Ubuf[2]; - char from_buf[4]; - int from_len; - char tmp_to_buf[3]; - int32_t len; -#if defined(WIDE_DEBUG) /*[*/ - int i; -#endif /*]*/ - - /* Do something reasonable in case of failure. */ - to_buf[0] = to_buf[1] = 0; - - /* Convert string from source to Unicode. */ - if (same_converter) { - from_buf[0] = EBC_so; - from_buf[1] = from0; - from_buf[2] = from1; - from_buf[3] = EBC_si; - from_len = 4; - } else { - from_buf[0] = from0; - from_buf[1] = from1; - from_len = 2; - } - len = ucnv_toUChars(from_cnv, Ubuf, 2, from_buf, from_len, &err); - if (err != U_ZERO_ERROR) { - trace_ds("[%s toUnicode of DBCS X'%02x%02x' failed, ICU " - "error %d]\n", from_name, from0, from1, (int)err); - return; - } - if (Ubuf[0] == 0xfffd) { - /* No translation. */ - trace_ds("[%s toUnicode of DBCS X'%02x%02x' failed]\n", - from_name, from0, from1); - return; - } -#if defined(WIDE_DEBUG) /*[*/ - printf("Got Unicode %x\n", Ubuf[0]); -#endif /*]*/ - - if (to_cnv != NULL) { - /* Convert string from Unicode to Destination. */ - len = ucnv_fromUChars(to_cnv, tmp_to_buf, 3, Ubuf, len, &err); - if (err != U_ZERO_ERROR) { - trace_ds("[fromUnicode of U+%04x to %s failed, ICU " - "error %d]\n", Ubuf[0], to_name, (int)err); - return; - } - to_buf[0] = tmp_to_buf[0]; - to_buf[1] = tmp_to_buf[1]; -#if defined(WIDE_DEBUG) /*[*/ - printf("Got %u %s characters:", len, to_name); - for (i = 0; i < len; i++) { - printf(" %02x", to_buf[i]); - } - printf("\n"); -#endif /*]*/ - } else { - to_buf[0] = (Ubuf[0] >> 8) & 0xff; - to_buf[1] = Ubuf[0] & 0xff; - } -} - -#if defined(X3270_DISPLAY) /*[*/ -/* Translate a DBCS EBCDIC character to a display character. */ -void -dbcs_to_display(unsigned char ebc1, unsigned char ebc2, unsigned char c[]) -{ - xlate1(ebc1, ebc2, c, dbcs_converter, "host DBCS", wdisplay_converter, - "wide display"); -} -#endif /*]*/ - -/* Translate a DBCS EBCDIC character to a 2-byte Unicode character. */ -void -dbcs_to_unicode16(unsigned char ebc1, unsigned char ebc2, unsigned char c[]) -{ - xlate1(ebc1, ebc2, c, dbcs_converter, "host DBCS", NULL, NULL); -} - -/* - * Translate a DBCS EBCDIC character to a local multi-byte character. - * Returns -1 for error, or the mb length. NULL terminates. - */ -int -dbcs_to_mb(unsigned char ebc1, unsigned char ebc2, char *mb) -{ - UErrorCode err = U_ZERO_ERROR; - unsigned char w[2]; - UChar Ubuf; - int len; - - if (local_converter == NULL) { - *mb = '?'; - *(mb + 1) = '\0'; - return 1; - } - - /* Translate to Unicode first. */ - dbcs_to_unicode16(ebc1, ebc2, w); - Ubuf = (w[0] << 8) | w[1]; - - /* Then translate to the local encoding. */ - len = ucnv_fromUChars(local_converter, mb, 16, &Ubuf, 1, &err); - if (err != U_ZERO_ERROR) { - trace_ds("[fromUnicode of U+%04x to local failed, ICU " - "error %d]\n", Ubuf, (int)err); - return -1; - } - return len; -} - -/* - * Translate an SBCS EBCDIC character to a local multi-byte character. - * Returns -1 for error, or the mb length. NULL terminates. - */ -int -sbcs_to_mb(unsigned char ebc, char *mb) -{ - UErrorCode err = U_ZERO_ERROR; - UChar Ubuf; - int len; - - if (sbcs_converter == NULL) { - /* No SBCS converter, do EBCDIC to latin-1. */ - if (local_converter == NULL) { - /* No local converter either, latin-1 is it. */ - *mb = ebc2asc[ebc]; - *(mb + 1) = '\0'; - return 1; - } - - /* Have a local converter; use it below. */ - Ubuf = ebc2asc[ebc]; - } else { - /* Have an SBCS converter. Convert from SBCS to Unicode. */ - err = U_ZERO_ERROR; - len = ucnv_toUChars(sbcs_converter, &Ubuf, 1, (char *)&ebc, 1, - &err); - if (err != U_ZERO_ERROR && - err != U_STRING_NOT_TERMINATED_WARNING) { - trace_ds("[toUChars failed, ICU error %d]\n", - (int)err); - return -1; - } - } - - /* Convert from Unicode to the local encoding. */ - len = ucnv_fromUChars(local_converter, mb, 16, &Ubuf, 1, &err); - if (err != U_ZERO_ERROR) { - trace_ds("[fromUnicode of U+%04x to local failed, ICU " - "error %d]\n", Ubuf, (int)err); - return -1; - } - return len; -} - -/* - * Translate a local multi-byte string to Unicode characters. - * Returns -1 for error, or the length. NULL terminates. - */ -int -mb_to_unicode(char *mb, int mblen, UChar *u, int ulen, UErrorCode *err) -{ - UErrorCode local_err; - int len; - Boolean print_errs = False; - - if (local_converter == NULL) { - int i; - - for (i = 0; i < mblen; i++) { - u[i] = mb[i] & 0xff; - } - return mblen; - } - if (err == NULL) { - err = &local_err; - print_errs = True; - } - *err = U_ZERO_ERROR; - len = ucnv_toUChars(local_converter, u, ulen, mb, mblen, err); - if (*err != U_ZERO_ERROR && *err != U_STRING_NOT_TERMINATED_WARNING) { - if (print_errs) - trace_ds("[toUChars failed, ICU error %d]\n", - (int)*err); - return -1; - } - return len; -} - -/* - * Try to map a Unicode character to the Host SBCS character set. - * Returns ASCII in cp[0]. - */ -int -dbcs_map8(UChar u, unsigned char *cp) -{ - UErrorCode err = U_ZERO_ERROR; - int len; - - if (!(u & ~0xff)) { - *cp = u; - return 1; - } - if (sbcs_converter != NULL) { - len = ucnv_fromUChars(sbcs_converter, (char *)cp, 1, &u, 1, - &err); - if ((err != U_ZERO_ERROR && - err != U_STRING_NOT_TERMINATED_WARNING) || - (*cp == '?' && u != '?')) { - *cp = ebc2asc[*cp]; - return 0; - } else - return 1; - } - return 0; -} - -/* - * Try to map a Unicode character to the Host DBCS character set. - * Returns EBCDIC in cp[]. - */ -int -dbcs_map16(UChar u, unsigned char *cp) -{ - UErrorCode err = U_ZERO_ERROR; - int len; - - if (same_converter) { - char tmp_cp[5]; - - len = ucnv_fromUChars(dbcs_converter, tmp_cp, 5, &u, 1, &err); - if (err != U_ZERO_ERROR || - len < 3 || - tmp_cp[0] != EBC_so) - return 0; - cp[0] = tmp_cp[1]; - cp[1] = tmp_cp[2]; - return 1; - } else { - len = ucnv_fromUChars(dbcs_converter, (char *)cp, 2, &u, 1, - &err); - return (err == U_ZERO_ERROR || - err == U_STRING_NOT_TERMINATED_WARNING); - } -} diff --git a/src/lib/wide.c.unused b/src/lib/wide.c.unused new file mode 100644 index 0000000..3889473 --- /dev/null +++ b/src/lib/wide.c.unused @@ -0,0 +1,530 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple + * Place, Suite 330, Boston, MA, 02111-1307, USA + * + * Este programa está nomeado como wide.c e possui 530 linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * licinio@bb.com.br (Licínio Luis Branco) + * kraucer@bb.com.br (Kraucer Fernandes Mazuco) + * macmiranda@bb.com.br (Marco Aurélio Caldas Miranda) + * + */ + +/* + * wide.c + * A 3270 Terminal Emulator for X11 + * Wide character translation functions. + */ + +#include "globals.h" +#include +#include +#include + +#include "3270ds.h" +#if !defined(PR3287) /*[*/ +#include "appres.h" +#endif /*]*/ + +#include "popupsc.h" +#include "tablesc.h" +#include "trace_dsc.h" +#if !defined(PR3287) /*[*/ +#include "utilc.h" +#endif /*]*/ + +#include "widec.h" + +#define ICU_DATA "ICU_DATA" + +char *local_encoding = CN; + +static UConverter *dbcs_converter = NULL; +static char *dbcs_converter_name = CN; +static UConverter *sbcs_converter = NULL; +static char *sbcs_converter_name = CN; +static UConverter *local_converter = NULL; +#if defined(X3270_DISPLAY) /*[*/ +static UConverter *wdisplay_converter = NULL; +#endif /*]*/ +static Boolean same_converter = False; + +/* Initialize, or reinitialize the EBCDIC DBCS converters. */ +int +wide_init(char *converter_names, char *local_name) +{ + UErrorCode err = U_ZERO_ERROR; + char *cur_path = CN; + Boolean lib_ok = False; + Boolean dot_ok = False; + char *cn_copy, *buf, *token; + char *sbcs_converters = NULL; + char *dbcs_converters = NULL; + int n_converter_sets = 0; + int n_sbcs_converters = 0; + int n_dbcs_converters = 0; + + /* This may be a reinit. */ + if (local_converter != NULL) { + ucnv_close(local_converter); + local_converter = NULL; + } + Replace(local_encoding, CN); + if (sbcs_converter != NULL) { + ucnv_close(sbcs_converter); + sbcs_converter = NULL; + } + Replace(sbcs_converter_name, CN); + if (dbcs_converter != NULL) { + ucnv_close(dbcs_converter); + dbcs_converter = NULL; + } + Replace(dbcs_converter_name, CN); +#if defined(X3270_DISPLAY) /*[*/ + if (wdisplay_converter != NULL) { + ucnv_close(wdisplay_converter); + wdisplay_converter = NULL; + } +#endif /*]*/ + same_converter = False; + + /* Make sure that $ICU_DATA has LIBX3270DIR and . in it. */ + cur_path = getenv(ICU_DATA); + if (cur_path != CN) { + char *t = NewString(cur_path); + char *token; + char *buf = t; + + while (!(lib_ok && dot_ok) && + (token = strtok(buf, ":")) != CN) { + buf = CN; + if (!strcmp(token, LIBX3270DIR)) { + lib_ok = True; + } else if (!strcmp(token, ".")) { + dot_ok = True; + } + } + Free(t); + } + if (!lib_ok || !dot_ok) { + char *s, *new_path; + + s = new_path = Malloc(strlen(ICU_DATA) + + (cur_path? strlen(cur_path): 0) + + strlen(LIBX3270DIR) + 5 /* ICU_DATA=*:*:.\n */); + + s += sprintf(s, "%s=", ICU_DATA); + if (cur_path != CN) + s += sprintf(s, "%s", cur_path); + if (!lib_ok) { + if (s[-1] != '=' && s[-1] != ':') + *s++ = ':'; + s += sprintf(s, "%s", LIBX3270DIR); + } + if (!dot_ok) { + if (s[-1] != '=' && s[-1] != ':') + *s++ = ':'; + *s++ = '.'; + } + *s = '\0'; + if (putenv(new_path) < 0) { + popup_an_errno(errno, "putenv for " ICU_DATA " failed"); + return -1; + } + } + + /* Decode local converter name. */ + if (local_name == CN) { + (void) setlocale(LC_CTYPE, ""); + local_name = nl_langinfo(CODESET); + } + if (local_name != CN) { + err = U_ZERO_ERROR; + local_converter = ucnv_open(local_name, &err); + if (local_converter == NULL) { + popup_an_error("Cannot find ICU converter for " + "local encoding:\n%s", + local_name); + } + Replace(local_encoding, NewString(local_name)); + } + + /* Decode host and display converter names. */ + if (converter_names == CN) + return 0; + + /* + * Split into SBCS and DBCS converters, separated by '+'. If only one + * converter is specified, it's the DBCS converter. + */ + n_converter_sets = 0; + buf = cn_copy = NewString(converter_names); + while ((token = strtok(buf, "+")) != CN) { + buf = CN; + switch (n_converter_sets) { + case 0: /* DBCS or SBCS */ + dbcs_converters = token; + break; + case 1: /* DBCS */ + sbcs_converters = dbcs_converters; + dbcs_converters = token; + break; + default: /* extra */ + popup_an_error("Extra converter set '%s' ignored", token); + break; + } + n_converter_sets++; + } + + if (sbcs_converters != NULL) { + n_sbcs_converters = 0; + buf = sbcs_converters; + while ((token = strtok(buf, ",")) != CN) { + buf = CN; + switch (n_sbcs_converters) { + case 0: /* EBCDIC */ + err = U_ZERO_ERROR; + sbcs_converter = ucnv_open(token, &err); + if (sbcs_converter == NULL) { + popup_an_error("Cannot find ICU converter " + "for host SBCS:\n%s", token); + Free(cn_copy); + return -1; + } + Replace(sbcs_converter_name, NewString(token)); + break; + default: /* extra */ + popup_an_error("Extra converter name '%s' ignored", + token); + break; + } + n_sbcs_converters++; + } + } + + if (dbcs_converters != NULL) { + n_dbcs_converters = 0; + buf = dbcs_converters; + while ((token = strtok(buf, ",")) != CN) { + buf = CN; + switch (n_dbcs_converters) { + case 0: /* EBCDIC */ + err = U_ZERO_ERROR; + dbcs_converter = ucnv_open(token, &err); + if (dbcs_converter == NULL) { + popup_an_error("Cannot find ICU converter " + "for host DBCS:\n%s", token); + Free(cn_copy); + return -1; + } + Replace(dbcs_converter_name, NewString(token)); + break; + case 1: /* display */ +#if defined(X3270_DISPLAY) /*[*/ + err = U_ZERO_ERROR; + wdisplay_converter = ucnv_open(token, &err); + if (wdisplay_converter == NULL) { + popup_an_error("Cannot find ICU converter " + "for display DBCS:\n%s", token); + Free(cn_copy); + return -1; + } +#endif /*]*/ + break; + default: /* extra */ + popup_an_error("Extra converter name '%s' ignored", + token); + break; + } + n_dbcs_converters++; + } + } + + Free(cn_copy); + + if (n_dbcs_converters < 2) { + popup_an_error("Missing DBCS converter value"); + return -1; + } + if (dbcs_converter_name != CN && + sbcs_converter_name != CN && + !strcmp(dbcs_converter_name, sbcs_converter_name)) { + same_converter = True; + } + + return 0; +} + +static void +xlate1(unsigned char from0, unsigned char from1, unsigned char to_buf[], + UConverter *from_cnv, const char *from_name, + UConverter *to_cnv, const char *to_name) +{ + UErrorCode err = U_ZERO_ERROR; + UChar Ubuf[2]; + char from_buf[4]; + int from_len; + char tmp_to_buf[3]; + int32_t len; +#if defined(WIDE_DEBUG) /*[*/ + int i; +#endif /*]*/ + + /* Do something reasonable in case of failure. */ + to_buf[0] = to_buf[1] = 0; + + /* Convert string from source to Unicode. */ + if (same_converter) { + from_buf[0] = EBC_so; + from_buf[1] = from0; + from_buf[2] = from1; + from_buf[3] = EBC_si; + from_len = 4; + } else { + from_buf[0] = from0; + from_buf[1] = from1; + from_len = 2; + } + len = ucnv_toUChars(from_cnv, Ubuf, 2, from_buf, from_len, &err); + if (err != U_ZERO_ERROR) { + trace_ds("[%s toUnicode of DBCS X'%02x%02x' failed, ICU " + "error %d]\n", from_name, from0, from1, (int)err); + return; + } + if (Ubuf[0] == 0xfffd) { + /* No translation. */ + trace_ds("[%s toUnicode of DBCS X'%02x%02x' failed]\n", + from_name, from0, from1); + return; + } +#if defined(WIDE_DEBUG) /*[*/ + printf("Got Unicode %x\n", Ubuf[0]); +#endif /*]*/ + + if (to_cnv != NULL) { + /* Convert string from Unicode to Destination. */ + len = ucnv_fromUChars(to_cnv, tmp_to_buf, 3, Ubuf, len, &err); + if (err != U_ZERO_ERROR) { + trace_ds("[fromUnicode of U+%04x to %s failed, ICU " + "error %d]\n", Ubuf[0], to_name, (int)err); + return; + } + to_buf[0] = tmp_to_buf[0]; + to_buf[1] = tmp_to_buf[1]; +#if defined(WIDE_DEBUG) /*[*/ + printf("Got %u %s characters:", len, to_name); + for (i = 0; i < len; i++) { + printf(" %02x", to_buf[i]); + } + printf("\n"); +#endif /*]*/ + } else { + to_buf[0] = (Ubuf[0] >> 8) & 0xff; + to_buf[1] = Ubuf[0] & 0xff; + } +} + +#if defined(X3270_DISPLAY) /*[*/ +/* Translate a DBCS EBCDIC character to a display character. */ +void +dbcs_to_display(unsigned char ebc1, unsigned char ebc2, unsigned char c[]) +{ + xlate1(ebc1, ebc2, c, dbcs_converter, "host DBCS", wdisplay_converter, + "wide display"); +} +#endif /*]*/ + +/* Translate a DBCS EBCDIC character to a 2-byte Unicode character. */ +void +dbcs_to_unicode16(unsigned char ebc1, unsigned char ebc2, unsigned char c[]) +{ + xlate1(ebc1, ebc2, c, dbcs_converter, "host DBCS", NULL, NULL); +} + +/* + * Translate a DBCS EBCDIC character to a local multi-byte character. + * Returns -1 for error, or the mb length. NULL terminates. + */ +int +dbcs_to_mb(unsigned char ebc1, unsigned char ebc2, char *mb) +{ + UErrorCode err = U_ZERO_ERROR; + unsigned char w[2]; + UChar Ubuf; + int len; + + if (local_converter == NULL) { + *mb = '?'; + *(mb + 1) = '\0'; + return 1; + } + + /* Translate to Unicode first. */ + dbcs_to_unicode16(ebc1, ebc2, w); + Ubuf = (w[0] << 8) | w[1]; + + /* Then translate to the local encoding. */ + len = ucnv_fromUChars(local_converter, mb, 16, &Ubuf, 1, &err); + if (err != U_ZERO_ERROR) { + trace_ds("[fromUnicode of U+%04x to local failed, ICU " + "error %d]\n", Ubuf, (int)err); + return -1; + } + return len; +} + +/* + * Translate an SBCS EBCDIC character to a local multi-byte character. + * Returns -1 for error, or the mb length. NULL terminates. + */ +int +sbcs_to_mb(unsigned char ebc, char *mb) +{ + UErrorCode err = U_ZERO_ERROR; + UChar Ubuf; + int len; + + if (sbcs_converter == NULL) { + /* No SBCS converter, do EBCDIC to latin-1. */ + if (local_converter == NULL) { + /* No local converter either, latin-1 is it. */ + *mb = ebc2asc[ebc]; + *(mb + 1) = '\0'; + return 1; + } + + /* Have a local converter; use it below. */ + Ubuf = ebc2asc[ebc]; + } else { + /* Have an SBCS converter. Convert from SBCS to Unicode. */ + err = U_ZERO_ERROR; + len = ucnv_toUChars(sbcs_converter, &Ubuf, 1, (char *)&ebc, 1, + &err); + if (err != U_ZERO_ERROR && + err != U_STRING_NOT_TERMINATED_WARNING) { + trace_ds("[toUChars failed, ICU error %d]\n", + (int)err); + return -1; + } + } + + /* Convert from Unicode to the local encoding. */ + len = ucnv_fromUChars(local_converter, mb, 16, &Ubuf, 1, &err); + if (err != U_ZERO_ERROR) { + trace_ds("[fromUnicode of U+%04x to local failed, ICU " + "error %d]\n", Ubuf, (int)err); + return -1; + } + return len; +} + +/* + * Translate a local multi-byte string to Unicode characters. + * Returns -1 for error, or the length. NULL terminates. + */ +int +mb_to_unicode(char *mb, int mblen, UChar *u, int ulen, UErrorCode *err) +{ + UErrorCode local_err; + int len; + Boolean print_errs = False; + + if (local_converter == NULL) { + int i; + + for (i = 0; i < mblen; i++) { + u[i] = mb[i] & 0xff; + } + return mblen; + } + if (err == NULL) { + err = &local_err; + print_errs = True; + } + *err = U_ZERO_ERROR; + len = ucnv_toUChars(local_converter, u, ulen, mb, mblen, err); + if (*err != U_ZERO_ERROR && *err != U_STRING_NOT_TERMINATED_WARNING) { + if (print_errs) + trace_ds("[toUChars failed, ICU error %d]\n", + (int)*err); + return -1; + } + return len; +} + +/* + * Try to map a Unicode character to the Host SBCS character set. + * Returns ASCII in cp[0]. + */ +int +dbcs_map8(UChar u, unsigned char *cp) +{ + UErrorCode err = U_ZERO_ERROR; + int len; + + if (!(u & ~0xff)) { + *cp = u; + return 1; + } + if (sbcs_converter != NULL) { + len = ucnv_fromUChars(sbcs_converter, (char *)cp, 1, &u, 1, + &err); + if ((err != U_ZERO_ERROR && + err != U_STRING_NOT_TERMINATED_WARNING) || + (*cp == '?' && u != '?')) { + *cp = ebc2asc[*cp]; + return 0; + } else + return 1; + } + return 0; +} + +/* + * Try to map a Unicode character to the Host DBCS character set. + * Returns EBCDIC in cp[]. + */ +int +dbcs_map16(UChar u, unsigned char *cp) +{ + UErrorCode err = U_ZERO_ERROR; + int len; + + if (same_converter) { + char tmp_cp[5]; + + len = ucnv_fromUChars(dbcs_converter, tmp_cp, 5, &u, 1, &err); + if (err != U_ZERO_ERROR || + len < 3 || + tmp_cp[0] != EBC_so) + return 0; + cp[0] = tmp_cp[1]; + cp[1] = tmp_cp[2]; + return 1; + } else { + len = ucnv_fromUChars(dbcs_converter, (char *)cp, 2, &u, 1, + &err); + return (err == U_ZERO_ERROR || + err == U_STRING_NOT_TERMINATED_WARNING); + } +} -- libgit2 0.21.2