Commit 32c0bd3a2eb4ebe297263e34a7f9fe8389bdef16
1 parent
deb5439a
Exists in
master
and in
3 other branches
Corrigindo segfaults aleatórios durante a montagem dos formulários html, inician…
…do implementação do arquivo de configuração em android
Showing
1 changed file
with
36 additions
and
55 deletions
Show diff stats
html.c
... | ... | @@ -110,8 +110,7 @@ |
110 | 110 | } mode; |
111 | 111 | |
112 | 112 | char * text; |
113 | - char * input; | |
114 | - char * block; | |
113 | + int block; | |
115 | 114 | int maxlength; |
116 | 115 | unsigned short fg; |
117 | 116 | unsigned short bg; |
... | ... | @@ -189,11 +188,7 @@ |
189 | 188 | |
190 | 189 | snprintf(name,29,"F%04d",addr); |
191 | 190 | |
192 | - info->block = info->text+strlen(info->text); | |
193 | - | |
194 | -#ifdef DEBUG | |
195 | - append_string(info,"\n"); | |
196 | -#endif // DEBUG | |
191 | + info->block = strlen(info->text); | |
197 | 192 | |
198 | 193 | append_string(info,"<input type=\""); |
199 | 194 | append_string(info,mode == HTML_MODE_INPUT_TEXT ? "text" : "password" ); |
... | ... | @@ -202,44 +197,35 @@ |
202 | 197 | append_string(info,"\" value=\""); |
203 | 198 | info->mode = mode; |
204 | 199 | info->maxlength = 0; |
205 | - info->input = info->text+strlen(info->text); | |
206 | 200 | |
207 | 201 | } |
208 | 202 | |
209 | 203 | static void close_input(struct html_info *info) |
210 | 204 | { |
211 | - char buffer[80]; | |
212 | - char *ptr; | |
213 | - char *mark; | |
205 | + char buffer[80]; | |
206 | + int pos; | |
214 | 207 | |
215 | 208 | if(info->mode == HTML_MODE_TEXT) |
216 | 209 | return; |
217 | 210 | |
211 | + trace("maxlength=%d",info->maxlength); | |
212 | + | |
218 | 213 | if(info->maxlength < 1) |
219 | 214 | { |
220 | - *info->block = 0; | |
215 | + info->text[info->block] = 0; | |
221 | 216 | info->mode = HTML_MODE_TEXT; |
222 | 217 | info->maxlength = 0; |
223 | 218 | return; |
224 | 219 | } |
225 | 220 | |
226 | - for(ptr=mark=info->input;*ptr;ptr++) | |
227 | - { | |
228 | - if(*ptr != ' ') | |
229 | - mark=ptr+1; | |
230 | - } | |
231 | - *mark = 0; | |
221 | + for(pos = strlen(info->text)-1;pos > 0 && info->text[pos] == ' '; pos--) | |
222 | + info->text[pos] = 0; | |
232 | 223 | |
233 | 224 | snprintf(buffer,80,"\" maxlength=\"%d\" class=\"IW%03d\"",info->maxlength,info->maxlength); |
234 | 225 | append_string(info,buffer); |
235 | 226 | |
236 | 227 | append_string(info,"></input>"); |
237 | 228 | |
238 | -#ifdef DEBUG | |
239 | - append_string(info,"\n"); | |
240 | -#endif // DEBUG | |
241 | - | |
242 | - | |
243 | 229 | info->mode = HTML_MODE_TEXT; |
244 | 230 | info->maxlength = 0; |
245 | 231 | } |
... | ... | @@ -266,30 +252,12 @@ |
266 | 252 | baddr = 0; |
267 | 253 | for(row=0;row < session->rows;row++) |
268 | 254 | { |
269 | - int cr = 0; | |
270 | - int len = 0; | |
271 | 255 | int col; |
272 | 256 | |
273 | -#ifdef DEBUG | |
274 | - { | |
275 | - char buffer[4096]; | |
276 | - snprintf(buffer,4095,"\n<!-- R%02d/%02d --->\t",row,session->rows); | |
277 | - append_string(&info,buffer); | |
278 | - } | |
279 | -#endif // DEBUG | |
280 | - | |
281 | 257 | for(col = 0; col < session->cols;col++) |
282 | 258 | { |
283 | - if( session->text[baddr+col].chr != ' ' || (session->text[baddr+col].attr & LIB3270_ATTR_CG)) | |
284 | - len = col; | |
285 | - } | |
286 | - | |
287 | - for(col = 0; col <= len || (col < session->cols && info.mode != HTML_MODE_TEXT);col++) | |
288 | - { | |
289 | 259 | if((option & LIB3270_HTML_OPTION_ALL) || (session->text[baddr+col].attr & LIB3270_ATTR_SELECTED)) |
290 | 260 | { |
291 | - cr++; | |
292 | - | |
293 | 261 | if((session->text[baddr+col].attr & LIB3270_ATTR_MARKER) && (option & LIB3270_HTML_OPTION_FORM) ) |
294 | 262 | { |
295 | 263 | int fa = (session->ea_buf[baddr+col].fa & FA_MASK); |
... | ... | @@ -303,12 +271,10 @@ |
303 | 271 | { |
304 | 272 | // Input field |
305 | 273 | unsigned char attr = get_field_attribute(session,baddr+col+1); |
306 | - //char * text = lib3270_get_field_at(session,baddr+col+1); | |
307 | - | |
308 | 274 | open_input(&info,baddr+col+1,FA_IS_ZERO(attr) ? HTML_MODE_INPUT_PASSWORD : HTML_MODE_INPUT_TEXT); |
309 | 275 | |
310 | 276 | } |
311 | - else if(col < len && session->text[baddr+col+1].chr == 'F') | |
277 | + else if(session->text[baddr+col+1].chr == 'F') | |
312 | 278 | { |
313 | 279 | char *text = lib3270_get_field_at(session,baddr+col+1); |
314 | 280 | |
... | ... | @@ -336,8 +302,7 @@ |
336 | 302 | append_string(&info,"\" />"); |
337 | 303 | info.mode = HTML_MODE_INPUT_BUTTON; |
338 | 304 | info.maxlength = 0; |
339 | - info.input = info.text+strlen(info.text); | |
340 | - | |
305 | + info.block = strlen(info.text); | |
341 | 306 | } |
342 | 307 | } |
343 | 308 | lib3270_free(text); |
... | ... | @@ -414,17 +379,16 @@ |
414 | 379 | enum HTML_MODE mode = info.mode; |
415 | 380 | |
416 | 381 | close_input(&info); |
417 | - | |
418 | - if(cr) | |
419 | - append_element(&info,HTML_ELEMENT_LINE_BREAK); | |
420 | - | |
382 | + append_element(&info,HTML_ELEMENT_LINE_BREAK); | |
421 | 383 | open_input(&info,baddr,mode); |
422 | 384 | |
423 | 385 | } |
424 | - else if(cr) | |
386 | + else | |
425 | 387 | { |
426 | 388 | append_element(&info,HTML_ELEMENT_LINE_BREAK); |
427 | - | |
389 | +#if defined(DEBUG) || defined(ANDROID) | |
390 | + append_string(&info,"\n"); | |
391 | +#endif // DEBUG | |
428 | 392 | } |
429 | 393 | |
430 | 394 | } |
... | ... | @@ -441,8 +405,8 @@ |
441 | 405 | |
442 | 406 | if(info.form) |
443 | 407 | { |
444 | - static const char * prefix = "<form name=\"" PACKAGE_NAME "\" id=\"form3270\" >"; | |
445 | - static const char * suffix = "</form>"; | |
408 | + static const char * prefix = "<form name=\"" PACKAGE_NAME "\" id=\"form3270\" >\n"; | |
409 | + static const char * suffix = "</form>\n"; | |
446 | 410 | char *text = info.text; |
447 | 411 | |
448 | 412 | info.text = lib3270_malloc(strlen(prefix)+strlen(suffix)+strlen(text)+4); |
... | ... | @@ -454,7 +418,24 @@ |
454 | 418 | lib3270_free(text); |
455 | 419 | } |
456 | 420 | |
457 | - return lib3270_realloc(info.text,strlen(info.text)+2); | |
421 | + info.text = lib3270_realloc(info.text,strlen(info.text)+2); | |
422 | + | |
423 | +#if defined(DEBUG) || defined(ANDROID) | |
424 | + { | |
425 | + char *text = strdup(info.text); | |
426 | + char *save; | |
427 | + char *ptr; | |
428 | + | |
429 | + for(ptr=strtok_r(text,"\n",&save);ptr;ptr = strtok_r(NULL,"\n",&save)) | |
430 | + { | |
431 | + trace("%s",ptr); | |
432 | + } | |
433 | + | |
434 | + free(text); | |
435 | + } | |
436 | +#endif // DEBUG | |
437 | + | |
438 | + return info.text; | |
458 | 439 | } |
459 | 440 | |
460 | 441 | ... | ... |