Commit fae7d9d28a7f4e490bc82f31fd4b2ff282326eec

Authored by perry.werneck@gmail.com
1 parent 9d289f73

Separando alocação/liberação da estrutura de sessão num bloco separado, reorgani…

…zando gerenciamento de buffers, melhorando apresentação da posição do cursor que as vezes, ficava cortada
@@ -89,7 +89,7 @@ $(OBJRLS)/%.o: %.c $(DEPENDS) @@ -89,7 +89,7 @@ $(OBJRLS)/%.o: %.c $(DEPENDS)
89 89
90 #---[ Sources ]---------------------------------------------------------------- 90 #---[ Sources ]----------------------------------------------------------------
91 91
92 -SOURCES = XtGlue.c actions.c ansi.c charset.c ctlr.c \ 92 +SOURCES = XtGlue.c init.c actions.c ansi.c charset.c ctlr.c \
93 ft.c ft_cut.c ft_dft.c glue.c host.c kybd.c \ 93 ft.c ft_cut.c ft_dft.c glue.c host.c kybd.c \
94 print.c printer.c proxy.c resources.c rpq.c screen.c see.c \ 94 print.c printer.c proxy.c resources.c rpq.c screen.c see.c \
95 sf.c tables.c telnet.c toggles.c trace_ds.c utf8.c util.c \ 95 sf.c tables.c telnet.c toggles.c trace_ds.c utf8.c util.c \
@@ -555,8 +555,7 @@ static int DefaultProcessEvents(int block) @@ -555,8 +555,7 @@ static int DefaultProcessEvents(int block)
555 555
556 /*---[ Implement external calls ]---------------------------------------------------------------------------*/ 556 /*---[ Implement external calls ]---------------------------------------------------------------------------*/
557 557
558 -void *  
559 -Malloc(size_t len) 558 +void * Malloc(size_t len)
560 { 559 {
561 char *r; 560 char *r;
562 561
@@ -566,11 +565,10 @@ Malloc(size_t len) @@ -566,11 +565,10 @@ Malloc(size_t len)
566 return r; 565 return r;
567 } 566 }
568 567
569 -void *  
570 -Calloc(size_t nelem, size_t elsize) 568 +void * Calloc(size_t nelem, size_t elsize)
571 { 569 {
572 - int sz = nelem * elsize;  
573 - char *r = malloc(sz); 570 + int sz = nelem * elsize;
  571 + char * r = malloc(sz);
574 572
575 if(!r) 573 if(!r)
576 Error(NULL,"Out of memory"); 574 Error(NULL,"Out of memory");
@@ -579,8 +577,7 @@ Calloc(size_t nelem, size_t elsize) @@ -579,8 +577,7 @@ Calloc(size_t nelem, size_t elsize)
579 return r; 577 return r;
580 } 578 }
581 579
582 -void *  
583 -Realloc(void *p, size_t len) 580 +void * Realloc(void *p, size_t len)
584 { 581 {
585 p = realloc(p, len); 582 p = realloc(p, len);
586 if (p == NULL) 583 if (p == NULL)
@@ -590,10 +587,28 @@ Realloc(void *p, size_t len) @@ -590,10 +587,28 @@ Realloc(void *p, size_t len)
590 587
591 void Free(void *p) 588 void Free(void *p)
592 { 589 {
593 - if (p != NULL) 590 + if(p)
594 free(p); 591 free(p);
595 } 592 }
596 593
  594 +void * lib3270_calloc(size_t elsize, size_t nelem, void *ptr)
  595 +{
  596 + size_t sz = nelem * elsize;
  597 +
  598 + if(ptr)
  599 + ptr = realloc(ptr,sz);
  600 + else
  601 + ptr = malloc(sz);
  602 +
  603 + if(ptr)
  604 + memset(ptr,0,sz);
  605 + else
  606 + Error(NULL,"Out of memory");
  607 +
  608 + return ptr;
  609 +}
  610 +
  611 +
597 static struct { 612 static struct {
598 const char *name; 613 const char *name;
599 KeySym keysym; 614 KeySym keysym;
@@ -91,7 +91,7 @@ Boolean dbcs = False; @@ -91,7 +91,7 @@ Boolean dbcs = False;
91 91
92 /* Statics */ 92 /* Statics */
93 static struct ea *aea_buf; /* alternate 3270 extended attribute buffer */ 93 static struct ea *aea_buf; /* alternate 3270 extended attribute buffer */
94 -static unsigned char *zero_buf; /* empty buffer, for area clears */ 94 +static unsigned char *zero_buf; // empty buffer, for area clears
95 static void set_formatted(H3270 *session); 95 static void set_formatted(H3270 *session);
96 static void ctlr_blanks(void); 96 static void ctlr_blanks(void);
97 static Boolean trace_primed = False; 97 static Boolean trace_primed = False;
@@ -160,22 +160,28 @@ void ctlr_init(H3270 *session, unsigned cmask unused) @@ -160,22 +160,28 @@ void ctlr_init(H3270 *session, unsigned cmask unused)
160 */ 160 */
161 void ctlr_reinit(H3270 *session, unsigned cmask) 161 void ctlr_reinit(H3270 *session, unsigned cmask)
162 { 162 {
163 - static struct ea *real_ea_buf = NULL;  
164 - static struct ea *real_aea_buf = NULL; 163 +// static struct ea *real_ea_buf = NULL;
  164 +// static struct ea *real_aea_buf = NULL;
165 165
166 - if (cmask & MODEL_CHANGE) { 166 + if (cmask & MODEL_CHANGE)
  167 + {
167 /* Allocate buffers */ 168 /* Allocate buffers */
168 - if (real_ea_buf)  
169 - Free((char *)real_ea_buf);  
170 - real_ea_buf = (struct ea *)Calloc(sizeof(struct ea),(session->maxROWS * session->maxCOLS) + 1);  
171 - session->ea_buf = real_ea_buf + 1;  
172 - if (real_aea_buf)  
173 - Free((char *)real_aea_buf);  
174 - real_aea_buf = (struct ea *)Calloc(sizeof(struct ea),(session->maxROWS * session->maxCOLS) + 1);  
175 - aea_buf = real_aea_buf + 1;  
176 - Replace(zero_buf, (unsigned char *)Calloc(sizeof(struct ea),session->maxROWS * session->maxCOLS));  
177 - session->cursor_addr = 0;  
178 - buffer_addr = 0; 169 + struct ea *tmp;
  170 + size_t sz = (session->maxROWS * session->maxCOLS);
  171 +
  172 +
  173 + session->buffer[0] = tmp = lib3270_calloc(sizeof(struct ea),sz+1, session->buffer[0]);
  174 + session->ea_buf = tmp + 1;
  175 +
  176 + session->buffer[1] = tmp = lib3270_calloc(sizeof(struct ea),sz+1,session->buffer[1]);
  177 + aea_buf = tmp + 1;
  178 +
  179 + session->text = lib3270_calloc(sizeof(struct lib3270_text),sz,session->text);
  180 +
  181 + Replace(zero_buf, (unsigned char *)Calloc(sizeof(struct ea),sz));
  182 +
  183 + session->cursor_addr = 0;
  184 + buffer_addr = 0;
179 } 185 }
180 } 186 }
181 187
@@ -2551,8 +2557,7 @@ ctlr_bcopy(int baddr_from, int baddr_to, int count, int move_ea) @@ -2551,8 +2557,7 @@ ctlr_bcopy(int baddr_from, int baddr_to, int count, int move_ea)
2551 * Erase a region of the 3270 buffer, optionally clearing extended attributes 2557 * Erase a region of the 3270 buffer, optionally clearing extended attributes
2552 * as well. 2558 * as well.
2553 */ 2559 */
2554 -void  
2555 -ctlr_aclear(int baddr, int count, int clear_ea) 2560 +void ctlr_aclear(int baddr, int count, int clear_ea)
2556 { 2561 {
2557 if (memcmp((char *) &h3270.ea_buf[baddr], (char *) zero_buf, 2562 if (memcmp((char *) &h3270.ea_buf[baddr], (char *) zero_buf,
2558 count * sizeof(struct ea))) { 2563 count * sizeof(struct ea))) {
@@ -99,10 +99,6 @@ @@ -99,10 +99,6 @@
99 99
100 #define LAST_ARG "--" 100 #define LAST_ARG "--"
101 101
102 -/*---[ Statics ]--------------------------------------------------------------------------------------------------------------*/  
103 -  
104 - static int parse_model_number(const char *m);  
105 -  
106 /*---[ Globals ]--------------------------------------------------------------------------------------------------------------*/ 102 /*---[ Globals ]--------------------------------------------------------------------------------------------------------------*/
107 H3270 h3270; 103 H3270 h3270;
108 const char * programname; 104 const char * programname;
@@ -117,179 +113,6 @@ @@ -117,179 +113,6 @@
117 char *profile_name = CN; 113 char *profile_name = CN;
118 #endif /*]*/ 114 #endif /*]*/
119 115
120 -void lib3270_session_free(H3270 *h)  
121 -{  
122 - int f;  
123 -  
124 - // Terminate session  
125 - if(lib3270_connected(h))  
126 - lib3270_disconnect(h);  
127 -  
128 - shutdown_toggles(h,appres.toggle);  
129 -  
130 - // Release state change callbacks  
131 - for(f=0;f<N_ST;f++)  
132 - {  
133 - while(h->st_callbacks[f])  
134 - {  
135 - struct lib3270_state_callback *next = h->st_callbacks[f]->next;  
136 - Free(h->st_callbacks[f]);  
137 - h->st_callbacks[f] = next;  
138 - }  
139 - }  
140 -  
141 - // Release memory  
142 - #define RELEASE_BUFFER(x) if(x) { free(x); x = NULL; }  
143 -  
144 - RELEASE_BUFFER(h->charset);  
145 - RELEASE_BUFFER(h->paste_buffer);  
146 -  
147 -}  
148 -  
149 -static void update_char(H3270 *session, int addr, unsigned char chr, unsigned short attr, unsigned char cursor)  
150 -{  
151 -  
152 -}  
153 -  
154 -static void nop_char(H3270 *session, unsigned char chr)  
155 -{  
156 -  
157 -}  
158 -  
159 -static void nop(H3270 *session)  
160 -{  
161 -  
162 -}  
163 -  
164 -static void lib3270_session_init(H3270 *hSession, const char *model)  
165 -{  
166 - int ovc, ovr;  
167 - char junk;  
168 - int model_number;  
169 -  
170 - memset(hSession,0,sizeof(H3270));  
171 - hSession->sz = sizeof(H3270);  
172 -  
173 - // A few dummy calls to avoid "ifs"  
174 - hSession->update = update_char;  
175 - hSession->set_selection = nop_char;  
176 - hSession->ctlr_done = nop;  
177 -  
178 - hSession->sock = -1;  
179 - hSession->model_num = -1;  
180 - hSession->cstate = NOT_CONNECTED;  
181 - hSession->oia_status = -1;  
182 -  
183 - strncpy(hSession->full_model_name,"IBM-",LIB3270_FULL_MODEL_NAME_LENGTH);  
184 - hSession->model_name = &hSession->full_model_name[4];  
185 -  
186 - /*  
187 - * Sort out model and color modes, based on the model number resource.  
188 - */ /*  
189 - if(appres.model && *appres.model)  
190 - model = appres.model;  
191 - */  
192 -  
193 - if(!*model)  
194 - model = "2"; // No model, use the default one  
195 -  
196 -// Trace("Parsing model: %s",appres.model);  
197 - model_number = parse_model_number(model);  
198 - if (model_number < 0)  
199 - {  
200 - popup_an_error(NULL,"Invalid model number: %s", model);  
201 - model_number = 0;  
202 - }  
203 -  
204 - if (!model_number)  
205 - {  
206 -#if defined(RESTRICT_3279)  
207 - model_number = 3;  
208 -#else  
209 - model_number = 4;  
210 -#endif  
211 - }  
212 -  
213 - if(appres.mono)  
214 - appres.m3279 = False;  
215 -  
216 - if(!appres.extended)  
217 - appres.oversize = CN;  
218 -  
219 -#if defined(RESTRICT_3279)  
220 - if (appres.m3279 && model_number == 4)  
221 - model_number = 3;  
222 -#endif  
223 -  
224 - Trace("Model_number: %d",model_number);  
225 -  
226 - if (!appres.extended || appres.oversize == CN || sscanf(appres.oversize, "%dx%d%c", &ovc, &ovr, &junk) != 2)  
227 - {  
228 - ovc = 0;  
229 - ovr = 0;  
230 - }  
231 - ctlr_set_rows_cols(hSession, model_number, ovc, ovr);  
232 -  
233 - if (appres.termname != CN)  
234 - hSession->termtype = appres.termname;  
235 - else  
236 - hSession->termtype = hSession->full_model_name;  
237 -  
238 - Trace("Termtype: %s",hSession->termtype);  
239 -  
240 - if (appres.apl_mode)  
241 - appres.charset = Apl;  
242 -  
243 -}  
244 -  
245 -H3270 * lib3270_session_new(const char *model)  
246 -{  
247 - static int configured = 0;  
248 -  
249 - H3270 *hSession = &h3270;  
250 -  
251 - Trace("%s - configured=%d",__FUNCTION__,configured);  
252 -  
253 - if(configured)  
254 - {  
255 - // TODO (perry#5#): Allocate a new structure.  
256 - errno = EBUSY;  
257 - return hSession;  
258 - }  
259 -  
260 - configured = 1;  
261 -  
262 - lib3270_session_init(hSession, model);  
263 -  
264 - if(screen_init(hSession))  
265 - return NULL;  
266 -  
267 - Trace("Charset: %s",appres.charset);  
268 - if (charset_init(hSession,appres.charset) != CS_OKAY)  
269 - {  
270 - Warning(hSession, _( "Cannot find charset \"%s\", using defaults" ), appres.charset);  
271 - (void) charset_init(hSession,CN);  
272 - }  
273 -  
274 - kybd_init();  
275 -// hostfile_init();  
276 -// hostfile_init();  
277 - ansi_init();  
278 -  
279 -#if defined(X3270_FT)  
280 - ft_init();  
281 -#endif  
282 -  
283 -#if defined(X3270_PRINTER)  
284 - printer_init();  
285 -#endif  
286 -  
287 - Trace("%s finished",__FUNCTION__);  
288 -  
289 - errno = 0;  
290 - return hSession;  
291 -}  
292 -  
293 /* 116 /*
294 * Set default options 117 * Set default options
295 */ 118 */
@@ -536,75 +359,6 @@ const struct lib3270_option * get_3270_option_table(int sz) @@ -536,75 +359,6 @@ const struct lib3270_option * get_3270_option_table(int sz)
536 } 359 }
537 360
538 /* 361 /*
539 - * Parse the model number.  
540 - * Returns -1 (error), 0 (default), or the specified number.  
541 - */  
542 -static int parse_model_number(const char *m)  
543 -{  
544 - int sl;  
545 - int n;  
546 -  
547 - if(!m)  
548 - return 0;  
549 -  
550 - sl = strlen(m);  
551 -  
552 - /* An empty model number is no good. */  
553 - if (!sl)  
554 - return 0;  
555 -  
556 - if (sl > 1) {  
557 - /*  
558 - * If it's longer than one character, it needs to start with  
559 - * '327[89]', and it sets the m3279 resource.  
560 - */  
561 - if (!strncmp(m, "3278", 4)) {  
562 - appres.m3279 = False;  
563 - } else if (!strncmp(m, "3279", 4)) {  
564 - appres.m3279 = True;  
565 - } else {  
566 - return -1;  
567 - }  
568 - m += 4;  
569 - sl -= 4;  
570 -  
571 - /* Check more syntax. -E is allowed, but ignored. */  
572 - switch (m[0]) {  
573 - case '\0':  
574 - /* Use default model number. */  
575 - return 0;  
576 - case '-':  
577 - /* Model number specified. */  
578 - m++;  
579 - sl--;  
580 - break;  
581 - default:  
582 - return -1;  
583 - }  
584 - switch (sl) {  
585 - case 1: /* n */  
586 - break;  
587 - case 3: /* n-E */  
588 - if (strcasecmp(m + 1, "-E")) {  
589 - return -1;  
590 - }  
591 - break;  
592 - default:  
593 - return -1;  
594 - }  
595 - }  
596 -  
597 - /* Check the numeric model number. */  
598 - n = atoi(m);  
599 - if (n >= 2 && n <= 5) {  
600 - return n;  
601 - } else {  
602 - return -1;  
603 - }  
604 -  
605 -}  
606 -  
607 -/*  
608 * Parse '-xrm' options. 362 * Parse '-xrm' options.
609 * Understands only: 363 * Understands only:
610 * {c,s,tcl}3270.<resourcename>: value 364 * {c,s,tcl}3270.<resourcename>: value
init.c 0 → 100644
@@ -0,0 +1,279 @@ @@ -0,0 +1,279 @@
  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. 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 init.c 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 + * licinio@bb.com.br (Licínio Luis Branco)
  28 + * kraucer@bb.com.br (Kraucer Fernandes Mazuco)
  29 + * macmiranda@bb.com.br (Marco Aurélio Caldas Miranda)
  30 + *
  31 + */
  32 +
  33 +
  34 +#include "globals.h"
  35 +#include "appres.h"
  36 +#include "charsetc.h"
  37 +
  38 +/*---[ Statics ]--------------------------------------------------------------------------------------------------------------*/
  39 +
  40 + static int parse_model_number(H3270 *session, const char *m);
  41 +
  42 +/*---[ Implement ]------------------------------------------------------------------------------------------------------------*/
  43 +
  44 +void lib3270_session_free(H3270 *h)
  45 +{
  46 + int f;
  47 +
  48 + // Terminate session
  49 + if(lib3270_connected(h))
  50 + lib3270_disconnect(h);
  51 +
  52 + shutdown_toggles(h,appres.toggle);
  53 +
  54 + // Release state change callbacks
  55 + for(f=0;f<N_ST;f++)
  56 + {
  57 + while(h->st_callbacks[f])
  58 + {
  59 + struct lib3270_state_callback *next = h->st_callbacks[f]->next;
  60 + Free(h->st_callbacks[f]);
  61 + h->st_callbacks[f] = next;
  62 + }
  63 + }
  64 +
  65 + // Release memory
  66 + #define RELEASE_BUFFER(x) if(x) { free(x); x = NULL; }
  67 +
  68 + RELEASE_BUFFER(h->charset);
  69 + RELEASE_BUFFER(h->paste_buffer);
  70 +
  71 + for(f=0;f<(sizeof(h->buffer)/sizeof(h->buffer[0]));f++)
  72 + {
  73 + RELEASE_BUFFER(h->buffer[f]);
  74 + }
  75 +
  76 +}
  77 +
  78 +static void update_char(H3270 *session, int addr, unsigned char chr, unsigned short attr, unsigned char cursor)
  79 +{
  80 +
  81 +}
  82 +
  83 +static void nop_char(H3270 *session, unsigned char chr)
  84 +{
  85 +
  86 +}
  87 +
  88 +static void nop(H3270 *session)
  89 +{
  90 +
  91 +}
  92 +
  93 +static void lib3270_session_init(H3270 *hSession, const char *model)
  94 +{
  95 + int ovc, ovr;
  96 + char junk;
  97 + int model_number;
  98 +
  99 + memset(hSession,0,sizeof(H3270));
  100 + hSession->sz = sizeof(H3270);
  101 +
  102 + // A few dummy calls to avoid "ifs"
  103 + hSession->update = update_char;
  104 + hSession->set_selection = nop_char;
  105 + hSession->ctlr_done = nop;
  106 +
  107 + hSession->sock = -1;
  108 + hSession->model_num = -1;
  109 + hSession->cstate = NOT_CONNECTED;
  110 + hSession->oia_status = -1;
  111 +
  112 + strncpy(hSession->full_model_name,"IBM-",LIB3270_FULL_MODEL_NAME_LENGTH);
  113 + hSession->model_name = &hSession->full_model_name[4];
  114 +
  115 + if(!*model)
  116 + model = "2"; // No model, use the default one
  117 +
  118 + model_number = parse_model_number(hSession,model);
  119 + if (model_number < 0)
  120 + {
  121 + popup_an_error(NULL,"Invalid model number: %s", model);
  122 + model_number = 0;
  123 + }
  124 +
  125 + if (!model_number)
  126 + {
  127 +#if defined(RESTRICT_3279)
  128 + model_number = 3;
  129 +#else
  130 + model_number = 4;
  131 +#endif
  132 + }
  133 +
  134 + if(appres.mono)
  135 + appres.m3279 = False;
  136 +
  137 + if(!appres.extended)
  138 + appres.oversize = CN;
  139 +
  140 +#if defined(RESTRICT_3279)
  141 + if (appres.m3279 && model_number == 4)
  142 + model_number = 3;
  143 +#endif
  144 +
  145 + Trace("Model_number: %d",model_number);
  146 +
  147 + if (!appres.extended || appres.oversize == CN || sscanf(appres.oversize, "%dx%d%c", &ovc, &ovr, &junk) != 2)
  148 + {
  149 + ovc = 0;
  150 + ovr = 0;
  151 + }
  152 + ctlr_set_rows_cols(hSession, model_number, ovc, ovr);
  153 +
  154 + if (appres.termname != CN)
  155 + hSession->termtype = appres.termname;
  156 + else
  157 + hSession->termtype = hSession->full_model_name;
  158 +
  159 + Trace("Termtype: %s",hSession->termtype);
  160 +
  161 + if (appres.apl_mode)
  162 + appres.charset = "apl";
  163 +
  164 +}
  165 +
  166 +H3270 * lib3270_session_new(const char *model)
  167 +{
  168 + static int configured = 0;
  169 +
  170 + H3270 *hSession = &h3270;
  171 +
  172 + Trace("%s - configured=%d",__FUNCTION__,configured);
  173 +
  174 + if(configured)
  175 + {
  176 + // TODO (perry#5#): Allocate a new structure.
  177 + errno = EBUSY;
  178 + return hSession;
  179 + }
  180 +
  181 + configured = 1;
  182 +
  183 + lib3270_session_init(hSession, model);
  184 +
  185 + if(screen_init(hSession))
  186 + return NULL;
  187 +
  188 + Trace("Charset: %s",appres.charset);
  189 + if (charset_init(hSession,appres.charset) != CS_OKAY)
  190 + {
  191 + Warning(hSession, _( "Cannot find charset \"%s\", using defaults" ), appres.charset);
  192 + (void) charset_init(hSession,CN);
  193 + }
  194 +
  195 + kybd_init();
  196 + ansi_init();
  197 +
  198 +#if defined(X3270_FT)
  199 + ft_init();
  200 +#endif
  201 +
  202 +#if defined(X3270_PRINTER)
  203 + printer_init();
  204 +#endif
  205 +
  206 + Trace("%s finished",__FUNCTION__);
  207 +
  208 + errno = 0;
  209 + return hSession;
  210 +}
  211 +
  212 + /*
  213 +- * Parse the model number.
  214 +- * Returns -1 (error), 0 (default), or the specified number.
  215 +- */
  216 +static int parse_model_number(H3270 *session, const char *m)
  217 +{
  218 + int sl;
  219 + int n;
  220 +
  221 + if(!m)
  222 + return 0;
  223 +
  224 + sl = strlen(m);
  225 +
  226 + /* An empty model number is no good. */
  227 + if (!sl)
  228 + return 0;
  229 +
  230 + if (sl > 1) {
  231 + /*
  232 + * If it's longer than one character, it needs to start with
  233 + * '327[89]', and it sets the m3279 resource.
  234 + */
  235 + if (!strncmp(m, "3278", 4)) {
  236 + appres.m3279 = False;
  237 + } else if (!strncmp(m, "3279", 4)) {
  238 + appres.m3279 = True;
  239 + } else {
  240 + return -1;
  241 + }
  242 + m += 4;
  243 + sl -= 4;
  244 +
  245 + /* Check more syntax. -E is allowed, but ignored. */
  246 + switch (m[0]) {
  247 + case '\0':
  248 + /* Use default model number. */
  249 + return 0;
  250 + case '-':
  251 + /* Model number specified. */
  252 + m++;
  253 + sl--;
  254 + break;
  255 + default:
  256 + return -1;
  257 + }
  258 + switch (sl) {
  259 + case 1: /* n */
  260 + break;
  261 + case 3: /* n-E */
  262 + if (strcasecmp(m + 1, "-E")) {
  263 + return -1;
  264 + }
  265 + break;
  266 + default:
  267 + return -1;
  268 + }
  269 + }
  270 +
  271 + /* Check the numeric model number. */
  272 + n = atoi(m);
  273 + if (n >= 2 && n <= 5) {
  274 + return n;
  275 + } else {
  276 + return -1;
  277 + }
  278 +
  279 +}
@@ -55,10 +55,25 @@ typedef struct _XtActionsRec{ @@ -55,10 +55,25 @@ typedef struct _XtActionsRec{
55 #define NoSymbol 0L 55 #define NoSymbol 0L
56 56
57 /* These are local functions with similar semantics to X functions. */ 57 /* These are local functions with similar semantics to X functions. */
58 -void *Malloc(size_t);  
59 -void Free(void *);  
60 -void *Calloc(size_t, size_t);  
61 -void *Realloc(void *, size_t); 58 +
  59 +void * Malloc(size_t);
  60 +void Free(void *);
  61 +void * Calloc(size_t, size_t);
  62 +void * Realloc(void *, size_t);
  63 +
  64 +/**
  65 + * Alloc/Realloc memory buffer.
  66 + *
  67 + * Allocate/reallocate an array.
  68 + *
  69 + * @param elsize Element size.
  70 + * @param nelem Number of elements in the array.
  71 + * @param ptr Pointer to the actual array.
  72 + *
  73 + * @return ptr allocated with the new array size.
  74 + *
  75 + */
  76 +void * lib3270_calloc(size_t elsize, size_t nelem, void *ptr);
62 77
63 #define NewString(x) strdup(x) 78 #define NewString(x) strdup(x)
64 //extern char *NewString(const char *); 79 //extern char *NewString(const char *);
@@ -88,14 +88,14 @@ static void addch(H3270 *session, int baddr, unsigned char c, unsigned short att @@ -88,14 +88,14 @@ static void addch(H3270 *session, int baddr, unsigned char c, unsigned short att
88 { 88 {
89 // If set to keep selection adjust corresponding flag based on the current state 89 // If set to keep selection adjust corresponding flag based on the current state
90 if(lib3270_get_toggle(session,LIB3270_TOGGLE_KEEP_SELECTED)) 90 if(lib3270_get_toggle(session,LIB3270_TOGGLE_KEEP_SELECTED))
91 - attr |= (session->ea_buf[baddr].attr & LIB3270_ATTR_SELECTED); 91 + attr |= (session->text[baddr].attr & LIB3270_ATTR_SELECTED);
92 92
93 - if(session->ea_buf[baddr].chr == c && session->ea_buf[baddr].attr == attr) 93 + if(session->text[baddr].chr == c && session->text[baddr].attr == attr)
94 return; 94 return;
95 95
96 /* Converted char has changed, update it */ 96 /* Converted char has changed, update it */
97 - session->ea_buf[baddr].chr = c;  
98 - session->ea_buf[baddr].attr = attr; 97 + session->text[baddr].chr = c;
  98 + session->text[baddr].attr = attr;
99 99
100 if(session->update) 100 if(session->update)
101 session->update(session,baddr,c,attr,baddr == session->cursor_addr); 101 session->update(session,baddr,c,attr,baddr == session->cursor_addr);
@@ -262,8 +262,8 @@ LIB3270_EXPORT int lib3270_get_contents(H3270 *h, int first, int last, unsigned @@ -262,8 +262,8 @@ LIB3270_EXPORT int lib3270_get_contents(H3270 *h, int first, int last, unsigned
262 262
263 for(baddr = first; baddr <= last;baddr++) 263 for(baddr = first; baddr <= last;baddr++)
264 { 264 {
265 - *(chr++) = h3270.ea_buf[baddr].chr ? h3270.ea_buf[baddr].chr : ' ';  
266 - *(attr++) = h3270.ea_buf[baddr].attr; 265 + *(chr++) = h->text[baddr].chr ? h->text[baddr].chr : ' ';
  266 + *(attr++) = h->text[baddr].attr;
267 } 267 }
268 268
269 return 0; 269 return 0;
@@ -410,7 +410,7 @@ LIB3270_EXPORT int lib3270_set_cursor_address(H3270 *h, int baddr) @@ -410,7 +410,7 @@ LIB3270_EXPORT int lib3270_set_cursor_address(H3270 *h, int baddr)
410 h->cursor_addr = baddr; 410 h->cursor_addr = baddr;
411 411
412 if(h->update_cursor) 412 if(h->update_cursor)
413 - h->update_cursor(h,(unsigned short) (baddr/h->cols),(unsigned short) (baddr%h->cols),h->ea_buf[baddr].chr,h->ea_buf[baddr].attr); 413 + h->update_cursor(h,(unsigned short) (baddr/h->cols),(unsigned short) (baddr%h->cols),h->text[baddr].chr,h->text[baddr].attr);
414 414
415 return ret; 415 return ret;
416 } 416 }
@@ -75,10 +75,10 @@ static void update_selected_rectangle(H3270 *session) @@ -75,10 +75,10 @@ static void update_selected_rectangle(H3270 *session)
75 { 75 {
76 for(col = 0; col < session->cols;col++) 76 for(col = 0; col < session->cols;col++)
77 { 77 {
78 - if(!(row >= p[0].row && row <= p[1].row && col >= p[0].col && col <= p[1].col) && (session->ea_buf[baddr].attr & LIB3270_ATTR_SELECTED)) 78 + if(!(row >= p[0].row && row <= p[1].row && col >= p[0].col && col <= p[1].col) && (session->text[baddr].attr & LIB3270_ATTR_SELECTED))
79 { 79 {
80 - session->ea_buf[baddr].attr &= ~LIB3270_ATTR_SELECTED;  
81 - session->update(session,baddr,session->ea_buf[baddr].chr,session->ea_buf[baddr].attr,baddr == session->cursor_addr); 80 + session->text[baddr].attr &= ~LIB3270_ATTR_SELECTED;
  81 + session->update(session,baddr,session->text[baddr].chr,session->text[baddr].attr,baddr == session->cursor_addr);
82 } 82 }
83 baddr++; 83 baddr++;
84 } 84 }
@@ -90,10 +90,10 @@ static void update_selected_rectangle(H3270 *session) @@ -90,10 +90,10 @@ static void update_selected_rectangle(H3270 *session)
90 { 90 {
91 for(col = 0; col < session->cols;col++) 91 for(col = 0; col < session->cols;col++)
92 { 92 {
93 - if((row >= p[0].row && row <= p[1].row && col >= p[0].col && col <= p[1].col) && !(session->ea_buf[baddr].attr & LIB3270_ATTR_SELECTED)) 93 + if((row >= p[0].row && row <= p[1].row && col >= p[0].col && col <= p[1].col) && !(session->text[baddr].attr & LIB3270_ATTR_SELECTED))
94 { 94 {
95 - session->ea_buf[baddr].attr |= LIB3270_ATTR_SELECTED;  
96 - session->update(session,baddr,session->ea_buf[baddr].chr,session->ea_buf[baddr].attr,baddr == session->cursor_addr); 95 + session->text[baddr].attr |= LIB3270_ATTR_SELECTED;
  96 + session->update(session,baddr,session->text[baddr].chr,session->text[baddr].attr,baddr == session->cursor_addr);
97 } 97 }
98 baddr++; 98 baddr++;
99 } 99 }
@@ -111,29 +111,29 @@ static void update_selected_region(H3270 *session) @@ -111,29 +111,29 @@ static void update_selected_region(H3270 *session)
111 // First remove unselected areas 111 // First remove unselected areas
112 for(baddr = 0; baddr < begin; baddr++) 112 for(baddr = 0; baddr < begin; baddr++)
113 { 113 {
114 - if(session->ea_buf[baddr].attr & LIB3270_ATTR_SELECTED) 114 + if(session->text[baddr].attr & LIB3270_ATTR_SELECTED)
115 { 115 {
116 - session->ea_buf[baddr].attr &= ~LIB3270_ATTR_SELECTED;  
117 - session->update(session,baddr,session->ea_buf[baddr].chr,session->ea_buf[baddr].attr,baddr == session->cursor_addr); 116 + session->text[baddr].attr &= ~LIB3270_ATTR_SELECTED;
  117 + session->update(session,baddr,session->text[baddr].chr,session->text[baddr].attr,baddr == session->cursor_addr);
118 } 118 }
119 } 119 }
120 120
121 for(baddr = end+1; baddr < len; baddr++) 121 for(baddr = end+1; baddr < len; baddr++)
122 { 122 {
123 - if(session->ea_buf[baddr].attr & LIB3270_ATTR_SELECTED) 123 + if(session->text[baddr].attr & LIB3270_ATTR_SELECTED)
124 { 124 {
125 - session->ea_buf[baddr].attr &= ~LIB3270_ATTR_SELECTED;  
126 - session->update(session,baddr,session->ea_buf[baddr].chr,session->ea_buf[baddr].attr,baddr == session->cursor_addr); 125 + session->text[baddr].attr &= ~LIB3270_ATTR_SELECTED;
  126 + session->update(session,baddr,session->text[baddr].chr,session->text[baddr].attr,baddr == session->cursor_addr);
127 } 127 }
128 } 128 }
129 129
130 // Then draw the selected ones 130 // Then draw the selected ones
131 for(baddr = begin; baddr <= end; baddr++) 131 for(baddr = begin; baddr <= end; baddr++)
132 { 132 {
133 - if(!(session->ea_buf[baddr].attr & LIB3270_ATTR_SELECTED)) 133 + if(!(session->text[baddr].attr & LIB3270_ATTR_SELECTED))
134 { 134 {
135 - session->ea_buf[baddr].attr |= LIB3270_ATTR_SELECTED;  
136 - session->update(session,baddr,session->ea_buf[baddr].chr,session->ea_buf[baddr].attr,baddr == session->cursor_addr); 135 + session->text[baddr].attr |= LIB3270_ATTR_SELECTED;
  136 + session->update(session,baddr,session->text[baddr].chr,session->text[baddr].attr,baddr == session->cursor_addr);
137 } 137 }
138 } 138 }
139 139
@@ -180,11 +180,11 @@ LIB3270_ACTION(unselect) @@ -180,11 +180,11 @@ LIB3270_ACTION(unselect)
180 180
181 for(a = 0; a < hSession->rows*hSession->cols; a++) 181 for(a = 0; a < hSession->rows*hSession->cols; a++)
182 { 182 {
183 - if(hSession->ea_buf[a].attr & LIB3270_ATTR_SELECTED) 183 + if(hSession->text[a].attr & LIB3270_ATTR_SELECTED)
184 { 184 {
185 - hSession->ea_buf[a].attr &= ~LIB3270_ATTR_SELECTED; 185 + hSession->text[a].attr &= ~LIB3270_ATTR_SELECTED;
186 if(hSession->update) 186 if(hSession->update)
187 - hSession->update(hSession,a,hSession->ea_buf[a].chr,hSession->ea_buf[a].attr,a == hSession->cursor_addr); 187 + hSession->update(hSession,a,hSession->text[a].chr,hSession->text[a].attr,a == hSession->cursor_addr);
188 } 188 }
189 } 189 }
190 190
@@ -218,17 +218,17 @@ LIB3270_EXPORT void lib3270_select_word(H3270 *session, int baddr) @@ -218,17 +218,17 @@ LIB3270_EXPORT void lib3270_select_word(H3270 *session, int baddr)
218 218
219 CHECK_SESSION_HANDLE(session); 219 CHECK_SESSION_HANDLE(session);
220 220
221 - if(!lib3270_connected(session) || isspace(session->ea_buf[baddr].chr)) 221 + if(!lib3270_connected(session) || isspace(session->text[baddr].chr))
222 { 222 {
223 lib3270_ring_bell(session); 223 lib3270_ring_bell(session);
224 return; 224 return;
225 } 225 }
226 226
227 - for(pos = baddr; pos > 0 && !isspace(session->ea_buf[pos].chr);pos--); 227 + for(pos = baddr; pos > 0 && !isspace(session->text[pos].chr);pos--);
228 session->select.begin = pos > 0 ? pos+1 : 0; 228 session->select.begin = pos > 0 ? pos+1 : 0;
229 229
230 len = session->rows * session->cols; 230 len = session->rows * session->cols;
231 - for(pos = baddr; pos < len && !isspace(session->ea_buf[pos].chr);pos++); 231 + for(pos = baddr; pos < len && !isspace(session->text[pos].chr);pos++);
232 session->select.end = pos < len ? pos-1 : len; 232 session->select.end = pos < len ? pos-1 : len;
233 233
234 set_selected(session); 234 set_selected(session);
@@ -286,10 +286,10 @@ LIB3270_ACTION( selectall ) @@ -286,10 +286,10 @@ LIB3270_ACTION( selectall )
286 // First remove unselected areas 286 // First remove unselected areas
287 for(baddr = 0; baddr < len; baddr++) 287 for(baddr = 0; baddr < len; baddr++)
288 { 288 {
289 - if(!(hSession->ea_buf[baddr].attr & LIB3270_ATTR_SELECTED)) 289 + if(!(hSession->text[baddr].attr & LIB3270_ATTR_SELECTED))
290 { 290 {
291 - hSession->ea_buf[baddr].attr |= LIB3270_ATTR_SELECTED;  
292 - hSession->update(hSession,baddr,hSession->ea_buf[baddr].chr,hSession->ea_buf[baddr].attr,baddr == hSession->cursor_addr); 291 + hSession->text[baddr].attr |= LIB3270_ATTR_SELECTED;
  292 + hSession->update(hSession,baddr,hSession->text[baddr].chr,hSession->text[baddr].attr,baddr == hSession->cursor_addr);
293 } 293 }
294 } 294 }
295 295
@@ -329,10 +329,10 @@ LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) @@ -329,10 +329,10 @@ LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession)
329 329
330 for(col = 0; col < hSession->cols;col++) 330 for(col = 0; col < hSession->cols;col++)
331 { 331 {
332 - if(hSession->ea_buf[baddr].attr & LIB3270_ATTR_SELECTED) 332 + if(hSession->text[baddr].attr & LIB3270_ATTR_SELECTED)
333 { 333 {
334 cr++; 334 cr++;
335 - ret[sz++] = hSession->ea_buf[baddr].chr; 335 + ret[sz++] = hSession->text[baddr].chr;
336 } 336 }
337 baddr++; 337 baddr++;
338 } 338 }