From 04c0ee5c557d63f0eb15ac0e7f0496d0ae7a5a6f Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Fri, 21 Dec 2018 17:32:32 -0200 Subject: [PATCH] + Changing the management method for the action tables. --- lib3270.cbp | 3 +++ src/include/lib3270/action_table.h | 88 +++++++++++++++++++++++++++++++++++++++++++++------------------------------------------- src/include/lib3270/actions.h | 58 ---------------------------------------------------------- src/lib3270/Makefile.in | 21 +++++++++++++++++++-- src/lib3270/actions.c | 10 +++++----- src/lib3270/charset.c | 14 +++++++------- src/lib3270/kybd.c | 323 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/lib3270/macros.c | 8 ++++---- src/lib3270/mkactions/mkactions.c | 189 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib3270/mkactions/mkactions.cbp | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/lib3270/paste.c | 4 ++-- src/lib3270/screen.c | 21 ++++++++------------- src/lib3270/selection.c | 12 +++++------- 13 files changed, 466 insertions(+), 330 deletions(-) delete mode 100644 src/include/lib3270/actions.h create mode 100644 src/lib3270/mkactions/mkactions.c create mode 100644 src/lib3270/mkactions/mkactions.cbp diff --git a/lib3270.cbp b/lib3270.cbp index eb6b8d5..7f73799 100644 --- a/lib3270.cbp +++ b/lib3270.cbp @@ -163,6 +163,9 @@ + + diff --git a/src/include/lib3270/action_table.h b/src/include/lib3270/action_table.h index 3c0b1f5..7fb6097 100644 --- a/src/include/lib3270/action_table.h +++ b/src/include/lib3270/action_table.h @@ -39,53 +39,55 @@ */ /* Keyboard actions */ - DECLARE_LIB3270_KEY_ACTION( enter ) + DECLARE_LIB3270_KEY_ACTION( enter, "Send an \"Enter\" action." ) - DECLARE_LIB3270_FKEY_ACTION( pfkey ) - DECLARE_LIB3270_FKEY_ACTION( pakey ) + DECLARE_LIB3270_FKEY_ACTION( pfkey, "" ) + DECLARE_LIB3270_FKEY_ACTION( pakey, "" ) /* Cursor movement */ - DECLARE_LIB3270_CURSOR_ACTION( up ) - DECLARE_LIB3270_CURSOR_ACTION( down ) - DECLARE_LIB3270_CURSOR_ACTION( left ) - DECLARE_LIB3270_CURSOR_ACTION( right ) - DECLARE_LIB3270_CURSOR_ACTION( newline ) + DECLARE_LIB3270_CURSOR_ACTION( up, "Cursor up 1 position." ) + DECLARE_LIB3270_CURSOR_ACTION( down, "Cursor down 1 position." ) + DECLARE_LIB3270_CURSOR_ACTION( left, "Cursor left 1 position." ) + DECLARE_LIB3270_CURSOR_ACTION( right, "Cursor right 1 position." ) + + DECLARE_LIB3270_ACTION( newline, "Cursor to first field on next line or any lines after that." ) /* Misc actions */ - DECLARE_LIB3270_ACTION( kybdreset ) - DECLARE_LIB3270_ACTION( clear ) - DECLARE_LIB3270_ACTION( eraseinput ) - - DECLARE_LIB3270_ACTION( select_field ) - DECLARE_LIB3270_ACTION( select_all ) - DECLARE_LIB3270_ACTION( unselect ) - DECLARE_LIB3270_ACTION( reselect ) - - DECLARE_LIB3270_ACTION( firstfield ) - DECLARE_LIB3270_ACTION( eraseeof ) - DECLARE_LIB3270_ACTION( eraseeol ) - DECLARE_LIB3270_ACTION( erase ) - DECLARE_LIB3270_ACTION( delete ) - DECLARE_LIB3270_ACTION( dup ) - DECLARE_LIB3270_ACTION( fieldmark ) - - DECLARE_LIB3270_ACTION( backspace ) - DECLARE_LIB3270_ACTION( previousword ) - DECLARE_LIB3270_ACTION( nextword ) - DECLARE_LIB3270_ACTION( fieldend ) - - DECLARE_LIB3270_ACTION( nextfield ) - DECLARE_LIB3270_ACTION( previousfield ) - - DECLARE_LIB3270_ACTION( attn ) - DECLARE_LIB3270_ACTION( break ) - DECLARE_LIB3270_ACTION( pastenext ) - - DECLARE_LIB3270_ACTION( deleteword ) - DECLARE_LIB3270_ACTION( deletefield ) - DECLARE_LIB3270_ACTION( sysreq ) - - DECLARE_LIB3270_ACTION( testpattern ) - DECLARE_LIB3270_ACTION( charsettable ) + DECLARE_LIB3270_ACTION( kybdreset, "" ) + DECLARE_LIB3270_ACTION( clear, "Clear AID key" ) + DECLARE_LIB3270_ACTION( eraseinput, "" ) + + DECLARE_LIB3270_ACTION( select_field, "" ) + DECLARE_LIB3270_ACTION( select_all, "" ) + DECLARE_LIB3270_ACTION( unselect, "" ) + DECLARE_LIB3270_ACTION( reselect, "" ) + + DECLARE_LIB3270_ACTION( eraseeof, "Erase End Of Field Key." ) + DECLARE_LIB3270_ACTION( eraseeol, "Erase End Of Line Key." ) + DECLARE_LIB3270_ACTION( erase, "" ) + DECLARE_LIB3270_ACTION( delete, "" ) + DECLARE_LIB3270_ACTION( dup, "DUP key" ) + DECLARE_LIB3270_ACTION( fieldmark, "FM key" ) + + DECLARE_LIB3270_ACTION( backspace, "3270-style backspace." ) + + DECLARE_LIB3270_ACTION( previousword, "Cursor to previous word." ) + DECLARE_LIB3270_ACTION( nextword, "Cursor to next unprotected word." ) + DECLARE_LIB3270_ACTION( fieldend, "Move the cursor to the first blank after the last nonblank in the field." ) + + DECLARE_LIB3270_ACTION( firstfield, "Move to first unprotected field on screen." ) + DECLARE_LIB3270_ACTION( nextfield, "" ) + DECLARE_LIB3270_ACTION( previousfield, "Tab backward to previous field." ) + + DECLARE_LIB3270_ACTION( attn, "ATTN key, per RFC 2355. Sends IP, regardless." ) + DECLARE_LIB3270_ACTION( break, "" ) + DECLARE_LIB3270_ACTION( pastenext, "" ) + + DECLARE_LIB3270_ACTION( deleteword, "Backspaces the cursor until it hits the front of a word (does a ^W)." ) + DECLARE_LIB3270_ACTION( deletefield, "Delete field key (does a ^U)." ) + DECLARE_LIB3270_ACTION( sysreq, "" ) + + DECLARE_LIB3270_ACTION( testpattern, "" ) + DECLARE_LIB3270_ACTION( charsettable, "" ) diff --git a/src/include/lib3270/actions.h b/src/include/lib3270/actions.h deleted file mode 100644 index ce16be4..0000000 --- a/src/include/lib3270/actions.h +++ /dev/null @@ -1,58 +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. - * - * 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., 51 Franklin - * St, Fifth Floor, Boston, MA 02110-1301 USA - * - * Este programa está nomeado como actions.h e possui - linhas de código. - * - * Contatos: - * - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) - * erico.mendonca@gmail.com (Erico Mascarenhas de 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) - * - */ - -#ifdef __cplusplus - extern "C" { -#endif - - // Standard actions - #define DECLARE_LIB3270_ACTION( name ) LIB3270_EXPORT int lib3270_ ## name (H3270 *hSession); - #define LIB3270_ACTION( name ) LIB3270_EXPORT int lib3270_ ## name (H3270 *hSession) - - // Single key actions - #define DECLARE_LIB3270_KEY_ACTION( name ) LIB3270_EXPORT int lib3270_ ## name (H3270 *hSession); - #define LIB3270_KEY_ACTION( name ) LIB3270_EXPORT int lib3270_ ## name (H3270 *hSession) - - // Cursor actions - #define DECLARE_LIB3270_CURSOR_ACTION( name ) LIB3270_EXPORT int lib3270_cursor_ ## name (H3270 *hSession); - #define LIB3270_CURSOR_ACTION( name ) LIB3270_EXPORT int lib3270_cursor_ ## name (H3270 *hSession) - - // PF & PA key actions - #define DECLARE_LIB3270_FKEY_ACTION( name ) LIB3270_EXPORT int lib3270_ ## name (H3270 *hSession, int key); - #define LIB3270_FKEY_ACTION( name ) LIB3270_EXPORT int lib3270_ ## name (H3270 *hSession, int key) - - // Load action table entries - #include - -#ifdef __cplusplus - } -#endif diff --git a/src/lib3270/Makefile.in b/src/lib3270/Makefile.in index 568e357..73721c5 100644 --- a/src/lib3270/Makefile.in +++ b/src/lib3270/Makefile.in @@ -84,8 +84,8 @@ DEPENDS= \ Makefile \ ../include/*.h \ ../include/lib3270/*.h \ - ../lib3270/*.h - + ../lib3270/*.h \ + $(BASEDIR)/src/include/lib3270/actions.h CFLAGS= \ @CFLAGS@ \ @@ -286,6 +286,21 @@ $(BASEDIR)/.tmp/$(LIBNAME)/fallbacks.c: \ @$(HOST_CC) -g -o $(BINDIR)/mkfb@EXEEXT@ $(wildcard mkfb/*.c) @$(BINDIR)/mkfb@EXEEXT@ -c X3270.xad $@ +$(BASEDIR)/src/include/lib3270/actions.h: \ + ../include/lib3270/action_table.h \ + $(wildcard mkactions/*.c) + + @$(MKDIR) `dirname $@` + @$(MKDIR) $(BINDIR) + @echo $< ... + @$(HOST_CC) \ + -g \ + -I../include \ + -DBUILD_DATE=`date +%Y%m%d` \ + -o $(BINDIR)/mkactions@EXEEXT@ \ + $(wildcard mkactions/*.c) + @$(BINDIR)/mkactions@EXEEXT@ -o $@ + $(POTDIR)/$(LIBNAME).pot: \ $(foreach SRC, $(basename $(SOURCES)), $(POTDIR)/$(LIBNAME)/$(SRC).pot) @@ -369,6 +384,7 @@ cleanDebug: @rm -fr $(OBJDBG) @rm -fr $(BINDBG) + @rm -fr $(BASEDIR)/src/include/lib3270/actions.h cleanRelease: @@ -376,6 +392,7 @@ cleanRelease: @rm -fr $(BINRLS) @rm -fr $(POTDIR) @rm -f lib$(LIBNAME).pot + @rm -fr $(BASEDIR)/src/include/lib3270/actions.h clean: \ cleanDebug \ diff --git a/src/lib3270/actions.c b/src/lib3270/actions.c index 85a6c7c..85ab8bf 100644 --- a/src/lib3270/actions.c +++ b/src/lib3270/actions.c @@ -48,11 +48,11 @@ LIB3270_EXPORT int lib3270_action(H3270 *hSession, const char *name) #undef DECLARE_LIB3270_CURSOR_ACTION #undef DECLARE_LIB3270_FKEY_ACTION - #define DECLARE_LIB3270_ACTION( name ) { #name, lib3270_ ## name }, - #define DECLARE_LIB3270_CLEAR_SELECTION_ACTION( name ) { #name, lib3270_ ## name }, - #define DECLARE_LIB3270_KEY_ACTION( name ) { #name, lib3270_ ## name }, - #define DECLARE_LIB3270_CURSOR_ACTION( name ) { #name, lib3270_cursor_ ## name }, - #define DECLARE_LIB3270_FKEY_ACTION( name ) // name + #define DECLARE_LIB3270_ACTION( name, description ) { #name, lib3270_ ## name }, + #define DECLARE_LIB3270_CLEAR_SELECTION_ACTION( name, description ) { #name, lib3270_ ## name }, + #define DECLARE_LIB3270_KEY_ACTION( name, description ) { #name, lib3270_ ## name }, + #define DECLARE_LIB3270_CURSOR_ACTION( name, description ) { #name, lib3270_cursor_ ## name }, + #define DECLARE_LIB3270_FKEY_ACTION( name, description ) // name static const struct _action { diff --git a/src/lib3270/charset.c b/src/lib3270/charset.c index b1f1878..3f76b82 100644 --- a/src/lib3270/charset.c +++ b/src/lib3270/charset.c @@ -204,9 +204,9 @@ static const unsigned short asc2uc[UT_SIZE] = typedef struct _info { - const char * name; - unsigned long cgcsgid; - const unsigned short const * chr; + const char * name; + unsigned long cgcsgid; + const unsigned short * chr; } remap; static const remap charset[] = @@ -214,7 +214,7 @@ static const remap charset[] = { "us", LIB3270_DEFAULT_CGEN | LIB3270_DEFAULT_CSET, - (const unsigned short const []) + (const unsigned short []) { 0x0000, 0x0000 } @@ -223,7 +223,7 @@ static const remap charset[] = { "bracket", LIB3270_DEFAULT_CGEN|LIB3270_DEFAULT_CSET, - (const unsigned short const []) + (const unsigned short []) { 0x00ad, '[', 0x00ba, XK_Yacute, @@ -236,7 +236,7 @@ static const remap charset[] = { "cp500", LIB3270_DEFAULT_CGEN|0x000001F4, - (const unsigned short const []) + (const unsigned short []) { 0x004a, '[', 0x004f, '!', @@ -345,7 +345,7 @@ LIB3270_EXPORT const char * lib3270_get_host_charset(H3270 *hSession) return hSession->charset.host; } -LIB3270_ACTION( charsettable ) +LIB3270_EXPORT int lib3270_charsettable(H3270 *hSession) { static const char * hChars = "0123456789ABCDEF"; static const char * label = "Name:"; diff --git a/src/lib3270/kybd.c b/src/lib3270/kybd.c index b998d52..b441619 100644 --- a/src/lib3270/kybd.c +++ b/src/lib3270/kybd.c @@ -51,31 +51,21 @@ struct ta; #if defined(X3270_APL) /*[*/ #define XK_APL #endif /*]*/ -// #include #include #include "3270ds.h" -// #include "appres.h" -// #include "ctlr.h" #include "resources.h" -//#include "actionsc.h" #include "ansic.h" -//#include "aplc.h" #include "ctlrc.h" #include "ftc.h" #include "hostc.h" -// #include "keypadc.h" #include "kybdc.h" #include "popupsc.h" // #include "printc.h" #include "screenc.h" #include "screen.h" -// #if defined(X3270_DISPLAY) /*[*/ -// #include "selectc.h" -// #endif /*]*/ #include "statusc.h" -// #include "tablesc.h" #include "telnetc.h" #include "togglesc.h" #include "trace_dsc.h" @@ -84,6 +74,9 @@ struct ta; #if defined(X3270_DBCS) /*[*/ #include "widec.h" #endif /*]*/ + +#include + #include "api.h" @@ -526,14 +519,15 @@ static void key_AID(H3270 *hSession, unsigned char aid_code) status_ctlr_done(hSession); } -LIB3270_FKEY_ACTION( pfkey ) +LIB3270_EXPORT int lib3270_pfkey(H3270 *hSession, int key) { + FAIL_IF_NOT_ONLINE(hSession) if (key < 1 || key > PF_SZ) - return EINVAL; + return errno = EINVAL; if (hSession->kybdlock & KL_OIA_MINUS) - return -1; + return errno = EPERM; if (hSession->kybdlock) { @@ -553,15 +547,17 @@ LIB3270_FKEY_ACTION( pfkey ) return 0; } -LIB3270_FKEY_ACTION( pakey ) +LIB3270_EXPORT int lib3270_pakey(H3270 *hSession, int key) { + FAIL_IF_NOT_ONLINE(hSession) + if (key < 1 || key > PA_SZ) { - return EINVAL; + return errno = EINVAL; } if (hSession->kybdlock & KL_OIA_MINUS) - return -1; + return errno = EPERM; else if (hSession->kybdlock) enq_key(hSession,pa_xlate[key-1]); else @@ -570,23 +566,23 @@ LIB3270_FKEY_ACTION( pakey ) return 0; } -LIB3270_ACTION(break) +LIB3270_EXPORT int lib3270_break(H3270 *hSession) { if (!IN_3270) - return 0; + return errno = ENOTCONN; net_break(hSession); return 0; } -/* - * ATTN key, per RFC 2355. Sends IP, regardless. +/*** + * @brief ATTN key, per RFC 2355. Sends IP, regardless. */ -LIB3270_ACTION(attn) +LIB3270_EXPORT int lib3270_attn(H3270 *hSession) { if (!IN_3270) - return 0; + return errno = ENOTCONN; net_interrupt(hSession); @@ -1018,10 +1014,10 @@ void key_ACharacter(H3270 *hSession, unsigned char c, enum keytype keytype, enum } } -LIB3270_ACTION( nextfield ) +LIB3270_EXPORT int lib3270_nextfield(H3270 *hSession) { -// reset_idle_timer(); + FAIL_IF_NOT_ONLINE(hSession); if (hSession->kybdlock) { @@ -1060,16 +1056,15 @@ LIB3270_EXPORT int lib3270_clear_operator_error(H3270 *hSession) return EINVAL; } - -/* - * Tab backward to previous field. +/** + * @brief Tab backward to previous field. */ -LIB3270_ACTION( previousfield ) +LIB3270_EXPORT int lib3270_previousfield(H3270 *hSession) { register int baddr, nbaddr; int sbaddr; -// reset_idle_timer(); + FAIL_IF_NOT_ONLINE(hSession); if (hSession->kybdlock) { @@ -1187,20 +1182,20 @@ void do_reset(H3270 *hSession, Boolean explicit) } -LIB3270_ACTION( kybdreset ) +LIB3270_EXPORT int lib3270_kybdreset(H3270 *hSession) { lib3270_unselect(hSession); do_reset(hSession,True); return 0; } - -/* - * Move to first unprotected field on screen. +/** + * @brief Move to first unprotected field on screen. */ -LIB3270_ACTION( firstfield ) +LIB3270_EXPORT int lib3270_firstfield(H3270 *hSession) { -// reset_idle_timer(); + FAIL_IF_NOT_ONLINE(hSession); + if (hSession->kybdlock) { ENQUEUE_ACTION(lib3270_firstfield); @@ -1222,9 +1217,8 @@ LIB3270_ACTION( firstfield ) return 0; } - -/* - * Cursor left 1 position. +/** + * @brief Cursor left 1 position. */ static void do_left(H3270 *hSession) { @@ -1239,8 +1233,10 @@ static void do_left(H3270 *hSession) cursor_move(hSession,baddr); } -LIB3270_CURSOR_ACTION( left ) +LIB3270_EXPORT int lib3270_cursor_left(H3270 *hSession) { + FAIL_IF_NOT_ONLINE(hSession); + if (hSession->kybdlock) { if(KYBDLOCK_IS_OERR(hSession)) @@ -1278,9 +1274,8 @@ LIB3270_CURSOR_ACTION( left ) return 0; } - /** - * Delete char key. + * @brief Delete char key. * * @param hSession Session handle * @@ -1375,8 +1370,10 @@ static Boolean do_delete(H3270 *hSession) return True; } -LIB3270_ACTION( delete ) +LIB3270_EXPORT int lib3270_delete(H3270 *hSession) { + FAIL_IF_NOT_ONLINE(hSession); + if (hSession->kybdlock) { ENQUEUE_ACTION(lib3270_delete); @@ -1403,12 +1400,13 @@ LIB3270_ACTION( delete ) return 0; } - -/* - * 3270-style backspace. +/** + * @brief 3270-style backspace. */ -LIB3270_ACTION( backspace ) +LIB3270_EXPORT int lib3270_backspace(H3270 *hSession) { + FAIL_IF_NOT_ONLINE(hSession); + if (hSession->kybdlock) { ENQUEUE_ACTION( lib3270_backspace ); @@ -1435,9 +1433,8 @@ LIB3270_ACTION( backspace ) return 0; } - -/* - * Destructive backspace, like Unix "erase". +/** + * @brief Destructive backspace, like Unix "erase". */ static void do_erase(H3270 *hSession) { @@ -1501,9 +1498,10 @@ static void do_erase(H3270 *hSession) hSession->cbk.display(hSession); } -LIB3270_ACTION( erase ) +int lib3270_erase(H3270 *hSession) { -// reset_idle_timer(); + FAIL_IF_NOT_ONLINE(hSession); + if (hSession->kybdlock) { ENQUEUE_ACTION(lib3270_erase); @@ -1521,13 +1519,15 @@ LIB3270_ACTION( erase ) } /** - * Cursor right 1 position. + * @brief Cursor right 1 position. */ -LIB3270_CURSOR_ACTION( right ) +LIB3270_EXPORT int lib3270_cursor_right(H3270 *hSession) { register int baddr; enum dbcs_state d; + FAIL_IF_NOT_ONLINE(hSession); + if (hSession->kybdlock) { if (KYBDLOCK_IS_OERR(hSession)) @@ -1563,18 +1563,18 @@ LIB3270_CURSOR_ACTION( right ) return 0; } - -/* - * Cursor to previous word. +/** + * @brief Cursor to previous word. */ -LIB3270_ACTION( previousword ) +LIB3270_EXPORT int lib3270_previousword(H3270 *hSession) { register int baddr; int baddr0; unsigned char c; Boolean prot; -// reset_idle_timer(); + FAIL_IF_NOT_ONLINE(hSession); + if (hSession->kybdlock) { ENQUEUE_ACTION(lib3270_previousword); // enq_ta(PreviousWord_action, CN, CN); @@ -1688,15 +1688,16 @@ static int nt_word(H3270 *hSession, int baddr) } -/* - * Cursor to next unprotected word. +/** + * @brief Cursor to next unprotected word. */ -LIB3270_ACTION( nextword ) +LIB3270_EXPORT int lib3270_nextword(H3270 *hSession) { register int baddr; unsigned char c; -// reset_idle_timer(); + FAIL_IF_NOT_ONLINE(hSession); + if (hSession->kybdlock) { ENQUEUE_ACTION( lib3270_nextword ); // enq_ta(NextWord_action, CN, CN); @@ -1753,19 +1754,15 @@ LIB3270_ACTION( nextword ) return 0; } - - /** - * Cursor up 1 position. - * - * @return 0 - * + * @brief Cursor up 1 position. */ -LIB3270_CURSOR_ACTION( up ) +LIB3270_EXPORT int lib3270_cursor_up(H3270 *hSession) { register int baddr; -// reset_idle_timer(); + FAIL_IF_NOT_ONLINE(hSession); + if (hSession->kybdlock) { if (KYBDLOCK_IS_OERR(hSession)) @@ -1794,16 +1791,15 @@ LIB3270_CURSOR_ACTION( up ) } /** - * Cursor down 1 position. - * - * @return 0 + * @brief Cursor down 1 position. * */ -LIB3270_CURSOR_ACTION( down ) +LIB3270_EXPORT int lib3270_cursor_down(H3270 *hSession) { register int baddr; -// reset_idle_timer(); + FAIL_IF_NOT_ONLINE(hSession); + if (hSession->kybdlock) { if (KYBDLOCK_IS_OERR(hSession)) @@ -1829,18 +1825,19 @@ LIB3270_CURSOR_ACTION( down ) return 0; } - /** - * Cursor to first field on next line or any lines after that. + * @brief Cursor to first field on next line or any lines after that. */ -LIB3270_CURSOR_ACTION( newline ) +LIB3270_EXPORT int lib3270_newline(H3270 *hSession) { register int baddr, faddr; register unsigned char fa; + FAIL_IF_NOT_ONLINE(hSession); + if (hSession->kybdlock) { - ENQUEUE_ACTION(lib3270_cursor_newline); + ENQUEUE_ACTION(lib3270_newline); return 0; } #if defined(X3270_ANSI) /*[*/ @@ -1862,12 +1859,13 @@ LIB3270_CURSOR_ACTION( newline ) return 0; } - -/* - * DUP key +/** + * @brief DUP key */ -LIB3270_ACTION( dup ) +LIB3270_EXPORT int lib3270_dup(H3270 *hSession) { + FAIL_IF_NOT_ONLINE(hSession); + if (hSession->kybdlock) { ENQUEUE_ACTION(lib3270_dup); @@ -1886,11 +1884,13 @@ LIB3270_ACTION( dup ) return 0; } -/* - * FM key +/** + * @brief FM key */ -LIB3270_ACTION( fieldmark ) +LIB3270_EXPORT int lib3270_fieldmark(H3270 *hSession) { + FAIL_IF_NOT_ONLINE(hSession); + if (hSession->kybdlock) { ENQUEUE_ACTION(lib3270_fieldmark); @@ -1906,36 +1906,50 @@ LIB3270_ACTION( fieldmark ) } /** - * Send an "Enter" action. + * @brief Send an "Enter" action. * * Called when the user press the key enter. * - * @return 0 if ok, -1 if the action can't be performed. - * */ -LIB3270_KEY_ACTION( enter ) +LIB3270_EXPORT int lib3270_enter(H3270 *hSession) { + FAIL_IF_NOT_ONLINE(hSession); + trace("%s (kybdlock & KL_OIA_MINUS): %d kybdlock: %d",__FUNCTION__,(hSession->kybdlock & KL_OIA_MINUS),hSession->kybdlock); if (hSession->kybdlock & KL_OIA_MINUS) + { + errno = EPERM; return -1; + } else if (hSession->kybdlock) + { ENQUEUE_ACTION(lib3270_enter); + } else + { key_AID(hSession,AID_ENTER); + } return 0; } -LIB3270_ACTION( sysreq ) +LIB3270_EXPORT int lib3270_sysreq(H3270 *hSession) { -// reset_idle_timer(); + FAIL_IF_NOT_ONLINE(hSession); + if (IN_ANSI) + { + errno = ENOTCONN; return 0; + } + #if defined(X3270_TN3270E) /*[*/ - if (IN_E) { + if (IN_E) + { net_abort(hSession); - } else + } + else #endif /*]*/ { if (hSession->kybdlock & KL_OIA_MINUS) @@ -1945,14 +1959,14 @@ LIB3270_ACTION( sysreq ) else key_AID(hSession,AID_SYSREQ); } + return 0; } - -/* - * Clear AID key +/** + * @brief Clear AID key */ -LIB3270_ACTION( clear ) +LIB3270_EXPORT int lib3270_clear(H3270 *hSession) { // reset_idle_timer(); if (hSession->kybdlock & KL_OIA_MINUS) @@ -1976,10 +1990,10 @@ LIB3270_ACTION( clear ) } /** - * Erase End Of Line Key. + * @brief Erase End Of Line Key. * */ -LIB3270_ACTION( eraseeol ) +LIB3270_EXPORT int lib3270_eraseeol(H3270 *hSession) { register int baddr; register unsigned char fa; @@ -2044,10 +2058,10 @@ LIB3270_ACTION( eraseeol ) } /** - * Erase End Of Field Key. + * @brief Erase End Of Field Key. * */ -LIB3270_ACTION( eraseeof ) +LIB3270_EXPORT int lib3270_eraseeof(H3270 *hSession) { register int baddr; register unsigned char fa; @@ -2100,7 +2114,7 @@ LIB3270_ACTION( eraseeof ) return 0; } -LIB3270_ACTION( eraseinput ) +LIB3270_EXPORT int lib3270_eraseinput(H3270 *hSession) { register int baddr, sbaddr; unsigned char fa; @@ -2157,15 +2171,16 @@ LIB3270_ACTION( eraseinput ) } - -/* - * Delete word key. Backspaces the cursor until it hits the front of a word, +/** + * @brief Delete word key. + + * Backspaces the cursor until it hits the front of a word, * deletes characters until it hits a blank or null, and deletes all of these * but the last. * * Which is to say, does a ^W. */ -LIB3270_ACTION( deleteword ) +LIB3270_EXPORT int lib3270_deleteword(H3270 *hSession) { register int baddr; register unsigned char fa; @@ -2225,14 +2240,16 @@ LIB3270_ACTION( deleteword ) return 0; } -/* - * Delete field key. Similar to EraseEOF, but it wipes out the entire field +/** + * @brief Delete field key. + + * Similar to EraseEOF, but it wipes out the entire field * rather than just to the right of the cursor, and it leaves the cursor at * the front of the field. * * Which is to say, does a ^U. */ -LIB3270_ACTION( deletefield ) +LIB3270_EXPORT int lib3270_deletefield(H3270 *hSession) { register int baddr; register unsigned char fa; @@ -2272,72 +2289,14 @@ LIB3270_ACTION( deletefield ) } - -/* - * Set insert mode key. - */ /* -void -Insert_action(Widget w unused, XEvent *event, String *params, Cardinal *num_params) -{ -// reset_idle_timer(); - if (kybdlock) { - enq_ta(Insert_action, CN, CN); - return; - } -#if defined(X3270_ANSI) - if (IN_ANSI) - return; -#endif - set_toggle(INSERT,True); -} -*/ - - -/* - * Toggle insert mode key. - */ /* -void -ToggleInsert_action(Widget w unused, XEvent *event, String *params, Cardinal *num_params) -{ -// reset_idle_timer(); - if (kybdlock) { - enq_ta(ToggleInsert_action, CN, CN); - return; - } -#if defined(X3270_ANSI) - if (IN_ANSI) - return; -#endif - - do_toggle(INSERT); -} -*/ - - -/* - * Toggle reverse mode key. - */ /* -void -ToggleReverse_action(Widget w unused, XEvent *event, String *params, Cardinal *num_params) -{ -// reset_idle_timer(); - if (kybdlock) { - enq_ta(ToggleReverse_action, CN, CN); - return; - } -#if defined(X3270_ANSI) - if (IN_ANSI) - return; -#endif - reverse_mode(!reverse); -} */ - - -/* +/** + * @brief Move the cursor to the first blank after the last nonblank in the field. + * * Move the cursor to the first blank after the last nonblank in the * field, or if the field is full, to the last character in the field. + * */ -LIB3270_ACTION( fieldend ) +LIB3270_EXPORT int lib3270_fieldend(H3270 *hSession) { int baddr; @@ -2400,7 +2359,7 @@ int lib3270_get_field_end(H3270 *hSession, int baddr) } /** - * PA key action for String actions + * @brief PA key action for String actions. */ static void do_pa(H3270 *hSession, unsigned n) { @@ -2415,7 +2374,7 @@ static void do_pa(H3270 *hSession, unsigned n) } /** - * PF key action for String actions + * @brief PF key action for String actions. */ static void do_pf(H3270 *hSession, unsigned n) { @@ -2429,20 +2388,6 @@ static void do_pf(H3270 *hSession, unsigned n) } /* - * Set or clear the keyboard scroll lock. - */ /* -void -kybd_scroll_lock(Boolean lock) -{ - if (!IN_3270) - return; - if (lock) - kybdlock_set(KL_SCROLLED, "kybd_scroll_lock"); - else - kybdlock_clr(hSession, KL_SCROLLED, "kybd_scroll_lock"); -} */ - -/* * Move the cursor back within the legal paste area. * Returns a Boolean indicating success. */ diff --git a/src/lib3270/macros.c b/src/lib3270/macros.c index 697e47b..5d78ee3 100644 --- a/src/lib3270/macros.c +++ b/src/lib3270/macros.c @@ -356,10 +356,10 @@ } action[] = { - #define DECLARE_LIB3270_ACTION( name ) { #name, lib3270_ ## name }, - #define DECLARE_LIB3270_KEY_ACTION( name ) { #name, lib3270_ ## name }, - #define DECLARE_LIB3270_CURSOR_ACTION( name ) { #name, lib3270_cursor_ ## name }, - #define DECLARE_LIB3270_FKEY_ACTION( name ) /* */ + #define DECLARE_LIB3270_ACTION( name, description ) { #name, lib3270_ ## name }, + #define DECLARE_LIB3270_KEY_ACTION( name, description ) { #name, lib3270_ ## name }, + #define DECLARE_LIB3270_CURSOR_ACTION( name, description ) { #name, lib3270_cursor_ ## name }, + #define DECLARE_LIB3270_FKEY_ACTION( name, description ) /* */ #include diff --git a/src/lib3270/mkactions/mkactions.c b/src/lib3270/mkactions/mkactions.c new file mode 100644 index 0000000..4ee48f5 --- /dev/null +++ b/src/lib3270/mkactions/mkactions.c @@ -0,0 +1,189 @@ +/* + * "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., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como mkfb.c e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + +/** + * @brief Utility to create the actions definition files. + * + */ + +#include +#include + +#define DECLARE_LIB3270_ACTION( name, description ) \ + { \ + description, \ + NULL, \ + "LIB3270_EXPORT int lib3270_" # name "(H3270 *hSession);" \ + }, + +#define DECLARE_LIB3270_CLEAR_SELECTION_ACTION( name, description ) \ + { \ + description, \ + NULL, \ + "LIB3270_EXPORT int lib3270_" # name "(H3270 *hSession);" \ + }, + +#define DECLARE_LIB3270_KEY_ACTION( name, description ) \ + { \ + description, \ + NULL, \ + "LIB3270_EXPORT int lib3270_" # name "(H3270 *hSession);" \ + }, + +#define DECLARE_LIB3270_CURSOR_ACTION( name, description ) \ + { \ + description, \ + NULL, \ + "LIB3270_EXPORT int lib3270_cursor_" # name "(H3270 *hSession);" \ + }, + +#define DECLARE_LIB3270_FKEY_ACTION( name, description ) \ + { \ + description, \ + "keycode\tNumber of the " #name " to activate.", \ + "LIB3270_EXPORT int lib3270_" # name "(H3270 *hSession, int keycode);" \ + }, + + +static struct { + const char *description; + const char *args; + const char *prototype; +} actions[] = { + #include +}; + + +int main(int argc, char *argv[]) { + + enum _format { + FORMAT_HEADER + } format = FORMAT_HEADER; + + size_t ix; + + char * outfile = "actions.h"; + + //#pragma GCC diagnostic push + //#pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" + static struct option options[] = { + { "outfile", required_argument, 0, 'o' }, + { 0, 0, 0, 0} + + }; + //#pragma GCC diagnostic pop + + int long_index =0; + int opt; + while((opt = getopt_long(argc, argv, "o:", options, &long_index )) != -1) { + + switch(opt) { + case 'o': // Pidfile + outfile = optarg; + break; + } + + } + + FILE *out = fopen(outfile,"w"); + + fprintf(out,"%s\n", + "/*\n" + " * Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270\n" + " * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a\n" + " * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob o nome G3270.\n" + " *\n" + " * Copyright (C) <2008> \n" + " *\n" + " * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob\n" + " * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela\n" + " * Free Software Foundation.\n" + " *\n" + " * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER\n" + " * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO\n" + " * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para\n" + " * obter mais detalhes.\n" + " *\n" + " * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este\n" + " * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin\n" + " * St, Fifth Floor, Boston, MA 02110-1301 USA\n" + " *\n" + " * Contatos:\n" + " *\n" + " * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)\n" + " * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)\n" + " *\n" + " */\n\n" + ); + + if(format == FORMAT_HEADER) + { + + for(ix = 0; ix < (sizeof(actions)/sizeof(actions[0])); ix++) + { + fprintf(out, + "/**\n" + " *\n" + " * @brief %s\n" + " *\n" + " * @param hSession\tTN3270 Session handle.\n", + actions[ix].description + ); + + if(actions[ix].args) { + fprintf(out," * @param %s\n", actions[ix].args); + } + + fprintf(out, + " *\n" + " * @return 0 if Ok, non zero if not (sets errno)\n" + ); + + fprintf(out," *\n */\n %s\n\n",actions[ix].prototype); + } + + fprintf(out, + "/**\n" + " *\n" + " * @brief Call lib3270 action by name.\n" + " *\n" + " * @param hSession\tTN3270 Session handle.\n" + " * @param name\tName of the action to call.\n" + " *\n" + " */\n" + " LIB3270_EXPORT int lib3270_action(H3270 *hSession, const char *name);\n" + ); + } + + fclose(out); + + return 0; +} + + diff --git a/src/lib3270/mkactions/mkactions.cbp b/src/lib3270/mkactions/mkactions.cbp new file mode 100644 index 0000000..473f0bb --- /dev/null +++ b/src/lib3270/mkactions/mkactions.cbp @@ -0,0 +1,45 @@ + + + + + + diff --git a/src/lib3270/paste.c b/src/lib3270/paste.c index 47e3673..4c488e0 100644 --- a/src/lib3270/paste.c +++ b/src/lib3270/paste.c @@ -329,12 +329,12 @@ LIB3270_EXPORT int lib3270_paste(H3270 *h, const unsigned char *str) return 0; } -LIB3270_ACTION(pastenext) +LIB3270_EXPORT int lib3270_pastenext(H3270 *hSession) { char * ptr; int rc; - CHECK_SESSION_HANDLE(hSession); + FAIL_IF_NOT_ONLINE(hSession); if(!(lib3270_connected(hSession) && hSession->paste_buffer)) { diff --git a/src/lib3270/screen.c b/src/lib3270/screen.c index 32ef38f..bfa4a4a 100644 --- a/src/lib3270/screen.c +++ b/src/lib3270/screen.c @@ -27,28 +27,23 @@ * */ -/* - * screen.c - * A callback based 3270 Terminal Emulator - * Screen drawing +/** + * @file screen.c + * + * @brief A callback based 3270 Terminal Emulator Screen drawing + * */ #include "private.h" #include -//#include "appres.h" #include "3270ds.h" #include "resources.h" -// #include "ctlr.h" - -//#include "actionsc.h" #include "ctlrc.h" #include "hostc.h" #include "kybdc.h" #include "screenc.h" -// #include "tablesc.h" #include "trace_dsc.h" #include "utilc.h" -// #include "w3miscc.h" #include "widec.h" #include "xioc.h" #include "screen.h" @@ -56,7 +51,7 @@ #include "statusc.h" #include "togglesc.h" #include "api.h" -// #include "charsetc.h" +#include #if defined(_WIN32) #include @@ -825,7 +820,7 @@ void mcursor_set(H3270 *session,LIB3270_POINTER m) } } -LIB3270_ACTION( testpattern ) +LIB3270_EXPORT int lib3270_testpattern(H3270 *hSession) { static const unsigned char text_pat[] = { @@ -887,7 +882,7 @@ LIB3270_ACTION( testpattern ) int f; int fg = COLOR_BLUE; - CHECK_SESSION_HANDLE(hSession); + FAIL_IF_NOT_ONLINE(hSession); max = (hSession->maxROWS * hSession->maxCOLS); for(f=0;f + #include #include #include #include "3270ds.h" @@ -353,20 +353,18 @@ LIB3270_EXPORT int lib3270_select_field(H3270 *hSession) LIB3270_EXPORT int lib3270_select_all(H3270 * hSession) { - CHECK_SESSION_HANDLE(hSession); + FAIL_IF_NOT_ONLINE(hSession); do_select(hSession,0,(hSession->rows*hSession->cols)-1,0); return 0; } -LIB3270_ACTION( reselect ) +LIB3270_EXPORT int lib3270_reselect(H3270 *hSession) { -// int start, end; - - CHECK_SESSION_HANDLE(hSession); + FAIL_IF_NOT_ONLINE(hSession); - if(!lib3270_connected(hSession) || hSession->select.start == hSession->select.end || hSession->selected) + if(hSession->select.start == hSession->select.end || hSession->selected) return 0; do_select(hSession, hSession->select.start,hSession->select.end,lib3270_get_toggle(hSession,LIB3270_TOGGLE_RECTANGLE_SELECT)); -- libgit2 0.21.2