diff options
Diffstat (limited to 'abs/extra/most/most-debian.patch')
-rw-r--r-- | abs/extra/most/most-debian.patch | 1655 |
1 files changed, 0 insertions, 1655 deletions
diff --git a/abs/extra/most/most-debian.patch b/abs/extra/most/most-debian.patch deleted file mode 100644 index 4387420..0000000 --- a/abs/extra/most/most-debian.patch +++ /dev/null @@ -1,1655 +0,0 @@ ---- most-4.10.2.orig/most.1 -+++ most-4.10.2/most.1 -@@ -134,7 +134,7 @@ - Use this switch when you want to view files - containing 8 bit characters. - .I most --will display the file 16 bytes per line in hexidecimal notation. -+will display the file 16 bytes per line in hexadecimal notation. - A typical line looks like: - .IP - .Ds -@@ -185,12 +185,13 @@ - This option is meaningful only when used with the - .B \-v - option. -+.TP - .BI + lineno - Start up at - .IR lineno . - .TP --.B +c --Make search case sensitive. -+.B -c -+Make searches case sensitive. - By default, they are not. - .TP - .B +d -@@ -482,7 +483,7 @@ - descriptors that represent the file name and line number, - respectively. For example, if JED is your editor, then set - .B MOST_EDITOR --to 'jed %s -g %d'. -+to 'jed %s -g %d'. This will only work where the %s preceeds the %d. - .TP - .B MOST_HELP - This variable may be used to specify an alternate help file. -@@ -496,7 +497,7 @@ - .I most.rc - on other systems. - .SH CONFIGURATION FILE SYNTAX --When most starts up, it tries to read a system confiuration file and -+When most starts up, it tries to read a system configuration file and - then a personal configuration file. These files may be used to - specify keybindings and colors. - .PP ---- most-4.10.2.orig/src/buffer.c -+++ most-4.10.2/src/buffer.c -@@ -44,10 +44,10 @@ - - Most_Buffer_Type *Most_Buf; - --int Most_Num_Lines; -+long long Most_Num_Lines; - --unsigned int Most_C_Offset; --int Most_C_Line; -+unsigned long long Most_C_Offset; -+long long Most_C_Line; - - static unsigned char *beg_of_line1(void) - { -@@ -61,24 +61,29 @@ - { - if (*pos == '\n') - { -- pos--; -- while ((pos > Most_Beg) -- && (*pos != '\n')) -+ pos--; /* Skip back the new-line. */ -+ /* This block is UTF-8 safe, because it only scans the -+ buffer for a new-line, and doesn't count -+ characters. */ -+ while ((pos > Most_Beg) && (*pos != '\n')) - pos--; - -- if (*pos != '\n') return pos; -+ if (*pos != '\n') return Most_Beg; -+ /* from here on *pos == '\n' */ - if (pos + 1 != cpos) - return pos + 1; - } - } -- else pos--; -+ else -+ pos = SLutf8_bskip_char(Most_Beg, pos); - - if (*pos != '\n') - { -- while ((pos > Most_Beg) -- && (*pos != '\n')) -+ /* This block is UTF-8 safe. See comment above. */ -+ while ((pos > Most_Beg) && (*pos != '\n')) - pos--; - if (*pos != '\n') return Most_Beg; -+ /* from here on *pos == '\n' */ - return pos + 1; - } - -@@ -93,55 +98,6 @@ - return pos; - } - -- --static unsigned char *forward_columns (unsigned char *b, unsigned char *e, unsigned int num_cols) --{ -- unsigned int col = 0; -- -- while ((b < e) -- && (col < num_cols)) -- { -- unsigned char ch = *b++; -- if (((ch >= ' ') && (ch < 0x7F)) -- || (ch >= SLsmg_Display_Eight_Bit)) -- { -- col++; -- continue; -- } -- -- if ((ch == '\b') || (ch == '\t') || (ch == '\r')) -- switch (ch) -- { -- case '\b': -- if (Most_V_Opt == 0) -- { -- if (col > 0) col--; -- } -- else col += 2; -- break; -- -- case '\r': -- if (Most_V_Opt == 0) -- col = 0; -- else -- col += 2; -- break; -- -- case '\t': -- if (Most_T_Opt == 0) -- col = Most_Tab_Width * (col/Most_Tab_Width + 1); -- else -- col += 2; -- break; -- } -- else if (ch & 0x80) -- col += 3; -- else -- col += 2; -- } -- return b; --} -- - /* does not move point */ - static unsigned char *end_of_line1(void) - { -@@ -164,6 +120,9 @@ - - if (*pos != '\n') - { -+ /* This block is UTF-8 safe, because it only scans the buffer -+ for a new-line, and doesn't count characters. */ -+ - n = pmax - pos; - n2 = n % 8; - pmax = pos + (n - 8); -@@ -215,7 +174,7 @@ - ncols = SLtt_Screen_Cols-1; - while (1) - { -- unsigned char *next_b = forward_columns (b, e, ncols); -+ unsigned char *next_b = most_forward_columns (b, e, ncols, 1); - if ((next_b == e) || (next_b == b)) - break; - -@@ -237,11 +196,12 @@ - return e; - - if (b == NULL) b = most_beg_of_line (); -- b = forward_columns (b, e, SLtt_Screen_Cols-1); -+ b = most_forward_columns (b, e, SLtt_Screen_Cols-1, 1); - - /* Do not wrap the line if the last character falls on the last column - * of the display. - */ -+ /* FIXME potential bug if dealing with multi-byte char. */ - if ((b + 1 <= e) - && (b + 1 < Most_Eob) - && (b[1] == '\n')) -@@ -250,10 +210,10 @@ - return b; - } - --int most_forward_line(int save) -+long long most_forward_line(long long save) - { -- int m; -- register int n = save; -+ long long m; -+ register long long n = save; - unsigned char *p; - unsigned char *pmax; - -@@ -346,14 +306,14 @@ - } - - /* Count lines in the region. A half line counts as 1 */ --int most_count_lines(unsigned char *beg, unsigned char *end) -+long long most_count_lines(unsigned char *beg, unsigned char *end) - { -- int save_line, n; -+ long long save_line, n; - unsigned char *save_beg, *save_eob; -- unsigned int save_pos; -+ unsigned long long save_pos; - int dn = 1000; - -- if (Most_B_Opt) return(1 + (int)(end - beg) / 16); -+ if (Most_B_Opt) return(1 + (long long)(end - beg) / 16); - - save_line = Most_C_Line; save_beg = Most_Beg; save_eob = Most_Eob; - save_pos = Most_C_Offset; -@@ -371,9 +331,9 @@ - return(n); - } - --void most_goto_line(int line) -+void most_goto_line(long long line) - { -- int dif_c, dif_b,dif_t; -+ long long dif_c, dif_b,dif_t; - - if (line < 1) line = 1; - most_read_to_line(line); -@@ -420,7 +380,7 @@ - } - - /* return line the point is on without the final '\n's */ --int most_extract_line(unsigned char **beg, unsigned char **end) -+long long most_extract_line(unsigned char **beg, unsigned char **end) - { - *beg = most_beg_of_line(); - *end = end_of_line (*beg); -@@ -428,12 +388,12 @@ - return 0; - } - --int most_what_line(unsigned char *pos) -+long long most_what_line(unsigned char *pos) - { -- unsigned int save_pos; -- int save_line, dir; -- register int dif_c, dif_b,dif_t; -- int ret; -+ unsigned long long save_pos; -+ long long save_line, dir; -+ register long long dif_c, dif_b,dif_t; -+ long long ret; - - if (Most_B_Opt) - { -@@ -517,7 +477,7 @@ - } - - /* given a buffer position, find the line and column */ --void most_find_row_column(unsigned char *pos, int *r, int *c) -+void most_find_row_column(unsigned char *pos, long long *r, long long *c) - { - unsigned char *beg; - unsigned int save_offset; -@@ -545,7 +505,10 @@ - /* Now we have found the line it is on so.... */ - beg = most_beg_of_line(); - *c = 1; -- while (beg++ < pos) *c = *c + 1; -+ if (Most_UTF8_Mode) -+ while ((beg = SLutf8_skip_char(beg, pos)) < pos) *c = *c + 1; -+ else -+ while (beg++ < pos) *c = *c + 1; - Most_C_Line = save_line; - Most_C_Offset = save_offset; - } ---- most-4.10.2.orig/src/buffer.h -+++ most-4.10.2/src/buffer.h -@@ -23,12 +23,12 @@ - - extern Most_Buffer_Type *Most_Buf; - extern unsigned char *Most_Beg, *Most_Eob; --extern int Most_Num_Lines; -+extern long long Most_Num_Lines; - - /* Offset of current position from beginning of buffer */ --extern unsigned int Most_C_Offset; -+extern unsigned long long Most_C_Offset; - --extern int Most_C_Line; -+extern long long Most_C_Line; - /* - * Current line number. If at the beginning of the buffer, it is 1. If - * we are at the last point of the buffer it is the number of lines. -@@ -37,26 +37,26 @@ - /* This routine does not move the point */ - extern unsigned char *most_beg_of_line(void); - --extern int most_forward_line(int); -+extern long long most_forward_line(long long); - /* This routine moves the point forward n lines. n can be negative. - It returns the number moved. */ - --extern void most_goto_line(int); -+extern void most_goto_line(long long); - /* Move the point somewhere on the nth line of the buffer returning - C_POS */ - --extern int most_what_line(unsigned char *); -+extern long long most_what_line(unsigned char *); - /* return the line number of position 'argument'. Does not move point */ - - /* count the number of lines in the region delimited by beg and end. - Counts lines from beg up to end but does not count end. - Does not move point. */ --extern int most_count_lines(unsigned char *, unsigned char *); --extern int most_extract_line(unsigned char **, unsigned char **); -+extern long long most_count_lines(unsigned char *, unsigned char *); -+extern long long most_extract_line(unsigned char **, unsigned char **); - - extern Most_Buffer_Type *most_switch_to_buffer(Most_Buffer_Type *); - extern Most_Buffer_Type *most_create_buffer(char *); --extern void most_find_row_column(unsigned char *, int *, int *); -+extern void most_find_row_column(unsigned char *, long long *, long long *); - - #endif - ---- most-4.10.2.orig/src/keym.c -+++ most-4.10.2/src/keym.c -@@ -228,7 +228,7 @@ - static void goto_percent_cmd(void) - { - unsigned char *pos; -- int n; -+ long long n; - - if (Most_Digit_Arg != (int *) NULL) n = *Most_Digit_Arg; - else -@@ -282,7 +282,7 @@ - - static void find_next_cmd(void) - { -- int col, line, n = 1; -+ long long col, line, n = 1; - unsigned long ofs; - - if (Most_Digit_Arg != NULL) n = *Most_Digit_Arg; -@@ -309,7 +309,7 @@ - #else - "Search: ", - #endif -- Most_Search_Str, -+ (char *) Most_Search_Str, - MOST_SEARCH_BUF_LEN - ) == -1) return; - Most_Curs_Offset = Most_C_Offset; -@@ -325,7 +325,7 @@ - #else - "Search Backwards: ", - #endif -- Most_Search_Str, -+ (char *) Most_Search_Str, - MOST_SEARCH_BUF_LEN) == -1) return; - find_next_cmd(); - } ---- most-4.10.2.orig/src/line.c -+++ most-4.10.2/src/line.c -@@ -87,8 +87,7 @@ - while (b < end) - { - ch = *b++; -- if (((ch >= ' ') && (ch < 0x7F)) -- || (ch >= SLsmg_Display_Eight_Bit)) -+ if (most_isprint(ch)) - { - *s++ = ch; - continue; -@@ -108,103 +107,156 @@ - - if (end > Most_Eob) end = Most_Eob; - -- sprintf (buf, "0x%08X: ", Most_C_Offset); -+ sprintf (buf, "0x%08llX: ", Most_C_Offset); - ascii_format_line (beg, end, buf + 12); - SLsmg_write_string (buf); - SLsmg_erase_eol (); - } - --static int most_analyse_line(unsigned char *begg, unsigned char *endd, -- char *out, char *attributes) -+int most_isprint(unsigned char ch) - { -- unsigned char *beg, *end; -- unsigned int min_col, max_col; -- unsigned int i, i_max; -+ /* Can this be directly replaced with isprint? */ -+ return (ch >= ' ' && ch < 0x7F) || ch >= SLsmg_Display_Eight_Bit; -+} -+ -+static void most_analyse_line(unsigned char *beg, unsigned char *end, -+ unsigned char *out, char *attributes) -+{ -+ unsigned char *pout; -+ char* pattributes; -+ -+ /* Holds the number of columns for the current character counting -+ * from the left margin (in contrast to the leftmost visible -+ * column). -+ */ -+ unsigned int col; -+ -+ /* Holds the number of the column up to which to apply the -+ * current/following formatting. Only meaningful when format_rlim > i. -+ */ -+ unsigned int format_rlim; - -- beg = begg; -- end = endd; -- i = i_max = 0; -- min_col = Most_Column - 1; -- max_col = min_col + SLtt_Screen_Cols; -+ beg = most_forward_columns(beg, end, Most_Column - 1, 0); -+ pout = out; -+ pattributes = attributes; -+ col = format_rlim = 0; - - while (beg < end) - { - char attr = ' '; -- unsigned char ch; -+ unsigned char ch = *beg++; - -- if ('\n' == (ch = *beg++)) -+ if ('\n' == ch) - break; - - if ((ch == '\r') && (Most_V_Opt == 0)) - { -- if (i > i_max) i_max = i; -- i = 0; -+ if (col > format_rlim) format_rlim = col; -+ col = 0; - continue; - } - - if ((ch == '\b') && (Most_V_Opt == 0)) - { -- if (i > i_max) i_max = i; -- if (i > 0) -- i--; -+ if (col > format_rlim) format_rlim = col; -+ if (col > 0) -+ { -+ if (Most_UTF8_Mode) -+ { -+ SLwchar_Type wc; -+ pout = SLutf8_bskip_char(out, pout); -+ if (SLutf8_decode(pout, pout + SLUTF8_MAX_MBLEN, &wc, NULL)) -+ { -+ unsigned int char_len = SLwchar_wcwidth(wc); -+ if (char_len > 1) -+ col -= char_len - 1; -+ } -+ } -+ else -+ pout--; -+ pattributes--; -+ col--; -+ } - continue; - } - -- if (i < i_max) /* overstrike */ -+ if (col < format_rlim) /* overstrike */ - { - attr = 'b'; -- if ((i >= min_col) && (i < max_col)) -+ if (col < SLtt_Screen_Cols) - { -- if (out[i-min_col] == '_') -+ if (*pout == '_') - attr = 'u'; - else if (ch == '_') - { - attr = 'u'; -- ch = out[i - min_col]; -+ ch = *pout; - } - } - if (ch == ' ') - { -- i++; -+ col++; - continue; - } - /* drop */ - } -- -- if ((ch >= ' ') && (ch < 0x7F)) -- { -- if ((i >= min_col) && (i < max_col)) -+ -+ if (Most_UTF8_Mode) { -+ unsigned char *prev = --beg; -+ SLwchar_Type wc; -+ unsigned int len; -+ -+ if (SLutf8_decode(beg, end, &wc, NULL)) -+ { -+ unsigned int char_len = SLwchar_wcwidth(wc); -+ if (char_len > 1) -+ col += char_len - 1; -+ } -+ -+ beg = SLutf8_skip_char(beg, end); -+ len = beg - prev; -+ -+ if (len > 1) { -+ /* Non-ASCII char, display it. */ -+ if (col < SLtt_Screen_Cols) - { -- out[i-min_col] = ch; -- attributes[i-min_col] = attr; -+ memcpy(pout, prev, len); -+ pout += len; -+ *pattributes++ = attr; - } -- i++; -+ col++; - continue; -- } -- -- if (ch >= SLsmg_Display_Eight_Bit) -+ } -+ } -+ -+ if (most_isprint(ch)) - { -- if ((i >= min_col) && (i < max_col)) -+ if (col < SLtt_Screen_Cols) - { -- out[i-min_col] = ch; -- attributes[i-min_col] = attr; -+ *pout++ = ch; -+ *pattributes++ = attr; - } -- i++; -+ col++; - continue; - } - - if ((ch == '\t') && (Most_T_Opt == 0) && (Most_Tab_Width)) - { -- -- int nspaces = Most_Tab_Width * (i/Most_Tab_Width + 1) - i; -+ /* Tab expansion must take into consideration the -+ * leftmost visible column. However, variable col holds the -+ * number of columns from the left margin and must be -+ * corrected. -+ */ -+ int vis_col = col + Most_Column - 1; -+ int nspaces = Most_Tab_Width - (vis_col % Most_Tab_Width); - while (nspaces > 0) - { -- if ((i >= min_col) && (i < max_col)) -+ if (col < SLtt_Screen_Cols) - { -- out[i-min_col] = ' '; -- attributes[i-min_col] = attr; -+ *pout++ = ' '; -+ *pattributes++ = attr; - } -- i++; -+ col++; - nspaces--; - } - continue; -@@ -212,36 +264,36 @@ - - if (ch & 0x80) - { -- if ((i >= min_col) && (i < max_col)) -+ if (col < SLtt_Screen_Cols) - { -- out[i-min_col] = '~'; -- attributes[i-min_col] = attr; -+ *pout++ = '~'; -+ *pattributes++ = attr; - } -- i++; -+ col++; - ch &= 0x7F; - /* drop */ - } - -- if ((i >= min_col) && (i < max_col)) -+ if (col < SLtt_Screen_Cols) - { -- out[i-min_col] = '^'; -- attributes[i-min_col] = attr; -+ *pout++ = '^'; -+ *pattributes++ = attr; - } -- i++; -+ col++; - - if (ch == 0x7F) ch = '?'; - else ch += '@'; - -- if ((i >= min_col) && (i < max_col)) -+ if (col < SLtt_Screen_Cols) - { -- out[i-min_col] = ch; -- attributes[i-min_col] = attr; -+ *pout++ = ch; -+ *pattributes++ = attr; - } -- i++; -+ col++; - } - -- if (i < i_max) -- i = i_max; -+ if (col < format_rlim) -+ col = format_rlim; - - /* Now add "..." if selective display. To do that, the next line needs to - * be dealt with to determine whether or not it will be hidden. -@@ -249,7 +301,7 @@ - if (Most_Selective_Display - && (Most_W_Opt == 0) - && (beg < Most_Eob) -- && ((i >= min_col) && (i < max_col))) -+ && (col < SLtt_Screen_Cols)) - { - if (*beg == '\n') beg++; - -@@ -260,37 +312,29 @@ - if ((beg >= Most_Eob) || (*beg == '\n') - || (most_apparant_distance(beg) >= Most_Selective_Display)) - { -- i_max = i + 3; -- while (i < i_max) -+ /* Add an ellipsis, if they fit on the screen. */ -+ int rlimit = col + 3; -+ while (col < rlimit) - { -- if (i < max_col) -+ if (col < SLtt_Screen_Cols) - { -- out[i] = '.'; -- attributes[i] = ' '; -+ *pout++ = '.'; -+ *pattributes++ = ' '; - } -- i++; -+ col++; - } - } - } -- -- i_max = i; - -- if (i < min_col) -- i = min_col; -- else if (i >= max_col) -- i = max_col; -- -- i -= min_col; -- -- out[i] = 0; -- attributes[i] = 0; -- return i_max; -+ *pout = 0; -+ *pattributes = 0; - } - --static void output_with_attr (unsigned char *out, unsigned char *attr) -+static void output_with_attr (unsigned char *out, char *attr) - { -- unsigned char at, ch, lat; -+ unsigned char at, lat; - unsigned char *p = out; -+ unsigned char *pmax = p + strlen((char *) p); - - if (Most_V_Opt) - { -@@ -299,7 +343,7 @@ - } - - lat = ' '; -- while ((ch = *p) != 0) -+ while (p < pmax) - { - if (lat != *attr) - { -@@ -321,7 +365,7 @@ - else most_tt_normal_video (); - lat = at; - } -- p++; -+ p = SLutf8_skip_char(p, pmax); - attr++; - } - -@@ -340,10 +384,11 @@ - void most_display_line (void) - { - unsigned char *beg, *end; -- unsigned int len; -+#if 0 - unsigned char dollar; -+#endif - static unsigned char *line; -- static unsigned char *attr; -+ static char *attr; - static unsigned int line_len; - - if (Most_B_Opt) -@@ -357,37 +402,43 @@ - if (line_len < (unsigned int)(SLtt_Screen_Cols + 1) * SLUTF8_MAX_MBLEN) - { - SLfree ((char *) line); -- SLfree ((char *) attr); -+ SLfree (attr); - - line_len = (SLtt_Screen_Cols + 1) * SLUTF8_MAX_MBLEN; - - if ((NULL == (line = (unsigned char *) SLmalloc (line_len))) -- || (NULL == (attr = (unsigned char *) SLmalloc (line_len)))) -+ || (NULL == (attr = SLmalloc (line_len)))) - most_exit_error ("Out of memory"); - } - - (void) most_extract_line (&beg, &end); - -- len = most_analyse_line(beg, end, (char *) line, (char *) attr); -+ most_analyse_line(beg, end, line, attr); - -+#if 0 -+ /* Currently the dollar sign is not always being written at the -+ rightmost column when displaying multi-byte characters. */ - dollar = 0; - if (Most_W_Opt) - { -- if ((end < Most_Eob) -- && (*end != '\n')) -- dollar = '\\'; -+ if ((end < Most_Eob) -+ && (*end != '\n')) -+ dollar = '\\'; - } - else if (len > (unsigned int) SLtt_Screen_Cols + (Most_Column - 1)) - dollar = '$'; -- -+ - if (dollar) - { -- line[SLtt_Screen_Cols-1] = dollar; -- attr[SLtt_Screen_Cols-1] = ' '; -- line[SLtt_Screen_Cols] = 0; -- attr[SLtt_Screen_Cols] = 0; -+ unsigned char *pline = -+ most_forward_columns(line, line + line_len, SLtt_Screen_Cols-1, 1); -+ *pline = dollar; -+ *(pline+1) = 0; -+ attr[SLtt_Screen_Cols-1] = ' '; -+ attr[SLtt_Screen_Cols] = 0; - } -- -+#endif -+ - output_with_attr (line, attr); - SLsmg_erase_eol (); - } -@@ -398,21 +449,34 @@ - int most_apparant_distance (unsigned char *pos) - { - int i; -- unsigned char *save_pos, ch; -+ unsigned char *save_pos, *beg, ch; - unsigned int save_offset; - - save_offset = Most_C_Offset; - save_pos = pos; - Most_C_Offset = (unsigned int) (pos - Most_Beg); -- pos = most_beg_of_line(); -+ beg = pos = most_beg_of_line(); - Most_C_Offset = save_offset; - - i = 0; - while (pos < save_pos) - { -- ch = *pos++; -- if (((ch >= ' ') && (ch < 0x7F)) -- || (ch >= SLsmg_Display_Eight_Bit)) -+ ch = *pos; -+ -+ if (Most_UTF8_Mode) { -+ unsigned char *prev = pos; -+ int len; -+ pos = SLutf8_skip_char(pos, save_pos); -+ len = pos - prev; -+ if (len > 1) { -+ i++; -+ continue; -+ } -+ } else { -+ pos++; -+ } -+ -+ if (most_isprint(ch)) - { - i++; - continue; -@@ -420,7 +484,13 @@ - - if (!Most_V_Opt && (ch == '\b')) - { -- if (i > 0) i--; -+ if (i > 0) -+ { -+ if (Most_UTF8_Mode) -+ i -= pos - SLutf8_bskip_char(beg, pos); -+ else -+ i--; -+ } - } - else if (!Most_V_Opt && (ch == '\015')) /* ^M */ - { -@@ -439,3 +509,95 @@ - } - return i; - } -+ -+/* -+ * Returns a pointer to the num_cols'th character after the one -+ * pointed at b. Invisible character runs are not counted toward this -+ * limit, i.e. strings that represent attributes, such as "_\b" for -+ * underlines. -+ * -+ * If multi_column is non-zero, characters spanning more than one -+ * column will add their extra width to the column count. -+ * -+ * If there the end of the buffer is reached, as delimited by argument -+ * e, then e is returned. -+ */ -+unsigned char *most_forward_columns (unsigned char *beg, unsigned char *e, unsigned int num_cols, int multi_column) -+{ -+ unsigned int col = 0; -+ unsigned int prev_width = 1; -+ unsigned char* b = beg; -+ -+ while ((b < e) -+ && ((col < num_cols) -+ || (*b == '\b') -+ || (*b == '\r'))) -+ { -+ unsigned char ch = *b; -+ -+ if (Most_UTF8_Mode) -+ { -+ unsigned char *prev = b; -+ int len; -+ b = SLutf8_skip_char(b, e); -+ len = b - prev; -+ if (len > 1) -+ { -+ if (multi_column) -+ { -+ SLwchar_Type wc; -+ if (SLutf8_decode(prev, e, &wc, NULL)) -+ col += prev_width = SLwchar_wcwidth(wc); -+ } -+ else -+ col++; -+ continue; -+ } -+ } -+ else -+ b++; -+ -+ if (most_isprint(ch)) -+ { -+ col++; -+ prev_width = 1; -+ continue; -+ } -+ -+ if ((ch == '\b') || (ch == '\t') || (ch == '\r')) -+ switch (ch) -+ { -+ case '\b': -+ if (Most_V_Opt == 0) -+ { -+ if (col > 0) col -= prev_width; -+ } -+ else col += 2; -+ break; -+ -+ case '\r': -+ if (Most_V_Opt == 0) -+ col = 0; -+ else -+ col += 2; -+ break; -+ -+ case '\t': -+ if (Most_T_Opt == 0) -+ col = Most_Tab_Width * (col/Most_Tab_Width + 1); -+ else -+ col += 2; /* ^I is two chars long. */ -+ break; -+ } -+ else if (ch & 0x80) -+ col += 3; -+ else -+ col += 2; -+ } -+ -+ /* Last character was too wide. Backstep it. */ -+ if (col > num_cols) -+ b = SLutf8_bskip_char(beg, b); -+ -+ return b; -+} ---- most-4.10.2.orig/src/line.h -+++ most-4.10.2/src/line.h -@@ -7,5 +7,7 @@ - - extern void most_display_line(void); - extern int most_apparant_distance(unsigned char *); -+extern int most_isprint(unsigned char); -+extern unsigned char *most_forward_columns (unsigned char *, unsigned char *, unsigned int, int); - #endif - ---- most-4.10.2.orig/src/most.c -+++ most-4.10.2/src/most.c -@@ -125,7 +125,7 @@ - ch = *(++str); - if ( ch == '/') - { -- strcpy (Most_Search_Str,++str); -+ strcpy ((char *) Most_Search_Str,++str); - return; - } - -@@ -329,7 +329,8 @@ - - static void do_most (char *file, int start) - { -- int piped, row, col; -+ int piped; -+ long long row, col; - - most_get_cdir(Most_C_Dir); - -@@ -347,7 +348,7 @@ - Most_Curs_Offset = Most_C_Offset; - - if (*Most_Search_Str -- && ((row = most_search (Most_Beg + Most_C_Offset, 1, &col)) > 0)) -+ && ((row = most_search (Most_Beg + Most_C_Offset, 1LL, &col)) > 0)) - most_goto_line(row); - else - { -@@ -455,13 +456,7 @@ - - SLtt_get_terminfo(); - #if SLANG_VERSION >= 20000 --#if 0 -- Most_UTF8_Mode = SLutf8_enable (1); -- if (Most_UTF8_Mode) -- { -- fprintf (stderr, "UTF-8 Mode is in effect\n"); -- } --#endif -+ Most_UTF8_Mode = SLutf8_enable (-1); - #endif - SLtt_Ignore_Beep = 1; - if (No_Colors) ---- most-4.10.2.orig/src/most.h -+++ most-4.10.2/src/most.h -@@ -1,4 +1,5 @@ - #include "config.h" -+#define SLANG_REGEXP - extern int Most_S_Opt; - extern int Most_A_Opt; /* automatically choose -b if necessary */ - extern int Most_V_Opt; /* display control chars */ ---- most-4.10.2.orig/src/search.c -+++ most-4.10.2/src/search.c -@@ -20,6 +20,7 @@ - */ - #include "config.h" - -+#include <ctype.h> - #include <stdio.h> - #include <string.h> - #include <slang.h> -@@ -31,18 +32,18 @@ - #include "display.h" - #include "search.h" - --/* Note!!! The regular expression searches may not work. I have not -- * tested them. -- * FIXME!!! -- */ -- - int Most_Case_Sensitive = 0; --char Most_Search_Str[256]; -+unsigned char Most_Search_Str[256]; - int Most_Search_Dir = 1; - - #include "jdmacros.h" - --#define UPCASE(ch) ((!Most_Case_Sensitive && (ch <= 'z') && (ch >= 'a')) ? (ch - 32) : ch) -+#if SLANG_VERSION < 20000 -+# define NORM_CHAR(ch) ((!Most_Case_Sensitive) ? toupper(ch) : ch) -+# define UPCASE(ch) NORM_CHAR(ch) -+#else -+# define NORM_CHAR(ch) (ch) -+#endif - - #if defined(HAVE_V8_REGCOMP) || defined(SLANG_REGEXP) - -@@ -78,7 +79,7 @@ - * This function is called by the V8 regcomp to report - * errors in regular expressions. - */ --static void regerror(char *s) -+static void regerror(const char *s) - { - char string[256]; - -@@ -95,13 +96,17 @@ - * 0 error - * - */ --static int do_regcomp(unsigned char *key) -+static int do_regcomp(const unsigned char *key) - { - static int old_Most_Case_Sensitive; -- unsigned char UpCaseKey[sizeof(savepattern)]; - # ifndef HAVE_V8_REGCOMP - int posn; /* reg exp error at this offset */ - # endif -+# if SLANG_VERSION < 20000 -+ unsigned char UpCaseKey[sizeof(savepattern)]; -+# else -+ int re_flags = 0; -+# endif - - /* - * Only recompile search string if it has changed -@@ -124,6 +129,7 @@ - - old_Most_Case_Sensitive = Most_Case_Sensitive; - -+# if SLANG_VERSION < 20000 - if ( Most_Case_Sensitive == 0 ) - { - register unsigned char *p; /* ptr to UpCaseKey */ -@@ -141,6 +147,7 @@ - - *p = '\0'; - } -+# endif - - strcpy((char *)savepattern, (char *)key); - -@@ -162,7 +169,12 @@ - # else - if (Regexp != NULL) - SLregexp_free (Regexp); -- if (NULL == (Regexp = SLregexp_compile ((char *)key, Most_Case_Sensitive ? 0 : SLREGEXP_CASELESS))) -+ -+ if (!Most_Case_Sensitive) -+ re_flags |= SLREGEXP_CASELESS; -+ if (Most_UTF8_Mode) -+ re_flags |= SLREGEXP_UTF8; -+ if (NULL == (Regexp = SLregexp_compile ((char *)key, re_flags))) - posn = -1; - else - posn = 0; -@@ -187,7 +199,7 @@ - * Call the appropriate regular expression execute function - */ - --static unsigned char *do_regexec(unsigned char *string) -+static unsigned char *do_regexec(const unsigned char *string, size_t length) - { - # ifdef HAVE_V8_REGCOMP - if ( regexec(regpattern, (char *)string) ) -@@ -196,40 +208,46 @@ - return( NULL ); - # else - # if SLANG_VERSION < 20000 -- return ( SLang_regexp_match(string, strlen((char *)string), ®data) ); -+ return ( SLang_regexp_match(string, length, ®data) ); - # else -- return (unsigned char *)SLregexp_match (Regexp, (char *)string, strlen ((char *)string)); -+ return (unsigned char *)SLregexp_match (Regexp, (char *)string, length); - # endif - # endif /* HAVE_V8_REGCOMP */ - } - - /* -- * Make a upper case copy of a string. Also changes any "c\b" character -- * strings into just "" so that highlighted and underlined characters -- * can be searched. -+ * Changes any "c\b" character strings into just "" so that -+ * highlighted and underlined characters can be searched. Stores in -+ * length the new size of the string, after the aforementioned -+ * changes. -+ * -+ * If using a version of S-Lang that does not support case -+ * insensitive regular expressions, this function upper cases the -+ * input string, as well. - * - * Reuses malloced memory, so a copy cannot be retained between calls. - */ - --static unsigned char *StrUpCaseCopy(unsigned char *input) -+static const unsigned char *StrNormCopy(const unsigned char *input, -+ size_t *length) - { - static unsigned char *uppercase; /* ptr to malloced area */ - static size_t bufsize; /* size of malloced area */ -- unsigned char *src; /* ptr to source */ -+ const unsigned char *src; /* ptr to source */ -+ const unsigned char *end; /* ptr to end of source */ - register unsigned char *dest; /* ptr to destination */ - register int idx; /* index into uppercase[] */ -- register unsigned char c; /* source character */ -- size_t length; /* size of string to copy */ - - src = input; -- length = strlen((char *)src) + 1; /* len of line plus terminator */ -+ end = input + *length; - -- if ( length > bufsize ) -+ if ( *length >= bufsize ) - { - if ( uppercase != (unsigned char *)NULL ) - free(uppercase); - -- bufsize = (length > 256 ) ? length : 256; /* 256 byte default */ -+ /* len of line plus terminator */ -+ bufsize = (*length >= 256 ) ? *length + 1 : 256; /* 256 byte default */ - - uppercase = (unsigned char *)malloc(bufsize); - if ( uppercase == (unsigned char *)NULL ) -@@ -242,8 +260,9 @@ - - dest = uppercase; - -- for ( idx = 0 ; (c = *src) != '\0' ; src++ ) -+ for ( idx = 0 ; src < end ; src++ ) - { -+ unsigned char c = *src; - if ( c == '\b' ) /* backspace */ - { - if ( idx-- > 0 ) -@@ -252,54 +271,79 @@ - else - { - if ( idx++ >= 0 ) -- *dest++ = UPCASE(c); -+ *dest++ = NORM_CHAR(c); - } - } - - *dest = '\0'; /* add termination */ - -+ *length = dest - uppercase; - return(uppercase); - } - - /* -- * Given an offset into a copy made by StrUpCaseCopy() and a pointer to the -+ * Given an offset into a copy made by StrNormCopy() and a pointer to the - * original string, returns a pointer into the original string corresponding - * to this offset. - */ - --static unsigned char *GetOrigPtr(unsigned char *original, int offset) -+static const unsigned char * -+GetOrigPtr(const unsigned char *original, int offset, -+ const unsigned char *end) - { -- register unsigned char *p = original; -+ const unsigned char *p = original; - register int j = offset; - - /* - * Step through, adjusting offset according to backspaces found - */ -- while ( *p != '\0' ) -+ while ( p < end ) - { -+ const unsigned char *next; -+ if (Most_UTF8_Mode) -+ next = SLutf8_skip_char((unsigned char*) p, (unsigned char*) end); -+ else -+ next = p + 1; -+ size_t length_last = next - p; -+ - if ( *p == '\b' ) -- j++; -+ j += length_last; - else -- j--; -+ j -= length_last; - - if ( j < 0 ) - break; - else -- p++; -+ p = next; - } - - return(p); - } - #endif /* HAVE_V8_REGCOMP || SLANG_REGEXP */ - -+/* Returns a pointer to the first occurrence of '\n' in string beg, or -+ * end if no '\n' can be found between inclusive beg and exclusive -+ * end. -+ */ -+static const unsigned char * -+find_eol(const unsigned char *beg, const unsigned char *end) -+{ -+ const unsigned char *p; -+ if ( (p = memchr(beg, '\n', end - beg)) != NULL) -+ return p; -+ else -+ return end; -+} -+ - /* This routine returns the 1 + position of first match of key in str. - key is modified to match the case of str. */ - /* We should try to optimize this routine */ - /* searches from beg up to but not including end */ - --static unsigned char *forw_search_region(unsigned char *beg, -- unsigned char *end, -- unsigned char *key) -+static const unsigned char * -+forw_search_region(const unsigned char *beg, -+ const unsigned char *end, -+ const unsigned char *key) - { - #if defined(HAVE_V8_REGCOMP) || defined(SLANG_REGEXP) - /* -@@ -307,10 +351,11 @@ - * to be broken into lines. - * - */ -- unsigned char *p; /* temp pointer */ -- unsigned char *linebeg; /* beginning of working line */ -- unsigned char *copy; /* ptr to upper case copy */ -+ const unsigned char *linebeg; /* beginning of working line */ -+ const unsigned char *lineend; /* end of working line */ -+ const unsigned char *norm_line; /* ptr to normalized line */ - unsigned char *match; /* ptr to matching string */ -+ int anchored_re; - - /* - * Compile "key" into an executable regular expression -@@ -318,58 +363,35 @@ - if ( do_regcomp(key) == 0 ) - return(Most_Eob); - -- /* -- * For regular expression searches we need to do a line by line -- * search, so it is necessary to temporarily replace '\n' with '\0' -- * characters. -- */ -- p = beg; -- linebeg = beg; -+ anchored_re = key[0] == '^'; - -- while (linebeg < end) -+ for ( linebeg = beg ; linebeg < end ; linebeg = lineend + 1 ) - { -- while ((p < end) && (*p != '\n')) p++; -- if (p == end) break; -- *p = 0; -+ size_t length; - -- if ( Most_Case_Sensitive == 0 ) /* i.e. case insensitive */ -- { -- copy = StrUpCaseCopy(linebeg); -- if ( copy == (unsigned char *)NULL ) -- return(Most_Eob); -- } -+ lineend = find_eol(linebeg, end); -+ -+ length = lineend - linebeg; -+ if (0 == length) continue; /* Skip empty lines. */ -+ -+ norm_line = StrNormCopy(linebeg, &length); -+ if ( norm_line == NULL ) -+ return(Most_Eob); - - /* - * Quick sanity check for beginning of line archored tests. -- * If 1st char of key is "^", then the character before linebeg (which -- * must be beyond the start of the window), must be a "\n", -- * otherwise do_regexec() isn't called. -+ * If 1st char of key is "^", then the character before -+ * linebeg (which must be within the buffer), must be a "\n". - */ -- if ( --# if 0 -- ((*key != '^') -- || (linebeg > Most_Win->beg_pos && linebeg[-1] == '\n')) -- && --#endif -- (match = do_regexec(Most_Case_Sensitive ? linebeg : copy))) -+ if ( !(anchored_re && (linebeg <= Most_Beg || linebeg[-1] != '\n')) -+ && (match = do_regexec(norm_line, length)) ) - { -- *p = '\n'; -- if ( Most_Case_Sensitive == 0 ) -- { -- /* -- * Use offset into "copy" as idx to find point in -- * real line. -- */ -- return( GetOrigPtr(linebeg, match - copy) ); -- } -- else -- { -- return( match ); -- } -+ /* -+ * Use offset into "norm_line" as idx to find point in -+ * real line. -+ */ -+ return( GetOrigPtr(linebeg, match - norm_line, lineend) ); - } -- -- *p++ = '\n'; -- linebeg = p; - } - - return(Most_Eob); -@@ -475,23 +497,18 @@ - * pattern "key". - */ - --static unsigned char *back_search_region(unsigned char *beg, -- unsigned char *end, -- unsigned char *key) -+static const unsigned char * -+back_search_region(const unsigned char *beg, -+ const unsigned char *end, -+ const unsigned char *key) - { - #if defined(HAVE_V8_REGCOMP) || defined(SLANG_REGEXP) -- register unsigned char *p; -- unsigned char *endp, /* end of line */ -- *lastmatch, /* last match in line */ -+ const unsigned char *p; -+ const unsigned char *endp, /* end of line */ -+ *lastmatch, /* last match in line */ - *endprevline, /* end of line before this one */ - *match; /* ptr to matching string */ -- unsigned char savec; /* last char on line */ -- -- /* -- * Compile "key" into an executable regular expression -- */ -- if ( do_regcomp(key) == 0 ) -- return(Most_Eob); -+ int anchored_re; - - /* - * Starting from the end of the buffer, break the buffer into lines -@@ -501,84 +518,60 @@ - * and isn't that what we want to do in a reverse search. - */ - endp = end; -- lastmatch = Most_Eob; -- while ( 1 ) /* forever loop */ -- { -- if ( (endp < beg) ) -- return(Most_Eob); /* Reach start of buffer, no match */ -+ endprevline = end; -+ match = Most_Eob; - -- /* Find the real end of current line */ -- if ( (p = (unsigned char *)strchr((char *)endp, '\n')) != NULL ) -- endp = p; -- -- savec = *endp; -- *endp = '\0'; /* terminate line with NULL */ -+ /* Find out whether the regexp attempts to match a line boundary. -+ * In this case, only a match on the full line should be attempted. -+ */ -+ anchored_re = key[strlen((const char *) key)-1] == '$'; - -+ while ( endp > beg ) -+ { - /* Find the beginning of line */ - for ( p = endp - 1 ; (p >= beg) && (*p != '\n') ; p-- ) - { - } - -+ if ( p < beg ) -+ break; -+ - endprevline = p; - -- p++; /* point to 1st char after newline */ -+ /* -+ * Quick sanity check for end of line archored tests. If last -+ * char of key is "$", then the character after endp (which -+ * must be within the buffer), must be a "\n". -+ */ -+ if ( anchored_re && endp < Most_Eob && endp[0] != '\n' ) -+ { -+ endp = p; -+ continue; -+ } - - /* - * Keep searching forward in this line till no more matches - */ -- if ( Most_Case_Sensitive == 0 ) /* i.e. case insensitive */ -+ do - { -- unsigned char *copy; /* ptr to upper case copy */ -- unsigned char *savecopy; /* copy of "copy" */ -- -- copy = StrUpCaseCopy(p); -- if ( copy == (unsigned char *)NULL ) -- return(Most_Eob); -+ lastmatch = match; - -- savecopy = copy; -- -- /* -- * Quick sanity check for beginning of line archored tests. -- * Must be at start of line. -- */ -- while ( ((*key != '^') || (copy == savecopy)) -- && (match = do_regexec(copy)) ) -- { -- if ( GetOrigPtr(p, match - savecopy) > end ) -- break; -- lastmatch = match; -- if ( *lastmatch == '\0' ) /* key must be "$" or "^" */ -- break; -- copy = lastmatch + 1; /* character after match */ -- } -+ if (Most_UTF8_Mode) -+ p = SLutf8_skip_char((unsigned char*) p, (unsigned char*) endp); -+ else -+ p++; - -- if ( lastmatch != Most_Eob ) /* found a match */ -- lastmatch = GetOrigPtr(p, lastmatch - savecopy); -- } -- else -- { -- /* -- * Quick sanity check for beginning of line archored tests. -- * Must be at start of buffer or start of line -- */ -- while ( ( (*key != '^') || (p == endprevline + 1) ) -- && (match = do_regexec(p)) ) -- { -- if ( match > end ) -- break; -- lastmatch = match; -- if ( *lastmatch == '\0' ) /* key must be "$" or "^" */ -- break; -- p = lastmatch + 1; /* character after match */ -- } -+ match = forw_search_region(p, endp, key); - } -+ while ( match <= endp ); - -- *endp = savec; - if ( lastmatch != Most_Eob ) /* found a match */ - return(lastmatch); - - endp = endprevline; - } -+ -+ return(Most_Eob); /* Reached start of buffer, no match */ - #else - char ch, char1, work[256]; - unsigned char *pos; -@@ -670,15 +663,15 @@ - #endif /* HAVE_V8_REGCOMP || SLANG_REGEXP */ - } - --int most_search(unsigned char *from, int repeat, int *col) -+long long most_search(const unsigned char *from, int repeat, long long *col) - { - /* return the line match was found as well as line number, - * search from i on; assume that line_array match the i so we need - * no initial lookup */ - -- int test, save_line, the_col, row, s_len; -+ long long test, save_line, the_col, row, s_len; - char string[300]; -- unsigned char *pos; -+ const unsigned char *pos; - unsigned int save_ofs; - unsigned int found_ofs; - -@@ -687,7 +680,10 @@ - save_line = Most_C_Line; - found_ofs = Most_Eob - Most_Beg; - *col = 0; -- s_len = strlen (Most_Search_Str); -+ if (Most_UTF8_Mode) -+ s_len = SLutf8_strlen (Most_Search_Str, 0); -+ else -+ s_len = strlen ((char *) Most_Search_Str); - pos = from; - - if (*Most_Search_Str) ---- most-4.10.2.orig/src/search.h -+++ most-4.10.2/src/search.h -@@ -6,7 +6,7 @@ - extern int Most_Case_Sensitive; - extern int Most_Search_Dir; - #define MOST_SEARCH_BUF_LEN 256 --extern char Most_Search_Str[MOST_SEARCH_BUF_LEN]; --extern int most_search(unsigned char *, int, int *); -+extern unsigned char Most_Search_Str[MOST_SEARCH_BUF_LEN]; -+extern long long most_search(const unsigned char *, int, long long *); - #endif - ---- most-4.10.2.orig/src/window.c -+++ most-4.10.2/src/window.c -@@ -48,10 +48,11 @@ - - Most_Window_Type *Most_Win; - Most_Window_Type *Most_Top_Win; --int Most_Top_Line; /* row number of top window */ --int Most_Curs_Row; --int Most_Curs_Col; --int Most_Column = 1; -+long long Most_Top_Line; /* row number of top window */ -+long long Most_Curs_Row; -+long long Most_Curs_Col; -+/* The leftmost visible column. */ -+long long Most_Column = 1; - int Most_Restore_Width_To = 0; - char Most_Mini_Buf[256]; - unsigned long Most_Curs_Offset; -@@ -156,7 +157,7 @@ - SLsmg_write_nchars (buf + point, len - point); - if (col < SLtt_Screen_Cols) - break; -- buf++; point--; len--; /* FIXME for UTF-8 */ -+ buf++; point--; len--; - } - SLsmg_erase_eol (); - SLsmg_gotorc (SLtt_Screen_Rows - 1, col); -@@ -227,6 +228,8 @@ - { - SLang_RLine_Info_Type *rli; - unsigned int flags = SL_RLINE_BLINK_MATCH; -+ if (Most_UTF8_Mode) -+ flags |= SL_RLINE_UTF8_MODE; - - if (NULL == (rli = SLrline_open (SLtt_Screen_Cols, flags))) - return NULL; -@@ -258,7 +261,7 @@ - - /* do not use default. The up arrow can always get it back. */ - if ((what != NULL) -- && (*what) && (what != Most_Search_Str)) -+ && (*what) && (what != (char *) Most_Search_Str)) - { - if (-1 == SLrline_set_line (Most_RLI, what)) - return -1; -@@ -593,7 +596,8 @@ - unsigned int num_chars; - unsigned int field_width, info_len; - unsigned char *eob; -- int r, x; -+ int r; -+ long long x; - - eob = Most_Eob; - #if MOST_HAS_MMAP -@@ -601,20 +605,20 @@ - eob = Most_Beg + Most_Buf->mmap_size; - #endif - -- if (eob == Most_Beg) x = 100; -+ if (eob == Most_Beg) x = 100LL; - else - { -- x = Most_C_Offset * 100; -+ x = Most_C_Offset * 100LL; - x = x / (eob - Most_Beg); - } - - if (Most_C_Line + (Most_Win->bot - Most_Win->top + 1) >= Most_Num_Lines) -- x = 100; -+ x = 100LL; - - /* for files with end of file above the bottom row (due to window manipulations) */ -- if (x > 100) x = 100; -+ if (x > 100LL) x = 100LL; - -- sprintf (info, "(%d,%d) %d%%", Most_C_Line, Most_Column, x); -+ sprintf (info, "(%lld,%lld) %d%%", Most_C_Line, Most_Column, (int)x); - - r = Most_Win->bot + 1; - most_goto_rc (r,1); ---- most-4.10.2.orig/src/window.h -+++ most-4.10.2/src/window.h -@@ -5,11 +5,11 @@ - typedef struct _Most_Window_Type - { - unsigned long top_offset; /* offset of top line of window from bob */ -- int beg_line; /* line number of top */ -- int curs_line; /* line number of curs pos */ -- int curs_col; /* column number of curs pos */ -+ long long beg_line; /* line number of top */ -+ long long curs_line; /* line number of curs pos */ -+ long long curs_col; /* column number of curs pos */ - unsigned long curs_offset; /* pos of cursor from bob*/ -- int col; /* column offset */ -+ long long col; /* column offset */ - int n_lines; /* number of lines of buffer (mode dependent) */ - int top; /* screen location of top */ - int bot; /* screen location of bot */ -@@ -29,9 +29,9 @@ - extern Most_Window_Type *Most_Win; - extern Most_Window_Type *Most_Top_Win; - extern unsigned long Most_Curs_Offset; --extern int Most_Column; --extern int Most_Curs_Row; --extern int Most_Curs_Col; -+extern long long Most_Column; -+extern long long Most_Curs_Row; -+extern long long Most_Curs_Col; - #define MOST_MINI_BUF_LEN 256 - extern char Most_Mini_Buf[MOST_MINI_BUF_LEN]; - extern int Most_Selective_Display; |