Commit 6c93bad80b1ce3c991fc721f0e4f2f0c95cf1643

Authored by perry.werneck@gmail.com
1 parent d401cc11

Incluindo conversão ebcdic<->asc no módulo rexx

po/pt_BR.po
... ... @@ -5,7 +5,7 @@ msgid &quot;&quot;
5 5 msgstr ""
6 6 "Project-Id-Version: pw3270 5.0\n"
7 7 "Report-Msgid-Bugs-To: \n"
8   -"POT-Creation-Date: 2013-11-27 14:51-0200\n"
  8 +"POT-Creation-Date: 2013-11-28 10:23-0200\n"
9 9 "PO-Revision-Date: 2013-11-12 08:07-0200\n"
10 10 "Last-Translator: Perry Werneck <perry.werneck@gmail.com>\n"
11 11 "Language-Team: Português <perry.werneck@gmail.com>\n"
... ... @@ -664,12 +664,12 @@ msgstr &quot;Erro \&quot;%s\&quot; gravando arquivo local (rc=%d)&quot;
664 664 msgid "Error %d resolving %s"
665 665 msgstr "Erro %d resolvendo %s"
666 666  
667   -#: telnet.c:3145 telnet.c:3156
  667 +#: telnet.c:3146 telnet.c:3157
668 668 #, c-format
669 669 msgid "Error in fcntl(%s) when setting non blocking mode"
670 670 msgstr "Erro em fcntl(%s) ao ativar o modo não blocante"
671 671  
672   -#: telnet.c:3135
  672 +#: telnet.c:3136
673 673 #, c-format
674 674 msgid "Error in ioctl(%s) when setting no blocking mode"
675 675 msgstr "Erro em ioctl(%s) ao ativar o modo não blocante"
... ... @@ -1692,7 +1692,7 @@ msgstr &quot;Tipo de servidor:&quot;
1692 1692 msgid "TELNET Proxy: send error"
1693 1693 msgstr "TELNET Proxy: Erro ao enviar"
1694 1694  
1695   -#: telnet.c:3342
  1695 +#: telnet.c:3343
1696 1696 msgid "TLS negotiation failure"
1697 1697 msgstr "Negociação TLS falhou"
1698 1698  
... ...
src/classlib/local.cc
... ... @@ -307,6 +307,8 @@
307 307 const char * (*_get_host_charset)(H3270 *hSession);
308 308 int (*_print)(H3270 *hSession);
309 309 int (*_erase_eof)(H3270 *hSession);
  310 + const char * (*_ebc2asc)(H3270 *hSession, unsigned char *buffer, size_t sz);
  311 + const char * (*_asc2ebc)(H3270 *hSession, unsigned char *buffer, size_t sz);
310 312  
311 313 public:
312 314  
... ... @@ -358,6 +360,8 @@
358 360 { (void **) & _get_host_charset, "lib3270_get_host_charset" },
359 361 { (void **) & _erase_eof, "lib3270_eraseeof" },
360 362 { (void **) & _print, "lib3270_print" },
  363 + { (void **) & _ebc2asc, "lib3270_ebc2asc" },
  364 + { (void **) & _asc2ebc, "lib3270_asc2ebc" },
361 365  
362 366 };
363 367  
... ... @@ -576,6 +580,16 @@
576 580 }
577 581  
578 582  
  583 + const char * asc2ebc(unsigned char *str, size_t sz)
  584 + {
  585 + return _asc2ebc(hSession,str,sz);
  586 + }
  587 +
  588 + const char * ebc2asc(unsigned char *str, size_t sz)
  589 + {
  590 + return _ebc2asc(hSession,str,sz);
  591 + }
  592 +
579 593 };
580 594  
581 595 session * session::create_local(void)
... ...
src/classlib/remote.cc
... ... @@ -1188,6 +1188,19 @@
1188 1188 return query_intval(HLLAPI_PACKET_PRINT);
1189 1189 }
1190 1190  
  1191 + const char * asc2ebc(unsigned char *str, size_t sz)
  1192 + {
  1193 + #warning Incomplete
  1194 + return (const char *) str;
  1195 + }
  1196 +
  1197 + const char * ebc2asc(unsigned char *str, size_t sz)
  1198 + {
  1199 + #warning Incomplete
  1200 + return (const char *) str;
  1201 + }
  1202 +
  1203 +
