X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Finsdel.c;h=a459c8a120173c8f2cc8eead7e09c561d020ea53;hb=7c1dff53c61110634f084d4ce395b6fd01cfef69;hp=ac443cd7ed0c2f803800571c26a0e061c2738f48;hpb=a1655b870904de973c366d85ebdc8adde4ef5e1e;p=chise%2Fxemacs-chise.git.1 diff --git a/src/insdel.c b/src/insdel.c index ac443cd..a459c8a 100644 --- a/src/insdel.c +++ b/src/insdel.c @@ -200,7 +200,6 @@ Boston, MA 02111-1307, USA. */ #include #include "lisp.h" -#include #include "buffer.h" #include "device.h" @@ -219,7 +218,9 @@ Boston, MA 02111-1307, USA. */ #define MAX_BUFPOS_GAP_SIZE_3 (65535/3) #define MAX_BYTIND_GAP_SIZE_3 (3 * MAX_BUFPOS_GAP_SIZE_3) +#ifndef UTF2000 short three_to_one_table[1 + MAX_BYTIND_GAP_SIZE_3]; +#endif /* Various macros modelled along the lines of those in buffer.h. Purposefully omitted from buffer.h because files other than this @@ -430,7 +431,11 @@ bufpos_to_bytind_func (struct buffer *buf, Bufpos x) bufmax = buf->text->mule_bufmax; bytmin = buf->text->mule_bytmin; bytmax = buf->text->mule_bytmax; +#ifdef UTF2000 + size = buf->text->mule_size; +#else size = (1 << buf->text->mule_shifter) + !!buf->text->mule_three_p; +#endif /* The basic idea here is that we shift the "known region" up or down until it overlaps the specified position. We do this by moving @@ -490,7 +495,7 @@ bufpos_to_bytind_func (struct buffer *buf, Bufpos x) } #ifdef ERROR_CHECK_BUFPOS else if (x >= bufmin) - abort (); + ABORT (); #endif else { @@ -625,11 +630,16 @@ bufpos_to_bytind_func (struct buffer *buf, Bufpos x) discovered isn't too large, because we use a fixed-length table to divide by 3. */ +#ifdef UTF2000 + buf->text->mule_size = size; +#endif if (size == 3) { int gap = bytmax - bytmin; +#ifndef UTF2000 buf->text->mule_three_p = 1; buf->text->mule_shifter = 1; +#endif if (gap > MAX_BYTIND_GAP_SIZE_3) { @@ -647,11 +657,13 @@ bufpos_to_bytind_func (struct buffer *buf, Bufpos x) } else { +#ifndef UTF2000 buf->text->mule_three_p = 0; if (size == 4) buf->text->mule_shifter = 2; else buf->text->mule_shifter = size - 1; +#endif } buf->text->mule_bufmin = bufmin; @@ -707,7 +719,11 @@ bytind_to_bufpos_func (struct buffer *buf, Bytind x) bufmax = buf->text->mule_bufmax; bytmin = buf->text->mule_bytmin; bytmax = buf->text->mule_bytmax; +#ifdef UTF2000 + size = buf->text->mule_size; +#else size = (1 << buf->text->mule_shifter) + !!buf->text->mule_three_p; +#endif /* The basic idea here is that we shift the "known region" up or down until it overlaps the specified position. We do this by moving @@ -767,7 +783,7 @@ bytind_to_bufpos_func (struct buffer *buf, Bytind x) } #ifdef ERROR_CHECK_BUFPOS else if (x >= bytmin) - abort (); + ABORT (); #endif else { @@ -902,11 +918,16 @@ bytind_to_bufpos_func (struct buffer *buf, Bytind x) discovered isn't too large, because we use a fixed-length table to divide by 3. */ +#ifdef UTF2000 + buf->text->mule_size = size; + #endif if (size == 3) { int gap = bytmax - bytmin; +#ifndef UTF2000 buf->text->mule_three_p = 1; buf->text->mule_shifter = 1; +#endif if (gap > MAX_BYTIND_GAP_SIZE_3) { @@ -924,11 +945,13 @@ bytind_to_bufpos_func (struct buffer *buf, Bytind x) } else { +#ifndef UTF2000 buf->text->mule_three_p = 0; if (size == 4) buf->text->mule_shifter = 2; else buf->text->mule_shifter = size - 1; +#endif } buf->text->mule_bufmin = bufmin; @@ -964,7 +987,11 @@ buffer_mule_signal_inserted_region (struct buffer *buf, Bufpos start, Bytecount bytelength, Charcount charlength) { +#ifdef UTF2000 + int size = buf->text->mule_size; +#else int size = (1 << buf->text->mule_shifter) + !!buf->text->mule_three_p; +#endif int i; /* Adjust the cache of known positions. */ @@ -1195,6 +1222,7 @@ bytind_to_bufpos (struct buffer *buf, Bytind x) Bufpos get_buffer_pos_char (struct buffer *b, Lisp_Object pos, unsigned int flags) { + /* Does not GC */ Bufpos ind; Bufpos min_allowed, max_allowed; @@ -1244,6 +1272,7 @@ void get_buffer_range_char (struct buffer *b, Lisp_Object from, Lisp_Object to, Bufpos *from_out, Bufpos *to_out, unsigned int flags) { + /* Does not GC */ Bufpos min_allowed, max_allowed; min_allowed = (flags & GB_ALLOW_PAST_ACCESSIBLE) ? @@ -1796,7 +1825,7 @@ static void move_gap (struct buffer *buf, Bytind pos) { if (! BUF_BEG_ADDR (buf)) - abort (); + ABORT (); if (pos < BI_BUF_GPT (buf)) gap_left (buf, pos); else if (pos > BI_BUF_GPT (buf)) @@ -2323,16 +2352,15 @@ prepare_to_modify_buffer (struct buffer *buf, Bufpos start, Bufpos end, if (!NILP (buf->filename) && lockit && BUF_SAVE_MODIFF (buf) >= BUF_MODIFF (buf)) { -#ifdef CLASH_DETECTION - if (!NILP (buf->file_truename)) - /* Make binding buffer-file-name to nil effective. */ - lock_file (buf->file_truename); -#else /* At least warn if this file has changed on disk since it was visited.*/ if (NILP (Fverify_visited_file_modtime (buffer)) && !NILP (Ffile_exists_p (buf->filename))) call1_in_buffer (buf, intern ("ask-user-about-supersession-threat"), buf->filename); +#ifdef CLASH_DETECTION + if (!NILP (buf->file_truename)) + /* Make binding buffer-file-name to nil effective. */ + lock_file (buf->file_truename); #endif /* not CLASH_DETECTION */ } UNGCPRO; @@ -3072,7 +3100,7 @@ barf_if_buffer_read_only (struct buffer *buf, Bufpos from, Bufpos to) } void -find_charsets_in_bufbyte_string (unsigned char *charsets, const Bufbyte *str, +find_charsets_in_bufbyte_string (Charset_ID *charsets, const Bufbyte *str, Bytecount len) { #ifndef MULE @@ -3080,26 +3108,33 @@ find_charsets_in_bufbyte_string (unsigned char *charsets, const Bufbyte *str, charsets[0] = 1; #else const Bufbyte *strend = str + len; - memset (charsets, 0, NUM_LEADING_BYTES); + memset (charsets, 0, NUM_LEADING_BYTES * sizeof(Charset_ID)); /* #### SJT doesn't like this. */ if (len == 0) { - charsets[XCHARSET_LEADING_BYTE (Vcharset_ascii) - 128] = 1; + charsets[XCHARSET_LEADING_BYTE (Vcharset_ascii) - MIN_LEADING_BYTE] = 1; return; } while (str < strend) { - charsets[CHAR_LEADING_BYTE (charptr_emchar (str)) - 128] = 1; +#ifdef UTF2000 + charsets[CHAR_CHARSET_ID (charptr_emchar (str)) + - MIN_LEADING_BYTE] = 1; +#else /* I'm not sure the definition for UTF2000 works with leading-byte + representation. */ + charsets[CHAR_LEADING_BYTE (charptr_emchar (str)) + - MIN_LEADING_BYTE] = 1; +#endif INC_CHARPTR (str); } #endif } void -find_charsets_in_emchar_string (unsigned char *charsets, const Emchar *str, - Charcount len) +find_charsets_in_charc_string (Charset_ID *charsets, const Charc *str, + Charcount len) { #ifndef MULE /* Telescope this. */ @@ -3107,18 +3142,18 @@ find_charsets_in_emchar_string (unsigned char *charsets, const Emchar *str, #else int i; - memset (charsets, 0, NUM_LEADING_BYTES); + memset (charsets, 0, NUM_LEADING_BYTES * sizeof(Charset_ID)); /* #### SJT doesn't like this. */ if (len == 0) { - charsets[XCHARSET_LEADING_BYTE (Vcharset_ascii) - 128] = 1; + charsets[XCHARSET_ID (Vcharset_ascii) - MIN_LEADING_BYTE] = 1; return; } for (i = 0; i < len; i++) { - charsets[CHAR_LEADING_BYTE (str[i]) - 128] = 1; + charsets[CHARC_CHARSET_ID (str[i]) - MIN_LEADING_BYTE] = 1; } #endif } @@ -3133,7 +3168,7 @@ bufbyte_string_displayed_columns (const Bufbyte *str, Bytecount len) { #ifdef MULE Emchar ch = charptr_emchar (str); - cols += XCHARSET_COLUMNS (CHAR_CHARSET (ch)); + cols += CHAR_COLUMNS (ch); #else cols++; #endif @@ -3144,14 +3179,14 @@ bufbyte_string_displayed_columns (const Bufbyte *str, Bytecount len) } int -emchar_string_displayed_columns (const Emchar *str, Charcount len) +charc_string_displayed_columns (const Charc *str, Charcount len) { #ifdef MULE int cols = 0; int i; for (i = 0; i < len; i++) - cols += XCHARSET_COLUMNS (CHAR_CHARSET (str[i])); + cols += CHARC_COLUMNS (str[i]); return cols; #else /* not MULE */ @@ -3162,15 +3197,14 @@ emchar_string_displayed_columns (const Emchar *str, Charcount len) /* NOTE: Does not reset the Dynarr. */ void -convert_bufbyte_string_into_emchar_dynarr (const Bufbyte *str, Bytecount len, - Emchar_dynarr *dyn) +convert_bufbyte_string_into_charc_dynarr (const Bufbyte *str, Bytecount len, + Charc_dynarr *dyn) { const Bufbyte *strend = str + len; while (str < strend) { - Emchar ch = charptr_emchar (str); - Dynarr_add (dyn, ch); + Dynarr_add (dyn, CHAR_TO_CHARC (charptr_emchar (str))); INC_CHARPTR (str); } } @@ -3195,15 +3229,15 @@ convert_bufbyte_string_into_emchar_string (const Bufbyte *str, Bytecount len, Does not add a terminating zero. */ void -convert_emchar_string_into_bufbyte_dynarr (Emchar *arr, int nels, - Bufbyte_dynarr *dyn) +convert_charc_string_into_bufbyte_dynarr (Charc *arr, int nels, + Bufbyte_dynarr *dyn) { Bufbyte str[MAX_EMCHAR_LEN]; int i; for (i = 0; i < nels; i++) { - Bytecount len = set_charptr_emchar (str, arr[i]); + Bytecount len = set_charptr_emchar (str, CHARC_TO_CHAR (arr[i])); Dynarr_add_many (dyn, str, len); } } @@ -3215,7 +3249,7 @@ convert_emchar_string_into_bufbyte_dynarr (Emchar *arr, int nels, is one more than this: the returned string is zero-terminated. */ Bufbyte * -convert_emchar_string_into_malloced_string (Emchar *arr, int nels, +convert_charc_string_into_malloced_string (Charc *arr, int nels, Bytecount *len_out) { /* Damn zero-termination. */ @@ -3226,7 +3260,9 @@ convert_emchar_string_into_malloced_string (Emchar *arr, int nels, int i; for (i = 0; i < nels; i++) - str += set_charptr_emchar (str, arr[i]); + { + str += set_charptr_emchar (str, CHARC_TO_CHAR (arr[i])); + } *str = '\0'; len = str - strorig; str = (Bufbyte *) xmalloc (1 + len); @@ -3244,13 +3280,17 @@ convert_emchar_string_into_malloced_string (Emchar *arr, int nels, void reinit_vars_of_insdel (void) { +#ifndef UTF2000 int i; +#endif inside_change_hook = 0; in_first_change = 0; +#ifndef UTF2000 for (i = 0; i <= MAX_BYTIND_GAP_SIZE_3; i++) three_to_one_table[i] = i / 3; +#endif } void @@ -3280,8 +3320,12 @@ init_buffer_text (struct buffer *b) b->text->mule_bufmin = b->text->mule_bufmax = 1; b->text->mule_bytmin = b->text->mule_bytmax = 1; +#ifdef UTF2000 + b->text->mule_size = 0; +#else b->text->mule_shifter = 0; b->text->mule_three_p = 0; +#endif for (i = 0; i < 16; i++) {