PKGBUILDs/extra/most/most-debian.patch
2009-10-09 21:23:22 -05:00

1655 lines
42 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--- 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;