Commit cc6ee66d291bbba064b144281b0e8b3d0085b329
1 parent
4b7d100d
Exists in
master
and in
5 other branches
Iniciando implementação da função "cut" respeitando os atributos
Showing
1 changed file
with
30 additions
and
12 deletions
Show diff stats
src/lib3270/selection.c
... | ... | @@ -378,7 +378,7 @@ static char * get_text(H3270 *hSession,unsigned char all, unsigned char tok) |
378 | 378 | char * ret; |
379 | 379 | size_t buflen = (hSession->rows * (hSession->cols+1))+1; |
380 | 380 | size_t sz = 0; |
381 | - unsigned short attr = 0; | |
381 | + unsigned short attr = 0xFFFF; | |
382 | 382 | |
383 | 383 | if(!(lib3270_connected(hSession) && hSession->text)) |
384 | 384 | { |
... | ... | @@ -390,14 +390,6 @@ static char * get_text(H3270 *hSession,unsigned char all, unsigned char tok) |
390 | 390 | |
391 | 391 | baddr = 0; |
392 | 392 | |
393 | - if(tok) | |
394 | - { | |
395 | - attr = hSession->text[baddr].attr; | |
396 | - ret[sz++] = tok; | |
397 | - ret[sz++] = (attr & 0x0F); | |
398 | - ret[sz++] = ((attr & 0xF0) >> 4); | |
399 | - } | |
400 | - | |
401 | 393 | for(row=0;row < hSession->rows;row++) |
402 | 394 | { |
403 | 395 | int cr = 0; |
... | ... | @@ -634,8 +626,9 @@ int cut_addr(H3270 *hSession, int daddr, int saddr, int maxlen, int *sattr) |
634 | 626 | return saddr; |
635 | 627 | } |
636 | 628 | |
637 | -LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) | |
629 | +char * cut_text(H3270 *hSession, char tok) | |
638 | 630 | { |
631 | + unsigned short attr = 0xFFFF; | |
639 | 632 | |
640 | 633 | CHECK_SESSION_HANDLE(hSession); |
641 | 634 | |
... | ... | @@ -656,6 +649,8 @@ LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) |
656 | 649 | { |
657 | 650 | int end; |
658 | 651 | size_t szText; |
652 | + size_t buflen; | |
653 | + size_t bufpos = 0; | |
659 | 654 | int daddr; /* Destination addr */ |
660 | 655 | int dattr; /* Destination addr attribute */ |
661 | 656 | int saddr; /* Source addr (First field after the selected area) */ |
... | ... | @@ -674,8 +669,10 @@ LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) |
674 | 669 | dattr = lib3270_field_attribute(hSession,daddr); /* Get first attribute */ |
675 | 670 | |
676 | 671 | szText = (end-daddr)+1; |
672 | + buflen = szText; | |
673 | + bufpos = 0; | |
677 | 674 | |
678 | - text = lib3270_malloc(szText+1); | |
675 | + text = lib3270_malloc(buflen+1); | |
679 | 676 | |
680 | 677 | saddr = daddr+szText; |
681 | 678 | sattr = lib3270_field_attribute(hSession,saddr); |
... | ... | @@ -685,7 +682,21 @@ LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) |
685 | 682 | if(hSession->ea_buf[daddr].fa) |
686 | 683 | dattr = hSession->ea_buf[daddr].fa; |
687 | 684 | |
688 | - text[f] = hSession->text[daddr].chr; | |
685 | + if((bufpos+10) > buflen) | |
686 | + { | |
687 | + buflen += 100; | |
688 | + text = lib3270_realloc(text,buflen); | |
689 | + } | |
690 | + | |
691 | + if(tok && attr != hSession->text[daddr].attr) | |
692 | + { | |
693 | + attr = hSession->text[daddr].attr; | |
694 | + text[bufpos++] = tok; | |
695 | + text[bufpos++] = (attr & 0x0F); | |
696 | + text[bufpos++] = ((attr & 0xF0) >> 4); | |
697 | + } | |
698 | + | |
699 | + text[bufpos++] = hSession->text[daddr].chr; | |
689 | 700 | |
690 | 701 | if(!FA_IS_PROTECTED(dattr)) |
691 | 702 | saddr = cut_addr(hSession,daddr,saddr,maxlen,&sattr); |
... | ... | @@ -693,6 +704,9 @@ LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) |
693 | 704 | daddr++; |
694 | 705 | } |
695 | 706 | |
707 | + text[bufpos++] = 0; | |
708 | + text = lib3270_realloc(text,bufpos); | |
709 | + | |
696 | 710 | // Move contents of the current field |
697 | 711 | while(daddr < (maxlen-1) && !hSession->ea_buf[daddr].fa) |
698 | 712 | { |
... | ... | @@ -712,6 +726,10 @@ LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) |
712 | 726 | return NULL; |
713 | 727 | } |
714 | 728 | |
729 | +LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) | |
730 | +{ | |
731 | + return cut_text(hSession,0); | |
732 | +} | |
715 | 733 | |
716 | 734 | LIB3270_EXPORT int lib3270_get_selection_bounds(H3270 *hSession, int *start, int *end) |
717 | 735 | { | ... | ... |