add breakage fixes, type fixes, and as-needed color regex compilation
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2854 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
Этот коммит содержится в:
родитель
0c4ca3509f
Коммит
db95802a18
26
ChangeLog
26
ChangeLog
@ -21,8 +21,9 @@ CVS code -
|
||||
open_nextfile_void() switch_to_next_buffer(), rename
|
||||
write_marked() write_marked_file(), remove load_file(), rename
|
||||
cancel_fork() cancel_command(), rename open_pipe()
|
||||
execute_command(), remove execute_command(), and remove
|
||||
resize_variables(). (DLR)
|
||||
execute_command(), remove execute_command(), remove
|
||||
resize_variables(), rename get_buffer() get_key_buffer(), and
|
||||
rename get_buffer_len() get_key_buffer_len(). (DLR)
|
||||
- Replace all mvwaddstr(hblank) calls with a new function that
|
||||
does the same thing without the need for hblank. New function
|
||||
blank_line(); changes to do_browser(), blank_titlebar(),
|
||||
@ -31,6 +32,19 @@ CVS code -
|
||||
- Make the static pid variable used by execute_command() and
|
||||
cancel_command() a pid_t instead of an int, for consistency.
|
||||
(DLR)
|
||||
- Consistently make the flags global and any variables used to
|
||||
hold it longs. (DLR)
|
||||
- Consistently make the fg and bg colortype struct entries and
|
||||
any variables used to hold them shorts. Changes to
|
||||
do_colorinit() (renamed color_init()), color_to_int() (renamed
|
||||
color_to_short()), and parse_colors(). (DLR)
|
||||
- Change color handling to save only the regex strings
|
||||
constantly, and to actually compile them on an as-needed
|
||||
basis. Also, don't bother doing complete refreshes of the
|
||||
screen when color support is enabled if there's no regex
|
||||
associated with the current file. Changes to update_color()
|
||||
(renamed color_update()), thanks_for_all_the_fish(),
|
||||
do_input(), and do_output(), (DLR)
|
||||
- files.c:
|
||||
open_file()
|
||||
- Assert that filename isn't NULL, and don't do anything special
|
||||
@ -64,13 +78,13 @@ CVS code -
|
||||
allow_pending_sigwinch()
|
||||
- Simplify by using the "?" operator instead of an if clause.
|
||||
(DLR)
|
||||
main()
|
||||
- When constant cursor position display is on, only display the
|
||||
cursor position if there are no keys waiting in the buffer.
|
||||
(DLR)
|
||||
- nano.h:
|
||||
- Since we only use vsnprintf() now, remove the #ifdef block for
|
||||
HAVE_SNPRINTF. (DLR)
|
||||
- rcfile.c:
|
||||
nregcomp()
|
||||
- Return TRUE when the compilation succeeds and FALSE otherwise,
|
||||
instead of the other way around. (DLR)
|
||||
- search.c:
|
||||
search_init()
|
||||
- Don't blank out last_replace anymore when we get a new string,
|
||||
|
57
src/color.c
57
src/color.c
@ -29,6 +29,7 @@
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <assert.h>
|
||||
#include "proto.h"
|
||||
|
||||
#ifdef ENABLE_COLOR
|
||||
@ -63,35 +64,38 @@ void set_colorpairs(void)
|
||||
}
|
||||
}
|
||||
|
||||
void do_colorinit(void)
|
||||
void color_init(void)
|
||||
{
|
||||
assert(openfile != NULL);
|
||||
|
||||
if (has_colors()) {
|
||||
const colortype *tmpcolor = NULL;
|
||||
const colortype *tmpcolor;
|
||||
#ifdef HAVE_USE_DEFAULT_COLORS
|
||||
bool defok;
|
||||
#endif
|
||||
|
||||
start_color();
|
||||
|
||||
/* Add in colors, if available. */
|
||||
#ifdef HAVE_USE_DEFAULT_COLORS
|
||||
/* Add in colors, if available. */
|
||||
defok = (use_default_colors() != ERR);
|
||||
#endif
|
||||
|
||||
for (tmpcolor = colorstrings; tmpcolor != NULL;
|
||||
for (tmpcolor = openfile->colorstrings; tmpcolor != NULL;
|
||||
tmpcolor = tmpcolor->next) {
|
||||
short background = tmpcolor->bg;
|
||||
|
||||
if (background == -1)
|
||||
if (background == -1) {
|
||||
#ifdef HAVE_USE_DEFAULT_COLORS
|
||||
if (!defok)
|
||||
#endif
|
||||
background = COLOR_BLACK;
|
||||
}
|
||||
|
||||
init_pair(tmpcolor->pairnum, tmpcolor->fg, background);
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "init_pair(): fg = %d, bg = %d\n",
|
||||
fprintf(stderr, "init_pair(): fg = %hd, bg = %hd\n",
|
||||
tmpcolor->fg, tmpcolor->bg);
|
||||
#endif
|
||||
}
|
||||
@ -99,11 +103,14 @@ void do_colorinit(void)
|
||||
}
|
||||
|
||||
/* Update the color information based on the current filename. */
|
||||
void update_color(void)
|
||||
void color_update(void)
|
||||
{
|
||||
const syntaxtype *tmpsyntax;
|
||||
colortype *tmpcolor;
|
||||
|
||||
colorstrings = NULL;
|
||||
assert(openfile != NULL);
|
||||
|
||||
openfile->colorstrings = NULL;
|
||||
for (tmpsyntax = syntaxes; tmpsyntax != NULL;
|
||||
tmpsyntax = tmpsyntax->next) {
|
||||
const exttype *e;
|
||||
@ -111,22 +118,44 @@ void update_color(void)
|
||||
for (e = tmpsyntax->extensions; e != NULL; e = e->next) {
|
||||
/* Set colorstrings if we matched the extension regex. */
|
||||
if (regexec(&e->val, openfile->filename, 0, NULL, 0) == 0)
|
||||
colorstrings = tmpsyntax->color;
|
||||
openfile->colorstrings = tmpsyntax->color;
|
||||
|
||||
if (colorstrings != NULL)
|
||||
if (openfile->colorstrings != NULL)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we haven't found a match, use the override string. */
|
||||
if (colorstrings == NULL && syntaxstr != NULL) {
|
||||
if (openfile->colorstrings == NULL && syntaxstr != NULL) {
|
||||
for (tmpsyntax = syntaxes; tmpsyntax != NULL;
|
||||
tmpsyntax = tmpsyntax->next) {
|
||||
if (mbstrcasecmp(tmpsyntax->desc, syntaxstr) == 0)
|
||||
colorstrings = tmpsyntax->color;
|
||||
if (mbstrcasecmp(tmpsyntax->desc, syntaxstr) == 0) {
|
||||
openfile->colorstrings = tmpsyntax->color;
|
||||
|
||||
if (openfile->colorstrings != NULL)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
do_colorinit();
|
||||
|
||||
/* tmpcolor->startstr and tmpcolor->endstr have already been checked
|
||||
* for validity elsewhere. Compile their associated regexes if we
|
||||
* haven't already. */
|
||||
for (tmpcolor = openfile->colorstrings; tmpcolor != NULL;
|
||||
tmpcolor = tmpcolor->next) {
|
||||
if (tmpcolor->startstr != NULL) {
|
||||
tmpcolor->start = (regex_t *)nmalloc(sizeof(regex_t));
|
||||
nregcomp(tmpcolor->start, tmpcolor->startstr,
|
||||
tmpcolor->icase ? REG_ICASE : 0);
|
||||
}
|
||||
if (tmpcolor->endstr != NULL) {
|
||||
tmpcolor->end = (regex_t *)nmalloc(sizeof(regex_t));
|
||||
nregcomp(tmpcolor->end, tmpcolor->endstr,
|
||||
tmpcolor->icase ? REG_ICASE : 0);
|
||||
}
|
||||
}
|
||||
|
||||
color_init();
|
||||
}
|
||||
|
||||
#endif /* ENABLE_COLOR */
|
||||
|
28
src/files.c
28
src/files.c
@ -147,6 +147,9 @@ void initialize_buffer(void)
|
||||
|
||||
memset(&openfile->originalfilestat, 0, sizeof(struct stat));
|
||||
#endif
|
||||
#ifndef ENABLE_COLOR
|
||||
openfile->colorstrings = NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef DISABLE_SPELLER
|
||||
@ -163,8 +166,8 @@ void reinitialize_buffer(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
/* filename is a file to open. We make a new buffer, if necessary, and
|
||||
* then open and read the file. */
|
||||
/* If it's not "", filename is a file to open. We make a new buffer, if
|
||||
* necessary, and then open and read the file, if applicable. */
|
||||
void open_buffer(const char *filename)
|
||||
{
|
||||
bool new_buffer = (openfile == NULL
|
||||
@ -215,16 +218,19 @@ void open_buffer(const char *filename)
|
||||
* to the first line of the buffer. */
|
||||
if (rc != -1 && new_buffer)
|
||||
openfile->current = openfile->fileage;
|
||||
|
||||
#ifdef ENABLE_COLOR
|
||||
/* If we're loading into a new buffer, update the buffer's
|
||||
* associated colors, if applicable. */
|
||||
if (new_buffer)
|
||||
color_update();
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Update the screen to account for the current buffer. */
|
||||
void display_buffer(void)
|
||||
{
|
||||
titlebar(NULL);
|
||||
#ifdef ENABLE_COLOR
|
||||
/* Update the buffer's associated colors, if applicable. */
|
||||
update_color();
|
||||
#endif
|
||||
edit_refresh();
|
||||
}
|
||||
|
||||
@ -1559,8 +1565,14 @@ int write_file(const char *name, FILE *f_open, bool tmp, int append,
|
||||
openfile->filename = mallocstrcpy(openfile->filename,
|
||||
realname);
|
||||
#ifdef ENABLE_COLOR
|
||||
update_color();
|
||||
if (!ISSET(NO_COLOR_SYNTAX))
|
||||
/* We might have changed the filename, so update the
|
||||
* buffer's associated colors, if applicable. */
|
||||
color_update();
|
||||
|
||||
/* If color syntaxes are available and turned on, we need to
|
||||
* call edit_refresh(). */
|
||||
if (openfile->colorstrings != NULL &&
|
||||
!ISSET(NO_COLOR_SYNTAX))
|
||||
edit_refresh();
|
||||
#endif
|
||||
}
|
||||
|
17
src/global.c
17
src/global.c
@ -39,7 +39,7 @@ ssize_t wrap_at = -CHARS_FROM_EOL; /* Right justified fill value,
|
||||
char *last_search = NULL; /* Last string we searched for */
|
||||
char *last_replace = NULL; /* Last replacement string */
|
||||
|
||||
unsigned long flags = 0; /* Our flag containing many options */
|
||||
long flags = 0; /* Our flag containing many options */
|
||||
WINDOW *topwin; /* Top buffer */
|
||||
WINDOW *edit; /* The file portion of the editor */
|
||||
WINDOW *bottomwin; /* Bottom buffer */
|
||||
@ -124,7 +124,6 @@ shortcut *gotodir_list = NULL;
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_COLOR
|
||||
const colortype *colorstrings = NULL;
|
||||
syntaxtype *syntaxes = NULL;
|
||||
char *syntaxstr = NULL;
|
||||
#endif
|
||||
@ -1226,10 +1225,18 @@ void thanks_for_all_the_fish(void)
|
||||
colortype *bob = syntaxes->color;
|
||||
|
||||
syntaxes->color = bob->next;
|
||||
regfree(&bob->start);
|
||||
if (bob->end != NULL)
|
||||
if (bob->startstr != NULL)
|
||||
free(bob->startstr);
|
||||
if (bob->start != NULL) {
|
||||
regfree(bob->start);
|
||||
free(bob->start);
|
||||
}
|
||||
if (bob->endstr != NULL)
|
||||
free(bob->endstr);
|
||||
if (bob->end != NULL) {
|
||||
regfree(bob->end);
|
||||
free(bob->end);
|
||||
free(bob->end);
|
||||
}
|
||||
free(bob);
|
||||
}
|
||||
syntaxes = syntaxes->next;
|
||||
|
21
src/nano.c
21
src/nano.c
@ -1359,9 +1359,9 @@ void do_delete(void)
|
||||
set_modified();
|
||||
|
||||
#ifdef ENABLE_COLOR
|
||||
/* If color syntaxes are turned on, we need to call
|
||||
/* If color syntaxes are available and turned on, we need to call
|
||||
* edit_refresh(). */
|
||||
if (!ISSET(NO_COLOR_SYNTAX))
|
||||
if (openfile->colorstrings != NULL && !ISSET(NO_COLOR_SYNTAX))
|
||||
do_refresh = TRUE;
|
||||
#endif
|
||||
|
||||
@ -3932,7 +3932,7 @@ int do_input(bool *meta_key, bool *func_key, bool *s_or_t, bool
|
||||
* display all the characters in the input buffer if it isn't
|
||||
* empty. Note that it should be empty if we're in view
|
||||
* mode. */
|
||||
if (*s_or_t == TRUE || get_buffer_len() == 0) {
|
||||
if (*s_or_t == TRUE || get_key_buffer_len() == 0) {
|
||||
if (kbinput != NULL) {
|
||||
/* Display all the characters in the input buffer at
|
||||
* once, filtering out control characters. */
|
||||
@ -4159,9 +4159,9 @@ void do_output(char *output, size_t output_len, bool allow_cntrls)
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_COLOR
|
||||
/* If color syntaxes are turned on, we need to call
|
||||
* edit_refresh(). */
|
||||
if (!ISSET(NO_COLOR_SYNTAX))
|
||||
/* If color syntaxes are available and turned on, we need to
|
||||
* call edit_refresh(). */
|
||||
if (openfile->colorstrings != NULL && !ISSET(NO_COLOR_SYNTAX))
|
||||
do_refresh = TRUE;
|
||||
#endif
|
||||
}
|
||||
@ -4475,7 +4475,7 @@ int main(int argc, char **argv)
|
||||
char *alt_speller_cpy = alt_speller;
|
||||
#endif
|
||||
ssize_t tabsize_cpy = tabsize;
|
||||
unsigned long flags_cpy = flags;
|
||||
long flags_cpy = flags;
|
||||
|
||||
#ifndef DISABLE_OPERATINGDIR
|
||||
operating_dir = NULL;
|
||||
@ -4727,10 +4727,9 @@ int main(int argc, char **argv)
|
||||
/* Make sure the cursor is in the edit window. */
|
||||
reset_cursor();
|
||||
|
||||
/* If constant cursor position display is on, and there are no
|
||||
* keys waiting in the buffer, display the current cursor
|
||||
* position on the statusbar. */
|
||||
if (ISSET(CONST_UPDATE) && get_buffer_len() == 0)
|
||||
/* If constant cursor position display is on, display the
|
||||
* current cursor position on the statusbar. */
|
||||
if (ISSET(CONST_UPDATE))
|
||||
do_cursorpos(TRUE);
|
||||
|
||||
currshortcut = main_list;
|
||||
|
65
src/nano.h
65
src/nano.h
@ -160,6 +160,40 @@ typedef struct filestruct {
|
||||
ssize_t lineno; /* The line number. */
|
||||
} filestruct;
|
||||
|
||||
#ifdef ENABLE_COLOR
|
||||
typedef struct colortype {
|
||||
short fg; /* Foreground color. */
|
||||
short bg; /* Background color. */
|
||||
bool bright; /* Is this color A_BOLD? */
|
||||
bool icase; /* Is this regex string case
|
||||
* insensitive? */
|
||||
int pairnum; /* Color pair number used for this
|
||||
* foreground/background. */
|
||||
char *startstr; /* Start (or all) of the regex
|
||||
* string. */
|
||||
regex_t *start; /* Compiled start (or all) of the regex
|
||||
* string. */
|
||||
char *endstr; /* End (if any) of the regex string. */
|
||||
regex_t *end; /* Compiled end (if any) of the regex
|
||||
* string. */
|
||||
struct colortype *next;
|
||||
} colortype;
|
||||
|
||||
typedef struct exttype {
|
||||
regex_t val; /* The extensions that match this
|
||||
* syntax. */
|
||||
struct exttype *next;
|
||||
} exttype;
|
||||
|
||||
typedef struct syntaxtype {
|
||||
char *desc; /* Name of this syntax type. */
|
||||
exttype *extensions; /* List of extensions that this syntax
|
||||
* applies to. */
|
||||
colortype *color; /* Color struct for this syntax. */
|
||||
struct syntaxtype *next;
|
||||
} syntaxtype;
|
||||
#endif /* ENABLE_COLOR */
|
||||
|
||||
typedef struct openfilestruct {
|
||||
char *filename; /* Current file's name. */
|
||||
filestruct *fileage; /* Current file's first line. */
|
||||
@ -185,6 +219,9 @@ typedef struct openfilestruct {
|
||||
file_format fmt; /* Current file's format. */
|
||||
struct stat originalfilestat;
|
||||
/* Current file's stat. */
|
||||
#endif
|
||||
#ifdef ENABLE_COLOR
|
||||
colortype *colorstrings; /* Current file's associated colors. */
|
||||
#endif
|
||||
struct openfilestruct *next;
|
||||
/* Next node. */
|
||||
@ -236,34 +273,6 @@ typedef struct rcoption {
|
||||
} rcoption;
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_COLOR
|
||||
typedef struct colortype {
|
||||
int fg; /* Foreground color. */
|
||||
int bg; /* Background color. */
|
||||
bool bright; /* Is this color A_BOLD? */
|
||||
int pairnum; /* Color pair number used for this
|
||||
* foreground/background. */
|
||||
regex_t start; /* Start (or all) of the regex
|
||||
* string. */
|
||||
regex_t *end; /* End (if any) of the regex string. */
|
||||
struct colortype *next;
|
||||
} colortype;
|
||||
|
||||
typedef struct exttype {
|
||||
regex_t val; /* The extensions that match this
|
||||
* syntax. */
|
||||
struct exttype *next;
|
||||
} exttype;
|
||||
|
||||
typedef struct syntaxtype {
|
||||
char *desc; /* Name of this syntax type. */
|
||||
exttype *extensions; /* List of extensions that this syntax
|
||||
* applies to. */
|
||||
colortype *color; /* Color struct for this syntax. */
|
||||
struct syntaxtype *next;
|
||||
} syntaxtype;
|
||||
#endif
|
||||
|
||||
/* Bitwise flags so that we can save space (or, more correctly, not
|
||||
* waste it). */
|
||||
#define CASE_SENSITIVE (1<<0)
|
||||
|
11
src/proto.h
11
src/proto.h
@ -37,7 +37,7 @@
|
||||
extern ssize_t wrap_at;
|
||||
#endif
|
||||
extern int editwinrows;
|
||||
extern unsigned long flags;
|
||||
extern long flags;
|
||||
extern ssize_t tabsize;
|
||||
extern int currslen;
|
||||
|
||||
@ -88,7 +88,6 @@ extern partition *filepart;
|
||||
extern openfilestruct *openfile;
|
||||
|
||||
#ifdef ENABLE_COLOR
|
||||
extern const colortype *colorstrings;
|
||||
extern syntaxtype *syntaxes;
|
||||
extern char *syntaxstr;
|
||||
#endif
|
||||
@ -211,7 +210,7 @@ bool is_valid_mbstring(const char *s);
|
||||
/* Public functions in color.c. */
|
||||
#ifdef ENABLE_COLOR
|
||||
void set_colorpairs(void);
|
||||
void do_colorinit(void);
|
||||
void color_init(void);
|
||||
void update_color(void);
|
||||
#endif /* ENABLE_COLOR */
|
||||
|
||||
@ -466,7 +465,7 @@ void rcfile_error(const char *msg, ...);
|
||||
char *parse_next_word(char *ptr);
|
||||
char *parse_argument(char *ptr);
|
||||
#ifdef ENABLE_COLOR
|
||||
int color_to_int(const char *colorname, bool *bright);
|
||||
int color_to_short(const char *colorname, bool *bright);
|
||||
char *parse_next_regex(char *ptr);
|
||||
bool nregcomp(regex_t *preg, const char *regex, int eflags);
|
||||
void parse_syntax(char *ptr);
|
||||
@ -573,8 +572,8 @@ void get_totals(const filestruct *begin, const filestruct *end, size_t
|
||||
#ifndef NANO_SMALL
|
||||
void reset_kbinput(void);
|
||||
#endif
|
||||
void get_buffer(WINDOW *win);
|
||||
size_t get_buffer_len(void);
|
||||
void get_key_buffer(WINDOW *win);
|
||||
size_t get_key_buffer_len(void);
|
||||
void unget_input(int *input, size_t input_len);
|
||||
void unget_kbinput(int kbinput, bool meta_key, bool func_key);
|
||||
int *get_input(WINDOW *win, size_t input_len);
|
||||
|
54
src/rcfile.c
54
src/rcfile.c
@ -182,9 +182,9 @@ char *parse_argument(char *ptr)
|
||||
}
|
||||
|
||||
#ifdef ENABLE_COLOR
|
||||
int color_to_int(const char *colorname, bool *bright)
|
||||
int color_to_short(const char *colorname, bool *bright)
|
||||
{
|
||||
int mcolor = -1;
|
||||
short mcolor = -1;
|
||||
|
||||
assert(colorname != NULL && bright != NULL);
|
||||
|
||||
@ -246,8 +246,8 @@ char *parse_next_regex(char *ptr)
|
||||
return ptr;
|
||||
}
|
||||
|
||||
/* Compile the regular expression regex to preg. Return FALSE on
|
||||
* success, or TRUE if the expression is invalid. */
|
||||
/* Compile the regular expression regex to preg. Return TRUE on
|
||||
* success, or FALSE if the expression is invalid. */
|
||||
bool nregcomp(regex_t *preg, const char *regex, int eflags)
|
||||
{
|
||||
int rc = regcomp(preg, regex, REG_EXTENDED | eflags);
|
||||
@ -261,7 +261,7 @@ bool nregcomp(regex_t *preg, const char *regex, int eflags)
|
||||
free(str);
|
||||
}
|
||||
|
||||
return (rc != 0);
|
||||
return (rc == 0);
|
||||
}
|
||||
|
||||
void parse_syntax(char *ptr)
|
||||
@ -329,7 +329,7 @@ void parse_syntax(char *ptr)
|
||||
break;
|
||||
|
||||
newext = (exttype *)nmalloc(sizeof(exttype));
|
||||
if (nregcomp(&newext->val, fileregptr, REG_NOSUB))
|
||||
if (!nregcomp(&newext->val, fileregptr, REG_NOSUB))
|
||||
free(newext);
|
||||
else {
|
||||
if (endext == NULL)
|
||||
@ -346,7 +346,7 @@ void parse_syntax(char *ptr)
|
||||
* treat the color stuff as case insensitive. */
|
||||
void parse_colors(char *ptr, bool icase)
|
||||
{
|
||||
int fg, bg;
|
||||
short fg, bg;
|
||||
bool bright = FALSE, no_fgcolor = FALSE;
|
||||
char *fgstr;
|
||||
|
||||
@ -377,12 +377,12 @@ void parse_colors(char *ptr, bool icase)
|
||||
bgcolorname);
|
||||
return;
|
||||
}
|
||||
bg = color_to_int(bgcolorname, &bright);
|
||||
bg = color_to_short(bgcolorname, &bright);
|
||||
} else
|
||||
bg = -1;
|
||||
|
||||
if (!no_fgcolor) {
|
||||
fg = color_to_int(fgstr, &bright);
|
||||
fg = color_to_short(fgstr, &bright);
|
||||
|
||||
/* Don't try to parse screwed-up foreground colors. */
|
||||
if (fg == -1)
|
||||
@ -431,28 +431,40 @@ void parse_colors(char *ptr, bool icase)
|
||||
if (ptr == NULL)
|
||||
break;
|
||||
|
||||
if (nregcomp(&newcolor->start, fgstr, icase ? REG_ICASE : 0)) {
|
||||
free(newcolor);
|
||||
cancelled = TRUE;
|
||||
} else {
|
||||
newcolor->start = (regex_t *)nmalloc(sizeof(regex_t));
|
||||
if (nregcomp(newcolor->start, fgstr, icase ? REG_ICASE : 0)) {
|
||||
/* Free this regex, now that we know it's valid, and save
|
||||
* the original string, so that we can recompile this regex
|
||||
* later as needed. */
|
||||
newcolor->startstr = mallocstrcpy(NULL, fgstr);
|
||||
regfree(newcolor->start);
|
||||
free(newcolor->start);
|
||||
newcolor->start = NULL;
|
||||
|
||||
newcolor->fg = fg;
|
||||
newcolor->bg = bg;
|
||||
newcolor->bright = bright;
|
||||
newcolor->next = NULL;
|
||||
newcolor->icase = icase;
|
||||
newcolor->endstr = NULL;
|
||||
newcolor->end = NULL;
|
||||
newcolor->next = NULL;
|
||||
|
||||
if (endcolor == NULL) {
|
||||
endsyntax->color = newcolor;
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "Starting a new colorstring for fg %d, bg %d\n", fg, bg);
|
||||
fprintf(stderr, "Starting a new colorstring for fg %hd, bg %hd\n", fg, bg);
|
||||
#endif
|
||||
} else {
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "Adding new entry for fg %d, bg %d\n", fg, bg);
|
||||
fprintf(stderr, "Adding new entry for fg %hd, bg %hd\n", fg, bg);
|
||||
#endif
|
||||
endcolor->next = newcolor;
|
||||
}
|
||||
endcolor = newcolor;
|
||||
} else {
|
||||
free(newcolor->start);
|
||||
free(newcolor);
|
||||
cancelled = TRUE;
|
||||
}
|
||||
|
||||
if (expectend) {
|
||||
@ -482,9 +494,15 @@ void parse_colors(char *ptr, bool icase)
|
||||
|
||||
newcolor->end = (regex_t *)nmalloc(sizeof(regex_t));
|
||||
if (nregcomp(newcolor->end, fgstr, icase ? REG_ICASE : 0)) {
|
||||
free(newcolor->end);
|
||||
newcolor->end = NULL;
|
||||
/* Free this regex, now that we know it's valid, and
|
||||
* save the original string, so that we can recompile
|
||||
* this regex later as needed. */
|
||||
newcolor->endstr = mallocstrcpy(NULL, fgstr);
|
||||
regfree(newcolor->end);
|
||||
}
|
||||
|
||||
free(newcolor->end);
|
||||
newcolor->end = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -842,7 +842,10 @@ ssize_t do_replace_loop(const char *needle, const filestruct
|
||||
|
||||
if (!replaceall) {
|
||||
#ifdef ENABLE_COLOR
|
||||
if (!ISSET(NO_COLOR_SYNTAX))
|
||||
/* If color syntaxes are available and turned on, we
|
||||
* need to call edit_refresh(). */
|
||||
if (openfile->colorstrings != NULL &&
|
||||
!ISSET(NO_COLOR_SYNTAX))
|
||||
edit_refresh();
|
||||
else
|
||||
#endif
|
||||
|
44
src/winio.c
44
src/winio.c
@ -127,7 +127,7 @@ void reset_kbinput(void)
|
||||
/* Read in a sequence of keystrokes from win and save them in the
|
||||
* default keystroke buffer. This should only be called when the
|
||||
* default keystroke buffer is empty. */
|
||||
void get_buffer(WINDOW *win)
|
||||
void get_key_buffer(WINDOW *win)
|
||||
{
|
||||
int input;
|
||||
|
||||
@ -190,12 +190,12 @@ void get_buffer(WINDOW *win)
|
||||
nodelay(win, FALSE);
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "get_buffer(): key_buffer_len = %lu\n", (unsigned long)key_buffer_len);
|
||||
fprintf(stderr, "get_key_buffer(): key_buffer_len = %lu\n", (unsigned long)key_buffer_len);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Return the length of the default keystroke buffer. */
|
||||
size_t get_buffer_len(void)
|
||||
size_t get_key_buffer_len(void)
|
||||
{
|
||||
return key_buffer_len;
|
||||
}
|
||||
@ -270,7 +270,7 @@ int *get_input(WINDOW *win, size_t input_len)
|
||||
|
||||
if (key_buffer_len == 0) {
|
||||
if (win != NULL)
|
||||
get_buffer(win);
|
||||
get_key_buffer(win);
|
||||
|
||||
if (key_buffer_len == 0)
|
||||
return NULL;
|
||||
@ -504,7 +504,7 @@ int parse_kbinput(WINDOW *win, bool *meta_key, bool *func_key
|
||||
* waiting, we have a true escape sequence, so
|
||||
* interpret it. */
|
||||
escapes = 0;
|
||||
if (get_buffer_len() == 0) {
|
||||
if (get_key_buffer_len() == 0) {
|
||||
*meta_key = TRUE;
|
||||
retval = tolower(*kbinput);
|
||||
} else {
|
||||
@ -517,7 +517,7 @@ int parse_kbinput(WINDOW *win, bool *meta_key, bool *func_key
|
||||
* sequence into its corresponding key value,
|
||||
* and save that as the result. */
|
||||
unget_input(kbinput, 1);
|
||||
seq_len = get_buffer_len();
|
||||
seq_len = get_key_buffer_len();
|
||||
seq = get_input(NULL, seq_len);
|
||||
retval = get_escape_seq_kbinput(seq, seq_len,
|
||||
&ignore_seq);
|
||||
@ -1460,7 +1460,7 @@ int *parse_verbatim_kbinput(WINDOW *win, size_t *kbinput_len)
|
||||
|
||||
/* Get the complete sequence, and save the characters in it as the
|
||||
* result. */
|
||||
*kbinput_len = get_buffer_len();
|
||||
*kbinput_len = get_key_buffer_len();
|
||||
retval = get_input(NULL, *kbinput_len);
|
||||
|
||||
return retval;
|
||||
@ -1700,7 +1700,7 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
|
||||
/* If we got a shortcut, or if there aren't any other characters
|
||||
* waiting after the one we read in, we need to display all the
|
||||
* characters in the input buffer if it isn't empty. */
|
||||
if (*s_or_t == TRUE || get_buffer_len() == 0) {
|
||||
if (*s_or_t == TRUE || get_key_buffer_len() == 0) {
|
||||
if (kbinput != NULL) {
|
||||
|
||||
/* Display all the characters in the input buffer at
|
||||
@ -3113,7 +3113,7 @@ void edit_add(const filestruct *fileptr, const char *converted, int
|
||||
* string. */
|
||||
#endif
|
||||
|
||||
assert(fileptr != NULL && converted != NULL);
|
||||
assert(openfile != NULL && fileptr != NULL && converted != NULL);
|
||||
assert(strlenpt(converted) <= COLS);
|
||||
|
||||
/* Just paint the string in any case (we'll add color or reverse on
|
||||
@ -3121,8 +3121,10 @@ void edit_add(const filestruct *fileptr, const char *converted, int
|
||||
mvwaddstr(edit, yval, 0, converted);
|
||||
|
||||
#ifdef ENABLE_COLOR
|
||||
if (colorstrings != NULL && !ISSET(NO_COLOR_SYNTAX)) {
|
||||
const colortype *tmpcolor = colorstrings;
|
||||
/* If color syntaxes are available and turned on, we need to display
|
||||
* them. */
|
||||
if (openfile->colorstrings != NULL && !ISSET(NO_COLOR_SYNTAX)) {
|
||||
const colortype *tmpcolor = openfile->colorstrings;
|
||||
|
||||
for (; tmpcolor != NULL; tmpcolor = tmpcolor->next) {
|
||||
int x_start;
|
||||
@ -3157,7 +3159,7 @@ void edit_add(const filestruct *fileptr, const char *converted, int
|
||||
* not to match the beginning-of-line character
|
||||
* unless k is 0. If regexec() returns REG_NOMATCH,
|
||||
* there are no more matches in the line. */
|
||||
if (regexec(&tmpcolor->start, &fileptr->data[k], 1,
|
||||
if (regexec(tmpcolor->start, &fileptr->data[k], 1,
|
||||
&startmatch, (k == 0) ? 0 :
|
||||
REG_NOTBOL) == REG_NOMATCH)
|
||||
break;
|
||||
@ -3208,9 +3210,9 @@ void edit_add(const filestruct *fileptr, const char *converted, int
|
||||
/* Where it starts in that line. */
|
||||
const filestruct *end_line;
|
||||
|
||||
while (start_line != NULL &&
|
||||
regexec(&tmpcolor->start, start_line->data, 1,
|
||||
&startmatch, 0) == REG_NOMATCH) {
|
||||
while (start_line != NULL && regexec(tmpcolor->start,
|
||||
start_line->data, 1, &startmatch,
|
||||
0) == REG_NOMATCH) {
|
||||
/* If there is an end on this line, there is no need
|
||||
* to look for starts on earlier lines. */
|
||||
if (regexec(tmpcolor->end, start_line->data, 0,
|
||||
@ -3235,7 +3237,7 @@ void edit_add(const filestruct *fileptr, const char *converted, int
|
||||
/* No end found after this start. */
|
||||
break;
|
||||
start_col++;
|
||||
if (regexec(&tmpcolor->start, start_line->data +
|
||||
if (regexec(tmpcolor->start, start_line->data +
|
||||
start_col, 1, &startmatch,
|
||||
REG_NOTBOL) == REG_NOMATCH)
|
||||
/* No later start on this line. */
|
||||
@ -3280,11 +3282,10 @@ void edit_add(const filestruct *fileptr, const char *converted, int
|
||||
start_col = 0;
|
||||
|
||||
while (start_col < endpos) {
|
||||
if (regexec(&tmpcolor->start,
|
||||
fileptr->data + start_col, 1, &startmatch,
|
||||
(start_col == 0) ? 0 :
|
||||
REG_NOTBOL) == REG_NOMATCH ||
|
||||
start_col + startmatch.rm_so >= endpos)
|
||||
if (regexec(tmpcolor->start, fileptr->data +
|
||||
start_col, 1, &startmatch, (start_col == 0) ?
|
||||
0 : REG_NOTBOL) == REG_NOMATCH || start_col +
|
||||
startmatch.rm_so >= endpos)
|
||||
/* No more starts on this line. */
|
||||
break;
|
||||
/* Translate the match to be relative to the
|
||||
@ -3353,6 +3354,7 @@ void edit_add(const filestruct *fileptr, const char *converted, int
|
||||
#endif /* ENABLE_COLOR */
|
||||
|
||||
#ifndef NANO_SMALL
|
||||
/* If the mark is on, we need to display it. */
|
||||
if (openfile->mark_set && (fileptr->lineno <=
|
||||
openfile->mark_begin->lineno || fileptr->lineno <=
|
||||
openfile->current->lineno) && (fileptr->lineno >=
|
||||
|
Загрузка…
Ссылка в новой задаче
Block a user