1191 1204 };
1192 1205  
1193 1206 session * session::create_remote(const char *session)
... ...
src/classlib/session.cc
... ... @@ -446,6 +446,23 @@
446 446 return get_local_text(get_text(baddr,len));
447 447 }
448 448  
  449 + string session::asc2ebc(string &str)
  450 + {
  451 + size_t sz = str.size();
  452 + unsigned char buffer[sz+1];
  453 +
  454 + memcpy(buffer,str.c_str(),sz);
  455 + return string(asc2ebc(buffer,sz));
  456 + }
  457 +
  458 + string session::ebc2asc(string &str)
  459 + {
  460 + size_t sz = str.size();
  461 + unsigned char buffer[sz+1];
  462 + memcpy(buffer,str.c_str(),sz);
  463 + return string(ebc2asc(buffer,sz));
  464 + }
  465 +
449 466 }
450 467  
451 468  
... ...
src/include/lib3270/charset.h
... ... @@ -64,6 +64,9 @@
64 64 LIB3270_EXPORT int lib3270_set_host_charset(H3270 *hSession, const char *name);
65 65 LIB3270_EXPORT const char * lib3270_get_host_charset(H3270 *hSession);
66 66 LIB3270_EXPORT void lib3270_remap(H3270 *hSession, unsigned short ebc, unsigned short iso, lib3270_remap_scope scope, unsigned char one_way);
  67 + LIB3270_EXPORT const char * lib3270_ebc2asc(H3270 *hSession, unsigned char *buffer, size_t sz);
  68 + LIB3270_EXPORT const char * lib3270_asc2ebc(H3270 *hSession, unsigned char *buffer, size_t sz);
  69 +
67 70  
68 71 #ifdef __cplusplus
69 72 }
... ...
src/include/pw3270/class.h
... ... @@ -140,6 +140,12 @@
140 140 virtual int wait_for_text_at(int row, int col, const char *key, int timeout);
141 141 virtual int emulate_input(const char *str) = 0;
142 142  
  143 + // Ascii<->EBCDIC translation
  144 + virtual const char * asc2ebc(unsigned char *str, size_t sz = -1) = 0;
  145 + virtual const char * ebc2asc(unsigned char *str, size_t sz = -1) = 0;
  146 + string asc2ebc(string &str);
  147 + string ebc2asc(string &str);
  148 +
143 149 // Get/Set/Test with charset translation
144 150 string * get_string(int baddr, size_t len);
145 151 string * get_string_at(int row, int col, size_t sz);
... ...
src/lib3270/charset.c
... ... @@ -402,6 +402,37 @@ LIB3270_ACTION( charsettable )
402 402 return 0;
403 403 }
404 404  
  405 +LIB3270_EXPORT const char * lib3270_asc2ebc(H3270 *hSession, unsigned char *buffer, size_t sz)
  406 +{
  407 + int f;
  408 + if(sz < 0)
  409 + sz = strlen((const char *) buffer);
  410 +
  411 + if(sz > 0)
  412 + {
  413 + for(f=0;f<sz;f++)
  414 + buffer[f] = hSession->charset.asc2ebc[buffer[f]];
  415 + }
  416 +
  417 + return (const char *) buffer;
  418 +}
  419 +
  420 +LIB3270_EXPORT const char * lib3270_ebc2asc(H3270 *hSession, unsigned char *buffer, size_t sz)
  421 +{
  422 + int f;
  423 + if(sz < 0)
  424 + sz = strlen((const char *) buffer);
  425 +
  426 + if(sz > 0)
  427 + {
  428 + for(f=0;f<sz;f++)
  429 + buffer[f] = hSession->charset.ebc2asc[buffer[f]];
  430 + }
  431 +
  432 + return (const char *) buffer;
  433 +}
  434 +
  435 +
