diff --git a/virus.c b/virus.c index 2742df9..2945b4f 100644 --- a/virus.c +++ b/virus.c @@ -3,7 +3,7 @@ * virus - vi resembling utility skeleton - based on * tiny vi.c: A small 'vi' clone (from busybox 0.52) * - * Copyright (C) 2001, 2002 Stefan Koerner + * Copyright (C) 2001 - 2003 Stefan Koerner * Copyright (C) 2000, 2001 Sterling Huxley * * This program is free software; you can redistribute it and/or modify @@ -23,7 +23,7 @@ #include "config.h" -char *vi_Version = "0.0.2+dgamelaunch " PACKAGE_VERSION; +char *vi_Version = "0.0.6+dgamelaunch " PACKAGE_VERSION; /* * To compile: @@ -31,7 +31,7 @@ char *vi_Version = "0.0.2+dgamelaunch " PACKAGE_VERSION; * strip vi */ -/* +/* this was in here from busybox, will sort out later FIXME * Things To Do: * EXINIT * $HOME/.exrc and ./.exrc @@ -48,6 +48,7 @@ char *vi_Version = "0.0.2+dgamelaunch " PACKAGE_VERSION; */ //---- Feature -------------- Bytes to immplement +#define vi_main main #define BB_FEATURE_VI_COLON // 4288 #define BB_FEATURE_VI_YANKMARK // 1408 #define BB_FEATURE_VI_SEARCH // 1088 @@ -84,12 +85,15 @@ char *vi_Version = "0.0.2+dgamelaunch " PACKAGE_VERSION; #include #include "last_char_is.c" +#include "strlcat.c" +#include "strlcpy.c" #ifndef TRUE #define TRUE ((int)1) #define FALSE ((int)0) #endif /* TRUE */ #define MAX_SCR_COLS BUFSIZ +#define BUFSIZ_STATBUF 200 // Misc. non-Ascii keys that report an escape sequence #define VI_K_UP 128 // cursor key Up @@ -321,11 +325,10 @@ main (int argc, char **argv) #ifdef BB_FEATURE_VI_CRASHME (void) srand ((long) getpid ()); #endif /* BB_FEATURE_VI_CRASHME */ - status_buffer = (Byte *) malloc (200); // hold messages to user + status_buffer = (Byte *) malloc (BUFSIZ_STATBUF); // hold messages to user #ifdef BB_FEATURE_VI_READONLY vi_readonly = readonly = FALSE; - if (strncmp (argv[0], "view", 4) == 0) - { + if (strncmp (argv[0], "view", 4) == 0) { readonly = TRUE; vi_readonly = TRUE; } @@ -336,8 +339,7 @@ main (int argc, char **argv) showmatch = 1; #endif /* BB_FEATURE_VI_SETOPTS */ #ifdef BB_FEATURE_VI_YANKMARK - for (i = 0; i < 28; i++) - { + for (i = 0; i < 28; i++) { reg[i] = 0; } // init the yank regs #endif /* BB_FEATURE_VI_YANKMARK */ @@ -366,8 +368,7 @@ main (int argc, char **argv) return (0); } -static void -edit_file (Byte * fn) +static void edit_file (Byte * fn) { char c; int cnt, size, ch; @@ -393,20 +394,17 @@ edit_file (Byte * fn) size = 2 * cnt; // 200% of file size new_text (size); // get a text[] buffer screenbegin = dot = end = text; - if (fn != 0) - { + if (fn != 0) { ch = file_insert (fn, text, cnt); } - if (ch < 1) - { + if (ch < 1) { (void) char_insert (text, '\n'); // start empty buf with dummy line } file_modified = FALSE; #ifdef BB_FEATURE_VI_YANKMARK YDreg = 26; // default Yank/Delete reg Ureg = 27; // hold orig line for "U" cmd - for (cnt = 0; cnt < 28; cnt++) - { + for (cnt = 0; cnt < 28; cnt++) { mark[cnt] = 0; } // init the marks mark[26] = mark[27] = text; // init "previous context" @@ -437,8 +435,7 @@ edit_file (Byte * fn) signal (SIGWINCH, winch_sig); signal (SIGTSTP, suspend_sig); sig = setjmp (restart); - if (sig != 0) - { + if (sig != 0) { msg = ""; if (sig == SIGWINCH) msg = "(window resize)"; @@ -478,19 +475,15 @@ edit_file (Byte * fn) show_status_line (); //------This is the main Vi cmd handling loop ----------------------- - while (editing > 0) - { + while (editing > 0) { #ifdef BB_FEATURE_VI_CRASHME - if (crashme > 0) - { - if ((end - text) > 1) - { + if (crashme > 0) { + if ((end - text) > 1) { crash_dummy (); // generate a random command - } - else - { + } else { crashme = 0; - dot = string_insert (text, (Byte *) "\n\n##### Ran out of text to work on. #####\n\n"); // insert the string + dot = + string_insert(text, (Byte *) "\n\n##### Ran out of text to work on. #####\n\n"); // insert the string refresh (FALSE); } } @@ -498,8 +491,7 @@ edit_file (Byte * fn) last_input_char = c = get_one_char (); // get a cmd from user #ifdef BB_FEATURE_VI_YANKMARK // save a copy of the current line- for the 'U" command - if (begin_line (dot) != cur_line) - { + if (begin_line (dot) != cur_line) { cur_line = begin_line (dot); text_yank (begin_line (dot), end_line (dot), Ureg); } @@ -508,8 +500,7 @@ edit_file (Byte * fn) // These are commands that change text[]. // Remember the input for the "." command if (!adding2q && ioq_start == 0 - && strchr ((char *) modifying_cmds, c) != NULL) - { + && strchr((char *) modifying_cmds, c) != NULL) { start_new_cmd_q (c); } #endif /* BB_FEATURE_VI_DOT_CMD */ @@ -518,8 +509,7 @@ edit_file (Byte * fn) // poll to see if there is input already waiting. if we are // not able to display output fast enough to keep up, skip // the display update until we catch up with input. - if (mysleep (0) == 0) - { + if (mysleep(0) == 0) { // no input pending- so update output refresh (FALSE); show_status_line (); @@ -600,8 +590,7 @@ char *multilines[20] = { }; // create a random command to execute -static void -crash_dummy () +static void crash_dummy() { static int sleeptime; // how long to pause between commands char c, cm, *cmd, *cmd1; @@ -619,39 +608,26 @@ cd0: memset (readbuffer, '\0', BUFSIZ - 1); // clear the read buffer // generate a command by percentages percent = (int) lrand48 () % 100; // get a number from 0-99 - if (percent < Mp) - { // Movement commands + if (percent < Mp) { // Movement commands // available commands cmd = cmd1; M++; - } - else if (percent < Np) - { // non-movement commands + } else if (percent < Np) { // non-movement commands cmd = "mz<>\'\""; // available commands N++; - } - else if (percent < Dp) - { // Delete commands + } else if (percent < Dp) { // Delete commands cmd = "dx"; // available commands D++; - } - else if (percent < Ip) - { // Inset commands + } else if (percent < Ip) { // Inset commands cmd = "iIaAsrJ"; // available commands I++; - } - else if (percent < Yp) - { // Yank commands + } else if (percent < Yp) { // Yank commands cmd = "yY"; // available commands Y++; - } - else if (percent < Pp) - { // Put commands + } else if (percent < Pp) { // Put commands cmd = "pP"; // available commands P++; - } - else - { + } else { // We do not know how to handle this command, try again U++; goto cd0; @@ -666,21 +642,17 @@ cd0: // now we have the command- // there are 1, 2, and multi char commands // find out which and generate the rest of command as necessary - if (strchr ("dmryz<>\'\"", cm)) - { // 2-char commands + if (strchr ("dmryz<>\'\"", cm)) { // 2-char commands cmd1 = " \n\r0$^-+wWeEbBhjklHL"; - if (cm == 'm' || cm == '\'' || cm == '\"') - { // pick a reg[] + if (cm == 'm' || cm == '\'' || cm == '\"') { // pick a reg[] cmd1 = "abcdefghijklmnopqrstuvwxyz"; } thing = (int) lrand48 () % strlen (cmd1); // pick a movement command c = cmd1[thing]; readbuffer[rbi++] = c; // add movement to input buffer } - if (strchr ("iIaAsc", cm)) - { // multi-char commands - if (cm == 'c') - { + if (strchr ("iIaAsc", cm)) { // multi-char commands + if (cm == 'c') { // change some thing thing = (int) lrand48 () % strlen (cmd1); // pick a movement command c = cmd1[thing]; @@ -688,26 +660,18 @@ cd0: } thing = (int) lrand48 () % 4; // what thing to insert cnt = (int) lrand48 () % 10; // how many to insert - for (i = 0; i < cnt; i++) - { - if (thing == 0) - { // insert chars + for (i = 0; i < cnt; i++) { + if (thing == 0) { // insert chars readbuffer[rbi++] = chars[((int) lrand48 () % strlen (chars))]; - } - else if (thing == 1) - { // insert words - strcat ((char *) readbuffer, words[(int) lrand48 () % 20]); + } else if (thing == 1) { // insert words + strlcat((char *) readbuffer, words[(int) lrand48() % 20], BUFSIZ); /* FIXED added BUFSIZ and converted to strlcat() */ strcat ((char *) readbuffer, " "); sleeptime = 0; // how fast to type - } - else if (thing == 2) - { // insert lines - strcat ((char *) readbuffer, lines[(int) lrand48 () % 20]); + } else if (thing == 2) { // insert lines + strlcat((char *) readbuffer, lines[(int) lrand48() % 20], BUFSIZ); /* FIXED added BUFSIZ and converted to strlcat() */ sleeptime = 0; // how fast to type - } - else - { // insert multi-lines - strcat ((char *) readbuffer, multilines[(int) lrand48 () % 20]); + } else { // insert multi-lines + strlcat((char *) readbuffer, multilines[(int) lrand48() % 20], BUFSIZ); /* FIXED added BUFSIZ and converted to stlcat() */ sleeptime = 0; // how fast to type } } @@ -720,55 +684,45 @@ cd1: } // test to see if there are any errors -static void -crash_test () +static void crash_test() { static time_t oldtim; time_t tim; char d[2], buf[BUFSIZ], msg[BUFSIZ]; msg[0] = '\0'; - if (end < text) - { + if (end < text) { strcat ((char *) msg, "end textend) - { + if (end > textend) { strcat ((char *) msg, "end>textend "); } - if (dot < text) - { + if (dot < text) { strcat ((char *) msg, "dot end) - { + if (dot > end) { strcat ((char *) msg, "dot>end "); } - if (screenbegin < text) - { + if (screenbegin < text) { strcat ((char *) msg, "screenbegin end - 1) - { + if (screenbegin > end - 1) { strcat ((char *) msg, "screenbegin>end-1 "); } - if (strlen (msg) > 0) - { + if (strlen (msg) > 0) { // alarm(0); sprintf (buf, "\n\n%d: \'%c\' %s\n\n\n%s[Hit return to continue]%s", totalcmds, last_input_char, msg, SOs, SOn); write (1, buf, strlen (buf)); - while (read (0, d, 1) > 0) - { + while (read (0, d, 1) > 0) { if (d[0] == '\n' || d[0] == '\r') break; } // alarm(3); } tim = (time_t) time ((time_t *) 0); - if (tim >= (oldtim + 3)) - { + if (tim >= (oldtim + 3)) { sprintf ((char *) status_buffer, "Tot=%d: M=%d N=%d I=%d D=%d Y=%d P=%d U=%d size=%d", totalcmds, M, N, I, D, Y, P, U, end - text + 1); @@ -800,8 +754,7 @@ crash_test () //--------------------------------------------------------------------- //----- Execute a Vi Command ----------------------------------- -static void -do_cmd (Byte c) +static void do_cmd(Byte c) { Byte c1, *p, *q, *msg, buf[9], *save_dot; int cnt, i, j, dir, yf; @@ -810,18 +763,27 @@ do_cmd (Byte c) cnt = yf = dir = 0; // quiet the compiler p = q = save_dot = msg = buf; // quiet the compiler memset (buf, '\0', 9); // clear buf - if (cmd_mode == 2) - { + + /* if this is a cursor key, skip these checks */ + switch (c) { + case VI_K_UP: + case VI_K_DOWN: + case VI_K_LEFT: + case VI_K_RIGHT: + case VI_K_HOME: + case VI_K_END: + case VI_K_PAGEUP: + case VI_K_PAGEDOWN: + goto key_cmd_mode; + } + + if (cmd_mode == 2) { // we are 'R'eplacing the current *dot with new char - if (*dot == '\n') - { + if (*dot == '\n') { // don't Replace past E-o-l cmd_mode = 1; // convert to insert - } - else - { - if (1 <= c && c <= 127) - { // only ASCII chars + } else { + if (1 <= c && c <= 127) { // only ASCII chars if (c != 27) dot = yank_delete (dot, dot, 0, YANKDEL); // delete char dot = char_insert (dot, c); // insert new char @@ -829,21 +791,18 @@ do_cmd (Byte c) goto dc1; } } - if (cmd_mode == 1) - { + if (cmd_mode == 1) { // hitting "Insert" twice means "R" replace mode - if (c == VI_K_INSERT) - goto dc5; + if (c == VI_K_INSERT) goto dc5; // insert the char c at "dot" - if (1 <= c && c <= 127) - { + if (1 <= c && c <= 127) { dot = char_insert (dot, c); // only ASCII chars } goto dc1; } - switch (c) - { +key_cmd_mode: + switch (c) { //case 0x01: // soh //case 0x09: // ht //case 0x0b: // vt @@ -857,41 +816,40 @@ do_cmd (Byte c) crashme = (crashme == 0) ? 1 : 0; break; #endif /* BB_FEATURE_VI_CRASHME */ - /*case 0x16: // syn - case 0x17: // etb - case 0x18: // can - case 0x1c: // fs - case 0x1d: // gs - case 0x1e: // rs - case 0x1f: // us - case '!': // !- - case '#': // #- - case '&': // &- - case '(': // (- - case ')': // )- - case '*': // *- - case ',': // ,- - case '=': // =- - case '@': // @- - case 'F': // F- - case 'K': // K- - case 'Q': // Q- - case 'S': // S- - case 'T': // T- - case 'V': // V- - case '[': // [- - case '\\': // \- - case ']': // ]- - case '_': // _- - case '`': // `- - case 'g': // g- - case 'u': // u- FIXME- there is no undo - case 'v': // v- */ + //case 0x16: // syn + //case 0x17: // etb + //case 0x18: // can + //case 0x1c: // fs + //case 0x1d: // gs + //case 0x1e: // rs + //case 0x1f: // us + //case '!': // !- + //case '#': // #- + //case '&': // &- + //case '(': // (- + //case ')': // )- + //case '*': // *- + //case ',': // ,- + //case '=': // =- + //case '@': // @- + //case 'F': // F- + //case 'K': // K- + //case 'Q': // Q- + //case 'S': // S- + //case 'T': // T- + //case 'V': // V- + //case '[': // [- + //case '\\': // \- + //case ']': // ]- + //case '_': // _- + //case '`': // `- + //case 'g': // g- + //case 'u': // u- FIXME- there is no undo + //case 'v': // v- default: // unrecognised command buf[0] = c; buf[1] = '\0'; - if (c <= ' ') - { + if (c <= ' ') { buf[0] = '^'; buf[1] = c + '@'; buf[2] = '\0'; @@ -929,8 +887,7 @@ do_cmd (Byte c) case VI_K_LEFT: // cursor key Left case 8: // ctrl-H- move left (This may be ERASE char) case 127: // DEL- move left (This may be ERASE char) - if (cmdcnt-- > 1) - { + if (cmdcnt-- > 1) { do_cmd (c); } // repeat cnt dot_left (); @@ -938,8 +895,7 @@ do_cmd (Byte c) case 10: // Newline ^J case 'j': // j- goto next line, same col case VI_K_DOWN: // cursor key Down - if (cmdcnt-- > 1) - { + if (cmdcnt-- > 1) { do_cmd (c); } // repeat cnt dot_next (); // go to next B-o-l @@ -955,8 +911,7 @@ do_cmd (Byte c) break; case 13: // Carriage Return ^M case '+': // +- goto next line - if (cmdcnt-- > 1) - { + if (cmdcnt-- > 1) { do_cmd (c); } // repeat cnt dot_next (); @@ -978,8 +933,7 @@ do_cmd (Byte c) case ' ': // move right case 'l': // move right case VI_K_RIGHT: // Cursor Key Right - if (cmdcnt-- > 1) - { + if (cmdcnt-- > 1) { do_cmd (c); } // repeat cnt dot_right (); @@ -988,38 +942,29 @@ do_cmd (Byte c) case '"': // "- name a register to use for Delete/Yank c1 = get_one_char (); c1 = tolower (c1); - if (islower (c1)) - { + if (islower(c1)) { YDreg = c1 - 'a'; - } - else - { + } else { indicate_error (c); } break; case '\'': // '- goto a specific mark c1 = get_one_char (); c1 = tolower (c1); - if (islower (c1)) - { + if (islower(c1)) { c1 = c1 - 'a'; // get the b-o-l q = mark[(int) c1]; - if (text <= q && q < end) - { + if (text <= q && q < end) { dot = q; dot_begin (); // go to B-o-l dot_skip_over_ws (); } - } - else if (c1 == '\'') - { // goto previous context + } else if (c1 == '\'') { // goto previous context dot = swap_context (dot); // swap current and previous context dot_begin (); // go to B-o-l dot_skip_over_ws (); - } - else - { + } else { indicate_error (c); } break; @@ -1030,47 +975,35 @@ do_cmd (Byte c) // Well..., at least its quick and dirty. c1 = get_one_char (); c1 = tolower (c1); - if (islower (c1)) - { + if (islower(c1)) { c1 = c1 - 'a'; // remember the line mark[(int) c1] = dot; - } - else - { + } else { indicate_error (c); } break; case 'P': // P- Put register before case 'p': // p- put register after p = reg[YDreg]; - if (p == 0) - { + if (p == 0) { psbs ("Nothing in register %c", what_reg ()); break; } // are we putting whole lines or strings - if (strchr ((char *) p, '\n') != NULL) - { - if (c == 'P') - { + if (strchr((char *) p, '\n') != NULL) { + if (c == 'P') { dot_begin (); // putting lines- Put above } - if (c == 'p') - { + if (c == 'p') { // are we putting after very last line? - if (end_line (dot) == (end - 1)) - { + if (end_line (dot) == (end - 1)) { dot = end; // force dot to end of text[] - } - else - { + } else { dot_next (); // next line, then put before } } - } - else - { + } else { if (c == 'p') dot_right (); // move to right, can move to NL } @@ -1078,8 +1011,7 @@ do_cmd (Byte c) end_cmd_q (); // stop adding to q break; case 'U': // U- Undo; replace current line with original version - if (reg[Ureg] != 0) - { + if (reg[Ureg] != 0) { p = begin_line (dot); q = end_line (dot); p = text_hole_delete (p, q); // delete cur line @@ -1091,25 +1023,19 @@ do_cmd (Byte c) #endif /* BB_FEATURE_VI_YANKMARK */ case '$': // $- goto end of line case VI_K_END: // Cursor Key End - if (cmdcnt-- > 1) - { + if (cmdcnt-- > 1) { do_cmd (c); } // repeat cnt dot = end_line (dot + 1); break; case '%': // %- find matching char of pair () [] {} - for (q = dot; q < end && *q != '\n'; q++) - { - if (strchr ("()[]{}", *q) != NULL) - { + for (q = dot; q < end && *q != '\n'; q++) { + if (strchr("()[]{}", *q) != NULL) { // we found half of a pair p = find_pair (q, *q); - if (p == NULL) - { + if (p == NULL) { indicate_error (c); - } - else - { + } else { dot = p; } break; @@ -1125,23 +1051,19 @@ do_cmd (Byte c) // //**** fall thru to ... 'i' case ';': // ;- look at rest of line for last forward char - if (cmdcnt-- > 1) - { + if (cmdcnt-- > 1) { do_cmd (';'); } // repeat cnt - if (last_forward_char == 0) - break; + if (last_forward_char == 0) break; q = dot + 1; - while (q < end - 1 && *q != '\n' && *q != last_forward_char) - { + while (q < end - 1 && *q != '\n' && *q != last_forward_char) { q++; } if (*q == last_forward_char) dot = q; break; case '-': // -- goto prev line - if (cmdcnt-- > 1) - { + if (cmdcnt-- > 1) { do_cmd (c); } // repeat cnt dot_prev (); @@ -1151,8 +1073,7 @@ do_cmd (Byte c) case '.': // .- repeat the last modifying command // Stuff the last_modifying_cmd back into stdin // and let it be re-executed. - if (last_modifying_cmd != 0) - { + if (last_modifying_cmd != 0) { ioq = ioq_start = (Byte *) strdup ((char *) last_modifying_cmd); } break; @@ -1165,11 +1086,9 @@ do_cmd (Byte c) q = get_input_line (buf); // get input line- use "status line" if (strlen ((char *) q) == 1) goto dc3; // if no pat re-use old pat - if (strlen ((char *) q) > 1) - { // new pat- save it and find + if (strlen ((char *) q) > 1) { // new pat- save it and find // there is a new pat - if (last_search_pattern != 0) - { + if (last_search_pattern != 0) { free (last_search_pattern); } last_search_pattern = (Byte *) strdup ((char *) q); @@ -1179,14 +1098,12 @@ do_cmd (Byte c) break; case 'N': // N- backward search for last pattern if (last_search_pattern == 0) break; - if (cmdcnt-- > 1) - { + if (cmdcnt-- > 1) { do_cmd (c); } // repeat cnt dir = BACK; // assume BACKWARD search p = dot - 1; - if (last_search_pattern[0] == '?') - { + if (last_search_pattern[0] == '?') { dir = FORWARD; p = dot + 1; } @@ -1195,52 +1112,42 @@ do_cmd (Byte c) case 'n': // n- repeat search for last pattern // search rest of text[] starting at next char // if search fails return orignal "p" not the "p+1" address - if (cmdcnt-- > 1) - { + if (cmdcnt-- > 1) { do_cmd (c); } // repeat cnt dc3: - if (last_search_pattern == 0) - { + if (last_search_pattern == 0) { msg = (Byte *) "No previous regular expression"; goto dc2; } - if (last_search_pattern[0] == '/') - { + if (last_search_pattern[0] == '/') { dir = FORWARD; // assume FORWARD search p = dot + 1; } - if (last_search_pattern[0] == '?') - { + if (last_search_pattern[0] == '?') { dir = BACK; p = dot - 1; } dc4: q = char_search (p, last_search_pattern + 1, dir, FULL); - if (q != NULL) - { + if (q != NULL) { dot = q; // good search, update "dot" msg = (Byte *) ""; goto dc2; } // no pattern found between "dot" and "end"- continue at top p = text; - if (dir == BACK) - { + if (dir == BACK) { p = end - 1; } q = char_search (p, last_search_pattern + 1, dir, FULL); - if (q != NULL) - { // found something + if (q != NULL) { // found something dot = q; // found new pattern- goto it msg = (Byte *) "search hit BOTTOM, continuing at TOP"; - if (dir == BACK) - { + if (dir == BACK) { msg = (Byte *) "search hit TOP, continuing at BOTTOM"; } - } - else - { + } else { msg = (Byte *) "Pattern not found"; } dc2: @@ -1248,15 +1155,13 @@ do_cmd (Byte c) break; case '{': // {- move backward paragraph q = char_search (dot, (Byte *) "\n\n", BACK, FULL); - if (q != NULL) - { // found blank line + if (q != NULL) { // found blank line dot = next_line (q); // move to next blank line } break; case '}': // }- move forward paragraph q = char_search (dot, (Byte *) "\n\n", FORWARD, FULL); - if (q != NULL) - { // found blank line + if (q != NULL) { // found blank line dot = next_line (q); // move to next blank line } break; @@ -1271,12 +1176,9 @@ do_cmd (Byte c) case '7': // 7- case '8': // 8- case '9': // 9- - if (c == '0' && cmdcnt < 1) - { + if (c == '0' && cmdcnt < 1) { dot_begin (); // this was a standalone zero - } - else - { + } else { cmdcnt = cmdcnt * 10 + (c - '0'); // this 0 is part of a number } break; @@ -1290,42 +1192,29 @@ do_cmd (Byte c) cnt = strlen ((char *) p); if (cnt <= 0) break; - if (strncasecmp ((char *) p, "quit", cnt) == 0 || - strncasecmp ((char *) p, "q!", cnt) == 0) - { // delete lines - if (file_modified == TRUE && p[1] != '!') - { + if (strncasecmp((char *) p, "quit", cnt) == 0 || + strncasecmp((char *) p, "q!", cnt) == 0) { // delete lines + if (file_modified == TRUE && p[1] != '!') { psbs ("No write since last change (:quit! overrides)"); - } - else - { + } else { editing = 0; } - } - else if (strncasecmp ((char *) p, "write", cnt) == 0 || - strncasecmp ((char *) p, "wq", cnt) == 0) - { + } else if (strncasecmp((char *) p, "write", cnt) == 0 || + strncasecmp((char *) p, "wq", cnt) == 0) { cnt = file_write (cfn, text, end - 1); file_modified = FALSE; psb ("\"%s\" %dL, %dC", cfn, count_lines (text, end - 1), cnt); - if (p[1] == 'q') - { + if (p[1] == 'q') { editing = 0; } - } - else if (strncasecmp ((char *) p, "file", cnt) == 0) - { + } else if (strncasecmp((char *) p, "file", cnt) == 0) { edit_status (); // show current file status - } - else if (sscanf ((char *) p, "%d", &j) > 0) - { + } else if (sscanf ((char *) p, "%d", &j) > 0) { dot = find_line (j); // go to line # j dot_skip_over_ws (); - } - else - { // unrecognised cmd + } else { // unrecognised cmd ni ((Byte *) p); - } + } #endif /* BB_FEATURE_VI_COLON */ break; case '<': // <- Left shift something @@ -1337,27 +1226,19 @@ do_cmd (Byte c) p = begin_line (p); q = end_line (q); i = count_lines (p, q); // # of lines we are shifting - for (; i > 0; i--, p = next_line (p)) - { - if (c == '<') - { + for (; i > 0; i--, p = next_line(p)) { + if (c == '<') { // shift left- remove tab or 8 spaces - if (*p == '\t') - { + if (*p == '\t') { // shrink buffer 1 char (void) text_hole_delete (p, p); - } - else if (*p == ' ') - { + } else if (*p == ' ') { // we should be calculating columns, not just SPACE - for (j = 0; *p == ' ' && j < tabstop; j++) - { + for (j = 0; *p == ' ' && j < tabstop; j++) { (void) text_hole_delete (p, p); } } - } - else if (c == '>') - { + } else if (c == '>') { // shift right -- add tab or 8 spaces (void) char_insert (p, '\t'); } @@ -1377,15 +1258,13 @@ do_cmd (Byte c) case 'B': // B- back a blank-delimited Word case 'E': // E- end of a blank-delimited word case 'W': // W- forward a blank-delimited word - if (cmdcnt-- > 1) - { + if (cmdcnt-- > 1) { do_cmd (c); } // repeat cnt dir = FORWARD; if (c == 'B') dir = BACK; - if (c == 'W' || isspace (dot[dir])) - { + if (c == 'W' || isspace(dot[dir])) { dot = skip_thing (dot, 1, dir, S_TO_WS); dot = skip_thing (dot, 2, dir, S_OVER_WS); } @@ -1407,20 +1286,17 @@ do_cmd (Byte c) break; case 'G': // G- goto to a line number (default= E-O-F) dot = end - 1; // assume E-O-F - if (cmdcnt > 0) - { + if (cmdcnt > 0) { dot = find_line (cmdcnt); // what line is #cmdcnt } dot_skip_over_ws (); break; case 'H': // H- goto top line on screen dot = screenbegin; - if (cmdcnt > (rows - 1)) - { + if (cmdcnt > (rows - 1)) { cmdcnt = (rows - 1); } - if (cmdcnt-- > 1) - { + if (cmdcnt-- > 1) { do_cmd ('+'); } // repeat cnt dot_skip_over_ws (); @@ -1436,16 +1312,13 @@ do_cmd (Byte c) psb ("-- Insert --"); break; case 'J': // J- join current and next lines together - if (cmdcnt-- > 2) - { + if (cmdcnt-- > 2) { do_cmd (c); } // repeat cnt dot_end (); // move to NL - if (dot < end - 1) - { // make sure not last char in text[] + if (dot < end - 1) { // make sure not last char in text[] *dot++ = ' '; // replace NL with space - while (isblnk (*dot)) - { // delete leading WS + while (isblnk(*dot)) { // delete leading WS dot_delete (); } } @@ -1453,12 +1326,10 @@ do_cmd (Byte c) break; case 'L': // L- goto bottom line on screen dot = end_screen (); - if (cmdcnt > (rows - 1)) - { + if (cmdcnt > (rows - 1)) { cmdcnt = (rows - 1); } - if (cmdcnt-- > 1) - { + if (cmdcnt-- > 1) { do_cmd ('-'); } // repeat cnt dot_begin (); @@ -1472,15 +1343,12 @@ do_cmd (Byte c) case 'O': // O- open a empty line above // 0i\n ESC -i p = begin_line (dot); - if (p[-1] == '\n') - { + if (p[-1] == '\n') { dot_prev (); case 'o': // o- open a empty line below; Yes, I know it is in the middle of the "if (..." dot_end (); dot = char_insert (dot, '\n'); - } - else - { + } else { dot_begin (); // 0 dot = char_insert (dot, '\n'); // i\n ESC dot_prev (); // - @@ -1495,15 +1363,13 @@ do_cmd (Byte c) case 'X': // X- delete char before dot case 'x': // x- delete the current char case 's': // s- substitute the current char - if (cmdcnt-- > 1) - { + if (cmdcnt-- > 1) { do_cmd (c); } // repeat cnt dir = 0; if (c == 'X') dir = -1; - if (dot[dir] != '\n') - { + if (dot[dir] != '\n') { if (c == 'X') dot--; // delete prev char dot = yank_delete (dot, dot, 0, YANKDEL); // delete char @@ -1515,25 +1381,21 @@ do_cmd (Byte c) case 'Z': // Z- if modified, {write}; exit // ZZ means to save file (if necessary), then exit c1 = get_one_char (); - if (c1 != 'Z') - { + if (c1 != 'Z') { indicate_error (c); break; } if (file_modified == TRUE #ifdef BB_FEATURE_VI_READONLY - && vi_readonly == FALSE && readonly == FALSE + && vi_readonly == FALSE + && readonly == FALSE #endif /* BB_FEATURE_VI_READONLY */ - ) - { + ) { cnt = file_write (cfn, text, end - 1); - if (cnt == (end - 1 - text + 1)) - { + if (cnt == (end - 1 - text + 1)) { editing = 0; } - } - else - { + } else { editing = 0; } break; @@ -1543,8 +1405,7 @@ do_cmd (Byte c) break; case 'b': // b- back a word case 'e': // e- end of word - if (cmdcnt-- > 1) - { + if (cmdcnt-- > 1) { do_cmd (c); } // repeat cnt dir = FORWARD; @@ -1553,18 +1414,14 @@ do_cmd (Byte c) if ((dot + dir) < text || (dot + dir) > end - 1) break; dot += dir; - if (isspace (*dot)) - { + if (isspace(*dot)) { dot = skip_thing (dot, (c == 'e') ? 2 : 1, dir, S_OVER_WS); } - if (isalnum (*dot) || *dot == '_') - { + if (isalnum(*dot) || *dot == '_') { dot = skip_thing (dot, 1, dir, S_END_ALNUM); - } - else if (ispunct (*dot)) - { + } else if (ispunct(*dot)) { dot = skip_thing (dot, 1, dir, S_END_PUNCT); - } + } break; case 'c': // c- change something case 'd': // d- delete something @@ -1581,77 +1438,58 @@ do_cmd (Byte c) if (c != 'Y') c1 = get_one_char (); // get the type of thing to delete find_range (&p, &q, c1); - if (c1 == 27) - { // ESC- user changed mind and wants out + if (c1 == 27) { // ESC- user changed mind and wants out c = c1 = 27; // Escape- do nothing - } - else if (strchr ("wW", c1)) - { - if (c == 'c') - { + } else if (strchr("wW", c1)) { + if (c == 'c') { // don't include trailing WS as part of word - while (isblnk (*q)) - { + while (isblnk(*q)) { if (q <= text || q[-1] == '\n') break; q--; } } dot = yank_delete (p, q, 0, yf); // delete word - } - else if (strchr ("^0bBeEft$", c1)) - { + } else if (strchr("^0bBeEft$", c1)) { // single line copy text into a register and delete dot = yank_delete (p, q, 0, yf); // delete word - } - else if (strchr ("cdykjHL%+-{}\r\n", c1)) - { + } else if (strchr("cdykjHL%+-{}\r\n", c1)) { // multiple line copy text into a register and delete dot = yank_delete (p, q, 1, yf); // delete lines - if (c == 'c') - { + if (c == 'c') { dot = char_insert (dot, '\n'); // on the last line of file don't move to prev line - if (dot != (end - 1)) - { + if (dot != (end - 1)) { dot_prev (); } - } - else if (c == 'd') - { + } else if (c == 'd') { dot_begin (); dot_skip_over_ws (); - } - } - else - { - c = c1 = 27; + } + } else { + // could not recognize object + c = c1 = 27; // error- indicate_error (c); - } - if (c1 != 27) - { + } + if (c1 != 27) { // if CHANGING, not deleting, start inserting after the delete - if (c == 'c') - { + if (c == 'c') { strcpy ((char *) buf, "Change"); goto dc_i; // start inserting - } - if (c == 'd') - { + } + if (c == 'd') { strcpy ((char *) buf, "Delete"); - } + } #ifdef BB_FEATURE_VI_YANKMARK - if (c == 'y' || c == 'Y') - { + if (c == 'y' || c == 'Y') { strcpy ((char *) buf, "Yank"); - } + } p = reg[YDreg]; q = p + strlen ((char *) p); - for (cnt = 0; p <= q; p++) - { + for (cnt = 0; p <= q; p++) { if (*p == '\n') cnt++; - } + } psb ("%s %d lines (%d chars) using [%c]", buf, cnt, strlen ((char *) reg[YDreg]), what_reg ()); #endif /* BB_FEATURE_VI_YANKMARK */ @@ -1660,20 +1498,18 @@ do_cmd (Byte c) break; case 'k': // k- goto prev line, same col case VI_K_UP: // cursor key Up - if (cmdcnt-- > 1) - { + if (cmdcnt-- > 1) { do_cmd (c); - } // repeat cnt + } // repeat cnt dot_prev (); dot = move_to_col (dot, ccol + offset); // try stay in same col break; case 'r': // r- replace the current char with user input c1 = get_one_char (); // get the replacement char - if (*dot != '\n') - { + if (*dot != '\n') { *dot = c1; file_modified = TRUE; // has the file been modified - } + } end_cmd_q (); // stop adding to q break; case 't': // t- move to char prior to next x @@ -1684,24 +1520,19 @@ do_cmd (Byte c) last_forward_char = 0; break; case 'w': // w- forward a word - if (cmdcnt-- > 1) - { + if (cmdcnt-- > 1) { do_cmd (c); - } // repeat cnt - if (isalnum (*dot) || *dot == '_') - { // we are on ALNUM + } // repeat cnt + if (isalnum(*dot) || *dot == '_') { // we are on ALNUM dot = skip_thing (dot, 1, FORWARD, S_END_ALNUM); - } - else if (ispunct (*dot)) - { // we are on PUNCT + } else if (ispunct(*dot)) { // we are on PUNCT dot = skip_thing (dot, 1, FORWARD, S_END_PUNCT); - } + } if (dot < end - 1) dot++; // move over word - if (isspace (*dot)) - { + if (isspace(*dot)) { dot = skip_thing (dot, 2, FORWARD, S_OVER_WS); - } + } break; case 'z': // z- c1 = get_one_char (); // get the replacement char @@ -1717,20 +1548,16 @@ do_cmd (Byte c) dot = move_to_col (dot, cmdcnt - 1); // try to move to column break; case '~': // ~- flip the case of letters a-z -> A-Z - if (cmdcnt-- > 1) - { + if (cmdcnt-- > 1) { do_cmd (c); - } // repeat cnt - if (islower (*dot)) - { + } // repeat cnt + if (islower(*dot)) { *dot = toupper (*dot); file_modified = TRUE; // has the file been modified - } - else if (isupper (*dot)) - { + } else if (isupper(*dot)) { *dot = tolower (*dot); file_modified = TRUE; // has the file been modified - } + } dot_right (); end_cmd_q (); // stop adding to q break; @@ -1756,16 +1583,14 @@ do_cmd (Byte c) dc1: // if text[] just became empty, add back an empty line - if (end == text) - { + if (end == text) { (void) char_insert (text, '\n'); // start empty buf with dummy line dot = text; - } + } // it is OK for dot to exactly equal to end, otherwise check dot validity - if (dot != end) - { + if (dot != end) { dot = bound_dot (dot); // make sure "dot" is valid - } + } #ifdef BB_FEATURE_VI_YANKMARK check_context (c); // update the current context #endif /* BB_FEATURE_VI_YANKMARK */ @@ -1780,8 +1605,7 @@ dc1: //----- The Colon commands ------------------------------------- #ifdef BB_FEATURE_VI_COLON -static Byte * -get_one_address (Byte * p, int *addr) // get colon addr, if present +static Byte *get_one_address(Byte * p, int *addr) // get colon addr, if present { int st; Byte *q; @@ -1794,104 +1618,85 @@ get_one_address (Byte * p, int *addr) // get colon addr, if present #endif /* BB_FEATURE_VI_SEARCH */ *addr = -1; // assume no addr - if (*p == '.') - { // the current line + if (*p == '.') { // the current line p++; q = begin_line (dot); *addr = count_lines (text, q); #ifdef BB_FEATURE_VI_YANKMARK - } - else if (*p == '\'') - { // is this a mark addr + } else if (*p == '\'') { // is this a mark addr p++; c = tolower (*p); p++; - if (c >= 'a' && c <= 'z') - { + if (c >= 'a' && c <= 'z') { // we have a mark c = c - 'a'; q = mark[(int) c]; - if (q != NULL) - { // is mark valid + if (q != NULL) { // is mark valid *addr = count_lines (text, q); // count lines - } - } + } + } #endif /* BB_FEATURE_VI_YANKMARK */ #ifdef BB_FEATURE_VI_SEARCH - } - else if (*p == '/') - { // a search pattern + } else if (*p == '/') { // a search pattern q = buf; - for (p++; *p; p++) - { + for (p++; *p; p++) { if (*p == '/') break; *q++ = *p; *q = '\0'; - } + } pat = (Byte *) strdup ((char *) buf); // save copy of pattern if (*p == '/') p++; q = char_search (dot, pat, FORWARD, FULL); - if (q != NULL) - { + if (q != NULL) { *addr = count_lines (text, q); - } + } free (pat); #endif /* BB_FEATURE_VI_SEARCH */ - } - else if (*p == '$') - { // the last line in file + } else if (*p == '$') { // the last line in file p++; q = begin_line (end - 1); *addr = count_lines (text, q); - } - else if (isdigit (*p)) - { // specific line number + } else if (isdigit(*p)) { // specific line number sscanf ((char *) p, "%d%n", addr, &st); p += st; - } - else - { // I don't reconise this + } else { // I don't reconise this // unrecognised address- assume -1 *addr = -1; - } + } return (p); } -static Byte * -get_address (Byte * p, int *b, int *e) // get two colon addrs, if present +static Byte *get_address(Byte * p, int *b, int *e) // get two colon addrs, if present { //----- get the address' i.e., 1,3 'a,'b ----- // get FIRST addr, if present while (isblnk (*p)) p++; // skip over leading spaces - if (*p == '%') - { // alias for 1,$ + if (*p == '%') { // alias for 1,$ p++; *b = 1; *e = count_lines (text, end - 1); goto ga0; - } + } p = get_one_address (p, b); while (isblnk (*p)) p++; - if (*p == ',') - { // is there a address seperator + if (*p == ',') { // is there a address seperator p++; while (isblnk (*p)) p++; // get SECOND addr, if present p = get_one_address (p, e); - } + } ga0: while (isblnk (*p)) p++; // skip over trailing spaces return (p); } -static void -colon (Byte * buf) +static void colon(Byte * buf) { Byte c, *orig_buf, *buf1, *q, *r; Byte *fn, cmd[BUFSIZ], args[BUFSIZ]; @@ -1899,20 +1704,20 @@ colon (Byte * buf) int useforce, forced; struct stat st_buf; - /* :3154 // if (-e line 3154) goto it else stay put - :4,33w! foo // write a portion of buffer to file "foo" - :w // write all of buffer to current file - :q // quit - :q! // quit- dont care about modified file - :'a,'z!sort -u // filter block through sort - :'f // goto mark "f" - :'fl // list literal the mark "f" line - :.r bar // read file "bar" into buffer before dot - :/123/,/abc/d // delete lines from "123" line to "abc" line - :/xyz/ // goto the "xyz" line - :s/find/replace/ // substitute pattern "find" with "replace" - :! // run then return - */ + // :3154 // if (-e line 3154) goto it else stay put + // :4,33w! foo // write a portion of buffer to file "foo" + // :w // write all of buffer to current file + // :q // quit + // :q! // quit- dont care about modified file + // :'a,'z!sort -u // filter block through sort + // :'f // goto mark "f" + // :'fl // list literal the mark "f" line + // :.r bar // read file "bar" into buffer before dot + // :/123/,/abc/d // delete lines from "123" line to "abc" line + // :/xyz/ // goto the "xyz" line + // :s/find/replace/ // substitute pattern "find" with "replace" + // :! // run then return + // if (strlen ((char *) buf) <= 0) goto vc1; if (*buf == ':') @@ -1936,24 +1741,22 @@ colon (Byte * buf) // get the COMMAND into cmd[] buf1 = cmd; - while (*buf != '\0') - { + while (*buf != '\0') { if (isspace (*buf)) break; *buf1++ = *buf++; - } + } // get any ARGuments while (isblnk (*buf)) buf++; - strcpy ((char *) args, (char *) buf); - buf1 = last_char_is ((char *) cmd, '!'); - if (buf1) - { + /* FIXED strcpy((char *) args, (char *) buf); */ + if (strlcpy((char *) args, (char *) buf, sizeof((char *)args)) > sizeof((char *)args)) err(1, "strlcpy overflow in function colon"); + buf1 = (Byte *)last_char_is((char *)cmd, '!'); + if (buf1) { useforce = TRUE; *buf1 = '\0'; // get rid of ! - } - if (b >= 0) - { + } + if (b >= 0) { // if there is only one addr, then the addr // is the line number of the single line the // user wants. So, reset the end @@ -1961,108 +1764,84 @@ colon (Byte * buf) q = find_line (b); // what line is #b r = end_line (q); li = 1; - } - if (e >= 0) - { + } + if (e >= 0) { // we were given two addrs. change the // end pointer to the addr given by user. r = find_line (e); // what line is #e r = end_line (r); li = e - b + 1; - } + } // ------------ now look for the command ------------ i = strlen ((char *) cmd); - if (i == 0) - { // :123CR goto line #123 - if (b >= 0) - { + if (i == 0) { // :123CR goto line #123 + if (b >= 0) { dot = find_line (b); // what line is #b dot_skip_over_ws (); - } - } - else if (0) - { + } + } else if (0) { // } else if (strncmp((char *) cmd, "!", 1) == 0) { // run a cmd // :!ls run the - // (void) alarm(0); // wait for input- no alarms + (void) alarm(0); // wait for input- no alarms place_cursor (rows - 1, 0, FALSE); // go to Status line clear_to_eol (); // clear the line cookmode (); - system (orig_buf + 1); // run the cmd + system((char *)orig_buf+1); // run the cmd rawmode (); Hit_Return (); // let user see results - // (void) alarm(3); // done waiting for input - } - else if (strncmp ((char *) cmd, "=", i) == 0) - { // where is the address - if (b < 0) - { // no addr given- use defaults + (void) alarm(3); // done waiting for input + } else if (strncmp((char *) cmd, "=", i) == 0) { // where is the address + if (b < 0) { // no addr given- use defaults b = e = count_lines (text, dot); - } + } psb ("%d", b); - } - else if (strncasecmp ((char *) cmd, "delete", i) == 0) - { // delete lines - if (b < 0) - { // no addr given- use defaults + } else if (strncasecmp((char *) cmd, "delete", i) == 0) { // delete lines + if (b < 0) { // no addr given- use defaults q = begin_line (dot); // assume .,. for the range r = end_line (dot); - } + } dot = yank_delete (q, r, 1, YANKDEL); // save, then delete lines dot_skip_over_ws (); - } - else if (0) - { + } else if (0) { // } else if (strncasecmp((char *) cmd, "edit", i) == 0) { // Edit a file int sr; sr = 0; // don't edit, if the current file has been modified - if (file_modified == TRUE && useforce != TRUE) - { + if (file_modified == TRUE && useforce != TRUE) { psbs ("No write since last change (:edit! overrides)"); goto vc1; - } - if (strlen (args) > 0) - { + } + if (strlen((char *)args) > 0) { // the user supplied a file name fn = args; - } - else if (cfn != 0 && strlen (cfn) > 0) - { + } else if (cfn != 0 && strlen((char *)cfn) > 0) { // no user supplied name- use the current filename fn = cfn; goto vc5; - } - else - { + } else { // no user file name, no current name- punt psbs ("No current filename"); goto vc1; - } + } // see if file exists- if not, its just a new file request - if ((sr = stat ((char *) fn, &st_buf)) < 0) - { + if ((sr = stat((char *) fn, &st_buf)) < 0) { // This is just a request for a new file creation. // The file_insert below will fail but we get // an empty buffer with a file name. Then the "write" // command can do the create. - } - else - { - if ((st_buf.st_mode & (S_IFREG)) == 0) - { + } else { + if ((st_buf.st_mode & (S_IFREG)) == 0) { // This is not a regular file psbs ("\"%s\" is not a regular file", fn); goto vc1; - } - if ((st_buf.st_mode & (S_IRUSR | S_IRGRP | S_IROTH)) == 0) - { + } + if ((st_buf.st_mode & (S_IRUSR | S_IRGRP | S_IROTH)) == 0) { // dont have any read permissions psbs ("\"%s\" is not readable", fn); goto vc1; - } - } + } + } // There is a read-able regular file // make this the current file @@ -2079,28 +1858,24 @@ colon (Byte * buf) // insert new file ch = file_insert (fn, text, file_size (fn)); - if (ch < 1) - { + if (ch < 1) { // start empty buf with dummy line (void) char_insert (text, '\n'); ch = 1; - } + } file_modified = FALSE; #ifdef BB_FEATURE_VI_YANKMARK - if (Ureg >= 0 && Ureg < 28 && reg[Ureg] != 0) - { + if (Ureg >= 0 && Ureg < 28 && reg[Ureg] != 0) { free (reg[Ureg]); // free orig line reg- for 'U' reg[Ureg] = 0; - } - if (YDreg >= 0 && YDreg < 28 && reg[YDreg] != 0) - { + } + if (YDreg >= 0 && YDreg < 28 && reg[YDreg] != 0) { free (reg[YDreg]); // free default yank/delete register reg[YDreg] = 0; - } - for (li = 0; li < 28; li++) - { + } + for (li = 0; li < 28; li++) { mark[li] = 0; - } // init the marks + } // init the marks #endif /* BB_FEATURE_VI_YANKMARK */ // how many lines in text[]? li = count_lines (text, end - 1); @@ -2108,35 +1883,29 @@ colon (Byte * buf) #ifdef BB_FEATURE_VI_READONLY "%s" #endif /* BB_FEATURE_VI_READONLY */ - " %dL, %dC", cfn, (sr < 0 ? " [New file]" : ""), + " %dL, %dC", cfn, + (sr < 0 ? " [New file]" : ""), #ifdef BB_FEATURE_VI_READONLY ((vi_readonly == TRUE || readonly == TRUE) ? " [Read only]" : ""), #endif /* BB_FEATURE_VI_READONLY */ li, ch); } - else if (0) - { + else if (0) { // } else if (strncasecmp((char *) cmd, "file", i) == 0) { // what File is this - if (b != -1 || e != -1) - { + if (b != -1 || e != -1) { ni ((Byte *) "No address allowed on this command"); goto vc1; - } - if (strlen ((char *) args) > 0) - { + } + if (strlen ((char *) args) > 0) { // user wants a new filename if (cfn != NULL) free (cfn); cfn = (Byte *) strdup ((char *) args); - } - else - { + } else { // user wants file status info edit_status (); - } - } - else if (strncasecmp ((char *) cmd, "features", i) == 0) - { // what features are available + } + } else if (strncasecmp ((char *) cmd, "features", i) == 0) { // what features are available // print out values of all features place_cursor (rows - 1, 0, FALSE); // go to Status line, bottom of screen clear_to_eol (); // clear the line @@ -2144,60 +1913,48 @@ colon (Byte * buf) show_help (); rawmode (); Hit_Return (); - } - else if (strncasecmp ((char *) cmd, "list", i) == 0) - { // literal print line - if (b < 0) - { // no addr given- use defaults + } else if (strncasecmp ((char *) cmd, "list", i) == 0) { // literal print line + if (b < 0) { // no addr given- use defaults q = begin_line (dot); // assume .,. for the range r = end_line (dot); - } + } place_cursor (rows - 1, 0, FALSE); // go to Status line, bottom of screen clear_to_eol (); // clear the line write (1, "\r\n", 2); - for (; q <= r; q++) - { + for (; q <= r; q++) { c = *q; if (c > '~') standout_start (); - if (c == '\n') - { + if (c == '\n') { write (1, "$\r", 2); - } - else if (*q < ' ') - { + } else if (*q < ' ') { write (1, "^", 1); c += '@'; - } + } write (1, &c, 1); if (c > '~') standout_end (); - } + } #ifdef BB_FEATURE_VI_SET vc2: #endif /* BB_FEATURE_VI_SET */ Hit_Return (); - } - else if ((strncasecmp ((char *) cmd, "quit", i) == 0) || // Quit - (strncasecmp ((char *) cmd, "next", i) == 0)) - { // edit next file - if (useforce == TRUE) - { + } else if ((strncasecmp ((char *) cmd, "quit", i) == 0) || // Quit + (strncasecmp ((char *) cmd, "next", i) == 0)) { // edit next file + if (useforce == TRUE) { // force end of argv list - if (*cmd == 'q') - { + if (*cmd == 'q') { optind = save_argc; - } + } editing = 0; goto vc1; - } + } // don't exit if the file been modified - if (file_modified == TRUE) - { + if (file_modified == TRUE) { psbs ("No write since last change (:%s! overrides)", (*cmd == 'q' ? "quit" : "next")); goto vc1; - } + } // are there other file to edit /* if (*cmd == 'q' && optind < save_argc - 1) { psbs("%d more file to edit", (save_argc - optind - 1)); @@ -2208,20 +1965,16 @@ colon (Byte * buf) goto vc1; } */ editing = 0; - } - else if (0) - { + } else if (0) { // } else if (strncasecmp((char *) cmd, "read", i) == 0) { // read file into text[] fn = args; - if (strlen ((char *) fn) <= 0) - { + if (strlen ((char *) fn) <= 0) { psbs ("No filename given"); goto vc1; - } - if (b < 0) - { // no addr given- use defaults + } + if (b < 0) { // no addr given- use defaults q = begin_line (dot); // assume "dot" - } + } // read after current line- unless user said ":0r foo" if (b != 0) q = next_line (q); @@ -2245,33 +1998,24 @@ colon (Byte * buf) ((vi_readonly == TRUE || readonly == TRUE) ? " [Read only]" : ""), #endif /* BB_FEATURE_VI_READONLY */ li, ch); - if (ch > 0) - { + if (ch > 0) { // if the insert is before "dot" then we need to update if (q <= dot) dot += ch; file_modified = TRUE; - } - } - else if (strncasecmp ((char *) cmd, "rewind", i) == 0) - { // rewind cmd line args - if (file_modified == TRUE && useforce != TRUE) - { + } + } else if (strncasecmp ((char *) cmd, "rewind", i) == 0) { // rewind cmd line args + if (file_modified == TRUE && useforce != TRUE) { psbs ("No write since last change (:rewind! overrides)"); - } - else - { + } else { // reset the filenames to edit optind = fn_start - 1; editing = 0; - } + } #ifdef BB_FEATURE_VI_SET - } - else if (strncasecmp ((char *) cmd, "set", i) == 0) - { // set or clear features + } else if (strncasecmp ((char *) cmd, "set", i) == 0) { // set or clear features i = 0; // offset into args - if (strlen ((char *) args) == 0) - { + if (strlen ((char *) args) == 0) { // print out values of all options place_cursor (rows - 1, 0, FALSE); // go to Status line, bottom of screen clear_to_eol (); // clear the line @@ -2298,37 +2042,30 @@ colon (Byte * buf) i = 2; // ":set noautoindent" #ifdef BB_FEATURE_VI_SETOPTS if (strncasecmp ((char *) args + i, "autoindent", 10) == 0 || - strncasecmp ((char *) args + i, "ai", 2) == 0) - { + strncasecmp ((char *) args + i, "ai", 2) == 0) { autoindent = (i == 2) ? 0 : 1; - } + } if (strncasecmp ((char *) args + i, "flash", 5) == 0 || - strncasecmp ((char *) args + i, "fl", 2) == 0) - { + strncasecmp ((char *) args + i, "fl", 2) == 0) { err_method = (i == 2) ? 0 : 1; - } + } if (strncasecmp ((char *) args + i, "ignorecase", 10) == 0 || - strncasecmp ((char *) args + i, "ic", 2) == 0) - { + strncasecmp ((char *) args + i, "ic", 2) == 0) { ignorecase = (i == 2) ? 0 : 1; - } + } if (strncasecmp ((char *) args + i, "showmatch", 9) == 0 || - strncasecmp ((char *) args + i, "sm", 2) == 0) - { + strncasecmp ((char *) args + i, "sm", 2) == 0) { showmatch = (i == 2) ? 0 : 1; - } - if (strncasecmp ((char *) args + i, "tabstop", 7) == 0) - { + } + if (strncasecmp ((char *) args + i, "tabstop", 7) == 0) { sscanf (strchr ((char *) args + i, '='), "=%d", &ch); if (ch > 0 && ch < columns - 1) tabstop = ch; - } + } #endif /* BB_FEATURE_VI_SETOPTS */ #endif /* BB_FEATURE_VI_SET */ #ifdef BB_FEATURE_VI_SEARCH - } - else if (strncasecmp ((char *) cmd, "s", 1) == 0) - { // substitute a pattern with a replacement pattern + } else if (strncasecmp ((char *) cmd, "s", 1) == 0) { // substitute a pattern with a replacement pattern Byte *ls, *F, *R; int gflag; @@ -2339,118 +2076,97 @@ colon (Byte * buf) c = orig_buf[1]; // what is the delimiter F = orig_buf + 2; // start of "find" R = (Byte *) strchr ((char *) F, c); // middle delimiter - if (!R) - goto colon_s_fail; + if (!R) goto colon_s_fail; *R++ = '\0'; // terminate "find" buf1 = (Byte *) strchr ((char *) R, c); - if (!buf1) - goto colon_s_fail; + if (!buf1) goto colon_s_fail; *buf1++ = '\0'; // terminate "replace" - if (*buf1 == 'g') - { // :s/foo/bar/g + if (*buf1 == 'g') { // :s/foo/bar/g buf1++; gflag++; // turn on gflag - } + } q = begin_line (q); - if (b < 0) - { // maybe :s/foo/bar/ + if (b < 0) { // maybe :s/foo/bar/ q = begin_line (dot); // start with cur line b = count_lines (text, q); // cur line number - } + } if (e < 0) e = b; // maybe :.s/foo/bar/ - for (i = b; i <= e; i++) - { // so, :20,23 s \0 find \0 replace \0 + for (i = b; i <= e; i++) { // so, :20,23 s \0 find \0 replace \0 ls = q; // orig line start vc4: buf1 = char_search (q, F, FORWARD, LIMITED); // search cur line only for "find" - if (buf1 != NULL) - { + if (buf1 != NULL) { // we found the "find" pattern- delete it (void) text_hole_delete (buf1, buf1 + strlen ((char *) F) - 1); // inset the "replace" patern (void) string_insert (buf1, R); // insert the string // check for "global" :s/foo/bar/g - if (gflag == 1) - { - if ((buf1 + strlen ((char *) R)) < end_line (ls)) - { + if (gflag == 1) { + if ((buf1 + strlen ((char *) R)) < end_line(ls)) { q = buf1 + strlen ((char *) R); goto vc4; // don't let q move past cur line - } - } - } + } + } + } q = next_line (ls); - } + } #endif /* BB_FEATURE_VI_SEARCH */ - } - else if (strncasecmp ((char *) cmd, "version", i) == 0) - { // show software version + } else if (strncasecmp ((char *) cmd, "version", i) == 0) { // show software version psb ("%s", vi_Version); - } - else if ((strncasecmp ((char *) cmd, "write", i) == 0) || // write text to file - (strncasecmp ((char *) cmd, "wq", i) == 0)) - { // write text to file + } else if ((strncasecmp ((char *) cmd, "write", i) == 0) || // write text to file + (strncasecmp ((char *) cmd, "wq", i) == 0)) { // write text to file // is there a file name to write to? /* if (strlen((char *) args) > 0) { fn = args; } */ #ifdef BB_FEATURE_VI_READONLY - if ((vi_readonly == TRUE || readonly == TRUE) && useforce == FALSE) - { + if ((vi_readonly == TRUE || readonly == TRUE) && useforce == FALSE) { psbs ("\"%s\" File is read only", fn); goto vc3; - } + } #endif /* BB_FEATURE_VI_READONLY */ // how many lines in text[]? li = count_lines (q, r); ch = r - q + 1; // see if file exists- if not, its just a new file request - if (useforce == TRUE) - { + if (useforce == TRUE) { // if "fn" is not write-able, chmod u+w // sprintf(syscmd, "chmod u+w %s", fn); // system(syscmd); forced = TRUE; - } + } l = file_write (fn, q, r); - if (useforce == TRUE && forced == TRUE) - { + if (useforce == TRUE && forced == TRUE) { // chmod u-w // sprintf(syscmd, "chmod u-w %s", fn); // system(syscmd); forced = FALSE; - } + } psb ("\"%s\" %dL, %dC", fn, li, l); if (q == text && r == end - 1 && l == ch) file_modified = FALSE; - if (cmd[1] == 'q' && l == ch) - { + if (cmd[1] == 'q' && l == ch) { editing = 0; - } + } #ifdef BB_FEATURE_VI_READONLY vc3:; #endif /* BB_FEATURE_VI_READONLY */ #ifdef BB_FEATURE_VI_YANKMARK - } - else if (strncasecmp ((char *) cmd, "yank", i) == 0) - { // yank lines - if (b < 0) - { // no addr given- use defaults + } else if (strncasecmp ((char *) cmd, "yank", i) == 0) { // yank lines + if (b < 0) { // no addr given- use defaults q = begin_line (dot); // assume .,. for the range r = end_line (dot); - } + } text_yank (q, r, YDreg); li = count_lines (q, r); psb ("Yank %d lines (%d chars) into [%c]", li, strlen ((char *) reg[YDreg]), what_reg ()); #endif /* BB_FEATURE_VI_YANKMARK */ - } - else - { + } else { // cmd unknown ni ((Byte *) cmd); - } + } vc1: dot = bound_dot (dot); // make sure "dot" is valid return; @@ -2462,8 +2178,7 @@ colon_s_fail: } -static void -Hit_Return (void) +static void Hit_Return(void) { char c; @@ -2477,8 +2192,7 @@ Hit_Return (void) #endif /* BB_FEATURE_VI_COLON */ //----- Synchronize the cursor to Dot -------------------------- -static void -sync_cursor (Byte * d, int *row, int *col) +static void sync_cursor(Byte * d, int *row, int *col) { Byte *beg_cur, *end_cur; // begin and end of "d" line Byte *beg_scr, *end_scr; // begin and end of screen @@ -2491,42 +2205,35 @@ sync_cursor (Byte * d, int *row, int *col) beg_scr = end_scr = screenbegin; // first char of screen end_scr = end_screen (); // last char of screen - if (beg_cur < screenbegin) - { + if (beg_cur < screenbegin) { // "d" is before top line on screen // how many lines do we have to move cnt = count_lines (beg_cur, screenbegin); sc1: screenbegin = beg_cur; - if (cnt > (rows - 1) / 2) - { + if (cnt > (rows - 1) / 2) { // we moved too many lines. put "dot" in middle of screen - for (cnt = 0; cnt < (rows - 1) / 2; cnt++) - { + for (cnt = 0; cnt < (rows - 1) / 2; cnt++) { screenbegin = prev_line (screenbegin); - } - } - } - else if (beg_cur > end_scr) - { + } + } + } else if (beg_cur > end_scr) { // "d" is after bottom line on screen // how many lines do we have to move cnt = count_lines (end_scr, beg_cur); if (cnt > (rows - 1) / 2) goto sc1; // too many lines - for (ro = 0; ro < cnt - 1; ro++) - { + for (ro = 0; ro < cnt - 1; ro++) { // move screen begin the same amount screenbegin = next_line (screenbegin); // now, move the end of screen end_scr = next_line (end_scr); end_scr = end_line (end_scr); - } - } + } + } // "d" is on screen- find out which row tp = screenbegin; - for (ro = 0; ro < rows - 1; ro++) - { // drive "ro" to correct row + for (ro = 0; ro < rows - 1; ro++) { // drive "ro" to correct row if (tp == beg_cur) break; tp = next_line (tp); @@ -2534,21 +2241,16 @@ sync_cursor (Byte * d, int *row, int *col) // find out what col "d" is on co = 0; - do - { // drive "co" to correct column + do { // drive "co" to correct column if (*tp == '\n' || *tp == '\0') break; - if (*tp == '\t') - { + if (*tp == '\t') { // 7 - (co % 8 ) co += ((tabstop - 1) - (co % tabstop)); - } - else if (*tp < ' ') - { + } else if (*tp < ' ') { co++; // display as ^X, use 2 columns - } - } - while (tp++ < d && ++co); + } + } while (tp++ < d && ++co); // "co" is the column where "dot" is. // The screen has "columns" columns. @@ -2563,20 +2265,17 @@ sync_cursor (Byte * d, int *row, int *col) // If the first char of a line is a tab the cursor will try to stay // in column 7, but we have to set offset to 0. - if (co < 0 + offset) - { + if (co < 0 + offset) { offset = co; - } - if (co >= columns + offset) - { + } + if (co >= columns + offset) { offset = co - columns + 1; - } + } // if the first char of the line is a tab, and "dot" is sitting on it // force offset to 0. - if (d == beg_cur && *d == '\t') - { + if (d == beg_cur && *d == '\t') { offset = 0; - } + } co -= offset; *row = ro; @@ -2584,24 +2283,21 @@ sync_cursor (Byte * d, int *row, int *col) } //----- Text Movement Routines --------------------------------- -static Byte * -begin_line (Byte * p) // return pointer to first char cur line +static Byte *begin_line(Byte * p) // return pointer to first char cur line { while (p > text && p[-1] != '\n') p--; // go to cur line B-o-l return (p); } -static Byte * -end_line (Byte * p) // return pointer to NL of cur line line +static Byte *end_line(Byte * p) // return pointer to NL of cur line line { while (p < end - 1 && *p != '\n') p++; // go to cur line E-o-l return (p); } -static Byte * -dollar_line (Byte * p) // return pointer to just before NL line +static Byte *dollar_line(Byte * p) // return pointer to just before NL line { while (p < end - 1 && *p != '\n') p++; // go to cur line E-o-l @@ -2611,8 +2307,7 @@ dollar_line (Byte * p) // return pointer to just before NL line return (p); } -static Byte * -prev_line (Byte * p) // return pointer first char prev line +static Byte *prev_line(Byte * p) // return pointer first char prev line { p = begin_line (p); // goto begining of cur line if (p[-1] == '\n' && p > text) @@ -2621,8 +2316,7 @@ prev_line (Byte * p) // return pointer first char prev line return (p); } -static Byte * -next_line (Byte * p) // return pointer first char next line +static Byte *next_line(Byte * p) // return pointer first char next line { p = end_line (p); if (*p == '\n' && p < end - 1) @@ -2631,8 +2325,7 @@ next_line (Byte * p) // return pointer first char next line } //----- Text Information Routines ------------------------------ -static Byte * -end_screen (void) +static Byte *end_screen(void) { Byte *q; int cnt; @@ -2645,124 +2338,102 @@ end_screen (void) return (q); } -static int -count_lines (Byte * start, Byte * stop) // count line from start to stop +static int count_lines(Byte * start, Byte * stop) // count line from start to stop { Byte *q; int cnt; - if (stop < start) - { // start and stop are backwards- reverse them + if (stop < start) { // start and stop are backwards- reverse them q = start; start = stop; stop = q; - } + } cnt = 0; stop = end_line (stop); // get to end of this line - for (q = start; q <= stop && q <= end - 1; q++) - { + for (q = start; q <= stop && q <= end - 1; q++) { if (*q == '\n') cnt++; - } + } return (cnt); } -static Byte * -find_line (int li) // find begining of line #li +static Byte *find_line(int li) // find begining of line #li { Byte *q; - for (q = text; li > 1; li--) - { + for (q = text; li > 1; li--) { q = next_line (q); - } + } return (q); } //----- Dot Movement Routines ---------------------------------- -static void -dot_left (void) +static void dot_left(void) { if (dot > text && dot[-1] != '\n') dot--; } -static void -dot_right (void) +static void dot_right(void) { if (dot < end - 1 && *dot != '\n') dot++; } -static void -dot_begin (void) +static void dot_begin(void) { dot = begin_line (dot); // return pointer to first char cur line } -static void -dot_end (void) +static void dot_end(void) { dot = end_line (dot); // return pointer to last char cur line } -static Byte * -move_to_col (Byte * p, int l) +static Byte *move_to_col(Byte * p, int l) { int co; p = begin_line (p); co = 0; - do - { + do { if (*p == '\n' || *p == '\0') break; - if (*p == '\t') - { + if (*p == '\t') { // 7 - (co % 8 ) co += ((tabstop - 1) - (co % tabstop)); - } - else if (*p < ' ') - { + } else if (*p < ' ') { co++; // display as ^X, use 2 columns - } - } - while (++co <= l && p++ < end); + } + } while (++co <= l && p++ < end); return (p); } -static void -dot_next (void) +static void dot_next(void) { dot = next_line (dot); } -static void -dot_prev (void) +static void dot_prev(void) { dot = prev_line (dot); } -static void -dot_scroll (int cnt, int dir) +static void dot_scroll(int cnt, int dir) { Byte *q; - for (; cnt > 0; cnt--) - { - if (dir < 0) - { + for (; cnt > 0; cnt--) { + if (dir < 0) { // scroll Backwards // ctrl-Y scroll up one line screenbegin = prev_line (screenbegin); - } - else - { + } else { // scroll Forwards // ctrl-E scroll down one line screenbegin = next_line (screenbegin); - } - } + } + } // make sure "dot" stays on the screen so we dont scroll off if (dot < screenbegin) dot = screenbegin; @@ -2772,33 +2443,28 @@ dot_scroll (int cnt, int dir) dot_skip_over_ws (); } -static void -dot_skip_over_ws (void) +static void dot_skip_over_ws(void) { // skip WS while (isspace (*dot) && *dot != '\n' && dot < end - 1) dot++; } -static void -dot_delete (void) // delete the char at 'dot' +static void dot_delete(void) // delete the char at 'dot' { (void) text_hole_delete (dot, dot); } -static Byte * -bound_dot (Byte * p) // make sure text[0] <= P < "end" +static Byte *bound_dot(Byte * p) // make sure text[0] <= P < "end" { - if (p >= end && end > text) - { + if (p >= end && end > text) { p = end - 1; indicate_error ('1'); - } - if (p < text) - { + } + if (p < text) { p = text; indicate_error ('2'); - } + } return (p); } @@ -2815,8 +2481,7 @@ bound_dot (Byte * p) // make sure text[0] <= P < "end" * DO NOT COUNT NEWLINE AS WHITESPACE */ -static Byte * -new_screen (int ro, int co) +static Byte *new_screen(int ro, int co) { int li; @@ -2827,23 +2492,20 @@ new_screen (int ro, int co) // initialize the new screen. assume this will be a empty file. screen_erase (); // non-existant text[] lines start with a tilde (~). - for (li = 1; li < ro - 1; li++) - { + for (li = 1; li < ro - 1; li++) { screen[(li * co) + 0] = '~'; - } + } return (screen); } -static Byte * -new_text (int size) +static Byte *new_text(int size) { if (size < 10240) size = 10240; // have a minimum size for new files - if (text != 0) - { + if (text != 0) { //text -= 4; free (text); - } + } text = (Byte *) malloc (size + 8); memset (text, '\0', size); // clear new text[] //text += 4; // leave some room for "oops" @@ -2853,55 +2515,45 @@ new_text (int size) } #ifdef BB_FEATURE_VI_SEARCH -static int -mycmp (Byte * s1, Byte * s2, int len) +static int mycmp(Byte * s1, Byte * s2, int len) { int i; i = strncmp ((char *) s1, (char *) s2, len); #ifdef BB_FEATURE_VI_SETOPTS - if (ignorecase) - { + if (ignorecase) { i = strncasecmp ((char *) s1, (char *) s2, len); - } + } #endif /* BB_FEATURE_VI_SETOPTS */ return (i); } -static Byte * -char_search (Byte * p, Byte * pat, int dir, int range) // search for pattern starting at p +static Byte *char_search(Byte * p, Byte * pat, int dir, int range) // search for pattern starting at p { #ifndef REGEX_SEARCH Byte *start, *stop; int len; len = strlen ((char *) pat); - if (dir == FORWARD) - { + if (dir == FORWARD) { stop = end - 1; // assume range is p - end-1 if (range == LIMITED) stop = next_line (p); // range is to next line - for (start = p; start < stop; start++) - { - if (mycmp (start, pat, len) == 0) - { + for (start = p; start < stop; start++) { + if (mycmp (start, pat, len) == 0) { return (start); - } - } - } - else if (dir == BACK) - { + } + } + } else if (dir == BACK) { stop = text; // assume range is text - p if (range == LIMITED) stop = prev_line (p); // range is to prev line - for (start = p - len; start >= stop; start--) - { - if (mycmp (start, pat, len) == 0) - { + for (start = p - len; start >= stop; start--) { + if (mycmp (start, pat, len) == 0) { return (start); - } - } - } + } + } + } // pattern not found return (NULL); #else /*REGEX_SEARCH */ @@ -2920,11 +2572,10 @@ char_search (Byte * p, Byte * pat, int dir, int range) // search for pattern st q = next_line (p); q = end_line (q); q = end - 1; - if (dir == BACK) - { + if (dir == BACK) { q = prev_line (p); q = text; - } + } // count the number of chars to search over, forward or backward size = q - p; if (size < 0) @@ -2933,21 +2584,19 @@ char_search (Byte * p, Byte * pat, int dir, int range) // search for pattern st range = q - p; q = (char *) re_compile_pattern (pat, strlen ((char *) pat), &preg); - if (q != 0) - { + if (q != 0) { // The pattern was not compiled psbs ("bad search pattern: \"%s\": %s", pat, q); i = 0; // return p if pattern not compiled goto cs1; - } + } q = p; - if (range < 0) - { + if (range < 0) { q = p - size; if (q < text) q = text; - } + } // search for the compiled pattern, preg, in p[] // range < 0- search backward // range > 0- search forward @@ -2957,30 +2606,24 @@ char_search (Byte * p, Byte * pat, int dir, int range) // search for pattern st // struct pattern char int int int struct reg // re_search (*pattern_buffer, *string, size, start, range, *regs) i = re_search (&preg, q, size, 0, range, 0); - if (i == -1) - { + if (i == -1) { p = 0; i = 0; // return NULL if pattern not found - } + } cs1: - if (dir == FORWARD) - { + if (dir == FORWARD) { p = p + i; - } - else - { + } else { p = p - i; - } + } return (p); #endif /*REGEX_SEARCH */ } #endif /* BB_FEATURE_VI_SEARCH */ -static Byte * -char_insert (Byte * p, Byte c) // insert the char c at 'p' +static Byte *char_insert(Byte * p, Byte c) // insert the char c at 'p' { - if (c == 22) - { // Is this an ctrl-V? + if (c == 22) { // Is this an ctrl-V? p = stupid_insert (p, '^'); // use ^ to indicate literal next p--; // backup onto ^ refresh (FALSE); // show the ^ @@ -2988,40 +2631,31 @@ char_insert (Byte * p, Byte c) // insert the char c at 'p' *p = c; p++; file_modified = TRUE; // has the file been modified - } - else if (c == 27) - { // Is this an ESC? + } else if (c == 27) { // Is this an ESC? cmd_mode = 0; cmdcnt = 0; end_cmd_q (); // stop adding to q strcpy ((char *) status_buffer, " "); // clear the status buffer - if ((p[-1] != '\n') && (dot > text)) - { + if ((p[-1] != '\n') && (dot > text)) { p--; - } - } - else if (c == erase_char) - { // Is this a BS + } + } else if (c == erase_char) { // Is this a BS // 123456789 - if ((p[-1] != '\n') && (dot > text)) - { + if ((p[-1] != '\n') && (dot > text)) { p--; p = text_hole_delete (p, p); // shrink buffer 1 char #ifdef BB_FEATURE_VI_DOT_CMD // also rmove char from last_modifying_cmd - if (strlen ((char *) last_modifying_cmd) > 0) - { + if (strlen((char *) last_modifying_cmd) > 0) { Byte *q; q = last_modifying_cmd; q[strlen ((char *) q) - 1] = '\0'; // erase BS q[strlen ((char *) q) - 1] = '\0'; // erase prev char - } + } #endif /* BB_FEATURE_VI_DOT_CMD */ - } - } - else - { + } + } else { // insert a char into text[] Byte *sp; // "save p" @@ -3030,40 +2664,34 @@ char_insert (Byte * p, Byte c) // insert the char c at 'p' sp = p; // remember addr of insert p = stupid_insert (p, c); // insert the char #ifdef BB_FEATURE_VI_SETOPTS - if (showmatch && strchr (")]}", *sp) != NULL) - { + if (showmatch && strchr (")]}", *sp) != NULL) { showmatching (sp); - } - if (autoindent && c == '\n') - { // auto indent the new line + } + if (autoindent && c == '\n') { // auto indent the new line Byte *q; q = prev_line (p); // use prev line as templet - for (; isblnk (*q); q++) - { + for (; isblnk (*q); q++) { p = stupid_insert (p, *q); // insert the char - } - } + } + } #endif /* BB_FEATURE_VI_SETOPTS */ } return (p); } -static Byte * -stupid_insert (Byte * p, Byte c) // stupidly insert the char c at 'p' +static Byte *stupid_insert(Byte * p, Byte c) // stupidly insert the char c at 'p' { p = text_hole_make (p, 1); - if (p != 0) - { + if (p != 0) { *p = c; file_modified = TRUE; // has the file been modified p++; - } + } return (p); } -static Byte -find_range (Byte ** start, Byte ** stop, Byte c) +static Byte find_range(Byte ** start, Byte ** stop, Byte c) { Byte *save_dot, *p, *q; int cnt; @@ -3071,65 +2699,51 @@ find_range (Byte ** start, Byte ** stop, Byte c) save_dot = dot; p = q = dot; - if (strchr ("cdy><", c)) - { + if (strchr ("cdy><", c)) { // these cmds operate on whole lines p = q = begin_line (p); - for (cnt = 1; cnt < cmdcnt; cnt++) - { + for (cnt = 1; cnt < cmdcnt; cnt++) { q = next_line (q); - } + } q = end_line (q); - } - else if (strchr ("^%$0bBeEft", c)) - { + } else if (strchr ("^%$0bBeEft", c)) { // These cmds operate on char positions do_cmd (c); // execute movement cmd q = dot; - } - else if (strchr ("wW", c)) - { + } else if (strchr ("wW", c)) { do_cmd (c); // execute movement cmd if (dot > text) dot--; // move back off of next word if (dot > text && *dot == '\n') dot--; // stay off NL q = dot; - } - else if (strchr ("H-k{", c)) - { + } else if (strchr ("H-k{", c)) { // these operate on multi-lines backwards q = end_line (dot); // find NL do_cmd (c); // execute movement cmd dot_begin (); p = dot; - } - else if (strchr ("L+j}\r\n", c)) - { + } else if (strchr ("L+j}\r\n", c)) { // these operate on multi-lines forwards p = begin_line (dot); do_cmd (c); // execute movement cmd dot_end (); // find NL q = dot; - } - else - { + } else { c = 27; // error- return an ESC char //break; - } + } *start = p; *stop = q; - if (q < p) - { + if (q < p) { *start = q; *stop = p; - } + } dot = save_dot; return (c); } -static int -st_test (Byte * p, int type, int dir, Byte * tested) +static int st_test(Byte * p, int type, int dir, Byte * tested) { Byte c, c0, ci; int test, inc; @@ -3139,42 +2753,35 @@ st_test (Byte * p, int type, int dir, Byte * tested) ci = p[inc]; test = 0; - if (type == S_BEFORE_WS) - { + if (type == S_BEFORE_WS) { c = ci; test = ((!isspace (c)) || c == '\n'); - } - if (type == S_TO_WS) - { + } + if (type == S_TO_WS) { c = c0; test = ((!isspace (c)) || c == '\n'); - } - if (type == S_OVER_WS) - { + } + if (type == S_OVER_WS) { c = c0; test = ((isspace (c))); - } - if (type == S_END_PUNCT) - { + } + if (type == S_END_PUNCT) { c = ci; test = ((ispunct (c))); - } - if (type == S_END_ALNUM) - { + } + if (type == S_END_ALNUM) { c = ci; test = ((isalnum (c)) || c == '_'); - } + } *tested = c; return (test); } -static Byte * -skip_thing (Byte * p, int linecnt, int dir, int type) +static Byte *skip_thing(Byte * p, int linecnt, int dir, int type) { Byte c; - while (st_test (p, type, dir, &c)) - { + while (st_test(p, type, dir, &c)) { // make sure we limit search to correct number of lines if (c == '\n' && --linecnt < 1) break; @@ -3183,13 +2790,12 @@ skip_thing (Byte * p, int linecnt, int dir, int type) if (dir < 0 && p <= text) break; p += dir; // move to next char - } + } return (p); } // find matching char of pair () [] {} -static Byte * -find_pair (Byte * p, Byte c) +static Byte *find_pair(Byte * p, Byte c) { Byte match, *q; int dir, level; @@ -3197,8 +2803,7 @@ find_pair (Byte * p, Byte c) match = ')'; level = 1; dir = 1; // assume forward - switch (c) - { + switch (c) { case '(': match = ')'; break; @@ -3220,9 +2825,8 @@ find_pair (Byte * p, Byte c) match = '{'; dir = -1; break; - } - for (q = p + dir; text <= q && q < end; q += dir) - { + } + for (q = p + dir; text <= q && q < end; q += dir) { // look for match, count levels of pairs (( )) if (*q == c) level++; // increase pair levels @@ -3230,7 +2834,7 @@ find_pair (Byte * p, Byte c) level--; // reduce pair level if (level == 0) break; // found matching pair - } + } if (level != 0) q = NULL; // indicate no match return (q); @@ -3238,19 +2842,15 @@ find_pair (Byte * p, Byte c) #ifdef BB_FEATURE_VI_SETOPTS // show the matching char of a pair, () [] {} -static void -showmatching (Byte * p) +static void showmatching(Byte * p) { Byte *q, *save_dot; // we found half of a pair q = find_pair (p, *p); // get loc of matching char - if (q == NULL) - { + if (q == NULL) { indicate_error ('3'); // no matching char - } - else - { + } else { // "q" now points to matching pair save_dot = dot; // remember where we are dot = q; // go to new loc @@ -3258,13 +2858,12 @@ showmatching (Byte * p) (void) mysleep (40); // give user some time dot = save_dot; // go back to old loc refresh (FALSE); - } + } } #endif /* BB_FEATURE_VI_SETOPTS */ // open a hole in text[] -static Byte * -text_hole_make (Byte * p, int size) // at "p", make a 'size' byte hole +static Byte *text_hole_make(Byte * p, int size) // at "p", make a 'size' byte hole { Byte *src, *dest; int cnt; @@ -3274,10 +2873,9 @@ text_hole_make (Byte * p, int size) // at "p", make a 'size' byte hole src = p; dest = p + size; cnt = end - src; // the rest of buffer - if (memmove (dest, src, cnt) != dest) - { + if (memmove(dest, src, cnt) != dest) { psbs ("can't create room for new characters"); - } + } memset (p, ' ', size); // clear new hole end = end + size; // adjust the new END file_modified = TRUE; // has the file been modified @@ -3286,8 +2884,7 @@ thm0: } // close a hole in text[] -static Byte * -text_hole_delete (Byte * p, Byte * q) // delete "p" thru "q", inclusive +static Byte *text_hole_delete(Byte * p, Byte * q) // delete "p" thru "q", inclusive { Byte *src, *dest; int cnt, hole_size; @@ -3296,11 +2893,10 @@ text_hole_delete (Byte * p, Byte * q) // delete "p" thru "q", inclusive // assume p <= q src = q + 1; dest = p; - if (q < p) - { // they are backward- swap them + if (q < p) { // they are backward- swap them src = p + 1; dest = q; - } + } hole_size = q - p + 1; cnt = end - src; if (src < text || src > end) @@ -3309,10 +2905,9 @@ text_hole_delete (Byte * p, Byte * q) // delete "p" thru "q", inclusive goto thd0; if (src >= end) goto thd_atend; // just delete the end of the buffer - if (memmove (dest, src, cnt) != dest) - { + if (memmove(dest, src, cnt) != dest) { psbs ("can't delete the character"); - } + } thd_atend: end = end - hole_size; // adjust the new END if (dest >= end) @@ -3327,48 +2922,41 @@ thd0: // copy text into register, then delete text. // if dist <= 0, do not include, or go past, a NewLine // -static Byte * -yank_delete (Byte * start, Byte * stop, int dist, int yf) +static Byte *yank_delete(Byte * start, Byte * stop, int dist, int yf) { Byte *p; // make sure start <= stop - if (start > stop) - { + if (start > stop) { // they are backwards, reverse them p = start; start = stop; stop = p; - } - if (dist <= 0) - { + } + if (dist <= 0) { // we can not cross NL boundaries p = start; if (*p == '\n') return (p); // dont go past a NewLine - for (; p + 1 <= stop; p++) - { - if (p[1] == '\n') - { + for (; p + 1 <= stop; p++) { + if (p[1] == '\n') { stop = p; // "stop" just before NewLine break; - } - } - } + } + } + } p = start; #ifdef BB_FEATURE_VI_YANKMARK text_yank (start, stop, YDreg); #endif /* BB_FEATURE_VI_YANKMARK */ - if (yf == YANKDEL) - { + if (yf == YANKDEL) { p = text_hole_delete (start, stop); - } // delete lines + } // delete lines return (p); } -static void -show_help (void) +static void show_help(void) { fprintf (stderr, "version: %s\n", vi_Version); puts ("These features are available:" @@ -3379,7 +2967,8 @@ show_help (void) "\n\tLast command repeat with \'.\'" #endif /* BB_FEATURE_VI_DOT_CMD */ #ifdef BB_FEATURE_VI_YANKMARK - "\n\tLine marking with 'x" "\n\tNamed buffers with \"x" + "\n\tLine marking with 'x" + "\n\tNamed buffers with \"x" #endif /* BB_FEATURE_VI_YANKMARK */ #ifdef BB_FEATURE_VI_READONLY "\n\tReadonly if vi is called as \"view\"" @@ -3392,7 +2981,8 @@ show_help (void) "\n\tSettable options with \":set\"" #endif /* BB_FEATURE_VI_SETOPTS */ #ifdef BB_FEATURE_VI_USE_SIGNALS - "\n\tSignal catching- ^C" "\n\tJob suspend and resume with ^Z" + "\n\tSignal catching- ^C" + "\n\tJob suspend and resume with ^Z" #endif /* BB_FEATURE_VI_USE_SIGNALS */ #ifdef BB_FEATURE_VI_WIN_RESIZE "\n\tAdapt to window re-sizes" @@ -3400,8 +2990,7 @@ show_help (void) ); } -static void -print_literal (Byte * buf, Byte * s) // copy s to buf, convert unprintable +static void print_literal(Byte * buf, Byte * s) // copy s to buf, convert unprintable { Byte c, b[2]; @@ -3409,33 +2998,28 @@ print_literal (Byte * buf, Byte * s) // copy s to buf, convert unprintable strcpy ((char *) buf, ""); // init buf if (strlen ((char *) s) <= 0) s = (Byte *) "(NULL)"; - for (; *s > '\0'; s++) - { + for (; *s > '\0'; s++) { c = *s; - if (*s > '~') - { - strcat ((char *) buf, SOs); + if (*s > '~') { + strlcat((char *) buf, SOs, BUFSIZ); /* FIXED strlcat BUFSIZ */ c = *s - 128; - } - if (*s < ' ') - { + } + if (*s < ' ') { strcat ((char *) buf, "^"); c += '@'; - } + } b[0] = c; - strcat ((char *) buf, (char *) b); + strlcat((char *) buf, (char *) b, BUFSIZ); /* FIXED added BUFSIZ and converted to strlcat() */ if (*s > '~') - strcat ((char *) buf, SOn); - if (*s == '\n') - { + strlcat((char *) buf, SOn, BUFSIZ); /* FIXED strlcat BUFSIZ */ + if (*s == '\n') { strcat ((char *) buf, "$"); - } - } + } + } } #ifdef BB_FEATURE_VI_DOT_CMD -static void -start_new_cmd_q (Byte c) +static void start_new_cmd_q(Byte c) { // release old cmd if (last_modifying_cmd != 0) @@ -3452,8 +3036,7 @@ start_new_cmd_q (Byte c) return; } -static void -end_cmd_q () +static void end_cmd_q() { #ifdef BB_FEATURE_VI_YANKMARK YDreg = 26; // go back to default Yank/Delete reg @@ -3464,19 +3047,17 @@ end_cmd_q () #endif /* BB_FEATURE_VI_DOT_CMD */ #if defined(BB_FEATURE_VI_YANKMARK) || defined(BB_FEATURE_VI_COLON) || defined(BB_FEATURE_VI_CRASHME) -static Byte * -string_insert (Byte * p, Byte * s) // insert the string at 'p' +static Byte * string_insert(Byte * p, Byte * s) // insert the string at 'p' { int cnt, i; i = strlen ((char *) s); p = text_hole_make (p, i); strncpy ((char *) p, (char *) s, i); - for (cnt = 0; *s != '\0'; s++) - { + for (cnt = 0; *s != '\0'; s++) { if (*s == '\n') cnt++; - } + } #ifdef BB_FEATURE_VI_YANKMARK psb ("Put %d lines (%d chars) from [%c]", cnt, i, what_reg ()); #endif /* BB_FEATURE_VI_YANKMARK */ @@ -3485,24 +3066,21 @@ string_insert (Byte * p, Byte * s) // insert the string at 'p' #endif /* BB_FEATURE_VI_YANKMARK || BB_FEATURE_VI_COLON || BB_FEATURE_VI_CRASHME */ #ifdef BB_FEATURE_VI_YANKMARK -static Byte * -text_yank (Byte * p, Byte * q, int dest) // copy text into a register +static Byte *text_yank(Byte * p, Byte * q, int dest) // copy text into a register { Byte *t; int cnt; - if (q < p) - { // they are backwards- reverse them + if (q < p) { // they are backwards- reverse them t = q; q = p; p = t; - } + } cnt = q - p + 1; t = reg[dest]; - if (t != 0) - { // if already a yank register + if (t != 0) { // if already a yank register free (t); // free it - } + } t = (Byte *) malloc (cnt + 1); // get a new register memset (t, '\0', cnt + 1); // clear new text[] strncpy ((char *) t, (char *) p, cnt); // copy text[] into bufer @@ -3510,8 +3088,7 @@ text_yank (Byte * p, Byte * q, int dest) // copy text into a register return (p); } -static Byte -what_reg (void) +static Byte what_reg(void) { Byte c; int i; @@ -3527,57 +3104,50 @@ what_reg (void) return (c); } -static void -check_context (Byte cmd) +static void check_context(Byte cmd) { // A context is defined to be "modifying text" // Any modifying command establishes a new context. - if (dot < context_start || dot > context_end) - { - if (strchr ((char *) modifying_cmds, cmd) != NULL) - { + if (dot < context_start || dot > context_end) { + if (strchr((char *) modifying_cmds, cmd) != NULL) { // we are trying to modify text[]- make this the current context mark[27] = mark[26]; // move cur to prev mark[26] = dot; // move local to cur context_start = prev_line (prev_line (dot)); context_end = next_line (next_line (dot)); //loiter= start_loiter= now; - } - } + } + } return; } -static Byte * -swap_context (Byte * p) // goto new context for '' command make this the current context +static Byte *swap_context(Byte * p) // goto new context for '' command make this the current context { Byte *tmp; // the current context is in mark[26] // the previous context is in mark[27] // only swap context if other context is valid - if (text <= mark[27] && mark[27] <= end - 1) - { + if (text <= mark[27] && mark[27] <= end - 1) { tmp = mark[27]; mark[27] = mark[26]; mark[26] = tmp; p = mark[26]; // where we are going- previous context context_start = prev_line (prev_line (prev_line (p))); context_end = next_line (next_line (next_line (p))); - } + } return (p); } #endif /* BB_FEATURE_VI_YANKMARK */ -static int -isblnk (Byte c) // is the char a blank or tab +static int isblnk(Byte c) // is the char a blank or tab { return (c == ' ' || c == '\t'); } //----- Set terminal attributes -------------------------------- -static void -rawmode (void) +static void rawmode(void) { tcgetattr (0, &term_orig); term_vi = term_orig; @@ -3592,34 +3162,29 @@ rawmode (void) tcsetattr (0, TCSANOW, &term_vi); } -static void -cookmode (void) +static void cookmode(void) { tcsetattr (0, TCSANOW, &term_orig); } #ifdef BB_FEATURE_VI_WIN_RESIZE //----- See what the window size currently is -------------------- -static void -window_size_get (int sig) +static void window_size_get(int sig) { int i; i = ioctl (0, TIOCGWINSZ, &winsize); - if (i != 0) - { + if (i != 0) { // force 24x80 winsize.ws_row = 24; winsize.ws_col = 80; - } - if (winsize.ws_row <= 1) - { + } + if (winsize.ws_row <= 1) { winsize.ws_row = 24; - } - if (winsize.ws_col <= 1) - { + } + if (winsize.ws_col <= 1) { winsize.ws_col = 80; - } + } rows = (int) winsize.ws_row; columns = (int) winsize.ws_col; } @@ -3627,8 +3192,7 @@ window_size_get (int sig) //----- Come here when we get a window resize signal --------- #ifdef BB_FEATURE_VI_USE_SIGNALS -static void -winch_sig (int sig) +static void winch_sig(int sig) { signal (SIGWINCH, winch_sig); #ifdef BB_FEATURE_VI_WIN_RESIZE @@ -3639,8 +3203,7 @@ winch_sig (int sig) } //----- Come here when we get a continue signal ------------------- -static void -cont_sig (int sig) +static void cont_sig(int sig) { rawmode (); // terminal to "raw" *status_buffer = '\0'; // clear the status buffer @@ -3652,8 +3215,7 @@ cont_sig (int sig) } //----- Come here when we get a Suspend signal ------------------- -static void -suspend_sig (int sig) +static void suspend_sig(int sig) { place_cursor (rows - 1, 0, FALSE); // go to bottom of screen clear_to_eol (); // Erase to end of line @@ -3665,8 +3227,7 @@ suspend_sig (int sig) } //----- Come here when we get a signal --------------------------- -static void -catch_sig (int sig) +static void catch_sig(int sig) { signal (SIGHUP, catch_sig); signal (SIGINT, catch_sig); @@ -3674,16 +3235,14 @@ catch_sig (int sig) longjmp (restart, sig); } -static void -alarm_sig (int sig) +static void alarm_sig(int sig) { signal (SIGALRM, catch_sig); longjmp (restart, sig); } //----- Come here when we get a core dump signal ----------------- -static void -core_sig (int sig) +static void core_sig(int sig) { signal (SIGQUIT, core_sig); signal (SIGILL, core_sig); @@ -3703,8 +3262,7 @@ core_sig (int sig) } #endif /* BB_FEATURE_VI_USE_SIGNALS */ -static int -mysleep (int hund) // sleep for 'h' 1/100 seconds +static int mysleep(int hund) // sleep for 'h' 1/100 seconds { // Don't hang- Wait 5/100 seconds- 1 Sec= 1000000 FD_ZERO (&rfds); @@ -3716,14 +3274,11 @@ mysleep (int hund) // sleep for 'h' 1/100 seconds } //----- IO Routines -------------------------------------------- -static Byte -readit (void) // read (maybe cursor) key from stdin +static Byte readit(void) // read (maybe cursor) key from stdin { Byte c; - int i, bufsiz, cnt; - unsigned int cmdindex; - struct esc_cmds - { + int i, bufsiz, cnt, cmdindex; + struct esc_cmds { Byte *seq; Byte val; }; @@ -3767,13 +3322,11 @@ readit (void) // read (maybe cursor) key from stdin // (void) alarm(0); // turn alarm OFF while we wait for input // get input from User- are there already input chars in Q? bufsiz = strlen ((char *) readbuffer); - if (bufsiz <= 0) - { + if (bufsiz <= 0) { ri0: // the Q is empty, wait for a typed char bufsiz = read (0, readbuffer, BUFSIZ - 1); - if (bufsiz < 0) - { + if (bufsiz < 0) { if (errno == EINTR) goto ri0; // interrupted sys call if (errno == EBADF) @@ -3786,9 +3339,9 @@ readit (void) // read (maybe cursor) key from stdin editing = 0; errno = 0; bufsiz = 0; - } + } readbuffer[bufsiz] = '\0'; - } + } // return char if it is not part of ESC sequence if (readbuffer[0] != 27) goto ri1; @@ -3803,34 +3356,29 @@ readit (void) // read (maybe cursor) key from stdin tv.tv_usec = 50000; // Wait 5/100 seconds- 1 Sec=1000000 // keep reading while there are input chars and room in buffer - while (select (1, &rfds, NULL, NULL, &tv) > 0 && bufsiz <= (BUFSIZ - 5)) - { + while (select(1, &rfds, NULL, NULL, &tv) > 0 && bufsiz <= (BUFSIZ - 5)) { // read the rest of the ESC string i = read (0, (void *) (readbuffer + bufsiz), BUFSIZ - bufsiz); - if (i > 0) - { + if (i > 0) { bufsiz += i; readbuffer[bufsiz] = '\0'; // Terminate the string - } - } + } + } // Maybe cursor or function key? - for (cmdindex = 0; cmdindex < ESCCMDS_COUNT; cmdindex++) - { + for (cmdindex = 0; cmdindex < ESCCMDS_COUNT; cmdindex++) { cnt = strlen ((char *) esccmds[cmdindex].seq); i = strncmp ((char *) esccmds[cmdindex].seq, (char *) readbuffer, cnt); - if (i == 0) - { + if (i == 0) { // is a Cursor key- put derived value back into Q readbuffer[0] = esccmds[cmdindex].val; // squeeze out the ESC sequence - for (i = 1; i < cnt; i++) - { + for (i = 1; i < cnt; i++) { memmove (readbuffer + 1, readbuffer + 2, BUFSIZ - 2); readbuffer[BUFSIZ - 1] = '\0'; - } + } break; - } - } + } + } ri1: c = readbuffer[0]; // remove one char from Q @@ -3841,8 +3389,7 @@ ri1: } //----- IO Routines -------------------------------------------- -static Byte -get_one_char () +static Byte get_one_char() { static Byte c; @@ -3850,82 +3397,77 @@ get_one_char () // ! adding2q && ioq == 0 read() // ! adding2q && ioq != 0 *ioq // adding2q *last_modifying_cmd= read() - if (!adding2q) - { + if (!adding2q) { // we are not adding to the q. // but, we may be reading from a q - if (ioq == 0) - { + if (ioq == 0) { // there is no current q, read from STDIN c = readit (); // get the users input - } - else - { + } else { // there is a queue to get chars from first c = *ioq++; - if (c == '\0') - { + if (c == '\0') { // the end of the q, read from STDIN free (ioq_start); ioq_start = ioq = 0; c = readit (); // get the users input - } - } - } - else - { + } + } + } else { // adding STDIN chars to q c = readit (); // get the users input - if (last_modifying_cmd != 0) - { - // add new char to q - last_modifying_cmd[strlen ((char *) last_modifying_cmd)] = c; - } - } + if (last_modifying_cmd != 0) { + int len = strlen((char *) last_modifying_cmd); + if (len + 1 >= BUFSIZ) { + /* FIXME last_modifying_cmd needs a shaving */ + fprintf(stderr,"last_modifying_cmd overrun"); + exit(EXIT_FAILURE); + } else { + // add new char to q + last_modifying_cmd[len] = c; + } + + } + } #else /* BB_FEATURE_VI_DOT_CMD */ c = readit (); // get the users input #endif /* BB_FEATURE_VI_DOT_CMD */ return (c); // return the char, where ever it came from } -static Byte * -get_input_line (Byte * prompt) // get input line- use "status line" +static Byte *get_input_line(Byte * prompt) // get input line- use "status line" { Byte buf[BUFSIZ]; Byte c; int i; static Byte *obufp = NULL; - strcpy ((char *) buf, (char *) prompt); + /* FIXED strcpy((char *) buf, (char *) prompt); */ + if (strlcpy((char *) buf, (char *) prompt, sizeof((char *)buf)) > sizeof ((char *) buf)) err(1, "strlcpy overflow in function get_input_line"); *status_buffer = '\0'; // clear the status buffer place_cursor (rows - 1, 0, FALSE); // go to Status line, bottom of screen clear_to_eol (); // clear the line write (1, prompt, strlen ((char *) prompt)); // write out the :, /, or ? prompt - for (i = strlen ((char *) buf); i < BUFSIZ;) - { + for (i = strlen ((char *) buf); i < BUFSIZ;) { c = get_one_char (); // read user input if (c == '\n' || c == '\r' || c == 27) break; // is this end of input - if (c == erase_char) - { // user wants to erase prev char + if (c == erase_char) { // user wants to erase prev char i--; // backup to prev char buf[i] = '\0'; // erase the char buf[i + 1] = '\0'; // null terminate buffer write (1, " ", 3); // erase char on screen - if (i <= 0) - { // user backs up before b-o-l, exit + if (i <= 0) { // user backs up before b-o-l, exit break; - } - } - else - { + } + } else { buf[i] = c; // save char in buffer buf[i + 1] = '\0'; // make sure buffer is null terminated write (1, buf + i, 1); // echo the char back to user i++; - } - } + } + } refresh (FALSE); if (obufp != NULL) free (obufp); @@ -3933,8 +3475,7 @@ get_input_line (Byte * prompt) // get input line- use "status line" return (obufp); } -static int -file_size (Byte * fn) // what is the byte size of "fn" +static int file_size(Byte * fn) // what is the byte size of "fn" { struct stat st_buf; int cnt, sr; @@ -3943,15 +3484,13 @@ file_size (Byte * fn) // what is the byte size of "fn" return (-1); cnt = -1; sr = stat ((char *) fn, &st_buf); // see if file exists - if (sr >= 0) - { + if (sr >= 0) { cnt = (int) st_buf.st_size; - } + } return (cnt); } -static int -file_insert (Byte * fn, Byte * p, int size) +static int file_insert(Byte * fn, Byte * p, int size) { int fd, cnt; @@ -3959,82 +3498,70 @@ file_insert (Byte * fn, Byte * p, int size) #ifdef BB_FEATURE_VI_READONLY readonly = FALSE; #endif /* BB_FEATURE_VI_READONLY */ - if (fn == 0 || strlen ((char *) fn) <= 0) - { + if (fn == 0 || strlen ((char *) fn) <= 0) { psbs ("No filename given"); goto fi0; - } - if (size == 0) - { + } + if (size == 0) { // OK- this is just a no-op cnt = 0; goto fi0; - } - if (size < 0) - { + } + if (size < 0) { psbs ("Trying to insert a negative number (%d) of characters", size); goto fi0; - } - if (p < text || p > end) - { + } + if (p < text || p > end) { psbs ("Trying to insert file outside of memory"); goto fi0; - } + } // see if we can open the file #ifdef BB_FEATURE_VI_READONLY - if (vi_readonly == TRUE) - goto fi1; // do not try write-mode + if (vi_readonly == TRUE) goto fi1; // do not try write-mode #endif fd = open ((char *) fn, O_RDWR); // assume read & write - if (fd < 0) - { + if (fd < 0) { // could not open for writing- maybe file is read only #ifdef BB_FEATURE_VI_READONLY fi1: #endif fd = open ((char *) fn, O_RDONLY); // try read-only - if (fd < 0) - { + if (fd < 0) { psbs ("\"%s\" %s", fn, "could not open file"); goto fi0; - } + } #ifdef BB_FEATURE_VI_READONLY // got the file- read-only readonly = TRUE; #endif /* BB_FEATURE_VI_READONLY */ - } + } p = text_hole_make (p, size); cnt = read (fd, p, size); close (fd); - if (cnt < 0) - { + if (cnt < 0) { cnt = -1; p = text_hole_delete (p, p + size - 1); // un-do buffer insert psbs ("could not read file \"%s\"", fn); - } - else if (cnt < size) - { + } else if (cnt < size) { // There was a partial read, shrink unused space text[] p = text_hole_delete (p + cnt, p + (size - cnt) - 1); // un-do buffer insert psbs ("could not read all of file \"%s\"", fn); - } + } if (cnt >= size) file_modified = TRUE; fi0: return (cnt); } -static int -file_write (Byte * fn, Byte * first, Byte * last) +static int file_write(Byte * fn, Byte * first, Byte * last) { int fd, cnt, charcnt; - if (fn == 0) - { + if (fn == 0) { psbs ("No current filename"); return (-1); - } + } charcnt = 0; // FIXIT- use the correct umask() fd = open ((char *) fn, (O_WRONLY | O_CREAT | O_TRUNC), 0664); @@ -4042,15 +3569,12 @@ file_write (Byte * fn, Byte * first, Byte * last) return (-1); cnt = last - first + 1; charcnt = write (fd, first, cnt); - if (charcnt == cnt) - { + if (charcnt == cnt) { // good write //file_modified= FALSE; // the file has not been modified - } - else - { + } else { charcnt = 0; - } + } close (fd); return (charcnt); } @@ -4068,8 +3592,7 @@ file_write (Byte * fn, Byte * first, Byte * last) // //----- Move the cursor to row x col (count from 0, not 1) ------- -static void -place_cursor (int row, int col, int opti) +static void place_cursor(int row, int col, int opti) { char cm1[BUFSIZ]; char *cm; @@ -4083,39 +3606,33 @@ place_cursor (int row, int col, int opti) memset (cm1, '\0', BUFSIZ - 1); // clear the buffer - if (row < 0) - row = 0; - if (row >= rows) - row = rows - 1; - if (col < 0) - col = 0; - if (col >= columns) - col = columns - 1; + if (row < 0) row = 0; + if (row >= rows) row = rows - 1; + if (col < 0) col = 0; + if (col >= columns) col = columns - 1; //----- 1. Try the standard terminal ESC sequence sprintf ((char *) cm1, CMrc, row + 1, col + 1); cm = cm1; - if (opti == FALSE) - goto pc0; + if (opti == FALSE) goto pc0; #ifdef BB_FEATURE_VI_OPTIMIZE_CURSOR //----- find the minimum # of chars to move cursor ------------- //----- 2. Try moving with discreet chars (Newline, [back]space, ...) memset (cm2, '\0', BUFSIZ - 1); // clear the buffer + /* FIXME - possible replace with strlc* ? */ // move to the correct row - while (row < Rrow) - { + while (row < Rrow) { // the cursor has to move up - strcat (cm2, CMup); + strlcat(cm2, CMup, BUFSIZ); /* FIXED strlcat BUFSIZ */ Rrow--; - } - while (row > Rrow) - { + } + while (row > Rrow) { // the cursor has to move down - strcat (cm2, CMdown); + strlcat(cm2, CMdown, BUFSIZ); /* FIXED strlcat BUFSIZE */ Rrow++; - } + } // now move to the correct column strcat (cm2, "\r"); // start at col 0 @@ -4128,50 +3645,43 @@ place_cursor (int row, int col, int opti) // pick the shortest cursor motion to send out cm = cm1; - if (strlen (cm2) < strlen (cm)) - { + if (strlen (cm2) < strlen (cm)) { cm = cm2; - } /* else if (strlen(cm3) < strlen(cm)) { + } /* else if (strlen(cm3) < strlen(cm)) { cm= cm3; } */ #endif /* BB_FEATURE_VI_OPTIMIZE_CURSOR */ pc0: l = strlen (cm); - if (l) - write (1, cm, l); // move the cursor + if (l) write (1, cm, l); // move the cursor } //----- Erase from cursor to end of line ----------------------- -static void -clear_to_eol () +static void clear_to_eol() { write (1, Ceol, strlen (Ceol)); // Erase from cursor to end of line } //----- Erase from cursor to end of screen ----------------------- -static void -clear_to_eos () +static void clear_to_eos() { write (1, Ceos, strlen (Ceos)); // Erase from cursor to end of screen } //----- Start standout mode ------------------------------------ -static void -standout_start () // send "start reverse video" sequence +static void standout_start() // send "start reverse video" sequence { write (1, SOs, strlen (SOs)); // Start reverse video mode } //----- End standout mode -------------------------------------- -static void -standout_end () // send "end reverse video" sequence +static void standout_end() // send "end reverse video" sequence { write (1, SOn, strlen (SOn)); // End reverse video mode } //----- Flash the screen -------------------------------------- -static void -flash (int h) +static void flash(int h) { standout_start (); // send "start reverse video" sequence redraw (TRUE); @@ -4180,80 +3690,69 @@ flash (int h) redraw (TRUE); } -static void -beep () +static void beep() { write (1, bell, strlen (bell)); // send out a bell character } -static void -indicate_error (char c) +static void indicate_error(char c) { #ifdef BB_FEATURE_VI_CRASHME if (crashme > 0) return; // generate a random command #endif /* BB_FEATURE_VI_CRASHME */ - if (err_method == 0) - { + if (err_method == 0) { beep (); - } - else - { + } else { flash (10); - } + } } //----- Screen[] Routines -------------------------------------- //----- Erase the Screen[] memory ------------------------------ -static void -screen_erase () +static void screen_erase() { memset (screen, ' ', screensize); // clear new screen } //----- Draw the status line at bottom of the screen ------------- -static void -show_status_line (void) +static void show_status_line(void) { static int last_cksum; int l, cnt, cksum; cnt = strlen ((char *) status_buffer); - for (cksum = l = 0; l < cnt; l++) - { - cksum += (int) (status_buffer[l]); - } + for (cksum = l = 0; l < cnt; l++) { cksum += (int) (status_buffer[l]); } // don't write the status line unless it changes - if (cnt > 0 && last_cksum != cksum) - { + if (cnt > 0 && last_cksum != cksum) { last_cksum = cksum; // remember if we have seen this line place_cursor (rows - 1, 0, FALSE); // put cursor on status line write (1, status_buffer, cnt); clear_to_eol (); place_cursor (crow, ccol, FALSE); // put cursor back in correct place - } + } } //----- format the status buffer, the bottom line of screen ------ // print status buffer, with STANDOUT mode -static void -psbs (char *format, ...) +static void psbs(char *format, ...) { va_list args; va_start (args, format); - strcpy ((char *) status_buffer, SOs); // Terminal standout mode on + /* FIXED strcpy((char *) status_buffer, SOs); */ + strlcpy((char *) status_buffer, SOs, BUFSIZ_STATBUF); // Terminal standout mode on vsprintf ((char *) status_buffer + strlen ((char *) status_buffer), format, args); - strcat ((char *) status_buffer, SOn); // Terminal standout mode off + /* FIXED strcat((char *) status_buffer, SOn); */ + strlcat((char *) status_buffer, SOn, BUFSIZ_STATBUF); // Terminal standout mode off va_end (args); return; } // print status buffer -static void -psb (char *format, ...) +static void psb(char *format, ...) { va_list args; @@ -4263,8 +3762,7 @@ psb (char *format, ...) return; } -static void -ni (Byte * s) // display messages +static void ni(Byte * s) // display messages { Byte buf[BUFSIZ]; @@ -4272,8 +3770,7 @@ ni (Byte * s) // display messages psbs ("\'%s\' is not implemented", buf); } -static void -edit_status (void) // show file status on status line +static void edit_status(void) // show file status on status line { int cur, tot, percent; @@ -4282,29 +3779,27 @@ edit_status (void) // show file status on status line // current line percent // ------------- ~~ ---------- // total lines 100 - if (tot > 0) - { + if (tot > 0) { percent = (100 * cur) / tot; - } - else - { + } else { cur = tot = 0; percent = 100; - } + } psb ("\"%s\"" #ifdef BB_FEATURE_VI_READONLY "%s" #endif /* BB_FEATURE_VI_READONLY */ - "%s line %d of %d --%d%%--", (cfn != 0 ? (char *) cfn : "No file"), + "%s line %d of %d --%d%%--", + (cfn != 0 ? (char *) cfn : "No file"), #ifdef BB_FEATURE_VI_READONLY ((vi_readonly == TRUE || readonly == TRUE) ? " [Read only]" : ""), #endif /* BB_FEATURE_VI_READONLY */ - (file_modified == TRUE ? " [modified]" : ""), cur, tot, percent); + (file_modified == TRUE ? " [modified]" : ""), + cur, tot, percent); } //----- 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 clear_to_eos (); // tel terminal to erase display @@ -4313,50 +3808,41 @@ redraw (int full_screen) } //----- Format a text[] line into a buffer --------------------- -static void -format_line (Byte * dest, Byte * src, int li) +static void format_line(Byte * dest, Byte * src, int li) { int co; Byte c; - for (co = 0; co < MAX_SCR_COLS; co++) - { + for (co = 0; co < MAX_SCR_COLS; co++) { c = ' '; // assume blank - if (li > 0 && co == 0) - { + if (li > 0 && co == 0) { c = '~'; // not first line, assume Tilde - } + } // are there chars in text[] and have we gone past the end - if (text < end && src < end) - { + if (text < end && src < end) { c = *src++; - } + } if (c == '\n') break; - if (c < ' ' || c > '~') - { - if (c == '\t') - { + if (c < ' ' || c > '~') { + if (c == '\t') { c = ' '; // co % 8 != 7 - for (; (co % tabstop) != (tabstop - 1); co++) - { + for (; (co % tabstop) != (tabstop - 1); co++) { dest[co] = c; - } - } - else - { + } + } else { dest[co++] = '^'; c |= '@'; // make it visible c &= 0x7f; // get rid of hi bit - } - } - /* the co++ is done here so that the column will - not be overwritten when we blank-out the rest of line */ + } + } + // the co++ is done here so that the column will + // not be overwritten when we blank-out the rest of line dest[co] = c; if (src >= end) break; - } + } } //----- Refresh the changed screen lines ----------------------- @@ -4364,8 +3850,7 @@ format_line (Byte * dest, Byte * src, int li) // if the current screenline is different from the new buffer. // If they differ then that line needs redrawing on the terminal. // -static void -refresh (int full_screen) +static void refresh(int full_screen) { static int old_offset; int li, changed; @@ -4382,8 +3867,7 @@ refresh (int full_screen) tp = screenbegin; // index into text[] of top line // compare text[] to screen[] and mark screen[] lines that need updating - for (li = 0; li < rows - 1; li++) - { + for (li = 0; li < rows - 1; li++) { int cs, ce; // column start & end memset (buf, ' ', MAX_SCR_COLS); // blank-out the buffer buf[MAX_SCR_COLS - 1] = 0; // NULL terminate the buffer @@ -4398,65 +3882,49 @@ refresh (int full_screen) cs = 0; ce = columns - 1; sp = &screen[li * columns]; // start of screen line - if (full_screen == TRUE) - { + if (full_screen == TRUE) { // force re-draw of every single column from 0 - columns-1 goto re0; - } + } // compare newly formatted buffer with virtual screen // look forward for first difference between buf and screen - for (; cs <= ce; cs++) - { - if (buf[cs + offset] != sp[cs]) - { + for (; cs <= ce; cs++) { + if (buf[cs + offset] != sp[cs]) { changed = TRUE; // mark for redraw break; - } - } + } + } // look backward for last difference between buf and screen - for (; ce >= cs; ce--) - { - if (buf[ce + offset] != sp[ce]) - { + for (; ce >= cs; ce--) { + if (buf[ce + offset] != sp[ce]) { changed = TRUE; // mark for redraw break; - } - } + } + } // now, cs is index of first diff, and ce is index of last diff // if horz offset has changed, force a redraw - if (offset != old_offset) - { + if (offset != old_offset) { re0: changed = TRUE; - } + } // make a sanity check of columns indexes - if (cs < 0) - cs = 0; - if (ce > columns - 1) - ce = columns - 1; - if (cs > ce) - { - cs = 0; - ce = columns - 1; - } + if (cs < 0) cs = 0; + if (ce > columns - 1) ce = columns - 1; + if (cs > ce) { cs = 0; ce = columns - 1; } // is there a change between vitual screen and buf - if (changed == TRUE) - { + if (changed == TRUE) { // copy changed part of buffer to virtual screen memmove (sp + cs, buf + (cs + offset), ce - cs + 1); // move cursor to column of first change - if (offset != old_offset) - { + if (offset != old_offset) { // opti_cur_move is still too stupid // to handle offsets correctly place_cursor (li, cs, FALSE); - } - else - { + } else { #ifdef BB_FEATURE_VI_OPTIMIZE_CURSOR // if this just the next line // try to optimize cursor movement @@ -4466,15 +3934,15 @@ refresh (int full_screen) #else /* BB_FEATURE_VI_OPTIMIZE_CURSOR */ place_cursor (li, cs, FALSE); // use standard ESC sequence #endif /* BB_FEATURE_VI_OPTIMIZE_CURSOR */ - } + } // write line out to terminal write (1, sp + cs, ce - cs + 1); #ifdef BB_FEATURE_VI_OPTIMIZE_CURSOR last_row = li; #endif /* BB_FEATURE_VI_OPTIMIZE_CURSOR */ - } - } + } + } #ifdef BB_FEATURE_VI_OPTIMIZE_CURSOR place_cursor (crow, ccol, (crow == last_row) ? TRUE : FALSE);