SOURCES: pine-utf8-1a-GFHP_HANDLES.patch (NEW), pine-utf8-1a-pine....

blues blues at pld-linux.org
Thu Mar 29 16:50:45 CEST 2007


Author: blues                        Date: Thu Mar 29 14:50:45 2007 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- stollen from SuSE

---- Files affected:
SOURCES:
   pine-utf8-1a-GFHP_HANDLES.patch (NONE -> 1.1)  (NEW), pine-utf8-1a-pine.h.patch (NONE -> 1.1)  (NEW), pine-utf8-1b.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/pine-utf8-1a-GFHP_HANDLES.patch
diff -u /dev/null SOURCES/pine-utf8-1a-GFHP_HANDLES.patch:1.1
--- /dev/null	Thu Mar 29 16:50:45 2007
+++ SOURCES/pine-utf8-1a-GFHP_HANDLES.patch	Thu Mar 29 16:50:40 2007
@@ -0,0 +1,51 @@
+Changelog:
+
+The two changes are related to a development effort to
+make html2plain aware of UTF-8, but it turned out to
+be very complex and a quick hack to disable wrapping
+in it and delay wrapping to gf_warp which is aware of
+UTF-8 did not work well because html has also center
+and right oriented wrapping, which gf_wrap has no
+idea of. The removed parts cleanup the leftovers of
+this attempt:
+
+  * GFHP_NOWRAP was not evaluated, it it made no no
+    sense to set it (checked the evaluation of opts)
+
+  * Since wrapping in html2wrap was not disabled,
+    it is no longer neccessary to remove the wrapit = 0
+    which told the code to add gf_wrap to the pipe
+    to apply wrapping.
+
+  * Remove the #define of GFHP_HANDLES which is
+    is made obsolete by the remaining cleanup.
+    It can be cleaned up because the handlesp
+    flag is passed directly to html2plain, no
+    longer thru the opts bitfield and this opts
+    value is not evaluated otherwise (checked).
+    This hunk was only moved from a different
+    patch file here to consolidate this cleanup.
+
+--- pine4.59.9z/pine/mailview.c
++++ pine4.59.9d/pine/mailview.c
+@@ -5640,9 +5650,5 @@ decode_text(att, msgno, pc, handlesp, st
+ 	int opts = 0;
+ 
+-	if(flags & FM_DISPLAY){
+-	    if(handlesp)		/* pass on handles awareness */
+-	      opts |= GFHP_HANDLES;
+-	}
+-	else
++	if(!(flags & FM_DISPLAY))
+ 	  opts |= GFHP_STRIPPED;	/* don't embed anything! */
+ 
+--- pine4.59.9z/pine/pine.h
++++ pine4.59.9d/pine/pine.h
+@@ -178,7 +179,6 @@
+ #define GER_ALLPARTS		0x04	/* AllParts toggle is on            */
+ 
+ #define GFHP_STRIPPED		0x01
+-#define GFHP_HANDLES		0x02
+ #define GFHP_LOCAL_HANDLES	0x04
+ 
+ #define	GFW_HANDLES		0x01

================================================================
Index: SOURCES/pine-utf8-1a-pine.h.patch
diff -u /dev/null SOURCES/pine-utf8-1a-pine.h.patch:1.1
--- /dev/null	Thu Mar 29 16:50:45 2007
+++ SOURCES/pine-utf8-1a-pine.h.patch	Thu Mar 29 16:50:40 2007
@@ -0,0 +1,68 @@
+Changelog:
+
+   * unused GFHP_NOWRAP removed,
+   * GFHP_HANDLES was moved to bk-cleanup-GFHP_HANDLES.patch
+ 
+--- pine4.64/pine/pine.h
++++ pine4.64/pine/pine.h
+@@ -68,6 +68,7 @@
+ #define	PHONE_HOME_HOST		"docserver.cac.washington.edu"
+ 
+ #define UNKNOWN_CHARSET		"X-UNKNOWN"
++#define US_ASCII_CHARSET	"US-ASCII"
+ 
+ #define OUR_HDRS_LIST		"X-Our-Headers"
+ 
+@@ -3675,6 +3676,7 @@
+     } data;
+ } REPLY_S;
+ 
++#define pico(F) call_pico(F)
+ #define	REPLY_PSEUDO	1
+ #define	REPLY_FORW	2	/* very similar to REPLY_PSEUDO */
+ #define	REPLY_MSGNO	3
+@@ -4231,7 +4233,6 @@
+ } ATABLE_S;
+ 
+ 
+-#define TAG_EMBED	'\377'	/* Announces embedded data in text string */
+ #define	TAG_INVON	'\001'	/* Supported character attributes	  */
+ #define	TAG_INVOFF	'\002'
+ #define	TAG_BOLDON	'\003'
+@@ -4241,6 +4242,7 @@
+ #define	TAG_FGCOLOR	'\010'	/* Change to this foreground color	  */
+ #define	TAG_BGCOLOR	'\011'	/* Change to this background color	  */
+ #define	TAG_HANDLE	'\020'	/* indicate's a handle to an action	  */
++#define	TAG_EMBED       '\021'	/* Announces embedded data in text string */
+ #define	TAG_HANDLEOFF	'\030'	/* indicate's end of handle text	  */
+ 
+ 
+@@ -5735,6 +5737,9 @@
+ int	    rfc2369_parse_fields PROTO((char *, RFC2369_S *));
+ unsigned char *trans_euc_to_2022_jp PROTO((unsigned char *));
+ unsigned char *trans_2022_jp_to_euc PROTO((unsigned char *, unsigned int *));
++unsigned char* resolve_charset_alias PROTO((char *, char **));
++char          *pine_check_utf8 PROTO((char *, char *, size_t));
++unsigned char *trans_with_iconv PROTO((unsigned char *, char *, char *));
+ char       *keyword_to_nick PROTO((char *));
+ void        find_8bitsubj_in_messages PROTO((MAILSTREAM *, SEARCHSET *,
+ 					     int, int));
+--- pine4.64/pine/send.c
++++ pine4.64/pine/send.c
+@@ -11119,3 +11119,16 @@
+ {
+     return(0L);
+ }
++
++int
++call_pico (ps)
++	struct pico_struct * ps;
++{
++	int ret;
++	char * assumed_save = ps_global->VAR_ASSUMED_CHAR_SET;
++	ps_global->VAR_ASSUMED_CHAR_SET = NULL;
++#undef pico
++	ret = pico(ps);
++	ps_global->VAR_ASSUMED_CHAR_SET = assumed_save;
++	return ret;
++}

