diff options
Diffstat (limited to 'miscutils')
| -rw-r--r-- | miscutils/less.c | 171 |
1 files changed, 89 insertions, 82 deletions
diff --git a/miscutils/less.c b/miscutils/less.c index 3fd22ca19..1b993ea2c 100644 --- a/miscutils/less.c +++ b/miscutils/less.c | |||
| @@ -20,26 +20,26 @@ | |||
| 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA |
| 21 | * 02111-1307 USA | 21 | * 02111-1307 USA |
| 22 | * | 22 | * |
| 23 | * This program needs a lot of development, so consider it in a beta stage | 23 | * This program needs a lot of development, so consider it in a beta stage |
| 24 | * at best. | 24 | * at best. |
| 25 | * | 25 | * |
| 26 | * TODO: | 26 | * TODO: |
| 27 | * - Add more regular expression support - search modifiers, certain matches, etc. | 27 | * - Add more regular expression support - search modifiers, certain matches, etc. |
| 28 | * - Add more complex bracket searching - currently, nested brackets are | 28 | * - Add more complex bracket searching - currently, nested brackets are |
| 29 | * not considered. | 29 | * not considered. |
| 30 | * - Add support for "F" as an input. This causes less to act in | 30 | * - Add support for "F" as an input. This causes less to act in |
| 31 | * a similar way to tail -f. | 31 | * a similar way to tail -f. |
| 32 | * - Check for binary files, and prompt the user if a binary file | 32 | * - Check for binary files, and prompt the user if a binary file |
| 33 | * is detected. | 33 | * is detected. |
| 34 | * - Allow horizontal scrolling. Currently, lines simply continue onto | 34 | * - Allow horizontal scrolling. Currently, lines simply continue onto |
| 35 | * the next line, per the terminal's discretion | 35 | * the next line, per the terminal's discretion |
| 36 | * | 36 | * |
| 37 | * Notes: | 37 | * Notes: |
| 38 | * - filename is an array and not a pointer because that avoids all sorts | 38 | * - filename is an array and not a pointer because that avoids all sorts |
| 39 | * of complications involving the fact that something that is pointed to | 39 | * of complications involving the fact that something that is pointed to |
| 40 | * will be changed if the pointer is changed. | 40 | * will be changed if the pointer is changed. |
| 41 | * - the inp file pointer is used so that keyboard input works after | 41 | * - the inp file pointer is used so that keyboard input works after |
| 42 | * redirected input has been read from stdin | 42 | * redirected input has been read from stdin |
| 43 | */ | 43 | */ |
| 44 | 44 | ||
| 45 | #include <stdio.h> | 45 | #include <stdio.h> |
| @@ -77,7 +77,7 @@ | |||
| 77 | #define NORMAL "\033[0m" | 77 | #define NORMAL "\033[0m" |
| 78 | 78 | ||
| 79 | /* The escape code to clear the screen */ | 79 | /* The escape code to clear the screen */ |
| 80 | #define CLEAR "\033[2J" | 80 | #define CLEAR "\033[H\033[J" |
| 81 | 81 | ||
| 82 | /* Maximum number of lines in a file */ | 82 | /* Maximum number of lines in a file */ |
| 83 | #define MAXLINES 10000 | 83 | #define MAXLINES 10000 |
| @@ -142,13 +142,6 @@ static void set_tty_cooked(void) { | |||
| 142 | 142 | ||
| 143 | /* Set terminal input to raw mode (taken from vi.c) */ | 143 | /* Set terminal input to raw mode (taken from vi.c) */ |
| 144 | static void set_tty_raw(void) { | 144 | static void set_tty_raw(void) { |
| 145 | tcgetattr(0, &term_orig); | ||
| 146 | term_vi = term_orig; | ||
| 147 | term_vi.c_lflag &= (~ICANON & ~ECHO); | ||
| 148 | term_vi.c_iflag &= (~IXON & ~ICRNL); | ||
| 149 | term_vi.c_oflag &= (~ONLCR); | ||
| 150 | term_vi.c_cc[VMIN] = 1; | ||
| 151 | term_vi.c_cc[VTIME] = 0; | ||
| 152 | tcsetattr(0, TCSANOW, &term_vi); | 145 | tcsetattr(0, TCSANOW, &term_vi); |
| 153 | } | 146 | } |
| 154 | 147 | ||
| @@ -169,36 +162,34 @@ static void tless_exit(int code) { | |||
| 169 | special return codes. Note that this function works best with raw input. */ | 162 | special return codes. Note that this function works best with raw input. */ |
| 170 | static int tless_getch(void) { | 163 | static int tless_getch(void) { |
| 171 | 164 | ||
| 165 | int input; | ||
| 166 | |||
| 172 | set_tty_raw(); | 167 | set_tty_raw(); |
| 173 | char input_key[3]; | ||
| 174 | 168 | ||
| 175 | input_key[0] = getc(inp); | 169 | input = getc(inp); |
| 176 | /* Detect escape sequences (i.e. arrow keys) and handle | 170 | /* Detect escape sequences (i.e. arrow keys) and handle |
| 177 | them accordingly */ | 171 | them accordingly */ |
| 178 | 172 | ||
| 179 | if (input_key[0] == '\033') { | 173 | if (input == '\033' && getc(inp) == '[') { |
| 180 | input_key[1] = getc(inp); | 174 | input = getc(inp); |
| 181 | input_key[2] = getc(inp); | ||
| 182 | set_tty_cooked(); | 175 | set_tty_cooked(); |
| 183 | if (input_key[1] == '[') { | 176 | if (input == REAL_KEY_UP) |
| 184 | if (input_key[2] == REAL_KEY_UP) | 177 | return KEY_UP; |
| 185 | return KEY_UP; | 178 | else if (input == REAL_KEY_DOWN) |
| 186 | else if (input_key[2] == REAL_KEY_DOWN) | 179 | return KEY_DOWN; |
| 187 | return KEY_DOWN; | 180 | else if (input == REAL_KEY_RIGHT) |
| 188 | else if (input_key[2] == REAL_KEY_RIGHT) | 181 | return KEY_RIGHT; |
| 189 | return KEY_RIGHT; | 182 | else if (input == REAL_KEY_LEFT) |
| 190 | else if (input_key[2] == REAL_KEY_LEFT) | 183 | return KEY_LEFT; |
| 191 | return KEY_LEFT; | 184 | else if (input == REAL_PAGE_UP) |
| 192 | else if (input_key[2] == REAL_PAGE_UP) | 185 | return PAGE_UP; |
| 193 | return PAGE_UP; | 186 | else if (input == REAL_PAGE_DOWN) |
| 194 | else if (input_key[2] == REAL_PAGE_DOWN) | 187 | return PAGE_DOWN; |
| 195 | return PAGE_DOWN; | ||
| 196 | } | ||
| 197 | } | 188 | } |
| 198 | /* The input is a normal ASCII value */ | 189 | /* The input is a normal ASCII value */ |
| 199 | else { | 190 | else { |
| 200 | set_tty_cooked(); | 191 | set_tty_cooked(); |
| 201 | return input_key[0]; | 192 | return input; |
| 202 | } | 193 | } |
| 203 | return 0; | 194 | return 0; |
| 204 | } | 195 | } |
| @@ -222,8 +213,7 @@ static void add_linenumbers(void) { | |||
| 222 | 213 | ||
| 223 | for (i = 0; i <= num_flines; i++) { | 214 | for (i = 0; i <= num_flines; i++) { |
| 224 | safe_strncpy(current_line, flines[i], 256); | 215 | safe_strncpy(current_line, flines[i], 256); |
| 225 | flines[i] = xrealloc(flines[i], strlen(current_line) + 7); | 216 | bb_xasprintf(&flines[i],"%5d %s", i + 1, current_line); |
| 226 | sprintf(flines[i],"%5d %s", i + 1, current_line); | ||
| 227 | } | 217 | } |
| 228 | } | 218 | } |
| 229 | 219 | ||
| @@ -241,12 +231,12 @@ static void data_readlines(void) { | |||
| 241 | rewind(fp); | 231 | rewind(fp); |
| 242 | /* Initialise fp */ | 232 | /* Initialise fp */ |
| 243 | flines = malloc(i * sizeof(char *)); | 233 | flines = malloc(i * sizeof(char *)); |
| 244 | 234 | ||
| 245 | for (i = 0; (!feof(fp)) && (i <= MAXLINES); i++) { | 235 | for (i = 0; (!feof(fp)) && (i <= MAXLINES); i++) { |
| 246 | strcpy(current_line, ""); | 236 | strcpy(current_line, ""); |
| 247 | fgets(current_line, 256, fp); | 237 | fgets(current_line, 256, fp); |
| 248 | bb_xferror(fp, filename); | 238 | bb_xferror(fp, filename); |
| 249 | flines[i] = (char *) bb_xstrndup(current_line, (strlen(current_line) + 1) * sizeof(char)); | 239 | flines[i] = bb_xstrdup(current_line); |
| 250 | } | 240 | } |
| 251 | num_flines = i - 2; | 241 | num_flines = i - 2; |
| 252 | 242 | ||
| @@ -258,7 +248,7 @@ static void data_readlines(void) { | |||
| 258 | fclose(fp); | 248 | fclose(fp); |
| 259 | 249 | ||
| 260 | inp = (inp_stdin) ? fopen(CURRENT_TTY, "r") : stdin; | 250 | inp = (inp_stdin) ? fopen(CURRENT_TTY, "r") : stdin; |
| 261 | 251 | ||
| 262 | if (ea_inp_stdin) { | 252 | if (ea_inp_stdin) { |
| 263 | fclose(inp); | 253 | fclose(inp); |
| 264 | inp = fopen(CURRENT_TTY, "r"); | 254 | inp = fopen(CURRENT_TTY, "r"); |
| @@ -307,7 +297,7 @@ static void m_status_print(void) { | |||
| 307 | } | 297 | } |
| 308 | else { | 298 | else { |
| 309 | percentage = calc_percent(); | 299 | percentage = calc_percent(); |
| 310 | printf("%i%s %s", percentage, "%", NORMAL); | 300 | printf("%i%% %s", percentage, NORMAL); |
| 311 | } | 301 | } |
| 312 | } | 302 | } |
| 313 | else { | 303 | else { |
| @@ -325,11 +315,11 @@ static void medium_status_print(void) { | |||
| 325 | percentage = calc_percent(); | 315 | percentage = calc_percent(); |
| 326 | 316 | ||
| 327 | if (!line_pos) | 317 | if (!line_pos) |
| 328 | printf("%s%s %i%s%s", HIGHLIGHT, filename, percentage, "%", NORMAL); | 318 | printf("%s%s %i%%%s", HIGHLIGHT, filename, percentage, NORMAL); |
| 329 | else if (line_pos == num_flines - height + 2) | 319 | else if (line_pos == num_flines - height + 2) |
| 330 | printf("%s(END)%s", HIGHLIGHT, NORMAL); | 320 | printf("%s(END)%s", HIGHLIGHT, NORMAL); |
| 331 | else | 321 | else |
| 332 | printf("%s%i%s%s", HIGHLIGHT, percentage, "%", NORMAL); | 322 | printf("%s%i%%%s", HIGHLIGHT, percentage, NORMAL); |
| 333 | } | 323 | } |
| 334 | #endif | 324 | #endif |
| 335 | 325 | ||
| @@ -368,15 +358,12 @@ static void buffer_print(void) { | |||
| 368 | 358 | ||
| 369 | int i; | 359 | int i; |
| 370 | 360 | ||
| 361 | printf("%s", CLEAR); | ||
| 371 | if (num_flines >= height - 2) { | 362 | if (num_flines >= height - 2) { |
| 372 | printf("%s", CLEAR); | ||
| 373 | move_cursor(0,0); | ||
| 374 | for (i = 0; i < height - 1; i++) | 363 | for (i = 0; i < height - 1; i++) |
| 375 | printf("%s", buffer[i]); | 364 | printf("%s", buffer[i]); |
| 376 | } | 365 | } |
| 377 | else { | 366 | else { |
| 378 | printf("%s", CLEAR); | ||
| 379 | move_cursor(0,0); | ||
| 380 | for (i = 1; i < (height - 1 - num_flines); i++) | 367 | for (i = 1; i < (height - 1 - num_flines); i++) |
| 381 | putchar('\n'); | 368 | putchar('\n'); |
| 382 | for (i = 0; i < height - 1; i++) | 369 | for (i = 0; i < height - 1; i++) |
| @@ -391,9 +378,14 @@ static void buffer_init(void) { | |||
| 391 | 378 | ||
| 392 | int i; | 379 | int i; |
| 393 | 380 | ||
| 394 | /* malloc the number of lines needed for the buffer */ | 381 | if(buffer == NULL) { |
| 395 | buffer = xrealloc(buffer, height * sizeof(char *)); | 382 | /* malloc the number of lines needed for the buffer */ |
| 396 | 383 | buffer = xrealloc(buffer, height * sizeof(char *)); | |
| 384 | } else { | ||
| 385 | for (i = 0; i < (height - 1); i++) | ||
| 386 | free(buffer[i]); | ||
| 387 | } | ||
| 388 | |||
| 397 | /* Fill the buffer until the end of the file or the | 389 | /* Fill the buffer until the end of the file or the |
| 398 | end of the buffer is reached */ | 390 | end of the buffer is reached */ |
| 399 | for (i = 0; (i < (height - 1)) && (i <= num_flines); i++) { | 391 | for (i = 0; (i < (height - 1)) && (i <= num_flines); i++) { |
| @@ -402,7 +394,7 @@ static void buffer_init(void) { | |||
| 402 | 394 | ||
| 403 | /* If the buffer still isn't full, fill it with blank lines */ | 395 | /* If the buffer still isn't full, fill it with blank lines */ |
| 404 | for (; i < (height - 1); i++) { | 396 | for (; i < (height - 1); i++) { |
| 405 | buffer[i] = ""; | 397 | buffer[i] = bb_xstrdup(""); |
| 406 | } | 398 | } |
| 407 | } | 399 | } |
| 408 | 400 | ||
| @@ -414,16 +406,20 @@ static void buffer_down(int nlines) { | |||
| 414 | if (!past_eof) { | 406 | if (!past_eof) { |
| 415 | if (line_pos + (height - 3) + nlines < num_flines) { | 407 | if (line_pos + (height - 3) + nlines < num_flines) { |
| 416 | line_pos += nlines; | 408 | line_pos += nlines; |
| 417 | for (i = 0; i < (height - 1); i++) | 409 | for (i = 0; i < (height - 1); i++) { |
| 410 | free(buffer[i]); | ||
| 418 | buffer[i] = (char *) bb_xstrdup(flines[line_pos + i]); | 411 | buffer[i] = (char *) bb_xstrdup(flines[line_pos + i]); |
| 412 | } | ||
| 419 | } | 413 | } |
| 420 | else { | 414 | else { |
| 421 | /* As the number of lines requested was too large, we just move | 415 | /* As the number of lines requested was too large, we just move |
| 422 | to the end of the file */ | 416 | to the end of the file */ |
| 423 | while (line_pos + (height - 3) + 1 < num_flines) { | 417 | while (line_pos + (height - 3) + 1 < num_flines) { |
| 424 | line_pos += 1; | 418 | line_pos += 1; |
| 425 | for (i = 0; i < (height - 1); i++) | 419 | for (i = 0; i < (height - 1); i++) { |
| 420 | free(buffer[i]); | ||
| 426 | buffer[i] = (char *) bb_xstrdup(flines[line_pos + i]); | 421 | buffer[i] = (char *) bb_xstrdup(flines[line_pos + i]); |
| 422 | } | ||
| 427 | } | 423 | } |
| 428 | } | 424 | } |
| 429 | 425 | ||
| @@ -441,16 +437,20 @@ static void buffer_up(int nlines) { | |||
| 441 | if (!past_eof) { | 437 | if (!past_eof) { |
| 442 | if (line_pos - nlines >= 0) { | 438 | if (line_pos - nlines >= 0) { |
| 443 | line_pos -= nlines; | 439 | line_pos -= nlines; |
| 444 | for (i = 0; i < (height - 1); i++) | 440 | for (i = 0; i < (height - 1); i++) { |
| 441 | free(buffer[i]); | ||
| 445 | buffer[i] = (char *) bb_xstrdup(flines[line_pos + i]); | 442 | buffer[i] = (char *) bb_xstrdup(flines[line_pos + i]); |
| 443 | } | ||
| 446 | } | 444 | } |
| 447 | else { | 445 | else { |
| 448 | /* As the requested number of lines to move was too large, we | 446 | /* As the requested number of lines to move was too large, we |
| 449 | move one line up at a time until we can't. */ | 447 | move one line up at a time until we can't. */ |
| 450 | while (line_pos != 0) { | 448 | while (line_pos != 0) { |
| 451 | line_pos -= 1; | 449 | line_pos -= 1; |
| 452 | for (i = 0; i < (height - 1); i++) | 450 | for (i = 0; i < (height - 1); i++) { |
| 451 | free(buffer[i]); | ||
| 453 | buffer[i] = (char *) bb_xstrdup(flines[line_pos + i]); | 452 | buffer[i] = (char *) bb_xstrdup(flines[line_pos + i]); |
| 453 | } | ||
| 454 | } | 454 | } |
| 455 | } | 455 | } |
| 456 | } | 456 | } |
| @@ -469,11 +469,12 @@ static void buffer_up(int nlines) { | |||
| 469 | /* We only move part of the buffer, as the rest | 469 | /* We only move part of the buffer, as the rest |
| 470 | is past the EOF */ | 470 | is past the EOF */ |
| 471 | for (i = 0; i < (height - 1); i++) { | 471 | for (i = 0; i < (height - 1); i++) { |
| 472 | free(buffer[i]); | ||
| 472 | if (i < tilde_line - nlines + 1) | 473 | if (i < tilde_line - nlines + 1) |
| 473 | buffer[i] = (char *) bb_xstrdup(flines[line_pos + i]); | 474 | buffer[i] = (char *) bb_xstrdup(flines[line_pos + i]); |
| 474 | else { | 475 | else { |
| 475 | if (line_pos >= num_flines - height + 2) | 476 | if (line_pos >= num_flines - height + 2) |
| 476 | buffer[i] = "~\n"; | 477 | buffer[i] = bb_xstrdup("~\n"); |
| 477 | } | 478 | } |
| 478 | } | 479 | } |
| 479 | } | 480 | } |
| @@ -491,12 +492,15 @@ static void buffer_line(int linenum) { | |||
| 491 | printf("%s%s%i%s", HIGHLIGHT, "Cannot seek to line number ", linenum, NORMAL); | 492 | printf("%s%s%i%s", HIGHLIGHT, "Cannot seek to line number ", linenum, NORMAL); |
| 492 | } | 493 | } |
| 493 | else if (linenum < (num_flines - height - 2)) { | 494 | else if (linenum < (num_flines - height - 2)) { |
| 494 | for (i = 0; i < (height - 1); i++) | 495 | for (i = 0; i < (height - 1); i++) { |
| 496 | free(buffer[i]); | ||
| 495 | buffer[i] = (char *) bb_xstrdup(flines[linenum + i]); | 497 | buffer[i] = (char *) bb_xstrdup(flines[linenum + i]); |
| 498 | } | ||
| 496 | line_pos = linenum; | 499 | line_pos = linenum; |
| 497 | } | 500 | } |
| 498 | else { | 501 | else { |
| 499 | for (i = 0; i < (height - 1); i++) { | 502 | for (i = 0; i < (height - 1); i++) { |
| 503 | free(buffer[i]); | ||
| 500 | if (linenum + i < num_flines + 2) | 504 | if (linenum + i < num_flines + 2) |
| 501 | buffer[i] = (char *) bb_xstrdup(flines[linenum + i]); | 505 | buffer[i] = (char *) bb_xstrdup(flines[linenum + i]); |
| 502 | else | 506 | else |
| @@ -516,7 +520,7 @@ static void reinitialise(void) { | |||
| 516 | for (i = 0; i <= num_flines; i++) | 520 | for (i = 0; i <= num_flines; i++) |
| 517 | free(flines[i]); | 521 | free(flines[i]); |
| 518 | free(flines); | 522 | free(flines); |
| 519 | 523 | ||
| 520 | data_readlines(); | 524 | data_readlines(); |
| 521 | buffer_init(); | 525 | buffer_init(); |
| 522 | buffer_print(); | 526 | buffer_print(); |
| @@ -629,15 +633,10 @@ static void colon_process(void) { | |||
| 629 | 633 | ||
| 630 | static char *insert_highlights (char *line, int start, int end) { | 634 | static char *insert_highlights (char *line, int start, int end) { |
| 631 | 635 | ||
| 632 | char *new_line = (char *) malloc((sizeof(char) * (strlen(line) + 1)) + 10); | 636 | char *new_line; |
| 633 | |||
| 634 | memset(new_line, 0, ((sizeof(char) * (strlen(line) + 1)) + 10)); | ||
| 635 | strncat(new_line, line, start); | ||
| 636 | strcat(new_line, HIGHLIGHT); | ||
| 637 | strncat(new_line, line + start, end - start); | ||
| 638 | strcat(new_line, NORMAL); | ||
| 639 | strncat(new_line, line + end, strlen(line) - end); | ||
| 640 | 637 | ||
| 638 | bb_xasprintf(&new_line, "%.*s%s%.*s%s%s", start, line, HIGHLIGHT, | ||
| 639 | end - start, line + start, NORMAL, line + end); | ||
| 641 | return new_line; | 640 | return new_line; |
| 642 | } | 641 | } |
| 643 | 642 | ||
| @@ -652,7 +651,7 @@ static char *process_regex_on_line(char *line, regex_t *pattern) { | |||
| 652 | char sub_line[256]; | 651 | char sub_line[256]; |
| 653 | int prev_eo = 0; | 652 | int prev_eo = 0; |
| 654 | regmatch_t match_structs; | 653 | regmatch_t match_structs; |
| 655 | 654 | ||
| 656 | memset(sub_line, 0, 256); | 655 | memset(sub_line, 0, 256); |
| 657 | strcpy(line2, line); | 656 | strcpy(line2, line); |
| 658 | 657 | ||
| @@ -869,7 +868,7 @@ static void show_flag_status(void) { | |||
| 869 | } | 868 | } |
| 870 | 869 | ||
| 871 | clear_line(); | 870 | clear_line(); |
| 872 | printf("%s%s%i%s", HIGHLIGHT, "The status of the flag is: ", flag_val, NORMAL); | 871 | printf("%s%s%i%s", HIGHLIGHT, "The status of the flag is: ", flag_val != 0, NORMAL); |
| 873 | } | 872 | } |
| 874 | #endif | 873 | #endif |
| 875 | 874 | ||
| @@ -940,7 +939,7 @@ static void goto_mark(void) { | |||
| 940 | printf("Go to mark: "); | 939 | printf("Go to mark: "); |
| 941 | letter = tless_getch(); | 940 | letter = tless_getch(); |
| 942 | clear_line(); | 941 | clear_line(); |
| 943 | 942 | ||
| 944 | if (isalpha(letter)) { | 943 | if (isalpha(letter)) { |
| 945 | for (i = 0; i <= num_marks; i++) | 944 | for (i = 0; i <= num_marks; i++) |
| 946 | if (letter == mark_lines[i][0]) { | 945 | if (letter == mark_lines[i][0]) { |
| @@ -985,7 +984,7 @@ static void match_right_bracket(char bracket) { | |||
| 985 | int i; | 984 | int i; |
| 986 | 985 | ||
| 987 | clear_line(); | 986 | clear_line(); |
| 988 | 987 | ||
| 989 | if (strchr(flines[line_pos], bracket) == NULL) | 988 | if (strchr(flines[line_pos], bracket) == NULL) |
| 990 | printf("%s%s%s", HIGHLIGHT, "No bracket in top line", NORMAL); | 989 | printf("%s%s%s", HIGHLIGHT, "No bracket in top line", NORMAL); |
| 991 | else { | 990 | else { |
| @@ -1010,7 +1009,7 @@ static void match_left_bracket (char bracket) { | |||
| 1010 | int i; | 1009 | int i; |
| 1011 | 1010 | ||
| 1012 | clear_line(); | 1011 | clear_line(); |
| 1013 | 1012 | ||
| 1014 | if (strchr(flines[line_pos + height - 2], bracket) == NULL) { | 1013 | if (strchr(flines[line_pos + height - 2], bracket) == NULL) { |
| 1015 | printf("%s%s%s", HIGHLIGHT, "No bracket in bottom line", NORMAL); | 1014 | printf("%s%s%s", HIGHLIGHT, "No bracket in bottom line", NORMAL); |
| 1016 | printf("%s", flines[line_pos + height]); | 1015 | printf("%s", flines[line_pos + height]); |
| @@ -1168,6 +1167,14 @@ int less_main(int argc, char **argv) { | |||
| 1168 | 1167 | ||
| 1169 | strcpy(filename, (inp_stdin) ? "stdin" : files[0]); | 1168 | strcpy(filename, (inp_stdin) ? "stdin" : files[0]); |
| 1170 | tty_width_height(); | 1169 | tty_width_height(); |
| 1170 | tcgetattr(0, &term_orig); | ||
| 1171 | term_vi = term_orig; | ||
| 1172 | term_vi.c_lflag &= (~ICANON & ~ECHO); | ||
| 1173 | term_vi.c_iflag &= (~IXON & ~ICRNL); | ||
| 1174 | term_vi.c_oflag &= (~ONLCR); | ||
| 1175 | term_vi.c_cc[VMIN] = 1; | ||
| 1176 | term_vi.c_cc[VTIME] = 0; | ||
| 1177 | |||
| 1171 | data_readlines(); | 1178 | data_readlines(); |
| 1172 | buffer_init(); | 1179 | buffer_init(); |
| 1173 | buffer_print(); | 1180 | buffer_print(); |
