diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-07-16 19:50:13 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-07-16 19:50:13 +0200 |
commit | 502ae4ba63561c98ac69af26cd9883bfd18d225f (patch) | |
tree | eeb8f200bd2cf8526bd96debaf35835fe03b1890 | |
parent | 015102e91e978a0bb42a14461c132a85e8f7e1ea (diff) |
patch 7.4.2051v7.4.2051
Problem: No proper testing of trunc_string().
Solution: Add a unittest for message.c.
-rw-r--r-- | src/Makefile | 39 | ||||
-rw-r--r-- | src/main.c | 536 | ||||
-rw-r--r-- | src/message.c | 2 | ||||
-rw-r--r-- | src/message_test.c | 77 | ||||
-rw-r--r-- | src/proto/main.pro | 1 | ||||
-rw-r--r-- | src/structs.h | 64 | ||||
-rw-r--r-- | src/version.c | 2 |
7 files changed, 419 insertions, 302 deletions
diff --git a/src/Makefile b/src/Makefile index f6d60c3e8c..49b4745a02 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1558,9 +1558,11 @@ JSON_TEST_SRC = json_test.c JSON_TEST_TARGET = json_test$(EXEEXT) MEMFILE_TEST_SRC = memfile_test.c MEMFILE_TEST_TARGET = memfile_test$(EXEEXT) +MESSAGE_TEST_SRC = message_test.c +MESSAGE_TEST_TARGET = message_test$(EXEEXT) -UNITTEST_SRC = $(JSON_TEST_SRC) $(MEMFILE_TEST_SRC) -UNITTEST_TARGETS = $(JSON_TEST_TARGET) $(MEMFILE_TEST_TARGET) +UNITTEST_SRC = $(JSON_TEST_SRC) $(MEMFILE_TEST_SRC) $(MESSAGE_TEST_SRC) +UNITTEST_TARGETS = $(JSON_TEST_TARGET) $(MEMFILE_TEST_TARGET) $(MESSAGE_TEST_TARGET) # All sources, also the ones that are not configured ALL_SRC = $(BASIC_SRC) $(ALL_GUI_SRC) $(UNITTEST_SRC) $(EXTRA_SRC) @@ -1604,7 +1606,6 @@ OBJ_COMMON = \ objects/mark.o \ objects/memline.o \ objects/menu.o \ - objects/message.o \ objects/misc1.o \ objects/misc2.o \ objects/move.o \ @@ -1642,19 +1643,28 @@ OBJ_COMMON = \ $(CHANNEL_OBJ) \ $(WSDEBUG_OBJ) +# The files included by tests are not in OBJ_COMMON. OBJ = $(OBJ_COMMON) \ objects/json.o \ objects/main.o \ - objects/memfile.o + objects/memfile.o \ + objects/message.o JSON_TEST_OBJ = $(OBJ_COMMON) \ - objects/json_test.o \ - objects/memfile.o + objects/memfile.o \ + objects/message.o \ + objects/json_test.o MEMFILE_TEST_OBJ = $(OBJ_COMMON) \ objects/json.o \ + objects/message.o \ objects/memfile_test.o +MESSAGE_TEST_OBJ = $(OBJ_COMMON) \ + objects/json.o \ + objects/memfile.o \ + objects/message_test.o + PRO_AUTO = \ arabic.pro \ blowfish.pro \ @@ -1970,6 +1980,9 @@ run_json_test: $(JSON_TEST_TARGET) run_memfile_test: $(MEMFILE_TEST_TARGET) ./$(MEMFILE_TEST_TARGET) +run_message_test: $(MESSAGE_TEST_TARGET) + ./$(MESSAGE_TEST_TARGET) + # Run individual OLD style test, assuming that Vim was already compiled. test1 \ test_autocmd_option \ @@ -2123,6 +2136,13 @@ $(MEMFILE_TEST_TARGET): auto/config.mk objects $(MEMFILE_TEST_OBJ) MAKE="$(MAKE)" LINK_AS_NEEDED=$(LINK_AS_NEEDED) \ sh $(srcdir)/link.sh +$(MESSAGE_TEST_TARGET): auto/config.mk objects $(MESSAGE_TEST_OBJ) + $(CCC) version.c -o objects/version.o + @LINK="$(PURIFY) $(SHRPENV) $(CClink) $(ALL_LIB_DIRS) $(LDFLAGS) \ + -o $(MESSAGE_TEST_TARGET) $(MESSAGE_TEST_OBJ) $(ALL_LIBS)" \ + MAKE="$(MAKE)" LINK_AS_NEEDED=$(LINK_AS_NEEDED) \ + sh $(srcdir)/link.sh + # install targets install: $(GUI_INSTALL) @@ -2941,6 +2961,9 @@ objects/menu.o: menu.c objects/message.o: message.c $(CCC) -o $@ message.c +objects/message_test.o: message_test.c + $(CCC) -o $@ message_test.c + objects/misc1.o: misc1.c $(CCC) -o $@ misc1.c @@ -3426,6 +3449,10 @@ objects/memfile_test.o: memfile_test.c main.c vim.h auto/config.h feature.h \ os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h \ structs.h regexp.h gui.h gui_beval.h proto/gui_beval.pro alloc.h \ ex_cmds.h proto.h globals.h farsi.h arabic.h memfile.c +objects/message_test.o: message_test.c main.c vim.h auto/config.h feature.h \ + os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h \ + structs.h regexp.h gui.h gui_beval.h proto/gui_beval.pro alloc.h \ + ex_cmds.h proto.h globals.h farsi.h arabic.h message.c objects/hangulin.o: hangulin.c vim.h auto/config.h feature.h os_unix.h \ auto/osdef.h ascii.h keymap.h term.h macros.h option.h structs.h \ regexp.h gui.h gui_beval.h proto/gui_beval.pro alloc.h ex_cmds.h proto.h \ diff --git a/src/main.c b/src/main.c index 5c3e9f9c09..ff82a9f160 100644 --- a/src/main.c +++ b/src/main.c @@ -23,70 +23,6 @@ # include "iscygpty.h" #endif -/* Maximum number of commands from + or -c arguments. */ -#define MAX_ARG_CMDS 10 - -/* values for "window_layout" */ -#define WIN_HOR 1 /* "-o" horizontally split windows */ -#define WIN_VER 2 /* "-O" vertically split windows */ -#define WIN_TABS 3 /* "-p" windows on tab pages */ - -/* Struct for various parameters passed between main() and other functions. */ -typedef struct -{ - int argc; - char **argv; - - int evim_mode; /* started as "evim" */ - char_u *use_vimrc; /* vimrc from -u argument */ - - int n_commands; /* no. of commands from + or -c */ - char_u *commands[MAX_ARG_CMDS]; /* commands from + or -c arg. */ - char_u cmds_tofree[MAX_ARG_CMDS]; /* commands that need free() */ - int n_pre_commands; /* no. of commands from --cmd */ - char_u *pre_commands[MAX_ARG_CMDS]; /* commands from --cmd argument */ - - int edit_type; /* type of editing to do */ - char_u *tagname; /* tag from -t argument */ -#ifdef FEAT_QUICKFIX - char_u *use_ef; /* 'errorfile' from -q argument */ -#endif - - int want_full_screen; - int stdout_isatty; /* is stdout a terminal? */ - int not_a_term; /* no warning for missing term? */ - char_u *term; /* specified terminal name */ -#ifdef FEAT_CRYPT - int ask_for_key; /* -x argument */ -#endif - int no_swap_file; /* "-n" argument used */ -#ifdef FEAT_EVAL - int use_debug_break_level; -#endif -#ifdef FEAT_WINDOWS - int window_count; /* number of windows to use */ - int window_layout; /* 0, WIN_HOR, WIN_VER or WIN_TABS */ -#endif - -#ifdef FEAT_CLIENTSERVER - int serverArg; /* TRUE when argument for a server */ - char_u *serverName_arg; /* cmdline arg for server name */ - char_u *serverStr; /* remote server command */ - char_u *serverStrEnc; /* encoding of serverStr */ - char_u *servername; /* allocated name for our server */ -#endif -#if !defined(UNIX) -# define EXPAND_FILENAMES - int literal; /* don't expand file names */ -#endif -#ifdef MSWIN - int full_path; /* file name argument was full path */ -#endif -#ifdef FEAT_DIFF - int diff_mode; /* start with 'diff' set */ -#endif -} mparm_T; - /* Values for edit_type. */ #define EDIT_NONE 0 /* no edit type yet */ #define EDIT_FILE 1 /* file name argument[s] given, use argument list */ @@ -98,15 +34,15 @@ typedef struct static int file_owned(char *fname); #endif static void mainerr(int, char_u *); +# if defined(HAVE_LOCALE_H) || defined(X_LOCALE) +static void init_locale(void); +# endif +static void early_arg_scan(mparm_T *parmp); #ifndef NO_VIM_MAIN static void main_msg(char *s); static void usage(void); static int get_number_arg(char_u *p, int *idx, int def); -# if defined(HAVE_LOCALE_H) || defined(X_LOCALE) -static void init_locale(void); -# endif static void parse_command_name(mparm_T *parmp); -static void early_arg_scan(mparm_T *parmp); static void command_line_scan(mparm_T *parmp); static void check_tty(mparm_T *parmp); static void read_stdin(void); @@ -231,120 +167,7 @@ main #endif starttime = time(NULL); -#ifdef FEAT_MBYTE - (void)mb_init(); /* init mb_bytelen_tab[] to ones */ -#endif -#ifdef FEAT_EVAL - eval_init(); /* init global variables */ -#endif - -#ifdef __QNXNTO__ - qnx_init(); /* PhAttach() for clipboard, (and gui) */ -#endif - -#ifdef MAC_OS_CLASSIC - /* Prepare for possibly starting GUI sometime */ - /* Macintosh needs this before any memory is allocated. */ - gui_prepare(¶ms.argc, params.argv); - TIME_MSG("GUI prepared"); -#endif - - /* Init the table of Normal mode commands. */ - init_normal_cmds(); - -#if defined(HAVE_DATE_TIME) && defined(VMS) && defined(VAXC) - make_version(); /* Construct the long version string. */ -#endif - - /* - * Allocate space for the generic buffers (needed for set_init_1() and - * EMSG2()). - */ - if ((IObuff = alloc(IOSIZE)) == NULL - || (NameBuff = alloc(MAXPATHL)) == NULL) - mch_exit(0); - TIME_MSG("Allocated generic buffers"); - -#ifdef NBDEBUG - /* Wait a moment for debugging NetBeans. Must be after allocating - * NameBuff. */ - nbdebug_log_init("SPRO_GVIM_DEBUG", "SPRO_GVIM_DLEVEL"); - nbdebug_wait(WT_ENV | WT_WAIT | WT_STOP, "SPRO_GVIM_WAIT", 20); - TIME_MSG("NetBeans debug wait"); -#endif - -#if defined(HAVE_LOCALE_H) || defined(X_LOCALE) - /* - * Setup to use the current locale (for ctype() and many other things). - * NOTE: Translated messages with encodings other than latin1 will not - * work until set_init_1() has been called! - */ - init_locale(); - TIME_MSG("locale set"); -#endif - -#ifdef FEAT_GUI - gui.dofork = TRUE; /* default is to use fork() */ -#endif - - /* - * Do a first scan of the arguments in "argv[]": - * -display or --display - * --server... - * --socketid - * --windowid - */ - early_arg_scan(¶ms); - -#ifdef FEAT_SUN_WORKSHOP - findYourself(params.argv[0]); -#endif -#if defined(FEAT_GUI) && !defined(MAC_OS_CLASSIC) - /* Prepare for possibly starting GUI sometime */ - gui_prepare(¶ms.argc, params.argv); - TIME_MSG("GUI prepared"); -#endif - -#ifdef FEAT_CLIPBOARD - clip_init(FALSE); /* Initialise clipboard stuff */ - TIME_MSG("clipboard setup"); -#endif - - /* - * Check if we have an interactive window. - * On the Amiga: If there is no window, we open one with a newcli command - * (needed for :! to * work). mch_check_win() will also handle the -d or - * -dev argument. - */ - params.stdout_isatty = (mch_check_win(params.argc, params.argv) != FAIL); - TIME_MSG("window checked"); - - /* - * Allocate the first window and buffer. - * Can't do anything without it, exit when it fails. - */ - if (win_alloc_first() == FAIL) - mch_exit(0); - - init_yank(); /* init yank buffers */ - - alist_init(&global_alist); /* Init the argument list to empty. */ - global_alist.id = 0; - - /* - * Set the default values for the options. - * NOTE: Non-latin1 translated messages are working only after this, - * because this is where "has_mbyte" will be set, which is used by - * msg_outtrans_len_attr(). - * First find out the home directory, needed to expand "~" in options. - */ - init_homedir(); /* find real value of $HOME */ - set_init_1(); - TIME_MSG("inits 1"); - -#ifdef FEAT_EVAL - set_lang_var(); /* set v:lang and v:ctype */ -#endif + common_init(¶ms); #ifdef FEAT_CLIENTSERVER /* @@ -1056,6 +879,129 @@ vim_main2(int argc UNUSED, char **argv UNUSED) #endif /* PROTO */ /* + * Initialisation shared by main() and some tests. + */ + void +common_init(mparm_T *params) +{ + +#ifdef FEAT_MBYTE + (void)mb_init(); /* init mb_bytelen_tab[] to ones */ +#endif +#ifdef FEAT_EVAL + eval_init(); /* init global variables */ +#endif + +#ifdef __QNXNTO__ + qnx_init(); /* PhAttach() for clipboard, (and gui) */ +#endif + +#ifdef MAC_OS_CLASSIC + /* Prepare for possibly starting GUI sometime */ + /* Macintosh needs this before any memory is allocated. */ + gui_prepare(¶ms->argc, params->argv); + TIME_MSG("GUI prepared"); +#endif + + /* Init the table of Normal mode commands. */ + init_normal_cmds(); + +#if defined(HAVE_DATE_TIME) && defined(VMS) && defined(VAXC) + make_version(); /* Construct the long version string. */ +#endif + + /* + * Allocate space for the generic buffers (needed for set_init_1() and + * EMSG2()). + */ + if ((IObuff = alloc(IOSIZE)) == NULL + || (NameBuff = alloc(MAXPATHL)) == NULL) + mch_exit(0); + TIME_MSG("Allocated generic buffers"); + +#ifdef NBDEBUG + /* Wait a moment for debugging NetBeans. Must be after allocating + * NameBuff. */ + nbdebug_log_init("SPRO_GVIM_DEBUG", "SPRO_GVIM_DLEVEL"); + nbdebug_wait(WT_ENV | WT_WAIT | WT_STOP, "SPRO_GVIM_WAIT", 20); + TIME_MSG("NetBeans debug wait"); +#endif + +#if defined(HAVE_LOCALE_H) || defined(X_LOCALE) + /* + * Setup to use the current locale (for ctype() and many other things). + * NOTE: Translated messages with encodings other than latin1 will not + * work until set_init_1() has been called! + */ + init_locale(); + TIME_MSG("locale set"); +#endif + +#ifdef FEAT_GUI + gui.dofork = TRUE; /* default is to use fork() */ +#endif + + /* + * Do a first scan of the arguments in "argv[]": + * -display or --display + * --server... + * --socketid + * --windowid + */ + early_arg_scan(params); + +#ifdef FEAT_SUN_WORKSHOP + findYourself(params->argv[0]); +#endif +#if defined(FEAT_GUI) && !defined(MAC_OS_CLASSIC) + /* Prepare for possibly starting GUI sometime */ + gui_prepare(¶ms->argc, params->argv); + TIME_MSG("GUI prepared"); +#endif + +#ifdef FEAT_CLIPBOARD + clip_init(FALSE); /* Initialise clipboard stuff */ + TIME_MSG("clipboard setup"); +#endif + + /* + * Check if we have an interactive window. + * On the Amiga: If there is no window, we open one with a newcli command + * (needed for :! to * work). mch_check_win() will also handle the -d or + * -dev argument. + */ + params->stdout_isatty = (mch_check_win(params->argc, params->argv) != FAIL); + TIME_MSG("window checked"); + + /* + * Allocate the first window and buffer. + * Can't do anything without it, exit when it fails. + */ + if (win_alloc_first() == FAIL) + mch_exit(0); + + init_yank(); /* init yank buffers */ + + alist_init(&global_alist); /* Init the argument list to empty. */ + global_alist.id = 0; + + /* + * Set the default values for the options. + * NOTE: Non-latin1 translated messages are working only after this, + * because this is where "has_mbyte" will be set, which is used by + * msg_outtrans_len_attr(). + * First find out the home directory, needed to expand "~" in options. + */ + init_homedir(); /* find real value of $HOME */ + set_init_1(); + TIME_MSG("inits 1"); + +#ifdef FEAT_EVAL + set_lang_var(); /* set v:lang and v:ctype */ +#endif +} + +/* * Main loop: Execute Normal mode commands until exiting Vim. * Also used to handle commands in the command-line window, until the window * is closed. @@ -1547,25 +1493,6 @@ getout(int exitval) mch_exit(exitval); } -#ifndef NO_VIM_MAIN -/* - * Get a (optional) count for a Vim argument. - */ - static int -get_number_arg( - char_u *p, /* pointer to argument */ - int *idx, /* index in argument, is incremented */ - int def) /* default value */ -{ - if (vim_isdigit(p[*idx])) - { - def = atoi((char *)&(p[*idx])); - while (vim_isdigit(p[*idx])) - *idx = *idx + 1; - } - return def; -} - #if defined(HAVE_LOCALE_H) || defined(X_LOCALE) /* * Setup to use the current locale (for ctype() and many other things). @@ -1617,100 +1544,6 @@ init_locale(void) #endif /* - * Check for: [r][e][g][vi|vim|view][diff][ex[im]] - * If the executable name starts with "r" we disable shell commands. - * If the next character is "e" we run in Easy mode. - * If the next character is "g" we run the GUI version. - * If the next characters are "view" we start in readonly mode. - * If the next characters are "diff" or "vimdiff" we start in diff mode. - * If the next characters are "ex" we start in Ex mode. If it's followed - * by "im" use improved Ex mode. - */ - static void -parse_command_name(mparm_T *parmp) -{ - char_u *initstr; - - initstr = gettail((char_u *)parmp->argv[0]); - -#ifdef MACOS_X_UNIX - /* An issue has been seen when launching Vim in such a way that - * $PWD/$ARGV[0] or $ARGV[0] is not the absolute path to the - * executable or a symbolic link of it. Until this issue is resolved - * we prohibit the GUI from being used. - */ - if (STRCMP(initstr, parmp->argv[0]) == 0) - disallow_gui = TRUE; - - /* TODO: On MacOS X default to gui if argv[0] ends in: - * /Vim.app/Contents/MacOS/Vim */ -#endif - -#ifdef FEAT_EVAL - set_vim_var_string(VV_PROGNAME, initstr, -1); - set_vim_var_string(VV_PROGPATH, (char_u *)parmp->argv[0], -1); -#endif - - if (TOLOWER_ASC(initstr[0]) == 'r') - { - restricted = TRUE; - ++initstr; - } - - /* Use evim mode for "evim" and "egvim", not for "editor". */ - if (TOLOWER_ASC(initstr[0]) == 'e' - && (TOLOWER_ASC(initstr[1]) == 'v' - || TOLOWER_ASC(initstr[1]) == 'g')) - { -#ifdef FEAT_GUI - gui.starting = TRUE; -#endif - parmp->evim_mode = TRUE; - ++initstr; - } - - /* "gvim" starts the GUI. Also accept "Gvim" for MS-Windows. */ - if (TOLOWER_ASC(initstr[0]) == 'g') - { - main_start_gui(); -#ifdef FEAT_GUI - ++initstr; -#endif - } - - if (STRNICMP(initstr, "view", 4) == 0) - { - readonlymode = TRUE; - curbuf->b_p_ro = TRUE; - p_uc = 10000; /* don't update very often */ - initstr += 4; - } - else if (STRNICMP(initstr, "vim", 3) == 0) - initstr += 3; - - /* Catch "[r][g]vimdiff" and "[r][g]viewdiff". */ - if (STRICMP(initstr, "diff") == 0) - { -#ifdef FEAT_DIFF - parmp->diff_mode = TRUE; -#else - mch_errmsg(_("This Vim was not compiled with the diff feature.")); - mch_errmsg("\n"); - mch_exit(2); -#endif - } - - if (STRNICMP(initstr, "ex", 2) == 0) - { - if (STRNICMP(initstr + 2, "im", 2) == 0) - exmode_active = EXMODE_VIM; - else - exmode_active = EXMODE_NORMAL; - change_compatible(TRUE); /* set 'compatible' */ - } -} - -/* * Get the name of the display, before gui_prepare() removes it from * argv[]. Used for the xterm-clipboard display. * @@ -1804,6 +1637,119 @@ early_arg_scan(mparm_T *parmp UNUSED) #endif } +#ifndef NO_VIM_MAIN +/* + * Get a (optional) count for a Vim argument. + */ + static int +get_number_arg( + char_u *p, /* pointer to argument */ + int *idx, /* index in argument, is incremented */ + int def) /* default value */ +{ + if (vim_isdigit(p[*idx])) + { + def = atoi((char *)&(p[*idx])); + while (vim_isdigit(p[*idx])) + *idx = *idx + 1; + } + return def; +} + +/* + * Check for: [r][e][g][vi|vim|view][diff][ex[im]] + * If the executable name starts with "r" we disable shell commands. + * If the next character is "e" we run in Easy mode. + * If the next character is "g" we run the GUI version. + * If the next characters are "view" we start in readonly mode. + * If the next characters are "diff" or "vimdiff" we start in diff mode. + * If the next characters are "ex" we start in Ex mode. If it's followed + * by "im" use improved Ex mode. + */ + static void +parse_command_name(mparm_T *parmp) +{ + char_u *initstr; + + initstr = gettail((char_u *)parmp->argv[0]); + +#ifdef MACOS_X_UNIX + /* An issue has been seen when launching Vim in such a way that + * $PWD/$ARGV[0] or $ARGV[0] is not the absolute path to the + * executable or a symbolic link of it. Until this issue is resolved + * we prohibit the GUI from being used. + */ + if (STRCMP(initstr, parmp->argv[0]) == 0) + disallow_gui = TRUE; + + /* TODO: On MacOS X default to gui if argv[0] ends in: + * /Vim.app/Contents/MacOS/Vim */ +#endif + +#ifdef FEAT_EVAL + set_vim_var_string(VV_PROGNAME, initstr, -1); + set_vim_var_string(VV_PROGPATH, (char_u *)parmp->argv[0], -1); +#endif + + if (TOLOWER_ASC(initstr[0]) == 'r') + { + restricted = TRUE; + ++initstr; + } + + /* Use evim mode for "evim" and "egvim", not for "editor". */ + if (TOLOWER_ASC(initstr[0]) == 'e' + && (TOLOWER_ASC(initstr[1]) == 'v' + || TOLOWER_ASC(initstr[1]) == 'g')) + { +#ifdef FEAT_GUI + gui.starting = TRUE; +#endif + parmp->evim_mode = TRUE; + ++initstr; + } + + /* "gvim" starts the GUI. Also accept "Gvim" for MS-Windows. */ + if (TOLOWER_ASC(initstr[0]) == 'g') + { + main_start_gui(); +#ifdef FEAT_GUI + ++initstr; +#endif + } + + if (STRNICMP(initstr, "view", 4) == 0) + { + readonlymode = TRUE; + curbuf->b_p_ro = TRUE; + p_uc = 10000; /* don't update very often */ + initstr += 4; + } + else if (STRNICMP(initstr, "vim", 3) == 0) + initstr += 3; + + /* Catch "[r][g]vimdiff" and "[r][g]viewdiff". */ + if (STRICMP(initstr, "diff") == 0) + { +#ifdef FEAT_DIFF + parmp->diff_mode = TRUE; +#else + mch_errmsg(_("This Vim was not compiled with the diff feature.")); + mch_errmsg("\n"); + mch_exit(2); +#endif + } + + if (STRNICMP(initstr, "ex", 2) == 0) + { + if (STRNICMP(initstr + 2, "im", 2) == 0) + exmode_active = EXMODE_VIM; + else + exmode_active = EXMODE_NORMAL; + change_compatible(TRUE); /* set 'compatible' */ + } +} + /* * Scan the command line arguments. */ diff --git a/src/message.c b/src/message.c index 72cd79ea6e..fe72e43a67 100644 --- a/src/message.c +++ b/src/message.c @@ -260,7 +260,7 @@ trunc_string( return; } n = ptr2cells(s + e); - if (len + n >= half) + if (len + n > half) break; len += n; buf[e] = s[e]; diff --git a/src/message_test.c b/src/message_test.c new file mode 100644 index 0000000000..41b8875793 --- /dev/null +++ b/src/message_test.c @@ -0,0 +1,77 @@ +/* vi:set ts=8 sts=4 sw=4: + * + * VIM - Vi IMproved by Bram Moolenaar + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +/* + * message_test.c: Unittests for message.c + */ + +#undef NDEBUG +#include <assert.h> + +/* Must include main.c because it contains much more than just main() */ +#define NO_VIM_MAIN +#include "main.c" + +/* This file has to be included because some of the tested functions are + * static. */ +#include "message.c" + +/* + * Test trunc_string(). + */ + static void +test_trunc_string(void) +{ + char_u buf[40]; + + /* in place */ + STRCPY(buf, "text"); + trunc_string(buf, buf, 20, 40); + assert(STRCMP(buf, "text") == 0); + + STRCPY(buf, "a short text"); + trunc_string(buf, buf, 20, 40); + assert(STRCMP(buf, "a short text") == 0); + + STRCPY(buf, "a text tha just fits"); + trunc_string(buf, buf, 20, 40); + assert(STRCMP(buf, "a text tha just fits") == 0); + + STRCPY(buf, "a text that nott fits"); + trunc_string(buf, buf, 20, 40); + assert(STRCMP(buf, "a text t...nott fits") == 0); + + /* copy from string to buf */ + trunc_string((char_u *)"text", buf, 20, 40); + assert(STRCMP(buf, "text") == 0); + + trunc_string((char_u *)"a short text", buf, 20, 40); + assert(STRCMP(buf, "a short text") == 0); + + trunc_string((char_u *)"a text tha just fits", buf, 20, 40); + assert(STRCMP(buf, "a text tha just fits") == 0); + + trunc_string((char_u *)"a text that nott fits", buf, 20, 40); + assert(STRCMP(buf, "a text t...nott fits") == 0); +} + + int +main(int argc, char **argv) +{ + mparm_T params; + + vim_memset(¶ms, 0, sizeof(params)); + params.argc = argc; + params.argv = argv; + common_init(¶ms); + init_chartab(); + + test_trunc_string(); + return 0; +} diff --git a/src/proto/main.pro b/src/proto/main.pro index 6964b6c997..6901ecca5c 100644 --- a/src/proto/main.pro +++ b/src/proto/main.pro @@ -1,4 +1,5 @@ /* main.c */ +void common_init(mparm_T *params); void main_loop(int cmdwin, int noexmode); void getout_preserve_modified(int exitval); void getout(int exitval); diff --git a/src/structs.h b/src/structs.h index 97e4e97cb9..740f7d04d5 100644 --- a/src/structs.h +++ b/src/structs.h @@ -3053,3 +3053,67 @@ struct timer_S partial_T *tr_partial; #endif }; + +/* Maximum number of commands from + or -c arguments. */ +#define MAX_ARG_CMDS 10 + +/* values for "window_layout" */ +#define WIN_HOR 1 /* "-o" horizontally split windows */ +#define WIN_VER 2 /* "-O" vertically split windows */ +#define WIN_TABS 3 /* "-p" windows on tab pages */ + +/* Struct for various parameters passed between main() and other functions. */ +typedef struct +{ + int argc; + char **argv; + + int evim_mode; /* started as "evim" */ + char_u *use_vimrc; /* vimrc from -u argument */ + + int n_commands; /* no. of commands from + or -c */ + char_u *commands[MAX_ARG_CMDS]; /* commands from + or -c arg. */ + char_u cmds_tofree[MAX_ARG_CMDS]; /* commands that need free() */ + int n_pre_commands; /* no. of commands from --cmd */ + char_u *pre_commands[MAX_ARG_CMDS]; /* commands from --cmd argument */ + + int edit_type; /* type of editing to do */ + char_u *tagname; /* tag from -t argument */ +#ifdef FEAT_QUICKFIX + char_u *use_ef; /* 'errorfile' from -q argument */ +#endif + + int want_full_screen; + int stdout_isatty; /* is stdout a terminal? */ + int not_a_term; /* no warning for missing term? */ + char_u *term; /* specified terminal name */ +#ifdef FEAT_CRYPT + int ask_for_key; /* -x argument */ +#endif + int no_swap_file; /* "-n" argument used */ +#ifdef FEAT_EVAL + int use_debug_break_level; +#endif +#ifdef FEAT_WINDOWS + int window_count; /* number of windows to use */ + int window_layout; /* 0, WIN_HOR, WIN_VER or WIN_TABS */ +#endif + +#ifdef FEAT_CLIENTSERVER + int serverArg; /* TRUE when argument for a server */ + char_u *serverName_arg; /* cmdline arg for server name */ + char_u *serverStr; /* remote server command */ + char_u *serverStrEnc; /* encoding of serverStr */ + char_u *servername; /* allocated name for our server */ +#endif +#if !defined(UNIX) +# define EXPAND_FILENAMES + int literal; /* don't expand file names */ +#endif +#ifdef MSWIN + int full_path; /* file name argument was full path */ +#endif +#ifdef FEAT_DIFF + int diff_mode; /* start with 'diff' set */ +#endif +} mparm_T; diff --git a/src/version.c b/src/version.c index f4d90907f0..575b43a747 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2051, +/**/ 2050, /**/ 2049, |