Commit cc6ee66d291bbba064b144281b0e8b3d0085b329

Authored by perry.werneck@gmail.com
1 parent 4b7d100d

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 {
... ...