Commit 8469c3a2f87a5779df61f6821ffb3458322733dc
1 parent
4d321221
Exists in
master
and in
3 other branches
Copia para clipboard funcionando; "text-only" por enquanto
Showing
8 changed files
with
86 additions
and
56 deletions
Show diff stats
charset.c
... | ... | @@ -178,8 +178,7 @@ wide_resource_init(char *csname) |
178 | 178 | /* |
179 | 179 | * Change character sets. |
180 | 180 | */ |
181 | -enum cs_result | |
182 | -charset_init(char *csname) | |
181 | +enum cs_result charset_init(H3270 *session, char *csname) | |
183 | 182 | { |
184 | 183 | char *cs, *ftcs; |
185 | 184 | enum cs_result rc; |
... | ... | @@ -207,17 +206,7 @@ charset_init(char *csname) |
207 | 206 | charset_defaults(); |
208 | 207 | set_cgcsgids(CN); |
209 | 208 | set_charset_name(CN); |
210 | - set_display_charset("iso8859-1"); | |
211 | - | |
212 | -/* | |
213 | -#if defined(_WIN32) || defined(LIB3270) | |
214 | - set_display_charset("iso8859-1"); | |
215 | -#elif defined(X3270_DISPLAY) || (defined(C3270) && !defined(_WIN32)) | |
216 | - (void) screen_new_display_charsets(default_display_charset,"us"); | |
217 | -#else | |
218 | - utf8_set_display_charsets(default_display_charset, "us"); | |
219 | -#endif | |
220 | -*/ | |
209 | + set_display_charset(session, "ISO-8859-1"); | |
221 | 210 | |
222 | 211 | return CS_OKAY; |
223 | 212 | } |
... | ... | @@ -373,8 +362,7 @@ set_charset_name(char *csname) |
373 | 362 | } |
374 | 363 | |
375 | 364 | /* Define a charset from resources. */ |
376 | -static enum cs_result | |
377 | -resource_charset(char *csname, char *cs, char *ftcs) | |
365 | +static enum cs_result resource_charset(char *csname, char *cs, char *ftcs) | |
378 | 366 | { |
379 | 367 | enum cs_result rc; |
380 | 368 | int ne = 0; |
... | ... | @@ -454,10 +442,12 @@ resource_charset(char *csname, char *cs, char *ftcs) |
454 | 442 | #if defined(_WIN32) /*[*/ |
455 | 443 | /* See about changing the console output code page. */ |
456 | 444 | dcs = get_fresource("%s.%s", ResDisplayCharset, csname); |
457 | - if (dcs != NULL) { | |
445 | + if (dcs != NULL) | |
446 | + { | |
458 | 447 | set_display_charset(dcs); |
459 | - } else { | |
460 | - set_display_charset("iso8859-1"); | |
448 | + } else | |
449 | + { | |
450 | + set_display_charset("ISO-8859-1"); | |
461 | 451 | } |
462 | 452 | #endif /*]*/ |
463 | 453 | |
... | ... | @@ -744,10 +734,13 @@ check_charset(void) |
744 | 734 | } |
745 | 735 | #endif /*]*/ |
746 | 736 | |
747 | -/* Return the current character set name. */ | |
748 | -char * | |
749 | -get_charset_name(void) | |
737 | +void set_display_charset(H3270 *session, char *dcs) | |
738 | +{ | |
739 | + session->charset = strdup(dcs); | |
740 | +} | |
741 | + | |
742 | +LIB3270_EXPORT const char * lib3270_get_charset(H3270 *session) | |
750 | 743 | { |
751 | - return (charset_name != CN)? charset_name: | |
752 | - ((appres.charset != CN)? appres.charset: "us"); | |
744 | + CHECK_SESSION_HANDLE(session); | |
745 | + return session->charset ? session->charset : "ISO-8859-1"; | |
753 | 746 | } | ... | ... |
charsetc.h
... | ... | @@ -35,7 +35,8 @@ LIB3270_INTERNAL char *default_display_charset; |
35 | 35 | |
36 | 36 | enum cs_result { CS_OKAY, CS_NOTFOUND, CS_BAD, CS_PREREQ, CS_ILLEGAL }; |
37 | 37 | |
38 | -LIB3270_INTERNAL enum cs_result charset_init(char *csname); | |
39 | -LIB3270_INTERNAL char *get_charset_name(void); | |
40 | -LIB3270_INTERNAL void set_display_charset(char *dcs); | |
38 | +LIB3270_INTERNAL enum cs_result charset_init(H3270 *session, char *csname); | |
39 | +// LIB3270_INTERNAL char *get_charset_name(void); | |
40 | + | |
41 | +LIB3270_INTERNAL void set_display_charset(H3270 *session, char *dcs); | |
41 | 42 | ... | ... |
glue.c
... | ... | @@ -138,6 +138,13 @@ void lib3270_session_free(H3270 *h) |
138 | 138 | } |
139 | 139 | } |
140 | 140 | |
141 | + // Release memory | |
142 | + if(h->charset) | |
143 | + { | |
144 | + free(h->charset); | |
145 | + h->charset = NULL; | |
146 | + } | |
147 | + | |
141 | 148 | } |
142 | 149 | |
143 | 150 | static void update_char(H3270 *session, int addr, unsigned char chr, unsigned short attr, unsigned char cursor) |
... | ... | @@ -259,10 +266,10 @@ H3270 * lib3270_session_new(const char *model) |
259 | 266 | return NULL; |
260 | 267 | |
261 | 268 | Trace("Charset: %s",appres.charset); |
262 | - if (charset_init(appres.charset) != CS_OKAY) | |
269 | + if (charset_init(hSession,appres.charset) != CS_OKAY) | |
263 | 270 | { |
264 | - Warning(NULL, _( "Cannot find charset \"%s\", using defaults" ), appres.charset); | |
265 | - (void) charset_init(CN); | |
271 | + Warning(hSession, _( "Cannot find charset \"%s\", using defaults" ), appres.charset); | |
272 | + (void) charset_init(hSession,CN); | |
266 | 273 | } |
267 | 274 | |
268 | 275 | kybd_init(); | ... | ... |
macros.c
printer.c
... | ... | @@ -314,7 +314,7 @@ printer_start(const char *lu) |
314 | 314 | "for pr3287\n"); |
315 | 315 | (void) fprintf(f, "# Created by %s\n", build); |
316 | 316 | (void) fprintf(f, "# Chararter set is '%s'\n", |
317 | - get_charset_name()); | |
317 | + lib3270_get_charset(&h3270)); | |
318 | 318 | (void) fprintf(f, "cgcsgid=0x%08lx\n", cgcsgid); |
319 | 319 | #if defined(X3270_DBCS) /*[*/ |
320 | 320 | if (dbcs) { | ... | ... |
screen.c
... | ... | @@ -91,11 +91,6 @@ static void status_connect(H3270 *session, int ignored, void *dunno); |
91 | 91 | static void status_3270_mode(H3270 *session, int ignored, void *dunno); |
92 | 92 | static void status_printer(H3270 *session, int on, void *dunno); |
93 | 93 | static unsigned short color_from_fa(unsigned char fa); |
94 | -// static void relabel(H3270 *session, int ignored, void *dunno); | |
95 | - | |
96 | -void set_display_charset(char *dcs) | |
97 | -{ | |
98 | -} | |
99 | 94 | |
100 | 95 | static void addch(H3270 *session, int baddr, unsigned char c, unsigned short attr) |
101 | 96 | { | ... | ... |
selection.c
... | ... | @@ -36,6 +36,20 @@ |
36 | 36 | |
37 | 37 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
38 | 38 | |
39 | +static void get_selected_addr(H3270 *session, int *begin, int *end) | |
40 | +{ | |
41 | + if(session->select.begin > session->select.end) | |
42 | + { | |
43 | + *end = session->select.begin; | |
44 | + *begin = session->select.end; | |
45 | + } | |
46 | + else | |
47 | + { | |
48 | + *begin = session->select.begin; | |
49 | + *end = session->select.end; | |
50 | + } | |
51 | +} | |
52 | + | |
39 | 53 | static void update_selected_rectangle(H3270 *session) |
40 | 54 | { |
41 | 55 | struct |
... | ... | @@ -44,16 +58,10 @@ static void update_selected_rectangle(H3270 *session) |
44 | 58 | int col; |
45 | 59 | } p[2]; |
46 | 60 | |
47 | - int begin = session->select.begin; | |
48 | - int end = session->select.end; | |
49 | - int row, col, baddr; | |
50 | 61 | |
51 | - if(begin > end) | |
52 | - { | |
53 | - baddr = end; | |
54 | - end = begin; | |
55 | - begin = baddr; | |
56 | - } | |
62 | + int begin, end, row, col, baddr; | |
63 | + | |
64 | + get_selected_addr(session,&begin,&end); | |
57 | 65 | |
58 | 66 | // Get start & end posision |
59 | 67 | p[0].row = (begin/session->cols); |
... | ... | @@ -95,17 +103,10 @@ static void update_selected_rectangle(H3270 *session) |
95 | 103 | |
96 | 104 | static void update_selected_region(H3270 *session) |
97 | 105 | { |
98 | - int baddr; | |
99 | - int begin = session->select.begin; | |
100 | - int end = session->select.end; | |
101 | - int len = session->rows*session->cols; | |
106 | + int baddr,begin,end; | |
107 | + int len = session->rows*session->cols; | |
102 | 108 | |
103 | - if(begin > end) | |
104 | - { | |
105 | - baddr = end; | |
106 | - end = begin; | |
107 | - begin = baddr; | |
108 | - } | |
109 | + get_selected_addr(session,&begin,&end); | |
109 | 110 | |
110 | 111 | // First remove unselected areas |
111 | 112 | for(baddr = 0; baddr < begin; baddr++) |
... | ... | @@ -310,3 +311,36 @@ LIB3270_ACTION( reselect ) |
310 | 311 | return 0; |
311 | 312 | } |
312 | 313 | |
314 | +LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) | |
315 | +{ | |
316 | + int row, col, baddr; | |
317 | + char *ret; | |
318 | + size_t sz = 0; | |
319 | + | |
320 | + if(!hSession->selected || hSession->select.begin == hSession->select.end) | |
321 | + return NULL; | |
322 | + | |
323 | + ret = malloc(hSession->rows * (hSession->cols+1)); | |
324 | + | |
325 | + baddr = 0; | |
326 | + for(row=0;row < hSession->rows;row++) | |
327 | + { | |
328 | + int cr = 0; | |
329 | + | |
330 | + for(col = 0; col < hSession->cols;col++) | |
331 | + { | |
332 | + if(hSession->ea_buf[baddr].attr & LIB3270_ATTR_SELECTED) | |
333 | + { | |
334 | + cr++; | |
335 | + ret[sz++] = hSession->ea_buf[baddr].chr; | |
336 | + } | |
337 | + baddr++; | |
338 | + } | |
339 | + | |
340 | + if(cr) | |
341 | + ret[sz++] = '\n'; | |
342 | + } | |
343 | + ret[sz] = 0; | |
344 | + | |
345 | + return realloc(ret,sz+1); | |
346 | +} | ... | ... |
trace_ds.c
... | ... | @@ -429,7 +429,7 @@ create_tracefile_header(const char *mode) |
429 | 429 | if (appres.extended) |
430 | 430 | wtrace(", extended data stream"); |
431 | 431 | wtrace(", %s emulation", appres.m3279 ? "color" : "monochrome"); |
432 | - wtrace(", %s charset", get_charset_name()); | |
432 | + wtrace(", %s charset", lib3270_get_charset(&h3270)); | |
433 | 433 | if (appres.apl_mode) |
434 | 434 | wtrace(", APL mode"); |
435 | 435 | wtrace("\n"); | ... | ... |