SOURCES: mc-4.6.2-utf8.patch (NEW) - UTF8 Patch for 4.6.2 UNOFFICIAL!!! htt...

gotar gotar at pld-linux.org
Tue Feb 3 22:14:24 CET 2009


Author: gotar                        Date: Tue Feb  3 21:14:24 2009 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- UTF8 Patch for 4.6.2 UNOFFICIAL!!!
http://www.midnight-commander.org/downloads/mc-4.6.2-utf8.patch.gz

---- Files affected:
SOURCES:
   mc-4.6.2-utf8.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/mc-4.6.2-utf8.patch
diff -u /dev/null SOURCES/mc-4.6.2-utf8.patch:1.1
--- /dev/null	Tue Feb  3 22:14:25 2009
+++ SOURCES/mc-4.6.2-utf8.patch	Tue Feb  3 22:14:18 2009
@@ -0,0 +1,7017 @@
+diff --git a/acinclude.m4 b/acinclude.m4
+index f4c0e3b..f7f4fd4 100644
+--- a/acinclude.m4
++++ b/acinclude.m4
+@@ -399,14 +399,14 @@ AC_DEFUN([MC_WITH_SLANG], [
+     fi
+ 
+     dnl Unless external S-Lang was requested, reject S-Lang with UTF-8 hacks
+-    if test x$with_screen = xslang; then
+-	:
+-	m4_if([$1], strict, ,
+-	      [AC_CHECK_LIB([slang], [SLsmg_write_nwchars],
+-	    		    [AC_MSG_WARN([Rejecting S-Lang with UTF-8 support, \
+-it's not fully supported yet])
+-	      with_screen=mcslang])])
+-    fi
++dnl    if test x$with_screen = xslang; then
++dnl	:
++dnl	m4_if([$1], strict, ,
++dnl	      [AC_CHECK_LIB([slang], [SLsmg_write_nwchars],
++dnl	    		    [AC_MSG_WARN([Rejecting S-Lang with UTF-8 support, \
++dnl it's not fully supported yet])
++dnl	      with_screen=mcslang])])
++dnl    fi
+ 
+     if test x$with_screen = xslang; then
+ 	AC_DEFINE(HAVE_SYSTEM_SLANG, 1,
+diff --git a/edit/edit-widget.h b/edit/edit-widget.h
+index ab55764..fd51aaa 100644
+--- a/edit/edit-widget.h
++++ b/edit/edit-widget.h
+@@ -30,6 +30,11 @@ typedef struct edit_key_map_type {
+     long command;
+ } edit_key_map_type;
+ 
++struct action {
++    mc_wchar_t ch;
++    long flags;
++};
++
+ struct WEdit {
+     Widget widget;
+ 
+@@ -42,8 +47,17 @@ struct WEdit {
+     /* dynamic buffers and cursor position for editor: */
+     long curs1;			/* position of the cursor from the beginning of the file. */
+     long curs2;			/* position from the end of the file */
++#ifndef UTF8
+     unsigned char *buffers1[MAXBUFF + 1];	/* all data up to curs1 */
+     unsigned char *buffers2[MAXBUFF + 1];	/* all data from end of file down to curs2 */
++#else /* UTF8 */
++    mc_wchar_t *buffers1[MAXBUFF + 1];        /* all data up to curs1 */
++    mc_wchar_t *buffers2[MAXBUFF + 1];        /* all data from end of file down to curs2 */
++
++    unsigned char charbuf[MB_LEN_MAX];
++    int charpoint;
++#endif /* UTF8 */
++
+ 
+     /* search variables */
+     long search_start;		/* First character to start searching from */
+@@ -87,7 +101,7 @@ struct WEdit {
+ 
+     /* undo stack and pointers */
+     unsigned long stack_pointer;
+-    long *undo_stack;
++    struct action *undo_stack;
+     unsigned long stack_size;
+     unsigned long stack_size_mask;
+     unsigned long stack_bottom;
+diff --git a/edit/edit.c b/edit/edit.c
+index bec84d7..8df473b 100644
+--- a/edit/edit.c
++++ b/edit/edit.c
+@@ -105,7 +105,11 @@ char *option_backup_ext = NULL;
+ 
+ static void user_menu (WEdit *edit);
+ 
++#ifndef UTF8
+ int edit_get_byte (WEdit * edit, long byte_index)
++#else
++mc_wchar_t edit_get_byte (WEdit * edit, long byte_index)
++#endif
+ {
+     unsigned long p;
+     if (byte_index >= (edit->curs1 + edit->curs2) || byte_index < 0)
+@@ -134,7 +138,7 @@ edit_init_buffers (WEdit *edit)
+ 
+     edit->curs1 = 0;
+     edit->curs2 = 0;
+-    edit->buffers2[0] = g_malloc (EDIT_BUF_SIZE);
++    edit->buffers2[0] = g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t));
+ }
+ 
+ /*
+@@ -159,7 +163,7 @@ edit_load_file_fast (WEdit *edit, const char *filename)
+     }
+ 
+     if (!edit->buffers2[buf2])
+-	edit->buffers2[buf2] = g_malloc (EDIT_BUF_SIZE);
++	edit->buffers2[buf2] = g_malloc (EDIT_BUF_SIZE  * sizeof(mc_wchar_t));
+ 
+     mc_read (file,
+ 	     (char *) edit->buffers2[buf2] + EDIT_BUF_SIZE -
+@@ -169,7 +173,7 @@ edit_load_file_fast (WEdit *edit, const char *filename)
+     for (buf = buf2 - 1; buf >= 0; buf--) {
+ 	/* edit->buffers2[0] is already allocated */
+ 	if (!edit->buffers2[buf])
+-	    edit->buffers2[buf] = g_malloc (EDIT_BUF_SIZE);
++	    edit->buffers2[buf] = g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t));
+ 	mc_read (file, (char *) edit->buffers2[buf], EDIT_BUF_SIZE);
+     }
+ 
+@@ -242,9 +246,44 @@ edit_insert_stream (WEdit * edit, FILE * f)
+ {
+     int c;
+     long i = 0;
+-    while ((c = fgetc (f)) >= 0) {
++#ifndef UTF8
++    while ((c = fgetc (f)) != EOF) {
+ 	edit_insert (edit, c);
+ 	i++;
++#else /* UTF8 */
++    unsigned char buf[MB_LEN_MAX];
++    int charpos = 0;
++    mbstate_t mbs;
++
++    while ((c = fgetc (f)) != EOF) {
++	mc_wchar_t wc;
++	int size;
++	int j;
++
++	buf[charpos++] = c;
++
++        memset (&mbs, 0, sizeof (mbs));
++	size = mbrtowc(&wc, (char *)buf, charpos, &mbs);
++
++	if (size == -2)
++	    continue; /* incomplete */
++
++	else if (size >= 0) {
++	    edit_insert (edit, wc);
++	    i++;
++	    charpos = 0;
++	    continue;
++	}
++	else {
++
++		/* invalid  */
++#ifdef __STDC_ISO_10646__
++		for (j=0; j<charpos; j++)
++		    edit_insert (edit, BINARY_CHAR_OFFSET + (mc_wchar_t)buf[j]);
++#endif
++		charpos = 0;
++	}
++#endif /* UTF8 */
+     }
+     return i;
+ }
+@@ -252,9 +291,32 @@ edit_insert_stream (WEdit * edit, FILE * f)
+ long edit_write_stream (WEdit * edit, FILE * f)
+ {
+     long i;
++#ifndef UTF8
+     for (i = 0; i < edit->last_byte; i++)
+ 	if (fputc (edit_get_byte (edit, i), f) < 0)
+ 	    break;
++#else /* UTF8 */
++    for (i = 0; i < edit->last_byte; i++) {
++	mc_wchar_t wc = edit_get_byte (edit, i);
++	int res;
++	char tmpbuf[MB_LEN_MAX];
++        mbstate_t mbs;
++
++        memset (&mbs, 0, sizeof (mbs));
++
++#ifdef __STDC_ISO_10646__
++	if (wc >= BINARY_CHAR_OFFSET && wc < (BINARY_CHAR_OFFSET + 256)) {
++	    res = 1;
++	    tmpbuf[0] = (char) (wc - BINARY_CHAR_OFFSET);
++	} else
++#endif
++	res = wcrtomb(tmpbuf, wc, &mbs);
++	if (res > 0) {
++	    if (fwrite(tmpbuf, res, 1, f) != 1)
++		break;
++	}
++    }
++#endif /* UTF8 */
+     return i;
+ }
+ 
+@@ -293,12 +355,46 @@ edit_insert_file (WEdit *edit, const char *filename)
+ 	int i, file, blocklen;
+ 	long current = edit->curs1;
+ 	unsigned char *buf;
++#ifdef UTF8
++	mbstate_t mbs;
++	int bufstart = 0;
++
++	memset (&mbs, 0, sizeof (mbs));
++#endif /* UTF8 */
+ 	if ((file = mc_open (filename, O_RDONLY | O_BINARY)) == -1)
+ 	    return 0;
+ 	buf = g_malloc (TEMP_BUF_LEN);
++#ifndef UTF8
+ 	while ((blocklen = mc_read (file, (char *) buf, TEMP_BUF_LEN)) > 0) {
+ 	    for (i = 0; i < blocklen; i++)
+ 		edit_insert (edit, buf[i]);
++#else /* UTF8 */
++	while ((blocklen = mc_read (file, (char *) buf + bufstart, TEMP_BUF_LEN - bufstart)) > 0) {
++	    blocklen += bufstart;
++	    bufstart = 0;
++	    for (i = 0; i < blocklen; ) {
++		mc_wchar_t wc;
++		int j;
++	        int size = mbrtowc(&wc, (char *)buf + i, blocklen - i, &mbs);
++		if (size == -2) { /*incomplete char*/
++		    bufstart = blocklen - i;
++		    memcpy(buf, buf+i, bufstart);
++		    i = blocklen;
++		    memset (&mbs, 0, sizeof (mbs));
++		}
++		else if (size <= 0) {
++#ifdef __STDC_ISO_10646__
++		    edit_insert (edit, BINARY_CHAR_OFFSET + (mc_wchar_t)buf[i]);
++#endif
++		    memset (&mbs, 0, sizeof (mbs));
++		    i++; /* skip broken char */
++		}
++		else {
++		    edit_insert (edit, wc);
++		    i+=size;
++		}
++	    }
++#endif /* UTF8 */
+ 	}
+ 	edit_cursor_move (edit, current - edit->curs1);
+ 	g_free (buf);
+@@ -388,7 +484,11 @@ cleanup:
+ static int
+ edit_load_file (WEdit *edit)
+ {
++#ifndef UTF8
+     int fast_load = 1;
++#else /* UTF8 */
++    int fast_load = 0; /* can't be used with multibyte characters */
++#endif /* UTF8 */
+ 
+     /* Cannot do fast load if a filter is used */
+     if (edit_find_filter (edit->filename) >= 0)
+@@ -454,6 +554,7 @@ edit_load_position (WEdit *edit)
+     edit->prev_col = column;
+     edit_move_to_prev_col (edit, edit_bol (edit, edit->curs1));
+     edit_move_display (edit, line - (edit->num_widget_lines / 2));
++    edit->charpoint = 0;
+ }
+ 
+ /* Save cursor position in the file */
+@@ -537,7 +638,7 @@ edit_init (WEdit *edit, int lines, int columns, const char *filename,
+     edit_set_filename (edit, filename);
+     edit->stack_size = START_STACK_SIZE;
+     edit->stack_size_mask = START_STACK_SIZE - 1;
+-    edit->undo_stack = g_malloc ((edit->stack_size + 10) * sizeof (long));
++    edit->undo_stack = g_malloc ((edit->stack_size + 10) * sizeof (struct action));
+     if (edit_load_file (edit)) {
+ 	/* edit_load_file already gives an error message */
+ 	if (to_free)
+@@ -692,14 +793,23 @@ void edit_push_action (WEdit * edit, long c,...)
+ {
+     unsigned long sp = edit->stack_pointer;
+     unsigned long spm1;
+-    long *t;
++
++    struct action *t;
++    mc_wchar_t ch = 0;
++
++    if (c == CHAR_INSERT || c == CHAR_INSERT_AHEAD) {
++	va_list ap;
++	va_start (ap, c);
++	ch = va_arg (ap, mc_wint_t);
++	va_end (ap);
++    }
+ 
+ /* first enlarge the stack if necessary */
+     if (sp > edit->stack_size - 10) {	/* say */
+ 	if (option_max_undo < 256)
+ 	    option_max_undo = 256;
+ 	if (edit->stack_size < (unsigned long) option_max_undo) {
+-	    t = g_realloc (edit->undo_stack, (edit->stack_size * 2 + 10) * sizeof (long));
++	    t = g_realloc (edit->undo_stack, (edit->stack_size * 2 + 10) * sizeof (struct action));
+ 	    if (t) {
+ 		edit->undo_stack = t;
+ 		edit->stack_size <<= 1;
+@@ -714,7 +824,7 @@ void edit_push_action (WEdit * edit, long c,...)
+ #ifdef FAST_MOVE_CURSOR
+     if (c == CURS_LEFT_LOTS || c == CURS_RIGHT_LOTS) {
+ 	va_list ap;
+-	edit->undo_stack[sp] = c == CURS_LEFT_LOTS ? CURS_LEFT : CURS_RIGHT;
++	edit->undo_stack[sp].flags = c == CURS_LEFT_LOTS ? CURS_LEFT : CURS_RIGHT;
+ 	edit->stack_pointer = (edit->stack_pointer + 1) & edit->stack_size_mask;
+ 	va_start (ap, c);
+ 	c = -(va_arg (ap, int));
+@@ -725,12 +835,14 @@ void edit_push_action (WEdit * edit, long c,...)
+ 	&& spm1 != edit->stack_bottom
+ 	&& ((sp - 2) & edit->stack_size_mask) != edit->stack_bottom) {
+ 	int d;
+-	if (edit->undo_stack[spm1] < 0) {
+-	    d = edit->undo_stack[(sp - 2) & edit->stack_size_mask];
+-	    if (d == c) {
+-		if (edit->undo_stack[spm1] > -1000000000) {
++	mc_wchar_t d_ch;
++	if (edit->undo_stack[spm1].flags < 0) {
++	    d    = edit->undo_stack[(sp - 2) & edit->stack_size_mask].flags;
++	    d_ch = edit->undo_stack[(sp - 2) & edit->stack_size_mask].ch;
++	    if (d == c && d_ch == ch) {
++		if (edit->undo_stack[spm1].flags > -1000000000) {
+ 		    if (c < KEY_PRESS)	/* --> no need to push multiple do-nothings */
+-			edit->undo_stack[spm1]--;
++			edit->undo_stack[spm1].flags--;
+ 		    return;
+ 		}
+ 	    }
+@@ -738,19 +850,20 @@ void edit_push_action (WEdit * edit, long c,...)
+ #ifndef NO_STACK_CURSMOVE_ANIHILATION
+ 	    else if ((c == CURS_LEFT && d == CURS_RIGHT)
+ 		     || (c == CURS_RIGHT && d == CURS_LEFT)) {	/* a left then a right anihilate each other */
+-		if (edit->undo_stack[spm1] == -2)
++		if (edit->undo_stack[spm1].flags == -2)
+ 		    edit->stack_pointer = spm1;
+ 		else
+-		    edit->undo_stack[spm1]++;
++		    edit->undo_stack[spm1].flags++;
+ 		return;
+ 	    }
+ #endif
+ 	} else {
+-	    d = edit->undo_stack[spm1];
+-	    if (d == c) {
++	    d    = edit->undo_stack[spm1].flags;
++	    d_ch = edit->undo_stack[spm1].ch;
++	    if (d == c && d_ch == ch) {
+ 		if (c >= KEY_PRESS)
+ 		    return;	/* --> no need to push multiple do-nothings */
+-		edit->undo_stack[sp] = -2;
++		edit->undo_stack[sp].flags = -2;
+ 		goto check_bottom;
+ 	    }
+ #ifndef NO_STACK_CURSMOVE_ANIHILATION
+@@ -762,7 +875,9 @@ void edit_push_action (WEdit * edit, long c,...)
+ #endif
+ 	}
+     }
+-    edit->undo_stack[sp] = c;
++    edit->undo_stack[sp].flags = c;
++    edit->undo_stack[sp].ch = ch;
++
+   check_bottom:
+ 
+     edit->stack_pointer = (edit->stack_pointer + 1) & edit->stack_size_mask;
+@@ -775,10 +890,10 @@ void edit_push_action (WEdit * edit, long c,...)
+        (((unsigned long) c + 1) & edit->stack_size_mask) == edit->stack_bottom)
+ 	do {
+ 	    edit->stack_bottom = (edit->stack_bottom + 1) & edit->stack_size_mask;
+-	} while (edit->undo_stack[edit->stack_bottom] < KEY_PRESS && edit->stack_bottom != edit->stack_pointer);
++	} while (edit->undo_stack[edit->stack_bottom].flags < KEY_PRESS && edit->stack_bottom != edit->stack_pointer);
+ 
+ /*If a single key produced enough pushes to wrap all the way round then we would notice that the [stack_bottom] does not contain KEY_PRESS. The stack is then initialised: */
+-    if (edit->stack_pointer != edit->stack_bottom && edit->undo_stack[edit->stack_bottom] < KEY_PRESS)
++    if (edit->stack_pointer != edit->stack_bottom && edit->undo_stack[edit->stack_bottom].flags < KEY_PRESS)
+ 	edit->stack_bottom = edit->stack_pointer = 0;
+ }
+ 
+@@ -787,30 +902,30 @@ void edit_push_action (WEdit * edit, long c,...)
+    then the file should be as it was when he loaded up. Then set edit->modified to 0.
+  */
+ static long
+-pop_action (WEdit * edit)
++pop_action (WEdit * edit, struct action *c)
+ {
+-    long c;
+     unsigned long sp = edit->stack_pointer;
+     if (sp == edit->stack_bottom) {
+-	return STACK_BOTTOM;
++	c->flags = STACK_BOTTOM;
++	return c->flags;
+     }
+     sp = (sp - 1) & edit->stack_size_mask;
+-    if ((c = edit->undo_stack[sp]) >= 0) {
+-/*	edit->undo_stack[sp] = '@'; */
++    *c = edit->undo_stack[sp];
++    if (edit->undo_stack[sp].flags >= 0) {
+ 	edit->stack_pointer = (edit->stack_pointer - 1) & edit->stack_size_mask;
+-	return c;
++	return c->flags;
+     }
+     if (sp == edit->stack_bottom) {
+ 	return STACK_BOTTOM;
+     }
+-    c = edit->undo_stack[(sp - 1) & edit->stack_size_mask];
+-    if (edit->undo_stack[sp] == -2) {
+-/*      edit->undo_stack[sp] = '@'; */
++    *c = edit->undo_stack[(sp - 1) & edit->stack_size_mask];
++
++    if (edit->undo_stack[sp].flags == -2) {
+ 	edit->stack_pointer = sp;
+     } else
+-	edit->undo_stack[sp]++;
++	edit->undo_stack[sp].flags++;
+ 
+-    return c;
++    return c->flags;
+ }
+ 
+ /* is called whenever a modification is made by one of the four routines below */
+@@ -831,7 +946,7 @@ static inline void edit_modification (WEdit * edit)
+  */
+ 
+ void
+-edit_insert (WEdit *edit, int c)
++edit_insert (WEdit *edit, mc_wchar_t c)
+ {
+     /* check if file has grown to large */
+     if (edit->last_byte >= SIZE_LIMIT)
+@@ -869,12 +984,11 @@ edit_insert (WEdit *edit, int c)
+     /* add a new buffer if we've reached the end of the last one */
+     if (!(edit->curs1 & M_EDIT_BUF_SIZE))
+ 	edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE] =
+-	    g_malloc (EDIT_BUF_SIZE);
++	    g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t));
+ 
+     /* perform the insertion */
+-    edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE][edit->
+-						   curs1 & M_EDIT_BUF_SIZE]
+-	= (unsigned char) c;
++    edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE]
++		    [edit->curs1 & M_EDIT_BUF_SIZE] = c;
+ 
+     /* update file length */
+     edit->last_byte++;
+@@ -885,7 +999,7 @@ edit_insert (WEdit *edit, int c)
+ 
+ 
+ /* same as edit_insert and move left */
+-void edit_insert_ahead (WEdit * edit, int c)
++void edit_insert_ahead (WEdit * edit, mc_wchar_t c)
+ {
+     if (edit->last_byte >= SIZE_LIMIT)
+ 	return;
+@@ -908,7 +1022,7 @@ void edit_insert_ahead (WEdit * edit, int c)
+     edit->last_get_rule += (edit->last_get_rule >= edit->curs1);
+ 
+     if (!((edit->curs2 + 1) & M_EDIT_BUF_SIZE))
+-	edit->buffers2[(edit->curs2 + 1) >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE);
++	edit->buffers2[(edit->curs2 + 1) >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t));
+     edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE][EDIT_BUF_SIZE - (edit->curs2 & M_EDIT_BUF_SIZE) - 1] = c;
+ 
+     edit->last_byte++;
+@@ -918,7 +1032,7 @@ void edit_insert_ahead (WEdit * edit, int c)
+ 
+ int edit_delete (WEdit * edit)
+ {
+-    int p;
++    mc_wint_t p;
+     if (!edit->curs2)
+ 	return 0;
+ 
+@@ -942,7 +1056,7 @@ int edit_delete (WEdit * edit)
+ 	edit->total_lines--;
+ 	edit->force |= REDRAW_AFTER_CURSOR;
+     }
+-    edit_push_action (edit, p + 256);
++    edit_push_action (edit, CHAR_INSERT_AHEAD, p);
+     if (edit->curs1 < edit->start_display) {
+ 	edit->start_display--;
+ 	if (p == '\n')
+@@ -956,7 +1070,7 @@ int edit_delete (WEdit * edit)
+ static int
+ edit_backspace (WEdit * edit)
+ {
+-    int p;
++    mc_wint_t p;
+     if (!edit->curs1)
+ 	return 0;
+ 
+@@ -980,7 +1094,7 @@ edit_backspace (WEdit * edit)
+ 	edit->total_lines--;
+ 	edit->force |= REDRAW_AFTER_CURSOR;
+     }
+-    edit_push_action (edit, p);
++    edit_push_action (edit, CHAR_INSERT, p);
+ 
+     if (edit->curs1 < edit->start_display) {
+ 	edit->start_display--;
+@@ -993,10 +1107,18 @@ edit_backspace (WEdit * edit)
+ 
+ #ifdef FAST_MOVE_CURSOR
+ 
+-static void memqcpy (WEdit * edit, unsigned char *dest, unsigned char *src, int n)
++static void memqcpy (WEdit * edit, mc_wchar_t *dest, mc_wchar_t *src, int n)
+ {
+     unsigned long next;
++#ifndef UTF8
+     while ((next = (unsigned long) memccpy (dest, src, '\n', n))) {
++#else /* UTF8 */
++    while (n) {
++	next = 0;
++	while (next < n && src[next]!='\n') next++;
++	if (next < n) next++;
++        wmemcpy (dest, src, next)
++#endif /* UTF8 */
+ 	edit->curs_line--;
+ 	next -= (unsigned long) dest;
+ 	n -= next;
+@@ -1009,7 +1131,7 @@ int
+ edit_move_backward_lots (WEdit *edit, long increment)
+ {
+     int r, s, t;
+-    unsigned char *p;
++    mc_wchar_t *p;
+ 
+     if (increment > edit->curs1)
+ 	increment = edit->curs1;
+@@ -1049,7 +1171,7 @@ edit_move_backward_lots (WEdit *edit, long increment)
+ 	    edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE] = p;
+ 	else
+ 	    edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE] =
+-		g_malloc (EDIT_BUF_SIZE);
++		g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t));
+     } else {
+ 	g_free (p);
+     }
+@@ -1087,7 +1209,7 @@ edit_move_backward_lots (WEdit *edit, long increment)
+ 		edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE] = p;
+ 	    else
+ 		edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE] =
+-		    g_malloc (EDIT_BUF_SIZE);
++		    g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t));
+ 	} else {
+ 	    g_free (p);
+ 	}
+@@ -1120,7 +1242,7 @@ void edit_cursor_move (WEdit * edit, long increment)
+ 
+ 	    c = edit_get_byte (edit, edit->curs1 - 1);
+ 	    if (!((edit->curs2 + 1) & M_EDIT_BUF_SIZE))
+-		edit->buffers2[(edit->curs2 + 1) >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE);
++		edit->buffers2[(edit->curs2 + 1) >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t));
+ 	    edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE][EDIT_BUF_SIZE - (edit->curs2 & M_EDIT_BUF_SIZE) - 1] = c;
+ 	    edit->curs2++;
+ 	    c = edit->buffers1[(edit->curs1 - 1) >> S_EDIT_BUF_SIZE][(edit->curs1 - 1) & M_EDIT_BUF_SIZE];
+@@ -1144,7 +1266,7 @@ void edit_cursor_move (WEdit * edit, long increment)
+ 
+ 	    c = edit_get_byte (edit, edit->curs1);
+ 	    if (!(edit->curs1 & M_EDIT_BUF_SIZE))
+-		edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE);
++		edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t));
+ 	    edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE][edit->curs1 & M_EDIT_BUF_SIZE] = c;
+ 	    edit->curs1++;
+ 	    c = edit->buffers2[(edit->curs2 - 1) >> S_EDIT_BUF_SIZE][EDIT_BUF_SIZE - ((edit->curs2 - 1) & M_EDIT_BUF_SIZE) - 1];
+@@ -1249,7 +1371,7 @@ long edit_move_forward3 (WEdit * edit, long current, int cols, long upto)
+ 	q = edit->last_byte + 2;
+ 
+     for (col = 0, p = current; p < q; p++) {
+-	int c;
++	mc_wchar_t c;
+ 	if (cols != -10) {
+ 	    if (col == cols)
+ 		return p;
+@@ -1267,7 +1389,7 @@ long edit_move_forward3 (WEdit * edit, long current, int cols, long upto)
+ 	} else if (c < 32 || c == 127)
+ 	    col += 2; /* Caret notation for control characters */
+ 	else
+-	    col++;
++	    col += wcwidth(c);
+     }
+     return col;
+ }
+@@ -1400,12 +1522,16 @@ static int
+ is_blank (WEdit *edit, long offset)
+ {
+     long s, f;
+-    int c;
++    mc_wchar_t c;
+     s = edit_bol (edit, offset);
+     f = edit_eol (edit, offset) - 1;
+     while (s <= f) {
+ 	c = edit_get_byte (edit, s++);
++#ifndef UTF8
+ 	if (!isspace (c))
++#else
++	if (!iswspace (c))
<<Diff was trimmed, longer than 597 lines>>


More information about the pld-cvs-commit mailing list