mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-28 22:57:37 +00:00
1655 lines
42 KiB
Diff
1655 lines
42 KiB
Diff
--- 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;
|