SOURCES: pine-pico-ucs4all.patch (NEW), pine-pico-ucs4GetKey.patch...
blues
blues at pld-linux.org
Thu Mar 29 16:42:33 CEST 2007
Author: blues Date: Thu Mar 29 14:42:33 2007 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- stollen from SuSE
---- Files affected:
SOURCES:
pine-pico-ucs4all.patch (NONE -> 1.1) (NEW), pine-pico-ucs4GetKey.patch (NONE -> 1.1) (NEW), pine-pico-ucs4isspace.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/pine-pico-ucs4all.patch
diff -u /dev/null SOURCES/pine-pico-ucs4all.patch:1.1
--- /dev/null Thu Mar 29 16:42:33 2007
+++ SOURCES/pine-pico-ucs4all.patch Thu Mar 29 16:42:28 2007
@@ -0,0 +1,610 @@
+I've done the attached patch for the pico of pine-4.61.
+It's solely my work, based on some of pine's existing code in this area.
+
+No line from any foreign source is included.
+
+This is an submission of the attached patch under the condition outlined
+in the pine legal notice:
+
+http://www.washington.edu/pine/overview/legal.html
+
+ "Submission of these patches to University of Washington
+ for possible inclusion in future Pine versions is also encouraged,
+ with the understanding that they would be treated the same as all
+ other Pine code in terms of licensing."
+
+I therefore encourage the University of Washington to look
+at the patch and consider inclusion in future Pine versions
+as outlined above under the licensing terms of pine.
+
+This patch does not remove code or features, only depends on features
+provided by the Single UNIX specification, version 2.
+
+This reference to the Single UNIX specification only applies
+to the detection of an UTF-8 locale, and for operating systems
+which don't support it this can be moved to OS-specific files.
+
+The only lines of code in this patch which is not my origninal code
+are the UTF-8 decoding and encoding routines, which are reused versions
+of the same decoding and encoding routines which existed in other parts
+of pine 4.61 already.
+
+Run thru the patch:
+
+* Extend the character storage in stuct CELL to 32-bit for UCS-4
+* Extend the kill and justify buffers the same way
+* Fix places where buffer data was unneccesary narrowed to 8-bit
+* replace the obsolete bit "P_LOCALLF" and use it as "P_UNICODE"
+ for selecting wether to store 8-bit characters for 32-bit
+ UCS-4 data in struct CELL, the storage container pico for characters.
+* change's setlocale_ctype default from 0 to 1 (default on)
+ (add the option -no_setlocale_ctype to disable setlocale)
+* call nl_langinfo(CODESET) to check for an UTF-8 charset
+ (this is only possible and done when setlocale(LC_CTYPE, "")
+ is enabled)
+* create a wrapper for linsert which collects UTF-8 bytes
+ on each call and if it finds a valid UTF-8 character,
+ it converts it to UCS-4 and passes it to linsert for
+ storing the incoming data as one UCS-4 code in a CELL
+* change the places where data is received from outside
+ sources to use the linsert wrapper instead of linsert.
+* extend ttputc() to check for UCS-4 codes and output the
+ corresponding UTF-8 sequence to the terminal.
+* extend ffputline to do the same of files output.
+* extend the search function to convert the search pattern
+ to UCS-4 and apply the search by maching the UCS-4 code
+ if pico is in Unicode mode
+* In forwsearch, use the easyest method to find successive
+ occurences of the pattern because the complicated method
+ does not work in Unicode(UTF-8/UCS-4)
+* extend the byte-oriented pico buffer read/write interface
+ for using pico as internal editor of pine to decode UTF-8
+ to UCS-4 cells on write and encode UCS-4 cells to UTF-8
+ on read. This allows pine 4.61 to use libpico as internal
+ editor on terminals using UTF-8 as charset.
+* To make this work, the patch extends pine to also look for
+ an locate setting which uses UTF-8 at character-set and
+ pass the information to activate Unicode mode to libpico.
+
+This set of changes, used on on Linux glibc-2.2 (or higher),
+results in a functional pico (stand-alone and inside pine)
+which, depending if the current locale, uses UTF-8 as charset
+(for the use in pine: or if UTF-8 is configured as character-set)
+for reads and writes to/from files and folders (compose and
+postpone of messages) as well as the terminal.
+
+Bernhard Kaindl
+diff -pruN -x '*~' -x '*.rej' -x '*.orig' pine4.63-patch11/pico/estruct.h pine4.63/pico/estruct.h
+--- pine4.63-patch11/pico/estruct.h 2004-11-30 17:39:55.000000000 -0700
++++ pine4.63/pico/estruct.h 2005-06-01 07:55:36.000000000 -0600
+@@ -290,7 +290,7 @@ typedef struct {
+ * and short if there are problems...
+ */
+ typedef struct CELL {
+- unsigned int c : 8; /* Character value in cell */
++ unsigned int c : 32; /* Character value in cell */
+ unsigned int a : 8; /* Its attributes */
+ } CELL;
+
+diff -pruN -x '*~' -x '*.rej' -x '*.orig' pine4.63-patch11/pico/file.c pine4.63/pico/file.c
+--- pine4.63-patch11/pico/file.c 2004-06-11 15:49:48.000000000 -0600
++++ pine4.63/pico/file.c 2005-06-01 07:55:36.000000000 -0600
+@@ -425,11 +425,11 @@ insmsgchar(c)
+ for(p = (glo_quote_str ? glo_quote_str
+ : (Pmaster ? Pmaster->quote_str : NULL));
+ p && *p; p++)
+- if(!linsert(1, *p))
++ if(!linsert_byte(1, *p))
+ return(0);
+ }
+ else if(c != '\r') /* ignore CR (likely CR of CRLF) */
+- return(linsert(1, c));
++ return(linsert_byte(1, c));
+
+ return(1);
+ }
+@@ -493,7 +493,7 @@ int rename; /* don't rename
+
+ case FIOLNG :
+ for(linep = line; charsread-- > 0; linep++)
+- linsert(1, (unsigned char) *linep);
++ linsert_byte(1, *linep);
+
+ break;
+
+@@ -910,7 +910,7 @@ char fname[];
+
+ case FIOLNG :
+ for(linep = line; charsread-- > 0; linep++)
+- linsert(1, (unsigned char) *linep);
++ linsert_byte(1, *linep);
+
+ break;
+
+diff -pruN -x '*~' -x '*.rej' -x '*.orig' pine4.63-patch11/pico/fileio.c pine4.63/pico/fileio.c
+--- pine4.63-patch11/pico/fileio.c 2002-02-12 15:54:21.000000000 -0700
++++ pine4.63/pico/fileio.c 2005-06-01 07:55:36.000000000 -0600
+@@ -71,9 +71,20 @@ ffputline(buf, nbuf)
+ {
+ register int i;
+
+- for (i = 0; i < nbuf; ++i)
++ for (i = 0; i < nbuf; ++i) {
++ if (gmode & P_UNICODE && buf[i].c & 0xffffff80) {
++ if (buf[i].c & 0xf800) {
++ fputc(0xe0 | (buf[i].c >> 12), g_pico_fio.fp);
++ fputc(0x80 | ((buf[i].c >> 6) & 0x3f), g_pico_fio.fp);
++ }
++ else
++ fputc(0xc0 | ((buf[i].c >> 6) & 0x3f), g_pico_fio.fp);
++ if (fputc(0x80 | (buf[i].c & 0x3f), g_pico_fio.fp) == EOF)
++ break;
++ } else
+ if(fputc(buf[i].c&0xFF, g_pico_fio.fp) == EOF)
+ break;
++ }
+
+ if(i == nbuf)
+ fputc('\n', g_pico_fio.fp);
+diff -pruN -x '*~' -x '*.rej' -x '*.orig' pine4.63-patch11/pico/line.c pine4.63/pico/line.c
+--- pine4.63-patch11/pico/line.c 2004-05-07 15:41:16.000000000 -0600
++++ pine4.63/pico/line.c 2005-06-01 07:55:36.000000000 -0600
+@@ -51,7 +51,7 @@ static char rcsid[] = "$Id: line.c,v 4.3
+ */
+ struct pkchunk {
+ short used; /* # of bytes used in this buffer*/
+- char bufp[KBLOCK]; /* buffer containing text */
++ int bufp[KBLOCK]; /* buffer containing text */
+ struct pkchunk *next; /* pointer to next chunk */
+ };
+
+@@ -210,6 +210,83 @@ int f, n;
+ backchar(f, n);
+ }
+
++/* Return UCS-4 character from UTF-8 string
++ * (Based on code from pine-4.61/imap/src/c-client/utf8.c)
++ * Accepts: pointer to string, remaining octets in string
++ * Returns: UCS-4 character or negative if error
++ */
++unsigned int utf8_get_ucs_string(unsigned char **s, unsigned int i)
++{
++ unsigned char c;
++ unsigned int ret = 0;
++ int more = 0;
++ while (i--) {
++ if (((c = *(*s)++) > 0x7f) && (c < 0xc0)) { /* UTF-8 continuation? */
++ if (!more) /* continuation outside of UTF-8 sequence? */
++ return '?'; /* bad sequence, put replacement character */
++ ret <<= 6;
++ ret |= c & 0x3f;
++ if (!--more) /* last octet reached? */
++ return ret; /* return UTC-4 code */
++ }
++ else if (more) /* in sequence, but not a continuation byte */
++ return '?'; /* bad sequence, put replacement character */
++ else if (c < 0x80) /* U+0000 - U+007f */
++ return c;
++ else if (c < 0xe0) { /* U+0080 - U+07ff */
++ ret = c & 0x1f; /* first 5 bits of 12 */
++ more = 1;
++ }
++ else if (c < 0xf0) { /* U+1000 - U+ffff */
++ ret = c & 0x0f; /* first 4 bits of 16 */
++ more = 2;
++ } /* non-BMP Unicode */
++ else if (c < 0xf8) { /* U+10000 - U+10ffff (U+1fffff) */
++ ret = c & 0x07; /* first 3 bits of 20.5 (21) */
++ more = 3;
++ }
++ else if (c < 0xfc) { /* ISO 10646 200000 - 3fffffff */
++ ret = c & 0x03; /* first 2 bits of 26 */
++ more = 4;
++ }
++ else if (c < 0xfe) { /* ISO 10646 4000000-7fffffff */
++ ret = c & 0x01; /* first bit of 31 */
++ more = 5;
++ } else
++ return '?'; /* not in ISO 10646 -> replacement character */
++ } /* end of input, but sequnece not complete */
++ return 0;
++}
++unsigned int utf8_get_ucs(unsigned char *s, unsigned int i)
++{
++ unsigned char *l = s;
++ return utf8_get_ucs_string(&l, i);
++}
++
++/*
++ * Insert "n" copies of the character "c" at the current location of dot.
++ * The real work is done by linsert(). This is a wrapper does:
++ * 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.
++ */
++int linsert_byte(n, c)
++unsigned int n, c;
++{
++ static char linsert_buf[6], linsert_buf_count = 0;
++ if (n == 1 && 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 1;
++ }
++ linsert_buf_count = 0;
++ return linsert(n, c);
++}
++
+ /*
+ * Insert "n" copies of the character "c" at the current location of dot. In
+ * the easy case all that happens is the text is stored in the line. In the
+@@ -294,7 +371,7 @@ long *lines;
+ lp1->l_bp = lp2;
+ *doto = n;
+ *dotp = lp1;
+- ac.c = ((char)c & 0xff);
++ ac.c = c;
+ cp1 = &(*dotp)->l_text[0];
+ while(n--)
+ *cp1++ = ac;
+@@ -342,7 +419,7 @@ long *lines;
+ *--cp2 = *--cp1;
+ }
+
+- ac.c = ((char)c & 0xff);
++ ac.c = c;
+ while(n--) /* add the chars */
+ (*dotp)->l_text[(*doto)++] = ac;
+
+@@ -767,7 +844,7 @@ pkbufremove(n, buf)
+ if(!(p = p->next))
+ return(-1);
+
+- return(p->bufp[n % KBLOCK] & 0xff);
++ return(p->bufp[n % KBLOCK]);
+ }
+ else
+ return(-1);
+diff -pruN -x '*~' -x '*.rej' -x '*.orig' pine4.63-patch11/pico/main.c pine4.63/pico/main.c
+--- pine4.63-patch11/pico/main.c 2004-05-07 15:41:16.000000000 -0600
++++ pine4.63/pico/main.c 2005-06-01 07:55:36.000000000 -0600
+@@ -119,7 +119,6 @@ char *args_pico_args[] = {
+ #endif
+ "\t +[line#] \tLine - start on line# line, default=1",
+ "\t -v \t\tView - view file",
+-"\t -setlocale_ctype\tdo setlocale(LC_CTYPE) if available",
+ "\t -no_setlocale_collate\tdo not do setlocale(LC_COLLATE)",
+ "\t -version\tPico version number",
+ "",
+@@ -146,7 +145,7 @@ char *argv[];
+ int viewflag = FALSE; /* are we starting in view mode?*/
+ int starton = 0; /* where's dot to begin with? */
+ int setlocale_collate = 1;
+- int setlocale_ctype = 0;
++ int setlocale_ctype = 1; /* if a problem shows up, should be fixed */
+ char bname[NBUFN]; /* buffer name of file to read */
+ char *file_to_edit = NULL;
+
+diff -pruN -x '*~' -x '*.rej' -x '*.orig' pine4.63-patch11/pico/osdep/unix pine4.63/pico/osdep/unix
+--- pine4.63-patch11/pico/osdep/unix 2005-04-19 15:28:56.000000000 -0600
++++ pine4.63/pico/osdep/unix 2005-06-01 07:55:37.000000000 -0600
+@@ -1,3 +1,7 @@
++#ifdef LC_CTYPE
++#include <langinfo.h>
++#endif
++
+ int timeo = 0;
+ time_t time_of_last_input;
+ int (*pcollator)();
+@@ -221,6 +225,15 @@ ttgetwinsz(row, col)
+ */
+ ttputc(c)
+ {
++ if (gmode & P_UNICODE && c > 127) {
++ if (c & 0xf800) {
++ putc(0xe0 | (c >> 12), stdout);
++ putc(0x80 | ((c >> 6) & 0x3f), stdout);
++ }
++ else
++ putc(0xc0 | ((c >> 6) & 0x3f), stdout);
++ return putc(0x80 | (c & 0x3f), stdout);
++ }
+ return(putc(c, stdout));
+ }
+
+@@ -3871,6 +3884,9 @@ set_collation(collation, ctype)
+ #ifdef LC_CTYPE
+ if(ctype){
+ (void)setlocale(LC_CTYPE, "");
++ /* For reference, see: "The Single UNIX(R) Specification, Version 2" */
++ if (!strcmp(nl_langinfo(CODESET), "UTF-8"))
++ gmode ^= P_UNICODE;
+ }
+ #endif
+ }
+diff -pruN -x '*~' -x '*.rej' -x '*.orig' pine4.63-patch11/pico/pico.c pine4.63/pico/pico.c
+--- pine4.63-patch11/pico/pico.c 2005-03-31 10:08:57.000000000 -0700
++++ pine4.63/pico/pico.c 2005-06-01 07:55:37.000000000 -0600
+@@ -540,7 +540,7 @@ int c, f, n;
+
+ /* do the appropriate insertion */
+ /* pico never does C mode, this is simple */
+- status = linsert(n, c);
++ status = linsert_byte(n, c);
+
+ /*
+ * Check to make sure we didn't go off of the screen
+@@ -1451,6 +1451,7 @@ typedef struct picotext {
+ LINE *dotp;
+ int doto;
+ short crinread;
++ char readch[6];
+ } PICOTEXT;
+
+ #define PT(X) ((PICOTEXT *)(X))
+@@ -1504,6 +1505,8 @@ void *w;
+ * pico_readc - return char at current point. Up to calling routines
+ * to keep cumulative count of chars.
+ */
++#define PUTC(w, c) PT(w)->readch[PT(w)->crinread++] = c;
++#define GETC(w) PT(w)->readch[--PT(w)->crinread];
+ int
+ pico_readc(w, c)
+ void *w;
+@@ -1512,12 +1515,20 @@ unsigned char *c;
+ int rv = 0;
+
+ if(PT(w)->crinread){
+- *c = '\012'; /* return LF */
+- PT(w)->crinread = 0;
++ *c = GETC(w);
+ rv++;
+ }
+ else if(PT(w)->doto < llength(PT(w)->dotp)){ /* normal char to return */
+- *c = (unsigned char) lgetc(PT(w)->dotp, (PT(w)->doto)++).c;
++ int ch = lgetc(PT(w)->dotp, (PT(w)->doto)++).c;
++ if (gmode & P_UNICODE && ch & 0xff80) {
++ PUTC(w, 0x80 | (ch & 0x3f))
++ if (ch & 0xf800) { /* three byte code */
++ *c = 0xe0 | (ch >> 12);
++ PUTC(w, 0x80 | ((ch >> 6) & 0x3f))
++ } else
++ *c = 0xc0 | ((ch >> 6) & 0x3f);
++ } else
++ *c = ch;
+ rv++;
+ }
+ else if(PT(w)->dotp != PT(w)->linep){ /* return line break */
+@@ -1525,7 +1536,7 @@ unsigned char *c;
+ PT(w)->doto = 0;
+ #if defined(DOS) || defined(OS2)
+ *c = '\015';
+- PT(w)->crinread++;
++ PUTC(w, '\012')
+ #else
+ *c = '\012'; /* return local eol! */
+ #endif
+@@ -1584,8 +1595,20 @@ int c;
+
+ rv++;
+ }
+- else
++ else {
++ if (gmode & P_UNICODE && c & 0xffffff80) {
++ if (PT(w)->crinread >= 6)
++ PT(w)->crinread = 0;
++ PUTC(w, c);
++ c = 0;
++ if (PT(w)->crinread > 1)
++ c = utf8_get_ucs(PT(w)->readch, PT(w)->crinread);
++ if (!c)
++ return 1;
++ }
++ PT(w)->crinread = 0;
+ rv = geninsert(&PT(w)->dotp, &PT(w)->doto, PT(w)->linep, c, 0, 1, NULL);
++ }
+
+ return((rv) ? 1 : 0); /* return number written */
+ }
+diff -pruN -x '*~' -x '*.rej' -x '*.orig' pine4.63-patch11/pico/pico.h pine4.63/pico/pico.h
+--- pine4.63-patch11/pico/pico.h 2005-03-30 15:44:42.000000000 -0700
++++ pine4.63/pico/pico.h 2005-06-01 07:55:37.000000000 -0600
+@@ -356,7 +356,7 @@ extern void kbdestroy PROTO((KBESC_T *))
+ #define P_HICTRL 0x80000000 /* overwrite mode */
+ #define P_CHKPTNOW 0x40000000 /* do the checkpoint on entry */
+ #define P_DELRUBS 0x20000000 /* map ^H to forwdel */
+-#define P_LOCALLF 0x10000000 /* use local vs. NVT EOL */
++#define P_UNICODE 0x10000000 /* run in Unicode mode */
+ #define P_BODY 0x08000000 /* start composer in body */
+ #define P_HEADEND 0x04000000 /* start composer at end of header */
+ #define P_VIEW MDVIEW /* read-only */
+diff -pruN -x '*~' -x '*.rej' -x '*.orig' pine4.63-patch11/pico/search.c pine4.63/pico/search.c
+--- pine4.63-patch11/pico/search.c 2004-07-01 15:36:36.000000000 -0600
++++ pine4.63/pico/search.c 2005-06-01 07:55:37.000000000 -0600
+@@ -113,6 +113,8 @@ int pc;
+ forwsearch(f, n)
+ int f, n;
+ {
++ LINE *lastline; /* line position before scan */
++ int lastoff; /* last position within line */
+ register int status;
+ int wrapt = FALSE, wrapt2 = FALSE;
+ int repl_mode = FALSE;
+@@ -259,26 +261,15 @@ forwsearch(f, n)
+ }
+ }
+
++ lastline = curwp->w_dotp; /* line position before scan */
++ lastoff = curwp->w_doto; /* last position within line */
++
+ /*
+- * This code is kind of dumb. What I want is successive C-W 's to
+- * move dot to successive occurences of the pattern. So, if dot is
+- * already sitting at the beginning of the pattern, then we'll move
+- * forward a char before beginning the search. We'll let the
+- * automatic wrapping handle putting the dot back in the right
+- * place...
++ * Successive C-W 's should move the dot to successive occurences
++ * of the pattern. So move the dot forward one char before the search
++ * and if the seach fails, put it back were it was.
+ */
+- status = 0; /* using "status" as int temporarily! */
+- while(1){
+- if(defpat[status] == '\0'){
+- forwchar(0, 1);
+- break; /* find next occurence! */
+- }
+-
+- if(status + curwp->w_doto >= llength(curwp->w_dotp) ||
+- !eq((unsigned char)defpat[status],lgetc(curwp->w_dotp, curwp->w_doto + status).c))
+- break; /* do nothing! */
+- status++;
+- }
++ forwchar(0, 1);
+
+ /* search for the pattern */
+
+@@ -290,6 +281,8 @@ forwsearch(f, n)
+ /* and complain if not there */
+ if (status == FALSE){
+ emlwrite("\"%s\" not found", defpat);
++ curwp->w_dotp = lastline; /* line position before scan */
++ curwp->w_doto = lastoff; /* last position within line */
+ }
+ else if((gmode & MDREPLACE) && repl_mode == TRUE){
+ status = replace_pat(defpat, &wrapt2); /* replace pattern */
+@@ -705,9 +698,19 @@ int leavep; /* place to leave point
+ register int c; /* character at current position */
+ register LINE *matchline; /* current line during matching */
+ register int matchoff; /* position in matching line */
+- register char *patptr; /* pointer into pattern */
++ register char *patptr = patrn; /* pointer into pattern */
++ unsigned char *tmp;
+ register int stopoff; /* offset to stop search */
+ register LINE *stopline; /* line to stop search */
++ unsigned int ucspat[NPAT], ucspos = 0, match;
++
++ /* In Unicode mode, we've to create an UCS-4 vector from the pattern: */
++ while (gmode & P_UNICODE && *patptr != 0 && ucspos < NPAT) {
++ tmp = patptr;
++ ucspat[ucspos++] = utf8_get_ucs_string(&tmp, strlen(patptr));
++ patptr = tmp;
++ }
++ ucspat[ucspos] = 0; /* terminate the int vector with a zero int */
+
+ *wrapt = FALSE;
+
+@@ -759,15 +762,23 @@ int leavep; /* place to leave point
+ else
+ c = lgetc(curline, curoff++).c; /* get the char */
+
++ if (gmode & P_UNICODE) {
++ match = ucspat[ucspos=0];
++ } else
++ match = patrn[0];
++
+ /* test it against first char in pattern */
+- if (eq(c, (unsigned char)patrn[0]) != FALSE) { /* if we find it..*/
++ if (eq(c, match) != FALSE) { /* if we find it..*/
+ /* setup match pointers */
+ matchline = curline;
+ matchoff = curoff;
+ patptr = &patrn[0];
+
+ /* scan through patrn for a match */
+- while (*++patptr != 0) {
++ while (1) {
++ if (!(match = *++patptr) || (gmode & P_UNICODE &&
++ !(match = ucspat[++ucspos])))
++ break;
+ /* advance all the pointers */
+ if (matchoff == llength(matchline)) {
+ /* advance past EOL */
+@@ -781,7 +792,7 @@ int leavep; /* place to leave point
+ return(FALSE);
+
+ /* and test it against the pattern */
+- if (eq((unsigned char) *patptr, c) == FALSE)
++ if (eq(match, c) == FALSE)
+ goto fail;
+ }
+
+diff -pruN -x '*~' -x '*.rej' -x '*.orig' pine4.63-patch11/pine/init.c pine4.63/pine/init.c
+--- pine4.63-patch11/pine/init.c 2005-04-07 12:01:42.000000000 -0600
++++ pine4.63/pine/init.c 2005-06-01 07:55:37.000000000 -0600
+@@ -66,6 +66,9 @@ static char rcsid[] = "$Id: init.c,v 4.7
+
+ #include "headers.h"
+ #include "../c-client/imap4r1.h" /* for LEVELSTATUS() */
++#ifdef LC_CTYPE
++# include <langinfo.h>
++#endif
+
+
+ typedef enum {Sapling, Seedling, Seasoned} FeatureLevel;
+@@ -1484,6 +1487,15 @@ init_vars(ps)
+
+ /*--- The defaults here are defined in os-xxx.h so they can vary
+ per machine ---*/
++#ifdef LC_CTYPE
++ setlocale(LC_CTYPE, ""); /* needed for using nl_langinfo */
++ GLO_CHAR_SET = cpystr(nl_langinfo(CODESET));
++ /* if codeset indicates that we are in an US-ASCII locale, */
++ if (!strcmp(GLO_CHAR_SET, "ANSI_X3.4-1968")) {
++ fs_give((void **) &(GLO_CHAR_SET));
++ cpystr("US-ASCII"); /* default to US-ASCII */
++ }
++#endif
+
+ GLO_PRINTER = cpystr(DF_DEFAULT_PRINTER);
+ GLO_ELM_STYLE_SAVE = cpystr(DF_ELM_STYLE_SAVE);
+@@ -2111,6 +2123,9 @@ init_vars(ps)
+ set_current_val(&vars[V_OLD_STYLE_REPLY], TRUE, TRUE);
+ obs_old_style_reply = !strucmp(VAR_OLD_STYLE_REPLY, "yes");
+
++ /* needed in process_feature_list */
++ set_current_val(&vars[V_CHAR_SET], TRUE, TRUE);
++
+ set_feature_list_current_val(&vars[V_FEATURE_LIST]);
+ process_feature_list(ps, VAR_FEATURE_LIST,
+ (obs_feature_level == Seasoned) ? 1 : 0,
+@@ -3103,6 +3118,10 @@ process_feature_list(ps, list, old_growt
+ if(old_growth)
+ set_old_growth_bits(ps, 0);
+
++ if(ps_global->VAR_CHAR_SET
++ && !strucmp(ps_global->VAR_CHAR_SET, "UTF-8"))
++ F_TURN_ON(F_QUELL_CHARSET_WARNING, ps_global); /* if not user-off */
++
+ /* now run through the list (global, user, and cmd_line lists are here) */
+ if(list){
+ for(p = list; (q = *p) != NULL; p++){
+@@ -3154,6 +3173,11 @@ process_feature_list(ps, list, old_growt
+ #ifdef _WINDOWS
+ ps->pass_ctrl_chars = 1;
+ #else
++ if(ps_global->VAR_CHAR_SET
++ && !strucmp(ps_global->VAR_CHAR_SET, "UTF-8")) {
<<Diff was trimmed, longer than 597 lines>>
More information about the pld-cvs-commit
mailing list