Commit 3061a0da2ccc57335d3ab547bda00ded2496fde2

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

Incluindo funções para o plugin rexx

configure.ac
... ... @@ -51,6 +51,9 @@ AC_CONFIG_HEADER([src/include/lib3270/config.h])
51 51 dnl Initialise automake stuff.
52 52 AM_INIT_AUTOMAKE
53 53  
  54 +dnl Check for iconv
  55 +AM_ICONV
  56 +
54 57 #--[ Check for tools & Libraries ]----------------------------------------------------------------------------------------------------------------------------
55 58  
56 59 AC_PROG_CXX
... ...
pw3270.cbp
... ... @@ -235,6 +235,8 @@
235 235 <Unit filename="src/plugins/rx3270/pluginmain.cc" />
236 236 <Unit filename="src/plugins/rx3270/rx3270.h" />
237 237 <Unit filename="src/plugins/rx3270/rxapimain.cc" />
  238 + <Unit filename="src/plugins/rx3270/text.cc" />
  239 + <Unit filename="src/plugins/rx3270/typed_routines.cc" />
238 240 <Unit filename="src/pw3270/Makefile.in" />
239 241 <Unit filename="src/pw3270/actions.c">
240 242 <Option compilerVar="CC" />
... ...
src/include/lib3270.h
... ... @@ -667,6 +667,9 @@
667 667 LIB3270_EXPORT int lib3270_in_tn3270e(H3270 *h);
668 668 LIB3270_EXPORT int lib3270_in_e(H3270 *h);
669 669  
  670 + #define lib3270_is_connected(h) lib3270_in_tn3270e(h)
  671 + #define lib3270_is_ready(h) lib3270_get_program_message(h) == LIB3270_MESSAGE_NONE
  672 +
670 673 LIB3270_EXPORT LIB3270_SSL_STATE lib3270_get_secure(H3270 *session);
671 674  
672 675  
... ... @@ -746,6 +749,8 @@
746 749 */
747 750 LIB3270_EXPORT const char * lib3270_get_charset(H3270 *session);
748 751  
  752 + LIB3270_EXPORT const char * lib3270_get_default_charset(void);
  753 +
749 754 /**
750 755 * Get selected area.
751 756 *
... ...
src/include/lib3270/config.h.in
... ... @@ -38,6 +38,7 @@
38 38 #undef PACKAGE_REVISION
39 39  
40 40 #undef HAVE_GNUC_VISIBILITY
  41 + #undef HAVE_ICONV
41 42 #undef HAVE_LIBM
42 43 #undef HAVE_LIBINTL
43 44 #undef HAVE_GETADDRINFO
... ...
src/lib3270/charset.c
... ... @@ -726,10 +726,15 @@ void set_display_charset(H3270 *session, const char *dcs)
726 726 session->charset = strdup(dcs);
727 727 }
728 728  
  729 +LIB3270_EXPORT const char * lib3270_get_default_charset(void)
  730 +{
  731 + return "ISO-8859-1";
  732 +}
  733 +
729 734 LIB3270_EXPORT const char * lib3270_get_charset(H3270 *session)
730 735 {
731 736 CHECK_SESSION_HANDLE(session);
732   - return session->charset ? session->charset : "ISO-8859-1";
  737 + return session->charset ? session->charset : lib3270_get_default_charset();
733 738 }
734 739  
735 740 static KeySym StringToKeysym(char *s)
... ...
src/plugins/rx3270/Makefile.in
... ... @@ -29,7 +29,7 @@
29 29 MODULE_NAME=rx3270
30 30 DEPENDS=*.h ../../include/*.h ../../include/lib3270/*.h Makefile
31 31 PLUGIN_SRC=pluginmain.cc
32   -EXTAPI_SRC=rxapimain.cc
  32 +EXTAPI_SRC=rxapimain.cc text.cc typed_routines.cc
33 33  
34 34 #---[ Tools ]------------------------------------------------------------------
35 35  
... ...
src/plugins/rx3270/rx3270.h
... ... @@ -38,13 +38,45 @@
38 38 #include <lib3270/log.h>
39 39 #include <oorexxapi.h>
40 40  
  41 +#ifdef HAVE_ICONV
  42 + #include <iconv.h>
  43 +#endif
  44 +
  45 +
41 46 /*---[ Exports ]---------------------------------------------------------------------------------------------*/
42 47  
43 48 LIB3270_EXPORT RexxRoutineEntry rx3270_functions[];
44 49 LIB3270_EXPORT RexxPackageEntry rx3270_package_entry;
45 50  
  51 +/*---[ Rexx entry points ]-----------------------------------------------------------------------------------*/
  52 +
  53 + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270version);
  54 + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270QueryCState);
  55 + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270Disconnect);
  56 + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270Connect);
  57 + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270isConnected);
  58 + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270WaitForEvents);
  59 + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270Sleep);
  60 + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270SendENTERKey);
  61 + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270SendPFKey);
  62 + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270SendPAKey);
  63 + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270WaitForTerminalReady);
  64 + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270WaitForStringAt);
  65 + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270GetStringAt);
  66 + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270IsTerminalReady);
  67 + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270ReadScreen);
  68 + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270queryStringAt);
  69 +
