Commit d43c374ac92dbf1d16af0d5939c1b801f89fac66
1 parent
2fd2b75a
Exists in
master
and in
5 other branches
Implementando configuração de charset
Showing
4 changed files
with
98 additions
and
71 deletions
Show diff stats
| ... | ... | @@ -0,0 +1,46 @@ |
| 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. | |
| 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., 51 Franklin | |
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | + * | |
| 21 | + * Este programa está nomeado como charset.h e possui - 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 | + * | |
| 30 | + */ | |
| 31 | + | |
| 32 | +#ifndef LIB3270_CHARSET_H_INCLUDED | |
| 33 | + | |
| 34 | + #define LIB3270_CHARSET_H_INCLUDED 1 | |
| 35 | + | |
| 36 | + typedef enum | |
| 37 | + { | |
| 38 | + CS_ONLY, | |
| 39 | + FT_ONLY, | |
| 40 | + BOTH | |
| 41 | + } lib3270_remap_scope; | |
| 42 | + | |
| 43 | + LIB3270_EXPORT struct lib3270_charset * lib3270_load_charset(H3270 *hSession, const char *name); | |
| 44 | + LIB3270_EXPORT void lib3270_remap(H3270 *hSession, unsigned short ebc, unsigned short iso, lib3270_remap_scope scope, unsigned char one_way); | |
| 45 | + | |
| 46 | +#endif // LIB3270_CHARSET_H_INCLUDED | ... | ... |
src/lib3270/charset.c
| ... | ... | @@ -36,15 +36,7 @@ |
| 36 | 36 | |
| 37 | 37 | #include "globals.h" |
| 38 | 38 | #include "X11keysym.h" |
| 39 | - | |
| 40 | -typedef enum | |
| 41 | -{ | |
| 42 | - CS_ONLY, | |
| 43 | - FT_ONLY, | |
| 44 | - BOTH | |
| 45 | -} remap_scope; | |
| 46 | - | |
| 47 | -static void remap_char(H3270 *hSession, unsigned short ebc, unsigned short iso, remap_scope scope, unsigned char one_way); | |
| 39 | +#include <lib3270/charset.h"> | |
| 48 | 40 | |
| 49 | 41 | /* |
| 50 | 42 | * EBCDIC-to-Unicode translation tables. |
| ... | ... | @@ -208,16 +200,32 @@ static const unsigned short asc2uc[UT_SIZE] = |
| 208 | 200 | /*f8*/ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde |
| 209 | 201 | }; |
| 210 | 202 | |
| 203 | +typedef struct _info | |
| 204 | +{ | |
| 205 | + const char * name; | |
| 206 | + const unsigned short const * chr; | |
| 207 | +} remap; | |
| 211 | 208 | |
| 209 | +static const remap charset[] = | |
| 210 | +{ | |
| 211 | + { | |
| 212 | + "bracket", | |
| 213 | + (const unsigned short const []) | |
| 214 | + { | |
| 215 | + 0x00ad, '[', | |
| 216 | + 0x00ba, XK_Yacute, | |
| 217 | + 0x00bd, ']', | |
| 218 | + 0x00bb, XK_diaeresis, | |
| 219 | + 0x0000, 0x0000 | |
| 220 | + } | |
| 221 | + }, | |
| 212 | 222 | |
| 213 | -// | |
| 214 | -// bracket: "0xad: [ \n 0xba: XK_Yacute \n0xbd: ] \n 0xbb: XK_diaeresis \n" | |
| 215 | -// | |
| 216 | -// remap_char(hSession,0xad, '[', BOTH, 0); | |
| 217 | -// remap_char(hSession,0xba, XK_Yacute, BOTH, 0); | |
| 218 | -// remap_char(hSession,0xbd, ']', BOTH, 0); | |
| 219 | -// remap_char(hSession,0xbb, XK_diaeresis, remap_scope scope,0); | |
| 220 | -// | |
| 223 | + // Terminate list | |
| 224 | + { | |
| 225 | + NULL | |
| 226 | + } | |
| 227 | + | |
| 228 | +}; | |
| 221 | 229 | |
| 222 | 230 | /*---[ Implement ]------------------------------------------------------------------------------------------------------------*/ |
| 223 | 231 | |
| ... | ... | @@ -232,8 +240,8 @@ LIB3270_EXPORT struct lib3270_charset * lib3270_load_charset(H3270 *hSession, co |
| 232 | 240 | { |
| 233 | 241 | int f; |
| 234 | 242 | |
| 235 | - hSession->charset.host = "us"; | |
| 236 | - hSession->charset.display = "ISO-8859-1"; | |
| 243 | + hSession->charset.host = "us"; | |
| 244 | + hSession->charset.display = "ISO-8859-1"; | |
| 237 | 245 | |
| 238 | 246 | // lib3270_write_log(hSession,"charset","host.charset=%s display.charset=%s", |
| 239 | 247 | // hSession->charset.host,hSession->charset.display); |
| ... | ... | @@ -250,17 +258,29 @@ LIB3270_EXPORT struct lib3270_charset * lib3270_load_charset(H3270 *hSession, co |
| 250 | 258 | memcpy(hSession->charset.asc2ft, asc2ft, sizeof(hSession->charset.asc2ft)); |
| 251 | 259 | #endif |
| 252 | 260 | |
| 253 | - //if(!(name && strcasecmp(name,hSession->charset.host))) | |
| 254 | - // return &hSession->charset; | |
| 261 | + if(!(name && strcasecmp(name,hSession->charset.host))) | |
| 262 | + return &hSession->charset; | |
| 263 | + | |
| 264 | + for(f=0;charset[f].name != NULL;f++) | |
| 265 | + { | |
| 266 | + if(!strcasecmp(name,charset[f].name)) | |
| 267 | + { | |
| 268 | + // Found required charset | |
| 269 | + int c; | |
| 270 | + | |
| 271 | + hSession->charset.host = charset[f].name; | |
| 272 | + | |
| 273 | + for(c=0;charset[f].chr[c];c+=2) | |
| 274 | + lib3270_remap(hSession,charset[f].chr[c],charset[f].chr[c+1], BOTH, 0); | |
| 275 | + errno = 0; | |
| 276 | + return &hSession->charset; | |
| 277 | + } | |
| 278 | + } | |
| 255 | 279 | |
| 256 | - // Bracket | |
| 257 | - remap_char(hSession,0xad, '[', BOTH, 0); | |
| 258 | - remap_char(hSession,0xba, XK_Yacute, BOTH, 0); | |
| 259 | - remap_char(hSession,0xbd, ']', BOTH, 0); | |
| 260 | - remap_char(hSession,0xbb, XK_diaeresis, BOTH, 0); | |
| 280 | + errno = ENOENT; | |
| 261 | 281 | |
| 282 | + return NULL; | |
| 262 | 283 | |
| 263 | - return &hSession->charset; | |
| 264 | 284 | } |
| 265 | 285 | |
| 266 | 286 | |
| ... | ... | @@ -336,7 +356,7 @@ LIB3270_ACTION( charsettable ) |
| 336 | 356 | } |
| 337 | 357 | |
| 338 | 358 | // Process a single character definition. |
| 339 | -static void remap_char(H3270 *hSession, unsigned short ebc, unsigned short iso, remap_scope scope, unsigned char one_way) | |
| 359 | +LIB3270_EXPORT void lib3270_remap(H3270 *hSession, unsigned short ebc, unsigned short iso, lib3270_remap_scope scope, unsigned char one_way) | |
| 340 | 360 | { |
| 341 | 361 | // unsigned char cg; |
| 342 | 362 | ... | ... |
src/lib3270/charset.h
| ... | ... | @@ -1,43 +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. | |
| 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., 51 Franklin | |
| 19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | - * | |
| 21 | - * Este programa está nomeado como charset.h e possui - 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 | - * | |
| 30 | - */ | |
| 31 | - | |
| 32 | -#ifndef LIB3270_CHARSET_H_INCLUDED | |
| 33 | - | |
| 34 | - #define LIB3270_CHARSET_H_INCLUDED 1 | |
| 35 | - | |
| 36 | - LIB3270_INTERNAL const unsigned short ebc2asc0[256]; | |
| 37 | - LIB3270_INTERNAL const unsigned short asc2ft0[256]; | |
| 38 | - | |
| 39 | - const struct lib3270_charset lib3270_default_charset; | |
| 40 | - | |
| 41 | - LIB3270_EXPORT struct lib3270_charset * lib3270_load_charset(H3270 *hSession, const char *name); | |
| 42 | - | |
| 43 | -#endif // LIB3270_CHARSET_H_INCLUDED |
src/lib3270/globals.h
| ... | ... | @@ -331,6 +331,10 @@ enum keytype |
| 331 | 331 | KT_GE |
| 332 | 332 | }; |
| 333 | 333 | |
| 334 | +/* default charset translation tables */ | |
| 335 | +LIB3270_INTERNAL const unsigned short ebc2asc0[256]; | |
| 336 | +LIB3270_INTERNAL const unsigned short asc2ft0[256]; | |
| 337 | + | |
| 334 | 338 | |
| 335 | 339 | /* Library internal calls */ |
| 336 | 340 | LIB3270_INTERNAL void key_ACharacter(H3270 *hSession, unsigned char c, enum keytype keytype, enum iaction cause,Boolean *skipped); | ... | ... |