From 9f82d0be615540ffc1fe4551750e6cb0bc76f737 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 19 May 2010 01:54:37 +0200 Subject: vi: fix "set ic" command; code shrink while at it. closes bug 1765 function old new delta colon 2970 2848 -122 Signed-off-by: Denys Vlasenko --- editors/vi.c | 86 ++++++++++++++++++++++++++---------------------------------- 1 file changed, 37 insertions(+), 49 deletions(-) diff --git a/editors/vi.c b/editors/vi.c index d9124fd76..9b050e115 100644 --- a/editors/vi.c +++ b/editors/vi.c @@ -793,7 +793,7 @@ static void colon(char *buf) // if (!buf[0]) - goto vc1; + goto ret; if (*buf == ':') buf++; // move past the ':' @@ -881,7 +881,7 @@ static void colon(char *buf) // don't edit, if the current file has been modified if (file_modified && !useforce) { status_line_bold("No write since last change (:edit! overrides)"); - goto vc1; + goto ret; } if (args[0]) { // the user supplied a file name @@ -892,11 +892,11 @@ static void colon(char *buf) } else { // no user file name, no current name- punt status_line_bold("No current filename"); - goto vc1; + goto ret; } if (init_text_buffer(fn) < 0) - goto vc1; + goto ret; #if ENABLE_FEATURE_VI_YANKMARK if (Ureg >= 0 && Ureg < 28 && reg[Ureg] != 0) { @@ -921,7 +921,7 @@ static void colon(char *buf) } else if (strncmp(cmd, "file", i) == 0) { // what File is this if (b != -1 || e != -1) { status_line_bold("No address allowed on this command"); - goto vc1; + goto ret; } if (args[0]) { // user wants a new filename @@ -967,11 +967,8 @@ static void colon(char *buf) if (c_is_no_print) standout_end(); } -#if ENABLE_FEATURE_VI_SET - vc2: -#endif Hit_Return(); - } else if (strncmp(cmd, "quit", i) == 0 // Quit + } else if (strncmp(cmd, "quit", i) == 0 // quit || strncmp(cmd, "next", i) == 0 // edit next file ) { int n; @@ -981,30 +978,30 @@ static void colon(char *buf) optind = save_argc; } editing = 0; - goto vc1; + goto ret; } // don't exit if the file been modified if (file_modified) { status_line_bold("No write since last change (:%s! overrides)", (*cmd == 'q' ? "quit" : "next")); - goto vc1; + goto ret; } // are there other file to edit n = save_argc - optind - 1; if (*cmd == 'q' && n > 0) { status_line_bold("%d more file(s) to edit", n); - goto vc1; + goto ret; } if (*cmd == 'n' && n <= 0) { status_line_bold("No more files to edit"); - goto vc1; + goto ret; } editing = 0; } else if (strncmp(cmd, "read", i) == 0) { // read file into text[] fn = args; if (!fn[0]) { status_line_bold("No filename given"); - goto vc1; + goto ret; } if (b < 0) { // no addr given- use defaults q = begin_line(dot); // assume "dot" @@ -1018,7 +1015,7 @@ static void colon(char *buf) q = text + ofs; } if (ch < 0) - goto vc1; // nothing was inserted + goto ret; // nothing was inserted // how many lines in text[]? li = count_lines(q, q + ch - 1); status_line("\"%s\"" @@ -1049,25 +1046,21 @@ static void colon(char *buf) // only blank is regarded as args delmiter. What about tab '\t' ? if (!args[0] || strcasecmp(args, "all") == 0) { // print out values of all options - go_bottom_and_clear_to_eol(); - printf("----------------------------------------\r\n"); #if ENABLE_FEATURE_VI_SETOPTS - if (!autoindent) - printf("no"); - printf("autoindent "); - if (!err_method) - printf("no"); - printf("flash "); - if (!ignorecase) - printf("no"); - printf("ignorecase "); - if (!showmatch) - printf("no"); - printf("showmatch "); - printf("tabstop=%d ", tabstop); -#endif - printf("\r\n"); - goto vc2; + status_line_bold( + "%sautoindent " + "%sflash " + "%signorecase " + "%sshowmatch " + "tabstop=%u", + autoindent ? "" : "no", + err_method ? "" : "no", + ignorecase ? "" : "no", + showmatch ? "" : "no", + tabstop + ); +#endif + goto ret; } #if ENABLE_FEATURE_VI_SETOPTS argp = args; @@ -1075,19 +1068,17 @@ static void colon(char *buf) if (strncmp(argp, "no", 2) == 0) i = 2; // ":set noautoindent" setops(argp, "autoindent ", i, "ai", VI_AUTOINDENT); - setops(argp, "flash ", i, "fl", VI_ERR_METHOD); + setops(argp, "flash " , i, "fl", VI_ERR_METHOD); setops(argp, "ignorecase ", i, "ic", VI_IGNORECASE); - setops(argp, "showmatch ", i, "ic", VI_SHOWMATCH); - /* tabstopXXXX */ - if (strncmp(argp + i, "tabstop=%d ", 7) == 0) { - sscanf(strchr(argp + i, '='), "tabstop=%d" + 7, &ch); - if (ch > 0 && ch <= MAX_TABSTOP) - tabstop = ch; + setops(argp, "showmatch " , i, "sm", VI_SHOWMATCH ); + if (strncmp(argp + i, "tabstop=", 8) == 0) { + int t = 0; + sscanf(argp + i+8, "%u", &t); + if (t > 0 && t <= MAX_TABSTOP) + tabstop = t; } - while (*argp && *argp != ' ') - argp++; // skip to arg delimiter (i.e. blank) - while (*argp && *argp == ' ') - argp++; // skip all delimiting blanks + argp = skip_non_whitespace(argp); + argp = skip_whitespace(argp); } #endif /* FEATURE_VI_SETOPTS */ #endif /* FEATURE_VI_SET */ @@ -1159,7 +1150,7 @@ static void colon(char *buf) #if ENABLE_FEATURE_VI_READONLY if (readonly_mode && !useforce) { status_line_bold("\"%s\" File is read only", fn); - goto vc3; + goto ret; } #endif // how many lines in text[]? @@ -1196,9 +1187,6 @@ static void colon(char *buf) editing = 0; } } -#if ENABLE_FEATURE_VI_READONLY - vc3:; -#endif #if ENABLE_FEATURE_VI_YANKMARK } else if (strncmp(cmd, "yank", i) == 0) { // yank lines if (b < 0) { // no addr given- use defaults @@ -1214,7 +1202,7 @@ static void colon(char *buf) // cmd unknown not_implemented(cmd); } - vc1: + ret: dot = bound_dot(dot); // make sure "dot" is valid return; #if ENABLE_FEATURE_VI_SEARCH -- cgit v1.2.3