SOURCES: pine-charset-editorial.patch (NEW), pine-iconv-no-explain...
blues
blues at pld-linux.org
Thu Mar 29 16:21:22 CEST 2007
Author: blues Date: Thu Mar 29 14:21:22 2007 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- first part stollen from SuSE
---- Files affected:
SOURCES:
pine-charset-editorial.patch (NONE -> 1.1) (NEW), pine-iconv-no-explain.patch (NONE -> 1.1) (NEW), pine-optionally_enter.patch (NONE -> 1.1) (NEW), pine-multipart-alternative-conversion.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/pine-charset-editorial.patch
diff -u /dev/null SOURCES/pine-charset-editorial.patch:1.1
--- /dev/null Thu Mar 29 16:21:22 2007
+++ SOURCES/pine-charset-editorial.patch Thu Mar 29 16:21:17 2007
@@ -0,0 +1,27 @@
+--- pine/mailview.c 2004/08/21 01:23:41 1.1
++++ pine/mailview.c 2004/08/21 01:28:01
+@@ -192,6 +192,8 @@
+ #define CHARSET_DISCLAIMER_2 "display is set"
+ #define CHARSET_DISCLAIMER_3 \
+ " for the \"%.40s\" character set. \015\012Some %.40scharacters may be displayed incorrectly."
++#define CHARSET_DISCLAIMER_4 \
++ " for the \"%.40s\" character set. \015\012Error: character set unkown or conversion not supported."
+ #define ENCODING_DISCLAIMER \
+ "The following text contains the unknown encoding type \"%.20s\". \015\012Some or all of the text may be displayed incorrectly."
+
+@@ -2143,9 +2145,14 @@
+ *p = '\0';
+ }
+
+- sprintf(p, CHARSET_DISCLAIMER_3,
++ if (quality == CV_NO_TRANSLATE_POSSIBLE)
++ sprintf(p, CHARSET_DISCLAIMER_4,
++ ps_global->VAR_CHAR_SET ? ps_global->VAR_CHAR_SET : "US-ASCII");
++ else {
++ sprintf(p, CHARSET_DISCLAIMER_3,
+ ps_global->VAR_CHAR_SET ? ps_global->VAR_CHAR_SET : "US-ASCII",
+ (quality == CV_LOSES_SPECIAL_CHARS) ? "special " : "");
++ }
+
+ return(format_editorial(buf, width, pc) == NULL
+ && gf_puts(NEWLINE, pc) && gf_puts(NEWLINE, pc));
================================================================
Index: SOURCES/pine-iconv-no-explain.patch
diff -u /dev/null SOURCES/pine-iconv-no-explain.patch:1.1
--- /dev/null Thu Mar 29 16:21:22 2007
+++ SOURCES/pine-iconv-no-explain.patch Thu Mar 29 16:21:17 2007
@@ -0,0 +1,31 @@
+# The charset label which is inserted before decoding the first RFC2047
+# encoded word could be done much in a much better way: it should be added
+# only when we know that we might have a bad conversion result
+# and it should be turned off with the quell-charset-waring config
+# flag. UTF-8 as ps_global->VAR_CHAR_SET should turn it off also.
+#
+# As a quick measure, at least when iconv is available for transliteration,
+# it can be turned off when a destination charset (ps_global->VAR_CHAR_SET)
+# is available, because the conversion should be reasonable and if the
+# charset is wanted, users can always look at the header and in addition,
+# there is the charset editoral which also generally displays the charset
+# of the mail:
+--- pine4.58/pine/strings.c 2003-08-28 00:28:42.000000000 +0200
++++ pine4.7l/pine/strings.c 2004-01-23 21:14:29.000000000 +0100
+@@ -2992,6 +3391,8 @@ rfc1522_decode(d, len, s, charset)
+ if(!cs)
+ cs = cpystr(cset);
+
++ if (!ps_global->VAR_CHAR_SET) {
++ /* We don't know where to convert to, so do a charset tag: */
+ if(charset){
+ if(!*charset) /* only write first charset */
+ *charset = cpystr(cset);
+@@ -3014,6 +3417,7 @@ rfc1522_decode(d, len, s, charset)
+ if(d-rv<len-1)
+ *d++ = SPACE;
+ }
++ }
+ }
+
+ /* based on encoding, write the encoded text to output buffer */
================================================================
Index: SOURCES/pine-optionally_enter.patch
diff -u /dev/null SOURCES/pine-optionally_enter.patch:1.1
--- /dev/null Thu Mar 29 16:21:22 2007
+++ SOURCES/pine-optionally_enter.patch Thu Mar 29 16:21:17 2007
@@ -0,0 +1,380 @@
+--- pine4.64/pine/osdep/termin.gen
++++ pine4.64/pine/osdep/termin.gen
+@@ -139,14 +139,93 @@
+ static struct display_line {
+ int row, col; /* where display starts */
+ int dlen; /* length of display line */
+- char *dl; /* line on display */
+- char *vl; /* virtual line */
++ int *dl; /* line on display */
++ int *vl; /* virtual line */
+ int vlen; /* length of virtual line */
+ int vused; /* length of virtual line in use */
+ int vbase; /* first virtual char on display */
+ } dline;
+
++/*
++ * In UTF-8 mode, decode byte sequencies and if a sequence is complete,
++ * insert the resulting Unicode(UCS4) value as cell value into the buffer.
++ */
++static int insert_byte(offset, c)
++unsigned int offset, c;
++{
++ static char linsert_buf[6], linsert_buf_count = 0;
++ if (gmode & P_UNICODE && c & 0x80) {
++ if (linsert_buf_count >= sizeof(linsert_buf))
++ linsert_buf_count = 0;
++ linsert_buf[linsert_buf_count++] = c;
++ c = 0;
++ if (linsert_buf_count > 1)
++ c = utf8_get_ucs(linsert_buf, linsert_buf_count);
++ if (!c)
++ return 0;
++ }
++ linsert_buf_count = 0;
++ int *s2;
++ for(s2 = &dline.vl[++dline.vused]; s2 - dline.vl > offset; s2--)
++ *s2 = *(s2-1);
++ dline.vl[offset] = c;
++ return 1;
++}
+
++/*----------------------------------------------------------------------
++ Write a character to the screen, keeping track of cursor position
++
++ Args: ch -- character to output
++
++ Result: character output
++ cursor position variables updated
++ ----*/
++void
++Writechar_UCS4(c)
++ register unsigned int c;
++{
++ if (gmode & P_UNICODE && c > 127) {
++ if (c & 0xf800) {
++ Writechar(0xe0 | (c >> 12), 0);
++ Writechar(0x80 | ((c >> 6) & 0x3f), 0);
++ }
++ else
++ Writechar(0xc0 | ((c >> 6) & 0x3f), 0);
++ Writechar(0x80 | (c & 0x3f), 0);
++ return;
++ }
++ Writechar(c, 0);
++}
++
++/*----------------------------------------------------------------------
++ ----*/
++void
++UCS4vektor_to_UTF8string(c, inchars, utf8, ospace)
++int *c;
++size_t inchars;
++unsigned char *utf8;
++int ospace;
++{
++ for(;inchars > 0 && ospace > 3 && *c; c++) {
++ if (gmode & P_UNICODE && *c > 127) {
++ if (*c & 0xf800) {
++ *utf8++ = 0xe0 | (*c >> 12);
++ *utf8++ = 0x80 | ((*c >> 6) & 0x3f);
++ ospace -= 3;
++ }
++ else {
++ ospace -= 2;
++ *utf8++ = 0xc0 | ((*c >> 6) & 0x3f);
++ }
++ *utf8++ = 0x80 | (*c & 0x3f);
++ }
++ else {
++ *utf8++ = *c;
++ ospace--;
++ }
++ }
++ *utf8 = '\0';
++}
+
+ static struct key oe_keys[] =
+ {{"^G","Help",KS_SCREENHELP}, {"^C","Cancel",KS_NONE},
+@@ -217,12 +296,13 @@
+ int x_base, y_base, field_len;
+ int *flags;
+ {
+- register char *s2;
++ register int *s2;
+ register int field_pos;
+ int i, j, return_v, cols, ch, prompt_len, too_thin,
+ real_y_base, km_popped, passwd;
+ char *saved_original = NULL, *k, *kb;
+- char *kill_buffer = NULL;
++ int *kill_buffer = NULL;
++ size_t kb_len;
+ char **help_text;
+ int fkey_table[12];
+ struct key_menu *km;
+@@ -383,11 +463,14 @@
+ dline.dlen = 5;
+ }
+
+- dline.dl = fs_get((size_t)dline.dlen + 1);
+- memset((void *)dline.dl, 0, (size_t)(dline.dlen + 1) * sizeof(char));
++ dline.dl = fs_get((size_t)dline.dlen*4 + 4);
++ memset((void *)dline.dl, 0, (size_t)(dline.dlen*4 + 4) * sizeof(char));
+ dline.row = real_y_base;
+ dline.col = x_base + prompt_len;
+- dline.vl = string;
++
++ dline.vl = fs_get((size_t)field_len*4 + 4);
++ memset((void *)dline.vl, 0, (size_t)(field_len*4 + 4) * sizeof(char));
++
+ dline.vlen = --field_len; /* -1 for terminating NULL */
+ dline.vbase = field_pos = 0;
+
+@@ -399,12 +482,12 @@
+ /* make sure passed in string is shorter than field_len */
+ /* and adjust field_pos.. */
+
+- while((flags && *flags & OE_APPEND_CURRENT) &&
+- field_pos < field_len && string[field_pos] != '\0')
+- field_pos++;
++ if(flags && *flags & OE_APPEND_CURRENT)
++ for(kb = string; (i=strlen(kb)) > 0 && field_pos < field_len;)
++ dline.vl[field_pos++] = utf8_get_ucs_string(&kb, i);
+
+ string[field_pos] = '\0';
+- dline.vused = (int)(&string[field_pos] - string);
++ dline.vused = field_pos;
+ passwd = (flags && *flags & OE_PASSWD) ? 1 : 0;
+ line_paint(field_pos, &passwd);
+
+@@ -475,7 +558,7 @@
+ /*--------------- KEY RIGHT ---------------*/
+ case ctrl('F'):
+ case KEY_RIGHT:
+- if(field_pos >= field_len || string[field_pos] == '\0')
++ if(field_pos >= field_len || dline.vl[field_pos] == 0)
+ goto bleep;
+
+ line_paint(++field_pos, &passwd);
+@@ -499,13 +582,13 @@
+ */
+
+ /* skip thru current word */
+- while(string[field_pos]
+- && isalnum((unsigned char) string[field_pos]))
++ while(dline.vl[field_pos]
++ && isalnum((unsigned char) dline.vl[field_pos]))
+ field_pos++;
+
+ /* skip thru current white space to next word */
+- while(string[field_pos]
+- && !isalnum((unsigned char) string[field_pos]))
++ while(dline.vl[field_pos]
++ && !isalnum((unsigned char) dline.vl[field_pos]))
+ field_pos++;
+
+ line_paint(field_pos, &passwd);
+@@ -535,11 +618,11 @@
+ /*-------------------- Delete char --------------------*/
+ case ctrl('D'):
+ case KEY_DEL:
+- if(field_pos >= field_len || !string[field_pos])
++ if(field_pos >= field_len || !dline.vl[field_pos])
+ goto bleep;
+
+ dline.vused--;
+- for(s2 = &string[field_pos]; *s2 != '\0'; s2++)
++ for(s2 = &dline.vl[field_pos]; *s2 != 0; s2++)
+ *s2 = s2[1];
+
+ *s2 = '\0'; /* Copy last NULL */
+@@ -555,14 +638,15 @@
+ if(kill_buffer != NULL)
+ fs_give((void **)&kill_buffer);
+
+- if(field_pos != 0 || string[0]){
+- if(!passwd && F_ON(F_DEL_FROM_DOT, ps_global))
+- dline.vused -= strlen(&string[i = field_pos]);
+- else
+- dline.vused = i = 0;
++ if(field_pos != 0 || dline.vl[0]){
++ if(passwd || !F_ON(F_DEL_FROM_DOT, ps_global))
++ field_pos = 0;
++ kb_len = (dline.vused - field_pos)*4+4;
++ kill_buffer = fs_get(kb_len);
++ dline.vused = field_pos;
+
+- kill_buffer = cpystr(&string[field_pos = i]);
+- string[field_pos] = '\0';
++ memcpy(kill_buffer, &dline.vl[field_pos], kb_len);
++ dline.vl[field_pos] = 0;
+ line_paint(field_pos, &passwd);
+ if(flags) /* record change if requested */
+ *flags |= OE_USER_MODIFIED;
+@@ -576,7 +660,7 @@
+ if(kill_buffer == NULL)
+ goto bleep;
+
+- /* Make string so it will fit */
++ /* Make string so it will fit
+ kb = cpystr(kill_buffer);
+ dprint(2, (debugfile,
+ "Undelete: %d %d\n", strlen(string), field_len));
+@@ -584,24 +668,24 @@
+ kb[field_len - strlen(string)] = '\0';
+ dprint(2, (debugfile,
+ "Undelete: %d %d\n", field_len - strlen(string),
+- strlen(kb)));
++ strlen(kb))); */
+
+- if(string[field_pos] == '\0') {
++ if(dline.vl[field_pos] == 0) {
+ /*--- adding to the end of the string ----*/
+- for(k = kb; *k; k++)
+- string[field_pos++] = *k;
+-
+- string[field_pos] = '\0';
++ if ((field_len-field_pos)*4 < kb_len)
++ goto bleep;
++ memcpy(&dline.vl[field_pos], kill_buffer, kb_len);
++ field_pos = kb_len/4-1;
++ dline.vl[field_pos] = 0;
+ } else {
+ goto bleep;
+ /* To lazy to do insert in middle of string now */
+ }
+
+- if(*kb && flags) /* record change if requested */
++ if(flags) /* record change if requested */
+ *flags |= OE_USER_MODIFIED;
+
+- dline.vused = strlen(string);
+- fs_give((void **)&kb);
++ dline.vused = field_pos;
+ line_paint(field_pos, &passwd);
+ break;
+
+@@ -667,8 +748,8 @@
+ y_base = -3;
+ dline.row = real_y_base = y_base + ps_global->ttyo->screen_rows;
+ PutLine0(real_y_base, x_base, prompt);
+- fs_resize((void **)&dline.dl, (size_t)dline.dlen + 1);
+- memset((void *)dline.dl, 0, (size_t)(dline.dlen + 1));
++ fs_resize((void **)&dline.dl, (size_t)dline.dlen*4 + 4);
++ memset((void *)dline.dl, 0, (size_t)(dline.dlen*4 + 4));
+ line_paint(field_pos, &passwd);
+ break;
+ }
+@@ -765,8 +846,8 @@
+ } else {
+ dline.col = x_base + prompt_len;
+ dline.dlen = cols - (x_base + prompt_len + 1);
+- fs_resize((void **)&dline.dl, (size_t)dline.dlen + 1);
+- memset((void *)dline.dl, 0, (size_t)(dline.dlen + 1));
++ fs_resize((void **)&dline.dl, (size_t)dline.dlen*4 + 4);
++ memset((void *)dline.dl, 0, (size_t)(dline.dlen*4 + 4));
+ line_paint(field_pos, &passwd);
+ }
+ fflush(stdout);
+@@ -802,7 +883,7 @@
+ break;
+ }
+
+- if(iscntrl(ch & 0x7f)){
++ if(iscntrl(ch)){
+ bleep:
+ putc(BELL, stdout);
+ continue;
+@@ -813,14 +894,11 @@
+ if(dline.vused >= field_len)
+ goto bleep;
+
+- /*---- extending the length of the string ---*/
+- for(s2 = &string[++dline.vused]; s2 - string > field_pos; s2--)
+- *s2 = *(s2-1);
+-
+- string[field_pos++] = ch;
+- line_paint(field_pos, &passwd);
+- if(flags) /* record change if requested */
+- *flags |= OE_USER_MODIFIED;
++ if (insert_byte(field_pos, ch)) {
++ line_paint(++field_pos, &passwd);
++ if(flags) /* record change if requested */
++ *flags |= OE_USER_MODIFIED;
++ }
+
+ } /*---- End of switch on char ----*/
+ }
+@@ -830,6 +908,10 @@
+ mswin_showcaret(0);
+ #endif
+
++ UCS4vektor_to_UTF8string(dline.vl, dline.vused, string, field_len);
++ dprint(10, (debugfile, "converted: '%s'\n", string));
++
++ fs_give((void **)&dline.vl);
+ fs_give((void **)&dline.dl);
+ if(saved_original)
+ fs_give((void **)&saved_original);
+@@ -874,8 +955,8 @@
+ int offset; /* current dot offset into line */
+ int *passwd; /* flag to hide display of chars */
+ {
+- register char *pfp, *pbp;
+- register char *vfp, *vbp;
++ register int *pfp, *pbp;
++ register int *vfp, *vbp;
+ int extra = 0;
+ #define DLEN (dline.vbase + dline.dlen)
+
+@@ -992,15 +992,15 @@
+ if(dline.vbase){ /* off screen cue left */
+ vfp = &dline.vl[dline.vbase+1];
+ pfp = &dline.dl[1];
+- if(dline.dl[0] != '<'){
++ if(dline.dl[0] != 60 /* '<' */ ){
+ MoveCursor(dline.row, dline.col);
+- Writechar(dline.dl[0] = '<', 0);
++ Writechar(dline.dl[0] = 60 /* '<' */ , 0);
+ }
+ }
+ else{
+ vfp = dline.vl;
+ pfp = dline.dl;
+- if(dline.dl[0] == '<'){
++ if(dline.dl[0] == 60 /* '<' */ ){
+ MoveCursor(dline.row, dline.col);
+ Writechar(dline.dl[0] = ' ', 0);
+ }
+@@ -1009,16 +1009,16 @@
+ if(dline.vused > DLEN){ /* off screen right... */
+ vbp = vfp + (long)(dline.dlen-(dline.vbase ? 2 : 1));
+ pbp = pfp + (long)(dline.dlen-(dline.vbase ? 2 : 1));
+- if(pbp[1] != '>'){
++ if(pbp[1] != 62 /* '>' */ ){
+ MoveCursor(dline.row, dline.col+dline.dlen);
+- Writechar(pbp[1] = '>', 0);
++ Writechar(pbp[1] = 62 /* '>' */ , 0);
+ }
+ }
+ else{
+ extra = dline.dlen - (dline.vused - dline.vbase);
+ vbp = &dline.vl[max(0, dline.vused-1)];
+ pbp = &dline.dl[dline.dlen];
+- if(pbp[0] == '>'){
++ if(pbp[0] == 62 /* '>' */ ){
+ MoveCursor(dline.row, dline.col+dline.dlen);
+ Writechar(pbp[0] = ' ', 0);
+ }
+@@ -966,9 +1047,9 @@
+ MoveCursor(dline.row, dline.col + (int)(pfp - dline.dl));
+
+ do
+- Writechar((unsigned char)((vfp <= vbp && *vfp)
++ Writechar_UCS4(((vfp <= vbp && *vfp)
+ ? ((*pfp = *vfp++) == TAB) ? ' ' : *pfp
+- : (*pfp = ' ')), 0);
++ : (*pfp = ' ')));
+ while(++pfp <= pbp);
+ }
+
================================================================
Index: SOURCES/pine-multipart-alternative-conversion.patch
diff -u /dev/null SOURCES/pine-multipart-alternative-conversion.patch:1.1
--- /dev/null Thu Mar 29 16:21:22 2007
+++ SOURCES/pine-multipart-alternative-conversion.patch Thu Mar 29 16:21:17 2007
@@ -0,0 +1,27 @@
+--- pine4.64/pine/reply.c
++++ pine4.64/pine/reply.c
+@@ -4598,6 +4599,11 @@
+ body = mail_newbody();
+ body->type = TYPETEXT;
+ body->contents.text.data = msgtext;
++ /*
++ * For giving get_body_part_text the charset from which it has
++ * to convert from, reset afterwards to prevent double free!
++ */
++ body->parameter = part->body.parameter;
+
+ if(!(flags & FWD_ANON)){
+ forward_delimiter(pc);
+@@ -4609,6 +4611,12 @@
+ sect_prefix ? "." : "", flags & FWD_NESTED ? "1." : "",
+ partnum);
+ get_body_part_text(stream, body, msgno, tmp_buf, pc, NULL);
++ /*
++ * Reset it, otherwise send thinks it's not converted, and since
++ * the parameter list was not copied, only the pointer to it, it
++ * it needed to be reset to prevent a second, double free later!
++ */
++ body->parameter = NULL;
+ }
+ else
+ q_status_message(SM_ORDER | SM_DING, 3, 3,
================================================================
More information about the pld-cvs-commit
mailing list