vi: fix the bug where vi never grows the edit buffer.
vi: do G trick on it function old new delta place_cursor 264 276 +12 next_tabstop 22 34 +12 mycmp 44 52 +8 status_line 34 40 +6 yank_delete 89 92 +3 what_reg 34 37 +3 suspend_sig 63 66 +3 find_range 493 496 +3 redraw 104 106 +2 cont_sig 63 65 +2 Indicate_Error 59 61 +2 status_line_bold 71 72 +1 file_insert 327 328 +1 vi_setops 1 - -1 ... cmdcnt 4 - -4 chars_to_parse 4 - -4 ccol 4 - -4 dot_scroll 88 79 -9 stupid_insert 28 18 -10 winch_sig 102 91 -11 char_insert 353 336 -17 readit 354 336 -18 get_one_char 128 110 -18 init_text_buffer 171 152 -19 text_hole_delete 132 112 -20 edit_file 940 918 -22 get_input_line 198 168 -30 show_status_line 449 408 -41 colon 3112 3067 -45 vi_main 312 250 -62 refresh 1077 974 -103 do_cmd 4818 4483 -335 ------------------------------------------------------------------------------ (add/remove: 0/38 grow/shrink: 13/20 up/down: 58/-889) Total: -831 bytes text data bss dec hex filename 809566 612 7044 817222 c7846 busybox_old 808794 611 6924 816329 c74c9 busybox_unstripped text data bss dec hex filename 18888 1 122 19011 4a43 busybox.t8/editors/vi.o 18116 0 0 18116 46c4 busybox.t9/editors/vi.o
This commit is contained in:
parent
b67004b2ae
commit
b175946ba4
273
editors/vi.c
273
editors/vi.c
@ -112,11 +112,19 @@ enum {
|
|||||||
S_END_ALNUM = 5, // used in skip_thing() for moving "dot"
|
S_END_ALNUM = 5, // used in skip_thing() for moving "dot"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* vi.c expects chars to be unsigned. */
|
/* vi.c expects chars to be unsigned. */
|
||||||
/* busybox build system provides that, but it's better */
|
/* busybox build system provides that, but it's better */
|
||||||
/* to audit and fix the source */
|
/* to audit and fix the source */
|
||||||
|
|
||||||
static smallint vi_setops;
|
struct globals {
|
||||||
|
/* many references - keep near the top of globals */
|
||||||
|
char *text, *end; // pointers to the user data in memory
|
||||||
|
char *dot; // where all the action takes place
|
||||||
|
int text_size; // size of the allocated buffer
|
||||||
|
|
||||||
|
/* the rest */
|
||||||
|
smallint vi_setops;
|
||||||
#define VI_AUTOINDENT 1
|
#define VI_AUTOINDENT 1
|
||||||
#define VI_SHOWMATCH 2
|
#define VI_SHOWMATCH 2
|
||||||
#define VI_IGNORECASE 4
|
#define VI_IGNORECASE 4
|
||||||
@ -127,83 +135,76 @@ static smallint vi_setops;
|
|||||||
/* indicate error with beep or flash */
|
/* indicate error with beep or flash */
|
||||||
#define err_method (vi_setops & VI_ERR_METHOD)
|
#define err_method (vi_setops & VI_ERR_METHOD)
|
||||||
|
|
||||||
|
|
||||||
static smallint editing; // >0 while we are editing a file
|
|
||||||
// [code audit says "can be 0 or 1 only"]
|
|
||||||
static smallint cmd_mode; // 0=command 1=insert 2=replace
|
|
||||||
static smallint file_modified; // buffer contents changed
|
|
||||||
static smallint last_file_modified = -1;
|
|
||||||
static int fn_start; // index of first cmd line file name
|
|
||||||
static int save_argc; // how many file names on cmd line
|
|
||||||
static int cmdcnt; // repetition count
|
|
||||||
static unsigned rows, columns; // the terminal screen is this size
|
|
||||||
static int crow, ccol; // cursor is on Crow x Ccol
|
|
||||||
static int offset; // chars scrolled off the screen to the left
|
|
||||||
static char *status_buffer; // mesages to the user
|
|
||||||
#define STATUS_BUFFER_LEN 200
|
|
||||||
static int have_status_msg; // is default edit status needed?
|
|
||||||
// [don't make smallint!]
|
|
||||||
static int last_status_cksum; // hash of current status line
|
|
||||||
static char *current_filename; // current file name
|
|
||||||
//static char *text, *end; // pointers to the user data in memory
|
|
||||||
static char *screen; // pointer to the virtual screen buffer
|
|
||||||
static int screensize; // and its size
|
|
||||||
static char *screenbegin; // index into text[], of top line on the screen
|
|
||||||
//static char *dot; // where all the action takes place
|
|
||||||
static int tabstop;
|
|
||||||
static char erase_char; // the users erase character
|
|
||||||
static char last_input_char; // last char read from user
|
|
||||||
static char last_forward_char; // last char searched for with 'f'
|
|
||||||
|
|
||||||
#if ENABLE_FEATURE_VI_READONLY
|
#if ENABLE_FEATURE_VI_READONLY
|
||||||
//static smallint vi_readonly, readonly;
|
smallint readonly_mode;
|
||||||
static smallint readonly_mode = 0;
|
|
||||||
#define SET_READONLY_FILE(flags) ((flags) |= 0x01)
|
#define SET_READONLY_FILE(flags) ((flags) |= 0x01)
|
||||||
#define SET_READONLY_MODE(flags) ((flags) |= 0x02)
|
#define SET_READONLY_MODE(flags) ((flags) |= 0x02)
|
||||||
#define UNSET_READONLY_FILE(flags) ((flags) &= 0xfe)
|
#define UNSET_READONLY_FILE(flags) ((flags) &= 0xfe)
|
||||||
#else
|
#else
|
||||||
#define readonly_mode 0
|
#define SET_READONLY_FILE(flags) ((void)0)
|
||||||
#define SET_READONLY_FILE(flags)
|
#define SET_READONLY_MODE(flags) ((void)0)
|
||||||
#define SET_READONLY_MODE(flags)
|
#define UNSET_READONLY_FILE(flags) ((void)0)
|
||||||
#define UNSET_READONLY_FILE(flags)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
smallint editing; // >0 while we are editing a file
|
||||||
|
// [code audit says "can be 0 or 1 only"]
|
||||||
|
smallint cmd_mode; // 0=command 1=insert 2=replace
|
||||||
|
int file_modified; // buffer contents changed (counter, not flag!)
|
||||||
|
int last_file_modified; // = -1;
|
||||||
|
int fn_start; // index of first cmd line file name
|
||||||
|
int save_argc; // how many file names on cmd line
|
||||||
|
int cmdcnt; // repetition count
|
||||||
|
unsigned rows, columns; // the terminal screen is this size
|
||||||
|
int crow, ccol; // cursor is on Crow x Ccol
|
||||||
|
int offset; // chars scrolled off the screen to the left
|
||||||
|
int have_status_msg; // is default edit status needed?
|
||||||
|
// [don't make smallint!]
|
||||||
|
int last_status_cksum; // hash of current status line
|
||||||
|
char *current_filename;
|
||||||
|
char *screenbegin; // index into text[], of top line on the screen
|
||||||
|
char *screen; // pointer to the virtual screen buffer
|
||||||
|
int screensize; // and its size
|
||||||
|
int tabstop;
|
||||||
|
char erase_char; // the users erase character
|
||||||
|
char last_input_char; // last char read from user
|
||||||
|
char last_forward_char; // last char searched for with 'f'
|
||||||
|
|
||||||
#if ENABLE_FEATURE_VI_DOT_CMD
|
#if ENABLE_FEATURE_VI_DOT_CMD
|
||||||
static smallint adding2q; // are we currently adding user input to q
|
smallint adding2q; // are we currently adding user input to q
|
||||||
static char *last_modifying_cmd; // [MAX_INPUT_LEN] last modifying cmd for "."
|
int lmc_len; // length of last_modifying_cmd
|
||||||
static smallint lmc_len; // length of last_modifying_cmd
|
char *ioq, *ioq_start; // pointer to string for get_one_char to "read"
|
||||||
static char *ioq, *ioq_start; // pointer to string for get_one_char to "read"
|
|
||||||
#endif
|
#endif
|
||||||
#if ENABLE_FEATURE_VI_OPTIMIZE_CURSOR
|
#if ENABLE_FEATURE_VI_OPTIMIZE_CURSOR
|
||||||
static int last_row; // where the cursor was last moved to
|
int last_row; // where the cursor was last moved to
|
||||||
#endif
|
#endif
|
||||||
#if ENABLE_FEATURE_VI_USE_SIGNALS || ENABLE_FEATURE_VI_CRASHME
|
#if ENABLE_FEATURE_VI_USE_SIGNALS || ENABLE_FEATURE_VI_CRASHME
|
||||||
static int my_pid;
|
int my_pid;
|
||||||
#endif
|
#endif
|
||||||
#if ENABLE_FEATURE_VI_DOT_CMD || ENABLE_FEATURE_VI_YANKMARK
|
#if ENABLE_FEATURE_VI_DOT_CMD || ENABLE_FEATURE_VI_YANKMARK
|
||||||
static char *modifying_cmds; // cmds that modify text[]
|
char *modifying_cmds; // cmds that modify text[]
|
||||||
#endif
|
#endif
|
||||||
#if ENABLE_FEATURE_VI_SEARCH
|
#if ENABLE_FEATURE_VI_SEARCH
|
||||||
static char *last_search_pattern; // last pattern from a '/' or '?' search
|
char *last_search_pattern; // last pattern from a '/' or '?' search
|
||||||
#endif
|
#endif
|
||||||
|
int chars_to_parse;
|
||||||
|
/* former statics */
|
||||||
|
#if ENABLE_FEATURE_VI_YANKMARK
|
||||||
|
char *edit_file__cur_line;
|
||||||
|
#endif
|
||||||
|
int refresh__old_offset;
|
||||||
|
int format_edit_status__tot;
|
||||||
|
|
||||||
/* Moving biggest data to malloced space... */
|
/* a few references only */
|
||||||
struct globals {
|
|
||||||
/* many references - keep near the top of globals */
|
|
||||||
char *text, *end; // pointers to the user data in memory
|
|
||||||
char *dot; // where all the action takes place
|
|
||||||
int text_size; // size of the allocated buffer
|
|
||||||
#if ENABLE_FEATURE_VI_YANKMARK
|
#if ENABLE_FEATURE_VI_YANKMARK
|
||||||
int YDreg, Ureg; // default delete register and orig line for "U"
|
int YDreg, Ureg; // default delete register and orig line for "U"
|
||||||
char *reg[28]; // named register a-z, "D", and "U" 0-25,26,27
|
char *reg[28]; // named register a-z, "D", and "U" 0-25,26,27
|
||||||
char *mark[28]; // user marks points somewhere in text[]- a-z and previous context ''
|
char *mark[28]; // user marks points somewhere in text[]- a-z and previous context ''
|
||||||
char *context_start, *context_end;
|
char *context_start, *context_end;
|
||||||
#endif
|
#endif
|
||||||
/* a few references only */
|
|
||||||
#if ENABLE_FEATURE_VI_USE_SIGNALS
|
#if ENABLE_FEATURE_VI_USE_SIGNALS
|
||||||
sigjmp_buf restart; // catch_sig()
|
sigjmp_buf restart; // catch_sig()
|
||||||
#endif
|
#endif
|
||||||
struct termios term_orig, term_vi; // remember what the cooked mode was
|
struct termios term_orig, term_vi; // remember what the cooked mode was
|
||||||
#if ENABLE_FEATURE_VI_COLON
|
#if ENABLE_FEATURE_VI_COLON
|
||||||
char *initial_cmds[3]; // currently 2 entries, NULL terminated
|
char *initial_cmds[3]; // currently 2 entries, NULL terminated
|
||||||
#endif
|
#endif
|
||||||
@ -214,6 +215,12 @@ struct globals {
|
|||||||
#else
|
#else
|
||||||
char readbuffer[32];
|
char readbuffer[32];
|
||||||
#endif
|
#endif
|
||||||
|
#define STATUS_BUFFER_LEN 200
|
||||||
|
char status_buffer[STATUS_BUFFER_LEN]; // messages to the user
|
||||||
|
#if ENABLE_FEATURE_VI_DOT_CMD
|
||||||
|
char last_modifying_cmd[MAX_INPUT_LEN]; // last modifying cmd for "."
|
||||||
|
#endif
|
||||||
|
char get_input_line__buf[MAX_INPUT_LEN]; /* former static */
|
||||||
|
|
||||||
char scr_out_buf[MAX_SCR_COLS + MAX_TABSTOP * 2];
|
char scr_out_buf[MAX_SCR_COLS + MAX_TABSTOP * 2];
|
||||||
};
|
};
|
||||||
@ -223,6 +230,50 @@ struct globals {
|
|||||||
#define end (G.end )
|
#define end (G.end )
|
||||||
#define dot (G.dot )
|
#define dot (G.dot )
|
||||||
#define reg (G.reg )
|
#define reg (G.reg )
|
||||||
|
|
||||||
|
#define vi_setops (G.vi_setops )
|
||||||
|
#define editing (G.editing )
|
||||||
|
#define cmd_mode (G.cmd_mode )
|
||||||
|
#define file_modified (G.file_modified )
|
||||||
|
#define last_file_modified (G.last_file_modified )
|
||||||
|
#define fn_start (G.fn_start )
|
||||||
|
#define save_argc (G.save_argc )
|
||||||
|
#define cmdcnt (G.cmdcnt )
|
||||||
|
#define rows (G.rows )
|
||||||
|
#define columns (G.columns )
|
||||||
|
#define crow (G.crow )
|
||||||
|
#define ccol (G.ccol )
|
||||||
|
#define offset (G.offset )
|
||||||
|
#define status_buffer (G.status_buffer )
|
||||||
|
#define have_status_msg (G.have_status_msg )
|
||||||
|
#define last_status_cksum (G.last_status_cksum )
|
||||||
|
#define current_filename (G.current_filename )
|
||||||
|
#define screen (G.screen )
|
||||||
|
#define screensize (G.screensize )
|
||||||
|
#define screenbegin (G.screenbegin )
|
||||||
|
#define tabstop (G.tabstop )
|
||||||
|
#define erase_char (G.erase_char )
|
||||||
|
#define last_input_char (G.last_input_char )
|
||||||
|
#define last_forward_char (G.last_forward_char )
|
||||||
|
#if ENABLE_FEATURE_VI_READONLY
|
||||||
|
#define readonly_mode (G.readonly_mode )
|
||||||
|
#else
|
||||||
|
#define readonly_mode 0 readonly_mode )
|
||||||
|
#endif
|
||||||
|
#define adding2q (G.adding2q )
|
||||||
|
#define lmc_len (G.lmc_len )
|
||||||
|
#define ioq (G.ioq )
|
||||||
|
#define ioq_start (G.ioq_start )
|
||||||
|
#define last_row (G.last_row )
|
||||||
|
#define my_pid (G.my_pid )
|
||||||
|
#define modifying_cmds (G.modifying_cmds )
|
||||||
|
#define last_search_pattern (G.last_search_pattern)
|
||||||
|
#define chars_to_parse (G.chars_to_parse )
|
||||||
|
|
||||||
|
#define edit_file__cur_line (G.edit_file__cur_line)
|
||||||
|
#define refresh__old_offset (G.refresh__old_offset)
|
||||||
|
#define format_edit_status__tot (G.format_edit_status__tot)
|
||||||
|
|
||||||
#define YDreg (G.YDreg )
|
#define YDreg (G.YDreg )
|
||||||
#define Ureg (G.Ureg )
|
#define Ureg (G.Ureg )
|
||||||
#define mark (G.mark )
|
#define mark (G.mark )
|
||||||
@ -234,10 +285,15 @@ struct globals {
|
|||||||
#define initial_cmds (G.initial_cmds )
|
#define initial_cmds (G.initial_cmds )
|
||||||
#define readbuffer (G.readbuffer )
|
#define readbuffer (G.readbuffer )
|
||||||
#define scr_out_buf (G.scr_out_buf )
|
#define scr_out_buf (G.scr_out_buf )
|
||||||
|
#define last_modifying_cmd (G.last_modifying_cmd )
|
||||||
|
#define get_input_line__buf (G.get_input_line__buf)
|
||||||
|
|
||||||
#define INIT_G() do { \
|
#define INIT_G() do { \
|
||||||
SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
|
SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
|
||||||
|
last_file_modified = -1; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
static int init_text_buffer(char *); // init from file or create new
|
static int init_text_buffer(char *); // init from file or create new
|
||||||
static void edit_file(char *); // edit one file
|
static void edit_file(char *); // edit one file
|
||||||
static void do_cmd(char); // execute a command
|
static void do_cmd(char); // execute a command
|
||||||
@ -355,22 +411,15 @@ int vi_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
|||||||
int vi_main(int argc, char **argv)
|
int vi_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
RESERVE_CONFIG_BUFFER(STATUS_BUFFER, STATUS_BUFFER_LEN);
|
|
||||||
|
INIT_G();
|
||||||
|
|
||||||
#if ENABLE_FEATURE_VI_USE_SIGNALS || ENABLE_FEATURE_VI_CRASHME
|
#if ENABLE_FEATURE_VI_USE_SIGNALS || ENABLE_FEATURE_VI_CRASHME
|
||||||
my_pid = getpid();
|
my_pid = getpid();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
INIT_G();
|
|
||||||
|
|
||||||
#if ENABLE_FEATURE_VI_CRASHME
|
#if ENABLE_FEATURE_VI_CRASHME
|
||||||
srand((long) my_pid);
|
srand((long) my_pid);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
status_buffer = STATUS_BUFFER;
|
|
||||||
last_status_cksum = 0;
|
|
||||||
text = NULL;
|
|
||||||
|
|
||||||
#ifdef NO_SUCH_APPLET_YET
|
#ifdef NO_SUCH_APPLET_YET
|
||||||
/* If we aren't "vi", we are "view" */
|
/* If we aren't "vi", we are "view" */
|
||||||
if (ENABLE_FEATURE_VI_READONLY && applet_name[2]) {
|
if (ENABLE_FEATURE_VI_READONLY && applet_name[2]) {
|
||||||
@ -379,9 +428,6 @@ int vi_main(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
vi_setops = VI_AUTOINDENT | VI_SHOWMATCH | VI_IGNORECASE;
|
vi_setops = VI_AUTOINDENT | VI_SHOWMATCH | VI_IGNORECASE;
|
||||||
#if ENABLE_FEATURE_VI_YANKMARK
|
|
||||||
memset(reg, 0, sizeof(reg)); // init the yank regs
|
|
||||||
#endif
|
|
||||||
#if ENABLE_FEATURE_VI_DOT_CMD || ENABLE_FEATURE_VI_YANKMARK
|
#if ENABLE_FEATURE_VI_DOT_CMD || ENABLE_FEATURE_VI_YANKMARK
|
||||||
modifying_cmds = (char *) "aAcCdDiIJoOpPrRsxX<>~"; // cmds modifying text[]
|
modifying_cmds = (char *) "aAcCdDiIJoOpPrRsxX<>~"; // cmds modifying text[]
|
||||||
#endif
|
#endif
|
||||||
@ -417,7 +463,6 @@ int vi_main(int argc, char **argv)
|
|||||||
case 'H':
|
case 'H':
|
||||||
show_help();
|
show_help();
|
||||||
/* fall through */
|
/* fall through */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
bb_show_usage();
|
bb_show_usage();
|
||||||
return 1;
|
return 1;
|
||||||
@ -451,9 +496,7 @@ static int init_text_buffer(char *fn)
|
|||||||
|
|
||||||
/* allocate/reallocate text buffer */
|
/* allocate/reallocate text buffer */
|
||||||
free(text);
|
free(text);
|
||||||
text_size = size * 2;
|
text_size = size + 10240;
|
||||||
if (text_size < 10240)
|
|
||||||
text_size = 10240; // have a minimum size for new files
|
|
||||||
screenbegin = dot = end = text = xzalloc(text_size);
|
screenbegin = dot = end = text = xzalloc(text_size);
|
||||||
|
|
||||||
if (fn != current_filename) {
|
if (fn != current_filename) {
|
||||||
@ -479,15 +522,14 @@ static int init_text_buffer(char *fn)
|
|||||||
|
|
||||||
static void edit_file(char *fn)
|
static void edit_file(char *fn)
|
||||||
{
|
{
|
||||||
|
#if ENABLE_FEATURE_VI_YANKMARK
|
||||||
|
#define cur_line edit_file__cur_line
|
||||||
|
#endif
|
||||||
char c;
|
char c;
|
||||||
int size;
|
int size;
|
||||||
|
|
||||||
#if ENABLE_FEATURE_VI_USE_SIGNALS
|
#if ENABLE_FEATURE_VI_USE_SIGNALS
|
||||||
int sig;
|
int sig;
|
||||||
#endif
|
#endif
|
||||||
#if ENABLE_FEATURE_VI_YANKMARK
|
|
||||||
static char *cur_line;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
editing = 1; // 0 = exit, 1 = one file, 2 = multiple files
|
editing = 1; // 0 = exit, 1 = one file, 2 = multiple files
|
||||||
rawmode();
|
rawmode();
|
||||||
@ -606,6 +648,7 @@ static void edit_file(char *fn)
|
|||||||
place_cursor(rows, 0, FALSE); // go to bottom of screen
|
place_cursor(rows, 0, FALSE); // go to bottom of screen
|
||||||
clear_to_eol(); // Erase to end of line
|
clear_to_eol(); // Erase to end of line
|
||||||
cookmode();
|
cookmode();
|
||||||
|
#undef cur_line
|
||||||
}
|
}
|
||||||
|
|
||||||
//----- The Colon commands -------------------------------------
|
//----- The Colon commands -------------------------------------
|
||||||
@ -1611,7 +1654,7 @@ static char *char_insert(char * p, char c) // insert the char c at 'p'
|
|||||||
c = get_one_char();
|
c = get_one_char();
|
||||||
*p = c;
|
*p = c;
|
||||||
p++;
|
p++;
|
||||||
file_modified++; // has the file been modified
|
file_modified++;
|
||||||
} else if (c == 27) { // Is this an ESC?
|
} else if (c == 27) { // Is this an ESC?
|
||||||
cmd_mode = 0;
|
cmd_mode = 0;
|
||||||
cmdcnt = 0;
|
cmdcnt = 0;
|
||||||
@ -1654,12 +1697,9 @@ static char *char_insert(char * p, char c) // insert the char c at 'p'
|
|||||||
static char *stupid_insert(char * p, char c) // stupidly insert the char c at 'p'
|
static char *stupid_insert(char * p, char c) // stupidly insert the char c at 'p'
|
||||||
{
|
{
|
||||||
p = text_hole_make(p, 1);
|
p = text_hole_make(p, 1);
|
||||||
if (p != 0) {
|
*p = c;
|
||||||
*p = c;
|
//file_modified++; - done by text_hole_make()
|
||||||
file_modified++; // has the file been modified
|
return p + 1;
|
||||||
p++;
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int find_range(char ** start, char ** stop, char c)
|
static int find_range(char ** start, char ** stop, char c)
|
||||||
@ -1842,24 +1882,21 @@ static void showmatching(char *p)
|
|||||||
// open a hole in text[]
|
// open a hole in text[]
|
||||||
static char *text_hole_make(char * p, int size) // at "p", make a 'size' byte hole
|
static char *text_hole_make(char * p, int size) // at "p", make a 'size' byte hole
|
||||||
{
|
{
|
||||||
char *src, *dest;
|
|
||||||
int cnt;
|
|
||||||
|
|
||||||
if (size <= 0)
|
if (size <= 0)
|
||||||
goto thm0;
|
return p;
|
||||||
src = p;
|
end += size; // adjust the new END
|
||||||
dest = p + size;
|
if (end >= (text + text_size)) {
|
||||||
cnt = end - src; // the rest of buffer
|
char *new_text;
|
||||||
if ( ((end + size) >= (text + text_size)) // TODO: realloc here
|
text_size += end - (text + text_size) + 10240;
|
||||||
|| memmove(dest, src, cnt) != dest) {
|
new_text = xrealloc(text, text_size);
|
||||||
status_line_bold("can't create room for new characters");
|
screenbegin = new_text + (screenbegin - text);
|
||||||
p = NULL;
|
dot = new_text + (dot - text);
|
||||||
goto thm0;
|
end = new_text + (end - text);
|
||||||
|
p = new_text + (p - text);
|
||||||
|
text = new_text;
|
||||||
}
|
}
|
||||||
memset(p, ' ', size); // clear new hole
|
memset(p, ' ', size); // clear new hole
|
||||||
end += size; // adjust the new END
|
file_modified++;
|
||||||
file_modified++; // has the file been modified
|
|
||||||
thm0:
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1885,16 +1922,14 @@ static char *text_hole_delete(char * p, char * q) // delete "p" through "q", inc
|
|||||||
goto thd0;
|
goto thd0;
|
||||||
if (src >= end)
|
if (src >= end)
|
||||||
goto thd_atend; // just delete the end of the buffer
|
goto thd_atend; // just delete the end of the buffer
|
||||||
if (memmove(dest, src, cnt) != dest) {
|
memmove(dest, src, cnt);
|
||||||
status_line_bold("can't delete the character");
|
|
||||||
}
|
|
||||||
thd_atend:
|
thd_atend:
|
||||||
end = end - hole_size; // adjust the new END
|
end = end - hole_size; // adjust the new END
|
||||||
if (dest >= end)
|
if (dest >= end)
|
||||||
dest = end - 1; // make sure dest in below end-1
|
dest = end - 1; // make sure dest in below end-1
|
||||||
if (end <= text)
|
if (end <= text)
|
||||||
dest = end = text; // keep pointers valid
|
dest = end = text; // keep pointers valid
|
||||||
file_modified++; // has the file been modified
|
file_modified++;
|
||||||
thd0:
|
thd0:
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
@ -1973,8 +2008,6 @@ static void show_help(void)
|
|||||||
static void start_new_cmd_q(char c)
|
static void start_new_cmd_q(char c)
|
||||||
{
|
{
|
||||||
// get buffer for new cmd
|
// get buffer for new cmd
|
||||||
if (!last_modifying_cmd)
|
|
||||||
last_modifying_cmd = xzalloc(MAX_INPUT_LEN);
|
|
||||||
// if there is a current cmd count put it in the buffer first
|
// if there is a current cmd count put it in the buffer first
|
||||||
if (cmdcnt > 0)
|
if (cmdcnt > 0)
|
||||||
lmc_len = sprintf(last_modifying_cmd, "%d%c", cmdcnt, c);
|
lmc_len = sprintf(last_modifying_cmd, "%d%c", cmdcnt, c);
|
||||||
@ -2164,8 +2197,6 @@ static int mysleep(int hund) // sleep for 'h' 1/100 seconds
|
|||||||
return safe_poll(pfd, 1, hund*10) > 0;
|
return safe_poll(pfd, 1, hund*10) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int chars_to_parse;
|
|
||||||
|
|
||||||
//----- IO Routines --------------------------------------------
|
//----- IO Routines --------------------------------------------
|
||||||
static char readit(void) // read (maybe cursor) key from stdin
|
static char readit(void) // read (maybe cursor) key from stdin
|
||||||
{
|
{
|
||||||
@ -2300,13 +2331,11 @@ static char get_one_char(void)
|
|||||||
} else {
|
} else {
|
||||||
// adding STDIN chars to q
|
// adding STDIN chars to q
|
||||||
c = readit(); // get the users input
|
c = readit(); // get the users input
|
||||||
if (last_modifying_cmd != NULL) {
|
if (lmc_len >= MAX_INPUT_LEN - 1) {
|
||||||
if (lmc_len >= MAX_INPUT_LEN - 1) {
|
status_line_bold("last_modifying_cmd overrun");
|
||||||
status_line_bold("last_modifying_cmd overrun");
|
} else {
|
||||||
} else {
|
// add new char to q
|
||||||
// add new char to q
|
last_modifying_cmd[lmc_len++] = c;
|
||||||
last_modifying_cmd[lmc_len++] = c;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@ -2318,13 +2347,12 @@ static char get_one_char(void)
|
|||||||
// Get input line (uses "status line" area)
|
// Get input line (uses "status line" area)
|
||||||
static char *get_input_line(const char *prompt)
|
static char *get_input_line(const char *prompt)
|
||||||
{
|
{
|
||||||
static char *buf; // [MAX_INPUT_LEN]
|
// char [MAX_INPUT_LEN]
|
||||||
|
#define buf get_input_line__buf
|
||||||
|
|
||||||
char c;
|
char c;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!buf) buf = xmalloc(MAX_INPUT_LEN);
|
|
||||||
|
|
||||||
strcpy(buf, prompt);
|
strcpy(buf, prompt);
|
||||||
last_status_cksum = 0; // force status update
|
last_status_cksum = 0; // force status update
|
||||||
place_cursor(rows - 1, 0, FALSE); // go to Status line, bottom of screen
|
place_cursor(rows - 1, 0, FALSE); // go to Status line, bottom of screen
|
||||||
@ -2350,6 +2378,7 @@ static char *get_input_line(const char *prompt)
|
|||||||
}
|
}
|
||||||
refresh(FALSE);
|
refresh(FALSE);
|
||||||
return buf;
|
return buf;
|
||||||
|
#undef buf
|
||||||
}
|
}
|
||||||
|
|
||||||
static int file_size(const char *fn) // what is the byte size of "fn"
|
static int file_size(const char *fn) // what is the byte size of "fn"
|
||||||
@ -2451,7 +2480,7 @@ static int file_write(char * fn, char * first, char * last)
|
|||||||
ftruncate(fd, charcnt);
|
ftruncate(fd, charcnt);
|
||||||
if (charcnt == cnt) {
|
if (charcnt == cnt) {
|
||||||
// good write
|
// good write
|
||||||
//file_modified = FALSE; // the file has not been modified
|
//file_modified = FALSE;
|
||||||
} else {
|
} else {
|
||||||
charcnt = 0;
|
charcnt = 0;
|
||||||
}
|
}
|
||||||
@ -2701,8 +2730,10 @@ static void not_implemented(const char *s)
|
|||||||
// show file status on status line
|
// show file status on status line
|
||||||
static int format_edit_status(void)
|
static int format_edit_status(void)
|
||||||
{
|
{
|
||||||
static int tot;
|
|
||||||
static const char cmd_mode_indicator[] ALIGN1 = "-IR-";
|
static const char cmd_mode_indicator[] ALIGN1 = "-IR-";
|
||||||
|
|
||||||
|
#define tot format_edit_status__tot
|
||||||
|
|
||||||
int cur, percent, ret, trunc_at;
|
int cur, percent, ret, trunc_at;
|
||||||
|
|
||||||
// file_modified is now a counter rather than a flag. this
|
// file_modified is now a counter rather than a flag. this
|
||||||
@ -2753,13 +2784,14 @@ static int format_edit_status(void)
|
|||||||
return ret; /* it all fit */
|
return ret; /* it all fit */
|
||||||
|
|
||||||
return trunc_at; /* had to truncate */
|
return trunc_at; /* had to truncate */
|
||||||
|
#undef tot
|
||||||
}
|
}
|
||||||
|
|
||||||
//----- Force refresh of all Lines -----------------------------
|
//----- Force refresh of all Lines -----------------------------
|
||||||
static void redraw(int full_screen)
|
static void redraw(int full_screen)
|
||||||
{
|
{
|
||||||
place_cursor(0, 0, FALSE); // put cursor in correct place
|
place_cursor(0, 0, FALSE); // put cursor in correct place
|
||||||
clear_to_eos(); // tel terminal to erase display
|
clear_to_eos(); // tell terminal to erase display
|
||||||
screen_erase(); // erase the internal screen buffer
|
screen_erase(); // erase the internal screen buffer
|
||||||
last_status_cksum = 0; // force status update
|
last_status_cksum = 0; // force status update
|
||||||
refresh(full_screen); // this will redraw the entire display
|
refresh(full_screen); // this will redraw the entire display
|
||||||
@ -2831,7 +2863,7 @@ static char* format_line(char *src /*, int li*/)
|
|||||||
//
|
//
|
||||||
static void refresh(int full_screen)
|
static void refresh(int full_screen)
|
||||||
{
|
{
|
||||||
static int old_offset;
|
#define old_offset refresh__old_offset
|
||||||
|
|
||||||
int li, changed;
|
int li, changed;
|
||||||
char *tp, *sp; // pointer into text[] and screen[]
|
char *tp, *sp; // pointer into text[] and screen[]
|
||||||
@ -2919,6 +2951,7 @@ static void refresh(int full_screen)
|
|||||||
place_cursor(crow, ccol, TRUE);
|
place_cursor(crow, ccol, TRUE);
|
||||||
|
|
||||||
old_offset = offset;
|
old_offset = offset;
|
||||||
|
#undef old_offset
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
@ -3276,7 +3309,7 @@ static void do_cmd(char c)
|
|||||||
case '.': // .- repeat the last modifying command
|
case '.': // .- repeat the last modifying command
|
||||||
// Stuff the last_modifying_cmd back into stdin
|
// Stuff the last_modifying_cmd back into stdin
|
||||||
// and let it be re-executed.
|
// and let it be re-executed.
|
||||||
if (last_modifying_cmd != NULL && lmc_len > 0) {
|
if (lmc_len > 0) {
|
||||||
last_modifying_cmd[lmc_len] = 0;
|
last_modifying_cmd[lmc_len] = 0;
|
||||||
ioq = ioq_start = xstrdup(last_modifying_cmd);
|
ioq = ioq_start = xstrdup(last_modifying_cmd);
|
||||||
}
|
}
|
||||||
@ -3750,7 +3783,7 @@ static void do_cmd(char c)
|
|||||||
c1 = get_one_char(); // get the replacement char
|
c1 = get_one_char(); // get the replacement char
|
||||||
if (*dot != '\n') {
|
if (*dot != '\n') {
|
||||||
*dot = c1;
|
*dot = c1;
|
||||||
file_modified++; // has the file been modified
|
file_modified++;
|
||||||
}
|
}
|
||||||
end_cmd_q(); // stop adding to q
|
end_cmd_q(); // stop adding to q
|
||||||
break;
|
break;
|
||||||
@ -3795,10 +3828,10 @@ static void do_cmd(char c)
|
|||||||
} // repeat cnt
|
} // repeat cnt
|
||||||
if (islower(*dot)) {
|
if (islower(*dot)) {
|
||||||
*dot = toupper(*dot);
|
*dot = toupper(*dot);
|
||||||
file_modified++; // has the file been modified
|
file_modified++;
|
||||||
} else if (isupper(*dot)) {
|
} else if (isupper(*dot)) {
|
||||||
*dot = tolower(*dot);
|
*dot = tolower(*dot);
|
||||||
file_modified++; // has the file been modified
|
file_modified++;
|
||||||
}
|
}
|
||||||
dot_right();
|
dot_right();
|
||||||
end_cmd_q(); // stop adding to q
|
end_cmd_q(); // stop adding to q
|
||||||
|
Loading…
Reference in New Issue
Block a user