405 436 // Process a single character definition.
406 437 LIB3270_EXPORT void lib3270_remap(H3270 *hSession, unsigned short ebc, unsigned short iso, lib3270_remap_scope scope, unsigned char one_way)
407 438 {
... ...
src/plugins/rx3270/pluginmain.cc
... ... @@ -52,6 +52,7 @@
52 52 #include <lib3270/charset.h>
53 53 #include <pw3270/class.h>
54 54  
  55 +
55 56 /*--[ Globals ]--------------------------------------------------------------------------------------*/
56 57  
57 58 #if GTK_CHECK_VERSION(2,32,0)
... ... @@ -134,6 +135,9 @@
134 135 string * get_host_charset(void);
135 136 string * get_display_charset(void);
136 137  
  138 + const char * asc2ebc(unsigned char *str, size_t sz = -1);
  139 + const char * ebc2asc(unsigned char *str, size_t sz = -1);
  140 +
137 141 int quit(void);
138 142  
139 143 protected:
... ... @@ -756,3 +760,14 @@ int plugin::print(void)
756 760 {
757 761 return lib3270_print(hSession);
758 762 }
  763 +
  764 +const char * plugin::asc2ebc(unsigned char *str, size_t sz)
  765 +{
  766 + return lib3270_asc2ebc(hSession,str,sz);
  767 +}
  768 +
  769 +const char * plugin::ebc2asc(unsigned char *str, size_t sz)
  770 +{
  771 + return lib3270_ebc2asc(hSession,str,sz);
  772 +}
  773 +
... ...
src/plugins/rx3270/rx3270.h
... ... @@ -85,6 +85,8 @@
85 85 REXX_TYPED_ROUTINE_PROTOTYPE(rx3270queryStringAt);
86 86 REXX_TYPED_ROUTINE_PROTOTYPE(rx3270SetStringAt);
87 87 REXX_TYPED_ROUTINE_PROTOTYPE(rx3270CloseApplication);
  88 + REXX_TYPED_ROUTINE_PROTOTYPE(ebc2asc);
  89 + REXX_TYPED_ROUTINE_PROTOTYPE(asc2ebc);
88 90  
89 91 REXX_METHOD_PROTOTYPE(rx3270_method_version);
90 92 REXX_METHOD_PROTOTYPE(rx3270_method_revision);
... ...
src/plugins/rx3270/rxapimain.cc
... ... @@ -113,6 +113,8 @@ RexxRoutineEntry rx3270_functions[] =
113 113 REXX_TYPED_ROUTINE(rx3270queryStringAt, rx3270queryStringAt),
114 114 REXX_TYPED_ROUTINE(rx3270SetStringAt, rx3270SetStringAt),
115 115 REXX_TYPED_ROUTINE(rx3270CloseApplication, rx3270CloseApplication),
  116 + REXX_TYPED_ROUTINE(ebc2asc, ebc2asc),
  117 + REXX_TYPED_ROUTINE(asc2ebc, asc2ebc),
116 118  
117 119  
118 120 // rx3270Popup
... ...
src/plugins/rx3270/sample/asc2ebc.rex 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +/*
  2 + * Sample code for ASC -> EBCDIC conversion
  3 + *
  4 + */
  5 +
  6 + STRING = "ASCII STRING"
  7 +
  8 + say c2x(asc2ebc(STRING))
  9 +
  10 +return 0
  11 +
  12 +
  13 +::requires "rx3270.cls"
... ...
src/plugins/rx3270/sample/ebc2asc.rex 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +/*
  2 + * Sample code for EBCDIC -> ASC conversion
  3 + *
  4 + */
  5 +
  6 + STRING = x2c("C1E2C3C9C940E2E3D9C9D5C7")
  7 +
  8 + say length(string)
  9 + say ebc2asc(STRING)
  10 +
  11 +return 0
  12 +
  13 +
  14 +::requires "rx3270.cls"
... ...
src/plugins/rx3270/typed_routines.cc
... ... @@ -217,3 +217,51 @@ RexxRoutine0(int, rx3270CloseApplication)
217 217 {
218 218 return session::get_default()->quit();
219 219 }
  220 +
  221 +
  222 +RexxRoutine2(RexxStringObject, asc2ebc, CSTRING, str, OPTIONAL_int, sz)
  223 +{
  224 + try
  225 + {
  226 + if(sz < 1)
  227 + sz = strlen(str);
  228 +
  229 + if(sz)
  230 + {
  231 + char buffer[sz+1];
  232 + memcpy(buffer,str,sz);
  233 + buffer[sz] = 0;
  234 + return context->String((CSTRING) session::get_default()->asc2ebc((unsigned char *)buffer,sz));
  235 + }
  236 + }
  237 + catch(std::exception &e)
  238 + {
  239 + context->RaiseException1(Rexx_Error_Application_error,context->NewStringFromAsciiz(e.what()));
  240 + }
  241 +
  242 + return context->String("");
  243 +}
  244 +
  245 +RexxRoutine2(RexxStringObject, ebc2asc, CSTRING, str, OPTIONAL_int, sz)
  246 +{
  247 + try
  248 + {
  249 + if(sz < 1)
  250 + sz = strlen(str);
  251 +
  252 + if(sz)
  253 + {
  254 + char buffer[sz+1];
  255 + memcpy(buffer,str,sz);
  256 + buffer[sz] = 0;
  257 + return context->String((CSTRING) session::get_default()->ebc2asc((unsigned char *)buffer,sz));
  258 + }
  259 + }
  260 + catch(std::exception &e)
  261 + {
  262 + context->RaiseException1(Rexx_Error_Application_error,context->NewStringFromAsciiz(e.what()));
  263 + }
  264 +
  265 + return context->String("");
  266 +}
  267 +
... ...