46 70 /*---[ Globals ]---------------------------------------------------------------------------------------------*/
47 71  
  72 + #define RX3270SESSION lib3270_get_default_session_handle()
  73 +
  74 + char * get_contents(H3270 *hSession, int start, int sz);
  75 +
  76 +#ifdef HAVE_ICONV
  77 + extern iconv_t outputConv;
  78 + extern iconv_t inputConv;
  79 +#endif
48 80  
49 81 /*--[ Prototipes ]-------------------------------------------------------------------------------------------*/
50 82  
... ...
src/plugins/rx3270/rxapimain.cc
... ... @@ -36,15 +36,29 @@
36 36 */
37 37  
38 38 #include "rx3270.h"
  39 + #include <lib3270/actions.h>
  40 +
  41 +#ifdef HAVE_ICONV
  42 + #include <iconv.h>
  43 +#endif
  44 +
  45 + #include <string.h>
39 46  
40 47 #if defined WIN32
  48 +
  49 + #define REXX_DEFAULT_CHARSET "CP1252"
  50 +
41 51 BOOL WINAPI DllMain(HANDLE hinst, DWORD dwcallpurpose, LPVOID lpvResvd);
42 52 static int librx3270_loaded(void);
43 53 static int librx3270_unloaded(void);
44 54 #else
  55 +
  56 + #define REXX_DEFAULT_CHARSET "UTF-8"
  57 +
45 58 int librx3270_loaded(void) __attribute__((constructor));
46 59 int librx3270_unloaded(void) __attribute__((destructor));
47 60 #endif
  61 +
48 62 /*--[ Implement ]------------------------------------------------------------------------------------*/
49 63  
50 64 #if defined WIN32
... ... @@ -68,44 +82,84 @@ BOOL WINAPI DllMain(HANDLE hinst, DWORD dwcallpurpose, LPVOID lpvResvd)
68 82  
69 83 int librx3270_loaded(void)
70 84 {
71   - trace("%s %04x %s %s",__FUNCTION__,REXX_CURRENT_INTERPRETER_VERSION,__DATE__,__TIME__);
  85 +#ifdef HAVE_ICONV
  86 + outputConv = iconv_open(REXX_DEFAULT_CHARSET, lib3270_get_default_charset());
  87 + inputConv = iconv_open(lib3270_get_default_charset(), REXX_DEFAULT_CHARSET);
  88 +#endif
  89 +
72 90 return 0;
73 91 }
74 92  
75 93 int librx3270_unloaded(void)
76 94 {
77   - trace("%s",__FUNCTION__);
78   - return 0;
79   -}
  95 +#ifdef HAVE_ICONV
80 96  
81   -RexxRoutine0(CSTRING, rx3270version)
82   -{
83   - return lib3270_get_version();
84   -}
  97 + if(outputConv != (iconv_t) (-1))
  98 + iconv_close(outputConv);
85 99  
86   -RexxRoutine0(CSTRING, rx3270QueryCState)
87   -{
88   - return "";
89   -}
  100 + if(inputConv != (iconv_t) (-1))
  101 + iconv_close(inputConv);
  102 +#endif