================================================================
Index: SOURCES/pine-utf8-1b.patch
diff -u /dev/null SOURCES/pine-utf8-1b.patch:1.1
--- /dev/null	Thu Mar 29 16:50:45 2007
+++ SOURCES/pine-utf8-1b.patch	Thu Mar 29 16:50:40 2007
@@ -0,0 +1,687 @@
+Submission of this patch with documentation:
+================================================================================
+--- pine4.64/pico/composer.c
++++ pine4.64/pico/composer.c
+@@ -344,7 +344,189 @@
+       return(TRUE);
+ }
+ 
++/*
++ * check_utf8 - check for UTF-8 bytes 
++ * Takes two arguments:
++ *   char *c		- a byte of the stream
++ *   char *utf_seq	- a status array holding the function's state
++ * utf_seq must be provided by the caller this way:
++ *  (static) char utf_seq[7] = ""; (content must be retained over calls)
++ *  and must be initialized at start using: utf_seq[0] = 0;
++ *
++ * Returns NULL if an UTF-8 sequence has been started and is not completed.
++ * If an UTF-8 sequence is complete, it returns a pointer to a static string
++ * which is valid until the next use of the function.
++ * If the character is a double width character, a space(' ') is prepended
++ * to the returned string.
++ * If a character < 128 is passed, the UTF-8 state in utf_seq[] is cleared,
++ * because a valid UTF-8 sequence only consists of bytes >= 0x80. The pointer
++ * returned points to the address of the passed character to indicate this.
++ * Features: Supports UTF-8 seqencies up to 4 bytes.
++ * Todo: Instead of passing a pointer to the char and comparing the returned
++ *       pointer to this address afterwards, the Interface could be changed
++ *       to just pass the character as simple char(thus not requesting the
++ *       address of a variable which might be declared as register) and replace
++ *       the check of the return value with a check of (c & 0x80) and if this
++ *       is not the case, assuming that (utf_seq[0] == 0) means that this last
++ *       non-ASCII byte completed the UTF-8 sequence, while having
++ *       utf_seq[0] != 0 means having an incomplete UTF-8 sequence.
++ */
++char *
++check_utf8(c, utf_seq, sizeof_utf_seq)
++     char *c;
++     char *utf_seq;
++     size_t sizeof_utf_seq;
++{
++    static   char char_string[8]; /* (six UTF-8 sequence bytes + ' ' + '\0') */
++    int      ix;
++    unsigned char dbl_wide[7][2][4] = {0xe1,0x84,0x80,0x00, 0xe1,0x85,0x9F,0x00,
++				       0xe2,0x8c,0xa9,0x00, 0xe2,0x8c,0xaa,0x00,
++				       0xe2,0xba,0x80,0x00, 0xed,0x9e,0xa3,0x00,
++				       0xef,0xa4,0x80,0x00, 0xef,0xa9,0xaa,0x00,
++				       0xef,0xb8,0xb0,0x00, 0xef,0xb9,0xa8,0x00,
++				       0xef,0xbc,0x81,0x00, 0xef,0xbd,0xad,0x00,
++				       0xef,0xbf,0xa0,0x00, 0xef,0xbf,0xa6,0x00};
++    if (*c & 0x80) {
++       char_string[0] = *c;
++       char_string[1] = 0;
++       if (strlen(utf_seq) == sizeof_utf_seq - 1)
++	  utf_seq[0] = 0;          /* don't allow a overlong UTF-8 sequence   */
++       if ((*c & 0xF0) >= 0xC0) {
++	  strncpy(utf_seq, char_string, sizeof_utf_seq);
++	  return NULL;		   /* possible UTF-8 sequence, need next byte */
++       } else if (utf_seq[0]) {
++	  strncat(utf_seq, char_string, sizeof_utf_seq); /* append to string */
++	  switch (utf_seq[0] & 0xF0) {
++	     case 0xC0 :
++	     case 0xD0 :
++		 strncpy(char_string, utf_seq, sizeof(char_string));
++		 utf_seq[0] = 0;	 /* sequence complete, clear for next */
++		 return char_string;     /* pass the new UTF-8 sequence on    */
++	     case 0xE0 :
++		 if (strlen(utf_seq) < 3)
++		    return NULL; // 3-byte UTF-8, need next byte
++		 char_string[0] = '\0'; // init
++		 for (ix = 0; ix < 7; ix++)
++		       if (strcmp(utf_seq, &dbl_wide[ix][0][0]) >= 0
++			&& strcmp(utf_seq, &dbl_wide[ix][1][0]) <= 0) {
++			  char_string[0] = ' ';  /* flag as double-width char */
++		 	  break;
++		 }
++		 strncat(char_string, utf_seq, sizeof(char_string));
++		 utf_seq[0] = 0; // this sequence is over, clear for restart
++		 return char_string; // process this UTF-8 char...
++	     case 0xF0 :
++		 if (strlen(utf_seq) < 4)
++		    return NULL;     /* 4-byte UTF-8 sequence, need next byte */
++		 char_string[0] = '\0';            /* init the sequence space */
++		 if ((utf_seq[1] & 0xF0) == 0xA0)
++		    char_string[0] = ' ';  /* flag as double-width UTF-8 char */
++		 strncat(char_string, utf_seq, sizeof(char_string));
++		 utf_seq[0] = 0;	 /* sequence complete, clear for next */
++		 return char_string;	 /* pass the new UTF-8 sequence on    */
++	  }
++       }
++    }
++    utf_seq[0] = 0;  /* clear sequence buffer in case of an invalid sequence */
++    return c;        /* single-byte, NON-UTF-8 chars are process it as usual */
++}
++
++/*
++ * wrapper to check_utf8 for pico, if not in UTF-8 mode, do not check UTF-8
++ */
++char *
++pico_check_utf8(c, utf_seq, sizeof_utf_seq)
++     char *c;
++     char *utf_seq;
++     size_t sizeof_utf_seq;
++{
++    if(!(Pmaster->pine_flags & P_UNICODE))
++	return c;
++    return check_utf8(c, utf_seq, sizeof_utf_seq);
++}
++
++/*
++ * Get the number of columns which are filled by the text in the current
++ * line of LineEdit(from the start of the line to the current position)
++ */
++static int
++count_screencols(void)
++{
++ 	char utf_seq[7] = "", *cp, *r;
++	int seq = 0, w = 0;
++
++	for(cp = ods.cur_l->text; *cp && cp < ods.cur_l->text + ods.p_off;
++			cp++) {
++		if (!(r = pico_check_utf8(cp, utf_seq, sizeof(utf_seq)))) {
++			seq = 1;
++			continue;
++		}
++		if (seq)
++			w++;
++		seq = 0;
++		if (r == cp)
++			w++;
++		else if (*r == ' ')
++			w++;
++	}
++	return w;
++}
+ 
++/*
++ * Get the offset in screen positions which must be subsctracted from the
++ * byte count in the LineEdit line in order to reach the line position on
++ * screen(because of double wide characters and multible UTF-8 bytes)
++ */
++static int
++offset_on_screen(void)
++{
++	return ods.p_off - count_screencols();
++}
++
++/*
++ * Move current position in LineEdit one character left, return the number
++ * of byte positons which were neccesary to jump left in order to
++ * arrive at the start of the previous multibyte character(UTF-8).
++ */
++static int
++LineEditCharLeft()
++{
++    int col_right = ods.p_off, cols = count_screencols();
++
++    do
++	if (--ods.p_off < 0)
++		break;
++    while (count_screencols() - cols == -1);
++
++    ods.p_off++;
++	
++    if (col_right - ods.p_off > 0)
++    	return col_right - ods.p_off;
++
++    do
++	if (--ods.p_off < 0)
++		break;
++    while (count_screencols() - cols == -2);
++
++    ods.p_off++;
++	
++    return col_right - ods.p_off;
++}
++
++/*
++ * Move current position in LineEdit one character right, if UTF-8
++ * mode is active, the ods.p_off is assumed to be at the start of
++ * a UTF-8 sequence or at a normal ASCII character. It is moved to
++ * the next character, jumping past the end of the current UTF-8
++ * sequence, if UTF8 mode is active.
++ */
++static void
++LineEditCharRight()
++{
++    char utf_seq[7] = "";
++    while(ods.p_off < ods.p_len && ods.cur_l->text[ods.p_off] &&
++	!pico_check_utf8(ods.cur_l->text + ods.p_off++, utf_seq, sizeof(utf_seq)));
++}
+ 
+ /*
+  *  ResizeHeader - Handle resizing display when SIGWINCH received.
+@@ -397,7 +579,7 @@
+     PaintBody(0);
+ 
+     if(ComposerEditing)
+-      movecursor(ods.p_line, ods.p_off+headents[ods.cur_e].prlen);
++      HeaderPaintCursor();
+ 
+     (*term.t_flush)();
+     return(TRUE);
+@@ -1596,6 +1778,7 @@
+ 	     int	skipmove = 0;
+              char	*strng;
+     int      last_key;				/* last keystroke  */
++    unsigned char	utf_seq[7] = "";
+ 
+     strng   = ods.cur_l->text;			/* initialize offsets */
+     ods.p_len = strlen(strng);
+@@ -1678,7 +1861,7 @@
+ 	    }
+ 
+ 	    clearcursor();
+-	    movecursor(ods.p_line, ods.p_off+headents[ods.cur_e].prlen);
++	    HeaderPaintCursor();
+ 	    if(ch == NODATA)			/* GetKey timed out */
+ 	      continue;
+ 
+@@ -1688,7 +1871,7 @@
+         if(mpresf){				/* blast old messages */
+ 	    if(mpresf++ > NMMESSDELAY){		/* every few keystrokes */
+ 		mlerase();
+-		movecursor(ods.p_line, ods.p_off+headents[ods.cur_e].prlen);
++		HeaderPaintCursor();
+ 	    }
+         }
+ 
+@@ -1734,12 +1917,40 @@
+ 
+ 		/*
+ 		 * then find out where things fit...
++		 *
++		 * For UTF-8, the < LINELEN check should need to do it's
++		 * calculation based on count_screencols() plus the width
++		 * of the new char as provided by pico_check_utf8.
++		 * The buffer size may need to be increased for this.
+ 		 */
+ 		if(ods.p_len < LINELEN()){
+ 		    CELL c;
++		    char tmp;
+ 
+-		    c.c = ch;
+ 		    c.a = 0;
++		    if(Pmaster->pine_flags & P_UNICODE) {
++		        tmp = ch;
++		    	char * chp = pico_check_utf8(&tmp, utf_seq, sizeof(utf_seq));
++			if (chp == NULL)
++			    continue; 		/* on to the next! */
++			if (chp != &tmp && *chp == ' ')
++			    chp++;
++			if (*chp & 0x80) {
++			    while (*chp && ods.p_len < LINELEN()) {
++				c.c = *chp++;
++		    		pinsert(c);	/* add char to str */
++			    }
++			    /* update the display: */
++			    PaintHeader(COMPOSER_TOP_LINE, TRUE);
++			    /* If end char was inserted, set physical .. */
++			    if (ods.p_off == ods.p_len)
++			        /* cursor pos on next movecursor_offset: */
++				movecursor_offset(-1, 0, 0);
++			    continue; 		/* on to the next! */
++			}
++		    }
++
++		    c.c = ch;
+ 		    if(pinsert(c)){		/* add char to str */
+ 			skipmove++;		/* must'a been optimal */
+ 			continue; 		/* on to the next! */
+@@ -1776,6 +1987,7 @@
+             } 
+         }
+         else {					/* interpret ch as a command */
++	    utf_seq[0] = '\0';
+             switch (ch = normalize_cmd(ch, ckm, 2)) {
+ 	      case (CTRL|'\\') :
+ 		if (ch = GetAccent())
+@@ -1869,9 +1869,7 @@
+ 	      case KEY_RIGHT:			/* move character right */
+ 		if(ods.p_off < ods.p_len 
+ 		   && ods.p_off + headents[ods.cur_e].prlen < term.t_ncol){
+-		    pputc(pscr(ods.p_line, 
+-			       (ods.p_off++)+headents[ods.cur_e].prlen)->c,0);
+-		    skipmove++;
++		    LineEditCharRight();
+ 		    continue;
+ 		}
+ 		else if(gmode & MDHDRONLY)
+@@ -1882,7 +2092,7 @@
+ 	      case (CTRL|'B') :
+ 	      case KEY_LEFT	:		/* move character left */
+ 		if(ods.p_off > 0){
+-		    ods.p_off--;
++		    LineEditCharLeft();
+ 		    continue;
+ 		}
+ 		if(ods.p_line != COMPOSER_TOP_LINE)
+@@ -1917,7 +2127,8 @@
+ 		    continue;
+ 		}
+ 
+-		pputc(strng[ods.p_off++], 0); 	/* drop through and rubout */
++		LineEditCharRight(); /* jump to next char */
++		/* and fall thru */
+ 
+ 	      case DEL        :			/* blast previous char */
+ 	      case (CTRL|'H') :
+@@ -1931,20 +2142,27 @@
+ 		    continue;
+ 		}
+ 
+-		if(ods.p_off > 0){		/* just shift left one char */
+-		    ods.p_len--;
++		if(ods.p_off > 0){		/* shift left one char */
++		    int todelete = LineEditCharLeft();
++
++		    ods.p_len -= todelete;
++
+ 		    headents[ods.cur_e].dirty  = 1;
+ 		    if(ods.p_len == 0)
+ 		      headents[ods.cur_e].sticky = 0;
+ 		    else
+ 		      headents[ods.cur_e].sticky = 1;
+ 
+-		    tbufp = &strng[--ods.p_off];
+-		    while(*tbufp++ != '\0')
+-		      tbufp[-1] = *tbufp;
+ 		    tbufp = &strng[ods.p_off];
++
++		    while(*tbufp++ != '\0')
++		      tbufp[-1] = tbufp[todelete-1];
++
+ 		    if(pdel())			/* physical screen delete */
+ 		      skipmove++;		/* must'a been optimal */
++
++		    /* needed if pine bgcolor != terminal background color */
++		    PaintHeader(ods.p_line, TRUE);
+ 		}
+ 		else{				/* may have work to do */
+ 		    if(ods.cur_l->prev == NULL){  
+@@ -1955,18 +2173,16 @@
+ 		    ods.p_line--;
+ 		    ods.cur_l = ods.cur_l->prev;
+ 		    strng = ods.cur_l->text;
+-		    if((i=strlen(strng)) > 0){
+-			strng[i-1] = '\0';	/* erase the character */
+-			ods.p_off = i-1;
++		    if((ods.p_off=strlen(strng)) > 0){
++		        ods.p_off -= LineEditCharLeft() - 1;
++			strng[ods.p_off] = '\0'; /* erase the character */
+ 		    }
+-		    else{
++		    else
+ 			headents[ods.cur_e].sticky = 0;
+-			ods.p_off = 0;
+-		    }
+-		    
+-		    tbufp = &strng[ods.p_off];
+ 		}
+ 
++		tbufp = &strng[ods.p_off];
++
+ 		if((status = FormatLines(ods.cur_l, "", LINELEN(), 
+ 				   headents[ods.cur_e].break_on_comma,0))==-1){
+ 		    (*term.t_beep)();
+@@ -1991,7 +2207,7 @@
+ 		      PaintBody(1);
+ 		}
+ 
+-		movecursor(ods.p_line, ods.p_off+headents[ods.cur_e].prlen);
++		HeaderPaintCursor();
+ 
+ 		if(skipmove)
+ 		  continue;
+@@ -2016,7 +2232,8 @@
+ void
+ HeaderPaintCursor()
+ {
+-    movecursor(ods.p_line, ods.p_off+headents[ods.cur_e].prlen);
++    movecursor_offset(ods.p_line, ods.p_off + headents[ods.cur_e].prlen,
++		offset_on_screen());
+ }
+ 
+ 
+--- pine4.64/pico/display.c
++++ pine4.64/pico/display.c
+@@ -1295,7 +1295,22 @@
+     }
+ }
+ 
++void
++movecursor_offset(row, col, offs)
++int row, col, offs;
++{
++    static int force_next = 0;
+ 
++    if(row == -1) {
++   	force_next = row;
++	return;
++    }
++    if(row!=ttrow || col!=ttcol || force_next) {
++        (*term.t_move)(row, col - offs);
++        ttrow = row;
++        ttcol = col;
++    }
++}
+ 
+ /*
+  * Send a command to the terminal to move the hardware cursor to row "row"
+--- pine4.64/pico/efunc.h
++++ pine4.64/pico/efunc.h
+@@ -118,6 +118,7 @@
+ extern	VARS_TO_SAVE *save_pico_state PROTO((void));
+ extern	void restore_pico_state PROTO((VARS_TO_SAVE *));
+ extern	void free_pico_state PROTO((VARS_TO_SAVE *));
++extern  char *check_utf8 PROTO((char *, char *, size_t));
+ extern	void HeaderPaintCursor PROTO((void));
+ extern	void PaintBody PROTO((int));
+ 
+--- pine4.64/pine/osdep/termout.unx
++++ pine4.64/pine/osdep/termout.unx
+@@ -750,7 +750,8 @@
+      register unsigned int ch;
+      int      new_esc_len;
+ {
+-    static   int esc_len = 0;
++    static   int esc_len = 0, seq = 0;
++    static   unsigned char utf_seq[7] = "";
+ 
+     if(ps_global->in_init_seq				/* silent */
+        || (F_ON(F_BLANK_KEYMENU, ps_global)		/* or bottom, */
+@@ -759,6 +768,35 @@
+ 	   && _col + 1 == ps_global->ttyo->screen_cols))
+       return;
+ 
++    /* Treat UTF-8 sequences if we are not in a special escape sequence */
++    if(esc_len <= 0) {
++	unsigned char *chp;
++	char tmp;
++	tmp = (char)ch;
++	if ((chp = pine_check_utf8(&tmp, utf_seq, sizeof(utf_seq))) == NULL) {
++	    seq = 1; /* flag that we are in a open UTF-8 sequence   */
++	    return;  /* UTF-8 sequence not complete, need next char */
++	}
++	if (chp != (unsigned char*)&tmp) {
++	    seq = 0; /* flag that we are not in a open UTF-8 sequence */
++	    _col++;
++	    if (*chp == ' ') {
++		if(++_col > ps_global->ttyo->screen_cols) {
++		    printf("\342\200\246"); /* UTF-8 points... */
++		    goto wrap;
++		}
++		chp++;
++	    }
++	    while(*chp)
++		putchar(*chp++);
++	    return;
++	}
<<Diff was trimmed, longer than 597 lines>>


More information about the pld-cvs-commit mailing list