From 9ed6bd9aee23fe8548ecb8095a2550cec85adc5e Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Tue, 4 Sep 2012 14:46:47 +0000 Subject: [PATCH] Corrigindo tratamento de atributos na opção "cut" --- src/include/lib3270.h | 2 ++ src/lib3270/ctlr.c | 21 +++++++++++++++++++++ src/lib3270/selection.c | 55 ++++++++++++++++++++++++++++++++++++------------------- 3 files changed, 59 insertions(+), 19 deletions(-) diff --git a/src/include/lib3270.h b/src/include/lib3270.h index e0f9ef7..d4be6b8 100644 --- a/src/include/lib3270.h +++ b/src/include/lib3270.h @@ -792,6 +792,8 @@ */ LIB3270_EXPORT int lib3270_field_addr(H3270 *h, int baddr); + LIB3270_EXPORT int lib3270_field_attribute(H3270 *hSession, int baddr); + /** * Get the length of the field at given buffer address. * diff --git a/src/lib3270/ctlr.c b/src/lib3270/ctlr.c index 752cbab..7250f26 100644 --- a/src/lib3270/ctlr.c +++ b/src/lib3270/ctlr.c @@ -326,6 +326,27 @@ LIB3270_EXPORT int lib3270_field_addr(H3270 *hSession, int baddr) return -1; } +LIB3270_EXPORT int lib3270_field_attribute(H3270 *hSession, int baddr) +{ + int sbaddr; + + CHECK_SESSION_HANDLE(hSession); + + if (!hSession->formatted) + return -1; + + sbaddr = baddr; + do + { + if(hSession->ea_buf[baddr].fa) + return hSession->ea_buf[baddr].fa; + DEC_BA(baddr); + } while (baddr != sbaddr); + + return -1; +} + + /* * Get Field width */ diff --git a/src/lib3270/selection.c b/src/lib3270/selection.c index 15e3af4..368b54e 100644 --- a/src/lib3270/selection.c +++ b/src/lib3270/selection.c @@ -554,46 +554,63 @@ LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) { int end; size_t szText; - int baddr; - int saddr; + int daddr; /* Destination addr */ + int dattr; /* Destination addr attribute */ + int saddr; /* Source addr (First field after the selected area) */ + int sattr; /* Source addr attribute */ char *text; int f; - get_selected_addr(hSession,&baddr,&end); + get_selected_addr(hSession,&daddr,&end); - if(baddr >= end) + if(daddr >= end) return NULL; - szText = (end-baddr)+1; + dattr = lib3270_field_attribute(hSession,daddr); /* Get first attribute */ + + szText = (end-daddr)+1; text = lib3270_malloc(szText+1); - saddr = baddr+szText; + saddr = daddr+szText; + sattr = lib3270_field_attribute(hSession,saddr); for(f=0;ftext[baddr].chr; + if(hSession->ea_buf[daddr].fa) + dattr = hSession->ea_buf[daddr].fa; - if(FA_IS_PROTECTED(hSession->ea_buf[saddr].fa)) - saddr = lib3270_get_next_unprotected(hSession,saddr); + text[f] = hSession->text[daddr].chr; - if(!FA_IS_PROTECTED(hSession->ea_buf[saddr].fa)) + if(!FA_IS_PROTECTED(dattr)) { - if(hSession->text[baddr].chr != hSession->text[saddr].chr) + if(hSession->ea_buf[saddr].fa) + sattr = hSession->ea_buf[saddr].fa; + + if(FA_IS_PROTECTED(sattr)) { - hSession->text[baddr].chr = hSession->text[saddr].chr; - hSession->update(hSession,baddr,hSession->text[baddr].chr,hSession->text[baddr].attr,baddr == hSession->cursor_addr); + saddr = lib3270_get_next_unprotected(hSession,saddr); + sattr = lib3270_field_attribute(hSession,saddr); } - if(hSession->text[saddr].chr != ' ') + if(!FA_IS_PROTECTED(sattr)) { - hSession->text[saddr].chr = ' '; - hSession->update(hSession,saddr,hSession->text[saddr].chr,hSession->text[saddr].attr,saddr == hSession->cursor_addr); + if(hSession->text[daddr].chr != hSession->text[saddr].chr) + { + hSession->text[daddr].chr = hSession->text[saddr].chr; + hSession->update(hSession,daddr,hSession->text[daddr].chr,hSession->text[daddr].attr,daddr == hSession->cursor_addr); + } + + if(hSession->text[saddr].chr != ' ') + { + hSession->text[saddr].chr = ' '; + hSession->update(hSession,saddr,hSession->text[saddr].chr,hSession->text[saddr].attr,saddr == hSession->cursor_addr); + } + + saddr++; } - - saddr++; } - baddr++; + daddr++; } lib3270_unselect(hSession); -- libgit2 0.21.2