90 103  
91   -RexxRoutine0(int, rx3270Disconnect)
92   -{
93 104 return 0;
94 105 }
95 106  
96   -RexxRoutine2(int, rx3270Connect, CSTRING, hostname, int, timeout)
97   -{
98   - return 0;
99   -}
100 107  
  108 +/*
  109 +::method setStringAt
  110 + use arg row, col, str
  111 +return rx3270InputString(row,col,str)
  112 +
  113 +::method setCursorPosition
  114 + use arg row, col
  115 +return rx3270SetCursorPosition(row,col)
  116 +
  117 +::method RunMode
  118 +return rx3270QueryRunMode()
  119 +
  120 +::method 'encoding='
  121 + use arg ptr
  122 +return rx3270SetCharset(ptr)
  123 +
  124 +::method sendfile
  125 + use arg from, tostrncasecmp
  126 +
  127 + status = rx3270BeginFileSend(from,to)
  128 + if status <> 0
  129 + then return status
  130 +
  131 +return rx3270WaitForFTComplete()
  132 +
  133 +::method recvfile
  134 + use arg from, to
  135 +
  136 + status = rx3270BeginFileRecv(from,to)
  137 + if status <> 0
  138 + then return status
  139 +
  140 +return rx3270WaitForFTComplete()
  141 +*/
101 142  
102 143 // now build the actual entry list
103 144 RexxRoutineEntry rx3270_functions[] =
104 145 {
105   - REXX_TYPED_ROUTINE(rx3270version, rx3270version),
106   - REXX_TYPED_ROUTINE(rx3270QueryCState, rx3270QueryCState),
107   - REXX_TYPED_ROUTINE(rx3270Disconnect, rx3270Disconnect),
108   - REXX_TYPED_ROUTINE(rx3270Connect, rx3270Connect),
  146 + REXX_TYPED_ROUTINE(rx3270version, rx3270version),
  147 + REXX_TYPED_ROUTINE(rx3270QueryCState, rx3270QueryCState),
  148 + REXX_TYPED_ROUTINE(rx3270Disconnect, rx3270Disconnect),
  149 + REXX_TYPED_ROUTINE(rx3270Connect, rx3270Connect),
  150 + REXX_TYPED_ROUTINE(rx3270isConnected, rx3270isConnected),
  151 + REXX_TYPED_ROUTINE(rx3270WaitForEvents, rx3270WaitForEvents),
  152 + REXX_TYPED_ROUTINE(rx3270Sleep, rx3270Sleep),
  153 + REXX_TYPED_ROUTINE(rx3270SendENTERKey, rx3270SendENTERKey),
  154 + REXX_TYPED_ROUTINE(rx3270SendPFKey, rx3270SendPFKey),
  155 + REXX_TYPED_ROUTINE(rx3270SendPAKey, rx3270SendPAKey),
  156 + REXX_TYPED_ROUTINE(rx3270WaitForTerminalReady, rx3270WaitForTerminalReady),
  157 + REXX_TYPED_ROUTINE(rx3270WaitForStringAt, rx3270WaitForStringAt),
  158 + REXX_TYPED_ROUTINE(rx3270GetStringAt, rx3270GetStringAt),
  159 + REXX_TYPED_ROUTINE(rx3270IsTerminalReady, rx3270IsTerminalReady),
  160 + REXX_TYPED_ROUTINE(rx3270ReadScreen, rx3270ReadScreen),
  161 + REXX_TYPED_ROUTINE(rx3270queryStringAt, rx3270queryStringAt),
  162 +
109 163 REXX_LAST_METHOD()
110 164 };
111 165  
... ...
src/plugins/rx3270/text.cc 0 → 100644
... ... @@ -0,0 +1,81 @@
  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., 59 Temple
  19 + * Place, Suite 330, Boston, MA, 02111-1307, USA
  20 + *
  21 + * Este programa está nomeado como text.cc 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 + *
  28 + */
  29 +
  30 + #include "rx3270.h"
  31 + #include <lib3270/actions.h>
  32 +
  33 + #include <string.h>
  34 +
  35 +
  36 +/*--[ Globals ]--------------------------------------------------------------------------------------*/
  37 +
  38 +#ifdef HAVE_ICONV
  39 + iconv_t outputConv = (iconv_t) (-1);
  40 + iconv_t inputConv = (iconv_t) (-1);
  41 +#endif
  42 +
  43 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  44 +
  45 +char * get_contents(H3270 *hSession, int start, int sz)
  46 +{
  47 + unsigned char str[sz+1];
  48 + unsigned short attr[sz+1];
  49 +
  50 + if(!lib3270_get_contents(hSession,start,start+sz,str,attr))
  51 + return NULL;
  52 +
  53 +#ifdef HAVE_ICONV
  54 + // Convert received string to rexx encoding
  55 + if(outputConv != (iconv_t)(-1))
  56 + {
  57 + size_t in = strlen((char *) str);
  58 + size_t out = (in << 1);
  59 + char *ptr;
  60 + char *buffer = (char *) malloc(out);
  61 + char *ret;
  62 +
  63 + memset(ptr=buffer,0,out);
  64 +
  65 + iconv(outputConv,NULL,NULL,NULL,NULL); // Reset state
  66 +
  67 + if(iconv(outputConv,(char **) &str,&in,&ptr,&out) == ((size_t) -1))
  68 + ret = strdup((char *) str);
  69 + else
  70 + ret = strdup(buffer);
  71 +
  72 + free(buffer);
  73 +
  74 + return ret;
  75 + }
  76 +
  77 +#endif // HAVE_ICONV
  78 +
  79 + return strdup((char *) str);
  80 +}
  81 +
