From 24c5f876f3a3d2233d0880c01e299e7e446177a3 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Fri, 25 May 2012 19:29:39 +0000 Subject: [PATCH] Simplificando tratamento de macros --- src/lib3270/macros.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/lib3270/testprogram.c | 29 +++++++++++------------------ 2 files changed, 70 insertions(+), 19 deletions(-) diff --git a/src/lib3270/macros.c b/src/lib3270/macros.c index b6b7c89..54c1616 100644 --- a/src/lib3270/macros.c +++ b/src/lib3270/macros.c @@ -37,11 +37,22 @@ #include #include #include + #include + #include "globals.h" #include "api.h" +/*--[ Structs & Defines ]----------------------------------------------------------------------------*/ + + struct macro_list + { + const char *name; + char *(*exec)(H3270 *session, int argc, const char **argv); + }; + +/* #define LIB3270_MACRO_ENTRY( name ) { #name, lib3270_macro_ ## name } - static const LIB3270_MACRO_LIST macro_list[] = + static const struct cmd[] = { LIB3270_MACRO_ENTRY( connect ), LIB3270_MACRO_ENTRY( cstate ), @@ -62,6 +73,9 @@ { return macro_list; } +*/ + +/*--[ Implement ]------------------------------------------------------------------------------------*/ static const char * get_state(H3270 *h) { @@ -289,3 +303,47 @@ lib3270_disconnect(hSession); return strdup("0"); } + + +/*--[ Macro entry point ]----------------------------------------------------------------------------*/ + + LIB3270_EXPORT char * lib3270_run_macro(H3270 *session, const char **argv) + { + #define LIB3270_MACRO_ENTRY( name ) { #name, lib3270_macro_ ## name } + + static const struct macro_list cmd[] = + { + LIB3270_MACRO_ENTRY( connect ), + LIB3270_MACRO_ENTRY( cstate ), + LIB3270_MACRO_ENTRY( disconnect ), + LIB3270_MACRO_ENTRY( encoding ), + LIB3270_MACRO_ENTRY( enter ), + LIB3270_MACRO_ENTRY( get ), + LIB3270_MACRO_ENTRY( luname ), + LIB3270_MACRO_ENTRY( pa ), + LIB3270_MACRO_ENTRY( pf ), + LIB3270_MACRO_ENTRY( set ), + LIB3270_MACRO_ENTRY( status ), + + {NULL, NULL} + }; + + int argc; + int f; + + CHECK_SESSION_HANDLE(session); + + // Get the number of arguments + for(argc = 0; argv[argc]; argc++); + + // Search for macro function + for(f=0;cmd[f].name;f++) + { + if(!strcasecmp(cmd[f].name,argv[0])) + return cmd[f].exec(session,argc,argv); + } + + // Not found, return NULL + return NULL; + } + diff --git a/src/lib3270/testprogram.c b/src/lib3270/testprogram.c index 9673a5d..6060671 100644 --- a/src/lib3270/testprogram.c +++ b/src/lib3270/testprogram.c @@ -37,11 +37,11 @@ int main(int numpar, char *param[]) while(fgets(line,4095,stdin)) { - const LIB3270_MACRO_LIST *cmd = get_3270_calls(); +// const LIB3270_MACRO_LIST *cmd = get_3270_calls(); int f; int argc = 0; - const char * argv[MAX_ARGS]; + const char * argv[MAX_ARGS+1]; char * ptr; line[4095] = 0; // Just in case. @@ -58,27 +58,20 @@ int main(int numpar, char *param[]) if( (argv[argc++] = strtok(NULL," ")) == NULL) break; } - argc--; + argv[argc] = NULL; if(!strcmp(argv[0],"quit")) break; - for(f=0;cmd[f].name;f++) + ptr = lib3270_run_macro(h,argv); + if(ptr) { - if(!strcmp(cmd[f].name,argv[0])) - { - char *str = cmd[f].exec(h,argc,argv); - if(str) - { - printf("\n%s\n",str); - lib3270_free(str); - } - else - { - printf("\nNo response\n"); - } - break; - } + printf("\n%s\n",ptr); + lib3270_free(ptr); + } + else + { + printf("\nNo response\n"); } printf("\n]"); -- libgit2 0.21.2