PKGBUILDs/extra/most/most-debian.patch

1656 lines
42 KiB
Diff
Raw Normal View History

2009-10-10 02:23:22 +00:00
--- 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), &regdata) );
+ return ( SLang_regexp_match(string, length, &regdata) );
# 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;