... ...
src/plugins/rx3270/typed_routines.cc 0 → 100644
... ... @@ -0,0 +1,244 @@
  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., 59 Temple
  19 + * Place, Suite 330, Boston, MA, 02111-1307, USA
  20 + *
  21 + * Este programa está nomeado como text.cc 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 + *
  28 + */
  29 +
  30 + #include "rx3270.h"
  31 + #include <lib3270/actions.h>
  32 +
  33 + #include <string.h>
  34 +
  35 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  36 +
  37 +RexxRoutine0(CSTRING, rx3270version)
  38 +{
  39 + return lib3270_get_version();
  40 +}
  41 +
  42 +RexxRoutine0(CSTRING, rx3270QueryCState)
  43 +{
  44 + #define DECLARE_XLAT_STATE( x ) { x, #x }
  45 +
  46 + static const struct _xlat_state
  47 + {
  48 + LIB3270_CSTATE state;
  49 + const char * ret;
  50 + } xlat_state[] =
  51 + {
  52 + { LIB3270_NOT_CONNECTED, "NOT_CONNECTED" },
  53 + { LIB3270_RESOLVING, "RESOLVING" },
  54 + { LIB3270_PENDING, "PENDING" },
  55 + { LIB3270_CONNECTED_INITIAL, "CONNECTED_INITIAL" },
  56 + { LIB3270_CONNECTED_ANSI, "CONNECTED_ANSI" },
  57 + { LIB3270_CONNECTED_3270, "CONNECTED_3270" },
  58 + { LIB3270_CONNECTED_INITIAL_E, "CONNECTED_INITIAL_E" },
  59 + { LIB3270_CONNECTED_NVT, "CONNECTED_NVT" },
  60 + { LIB3270_CONNECTED_SSCP, "CONNECTED_SSCP" },
  61 + { LIB3270_CONNECTED_TN3270E, "CONNECTED_TN3270E" },
  62 + };
  63 +
  64 + size_t f;
  65 + LIB3270_CSTATE state;
  66 +
  67 + state = lib3270_get_connection_state(RX3270SESSION);
  68 +
  69 + for(f=0;f < (sizeof(xlat_state)/sizeof(struct _xlat_state)); f++)
  70 + {
  71 + if(state == xlat_state[f].state)
  72 + return xlat_state[f].ret;
  73 + }
  74 +
  75 + return "UNEXPECTED";
  76 +}
  77 +
  78 +RexxRoutine0(int, rx3270Disconnect)
  79 +{
  80 + lib3270_disconnect(RX3270SESSION);
  81 + return 0;
  82 +}
  83 +
  84 +RexxRoutine2(int, rx3270Connect, CSTRING, hostname, int, wait)
  85 +{
  86 + return lib3270_connect(RX3270SESSION, hostname, wait);
  87 +}
  88 +
  89 +RexxRoutine0(int, rx3270isConnected)
  90 +{
  91 + return lib3270_is_connected(RX3270SESSION) ? 1 : 0;
  92 +}
  93 +
  94 +RexxRoutine0(int, rx3270WaitForEvents)
  95 +{
  96 + H3270 * hSession = RX3270SESSION;
  97 +
  98 + if(!lib3270_is_connected(hSession))
  99 + return ENOTCONN;
  100 +
  101 + lib3270_main_iterate(hSession,1);
  102 +
  103 + return 0;
  104 +}
  105 +
  106 +RexxRoutine1(int, rx3270Sleep, int, seconds)
  107 +{
  108 + return lib3270_wait(RX3270SESSION,seconds);
  109 +}
  110 +
  111 +RexxRoutine0(int, rx3270SendENTERKey)
  112 +{
  113 + return lib3270_enter(RX3270SESSION);
  114 +}
  115 +
  116 +RexxRoutine1(int, rx3270SendPFKey, int, key)
  117 +{
  118 + return lib3270_pfkey(RX3270SESSION,key);
  119 +}
  120 +
  121 +RexxRoutine1(int, rx3270SendPAKey, int, key)
  122 +{
  123 + return lib3270_pakey(RX3270SESSION,key);
  124 +}
  125 +
  126 +RexxRoutine1(int, rx3270WaitForTerminalReady, int, seconds)
  127 +{
  128 + return lib3270_wait_for_ready(RX3270SESSION,seconds);
  129 +}
  130 +
  131 +RexxRoutine4(int, rx3270WaitForStringAt, int, row, int, col, CSTRING, key, int, timeout)
  132 +{
  133 + H3270 * hSession = RX3270SESSION;
  134 + time_t end = time(0) + timeout;
  135 + int sz = strlen(key);
  136 + int rows;
  137 + int cols;
  138 + int start;
  139 +
  140 + lib3270_get_screen_size(hSession,&rows,&cols);
  141 +
  142 + if(row < 0 || row > rows || col < 0 || col > cols)
  143 + return EINVAL;
  144 +
  145 + start = ((row) * cols) + col;
  146 +
  147 + while(time(0) < end)
  148 + {
  149 + if(!lib3270_is_connected(hSession))
  150 + {
  151 + return ENOTCONN;
  152 + }
  153 + else if(lib3270_is_ready(hSession))
  154 + {
  155 + char *buffer = get_contents(hSession, start, start+sz);
  156 + if(buffer)
  157 + {
  158 + int rc = strncasecmp((const char *) buffer,key,sz);
  159 + free(buffer);
  160 + if(rc == 0)
  161 + return 0;
  162 + }
  163 + }
  164 +
  165 + lib3270_main_iterate(hSession,1);
  166 +
  167 + }
  168 +
  169 + return ETIMEDOUT;
  170 +
  171 +}
  172 +
  173 +RexxRoutine3(RexxStringObject, rx3270GetStringAt, int, row, int, col, int, sz)
  174 +{
  175 + H3270 * hSession = RX3270SESSION;
  176 + int rows;
  177 + int cols;
  178 + char * text;
  179 +
  180 + lib3270_get_screen_size(hSession,&rows,&cols);
  181 +
  182 + text = get_contents(hSession, ((row) * cols) + col, sz);
  183 + if(text)
  184 + {
  185 + RexxStringObject ret = context->String((CSTRING) text);
  186 + free(text);
  187 + return ret;
  188 + }
  189 +
  190 + return context->String("");
  191 +}
  192 +
  193 +RexxRoutine0(int, rx3270IsTerminalReady)
  194 +{
  195 + return lib3270_is_ready(RX3270SESSION);
  196 +}
  197 +
  198 +RexxRoutine3(RexxStringObject, rx3270ReadScreen, OPTIONAL_int, row, OPTIONAL_int, col, OPTIONAL_int, sz)
  199 +{
  200 + H3270 * hSession = RX3270SESSION;
  201 + int rows;
  202 + int cols;
  203 + char * text;
  204 + int start;
  205 +
  206 + lib3270_get_screen_size(hSession,&rows,&cols);
  207 +
  208 + start = (row * cols) + col;
  209 +
  210 + if(sz == 0)
  211 + sz = (rows*cols) - start;
  212 +
  213 + text = get_contents(hSession, start, sz);
  214 + if(text)
  215 + {
  216 + RexxStringObject ret = context->String((CSTRING) text);
  217 + free(text);
  218 + return ret;
  219 + }
  220 +
  221 + return context->String("");
  222 +}
  223 +
  224 +RexxRoutine3(int, rx3270queryStringAt, int, row, int, col, CSTRING, key)
  225 +{
  226 + H3270 * hSession = RX3270SESSION;
  227 + int rows;
  228 + int cols;
  229 + char * text;
  230 + size_t sz = strlen(key);
  231 +
  232 + lib3270_get_screen_size(hSession,&rows,&cols);
  233 +
  234 + text = get_contents(hSession, (row * cols) + col, sz);
  235 + if(text)
  236 + {
  237 + int rc = strncasecmp(text,key,sz);
  238 + free(text);
  239 + return rc;
  240 + }
  241 +
  242 + return 0;
  243 +}
  244 +
... ...