Commit 63ae14db0604e9397f737372f7f85a27e9f7af7b
1 parent
b3ec30bf
Exists in
master
and in
3 other branches
Simplificando tratamento de macros
Showing
2 changed files
with
70 additions
and
19 deletions
Show diff stats
macros.c
| ... | ... | @@ -37,11 +37,22 @@ |
| 37 | 37 | #include <lib3270.h> |
| 38 | 38 | #include <lib3270/macros.h> |
| 39 | 39 | #include <stdlib.h> |
| 40 | + #include <strings.h> | |
| 41 | + #include "globals.h" | |
| 40 | 42 | #include "api.h" |
| 41 | 43 | |
| 44 | +/*--[ Structs & Defines ]----------------------------------------------------------------------------*/ | |
| 45 | + | |
| 46 | + struct macro_list | |
| 47 | + { | |
| 48 | + const char *name; | |
| 49 | + char *(*exec)(H3270 *session, int argc, const char **argv); | |
| 50 | + }; | |
| 51 | + | |
| 52 | +/* | |
| 42 | 53 | #define LIB3270_MACRO_ENTRY( name ) { #name, lib3270_macro_ ## name } |
| 43 | 54 | |
| 44 | - static const LIB3270_MACRO_LIST macro_list[] = | |
| 55 | + static const struct cmd[] = | |
| 45 | 56 | { |
| 46 | 57 | LIB3270_MACRO_ENTRY( connect ), |
| 47 | 58 | LIB3270_MACRO_ENTRY( cstate ), |
| ... | ... | @@ -62,6 +73,9 @@ |
| 62 | 73 | { |
| 63 | 74 | return macro_list; |
| 64 | 75 | } |
| 76 | +*/ | |
| 77 | + | |
| 78 | +/*--[ Implement ]------------------------------------------------------------------------------------*/ | |
| 65 | 79 | |
| 66 | 80 | static const char * get_state(H3270 *h) |
| 67 | 81 | { |
| ... | ... | @@ -289,3 +303,47 @@ |
| 289 | 303 | lib3270_disconnect(hSession); |
| 290 | 304 | return strdup("0"); |
| 291 | 305 | } |
| 306 | + | |
| 307 | + | |
| 308 | +/*--[ Macro entry point ]----------------------------------------------------------------------------*/ | |
| 309 | + | |
| 310 | + LIB3270_EXPORT char * lib3270_run_macro(H3270 *session, const char **argv) | |
| 311 | + { | |
| 312 | + #define LIB3270_MACRO_ENTRY( name ) { #name, lib3270_macro_ ## name } | |
| 313 | + | |
| 314 | + static const struct macro_list cmd[] = | |
| 315 | + { | |
| 316 | + LIB3270_MACRO_ENTRY( connect ), | |
| 317 | + LIB3270_MACRO_ENTRY( cstate ), | |
| 318 | + LIB3270_MACRO_ENTRY( disconnect ), | |
| 319 | + LIB3270_MACRO_ENTRY( encoding ), | |
| 320 | + LIB3270_MACRO_ENTRY( enter ), | |
| 321 | + LIB3270_MACRO_ENTRY( get ), | |
| 322 | + LIB3270_MACRO_ENTRY( luname ), | |
| 323 | + LIB3270_MACRO_ENTRY( pa ), | |
| 324 | + LIB3270_MACRO_ENTRY( pf ), | |
| 325 | + LIB3270_MACRO_ENTRY( set ), | |
| 326 | + LIB3270_MACRO_ENTRY( status ), | |
| 327 | + | |
| 328 | + {NULL, NULL} | |
| 329 | + }; | |
| 330 | + | |
| 331 | + int argc; | |
| 332 | + int f; | |
| 333 | + | |
| 334 | + CHECK_SESSION_HANDLE(session); | |
| 335 | + | |
| 336 | + // Get the number of arguments | |
| 337 | + for(argc = 0; argv[argc]; argc++); | |
| 338 | + | |
| 339 | + // Search for macro function | |
| 340 | + for(f=0;cmd[f].name;f++) | |
| 341 | + { | |
| 342 | + if(!strcasecmp(cmd[f].name,argv[0])) | |
| 343 | + return cmd[f].exec(session,argc,argv); | |
| 344 | + } | |
| 345 | + | |
| 346 | + // Not found, return NULL | |
| 347 | + return NULL; | |
| 348 | + } | |
| 349 | + | ... | ... |
testprogram.c
| ... | ... | @@ -37,11 +37,11 @@ int main(int numpar, char *param[]) |
| 37 | 37 | |
| 38 | 38 | while(fgets(line,4095,stdin)) |
| 39 | 39 | { |
| 40 | - const LIB3270_MACRO_LIST *cmd = get_3270_calls(); | |
| 40 | +// const LIB3270_MACRO_LIST *cmd = get_3270_calls(); | |
| 41 | 41 | |
| 42 | 42 | int f; |
| 43 | 43 | int argc = 0; |
| 44 | - const char * argv[MAX_ARGS]; | |
| 44 | + const char * argv[MAX_ARGS+1]; | |
| 45 | 45 | char * ptr; |
| 46 | 46 | |
| 47 | 47 | line[4095] = 0; // Just in case. |
| ... | ... | @@ -58,27 +58,20 @@ int main(int numpar, char *param[]) |
| 58 | 58 | if( (argv[argc++] = strtok(NULL," ")) == NULL) |
| 59 | 59 | break; |
| 60 | 60 | } |
| 61 | - argc--; | |
| 61 | + argv[argc] = NULL; | |
| 62 | 62 | |
| 63 | 63 | if(!strcmp(argv[0],"quit")) |
| 64 | 64 | break; |
| 65 | 65 | |
| 66 | - for(f=0;cmd[f].name;f++) | |
| 66 | + ptr = lib3270_run_macro(h,argv); | |
| 67 | + if(ptr) | |
| 67 | 68 | { |
| 68 | - if(!strcmp(cmd[f].name,argv[0])) | |
| 69 | - { | |
| 70 | - char *str = cmd[f].exec(h,argc,argv); | |
| 71 | - if(str) | |
| 72 | - { | |
| 73 | - printf("\n%s\n",str); | |
| 74 | - lib3270_free(str); | |
| 75 | - } | |
| 76 | - else | |
| 77 | - { | |
| 78 | - printf("\nNo response\n"); | |
| 79 | - } | |
| 80 | - break; | |
| 81 | - } | |
| 69 | + printf("\n%s\n",ptr); | |
| 70 | + lib3270_free(ptr); | |
| 71 | + } | |
| 72 | + else | |
| 73 | + { | |
| 74 | + printf("\nNo response\n"); | |
| 82 | 75 | } |
| 83 | 76 | |
| 84 | 77 | printf("\n]"); | ... | ... |