172fcea8cSEd Schouten /*
272fcea8cSEd Schouten | ee (easy editor)
372fcea8cSEd Schouten |
472fcea8cSEd Schouten | An easy to use, simple screen oriented editor.
572fcea8cSEd Schouten |
672fcea8cSEd Schouten | written by Hugh Mahon
772fcea8cSEd Schouten |
872fcea8cSEd Schouten |
996b676e9SEd Schouten | Copyright (c) 2009, Hugh Mahon
1096b676e9SEd Schouten | All rights reserved.
1172fcea8cSEd Schouten |
1296b676e9SEd Schouten | Redistribution and use in source and binary forms, with or without
1396b676e9SEd Schouten | modification, are permitted provided that the following conditions
1496b676e9SEd Schouten | are met:
1572fcea8cSEd Schouten |
1696b676e9SEd Schouten | * Redistributions of source code must retain the above copyright
1796b676e9SEd Schouten | notice, this list of conditions and the following disclaimer.
1896b676e9SEd Schouten | * Redistributions in binary form must reproduce the above
1996b676e9SEd Schouten | copyright notice, this list of conditions and the following
2096b676e9SEd Schouten | disclaimer in the documentation and/or other materials provided
2196b676e9SEd Schouten | with the distribution.
2296b676e9SEd Schouten |
2396b676e9SEd Schouten | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2496b676e9SEd Schouten | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2596b676e9SEd Schouten | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
2696b676e9SEd Schouten | FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
2796b676e9SEd Schouten | COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
2896b676e9SEd Schouten | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
2996b676e9SEd Schouten | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
3096b676e9SEd Schouten | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
3196b676e9SEd Schouten | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3296b676e9SEd Schouten | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
3396b676e9SEd Schouten | ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3496b676e9SEd Schouten | POSSIBILITY OF SUCH DAMAGE.
3596b676e9SEd Schouten |
3696b676e9SEd Schouten | -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
3772fcea8cSEd Schouten |
3872fcea8cSEd Schouten | This editor was purposely developed to be simple, both in
3972fcea8cSEd Schouten | interface and implementation. This editor was developed to
4072fcea8cSEd Schouten | address a specific audience: the user who is new to computers
4172fcea8cSEd Schouten | (especially UNIX).
4272fcea8cSEd Schouten |
4372fcea8cSEd Schouten | ee is not aimed at technical users; for that reason more
4472fcea8cSEd Schouten | complex features were intentionally left out. In addition,
4572fcea8cSEd Schouten | ee is intended to be compiled by people with little computer
4672fcea8cSEd Schouten | experience, which means that it needs to be small, relatively
4772fcea8cSEd Schouten | simple in implementation, and portable.
4872fcea8cSEd Schouten |
4972fcea8cSEd Schouten | This software and documentation contains
5072fcea8cSEd Schouten | proprietary information which is protected by
5172fcea8cSEd Schouten | copyright. All rights are reserved.
5272fcea8cSEd Schouten |
537bf1ea96SEd Schouten | $Header: /home/hugh/sources/old_ae/RCS/ee.c,v 1.104 2010/06/04 01:55:31 hugh Exp hugh $
5472fcea8cSEd Schouten |
5572fcea8cSEd Schouten */
5672fcea8cSEd Schouten
5772fcea8cSEd Schouten char *ee_copyright_message =
5896b676e9SEd Schouten "Copyright (c) 1986, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 2009 Hugh Mahon ";
5972fcea8cSEd Schouten
6096b676e9SEd Schouten #include "ee_version.h"
6172fcea8cSEd Schouten
627bf1ea96SEd Schouten char *version = "@(#) ee, version " EE_VERSION " $Revision: 1.104 $";
6372fcea8cSEd Schouten
6472fcea8cSEd Schouten #ifdef NCURSE
6572fcea8cSEd Schouten #include "new_curse.h"
66cfe04e82SEd Schouten #elif HAS_NCURSES
67cfe04e82SEd Schouten #include <ncurses.h>
6872fcea8cSEd Schouten #else
6972fcea8cSEd Schouten #include <curses.h>
7072fcea8cSEd Schouten #endif
7172fcea8cSEd Schouten
7272fcea8cSEd Schouten #include <ctype.h>
73cfe04e82SEd Schouten #include <signal.h>
7496b676e9SEd Schouten #include <fcntl.h>
75cfe04e82SEd Schouten #include <sys/types.h>
76cfe04e82SEd Schouten #include <sys/stat.h>
7796b676e9SEd Schouten #include <errno.h>
7896b676e9SEd Schouten #include <string.h>
7996b676e9SEd Schouten #include <pwd.h>
80db07ef76SAndrey A. Chernov #include <locale.h>
8196b676e9SEd Schouten
82cfe04e82SEd Schouten #ifdef HAS_SYS_WAIT
83cfe04e82SEd Schouten #include <sys/wait.h>
84cfe04e82SEd Schouten #endif
8596b676e9SEd Schouten
86cfe04e82SEd Schouten #ifdef HAS_STDLIB
87cfe04e82SEd Schouten #include <stdlib.h>
88cfe04e82SEd Schouten #endif
8996b676e9SEd Schouten
9096b676e9SEd Schouten #ifdef HAS_STDARG
9196b676e9SEd Schouten #include <stdarg.h>
9296b676e9SEd Schouten #endif
9396b676e9SEd Schouten
94cfe04e82SEd Schouten #ifdef HAS_UNISTD
95cfe04e82SEd Schouten #include <unistd.h>
96cfe04e82SEd Schouten #endif
9772fcea8cSEd Schouten
9872fcea8cSEd Schouten #ifndef NO_CATGETS
9972fcea8cSEd Schouten #include <nl_types.h>
10072fcea8cSEd Schouten
10172fcea8cSEd Schouten nl_catd catalog;
10272fcea8cSEd Schouten #else
10372fcea8cSEd Schouten #define catgetlocal(a, b) (b)
10472fcea8cSEd Schouten #endif /* NO_CATGETS */
10572fcea8cSEd Schouten
10672fcea8cSEd Schouten #ifndef SIGCHLD
10772fcea8cSEd Schouten #define SIGCHLD SIGCLD
10872fcea8cSEd Schouten #endif
10972fcea8cSEd Schouten
11072fcea8cSEd Schouten #define TAB 9
11172fcea8cSEd Schouten #define max(a, b) (a > b ? a : b)
11272fcea8cSEd Schouten #define min(a, b) (a < b ? a : b)
11372fcea8cSEd Schouten
11472fcea8cSEd Schouten /*
11572fcea8cSEd Schouten | defines for type of data to show in info window
11672fcea8cSEd Schouten */
11772fcea8cSEd Schouten
11872fcea8cSEd Schouten #define CONTROL_KEYS 1
11972fcea8cSEd Schouten #define COMMANDS 2
12072fcea8cSEd Schouten
12172fcea8cSEd Schouten struct text {
12272fcea8cSEd Schouten unsigned char *line; /* line of characters */
12372fcea8cSEd Schouten int line_number; /* line number */
12472fcea8cSEd Schouten int line_length; /* actual number of characters in the line */
12572fcea8cSEd Schouten int max_length; /* maximum number of characters the line handles */
12672fcea8cSEd Schouten struct text *next_line; /* next line of text */
12772fcea8cSEd Schouten struct text *prev_line; /* previous line of text */
12872fcea8cSEd Schouten };
12972fcea8cSEd Schouten
13072fcea8cSEd Schouten struct text *first_line; /* first line of current buffer */
13172fcea8cSEd Schouten struct text *dlt_line; /* structure for info on deleted line */
13272fcea8cSEd Schouten struct text *curr_line; /* current line cursor is on */
13372fcea8cSEd Schouten struct text *tmp_line; /* temporary line pointer */
13472fcea8cSEd Schouten struct text *srch_line; /* temporary pointer for search routine */
13572fcea8cSEd Schouten
13672fcea8cSEd Schouten struct files { /* structure to store names of files to be edited*/
13772fcea8cSEd Schouten unsigned char *name; /* name of file */
13872fcea8cSEd Schouten struct files *next_name;
13972fcea8cSEd Schouten };
14072fcea8cSEd Schouten
14172fcea8cSEd Schouten struct files *top_of_stack = NULL;
14272fcea8cSEd Schouten
14372fcea8cSEd Schouten int d_wrd_len; /* length of deleted word */
14472fcea8cSEd Schouten int position; /* offset in bytes from begin of line */
14572fcea8cSEd Schouten int scr_pos; /* horizontal position */
14672fcea8cSEd Schouten int scr_vert; /* vertical position on screen */
14772fcea8cSEd Schouten int scr_horz; /* horizontal position on screen */
14896b676e9SEd Schouten int absolute_lin; /* number of lines from top */
14972fcea8cSEd Schouten int tmp_vert, tmp_horz;
15072fcea8cSEd Schouten int input_file; /* indicate to read input file */
15172fcea8cSEd Schouten int recv_file; /* indicate reading a file */
15272fcea8cSEd Schouten int edit; /* continue executing while true */
15372fcea8cSEd Schouten int gold; /* 'gold' function key pressed */
15472fcea8cSEd Schouten int fildes; /* file descriptor */
15572fcea8cSEd Schouten int case_sen; /* case sensitive search flag */
15672fcea8cSEd Schouten int last_line; /* last line for text display */
15772fcea8cSEd Schouten int last_col; /* last column for text display */
15872fcea8cSEd Schouten int horiz_offset = 0; /* offset from left edge of text */
15972fcea8cSEd Schouten int clear_com_win; /* flag to indicate com_win needs clearing */
16072fcea8cSEd Schouten int text_changes = FALSE; /* indicate changes have been made to text */
16172fcea8cSEd Schouten int get_fd; /* file descriptor for reading a file */
16272fcea8cSEd Schouten int info_window = TRUE; /* flag to indicate if help window visible */
16372fcea8cSEd Schouten int info_type = CONTROL_KEYS; /* flag to indicate type of info to display */
16472fcea8cSEd Schouten int expand_tabs = TRUE; /* flag for expanding tabs */
16572fcea8cSEd Schouten int right_margin = 0; /* the right margin */
16672fcea8cSEd Schouten int observ_margins = TRUE; /* flag for whether margins are observed */
16772fcea8cSEd Schouten int shell_fork;
16872fcea8cSEd Schouten int temp_stdin; /* temporary storage for stdin */
16972fcea8cSEd Schouten int temp_stdout; /* temp storage for stdout descriptor */
17072fcea8cSEd Schouten int temp_stderr; /* temp storage for stderr descriptor */
17172fcea8cSEd Schouten int pipe_out[2]; /* pipe file desc for output */
17272fcea8cSEd Schouten int pipe_in[2]; /* pipe file descriptors for input */
17372fcea8cSEd Schouten int out_pipe; /* flag that info is piped out */
17472fcea8cSEd Schouten int in_pipe; /* flag that info is piped in */
17572fcea8cSEd Schouten int formatted = FALSE; /* flag indicating paragraph formatted */
17672fcea8cSEd Schouten int auto_format = FALSE; /* flag for auto_format mode */
17772fcea8cSEd Schouten int restricted = FALSE; /* flag to indicate restricted mode */
17872fcea8cSEd Schouten int nohighlight = FALSE; /* turns off highlighting */
17972fcea8cSEd Schouten int eightbit = TRUE; /* eight bit character flag */
18072fcea8cSEd Schouten int local_LINES = 0; /* copy of LINES, to detect when win resizes */
18172fcea8cSEd Schouten int local_COLS = 0; /* copy of COLS, to detect when win resizes */
18272fcea8cSEd Schouten int curses_initialized = FALSE; /* flag indicating if curses has been started*/
18372fcea8cSEd Schouten int emacs_keys_mode = FALSE; /* mode for if emacs key binings are used */
18472fcea8cSEd Schouten int ee_chinese = FALSE; /* allows handling of multi-byte characters */
18572fcea8cSEd Schouten /* by checking for high bit in a byte the */
18672fcea8cSEd Schouten /* code recognizes a two-byte character */
18772fcea8cSEd Schouten /* sequence */
18872fcea8cSEd Schouten
18972fcea8cSEd Schouten unsigned char *point; /* points to current position in line */
19072fcea8cSEd Schouten unsigned char *srch_str; /* pointer for search string */
19172fcea8cSEd Schouten unsigned char *u_srch_str; /* pointer to non-case sensitive search */
19272fcea8cSEd Schouten unsigned char *srch_1; /* pointer to start of suspect string */
19372fcea8cSEd Schouten unsigned char *srch_2; /* pointer to next character of string */
19472fcea8cSEd Schouten unsigned char *srch_3;
19572fcea8cSEd Schouten unsigned char *in_file_name = NULL; /* name of input file */
19672fcea8cSEd Schouten char *tmp_file; /* temporary file name */
19772fcea8cSEd Schouten unsigned char *d_char; /* deleted character */
19872fcea8cSEd Schouten unsigned char *d_word; /* deleted word */
19972fcea8cSEd Schouten unsigned char *d_line; /* deleted line */
20072fcea8cSEd Schouten char in_string[513]; /* buffer for reading a file */
20196b676e9SEd Schouten unsigned char *print_command = (unsigned char *)"lpr"; /* string to use for the print command */
20272fcea8cSEd Schouten unsigned char *start_at_line = NULL; /* move to this line at start of session*/
20372fcea8cSEd Schouten int in; /* input character */
20472fcea8cSEd Schouten
20572fcea8cSEd Schouten FILE *temp_fp; /* temporary file pointer */
20672fcea8cSEd Schouten FILE *bit_bucket; /* file pointer to /dev/null */
20772fcea8cSEd Schouten
20872fcea8cSEd Schouten char *table[] = {
20972fcea8cSEd Schouten "^@", "^A", "^B", "^C", "^D", "^E", "^F", "^G", "^H", "\t", "^J",
21072fcea8cSEd Schouten "^K", "^L", "^M", "^N", "^O", "^P", "^Q", "^R", "^S", "^T", "^U",
21172fcea8cSEd Schouten "^V", "^W", "^X", "^Y", "^Z", "^[", "^\\", "^]", "^^", "^_"
21272fcea8cSEd Schouten };
21372fcea8cSEd Schouten
21472fcea8cSEd Schouten WINDOW *com_win;
21572fcea8cSEd Schouten WINDOW *text_win;
21672fcea8cSEd Schouten WINDOW *help_win;
21772fcea8cSEd Schouten WINDOW *info_win;
21872fcea8cSEd Schouten
21972fcea8cSEd Schouten
22072fcea8cSEd Schouten /*
22172fcea8cSEd Schouten | The following structure allows menu items to be flexibly declared.
22272fcea8cSEd Schouten | The first item is the string describing the selection, the second
22372fcea8cSEd Schouten | is the address of the procedure to call when the item is selected,
22472fcea8cSEd Schouten | and the third is the argument for the procedure.
22572fcea8cSEd Schouten |
22672fcea8cSEd Schouten | For those systems with i18n, the string should be accompanied by a
22772fcea8cSEd Schouten | catalog number. The 'int *' should be replaced with 'void *' on
22872fcea8cSEd Schouten | systems with that type.
22972fcea8cSEd Schouten |
23072fcea8cSEd Schouten | The first menu item will be the title of the menu, with NULL
23172fcea8cSEd Schouten | parameters for the procedure and argument, followed by the menu items.
23272fcea8cSEd Schouten |
23372fcea8cSEd Schouten | If the procedure value is NULL, the menu item is displayed, but no
23472fcea8cSEd Schouten | procedure is called when the item is selected. The number of the
23572fcea8cSEd Schouten | item will be returned. If the third (argument) parameter is -1, no
23672fcea8cSEd Schouten | argument is given to the procedure when it is called.
23772fcea8cSEd Schouten */
23872fcea8cSEd Schouten
23972fcea8cSEd Schouten struct menu_entries {
24072fcea8cSEd Schouten char *item_string;
24187cc8c6bSJohn Baldwin int (*procedure)(struct menu_entries *);
24272fcea8cSEd Schouten struct menu_entries *ptr_argument;
24387cc8c6bSJohn Baldwin int (*iprocedure)(int);
24487cc8c6bSJohn Baldwin void (*nprocedure)(void);
24572fcea8cSEd Schouten int argument;
24672fcea8cSEd Schouten };
24772fcea8cSEd Schouten
24887cc8c6bSJohn Baldwin unsigned char *resiz_line(int factor, struct text *rline, int rpos);
24987cc8c6bSJohn Baldwin void insert(int character);
25087cc8c6bSJohn Baldwin void delete(int disp);
25187cc8c6bSJohn Baldwin void scanline(unsigned char *pos);
25287cc8c6bSJohn Baldwin int tabshift(int temp_int);
25387cc8c6bSJohn Baldwin int out_char(WINDOW *window, int character, int column);
25487cc8c6bSJohn Baldwin int len_char(int character, int column);
25587cc8c6bSJohn Baldwin void draw_line(int vertical, int horiz, unsigned char *ptr, int t_pos, int length);
25687cc8c6bSJohn Baldwin void insert_line(int disp);
25787cc8c6bSJohn Baldwin struct text *txtalloc(void);
25887cc8c6bSJohn Baldwin struct files *name_alloc(void);
25987cc8c6bSJohn Baldwin unsigned char *next_word(unsigned char *string);
26087cc8c6bSJohn Baldwin void prev_word(void);
26187cc8c6bSJohn Baldwin void control(void);
26287cc8c6bSJohn Baldwin void emacs_control(void);
26387cc8c6bSJohn Baldwin void bottom(void);
26487cc8c6bSJohn Baldwin void top(void);
26587cc8c6bSJohn Baldwin void nextline(void);
26687cc8c6bSJohn Baldwin void prevline(void);
26787cc8c6bSJohn Baldwin void left(int disp);
26887cc8c6bSJohn Baldwin void right(int disp);
26987cc8c6bSJohn Baldwin void find_pos(void);
27087cc8c6bSJohn Baldwin void up(void);
27187cc8c6bSJohn Baldwin void down(void);
27287cc8c6bSJohn Baldwin void function_key(void);
27387cc8c6bSJohn Baldwin void print_buffer(void);
27487cc8c6bSJohn Baldwin void command_prompt(void);
27587cc8c6bSJohn Baldwin void command(char *cmd_str1);
27687cc8c6bSJohn Baldwin int scan(char *line, int offset, int column);
27787cc8c6bSJohn Baldwin char *get_string(char *prompt, int advance);
27887cc8c6bSJohn Baldwin int compare(char *string1, char *string2, int sensitive);
27987cc8c6bSJohn Baldwin void goto_line(char *cmd_str);
28087cc8c6bSJohn Baldwin void midscreen(int line, unsigned char *pnt);
28187cc8c6bSJohn Baldwin void get_options(int numargs, char *arguments[]);
28287cc8c6bSJohn Baldwin void check_fp(void);
28387cc8c6bSJohn Baldwin void get_file(char *file_name);
28487cc8c6bSJohn Baldwin void get_line(int length, unsigned char *in_string, int *append);
28587cc8c6bSJohn Baldwin void draw_screen(void);
28687cc8c6bSJohn Baldwin void finish(void);
28787cc8c6bSJohn Baldwin int quit(int noverify);
28887cc8c6bSJohn Baldwin void edit_abort(int arg);
28987cc8c6bSJohn Baldwin void delete_text(void);
29087cc8c6bSJohn Baldwin int write_file(char *file_name, int warn_if_exists);
29187cc8c6bSJohn Baldwin int search(int display_message);
29287cc8c6bSJohn Baldwin void search_prompt(void);
29387cc8c6bSJohn Baldwin void del_char(void);
29487cc8c6bSJohn Baldwin void undel_char(void);
29587cc8c6bSJohn Baldwin void del_word(void);
29687cc8c6bSJohn Baldwin void undel_word(void);
29787cc8c6bSJohn Baldwin void del_line(void);
29887cc8c6bSJohn Baldwin void undel_line(void);
29987cc8c6bSJohn Baldwin void adv_word(void);
30087cc8c6bSJohn Baldwin void move_rel(int direction, int lines);
30187cc8c6bSJohn Baldwin void eol(void);
30287cc8c6bSJohn Baldwin void bol(void);
30387cc8c6bSJohn Baldwin void adv_line(void);
30487cc8c6bSJohn Baldwin void sh_command(char *string);
30587cc8c6bSJohn Baldwin void set_up_term(void);
30687cc8c6bSJohn Baldwin void resize_check(void);
30787cc8c6bSJohn Baldwin int menu_op(struct menu_entries *);
30887cc8c6bSJohn Baldwin void paint_menu(struct menu_entries menu_list[], int max_width, int max_height, int list_size, int top_offset, WINDOW *menu_win, int off_start, int vert_size);
30987cc8c6bSJohn Baldwin void help(void);
31087cc8c6bSJohn Baldwin void paint_info_win(void);
31187cc8c6bSJohn Baldwin void no_info_window(void);
31287cc8c6bSJohn Baldwin void create_info_window(void);
31387cc8c6bSJohn Baldwin int file_op(int arg);
31487cc8c6bSJohn Baldwin void shell_op(void);
31587cc8c6bSJohn Baldwin void leave_op(void);
31687cc8c6bSJohn Baldwin void redraw(void);
31787cc8c6bSJohn Baldwin int Blank_Line(struct text *test_line);
31887cc8c6bSJohn Baldwin void Format(void);
31987cc8c6bSJohn Baldwin void ee_init(void);
32087cc8c6bSJohn Baldwin void dump_ee_conf(void);
32187cc8c6bSJohn Baldwin void echo_string(char *string);
32287cc8c6bSJohn Baldwin void spell_op(void);
32387cc8c6bSJohn Baldwin void ispell_op(void);
32487cc8c6bSJohn Baldwin int first_word_len(struct text *test_line);
32587cc8c6bSJohn Baldwin void Auto_Format(void);
32687cc8c6bSJohn Baldwin void modes_op(void);
32787cc8c6bSJohn Baldwin char *is_in_string(char *string, char *substring);
32887cc8c6bSJohn Baldwin char *resolve_name(char *name);
32987cc8c6bSJohn Baldwin int restrict_mode(void);
33087cc8c6bSJohn Baldwin int unique_test(char *string, char *list[]);
33187cc8c6bSJohn Baldwin void strings_init(void);
33272fcea8cSEd Schouten
33372fcea8cSEd Schouten #undef P_
33472fcea8cSEd Schouten /*
33572fcea8cSEd Schouten | allocate space here for the strings that will be in the menu
33672fcea8cSEd Schouten */
33772fcea8cSEd Schouten
33872fcea8cSEd Schouten struct menu_entries modes_menu[] = {
33972fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, 0}, /* title */
34072fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 1. tabs to spaces */
34172fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 2. case sensitive search*/
34272fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 3. margins observed */
34372fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 4. auto-paragraph */
34472fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 5. eightbit characters*/
34572fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 6. info window */
34672fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 7. emacs key bindings*/
34772fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 8. right margin */
34872fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 9. chinese text */
34972fcea8cSEd Schouten {"", NULL, NULL, NULL, dump_ee_conf, -1}, /* 10. save editor config */
35072fcea8cSEd Schouten {NULL, NULL, NULL, NULL, NULL, -1} /* terminator */
35172fcea8cSEd Schouten };
35272fcea8cSEd Schouten
35372fcea8cSEd Schouten char *mode_strings[11];
35472fcea8cSEd Schouten
35572fcea8cSEd Schouten #define NUM_MODES_ITEMS 10
35672fcea8cSEd Schouten
35772fcea8cSEd Schouten struct menu_entries config_dump_menu[] = {
35872fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, 0},
35972fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1},
36072fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1},
36172fcea8cSEd Schouten {NULL, NULL, NULL, NULL, NULL, -1}
36272fcea8cSEd Schouten };
36372fcea8cSEd Schouten
36472fcea8cSEd Schouten struct menu_entries leave_menu[] = {
36572fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1},
36672fcea8cSEd Schouten {"", NULL, NULL, NULL, finish, -1},
36772fcea8cSEd Schouten {"", NULL, NULL, quit, NULL, TRUE},
36872fcea8cSEd Schouten {NULL, NULL, NULL, NULL, NULL, -1}
36972fcea8cSEd Schouten };
37072fcea8cSEd Schouten
37172fcea8cSEd Schouten #define READ_FILE 1
37272fcea8cSEd Schouten #define WRITE_FILE 2
37372fcea8cSEd Schouten #define SAVE_FILE 3
37472fcea8cSEd Schouten
37572fcea8cSEd Schouten struct menu_entries file_menu[] = {
37672fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1},
37772fcea8cSEd Schouten {"", NULL, NULL, file_op, NULL, READ_FILE},
37872fcea8cSEd Schouten {"", NULL, NULL, file_op, NULL, WRITE_FILE},
37972fcea8cSEd Schouten {"", NULL, NULL, file_op, NULL, SAVE_FILE},
38072fcea8cSEd Schouten {"", NULL, NULL, NULL, print_buffer, -1},
38172fcea8cSEd Schouten {NULL, NULL, NULL, NULL, NULL, -1}
38272fcea8cSEd Schouten };
38372fcea8cSEd Schouten
38472fcea8cSEd Schouten struct menu_entries search_menu[] = {
38572fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, 0},
38672fcea8cSEd Schouten {"", NULL, NULL, NULL, search_prompt, -1},
38772fcea8cSEd Schouten {"", NULL, NULL, search, NULL, TRUE},
38872fcea8cSEd Schouten {NULL, NULL, NULL, NULL, NULL, -1}
38972fcea8cSEd Schouten };
39072fcea8cSEd Schouten
39172fcea8cSEd Schouten struct menu_entries spell_menu[] = {
39272fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1},
39372fcea8cSEd Schouten {"", NULL, NULL, NULL, spell_op, -1},
39472fcea8cSEd Schouten {"", NULL, NULL, NULL, ispell_op, -1},
39572fcea8cSEd Schouten {NULL, NULL, NULL, NULL, NULL, -1}
39672fcea8cSEd Schouten };
39772fcea8cSEd Schouten
39872fcea8cSEd Schouten struct menu_entries misc_menu[] = {
39972fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1},
40072fcea8cSEd Schouten {"", NULL, NULL, NULL, Format, -1},
40172fcea8cSEd Schouten {"", NULL, NULL, NULL, shell_op, -1},
40272fcea8cSEd Schouten {"", menu_op, spell_menu, NULL, NULL, -1},
40372fcea8cSEd Schouten {NULL, NULL, NULL, NULL, NULL, -1}
40472fcea8cSEd Schouten };
40572fcea8cSEd Schouten
40672fcea8cSEd Schouten struct menu_entries main_menu[] = {
40772fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1},
40872fcea8cSEd Schouten {"", NULL, NULL, NULL, leave_op, -1},
40972fcea8cSEd Schouten {"", NULL, NULL, NULL, help, -1},
41072fcea8cSEd Schouten {"", menu_op, file_menu, NULL, NULL, -1},
41172fcea8cSEd Schouten {"", NULL, NULL, NULL, redraw, -1},
41272fcea8cSEd Schouten {"", NULL, NULL, NULL, modes_op, -1},
41372fcea8cSEd Schouten {"", menu_op, search_menu, NULL, NULL, -1},
41472fcea8cSEd Schouten {"", menu_op, misc_menu, NULL, NULL, -1},
41572fcea8cSEd Schouten {NULL, NULL, NULL, NULL, NULL, -1}
41672fcea8cSEd Schouten };
41772fcea8cSEd Schouten
41872fcea8cSEd Schouten char *help_text[23];
41972fcea8cSEd Schouten char *control_keys[5];
42072fcea8cSEd Schouten
42172fcea8cSEd Schouten char *emacs_help_text[22];
42272fcea8cSEd Schouten char *emacs_control_keys[5];
42372fcea8cSEd Schouten
42472fcea8cSEd Schouten char *command_strings[5];
42572fcea8cSEd Schouten char *commands[32];
42672fcea8cSEd Schouten char *init_strings[22];
42772fcea8cSEd Schouten
42872fcea8cSEd Schouten #define MENU_WARN 1
42972fcea8cSEd Schouten
43072fcea8cSEd Schouten #define max_alpha_char 36
43172fcea8cSEd Schouten
43272fcea8cSEd Schouten /*
43372fcea8cSEd Schouten | Declarations for strings for localization
43472fcea8cSEd Schouten */
43572fcea8cSEd Schouten
43672fcea8cSEd Schouten char *com_win_message; /* to be shown in com_win if no info window */
43772fcea8cSEd Schouten char *no_file_string;
43872fcea8cSEd Schouten char *ascii_code_str;
43972fcea8cSEd Schouten char *printer_msg_str;
44072fcea8cSEd Schouten char *command_str;
44172fcea8cSEd Schouten char *file_write_prompt_str;
44272fcea8cSEd Schouten char *file_read_prompt_str;
44372fcea8cSEd Schouten char *char_str;
44472fcea8cSEd Schouten char *unkn_cmd_str;
44572fcea8cSEd Schouten char *non_unique_cmd_msg;
44672fcea8cSEd Schouten char *line_num_str;
44772fcea8cSEd Schouten char *line_len_str;
44872fcea8cSEd Schouten char *current_file_str;
44972fcea8cSEd Schouten char *usage0;
45072fcea8cSEd Schouten char *usage1;
45172fcea8cSEd Schouten char *usage2;
45272fcea8cSEd Schouten char *usage3;
45372fcea8cSEd Schouten char *usage4;
45472fcea8cSEd Schouten char *file_is_dir_msg;
45572fcea8cSEd Schouten char *new_file_msg;
45672fcea8cSEd Schouten char *cant_open_msg;
45772fcea8cSEd Schouten char *open_file_msg;
45872fcea8cSEd Schouten char *file_read_fin_msg;
45972fcea8cSEd Schouten char *reading_file_msg;
46072fcea8cSEd Schouten char *read_only_msg;
46172fcea8cSEd Schouten char *file_read_lines_msg;
46272fcea8cSEd Schouten char *save_file_name_prompt;
46372fcea8cSEd Schouten char *file_not_saved_msg;
46472fcea8cSEd Schouten char *changes_made_prompt;
46572fcea8cSEd Schouten char *yes_char;
46672fcea8cSEd Schouten char *file_exists_prompt;
46772fcea8cSEd Schouten char *create_file_fail_msg;
46872fcea8cSEd Schouten char *writing_file_msg;
46972fcea8cSEd Schouten char *file_written_msg;
47072fcea8cSEd Schouten char *searching_msg;
47172fcea8cSEd Schouten char *str_not_found_msg;
47272fcea8cSEd Schouten char *search_prompt_str;
47372fcea8cSEd Schouten char *exec_err_msg;
47472fcea8cSEd Schouten char *continue_msg;
47572fcea8cSEd Schouten char *menu_cancel_msg;
47672fcea8cSEd Schouten char *menu_size_err_msg;
47772fcea8cSEd Schouten char *press_any_key_msg;
47872fcea8cSEd Schouten char *shell_prompt;
47972fcea8cSEd Schouten char *formatting_msg;
48072fcea8cSEd Schouten char *shell_echo_msg;
48172fcea8cSEd Schouten char *spell_in_prog_msg;
48272fcea8cSEd Schouten char *margin_prompt;
48372fcea8cSEd Schouten char *restricted_msg;
48472fcea8cSEd Schouten char *ON;
48572fcea8cSEd Schouten char *OFF;
48672fcea8cSEd Schouten char *HELP;
48772fcea8cSEd Schouten char *WRITE;
48872fcea8cSEd Schouten char *READ;
48972fcea8cSEd Schouten char *LINE;
49072fcea8cSEd Schouten char *FILE_str;
49172fcea8cSEd Schouten char *CHARACTER;
49272fcea8cSEd Schouten char *REDRAW;
49372fcea8cSEd Schouten char *RESEQUENCE;
49472fcea8cSEd Schouten char *AUTHOR;
49572fcea8cSEd Schouten char *VERSION;
49672fcea8cSEd Schouten char *CASE;
49772fcea8cSEd Schouten char *NOCASE;
49872fcea8cSEd Schouten char *EXPAND;
49972fcea8cSEd Schouten char *NOEXPAND;
50072fcea8cSEd Schouten char *Exit_string;
50172fcea8cSEd Schouten char *QUIT_string;
50272fcea8cSEd Schouten char *INFO;
50372fcea8cSEd Schouten char *NOINFO;
50472fcea8cSEd Schouten char *MARGINS;
50572fcea8cSEd Schouten char *NOMARGINS;
50672fcea8cSEd Schouten char *AUTOFORMAT;
50772fcea8cSEd Schouten char *NOAUTOFORMAT;
50872fcea8cSEd Schouten char *Echo;
50972fcea8cSEd Schouten char *PRINTCOMMAND;
51072fcea8cSEd Schouten char *RIGHTMARGIN;
51172fcea8cSEd Schouten char *HIGHLIGHT;
51272fcea8cSEd Schouten char *NOHIGHLIGHT;
51372fcea8cSEd Schouten char *EIGHTBIT;
51472fcea8cSEd Schouten char *NOEIGHTBIT;
51572fcea8cSEd Schouten char *EMACS_string;
51672fcea8cSEd Schouten char *NOEMACS_string;
51772fcea8cSEd Schouten char *conf_dump_err_msg;
51872fcea8cSEd Schouten char *conf_dump_success_msg;
51972fcea8cSEd Schouten char *conf_not_saved_msg;
52072fcea8cSEd Schouten char *ree_no_file_msg;
52172fcea8cSEd Schouten char *cancel_string;
52272fcea8cSEd Schouten char *menu_too_lrg_msg;
52372fcea8cSEd Schouten char *more_above_str, *more_below_str;
52496b676e9SEd Schouten char *separator = "===============================================================================";
52572fcea8cSEd Schouten
52672fcea8cSEd Schouten char *chinese_cmd, *nochinese_cmd;
52772fcea8cSEd Schouten
52896b676e9SEd Schouten #ifndef __STDC__
52996b676e9SEd Schouten #ifndef HAS_STDLIB
53096b676e9SEd Schouten extern char *malloc();
53196b676e9SEd Schouten extern char *realloc();
53296b676e9SEd Schouten extern char *getenv();
53396b676e9SEd Schouten FILE *fopen(); /* declaration for open function */
53496b676e9SEd Schouten #endif /* HAS_STDLIB */
53596b676e9SEd Schouten #endif /* __STDC__ */
53672fcea8cSEd Schouten
53791517e3bSJohn Baldwin /* beginning of main program */
53872fcea8cSEd Schouten int
main(int argc,char * argv[])53991517e3bSJohn Baldwin main(int argc, char *argv[])
54072fcea8cSEd Schouten {
54196b676e9SEd Schouten int counter;
54296b676e9SEd Schouten
54396b676e9SEd Schouten for (counter = 1; counter < 24; counter++)
54496b676e9SEd Schouten signal(counter, SIG_IGN);
54572fcea8cSEd Schouten
5460cb61a32SYuri Pankov /* Always read from (and write to) a terminal. */
5470cb61a32SYuri Pankov if (!isatty(STDIN_FILENO) || !isatty(STDOUT_FILENO)) {
5480cb61a32SYuri Pankov fprintf(stderr,
5490cb61a32SYuri Pankov "ee's standard input and output must be a terminal\n");
5500cb61a32SYuri Pankov exit(1);
5510cb61a32SYuri Pankov }
5520cb61a32SYuri Pankov
55372fcea8cSEd Schouten signal(SIGCHLD, SIG_DFL);
55472fcea8cSEd Schouten signal(SIGSEGV, SIG_DFL);
55572fcea8cSEd Schouten signal(SIGINT, edit_abort);
55672fcea8cSEd Schouten d_char = malloc(3); /* provide a buffer for multi-byte chars */
55772fcea8cSEd Schouten d_word = malloc(150);
55896b676e9SEd Schouten *d_word = '\0';
55972fcea8cSEd Schouten d_line = NULL;
56072fcea8cSEd Schouten dlt_line = txtalloc();
56172fcea8cSEd Schouten dlt_line->line = d_line;
56272fcea8cSEd Schouten dlt_line->line_length = 0;
56372fcea8cSEd Schouten curr_line = first_line = txtalloc();
56472fcea8cSEd Schouten curr_line->line = point = malloc(10);
56572fcea8cSEd Schouten curr_line->line_length = 1;
56672fcea8cSEd Schouten curr_line->max_length = 10;
56772fcea8cSEd Schouten curr_line->prev_line = NULL;
56872fcea8cSEd Schouten curr_line->next_line = NULL;
56972fcea8cSEd Schouten curr_line->line_number = 1;
57072fcea8cSEd Schouten srch_str = NULL;
57172fcea8cSEd Schouten u_srch_str = NULL;
57272fcea8cSEd Schouten position = 1;
57372fcea8cSEd Schouten scr_pos =0;
57472fcea8cSEd Schouten scr_vert = 0;
57572fcea8cSEd Schouten scr_horz = 0;
57696b676e9SEd Schouten absolute_lin = 1;
57796b676e9SEd Schouten bit_bucket = fopen("/dev/null", "w");
57872fcea8cSEd Schouten edit = TRUE;
57972fcea8cSEd Schouten gold = case_sen = FALSE;
58072fcea8cSEd Schouten shell_fork = TRUE;
58172fcea8cSEd Schouten strings_init();
58272fcea8cSEd Schouten ee_init();
58372fcea8cSEd Schouten if (argc > 0 )
58472fcea8cSEd Schouten get_options(argc, argv);
58572fcea8cSEd Schouten set_up_term();
58672fcea8cSEd Schouten if (right_margin == 0)
58772fcea8cSEd Schouten right_margin = COLS - 1;
58872fcea8cSEd Schouten if (top_of_stack == NULL)
58972fcea8cSEd Schouten {
59072fcea8cSEd Schouten if (restrict_mode())
59172fcea8cSEd Schouten {
59272fcea8cSEd Schouten wmove(com_win, 0, 0);
59372fcea8cSEd Schouten werase(com_win);
594*0667538bSBaptiste Daroussin wprintw(com_win, "%s", ree_no_file_msg);
59572fcea8cSEd Schouten wrefresh(com_win);
59672fcea8cSEd Schouten edit_abort(0);
59772fcea8cSEd Schouten }
598*0667538bSBaptiste Daroussin wprintw(com_win, "%s", no_file_string);
59972fcea8cSEd Schouten wrefresh(com_win);
60072fcea8cSEd Schouten }
60172fcea8cSEd Schouten else
60272fcea8cSEd Schouten check_fp();
60372fcea8cSEd Schouten
60472fcea8cSEd Schouten clear_com_win = TRUE;
60572fcea8cSEd Schouten
60696b676e9SEd Schouten counter = 0;
60796b676e9SEd Schouten
60872fcea8cSEd Schouten while(edit)
60972fcea8cSEd Schouten {
61096b676e9SEd Schouten /*
61196b676e9SEd Schouten | display line and column information
61296b676e9SEd Schouten */
613cfe04e82SEd Schouten if (info_window)
614cfe04e82SEd Schouten {
615cfe04e82SEd Schouten if (!nohighlight)
61696b676e9SEd Schouten wstandout(info_win);
61796b676e9SEd Schouten wmove(info_win, 5, 0);
618*0667538bSBaptiste Daroussin wprintw(info_win, "%s", separator);
61996b676e9SEd Schouten wmove(info_win, 5, 5);
62096b676e9SEd Schouten wprintw(info_win, "line %d col %d lines from top %d ",
62196b676e9SEd Schouten curr_line->line_number, scr_horz, absolute_lin);
62296b676e9SEd Schouten wstandend(info_win);
62396b676e9SEd Schouten wrefresh(info_win);
624cfe04e82SEd Schouten }
625cfe04e82SEd Schouten
62696b676e9SEd Schouten wrefresh(text_win);
62772fcea8cSEd Schouten in = wgetch(text_win);
62872fcea8cSEd Schouten if (in == -1)
62996b676e9SEd Schouten exit(0); /* without this exit ee will go into an
63096b676e9SEd Schouten infinite loop if the network
63196b676e9SEd Schouten session detaches */
63272fcea8cSEd Schouten
63372fcea8cSEd Schouten resize_check();
63472fcea8cSEd Schouten
63572fcea8cSEd Schouten if (clear_com_win)
63672fcea8cSEd Schouten {
63772fcea8cSEd Schouten clear_com_win = FALSE;
63872fcea8cSEd Schouten wmove(com_win, 0, 0);
63972fcea8cSEd Schouten werase(com_win);
64072fcea8cSEd Schouten if (!info_window)
64172fcea8cSEd Schouten {
64272fcea8cSEd Schouten wprintw(com_win, "%s", com_win_message);
64372fcea8cSEd Schouten }
64472fcea8cSEd Schouten wrefresh(com_win);
64572fcea8cSEd Schouten }
64672fcea8cSEd Schouten
64772fcea8cSEd Schouten if (in > 255)
64872fcea8cSEd Schouten function_key();
64972fcea8cSEd Schouten else if ((in == '\10') || (in == 127))
65072fcea8cSEd Schouten {
65172fcea8cSEd Schouten in = 8; /* make sure key is set to backspace */
65272fcea8cSEd Schouten delete(TRUE);
65372fcea8cSEd Schouten }
65472fcea8cSEd Schouten else if ((in > 31) || (in == 9))
65572fcea8cSEd Schouten insert(in);
65672fcea8cSEd Schouten else if ((in >= 0) && (in <= 31))
65772fcea8cSEd Schouten {
65872fcea8cSEd Schouten if (emacs_keys_mode)
65972fcea8cSEd Schouten emacs_control();
66072fcea8cSEd Schouten else
66172fcea8cSEd Schouten control();
66272fcea8cSEd Schouten }
66372fcea8cSEd Schouten }
66472fcea8cSEd Schouten return(0);
66572fcea8cSEd Schouten }
66672fcea8cSEd Schouten
66791517e3bSJohn Baldwin /* resize the line to length + factor*/
66872fcea8cSEd Schouten unsigned char *
resiz_line(int factor,struct text * rline,int rpos)66991517e3bSJohn Baldwin resiz_line(int factor, struct text *rline, int rpos)
67072fcea8cSEd Schouten {
67172fcea8cSEd Schouten unsigned char *rpoint;
67272fcea8cSEd Schouten int resiz_var;
67372fcea8cSEd Schouten
67472fcea8cSEd Schouten rline->max_length += factor;
67572fcea8cSEd Schouten rpoint = rline->line = realloc(rline->line, rline->max_length );
67672fcea8cSEd Schouten for (resiz_var = 1 ; (resiz_var < rpos) ; resiz_var++)
67772fcea8cSEd Schouten rpoint++;
67872fcea8cSEd Schouten return(rpoint);
67972fcea8cSEd Schouten }
68072fcea8cSEd Schouten
68191517e3bSJohn Baldwin /* insert character into line */
68272fcea8cSEd Schouten void
insert(int character)68391517e3bSJohn Baldwin insert(int character)
68472fcea8cSEd Schouten {
68572fcea8cSEd Schouten int counter;
68672fcea8cSEd Schouten int value;
68772fcea8cSEd Schouten unsigned char *temp; /* temporary pointer */
68872fcea8cSEd Schouten unsigned char *temp2; /* temporary pointer */
68972fcea8cSEd Schouten
69072fcea8cSEd Schouten if ((character == '\011') && (expand_tabs))
69172fcea8cSEd Schouten {
69272fcea8cSEd Schouten counter = len_char('\011', scr_horz);
69372fcea8cSEd Schouten for (; counter > 0; counter--)
69472fcea8cSEd Schouten insert(' ');
69572fcea8cSEd Schouten if (auto_format)
69672fcea8cSEd Schouten Auto_Format();
69772fcea8cSEd Schouten return;
69872fcea8cSEd Schouten }
69972fcea8cSEd Schouten text_changes = TRUE;
70072fcea8cSEd Schouten if ((curr_line->max_length - curr_line->line_length) < 5)
70172fcea8cSEd Schouten point = resiz_line(10, curr_line, position);
70272fcea8cSEd Schouten curr_line->line_length++;
70372fcea8cSEd Schouten temp = point;
70472fcea8cSEd Schouten counter = position;
70572fcea8cSEd Schouten while (counter < curr_line->line_length) /* find end of line */
70672fcea8cSEd Schouten {
70772fcea8cSEd Schouten counter++;
70872fcea8cSEd Schouten temp++;
70972fcea8cSEd Schouten }
71072fcea8cSEd Schouten temp++; /* increase length of line by one */
71172fcea8cSEd Schouten while (point < temp)
71272fcea8cSEd Schouten {
71372fcea8cSEd Schouten temp2=temp - 1;
71472fcea8cSEd Schouten *temp= *temp2; /* shift characters over by one */
71572fcea8cSEd Schouten temp--;
71672fcea8cSEd Schouten }
71772fcea8cSEd Schouten *point = character; /* insert new character */
71872fcea8cSEd Schouten wclrtoeol(text_win);
719f39e07f3SAndrey A. Chernov if (!isprint((unsigned char)character)) /* check for TAB character*/
72072fcea8cSEd Schouten {
72172fcea8cSEd Schouten scr_pos = scr_horz += out_char(text_win, character, scr_horz);
72272fcea8cSEd Schouten point++;
72372fcea8cSEd Schouten position++;
72472fcea8cSEd Schouten }
72572fcea8cSEd Schouten else
72672fcea8cSEd Schouten {
727f39e07f3SAndrey A. Chernov waddch(text_win, (unsigned char)character);
72872fcea8cSEd Schouten scr_pos = ++scr_horz;
72972fcea8cSEd Schouten point++;
73072fcea8cSEd Schouten position ++;
73172fcea8cSEd Schouten }
73272fcea8cSEd Schouten
73372fcea8cSEd Schouten if ((observ_margins) && (right_margin < scr_pos))
73472fcea8cSEd Schouten {
73572fcea8cSEd Schouten counter = position;
73672fcea8cSEd Schouten while (scr_pos > right_margin)
73772fcea8cSEd Schouten prev_word();
73872fcea8cSEd Schouten if (scr_pos == 0)
73972fcea8cSEd Schouten {
74072fcea8cSEd Schouten while (position < counter)
74172fcea8cSEd Schouten right(TRUE);
74272fcea8cSEd Schouten }
74372fcea8cSEd Schouten else
74472fcea8cSEd Schouten {
74572fcea8cSEd Schouten counter -= position;
74672fcea8cSEd Schouten insert_line(TRUE);
74772fcea8cSEd Schouten for (value = 0; value < counter; value++)
74872fcea8cSEd Schouten right(TRUE);
74972fcea8cSEd Schouten }
75072fcea8cSEd Schouten }
75172fcea8cSEd Schouten
75272fcea8cSEd Schouten if ((scr_horz - horiz_offset) > last_col)
75372fcea8cSEd Schouten {
75472fcea8cSEd Schouten horiz_offset += 8;
75572fcea8cSEd Schouten midscreen(scr_vert, point);
75672fcea8cSEd Schouten }
75772fcea8cSEd Schouten
75872fcea8cSEd Schouten if ((auto_format) && (character == ' ') && (!formatted))
75972fcea8cSEd Schouten Auto_Format();
76072fcea8cSEd Schouten else if ((character != ' ') && (character != '\t'))
76172fcea8cSEd Schouten formatted = FALSE;
76272fcea8cSEd Schouten
76372fcea8cSEd Schouten draw_line(scr_vert, scr_horz, point, position, curr_line->line_length);
76472fcea8cSEd Schouten }
76572fcea8cSEd Schouten
76691517e3bSJohn Baldwin /* delete character */
76772fcea8cSEd Schouten void
delete(int disp)76891517e3bSJohn Baldwin delete(int disp)
76972fcea8cSEd Schouten {
77072fcea8cSEd Schouten unsigned char *tp;
77172fcea8cSEd Schouten unsigned char *temp2;
77272fcea8cSEd Schouten struct text *temp_buff;
77372fcea8cSEd Schouten int temp_vert;
77472fcea8cSEd Schouten int temp_pos;
77572fcea8cSEd Schouten int del_width = 1;
77672fcea8cSEd Schouten
77772fcea8cSEd Schouten if (point != curr_line->line) /* if not at beginning of line */
77872fcea8cSEd Schouten {
77972fcea8cSEd Schouten text_changes = TRUE;
78072fcea8cSEd Schouten temp2 = tp = point;
78172fcea8cSEd Schouten if ((ee_chinese) && (position >= 2) && (*(point - 2) > 127))
78272fcea8cSEd Schouten {
78372fcea8cSEd Schouten del_width = 2;
78472fcea8cSEd Schouten }
78572fcea8cSEd Schouten tp -= del_width;
78672fcea8cSEd Schouten point -= del_width;
78772fcea8cSEd Schouten position -= del_width;
78872fcea8cSEd Schouten temp_pos = position;
78972fcea8cSEd Schouten curr_line->line_length -= del_width;
79072fcea8cSEd Schouten if ((*tp < ' ') || (*tp >= 127)) /* check for TAB */
79172fcea8cSEd Schouten scanline(tp);
79272fcea8cSEd Schouten else
79372fcea8cSEd Schouten scr_horz -= del_width;
79472fcea8cSEd Schouten scr_pos = scr_horz;
79572fcea8cSEd Schouten if (in == 8)
79672fcea8cSEd Schouten {
79772fcea8cSEd Schouten if (del_width == 1)
79872fcea8cSEd Schouten *d_char = *point; /* save deleted character */
79972fcea8cSEd Schouten else
80072fcea8cSEd Schouten {
80172fcea8cSEd Schouten d_char[0] = *point;
80272fcea8cSEd Schouten d_char[1] = *(point + 1);
80372fcea8cSEd Schouten }
80496b676e9SEd Schouten d_char[del_width] = '\0';
80572fcea8cSEd Schouten }
80672fcea8cSEd Schouten while (temp_pos <= curr_line->line_length)
80772fcea8cSEd Schouten {
80872fcea8cSEd Schouten temp_pos++;
80972fcea8cSEd Schouten *tp = *temp2;
81072fcea8cSEd Schouten tp++;
81172fcea8cSEd Schouten temp2++;
81272fcea8cSEd Schouten }
8137bf1ea96SEd Schouten if ((scr_horz < horiz_offset) && (horiz_offset > 0))
81472fcea8cSEd Schouten {
81572fcea8cSEd Schouten horiz_offset -= 8;
81672fcea8cSEd Schouten midscreen(scr_vert, point);
81772fcea8cSEd Schouten }
81872fcea8cSEd Schouten }
81972fcea8cSEd Schouten else if (curr_line->prev_line != NULL)
82072fcea8cSEd Schouten {
82172fcea8cSEd Schouten text_changes = TRUE;
82272fcea8cSEd Schouten left(disp); /* go to previous line */
82372fcea8cSEd Schouten temp_buff = curr_line->next_line;
82472fcea8cSEd Schouten point = resiz_line(temp_buff->line_length, curr_line, position);
82572fcea8cSEd Schouten if (temp_buff->next_line != NULL)
82672fcea8cSEd Schouten temp_buff->next_line->prev_line = curr_line;
82772fcea8cSEd Schouten curr_line->next_line = temp_buff->next_line;
82872fcea8cSEd Schouten temp2 = temp_buff->line;
82972fcea8cSEd Schouten if (in == 8)
83072fcea8cSEd Schouten {
83172fcea8cSEd Schouten d_char[0] = '\n';
83296b676e9SEd Schouten d_char[1] = '\0';
83372fcea8cSEd Schouten }
83472fcea8cSEd Schouten tp = point;
83572fcea8cSEd Schouten temp_pos = 1;
83672fcea8cSEd Schouten while (temp_pos < temp_buff->line_length)
83772fcea8cSEd Schouten {
83872fcea8cSEd Schouten curr_line->line_length++;
83972fcea8cSEd Schouten temp_pos++;
84072fcea8cSEd Schouten *tp = *temp2;
84172fcea8cSEd Schouten tp++;
84272fcea8cSEd Schouten temp2++;
84372fcea8cSEd Schouten }
84496b676e9SEd Schouten *tp = '\0';
84572fcea8cSEd Schouten free(temp_buff->line);
84672fcea8cSEd Schouten free(temp_buff);
84772fcea8cSEd Schouten temp_buff = curr_line;
84872fcea8cSEd Schouten temp_vert = scr_vert;
84972fcea8cSEd Schouten scr_pos = scr_horz;
85072fcea8cSEd Schouten if (scr_vert < last_line)
85172fcea8cSEd Schouten {
85272fcea8cSEd Schouten wmove(text_win, scr_vert + 1, 0);
85372fcea8cSEd Schouten wdeleteln(text_win);
85472fcea8cSEd Schouten }
85572fcea8cSEd Schouten while ((temp_buff != NULL) && (temp_vert < last_line))
85672fcea8cSEd Schouten {
85772fcea8cSEd Schouten temp_buff = temp_buff->next_line;
85872fcea8cSEd Schouten temp_vert++;
85972fcea8cSEd Schouten }
86072fcea8cSEd Schouten if ((temp_vert == last_line) && (temp_buff != NULL))
86172fcea8cSEd Schouten {
86272fcea8cSEd Schouten tp = temp_buff->line;
86372fcea8cSEd Schouten wmove(text_win, last_line,0);
86472fcea8cSEd Schouten wclrtobot(text_win);
86572fcea8cSEd Schouten draw_line(last_line, 0, tp, 1, temp_buff->line_length);
86672fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset));
86772fcea8cSEd Schouten }
86872fcea8cSEd Schouten }
86972fcea8cSEd Schouten draw_line(scr_vert, scr_horz, point, position, curr_line->line_length);
87072fcea8cSEd Schouten formatted = FALSE;
87172fcea8cSEd Schouten }
87272fcea8cSEd Schouten
87391517e3bSJohn Baldwin /* find the proper horizontal position for the pointer */
87472fcea8cSEd Schouten void
scanline(unsigned char * pos)87591517e3bSJohn Baldwin scanline(unsigned char *pos)
87672fcea8cSEd Schouten {
87772fcea8cSEd Schouten int temp;
87872fcea8cSEd Schouten unsigned char *ptr;
87972fcea8cSEd Schouten
88072fcea8cSEd Schouten ptr = curr_line->line;
88172fcea8cSEd Schouten temp = 0;
88272fcea8cSEd Schouten while (ptr < pos)
88372fcea8cSEd Schouten {
88472fcea8cSEd Schouten if (*ptr <= 8)
88572fcea8cSEd Schouten temp += 2;
88672fcea8cSEd Schouten else if (*ptr == 9)
88772fcea8cSEd Schouten temp += tabshift(temp);
88872fcea8cSEd Schouten else if ((*ptr >= 10) && (*ptr <= 31))
88972fcea8cSEd Schouten temp += 2;
89072fcea8cSEd Schouten else if ((*ptr >= 32) && (*ptr < 127))
89172fcea8cSEd Schouten temp++;
89272fcea8cSEd Schouten else if (*ptr == 127)
89372fcea8cSEd Schouten temp += 2;
89472fcea8cSEd Schouten else if (!eightbit)
89572fcea8cSEd Schouten temp += 5;
89672fcea8cSEd Schouten else
89772fcea8cSEd Schouten temp++;
89872fcea8cSEd Schouten ptr++;
89972fcea8cSEd Schouten }
90072fcea8cSEd Schouten scr_horz = temp;
90172fcea8cSEd Schouten if ((scr_horz - horiz_offset) > last_col)
90272fcea8cSEd Schouten {
90372fcea8cSEd Schouten horiz_offset = (scr_horz - (scr_horz % 8)) - (COLS - 8);
90472fcea8cSEd Schouten midscreen(scr_vert, point);
90572fcea8cSEd Schouten }
90672fcea8cSEd Schouten else if (scr_horz < horiz_offset)
90772fcea8cSEd Schouten {
90872fcea8cSEd Schouten horiz_offset = max(0, (scr_horz - (scr_horz % 8)));
90972fcea8cSEd Schouten midscreen(scr_vert, point);
91072fcea8cSEd Schouten }
91172fcea8cSEd Schouten }
91272fcea8cSEd Schouten
91391517e3bSJohn Baldwin /* give the number of spaces to shift */
91472fcea8cSEd Schouten int
tabshift(int temp_int)91591517e3bSJohn Baldwin tabshift(int temp_int)
91672fcea8cSEd Schouten {
91772fcea8cSEd Schouten int leftover;
91872fcea8cSEd Schouten
91972fcea8cSEd Schouten leftover = ((temp_int + 1) % 8);
92072fcea8cSEd Schouten if (leftover == 0)
92172fcea8cSEd Schouten return (1);
92272fcea8cSEd Schouten else
92372fcea8cSEd Schouten return (9 - leftover);
92472fcea8cSEd Schouten }
92572fcea8cSEd Schouten
92691517e3bSJohn Baldwin /* output non-printing character */
92772fcea8cSEd Schouten int
out_char(WINDOW * window,int character,int column)92891517e3bSJohn Baldwin out_char(WINDOW *window, int character, int column)
92972fcea8cSEd Schouten {
93072fcea8cSEd Schouten int i1, i2;
93196b676e9SEd Schouten char *string;
93272fcea8cSEd Schouten char string2[8];
93372fcea8cSEd Schouten
93472fcea8cSEd Schouten if (character == TAB)
93572fcea8cSEd Schouten {
93672fcea8cSEd Schouten i1 = tabshift(column);
93772fcea8cSEd Schouten for (i2 = 0;
93872fcea8cSEd Schouten (i2 < i1) && (((column+i2+1)-horiz_offset) < last_col); i2++)
93972fcea8cSEd Schouten {
94072fcea8cSEd Schouten waddch(window, ' ');
94172fcea8cSEd Schouten }
94272fcea8cSEd Schouten return(i1);
94372fcea8cSEd Schouten }
94472fcea8cSEd Schouten else if ((character >= '\0') && (character < ' '))
94572fcea8cSEd Schouten {
94672fcea8cSEd Schouten string = table[(int) character];
94772fcea8cSEd Schouten }
94872fcea8cSEd Schouten else if ((character < 0) || (character >= 127))
94972fcea8cSEd Schouten {
95072fcea8cSEd Schouten if (character == 127)
95172fcea8cSEd Schouten string = "^?";
95272fcea8cSEd Schouten else if (!eightbit)
95372fcea8cSEd Schouten {
95472fcea8cSEd Schouten sprintf(string2, "<%d>", (character < 0) ? (character + 256) : character);
95572fcea8cSEd Schouten string = string2;
95672fcea8cSEd Schouten }
95772fcea8cSEd Schouten else
95872fcea8cSEd Schouten {
959f39e07f3SAndrey A. Chernov waddch(window, (unsigned char)character );
96072fcea8cSEd Schouten return(1);
96172fcea8cSEd Schouten }
96272fcea8cSEd Schouten }
96372fcea8cSEd Schouten else
96472fcea8cSEd Schouten {
965f39e07f3SAndrey A. Chernov waddch(window, (unsigned char)character);
96672fcea8cSEd Schouten return(1);
96772fcea8cSEd Schouten }
96896b676e9SEd Schouten for (i2 = 0; (string[i2] != '\0') && (((column+i2+1)-horiz_offset) < last_col); i2++)
969f39e07f3SAndrey A. Chernov waddch(window, (unsigned char)string[i2]);
97072fcea8cSEd Schouten return(strlen(string));
97172fcea8cSEd Schouten }
97272fcea8cSEd Schouten
97391517e3bSJohn Baldwin /* return the length of the character */
97472fcea8cSEd Schouten int
len_char(int character,int column)97591517e3bSJohn Baldwin len_char(int character, int column)
97672fcea8cSEd Schouten {
97772fcea8cSEd Schouten int length;
97872fcea8cSEd Schouten
97972fcea8cSEd Schouten if (character == '\t')
98072fcea8cSEd Schouten length = tabshift(column);
98172fcea8cSEd Schouten else if ((character >= 0) && (character < 32))
98272fcea8cSEd Schouten length = 2;
98372fcea8cSEd Schouten else if ((character >= 32) && (character <= 126))
98472fcea8cSEd Schouten length = 1;
98572fcea8cSEd Schouten else if (character == 127)
98672fcea8cSEd Schouten length = 2;
98772fcea8cSEd Schouten else if (((character > 126) || (character < 0)) && (!eightbit))
98872fcea8cSEd Schouten length = 5;
98972fcea8cSEd Schouten else
99072fcea8cSEd Schouten length = 1;
99172fcea8cSEd Schouten
99272fcea8cSEd Schouten return(length);
99372fcea8cSEd Schouten }
99472fcea8cSEd Schouten
99591517e3bSJohn Baldwin /* redraw line from current position */
99672fcea8cSEd Schouten void
draw_line(int vertical,int horiz,unsigned char * ptr,int t_pos,int length)99791517e3bSJohn Baldwin draw_line(int vertical, int horiz, unsigned char *ptr, int t_pos, int length)
99872fcea8cSEd Schouten {
99972fcea8cSEd Schouten int d; /* partial length of special or tab char to display */
100072fcea8cSEd Schouten unsigned char *temp; /* temporary pointer to position in line */
100172fcea8cSEd Schouten int abs_column; /* offset in screen units from begin of line */
100272fcea8cSEd Schouten int column; /* horizontal position on screen */
100372fcea8cSEd Schouten int row; /* vertical position on screen */
100472fcea8cSEd Schouten int posit; /* temporary position indicator within line */
100572fcea8cSEd Schouten
100672fcea8cSEd Schouten abs_column = horiz;
100772fcea8cSEd Schouten column = horiz - horiz_offset;
100872fcea8cSEd Schouten row = vertical;
100972fcea8cSEd Schouten temp = ptr;
101072fcea8cSEd Schouten d = 0;
101172fcea8cSEd Schouten posit = t_pos;
101272fcea8cSEd Schouten if (column < 0)
101372fcea8cSEd Schouten {
101472fcea8cSEd Schouten wmove(text_win, row, 0);
101572fcea8cSEd Schouten wclrtoeol(text_win);
101672fcea8cSEd Schouten }
101772fcea8cSEd Schouten while (column < 0)
101872fcea8cSEd Schouten {
101972fcea8cSEd Schouten d = len_char(*temp, abs_column);
102072fcea8cSEd Schouten abs_column += d;
102172fcea8cSEd Schouten column += d;
102272fcea8cSEd Schouten posit++;
102372fcea8cSEd Schouten temp++;
102472fcea8cSEd Schouten }
102572fcea8cSEd Schouten wmove(text_win, row, column);
102672fcea8cSEd Schouten wclrtoeol(text_win);
102772fcea8cSEd Schouten while ((posit < length) && (column <= last_col))
102872fcea8cSEd Schouten {
1029f39e07f3SAndrey A. Chernov if (!isprint(*temp))
103072fcea8cSEd Schouten {
103172fcea8cSEd Schouten column += len_char(*temp, abs_column);
103272fcea8cSEd Schouten abs_column += out_char(text_win, *temp, abs_column);
103372fcea8cSEd Schouten }
103472fcea8cSEd Schouten else
103572fcea8cSEd Schouten {
103672fcea8cSEd Schouten abs_column++;
103772fcea8cSEd Schouten column++;
103872fcea8cSEd Schouten waddch(text_win, *temp);
103972fcea8cSEd Schouten }
104072fcea8cSEd Schouten posit++;
104172fcea8cSEd Schouten temp++;
104272fcea8cSEd Schouten }
104372fcea8cSEd Schouten if (column < last_col)
104472fcea8cSEd Schouten wclrtoeol(text_win);
104572fcea8cSEd Schouten wmove(text_win, vertical, (horiz - horiz_offset));
104672fcea8cSEd Schouten }
104772fcea8cSEd Schouten
104891517e3bSJohn Baldwin /* insert new line */
104972fcea8cSEd Schouten void
insert_line(int disp)105091517e3bSJohn Baldwin insert_line(int disp)
105172fcea8cSEd Schouten {
105272fcea8cSEd Schouten int temp_pos;
105372fcea8cSEd Schouten int temp_pos2;
105472fcea8cSEd Schouten unsigned char *temp;
105572fcea8cSEd Schouten unsigned char *extra;
105672fcea8cSEd Schouten struct text *temp_nod;
105772fcea8cSEd Schouten
105872fcea8cSEd Schouten text_changes = TRUE;
105972fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset));
106072fcea8cSEd Schouten wclrtoeol(text_win);
106172fcea8cSEd Schouten temp_nod= txtalloc();
106272fcea8cSEd Schouten temp_nod->line = extra= malloc(10);
106372fcea8cSEd Schouten temp_nod->line_length = 1;
106472fcea8cSEd Schouten temp_nod->max_length = 10;
106596b676e9SEd Schouten temp_nod->line_number = curr_line->line_number + 1;
106672fcea8cSEd Schouten temp_nod->next_line = curr_line->next_line;
106772fcea8cSEd Schouten if (temp_nod->next_line != NULL)
106872fcea8cSEd Schouten temp_nod->next_line->prev_line = temp_nod;
106972fcea8cSEd Schouten temp_nod->prev_line = curr_line;
107072fcea8cSEd Schouten curr_line->next_line = temp_nod;
107172fcea8cSEd Schouten temp_pos2 = position;
107272fcea8cSEd Schouten temp = point;
107372fcea8cSEd Schouten if (temp_pos2 < curr_line->line_length)
107472fcea8cSEd Schouten {
107572fcea8cSEd Schouten temp_pos = 1;
107672fcea8cSEd Schouten while (temp_pos2 < curr_line->line_length)
107772fcea8cSEd Schouten {
107872fcea8cSEd Schouten if ((temp_nod->max_length - temp_nod->line_length)< 5)
107972fcea8cSEd Schouten extra = resiz_line(10, temp_nod, temp_pos);
108072fcea8cSEd Schouten temp_nod->line_length++;
108172fcea8cSEd Schouten temp_pos++;
108272fcea8cSEd Schouten temp_pos2++;
108372fcea8cSEd Schouten *extra= *temp;
108472fcea8cSEd Schouten extra++;
108572fcea8cSEd Schouten temp++;
108672fcea8cSEd Schouten }
108772fcea8cSEd Schouten temp=point;
108896b676e9SEd Schouten *temp = '\0';
108972fcea8cSEd Schouten temp = resiz_line((1 - temp_nod->line_length), curr_line, position);
109072fcea8cSEd Schouten curr_line->line_length = 1 + temp - curr_line->line;
109172fcea8cSEd Schouten }
109272fcea8cSEd Schouten curr_line->line_length = position;
109396b676e9SEd Schouten absolute_lin++;
109472fcea8cSEd Schouten curr_line = temp_nod;
109596b676e9SEd Schouten *extra = '\0';
109672fcea8cSEd Schouten position = 1;
109772fcea8cSEd Schouten point= curr_line->line;
109872fcea8cSEd Schouten if (disp)
109972fcea8cSEd Schouten {
110072fcea8cSEd Schouten if (scr_vert < last_line)
110172fcea8cSEd Schouten {
110272fcea8cSEd Schouten scr_vert++;
110372fcea8cSEd Schouten wclrtoeol(text_win);
110472fcea8cSEd Schouten wmove(text_win, scr_vert, 0);
110572fcea8cSEd Schouten winsertln(text_win);
110672fcea8cSEd Schouten }
110772fcea8cSEd Schouten else
110872fcea8cSEd Schouten {
110972fcea8cSEd Schouten wmove(text_win, 0,0);
111072fcea8cSEd Schouten wdeleteln(text_win);
111172fcea8cSEd Schouten wmove(text_win, last_line,0);
111272fcea8cSEd Schouten wclrtobot(text_win);
111372fcea8cSEd Schouten }
111472fcea8cSEd Schouten scr_pos = scr_horz = 0;
111572fcea8cSEd Schouten if (horiz_offset)
111672fcea8cSEd Schouten {
111772fcea8cSEd Schouten horiz_offset = 0;
111872fcea8cSEd Schouten midscreen(scr_vert, point);
111972fcea8cSEd Schouten }
112072fcea8cSEd Schouten draw_line(scr_vert, scr_horz, point, position,
112172fcea8cSEd Schouten curr_line->line_length);
112272fcea8cSEd Schouten }
112372fcea8cSEd Schouten }
112472fcea8cSEd Schouten
112591517e3bSJohn Baldwin /* allocate space for line structure */
112691517e3bSJohn Baldwin struct text *
txtalloc(void)112791517e3bSJohn Baldwin txtalloc(void)
112872fcea8cSEd Schouten {
112972fcea8cSEd Schouten return((struct text *) malloc(sizeof( struct text)));
113072fcea8cSEd Schouten }
113172fcea8cSEd Schouten
113291517e3bSJohn Baldwin /* allocate space for file name list node */
113391517e3bSJohn Baldwin struct files *
name_alloc(void)113491517e3bSJohn Baldwin name_alloc(void)
113572fcea8cSEd Schouten {
113672fcea8cSEd Schouten return((struct files *) malloc(sizeof( struct files)));
113772fcea8cSEd Schouten }
113872fcea8cSEd Schouten
113991517e3bSJohn Baldwin /* move to next word in string */
114091517e3bSJohn Baldwin unsigned char *
next_word(unsigned char * string)114191517e3bSJohn Baldwin next_word(unsigned char *string)
114272fcea8cSEd Schouten {
114396b676e9SEd Schouten while ((*string != '\0') && ((*string != 32) && (*string != 9)))
114472fcea8cSEd Schouten string++;
114596b676e9SEd Schouten while ((*string != '\0') && ((*string == 32) || (*string == 9)))
114672fcea8cSEd Schouten string++;
114772fcea8cSEd Schouten return(string);
114872fcea8cSEd Schouten }
114972fcea8cSEd Schouten
115091517e3bSJohn Baldwin /* move to start of previous word in text */
115172fcea8cSEd Schouten void
prev_word(void)115291517e3bSJohn Baldwin prev_word(void)
115372fcea8cSEd Schouten {
115472fcea8cSEd Schouten if (position != 1)
115572fcea8cSEd Schouten {
115672fcea8cSEd Schouten if ((position != 1) && ((point[-1] == ' ') || (point[-1] == '\t')))
115772fcea8cSEd Schouten { /* if at the start of a word */
115872fcea8cSEd Schouten while ((position != 1) && ((*point != ' ') && (*point != '\t')))
115972fcea8cSEd Schouten left(TRUE);
116072fcea8cSEd Schouten }
116172fcea8cSEd Schouten while ((position != 1) && ((*point == ' ') || (*point == '\t')))
116272fcea8cSEd Schouten left(TRUE);
116372fcea8cSEd Schouten while ((position != 1) && ((*point != ' ') && (*point != '\t')))
116472fcea8cSEd Schouten left(TRUE);
116572fcea8cSEd Schouten if ((position != 1) && ((*point == ' ') || (*point == '\t')))
116672fcea8cSEd Schouten right(TRUE);
116772fcea8cSEd Schouten }
116872fcea8cSEd Schouten else
116972fcea8cSEd Schouten left(TRUE);
117072fcea8cSEd Schouten }
117172fcea8cSEd Schouten
117291517e3bSJohn Baldwin /* use control for commands */
117372fcea8cSEd Schouten void
control(void)117491517e3bSJohn Baldwin control(void)
117572fcea8cSEd Schouten {
117672fcea8cSEd Schouten char *string;
117772fcea8cSEd Schouten
117872fcea8cSEd Schouten if (in == 1) /* control a */
117972fcea8cSEd Schouten {
118072fcea8cSEd Schouten string = get_string(ascii_code_str, TRUE);
118196b676e9SEd Schouten if (*string != '\0')
118272fcea8cSEd Schouten {
118372fcea8cSEd Schouten in = atoi(string);
118472fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset));
118572fcea8cSEd Schouten insert(in);
118672fcea8cSEd Schouten }
118772fcea8cSEd Schouten free(string);
118872fcea8cSEd Schouten }
118972fcea8cSEd Schouten else if (in == 2) /* control b */
119072fcea8cSEd Schouten bottom();
119172fcea8cSEd Schouten else if (in == 3) /* control c */
119272fcea8cSEd Schouten {
119372fcea8cSEd Schouten command_prompt();
119472fcea8cSEd Schouten }
119572fcea8cSEd Schouten else if (in == 4) /* control d */
119672fcea8cSEd Schouten down();
119772fcea8cSEd Schouten else if (in == 5) /* control e */
119872fcea8cSEd Schouten search_prompt();
119972fcea8cSEd Schouten else if (in == 6) /* control f */
120072fcea8cSEd Schouten undel_char();
120172fcea8cSEd Schouten else if (in == 7) /* control g */
120272fcea8cSEd Schouten bol();
120372fcea8cSEd Schouten else if (in == 8) /* control h */
120472fcea8cSEd Schouten delete(TRUE);
120572fcea8cSEd Schouten else if (in == 9) /* control i */
120672fcea8cSEd Schouten ;
120772fcea8cSEd Schouten else if (in == 10) /* control j */
120872fcea8cSEd Schouten insert_line(TRUE);
120972fcea8cSEd Schouten else if (in == 11) /* control k */
121072fcea8cSEd Schouten del_char();
121172fcea8cSEd Schouten else if (in == 12) /* control l */
121272fcea8cSEd Schouten left(TRUE);
121372fcea8cSEd Schouten else if (in == 13) /* control m */
121472fcea8cSEd Schouten insert_line(TRUE);
121572fcea8cSEd Schouten else if (in == 14) /* control n */
12167bf1ea96SEd Schouten move_rel('d', max(5, (last_line - 5)));
121772fcea8cSEd Schouten else if (in == 15) /* control o */
121872fcea8cSEd Schouten eol();
121972fcea8cSEd Schouten else if (in == 16) /* control p */
12207bf1ea96SEd Schouten move_rel('u', max(5, (last_line - 5)));
122172fcea8cSEd Schouten else if (in == 17) /* control q */
122272fcea8cSEd Schouten ;
122372fcea8cSEd Schouten else if (in == 18) /* control r */
122472fcea8cSEd Schouten right(TRUE);
122572fcea8cSEd Schouten else if (in == 19) /* control s */
122672fcea8cSEd Schouten ;
122772fcea8cSEd Schouten else if (in == 20) /* control t */
122872fcea8cSEd Schouten top();
122972fcea8cSEd Schouten else if (in == 21) /* control u */
123072fcea8cSEd Schouten up();
123172fcea8cSEd Schouten else if (in == 22) /* control v */
123272fcea8cSEd Schouten undel_word();
123372fcea8cSEd Schouten else if (in == 23) /* control w */
123472fcea8cSEd Schouten del_word();
123572fcea8cSEd Schouten else if (in == 24) /* control x */
123672fcea8cSEd Schouten search(TRUE);
123772fcea8cSEd Schouten else if (in == 25) /* control y */
123872fcea8cSEd Schouten del_line();
123972fcea8cSEd Schouten else if (in == 26) /* control z */
124072fcea8cSEd Schouten undel_line();
124172fcea8cSEd Schouten else if (in == 27) /* control [ (escape) */
124272fcea8cSEd Schouten {
124372fcea8cSEd Schouten menu_op(main_menu);
124472fcea8cSEd Schouten }
124572fcea8cSEd Schouten }
124672fcea8cSEd Schouten
124772fcea8cSEd Schouten /*
124872fcea8cSEd Schouten | Emacs control-key bindings
124972fcea8cSEd Schouten */
125072fcea8cSEd Schouten
125172fcea8cSEd Schouten void
emacs_control(void)125291517e3bSJohn Baldwin emacs_control(void)
125372fcea8cSEd Schouten {
125472fcea8cSEd Schouten char *string;
125572fcea8cSEd Schouten
125672fcea8cSEd Schouten if (in == 1) /* control a */
125772fcea8cSEd Schouten bol();
125872fcea8cSEd Schouten else if (in == 2) /* control b */
125972fcea8cSEd Schouten left(TRUE);
126072fcea8cSEd Schouten else if (in == 3) /* control c */
126172fcea8cSEd Schouten {
126272fcea8cSEd Schouten command_prompt();
126372fcea8cSEd Schouten }
126472fcea8cSEd Schouten else if (in == 4) /* control d */
126572fcea8cSEd Schouten del_char();
126672fcea8cSEd Schouten else if (in == 5) /* control e */
126772fcea8cSEd Schouten eol();
126872fcea8cSEd Schouten else if (in == 6) /* control f */
126972fcea8cSEd Schouten right(TRUE);
127072fcea8cSEd Schouten else if (in == 7) /* control g */
12717bf1ea96SEd Schouten move_rel('u', max(5, (last_line - 5)));
127272fcea8cSEd Schouten else if (in == 8) /* control h */
127372fcea8cSEd Schouten delete(TRUE);
127472fcea8cSEd Schouten else if (in == 9) /* control i */
127572fcea8cSEd Schouten ;
127672fcea8cSEd Schouten else if (in == 10) /* control j */
127772fcea8cSEd Schouten undel_char();
127872fcea8cSEd Schouten else if (in == 11) /* control k */
127972fcea8cSEd Schouten del_line();
128072fcea8cSEd Schouten else if (in == 12) /* control l */
128172fcea8cSEd Schouten undel_line();
128272fcea8cSEd Schouten else if (in == 13) /* control m */
128372fcea8cSEd Schouten insert_line(TRUE);
128472fcea8cSEd Schouten else if (in == 14) /* control n */
128572fcea8cSEd Schouten down();
128672fcea8cSEd Schouten else if (in == 15) /* control o */
128772fcea8cSEd Schouten {
128872fcea8cSEd Schouten string = get_string(ascii_code_str, TRUE);
128996b676e9SEd Schouten if (*string != '\0')
129072fcea8cSEd Schouten {
129172fcea8cSEd Schouten in = atoi(string);
129272fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset));
129372fcea8cSEd Schouten insert(in);
129472fcea8cSEd Schouten }
129572fcea8cSEd Schouten free(string);
129672fcea8cSEd Schouten }
129772fcea8cSEd Schouten else if (in == 16) /* control p */
129872fcea8cSEd Schouten up();
129972fcea8cSEd Schouten else if (in == 17) /* control q */
130072fcea8cSEd Schouten ;
130172fcea8cSEd Schouten else if (in == 18) /* control r */
130272fcea8cSEd Schouten undel_word();
130372fcea8cSEd Schouten else if (in == 19) /* control s */
130472fcea8cSEd Schouten ;
130572fcea8cSEd Schouten else if (in == 20) /* control t */
130672fcea8cSEd Schouten top();
130772fcea8cSEd Schouten else if (in == 21) /* control u */
130872fcea8cSEd Schouten bottom();
130972fcea8cSEd Schouten else if (in == 22) /* control v */
13107bf1ea96SEd Schouten move_rel('d', max(5, (last_line - 5)));
131172fcea8cSEd Schouten else if (in == 23) /* control w */
131272fcea8cSEd Schouten del_word();
131372fcea8cSEd Schouten else if (in == 24) /* control x */
131472fcea8cSEd Schouten search(TRUE);
131572fcea8cSEd Schouten else if (in == 25) /* control y */
131672fcea8cSEd Schouten search_prompt();
131772fcea8cSEd Schouten else if (in == 26) /* control z */
131872fcea8cSEd Schouten adv_word();
131972fcea8cSEd Schouten else if (in == 27) /* control [ (escape) */
132072fcea8cSEd Schouten {
132172fcea8cSEd Schouten menu_op(main_menu);
132272fcea8cSEd Schouten }
132372fcea8cSEd Schouten }
132472fcea8cSEd Schouten
132591517e3bSJohn Baldwin /* go to bottom of file */
132672fcea8cSEd Schouten void
bottom(void)132791517e3bSJohn Baldwin bottom(void)
132872fcea8cSEd Schouten {
132972fcea8cSEd Schouten while (curr_line->next_line != NULL)
133096b676e9SEd Schouten {
133172fcea8cSEd Schouten curr_line = curr_line->next_line;
133296b676e9SEd Schouten absolute_lin++;
133396b676e9SEd Schouten }
133472fcea8cSEd Schouten point = curr_line->line;
133572fcea8cSEd Schouten if (horiz_offset)
133672fcea8cSEd Schouten horiz_offset = 0;
133772fcea8cSEd Schouten position = 1;
133872fcea8cSEd Schouten midscreen(last_line, point);
133972fcea8cSEd Schouten scr_pos = scr_horz;
134072fcea8cSEd Schouten }
134172fcea8cSEd Schouten
134291517e3bSJohn Baldwin /* go to top of file */
134372fcea8cSEd Schouten void
top(void)134491517e3bSJohn Baldwin top(void)
134572fcea8cSEd Schouten {
134672fcea8cSEd Schouten while (curr_line->prev_line != NULL)
134796b676e9SEd Schouten {
134872fcea8cSEd Schouten curr_line = curr_line->prev_line;
134996b676e9SEd Schouten absolute_lin--;
135096b676e9SEd Schouten }
135172fcea8cSEd Schouten point = curr_line->line;
135272fcea8cSEd Schouten if (horiz_offset)
135372fcea8cSEd Schouten horiz_offset = 0;
135472fcea8cSEd Schouten position = 1;
135572fcea8cSEd Schouten midscreen(0, point);
135672fcea8cSEd Schouten scr_pos = scr_horz;
135772fcea8cSEd Schouten }
135872fcea8cSEd Schouten
135991517e3bSJohn Baldwin /* move pointers to start of next line */
136072fcea8cSEd Schouten void
nextline(void)136191517e3bSJohn Baldwin nextline(void)
136272fcea8cSEd Schouten {
136372fcea8cSEd Schouten curr_line = curr_line->next_line;
136496b676e9SEd Schouten absolute_lin++;
136572fcea8cSEd Schouten point = curr_line->line;
136672fcea8cSEd Schouten position = 1;
136772fcea8cSEd Schouten if (scr_vert == last_line)
136872fcea8cSEd Schouten {
136972fcea8cSEd Schouten wmove(text_win, 0,0);
137072fcea8cSEd Schouten wdeleteln(text_win);
137172fcea8cSEd Schouten wmove(text_win, last_line,0);
137272fcea8cSEd Schouten wclrtobot(text_win);
137372fcea8cSEd Schouten draw_line(last_line,0,point,1,curr_line->line_length);
137472fcea8cSEd Schouten }
137572fcea8cSEd Schouten else
137672fcea8cSEd Schouten scr_vert++;
137772fcea8cSEd Schouten }
137872fcea8cSEd Schouten
137991517e3bSJohn Baldwin /* move pointers to start of previous line*/
138072fcea8cSEd Schouten void
prevline(void)138191517e3bSJohn Baldwin prevline(void)
138272fcea8cSEd Schouten {
138372fcea8cSEd Schouten curr_line = curr_line->prev_line;
138496b676e9SEd Schouten absolute_lin--;
138572fcea8cSEd Schouten point = curr_line->line;
138672fcea8cSEd Schouten position = 1;
138772fcea8cSEd Schouten if (scr_vert == 0)
138872fcea8cSEd Schouten {
138972fcea8cSEd Schouten winsertln(text_win);
139072fcea8cSEd Schouten draw_line(0,0,point,1,curr_line->line_length);
139172fcea8cSEd Schouten }
139272fcea8cSEd Schouten else
139372fcea8cSEd Schouten scr_vert--;
139472fcea8cSEd Schouten while (position < curr_line->line_length)
139572fcea8cSEd Schouten {
139672fcea8cSEd Schouten position++;
139772fcea8cSEd Schouten point++;
139872fcea8cSEd Schouten }
139972fcea8cSEd Schouten }
140072fcea8cSEd Schouten
140191517e3bSJohn Baldwin /* move left one character */
140272fcea8cSEd Schouten void
left(int disp)140391517e3bSJohn Baldwin left(int disp)
140472fcea8cSEd Schouten {
140572fcea8cSEd Schouten if (point != curr_line->line) /* if not at begin of line */
140672fcea8cSEd Schouten {
140772fcea8cSEd Schouten if ((ee_chinese) && (position >= 2) && (*(point - 2) > 127))
140872fcea8cSEd Schouten {
140972fcea8cSEd Schouten point--;
141072fcea8cSEd Schouten position--;
141172fcea8cSEd Schouten }
141272fcea8cSEd Schouten point--;
141372fcea8cSEd Schouten position--;
141472fcea8cSEd Schouten scanline(point);
141572fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset));
141672fcea8cSEd Schouten scr_pos = scr_horz;
141772fcea8cSEd Schouten }
141872fcea8cSEd Schouten else if (curr_line->prev_line != NULL)
141972fcea8cSEd Schouten {
142072fcea8cSEd Schouten if (!disp)
142172fcea8cSEd Schouten {
142296b676e9SEd Schouten absolute_lin--;
142372fcea8cSEd Schouten curr_line = curr_line->prev_line;
142472fcea8cSEd Schouten point = curr_line->line + curr_line->line_length;
142572fcea8cSEd Schouten position = curr_line->line_length;
142672fcea8cSEd Schouten return;
142772fcea8cSEd Schouten }
142872fcea8cSEd Schouten position = 1;
142972fcea8cSEd Schouten prevline();
143072fcea8cSEd Schouten scanline(point);
143172fcea8cSEd Schouten scr_pos = scr_horz;
143272fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset));
143372fcea8cSEd Schouten }
143472fcea8cSEd Schouten }
143572fcea8cSEd Schouten
143691517e3bSJohn Baldwin /* move right one character */
143772fcea8cSEd Schouten void
right(int disp)143891517e3bSJohn Baldwin right(int disp)
143972fcea8cSEd Schouten {
144072fcea8cSEd Schouten if (position < curr_line->line_length)
144172fcea8cSEd Schouten {
144272fcea8cSEd Schouten if ((ee_chinese) && (*point > 127) &&
144372fcea8cSEd Schouten ((curr_line->line_length - position) >= 2))
144472fcea8cSEd Schouten {
144572fcea8cSEd Schouten point++;
144672fcea8cSEd Schouten position++;
144772fcea8cSEd Schouten }
144872fcea8cSEd Schouten point++;
144972fcea8cSEd Schouten position++;
145072fcea8cSEd Schouten scanline(point);
145172fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset));
145272fcea8cSEd Schouten scr_pos = scr_horz;
145372fcea8cSEd Schouten }
145472fcea8cSEd Schouten else if (curr_line->next_line != NULL)
145572fcea8cSEd Schouten {
145672fcea8cSEd Schouten if (!disp)
145772fcea8cSEd Schouten {
145896b676e9SEd Schouten absolute_lin++;
145972fcea8cSEd Schouten curr_line = curr_line->next_line;
146072fcea8cSEd Schouten point = curr_line->line;
146172fcea8cSEd Schouten position = 1;
146272fcea8cSEd Schouten return;
146372fcea8cSEd Schouten }
146472fcea8cSEd Schouten nextline();
146572fcea8cSEd Schouten scr_pos = scr_horz = 0;
146672fcea8cSEd Schouten if (horiz_offset)
146772fcea8cSEd Schouten {
146872fcea8cSEd Schouten horiz_offset = 0;
146972fcea8cSEd Schouten midscreen(scr_vert, point);
147072fcea8cSEd Schouten }
147172fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset));
147272fcea8cSEd Schouten position = 1;
147372fcea8cSEd Schouten }
147472fcea8cSEd Schouten }
147572fcea8cSEd Schouten
147691517e3bSJohn Baldwin /* move to the same column as on other line */
147772fcea8cSEd Schouten void
find_pos(void)147891517e3bSJohn Baldwin find_pos(void)
147972fcea8cSEd Schouten {
148072fcea8cSEd Schouten scr_horz = 0;
148172fcea8cSEd Schouten position = 1;
148272fcea8cSEd Schouten while ((scr_horz < scr_pos) && (position < curr_line->line_length))
148372fcea8cSEd Schouten {
148472fcea8cSEd Schouten if (*point == 9)
148572fcea8cSEd Schouten scr_horz += tabshift(scr_horz);
148672fcea8cSEd Schouten else if (*point < ' ')
148772fcea8cSEd Schouten scr_horz += 2;
148872fcea8cSEd Schouten else if ((ee_chinese) && (*point > 127) &&
148972fcea8cSEd Schouten ((curr_line->line_length - position) >= 2))
149072fcea8cSEd Schouten {
149172fcea8cSEd Schouten scr_horz += 2;
149272fcea8cSEd Schouten point++;
149372fcea8cSEd Schouten position++;
149472fcea8cSEd Schouten }
149572fcea8cSEd Schouten else
149672fcea8cSEd Schouten scr_horz++;
149772fcea8cSEd Schouten position++;
149872fcea8cSEd Schouten point++;
149972fcea8cSEd Schouten }
150072fcea8cSEd Schouten if ((scr_horz - horiz_offset) > last_col)
150172fcea8cSEd Schouten {
150272fcea8cSEd Schouten horiz_offset = (scr_horz - (scr_horz % 8)) - (COLS - 8);
150372fcea8cSEd Schouten midscreen(scr_vert, point);
150472fcea8cSEd Schouten }
150572fcea8cSEd Schouten else if (scr_horz < horiz_offset)
150672fcea8cSEd Schouten {
150772fcea8cSEd Schouten horiz_offset = max(0, (scr_horz - (scr_horz % 8)));
150872fcea8cSEd Schouten midscreen(scr_vert, point);
150972fcea8cSEd Schouten }
151072fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset));
151172fcea8cSEd Schouten }
151272fcea8cSEd Schouten
151391517e3bSJohn Baldwin /* move up one line */
151472fcea8cSEd Schouten void
up(void)151591517e3bSJohn Baldwin up(void)
151672fcea8cSEd Schouten {
151772fcea8cSEd Schouten if (curr_line->prev_line != NULL)
151872fcea8cSEd Schouten {
151972fcea8cSEd Schouten prevline();
152072fcea8cSEd Schouten point = curr_line->line;
152172fcea8cSEd Schouten find_pos();
152272fcea8cSEd Schouten }
152372fcea8cSEd Schouten }
152472fcea8cSEd Schouten
152591517e3bSJohn Baldwin /* move down one line */
152672fcea8cSEd Schouten void
down(void)152791517e3bSJohn Baldwin down(void)
152872fcea8cSEd Schouten {
152972fcea8cSEd Schouten if (curr_line->next_line != NULL)
153072fcea8cSEd Schouten {
153172fcea8cSEd Schouten nextline();
153272fcea8cSEd Schouten find_pos();
153372fcea8cSEd Schouten }
153472fcea8cSEd Schouten }
153572fcea8cSEd Schouten
153691517e3bSJohn Baldwin /* process function key */
153772fcea8cSEd Schouten void
function_key(void)153891517e3bSJohn Baldwin function_key(void)
153972fcea8cSEd Schouten {
154072fcea8cSEd Schouten if (in == KEY_LEFT)
154172fcea8cSEd Schouten left(TRUE);
154272fcea8cSEd Schouten else if (in == KEY_RIGHT)
154372fcea8cSEd Schouten right(TRUE);
154472fcea8cSEd Schouten else if (in == KEY_HOME)
1545cfe04e82SEd Schouten bol();
1546cfe04e82SEd Schouten else if (in == KEY_END)
1547cfe04e82SEd Schouten eol();
154872fcea8cSEd Schouten else if (in == KEY_UP)
154972fcea8cSEd Schouten up();
155072fcea8cSEd Schouten else if (in == KEY_DOWN)
155172fcea8cSEd Schouten down();
155272fcea8cSEd Schouten else if (in == KEY_NPAGE)
15537bf1ea96SEd Schouten move_rel('d', max( 5, (last_line - 5)));
155472fcea8cSEd Schouten else if (in == KEY_PPAGE)
15557bf1ea96SEd Schouten move_rel('u', max(5, (last_line - 5)));
155672fcea8cSEd Schouten else if (in == KEY_DL)
155772fcea8cSEd Schouten del_line();
155872fcea8cSEd Schouten else if (in == KEY_DC)
155972fcea8cSEd Schouten del_char();
156072fcea8cSEd Schouten else if (in == KEY_BACKSPACE)
156172fcea8cSEd Schouten delete(TRUE);
156272fcea8cSEd Schouten else if (in == KEY_IL)
156372fcea8cSEd Schouten { /* insert a line before current line */
156472fcea8cSEd Schouten insert_line(TRUE);
156572fcea8cSEd Schouten left(TRUE);
156672fcea8cSEd Schouten }
156772fcea8cSEd Schouten else if (in == KEY_F(1))
156872fcea8cSEd Schouten gold = !gold;
156972fcea8cSEd Schouten else if (in == KEY_F(2))
157072fcea8cSEd Schouten {
157172fcea8cSEd Schouten if (gold)
157272fcea8cSEd Schouten {
157372fcea8cSEd Schouten gold = FALSE;
157472fcea8cSEd Schouten undel_line();
157572fcea8cSEd Schouten }
157672fcea8cSEd Schouten else
157772fcea8cSEd Schouten undel_char();
157872fcea8cSEd Schouten }
157972fcea8cSEd Schouten else if (in == KEY_F(3))
158072fcea8cSEd Schouten {
158172fcea8cSEd Schouten if (gold)
158272fcea8cSEd Schouten {
158372fcea8cSEd Schouten gold = FALSE;
158472fcea8cSEd Schouten undel_word();
158572fcea8cSEd Schouten }
158672fcea8cSEd Schouten else
158772fcea8cSEd Schouten del_word();
158872fcea8cSEd Schouten }
158972fcea8cSEd Schouten else if (in == KEY_F(4))
159072fcea8cSEd Schouten {
159172fcea8cSEd Schouten if (gold)
159272fcea8cSEd Schouten {
159372fcea8cSEd Schouten gold = FALSE;
159472fcea8cSEd Schouten paint_info_win();
159572fcea8cSEd Schouten midscreen(scr_vert, point);
159672fcea8cSEd Schouten }
159772fcea8cSEd Schouten else
159872fcea8cSEd Schouten adv_word();
159972fcea8cSEd Schouten }
160072fcea8cSEd Schouten else if (in == KEY_F(5))
160172fcea8cSEd Schouten {
160272fcea8cSEd Schouten if (gold)
160372fcea8cSEd Schouten {
160472fcea8cSEd Schouten gold = FALSE;
160572fcea8cSEd Schouten search_prompt();
160672fcea8cSEd Schouten }
160772fcea8cSEd Schouten else
160872fcea8cSEd Schouten search(TRUE);
160972fcea8cSEd Schouten }
161072fcea8cSEd Schouten else if (in == KEY_F(6))
161172fcea8cSEd Schouten {
161272fcea8cSEd Schouten if (gold)
161372fcea8cSEd Schouten {
161472fcea8cSEd Schouten gold = FALSE;
161572fcea8cSEd Schouten bottom();
161672fcea8cSEd Schouten }
161772fcea8cSEd Schouten else
161872fcea8cSEd Schouten top();
161972fcea8cSEd Schouten }
162072fcea8cSEd Schouten else if (in == KEY_F(7))
162172fcea8cSEd Schouten {
162272fcea8cSEd Schouten if (gold)
162372fcea8cSEd Schouten {
162472fcea8cSEd Schouten gold = FALSE;
162572fcea8cSEd Schouten eol();
162672fcea8cSEd Schouten }
162772fcea8cSEd Schouten else
162872fcea8cSEd Schouten bol();
162972fcea8cSEd Schouten }
163072fcea8cSEd Schouten else if (in == KEY_F(8))
163172fcea8cSEd Schouten {
163272fcea8cSEd Schouten if (gold)
163372fcea8cSEd Schouten {
163472fcea8cSEd Schouten gold = FALSE;
163572fcea8cSEd Schouten command_prompt();
163672fcea8cSEd Schouten }
163772fcea8cSEd Schouten else
163872fcea8cSEd Schouten adv_line();
163972fcea8cSEd Schouten }
164072fcea8cSEd Schouten }
164172fcea8cSEd Schouten
164272fcea8cSEd Schouten void
print_buffer(void)164391517e3bSJohn Baldwin print_buffer(void)
164472fcea8cSEd Schouten {
164572fcea8cSEd Schouten char buffer[256];
164672fcea8cSEd Schouten
164772fcea8cSEd Schouten sprintf(buffer, ">!%s", print_command);
164872fcea8cSEd Schouten wmove(com_win, 0, 0);
164972fcea8cSEd Schouten wclrtoeol(com_win);
165072fcea8cSEd Schouten wprintw(com_win, printer_msg_str, print_command);
165172fcea8cSEd Schouten wrefresh(com_win);
165272fcea8cSEd Schouten command(buffer);
165372fcea8cSEd Schouten }
165472fcea8cSEd Schouten
165572fcea8cSEd Schouten void
command_prompt(void)165691517e3bSJohn Baldwin command_prompt(void)
165772fcea8cSEd Schouten {
165872fcea8cSEd Schouten char *cmd_str;
165972fcea8cSEd Schouten int result;
166072fcea8cSEd Schouten
166172fcea8cSEd Schouten info_type = COMMANDS;
166272fcea8cSEd Schouten paint_info_win();
166372fcea8cSEd Schouten cmd_str = get_string(command_str, TRUE);
166472fcea8cSEd Schouten if ((result = unique_test(cmd_str, commands)) != 1)
166572fcea8cSEd Schouten {
166672fcea8cSEd Schouten werase(com_win);
166772fcea8cSEd Schouten wmove(com_win, 0, 0);
166872fcea8cSEd Schouten if (result == 0)
166972fcea8cSEd Schouten wprintw(com_win, unkn_cmd_str, cmd_str);
167072fcea8cSEd Schouten else
1671*0667538bSBaptiste Daroussin wprintw(com_win, "%s", non_unique_cmd_msg);
167272fcea8cSEd Schouten
167372fcea8cSEd Schouten wrefresh(com_win);
167472fcea8cSEd Schouten
167572fcea8cSEd Schouten info_type = CONTROL_KEYS;
167672fcea8cSEd Schouten paint_info_win();
167772fcea8cSEd Schouten
167872fcea8cSEd Schouten if (cmd_str != NULL)
167972fcea8cSEd Schouten free(cmd_str);
168072fcea8cSEd Schouten return;
168172fcea8cSEd Schouten }
168272fcea8cSEd Schouten command(cmd_str);
168372fcea8cSEd Schouten wrefresh(com_win);
168472fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset));
168572fcea8cSEd Schouten info_type = CONTROL_KEYS;
168672fcea8cSEd Schouten paint_info_win();
168772fcea8cSEd Schouten if (cmd_str != NULL)
168872fcea8cSEd Schouten free(cmd_str);
168972fcea8cSEd Schouten }
169072fcea8cSEd Schouten
169191517e3bSJohn Baldwin /* process commands from keyboard */
169272fcea8cSEd Schouten void
command(char * cmd_str1)169391517e3bSJohn Baldwin command(char *cmd_str1)
169472fcea8cSEd Schouten {
169572fcea8cSEd Schouten char *cmd_str2 = NULL;
169672fcea8cSEd Schouten char *cmd_str = cmd_str1;
169772fcea8cSEd Schouten
169872fcea8cSEd Schouten clear_com_win = TRUE;
169972fcea8cSEd Schouten if (compare(cmd_str, HELP, FALSE))
170072fcea8cSEd Schouten help();
170172fcea8cSEd Schouten else if (compare(cmd_str, WRITE, FALSE))
170272fcea8cSEd Schouten {
170372fcea8cSEd Schouten if (restrict_mode())
170472fcea8cSEd Schouten {
170572fcea8cSEd Schouten return;
170672fcea8cSEd Schouten }
170772fcea8cSEd Schouten cmd_str = next_word(cmd_str);
170896b676e9SEd Schouten if (*cmd_str == '\0')
170972fcea8cSEd Schouten {
171072fcea8cSEd Schouten cmd_str = cmd_str2 = get_string(file_write_prompt_str, TRUE);
171172fcea8cSEd Schouten }
171272fcea8cSEd Schouten tmp_file = resolve_name(cmd_str);
1713cfe04e82SEd Schouten write_file(tmp_file, 1);
171472fcea8cSEd Schouten if (tmp_file != cmd_str)
171572fcea8cSEd Schouten free(tmp_file);
171672fcea8cSEd Schouten }
171772fcea8cSEd Schouten else if (compare(cmd_str, READ, FALSE))
171872fcea8cSEd Schouten {
171972fcea8cSEd Schouten if (restrict_mode())
172072fcea8cSEd Schouten {
172172fcea8cSEd Schouten return;
172272fcea8cSEd Schouten }
172372fcea8cSEd Schouten cmd_str = next_word(cmd_str);
172496b676e9SEd Schouten if (*cmd_str == '\0')
172572fcea8cSEd Schouten {
172672fcea8cSEd Schouten cmd_str = cmd_str2 = get_string(file_read_prompt_str, TRUE);
172772fcea8cSEd Schouten }
172872fcea8cSEd Schouten tmp_file = cmd_str;
172972fcea8cSEd Schouten recv_file = TRUE;
173072fcea8cSEd Schouten tmp_file = resolve_name(cmd_str);
173172fcea8cSEd Schouten check_fp();
173272fcea8cSEd Schouten if (tmp_file != cmd_str)
173372fcea8cSEd Schouten free(tmp_file);
173472fcea8cSEd Schouten }
173572fcea8cSEd Schouten else if (compare(cmd_str, LINE, FALSE))
173672fcea8cSEd Schouten {
173772fcea8cSEd Schouten wmove(com_win, 0, 0);
173872fcea8cSEd Schouten wclrtoeol(com_win);
173972fcea8cSEd Schouten wprintw(com_win, line_num_str, curr_line->line_number);
174072fcea8cSEd Schouten wprintw(com_win, line_len_str, curr_line->line_length);
174172fcea8cSEd Schouten }
174272fcea8cSEd Schouten else if (compare(cmd_str, FILE_str, FALSE))
174372fcea8cSEd Schouten {
174472fcea8cSEd Schouten wmove(com_win, 0, 0);
174572fcea8cSEd Schouten wclrtoeol(com_win);
174672fcea8cSEd Schouten if (in_file_name == NULL)
1747*0667538bSBaptiste Daroussin wprintw(com_win, "%s", no_file_string);
174872fcea8cSEd Schouten else
174972fcea8cSEd Schouten wprintw(com_win, current_file_str, in_file_name);
175072fcea8cSEd Schouten }
175172fcea8cSEd Schouten else if ((*cmd_str >= '0') && (*cmd_str <= '9'))
175272fcea8cSEd Schouten goto_line(cmd_str);
175372fcea8cSEd Schouten else if (compare(cmd_str, CHARACTER, FALSE))
175472fcea8cSEd Schouten {
175572fcea8cSEd Schouten wmove(com_win, 0, 0);
175672fcea8cSEd Schouten wclrtoeol(com_win);
175772fcea8cSEd Schouten wprintw(com_win, char_str, *point);
175872fcea8cSEd Schouten }
175972fcea8cSEd Schouten else if (compare(cmd_str, REDRAW, FALSE))
176072fcea8cSEd Schouten redraw();
176172fcea8cSEd Schouten else if (compare(cmd_str, RESEQUENCE, FALSE))
176272fcea8cSEd Schouten {
176372fcea8cSEd Schouten tmp_line = first_line->next_line;
176472fcea8cSEd Schouten while (tmp_line != NULL)
176572fcea8cSEd Schouten {
176672fcea8cSEd Schouten tmp_line->line_number = tmp_line->prev_line->line_number + 1;
176772fcea8cSEd Schouten tmp_line = tmp_line->next_line;
176872fcea8cSEd Schouten }
176972fcea8cSEd Schouten }
177072fcea8cSEd Schouten else if (compare(cmd_str, AUTHOR, FALSE))
177172fcea8cSEd Schouten {
177272fcea8cSEd Schouten wmove(com_win, 0, 0);
177372fcea8cSEd Schouten wclrtoeol(com_win);
177472fcea8cSEd Schouten wprintw(com_win, "written by Hugh Mahon");
177572fcea8cSEd Schouten }
177672fcea8cSEd Schouten else if (compare(cmd_str, VERSION, FALSE))
177772fcea8cSEd Schouten {
177872fcea8cSEd Schouten wmove(com_win, 0, 0);
177972fcea8cSEd Schouten wclrtoeol(com_win);
178072fcea8cSEd Schouten wprintw(com_win, "%s", version);
178172fcea8cSEd Schouten }
178272fcea8cSEd Schouten else if (compare(cmd_str, CASE, FALSE))
178372fcea8cSEd Schouten case_sen = TRUE;
178472fcea8cSEd Schouten else if (compare(cmd_str, NOCASE, FALSE))
178572fcea8cSEd Schouten case_sen = FALSE;
178672fcea8cSEd Schouten else if (compare(cmd_str, EXPAND, FALSE))
178772fcea8cSEd Schouten expand_tabs = TRUE;
178872fcea8cSEd Schouten else if (compare(cmd_str, NOEXPAND, FALSE))
178972fcea8cSEd Schouten expand_tabs = FALSE;
179072fcea8cSEd Schouten else if (compare(cmd_str, Exit_string, FALSE))
179172fcea8cSEd Schouten finish();
179272fcea8cSEd Schouten else if (compare(cmd_str, chinese_cmd, FALSE))
179372fcea8cSEd Schouten {
179472fcea8cSEd Schouten ee_chinese = TRUE;
179572fcea8cSEd Schouten #ifdef NCURSE
179672fcea8cSEd Schouten nc_setattrib(A_NC_BIG5);
179772fcea8cSEd Schouten #endif /* NCURSE */
179872fcea8cSEd Schouten }
179972fcea8cSEd Schouten else if (compare(cmd_str, nochinese_cmd, FALSE))
180072fcea8cSEd Schouten {
180172fcea8cSEd Schouten ee_chinese = FALSE;
180272fcea8cSEd Schouten #ifdef NCURSE
180372fcea8cSEd Schouten nc_clearattrib(A_NC_BIG5);
180472fcea8cSEd Schouten #endif /* NCURSE */
180572fcea8cSEd Schouten }
180672fcea8cSEd Schouten else if (compare(cmd_str, QUIT_string, FALSE))
180772fcea8cSEd Schouten quit(0);
180872fcea8cSEd Schouten else if (*cmd_str == '!')
180972fcea8cSEd Schouten {
181072fcea8cSEd Schouten cmd_str++;
181172fcea8cSEd Schouten if ((*cmd_str == ' ') || (*cmd_str == 9))
181272fcea8cSEd Schouten cmd_str = next_word(cmd_str);
181372fcea8cSEd Schouten sh_command(cmd_str);
181472fcea8cSEd Schouten }
181572fcea8cSEd Schouten else if ((*cmd_str == '<') && (!in_pipe))
181672fcea8cSEd Schouten {
181772fcea8cSEd Schouten in_pipe = TRUE;
181872fcea8cSEd Schouten shell_fork = FALSE;
181972fcea8cSEd Schouten cmd_str++;
182072fcea8cSEd Schouten if ((*cmd_str == ' ') || (*cmd_str == '\t'))
182172fcea8cSEd Schouten cmd_str = next_word(cmd_str);
182272fcea8cSEd Schouten command(cmd_str);
182372fcea8cSEd Schouten in_pipe = FALSE;
182472fcea8cSEd Schouten shell_fork = TRUE;
182572fcea8cSEd Schouten }
182672fcea8cSEd Schouten else if ((*cmd_str == '>') && (!out_pipe))
182772fcea8cSEd Schouten {
182872fcea8cSEd Schouten out_pipe = TRUE;
182972fcea8cSEd Schouten cmd_str++;
183072fcea8cSEd Schouten if ((*cmd_str == ' ') || (*cmd_str == '\t'))
183172fcea8cSEd Schouten cmd_str = next_word(cmd_str);
183272fcea8cSEd Schouten command(cmd_str);
183372fcea8cSEd Schouten out_pipe = FALSE;
183472fcea8cSEd Schouten }
183572fcea8cSEd Schouten else
183672fcea8cSEd Schouten {
183772fcea8cSEd Schouten wmove(com_win, 0, 0);
183872fcea8cSEd Schouten wclrtoeol(com_win);
183972fcea8cSEd Schouten wprintw(com_win, unkn_cmd_str, cmd_str);
184072fcea8cSEd Schouten }
184172fcea8cSEd Schouten if (cmd_str2 != NULL)
184272fcea8cSEd Schouten free(cmd_str2);
184372fcea8cSEd Schouten }
184472fcea8cSEd Schouten
184591517e3bSJohn Baldwin /* determine horizontal position for get_string */
184672fcea8cSEd Schouten int
scan(char * line,int offset,int column)184791517e3bSJohn Baldwin scan(char *line, int offset, int column)
184872fcea8cSEd Schouten {
184972fcea8cSEd Schouten char *stemp;
185072fcea8cSEd Schouten int i;
185172fcea8cSEd Schouten int j;
185272fcea8cSEd Schouten
185372fcea8cSEd Schouten stemp = line;
185472fcea8cSEd Schouten i = 0;
185572fcea8cSEd Schouten j = column;
185672fcea8cSEd Schouten while (i < offset)
185772fcea8cSEd Schouten {
185872fcea8cSEd Schouten i++;
185972fcea8cSEd Schouten j += len_char(*stemp, j);
186072fcea8cSEd Schouten stemp++;
186172fcea8cSEd Schouten }
186272fcea8cSEd Schouten return(j);
186372fcea8cSEd Schouten }
186472fcea8cSEd Schouten
186591517e3bSJohn Baldwin /* read string from input on command line */
186672fcea8cSEd Schouten char *
get_string(char * prompt,int advance)186791517e3bSJohn Baldwin get_string(char *prompt, int advance)
186872fcea8cSEd Schouten {
186972fcea8cSEd Schouten char *string;
187072fcea8cSEd Schouten char *tmp_string;
187172fcea8cSEd Schouten char *nam_str;
187272fcea8cSEd Schouten char *g_point;
187372fcea8cSEd Schouten int tmp_int;
187472fcea8cSEd Schouten int g_horz, g_position, g_pos;
187572fcea8cSEd Schouten int esc_flag;
187672fcea8cSEd Schouten
187772fcea8cSEd Schouten g_point = tmp_string = malloc(512);
187872fcea8cSEd Schouten wmove(com_win,0,0);
187972fcea8cSEd Schouten wclrtoeol(com_win);
188072fcea8cSEd Schouten waddstr(com_win, prompt);
188172fcea8cSEd Schouten wrefresh(com_win);
188272fcea8cSEd Schouten nam_str = tmp_string;
188372fcea8cSEd Schouten clear_com_win = TRUE;
188472fcea8cSEd Schouten g_horz = g_position = scan(prompt, strlen(prompt), 0);
188572fcea8cSEd Schouten g_pos = 0;
188672fcea8cSEd Schouten do
188772fcea8cSEd Schouten {
188872fcea8cSEd Schouten esc_flag = FALSE;
188972fcea8cSEd Schouten in = wgetch(com_win);
189072fcea8cSEd Schouten if (in == -1)
189196b676e9SEd Schouten exit(0);
189272fcea8cSEd Schouten if (((in == 8) || (in == 127) || (in == KEY_BACKSPACE)) && (g_pos > 0))
189372fcea8cSEd Schouten {
189472fcea8cSEd Schouten tmp_int = g_horz;
189572fcea8cSEd Schouten g_pos--;
189672fcea8cSEd Schouten g_horz = scan(g_point, g_pos, g_position);
189772fcea8cSEd Schouten tmp_int = tmp_int - g_horz;
189872fcea8cSEd Schouten for (; 0 < tmp_int; tmp_int--)
189972fcea8cSEd Schouten {
190072fcea8cSEd Schouten if ((g_horz+tmp_int) < (last_col - 1))
190172fcea8cSEd Schouten {
190272fcea8cSEd Schouten waddch(com_win, '\010');
190372fcea8cSEd Schouten waddch(com_win, ' ');
190472fcea8cSEd Schouten waddch(com_win, '\010');
190572fcea8cSEd Schouten }
190672fcea8cSEd Schouten }
190772fcea8cSEd Schouten nam_str--;
190872fcea8cSEd Schouten }
190972fcea8cSEd Schouten else if ((in != 8) && (in != 127) && (in != '\n') && (in != '\r') && (in < 256))
191072fcea8cSEd Schouten {
191172fcea8cSEd Schouten if (in == '\026') /* control-v, accept next character verbatim */
191272fcea8cSEd Schouten { /* allows entry of ^m, ^j, and ^h */
191372fcea8cSEd Schouten esc_flag = TRUE;
191472fcea8cSEd Schouten in = wgetch(com_win);
191572fcea8cSEd Schouten if (in == -1)
191696b676e9SEd Schouten exit(0);
191772fcea8cSEd Schouten }
191872fcea8cSEd Schouten *nam_str = in;
191972fcea8cSEd Schouten g_pos++;
1920f39e07f3SAndrey A. Chernov if (!isprint((unsigned char)in) && (g_horz < (last_col - 1)))
192172fcea8cSEd Schouten g_horz += out_char(com_win, in, g_horz);
192272fcea8cSEd Schouten else
192372fcea8cSEd Schouten {
192472fcea8cSEd Schouten g_horz++;
192572fcea8cSEd Schouten if (g_horz < (last_col - 1))
1926f39e07f3SAndrey A. Chernov waddch(com_win, (unsigned char)in);
192772fcea8cSEd Schouten }
192872fcea8cSEd Schouten nam_str++;
192972fcea8cSEd Schouten }
193072fcea8cSEd Schouten wrefresh(com_win);
193172fcea8cSEd Schouten if (esc_flag)
193296b676e9SEd Schouten in = '\0';
193372fcea8cSEd Schouten } while ((in != '\n') && (in != '\r'));
193496b676e9SEd Schouten *nam_str = '\0';
193572fcea8cSEd Schouten nam_str = tmp_string;
193672fcea8cSEd Schouten if (((*nam_str == ' ') || (*nam_str == 9)) && (advance))
193772fcea8cSEd Schouten nam_str = next_word(nam_str);
193872fcea8cSEd Schouten string = malloc(strlen(nam_str) + 1);
193972fcea8cSEd Schouten strcpy(string, nam_str);
194072fcea8cSEd Schouten free(tmp_string);
194172fcea8cSEd Schouten wrefresh(com_win);
194272fcea8cSEd Schouten return(string);
194372fcea8cSEd Schouten }
194472fcea8cSEd Schouten
194591517e3bSJohn Baldwin /* compare two strings */
194672fcea8cSEd Schouten int
compare(char * string1,char * string2,int sensitive)194791517e3bSJohn Baldwin compare(char *string1, char *string2, int sensitive)
194872fcea8cSEd Schouten {
194972fcea8cSEd Schouten char *strng1;
195072fcea8cSEd Schouten char *strng2;
195172fcea8cSEd Schouten int equal;
195272fcea8cSEd Schouten
195372fcea8cSEd Schouten strng1 = string1;
195472fcea8cSEd Schouten strng2 = string2;
195596b676e9SEd Schouten if ((strng1 == NULL) || (strng2 == NULL) || (*strng1 == '\0') || (*strng2 == '\0'))
195672fcea8cSEd Schouten return(FALSE);
195772fcea8cSEd Schouten equal = TRUE;
195872fcea8cSEd Schouten while (equal)
195972fcea8cSEd Schouten {
196072fcea8cSEd Schouten if (sensitive)
196172fcea8cSEd Schouten {
196272fcea8cSEd Schouten if (*strng1 != *strng2)
196372fcea8cSEd Schouten equal = FALSE;
196472fcea8cSEd Schouten }
196572fcea8cSEd Schouten else
196672fcea8cSEd Schouten {
196731dcbfadSAndrey A. Chernov if (toupper((unsigned char)*strng1) != toupper((unsigned char)*strng2))
196872fcea8cSEd Schouten equal = FALSE;
196972fcea8cSEd Schouten }
197072fcea8cSEd Schouten strng1++;
197172fcea8cSEd Schouten strng2++;
197296b676e9SEd Schouten if ((*strng1 == '\0') || (*strng2 == '\0') || (*strng1 == ' ') || (*strng2 == ' '))
197372fcea8cSEd Schouten break;
197472fcea8cSEd Schouten }
197572fcea8cSEd Schouten return(equal);
197672fcea8cSEd Schouten }
197772fcea8cSEd Schouten
197872fcea8cSEd Schouten void
goto_line(char * cmd_str)197991517e3bSJohn Baldwin goto_line(char *cmd_str)
198072fcea8cSEd Schouten {
198172fcea8cSEd Schouten int number;
198272fcea8cSEd Schouten int i;
198372fcea8cSEd Schouten char *ptr;
19847bf1ea96SEd Schouten char direction = '\0';
198572fcea8cSEd Schouten struct text *t_line;
198672fcea8cSEd Schouten
198772fcea8cSEd Schouten ptr = cmd_str;
198872fcea8cSEd Schouten i= 0;
198972fcea8cSEd Schouten while ((*ptr >='0') && (*ptr <= '9'))
199072fcea8cSEd Schouten {
199172fcea8cSEd Schouten i= i * 10 + (*ptr - '0');
199272fcea8cSEd Schouten ptr++;
199372fcea8cSEd Schouten }
199472fcea8cSEd Schouten number = i;
199572fcea8cSEd Schouten i = 0;
199672fcea8cSEd Schouten t_line = curr_line;
199772fcea8cSEd Schouten while ((t_line->line_number > number) && (t_line->prev_line != NULL))
199872fcea8cSEd Schouten {
199972fcea8cSEd Schouten i++;
200072fcea8cSEd Schouten t_line = t_line->prev_line;
20017bf1ea96SEd Schouten direction = 'u';
200272fcea8cSEd Schouten }
200372fcea8cSEd Schouten while ((t_line->line_number < number) && (t_line->next_line != NULL))
200472fcea8cSEd Schouten {
200572fcea8cSEd Schouten i++;
20067bf1ea96SEd Schouten direction = 'd';
200772fcea8cSEd Schouten t_line = t_line->next_line;
200872fcea8cSEd Schouten }
200972fcea8cSEd Schouten if ((i < 30) && (i > 0))
201072fcea8cSEd Schouten {
201172fcea8cSEd Schouten move_rel(direction, i);
201272fcea8cSEd Schouten }
201372fcea8cSEd Schouten else
201472fcea8cSEd Schouten {
20157bf1ea96SEd Schouten if (direction != 'd')
201696b676e9SEd Schouten {
201796b676e9SEd Schouten absolute_lin += i;
201896b676e9SEd Schouten }
201996b676e9SEd Schouten else
202096b676e9SEd Schouten {
202196b676e9SEd Schouten absolute_lin -= i;
202296b676e9SEd Schouten }
202372fcea8cSEd Schouten curr_line = t_line;
202472fcea8cSEd Schouten point = curr_line->line;
202572fcea8cSEd Schouten position = 1;
202672fcea8cSEd Schouten midscreen((last_line / 2), point);
202772fcea8cSEd Schouten scr_pos = scr_horz;
202872fcea8cSEd Schouten }
202972fcea8cSEd Schouten wmove(com_win, 0, 0);
203072fcea8cSEd Schouten wclrtoeol(com_win);
203172fcea8cSEd Schouten wprintw(com_win, line_num_str, curr_line->line_number);
203272fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset));
203372fcea8cSEd Schouten }
203472fcea8cSEd Schouten
203591517e3bSJohn Baldwin /* put current line in middle of screen */
203672fcea8cSEd Schouten void
midscreen(int line,unsigned char * pnt)203791517e3bSJohn Baldwin midscreen(int line, unsigned char *pnt)
203872fcea8cSEd Schouten {
203972fcea8cSEd Schouten struct text *mid_line;
204072fcea8cSEd Schouten int i;
204172fcea8cSEd Schouten
204272fcea8cSEd Schouten line = min(line, last_line);
204372fcea8cSEd Schouten mid_line = curr_line;
204472fcea8cSEd Schouten for (i = 0; ((i < line) && (curr_line->prev_line != NULL)); i++)
204572fcea8cSEd Schouten curr_line = curr_line->prev_line;
204672fcea8cSEd Schouten scr_vert = scr_horz = 0;
204772fcea8cSEd Schouten wmove(text_win, 0, 0);
204872fcea8cSEd Schouten draw_screen();
204972fcea8cSEd Schouten scr_vert = i;
205072fcea8cSEd Schouten curr_line = mid_line;
205172fcea8cSEd Schouten scanline(pnt);
205272fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset));
205372fcea8cSEd Schouten }
205472fcea8cSEd Schouten
205591517e3bSJohn Baldwin /* get arguments from command line */
205672fcea8cSEd Schouten void
get_options(int numargs,char * arguments[])205791517e3bSJohn Baldwin get_options(int numargs, char *arguments[])
205872fcea8cSEd Schouten {
205972fcea8cSEd Schouten char *buff;
206072fcea8cSEd Schouten int count;
2061cfe04e82SEd Schouten struct files *temp_names = NULL;
206272fcea8cSEd Schouten char *name;
206372fcea8cSEd Schouten char *ptr;
2064cfe04e82SEd Schouten int no_more_opts = FALSE;
206572fcea8cSEd Schouten
206672fcea8cSEd Schouten /*
206772fcea8cSEd Schouten | see if editor was invoked as 'ree' (restricted mode)
206872fcea8cSEd Schouten */
206972fcea8cSEd Schouten
207072fcea8cSEd Schouten if (!(name = strrchr(arguments[0], '/')))
207172fcea8cSEd Schouten name = arguments[0];
207272fcea8cSEd Schouten else
207372fcea8cSEd Schouten name++;
207472fcea8cSEd Schouten if (!strcmp(name, "ree"))
207572fcea8cSEd Schouten restricted = TRUE;
207672fcea8cSEd Schouten
207772fcea8cSEd Schouten top_of_stack = NULL;
207872fcea8cSEd Schouten input_file = FALSE;
207972fcea8cSEd Schouten recv_file = FALSE;
208072fcea8cSEd Schouten count = 1;
2081cfe04e82SEd Schouten while ((count < numargs)&& (!no_more_opts))
208272fcea8cSEd Schouten {
208372fcea8cSEd Schouten buff = arguments[count];
208472fcea8cSEd Schouten if (!strcmp("-i", buff))
208572fcea8cSEd Schouten {
208672fcea8cSEd Schouten info_window = FALSE;
208772fcea8cSEd Schouten }
208872fcea8cSEd Schouten else if (!strcmp("-e", buff))
208972fcea8cSEd Schouten {
209072fcea8cSEd Schouten expand_tabs = FALSE;
209172fcea8cSEd Schouten }
209272fcea8cSEd Schouten else if (!strcmp("-h", buff))
209372fcea8cSEd Schouten {
209472fcea8cSEd Schouten nohighlight = TRUE;
209572fcea8cSEd Schouten }
209672fcea8cSEd Schouten else if (!strcmp("-?", buff))
209772fcea8cSEd Schouten {
209872fcea8cSEd Schouten fprintf(stderr, usage0, arguments[0]);
20998f04da68SDimitry Andric fputs(usage1, stderr);
21008f04da68SDimitry Andric fputs(usage2, stderr);
21018f04da68SDimitry Andric fputs(usage3, stderr);
21028f04da68SDimitry Andric fputs(usage4, stderr);
210372fcea8cSEd Schouten exit(1);
210472fcea8cSEd Schouten }
210596b676e9SEd Schouten else if ((*buff == '+') && (start_at_line == NULL))
210672fcea8cSEd Schouten {
210772fcea8cSEd Schouten buff++;
210872fcea8cSEd Schouten start_at_line = buff;
210972fcea8cSEd Schouten }
2110cfe04e82SEd Schouten else if (!(strcmp("--", buff)))
2111cfe04e82SEd Schouten no_more_opts = TRUE;
211272fcea8cSEd Schouten else
211372fcea8cSEd Schouten {
2114cfe04e82SEd Schouten count--;
2115cfe04e82SEd Schouten no_more_opts = TRUE;
2116cfe04e82SEd Schouten }
2117cfe04e82SEd Schouten count++;
2118cfe04e82SEd Schouten }
2119cfe04e82SEd Schouten while (count < numargs)
2120cfe04e82SEd Schouten {
2121cfe04e82SEd Schouten buff = arguments[count];
212272fcea8cSEd Schouten if (top_of_stack == NULL)
212372fcea8cSEd Schouten {
212472fcea8cSEd Schouten temp_names = top_of_stack = name_alloc();
212572fcea8cSEd Schouten }
212672fcea8cSEd Schouten else
212772fcea8cSEd Schouten {
212872fcea8cSEd Schouten temp_names->next_name = name_alloc();
212972fcea8cSEd Schouten temp_names = temp_names->next_name;
213072fcea8cSEd Schouten }
213172fcea8cSEd Schouten ptr = temp_names->name = malloc(strlen(buff) + 1);
213296b676e9SEd Schouten while (*buff != '\0')
213372fcea8cSEd Schouten {
213472fcea8cSEd Schouten *ptr = *buff;
213572fcea8cSEd Schouten buff++;
213672fcea8cSEd Schouten ptr++;
213772fcea8cSEd Schouten }
213896b676e9SEd Schouten *ptr = '\0';
213972fcea8cSEd Schouten temp_names->next_name = NULL;
214072fcea8cSEd Schouten input_file = TRUE;
214172fcea8cSEd Schouten recv_file = TRUE;
214272fcea8cSEd Schouten count++;
214372fcea8cSEd Schouten }
214472fcea8cSEd Schouten }
214572fcea8cSEd Schouten
214691517e3bSJohn Baldwin /* open or close files according to flags */
214772fcea8cSEd Schouten void
check_fp(void)214891517e3bSJohn Baldwin check_fp(void)
214972fcea8cSEd Schouten {
215072fcea8cSEd Schouten int line_num;
215172fcea8cSEd Schouten int temp;
215272fcea8cSEd Schouten struct stat buf;
215372fcea8cSEd Schouten
215472fcea8cSEd Schouten clear_com_win = TRUE;
215572fcea8cSEd Schouten tmp_vert = scr_vert;
215672fcea8cSEd Schouten tmp_horz = scr_horz;
215772fcea8cSEd Schouten tmp_line = curr_line;
215872fcea8cSEd Schouten if (input_file)
215972fcea8cSEd Schouten {
216072fcea8cSEd Schouten in_file_name = tmp_file = top_of_stack->name;
216172fcea8cSEd Schouten top_of_stack = top_of_stack->next_name;
216272fcea8cSEd Schouten }
216372fcea8cSEd Schouten temp = stat(tmp_file, &buf);
216472fcea8cSEd Schouten buf.st_mode &= ~07777;
216572fcea8cSEd Schouten if ((temp != -1) && (buf.st_mode != 0100000) && (buf.st_mode != 0))
216672fcea8cSEd Schouten {
216772fcea8cSEd Schouten wprintw(com_win, file_is_dir_msg, tmp_file);
216872fcea8cSEd Schouten wrefresh(com_win);
216972fcea8cSEd Schouten if (input_file)
217072fcea8cSEd Schouten {
217172fcea8cSEd Schouten quit(0);
217272fcea8cSEd Schouten return;
217372fcea8cSEd Schouten }
217472fcea8cSEd Schouten else
217572fcea8cSEd Schouten return;
217672fcea8cSEd Schouten }
217772fcea8cSEd Schouten if ((get_fd = open(tmp_file, O_RDONLY)) == -1)
217872fcea8cSEd Schouten {
217972fcea8cSEd Schouten wmove(com_win, 0, 0);
218072fcea8cSEd Schouten wclrtoeol(com_win);
218172fcea8cSEd Schouten if (input_file)
218272fcea8cSEd Schouten wprintw(com_win, new_file_msg, tmp_file);
218372fcea8cSEd Schouten else
218472fcea8cSEd Schouten wprintw(com_win, cant_open_msg, tmp_file);
218572fcea8cSEd Schouten wrefresh(com_win);
218672fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset));
218772fcea8cSEd Schouten wrefresh(text_win);
218872fcea8cSEd Schouten recv_file = FALSE;
218972fcea8cSEd Schouten input_file = FALSE;
219072fcea8cSEd Schouten return;
219172fcea8cSEd Schouten }
219272fcea8cSEd Schouten else
219372fcea8cSEd Schouten get_file(tmp_file);
219472fcea8cSEd Schouten
219572fcea8cSEd Schouten recv_file = FALSE;
219672fcea8cSEd Schouten line_num = curr_line->line_number;
219772fcea8cSEd Schouten scr_vert = tmp_vert;
219872fcea8cSEd Schouten scr_horz = tmp_horz;
219972fcea8cSEd Schouten if (input_file)
220072fcea8cSEd Schouten curr_line= first_line;
220172fcea8cSEd Schouten else
220272fcea8cSEd Schouten curr_line = tmp_line;
220372fcea8cSEd Schouten point = curr_line->line;
220472fcea8cSEd Schouten draw_screen();
220572fcea8cSEd Schouten if (input_file)
220672fcea8cSEd Schouten {
220772fcea8cSEd Schouten input_file = FALSE;
220872fcea8cSEd Schouten if (start_at_line != NULL)
220972fcea8cSEd Schouten {
221072fcea8cSEd Schouten line_num = atoi(start_at_line) - 1;
22117bf1ea96SEd Schouten move_rel('d', line_num);
221272fcea8cSEd Schouten line_num = 0;
221372fcea8cSEd Schouten start_at_line = NULL;
221472fcea8cSEd Schouten }
221572fcea8cSEd Schouten }
221672fcea8cSEd Schouten else
221772fcea8cSEd Schouten {
221872fcea8cSEd Schouten wmove(com_win, 0, 0);
221972fcea8cSEd Schouten wclrtoeol(com_win);
222072fcea8cSEd Schouten text_changes = TRUE;
222196b676e9SEd Schouten if ((tmp_file != NULL) && (*tmp_file != '\0'))
222272fcea8cSEd Schouten wprintw(com_win, file_read_fin_msg, tmp_file);
222372fcea8cSEd Schouten }
222472fcea8cSEd Schouten wrefresh(com_win);
222572fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset));
222672fcea8cSEd Schouten wrefresh(text_win);
222772fcea8cSEd Schouten }
222872fcea8cSEd Schouten
222991517e3bSJohn Baldwin /* read specified file into current buffer */
223072fcea8cSEd Schouten void
get_file(char * file_name)223191517e3bSJohn Baldwin get_file(char *file_name)
223272fcea8cSEd Schouten {
223372fcea8cSEd Schouten int can_read; /* file has at least one character */
223472fcea8cSEd Schouten int length; /* length of line read by read */
223572fcea8cSEd Schouten int append; /* should text be appended to current line */
223672fcea8cSEd Schouten struct text *temp_line;
223772fcea8cSEd Schouten char ro_flag = FALSE;
223872fcea8cSEd Schouten
223972fcea8cSEd Schouten if (recv_file) /* if reading a file */
224072fcea8cSEd Schouten {
224172fcea8cSEd Schouten wmove(com_win, 0, 0);
224272fcea8cSEd Schouten wclrtoeol(com_win);
224372fcea8cSEd Schouten wprintw(com_win, reading_file_msg, file_name);
224472fcea8cSEd Schouten if (access(file_name, 2)) /* check permission to write */
224572fcea8cSEd Schouten {
224672fcea8cSEd Schouten if ((errno == ENOTDIR) || (errno == EACCES) || (errno == EROFS) || (errno == ETXTBSY) || (errno == EFAULT))
224772fcea8cSEd Schouten {
2248*0667538bSBaptiste Daroussin wprintw(com_win, "%s", read_only_msg);
224972fcea8cSEd Schouten ro_flag = TRUE;
225072fcea8cSEd Schouten }
225172fcea8cSEd Schouten }
225272fcea8cSEd Schouten wrefresh(com_win);
225372fcea8cSEd Schouten }
225472fcea8cSEd Schouten if (curr_line->line_length > 1) /* if current line is not blank */
225572fcea8cSEd Schouten {
225672fcea8cSEd Schouten insert_line(FALSE);
225772fcea8cSEd Schouten left(FALSE);
225872fcea8cSEd Schouten append = FALSE;
225972fcea8cSEd Schouten }
226072fcea8cSEd Schouten else
226172fcea8cSEd Schouten append = TRUE;
226272fcea8cSEd Schouten can_read = FALSE; /* test if file has any characters */
226372fcea8cSEd Schouten while (((length = read(get_fd, in_string, 512)) != 0) && (length != -1))
226472fcea8cSEd Schouten {
226572fcea8cSEd Schouten can_read = TRUE; /* if set file has at least 1 character */
226672fcea8cSEd Schouten get_line(length, in_string, &append);
226772fcea8cSEd Schouten }
226872fcea8cSEd Schouten if ((can_read) && (curr_line->line_length == 1))
226972fcea8cSEd Schouten {
227072fcea8cSEd Schouten temp_line = curr_line->prev_line;
227172fcea8cSEd Schouten temp_line->next_line = curr_line->next_line;
227272fcea8cSEd Schouten if (temp_line->next_line != NULL)
227372fcea8cSEd Schouten temp_line->next_line->prev_line = temp_line;
227472fcea8cSEd Schouten if (curr_line->line != NULL)
227572fcea8cSEd Schouten free(curr_line->line);
227672fcea8cSEd Schouten free(curr_line);
227772fcea8cSEd Schouten curr_line = temp_line;
227872fcea8cSEd Schouten }
227972fcea8cSEd Schouten if (input_file) /* if this is the file to be edited display number of lines */
228072fcea8cSEd Schouten {
228172fcea8cSEd Schouten wmove(com_win, 0, 0);
228272fcea8cSEd Schouten wclrtoeol(com_win);
228372fcea8cSEd Schouten wprintw(com_win, file_read_lines_msg, in_file_name, curr_line->line_number);
228472fcea8cSEd Schouten if (ro_flag)
2285*0667538bSBaptiste Daroussin wprintw(com_win, "%s", read_only_msg);
228672fcea8cSEd Schouten wrefresh(com_win);
228772fcea8cSEd Schouten }
228872fcea8cSEd Schouten else if (can_read) /* not input_file and file is non-zero size */
228972fcea8cSEd Schouten text_changes = TRUE;
229072fcea8cSEd Schouten
229172fcea8cSEd Schouten if (recv_file) /* if reading a file */
229272fcea8cSEd Schouten {
229372fcea8cSEd Schouten in = EOF;
229472fcea8cSEd Schouten }
229572fcea8cSEd Schouten }
229672fcea8cSEd Schouten
229791517e3bSJohn Baldwin /* read string and split into lines */
229872fcea8cSEd Schouten void
get_line(int length,unsigned char * in_string,int * append)229991517e3bSJohn Baldwin get_line(int length, unsigned char *in_string, int *append)
230072fcea8cSEd Schouten {
230172fcea8cSEd Schouten unsigned char *str1;
230272fcea8cSEd Schouten unsigned char *str2;
230372fcea8cSEd Schouten int num; /* offset from start of string */
230472fcea8cSEd Schouten int char_count; /* length of new line (or added portion */
230572fcea8cSEd Schouten int temp_counter; /* temporary counter value */
230672fcea8cSEd Schouten struct text *tline; /* temporary pointer to new line */
230772fcea8cSEd Schouten int first_time; /* if TRUE, the first time through the loop */
230872fcea8cSEd Schouten
230972fcea8cSEd Schouten str2 = in_string;
231072fcea8cSEd Schouten num = 0;
231172fcea8cSEd Schouten first_time = TRUE;
231272fcea8cSEd Schouten while (num < length)
231372fcea8cSEd Schouten {
231472fcea8cSEd Schouten if (!first_time)
231572fcea8cSEd Schouten {
231672fcea8cSEd Schouten if (num < length)
231772fcea8cSEd Schouten {
231872fcea8cSEd Schouten str2++;
231972fcea8cSEd Schouten num++;
232072fcea8cSEd Schouten }
232172fcea8cSEd Schouten }
232272fcea8cSEd Schouten else
232372fcea8cSEd Schouten first_time = FALSE;
232472fcea8cSEd Schouten str1 = str2;
232572fcea8cSEd Schouten char_count = 1;
232672fcea8cSEd Schouten /* find end of line */
232772fcea8cSEd Schouten while ((*str2 != '\n') && (num < length))
232872fcea8cSEd Schouten {
232972fcea8cSEd Schouten str2++;
233072fcea8cSEd Schouten num++;
233172fcea8cSEd Schouten char_count++;
233272fcea8cSEd Schouten }
233372fcea8cSEd Schouten if (!(*append)) /* if not append to current line, insert new one */
233472fcea8cSEd Schouten {
233572fcea8cSEd Schouten tline = txtalloc(); /* allocate data structure for next line */
233696b676e9SEd Schouten tline->line_number = curr_line->line_number + 1;
233772fcea8cSEd Schouten tline->next_line = curr_line->next_line;
233872fcea8cSEd Schouten tline->prev_line = curr_line;
233972fcea8cSEd Schouten curr_line->next_line = tline;
234072fcea8cSEd Schouten if (tline->next_line != NULL)
234172fcea8cSEd Schouten tline->next_line->prev_line = tline;
234272fcea8cSEd Schouten curr_line = tline;
234372fcea8cSEd Schouten curr_line->line = point = (unsigned char *) malloc(char_count);
234472fcea8cSEd Schouten curr_line->line_length = char_count;
234572fcea8cSEd Schouten curr_line->max_length = char_count;
234672fcea8cSEd Schouten }
234772fcea8cSEd Schouten else
234872fcea8cSEd Schouten {
234972fcea8cSEd Schouten point = resiz_line(char_count, curr_line, curr_line->line_length);
235072fcea8cSEd Schouten curr_line->line_length += (char_count - 1);
235172fcea8cSEd Schouten }
235272fcea8cSEd Schouten for (temp_counter = 1; temp_counter < char_count; temp_counter++)
235372fcea8cSEd Schouten {
235472fcea8cSEd Schouten *point = *str1;
235572fcea8cSEd Schouten point++;
235672fcea8cSEd Schouten str1++;
235772fcea8cSEd Schouten }
235896b676e9SEd Schouten *point = '\0';
235972fcea8cSEd Schouten *append = FALSE;
236072fcea8cSEd Schouten if ((num == length) && (*str2 != '\n'))
236172fcea8cSEd Schouten *append = TRUE;
236272fcea8cSEd Schouten }
236372fcea8cSEd Schouten }
236472fcea8cSEd Schouten
236572fcea8cSEd Schouten void
draw_screen()236672fcea8cSEd Schouten draw_screen() /* redraw the screen from current postion */
236772fcea8cSEd Schouten {
236872fcea8cSEd Schouten struct text *temp_line;
236972fcea8cSEd Schouten unsigned char *line_out;
237072fcea8cSEd Schouten int temp_vert;
237172fcea8cSEd Schouten
237272fcea8cSEd Schouten temp_line = curr_line;
237372fcea8cSEd Schouten temp_vert = scr_vert;
237472fcea8cSEd Schouten wclrtobot(text_win);
237572fcea8cSEd Schouten while ((temp_line != NULL) && (temp_vert <= last_line))
237672fcea8cSEd Schouten {
237772fcea8cSEd Schouten line_out = temp_line->line;
237872fcea8cSEd Schouten draw_line(temp_vert, 0, line_out, 1, temp_line->line_length);
237972fcea8cSEd Schouten temp_vert++;
238072fcea8cSEd Schouten temp_line = temp_line->next_line;
238172fcea8cSEd Schouten }
238272fcea8cSEd Schouten wmove(text_win, temp_vert, 0);
238372fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset));
238472fcea8cSEd Schouten }
238572fcea8cSEd Schouten
238691517e3bSJohn Baldwin /* prepare to exit edit session */
238772fcea8cSEd Schouten void
finish(void)238891517e3bSJohn Baldwin finish(void)
238972fcea8cSEd Schouten {
239072fcea8cSEd Schouten char *file_name = in_file_name;
239172fcea8cSEd Schouten
239272fcea8cSEd Schouten /*
239372fcea8cSEd Schouten | changes made here should be reflected in the 'save'
239472fcea8cSEd Schouten | portion of file_op()
239572fcea8cSEd Schouten */
239672fcea8cSEd Schouten
239796b676e9SEd Schouten if ((file_name == NULL) || (*file_name == '\0'))
239872fcea8cSEd Schouten file_name = get_string(save_file_name_prompt, TRUE);
239972fcea8cSEd Schouten
240096b676e9SEd Schouten if ((file_name == NULL) || (*file_name == '\0'))
240172fcea8cSEd Schouten {
240272fcea8cSEd Schouten wmove(com_win, 0, 0);
2403*0667538bSBaptiste Daroussin wprintw(com_win, "%s", file_not_saved_msg);
240472fcea8cSEd Schouten wclrtoeol(com_win);
240572fcea8cSEd Schouten wrefresh(com_win);
240672fcea8cSEd Schouten clear_com_win = TRUE;
240772fcea8cSEd Schouten return;
240872fcea8cSEd Schouten }
240972fcea8cSEd Schouten
241072fcea8cSEd Schouten tmp_file = resolve_name(file_name);
241172fcea8cSEd Schouten if (tmp_file != file_name)
241272fcea8cSEd Schouten {
241372fcea8cSEd Schouten free(file_name);
241472fcea8cSEd Schouten file_name = tmp_file;
241572fcea8cSEd Schouten }
241672fcea8cSEd Schouten
2417cfe04e82SEd Schouten if (write_file(file_name, 1))
241872fcea8cSEd Schouten {
241972fcea8cSEd Schouten text_changes = FALSE;
242072fcea8cSEd Schouten quit(0);
242172fcea8cSEd Schouten }
242272fcea8cSEd Schouten }
242372fcea8cSEd Schouten
242491517e3bSJohn Baldwin /* exit editor */
242572fcea8cSEd Schouten int
quit(int noverify)242691517e3bSJohn Baldwin quit(int noverify)
242772fcea8cSEd Schouten {
242872fcea8cSEd Schouten char *ans;
242972fcea8cSEd Schouten
243072fcea8cSEd Schouten touchwin(text_win);
243172fcea8cSEd Schouten wrefresh(text_win);
243272fcea8cSEd Schouten if ((text_changes) && (!noverify))
243372fcea8cSEd Schouten {
243472fcea8cSEd Schouten ans = get_string(changes_made_prompt, TRUE);
243531dcbfadSAndrey A. Chernov if (toupper((unsigned char)*ans) == toupper((unsigned char)*yes_char))
243672fcea8cSEd Schouten text_changes = FALSE;
243772fcea8cSEd Schouten else
243872fcea8cSEd Schouten return(0);
243972fcea8cSEd Schouten free(ans);
244072fcea8cSEd Schouten }
244172fcea8cSEd Schouten if (top_of_stack == NULL)
244272fcea8cSEd Schouten {
244372fcea8cSEd Schouten if (info_window)
244472fcea8cSEd Schouten wrefresh(info_win);
244572fcea8cSEd Schouten wrefresh(com_win);
244672fcea8cSEd Schouten resetty();
244772fcea8cSEd Schouten endwin();
244872fcea8cSEd Schouten putchar('\n');
244972fcea8cSEd Schouten exit(0);
245072fcea8cSEd Schouten }
245172fcea8cSEd Schouten else
245272fcea8cSEd Schouten {
245372fcea8cSEd Schouten delete_text();
245472fcea8cSEd Schouten recv_file = TRUE;
245572fcea8cSEd Schouten input_file = TRUE;
245672fcea8cSEd Schouten check_fp();
245772fcea8cSEd Schouten }
245872fcea8cSEd Schouten return(0);
245972fcea8cSEd Schouten }
246072fcea8cSEd Schouten
246172fcea8cSEd Schouten void
edit_abort(int arg)246291517e3bSJohn Baldwin edit_abort(int arg)
246372fcea8cSEd Schouten {
246472fcea8cSEd Schouten wrefresh(com_win);
246572fcea8cSEd Schouten resetty();
246672fcea8cSEd Schouten endwin();
246772fcea8cSEd Schouten putchar('\n');
246872fcea8cSEd Schouten exit(1);
246972fcea8cSEd Schouten }
247072fcea8cSEd Schouten
247172fcea8cSEd Schouten void
delete_text(void)247291517e3bSJohn Baldwin delete_text(void)
247372fcea8cSEd Schouten {
247472fcea8cSEd Schouten while (curr_line->next_line != NULL)
247572fcea8cSEd Schouten curr_line = curr_line->next_line;
247672fcea8cSEd Schouten while (curr_line != first_line)
247772fcea8cSEd Schouten {
247872fcea8cSEd Schouten free(curr_line->line);
247972fcea8cSEd Schouten curr_line = curr_line->prev_line;
248096b676e9SEd Schouten absolute_lin--;
248172fcea8cSEd Schouten free(curr_line->next_line);
248272fcea8cSEd Schouten }
248372fcea8cSEd Schouten curr_line->next_line = NULL;
248496b676e9SEd Schouten *curr_line->line = '\0';
248572fcea8cSEd Schouten curr_line->line_length = 1;
248672fcea8cSEd Schouten curr_line->line_number = 1;
248772fcea8cSEd Schouten point = curr_line->line;
248872fcea8cSEd Schouten scr_pos = scr_vert = scr_horz = 0;
248972fcea8cSEd Schouten position = 1;
249072fcea8cSEd Schouten }
249172fcea8cSEd Schouten
249272fcea8cSEd Schouten int
write_file(char * file_name,int warn_if_exists)249391517e3bSJohn Baldwin write_file(char *file_name, int warn_if_exists)
249472fcea8cSEd Schouten {
249572fcea8cSEd Schouten char cr;
249672fcea8cSEd Schouten char *tmp_point;
249772fcea8cSEd Schouten struct text *out_line;
249872fcea8cSEd Schouten int lines, charac;
249972fcea8cSEd Schouten int temp_pos;
250072fcea8cSEd Schouten int write_flag = TRUE;
250172fcea8cSEd Schouten
250272fcea8cSEd Schouten charac = lines = 0;
2503cfe04e82SEd Schouten if (warn_if_exists &&
2504cfe04e82SEd Schouten ((in_file_name == NULL) || strcmp(in_file_name, file_name)))
250572fcea8cSEd Schouten {
250672fcea8cSEd Schouten if ((temp_fp = fopen(file_name, "r")))
250772fcea8cSEd Schouten {
250872fcea8cSEd Schouten tmp_point = get_string(file_exists_prompt, TRUE);
250931dcbfadSAndrey A. Chernov if (toupper((unsigned char)*tmp_point) == toupper((unsigned char)*yes_char))
251072fcea8cSEd Schouten write_flag = TRUE;
251172fcea8cSEd Schouten else
251272fcea8cSEd Schouten write_flag = FALSE;
251372fcea8cSEd Schouten fclose(temp_fp);
251472fcea8cSEd Schouten free(tmp_point);
251572fcea8cSEd Schouten }
251672fcea8cSEd Schouten }
251772fcea8cSEd Schouten
251872fcea8cSEd Schouten clear_com_win = TRUE;
251972fcea8cSEd Schouten
252072fcea8cSEd Schouten if (write_flag)
252172fcea8cSEd Schouten {
252272fcea8cSEd Schouten if ((temp_fp = fopen(file_name, "w")) == NULL)
252372fcea8cSEd Schouten {
252472fcea8cSEd Schouten clear_com_win = TRUE;
252572fcea8cSEd Schouten wmove(com_win,0,0);
252672fcea8cSEd Schouten wclrtoeol(com_win);
252772fcea8cSEd Schouten wprintw(com_win, create_file_fail_msg, file_name);
252872fcea8cSEd Schouten wrefresh(com_win);
252972fcea8cSEd Schouten return(FALSE);
253072fcea8cSEd Schouten }
253172fcea8cSEd Schouten else
253272fcea8cSEd Schouten {
253372fcea8cSEd Schouten wmove(com_win,0,0);
253472fcea8cSEd Schouten wclrtoeol(com_win);
253572fcea8cSEd Schouten wprintw(com_win, writing_file_msg, file_name);
253672fcea8cSEd Schouten wrefresh(com_win);
253772fcea8cSEd Schouten cr = '\n';
253872fcea8cSEd Schouten out_line = first_line;
253972fcea8cSEd Schouten while (out_line != NULL)
254072fcea8cSEd Schouten {
254172fcea8cSEd Schouten temp_pos = 1;
254272fcea8cSEd Schouten tmp_point= out_line->line;
254372fcea8cSEd Schouten while (temp_pos < out_line->line_length)
254472fcea8cSEd Schouten {
254572fcea8cSEd Schouten putc(*tmp_point, temp_fp);
254672fcea8cSEd Schouten tmp_point++;
254772fcea8cSEd Schouten temp_pos++;
254872fcea8cSEd Schouten }
254972fcea8cSEd Schouten charac += out_line->line_length;
255072fcea8cSEd Schouten out_line = out_line->next_line;
255172fcea8cSEd Schouten putc(cr, temp_fp);
255272fcea8cSEd Schouten lines++;
255372fcea8cSEd Schouten }
255472fcea8cSEd Schouten fclose(temp_fp);
255572fcea8cSEd Schouten wmove(com_win,0,0);
255672fcea8cSEd Schouten wclrtoeol(com_win);
255772fcea8cSEd Schouten wprintw(com_win, file_written_msg, file_name, lines, charac);
255872fcea8cSEd Schouten wrefresh(com_win);
255972fcea8cSEd Schouten return(TRUE);
256072fcea8cSEd Schouten }
256172fcea8cSEd Schouten }
256272fcea8cSEd Schouten else
256372fcea8cSEd Schouten return(FALSE);
256472fcea8cSEd Schouten }
256572fcea8cSEd Schouten
256691517e3bSJohn Baldwin /* search for string in srch_str */
256772fcea8cSEd Schouten int
search(int display_message)256891517e3bSJohn Baldwin search(int display_message)
256972fcea8cSEd Schouten {
257072fcea8cSEd Schouten int lines_moved;
257172fcea8cSEd Schouten int iter;
257272fcea8cSEd Schouten int found;
257372fcea8cSEd Schouten
257496b676e9SEd Schouten if ((srch_str == NULL) || (*srch_str == '\0'))
257572fcea8cSEd Schouten return(FALSE);
257672fcea8cSEd Schouten if (display_message)
257772fcea8cSEd Schouten {
257872fcea8cSEd Schouten wmove(com_win, 0, 0);
257972fcea8cSEd Schouten wclrtoeol(com_win);
2580*0667538bSBaptiste Daroussin wprintw(com_win, "%s", searching_msg);
258172fcea8cSEd Schouten wrefresh(com_win);
258272fcea8cSEd Schouten clear_com_win = TRUE;
258372fcea8cSEd Schouten }
258472fcea8cSEd Schouten lines_moved = 0;
258572fcea8cSEd Schouten found = FALSE;
258672fcea8cSEd Schouten srch_line = curr_line;
258772fcea8cSEd Schouten srch_1 = point;
258872fcea8cSEd Schouten if (position < curr_line->line_length)
258972fcea8cSEd Schouten srch_1++;
259072fcea8cSEd Schouten iter = position + 1;
259172fcea8cSEd Schouten while ((!found) && (srch_line != NULL))
259272fcea8cSEd Schouten {
259372fcea8cSEd Schouten while ((iter < srch_line->line_length) && (!found))
259472fcea8cSEd Schouten {
259572fcea8cSEd Schouten srch_2 = srch_1;
259672fcea8cSEd Schouten if (case_sen) /* if case sensitive */
259772fcea8cSEd Schouten {
259872fcea8cSEd Schouten srch_3 = srch_str;
259996b676e9SEd Schouten while ((*srch_2 == *srch_3) && (*srch_3 != '\0'))
260072fcea8cSEd Schouten {
260172fcea8cSEd Schouten found = TRUE;
260272fcea8cSEd Schouten srch_2++;
260372fcea8cSEd Schouten srch_3++;
260472fcea8cSEd Schouten } /* end while */
260572fcea8cSEd Schouten }
260672fcea8cSEd Schouten else /* if not case sensitive */
260772fcea8cSEd Schouten {
260872fcea8cSEd Schouten srch_3 = u_srch_str;
260996b676e9SEd Schouten while ((toupper(*srch_2) == *srch_3) && (*srch_3 != '\0'))
261072fcea8cSEd Schouten {
261172fcea8cSEd Schouten found = TRUE;
261272fcea8cSEd Schouten srch_2++;
261372fcea8cSEd Schouten srch_3++;
261472fcea8cSEd Schouten }
261572fcea8cSEd Schouten } /* end else */
261696b676e9SEd Schouten if (!((*srch_3 == '\0') && (found)))
261772fcea8cSEd Schouten {
261872fcea8cSEd Schouten found = FALSE;
261972fcea8cSEd Schouten if (iter < srch_line->line_length)
262072fcea8cSEd Schouten srch_1++;
262172fcea8cSEd Schouten iter++;
262272fcea8cSEd Schouten }
262372fcea8cSEd Schouten }
262472fcea8cSEd Schouten if (!found)
262572fcea8cSEd Schouten {
262672fcea8cSEd Schouten srch_line = srch_line->next_line;
262772fcea8cSEd Schouten if (srch_line != NULL)
262872fcea8cSEd Schouten srch_1 = srch_line->line;
262972fcea8cSEd Schouten iter = 1;
263072fcea8cSEd Schouten lines_moved++;
263172fcea8cSEd Schouten }
263272fcea8cSEd Schouten }
263372fcea8cSEd Schouten if (found)
263472fcea8cSEd Schouten {
263572fcea8cSEd Schouten if (display_message)
263672fcea8cSEd Schouten {
263772fcea8cSEd Schouten wmove(com_win, 0, 0);
263872fcea8cSEd Schouten wclrtoeol(com_win);
263972fcea8cSEd Schouten wrefresh(com_win);
264072fcea8cSEd Schouten }
264172fcea8cSEd Schouten if (lines_moved == 0)
264272fcea8cSEd Schouten {
264372fcea8cSEd Schouten while (position < iter)
264472fcea8cSEd Schouten right(TRUE);
264572fcea8cSEd Schouten }
264672fcea8cSEd Schouten else
264772fcea8cSEd Schouten {
264872fcea8cSEd Schouten if (lines_moved < 30)
264972fcea8cSEd Schouten {
26507bf1ea96SEd Schouten move_rel('d', lines_moved);
265172fcea8cSEd Schouten while (position < iter)
265272fcea8cSEd Schouten right(TRUE);
265372fcea8cSEd Schouten }
265472fcea8cSEd Schouten else
265572fcea8cSEd Schouten {
265696b676e9SEd Schouten absolute_lin += lines_moved;
265772fcea8cSEd Schouten curr_line = srch_line;
265872fcea8cSEd Schouten point = srch_1;
265972fcea8cSEd Schouten position = iter;
266072fcea8cSEd Schouten scanline(point);
266172fcea8cSEd Schouten scr_pos = scr_horz;
266272fcea8cSEd Schouten midscreen((last_line / 2), point);
266372fcea8cSEd Schouten }
266472fcea8cSEd Schouten }
266572fcea8cSEd Schouten }
266672fcea8cSEd Schouten else
266772fcea8cSEd Schouten {
266872fcea8cSEd Schouten if (display_message)
266972fcea8cSEd Schouten {
267072fcea8cSEd Schouten wmove(com_win, 0, 0);
267172fcea8cSEd Schouten wclrtoeol(com_win);
267272fcea8cSEd Schouten wprintw(com_win, str_not_found_msg, srch_str);
267372fcea8cSEd Schouten wrefresh(com_win);
267472fcea8cSEd Schouten }
267572fcea8cSEd Schouten wmove(text_win, scr_vert,(scr_horz - horiz_offset));
267672fcea8cSEd Schouten }
267772fcea8cSEd Schouten return(found);
267872fcea8cSEd Schouten }
267972fcea8cSEd Schouten
268091517e3bSJohn Baldwin /* prompt and read search string (srch_str) */
268172fcea8cSEd Schouten void
search_prompt(void)268291517e3bSJohn Baldwin search_prompt(void)
268372fcea8cSEd Schouten {
268472fcea8cSEd Schouten if (srch_str != NULL)
268572fcea8cSEd Schouten free(srch_str);
268696b676e9SEd Schouten if ((u_srch_str != NULL) && (*u_srch_str != '\0'))
268772fcea8cSEd Schouten free(u_srch_str);
268872fcea8cSEd Schouten srch_str = get_string(search_prompt_str, FALSE);
268972fcea8cSEd Schouten gold = FALSE;
269072fcea8cSEd Schouten srch_3 = srch_str;
269172fcea8cSEd Schouten srch_1 = u_srch_str = malloc(strlen(srch_str) + 1);
269296b676e9SEd Schouten while (*srch_3 != '\0')
269372fcea8cSEd Schouten {
269472fcea8cSEd Schouten *srch_1 = toupper(*srch_3);
269572fcea8cSEd Schouten srch_1++;
269672fcea8cSEd Schouten srch_3++;
269772fcea8cSEd Schouten }
269896b676e9SEd Schouten *srch_1 = '\0';
269972fcea8cSEd Schouten search(TRUE);
270072fcea8cSEd Schouten }
270172fcea8cSEd Schouten
270291517e3bSJohn Baldwin /* delete current character */
270372fcea8cSEd Schouten void
del_char(void)270491517e3bSJohn Baldwin del_char(void)
270572fcea8cSEd Schouten {
270672fcea8cSEd Schouten in = 8; /* backspace */
270772fcea8cSEd Schouten if (position < curr_line->line_length) /* if not end of line */
270872fcea8cSEd Schouten {
270972fcea8cSEd Schouten if ((ee_chinese) && (*point > 127) &&
271072fcea8cSEd Schouten ((curr_line->line_length - position) >= 2))
271172fcea8cSEd Schouten {
271272fcea8cSEd Schouten point++;
271372fcea8cSEd Schouten position++;
271472fcea8cSEd Schouten }
271572fcea8cSEd Schouten position++;
271672fcea8cSEd Schouten point++;
271772fcea8cSEd Schouten scanline(point);
271872fcea8cSEd Schouten delete(TRUE);
271972fcea8cSEd Schouten }
272072fcea8cSEd Schouten else
272172fcea8cSEd Schouten {
27227bf1ea96SEd Schouten right(TRUE);
27237bf1ea96SEd Schouten delete(TRUE);
272472fcea8cSEd Schouten }
272572fcea8cSEd Schouten }
272672fcea8cSEd Schouten
272791517e3bSJohn Baldwin /* undelete last deleted character */
272872fcea8cSEd Schouten void
undel_char(void)272991517e3bSJohn Baldwin undel_char(void)
273072fcea8cSEd Schouten {
273172fcea8cSEd Schouten if (d_char[0] == '\n') /* insert line if last del_char deleted eol */
273272fcea8cSEd Schouten insert_line(TRUE);
273372fcea8cSEd Schouten else
273472fcea8cSEd Schouten {
273572fcea8cSEd Schouten in = d_char[0];
273672fcea8cSEd Schouten insert(in);
273796b676e9SEd Schouten if (d_char[1] != '\0')
273872fcea8cSEd Schouten {
273972fcea8cSEd Schouten in = d_char[1];
274072fcea8cSEd Schouten insert(in);
274172fcea8cSEd Schouten }
274272fcea8cSEd Schouten }
274372fcea8cSEd Schouten }
274472fcea8cSEd Schouten
274591517e3bSJohn Baldwin /* delete word in front of cursor */
274672fcea8cSEd Schouten void
del_word(void)274791517e3bSJohn Baldwin del_word(void)
274872fcea8cSEd Schouten {
274972fcea8cSEd Schouten int tposit;
275072fcea8cSEd Schouten int difference;
275172fcea8cSEd Schouten unsigned char *d_word2;
275272fcea8cSEd Schouten unsigned char *d_word3;
275372fcea8cSEd Schouten unsigned char tmp_char[3];
275472fcea8cSEd Schouten
275572fcea8cSEd Schouten if (d_word != NULL)
275672fcea8cSEd Schouten free(d_word);
275772fcea8cSEd Schouten d_word = malloc(curr_line->line_length);
275872fcea8cSEd Schouten tmp_char[0] = d_char[0];
275972fcea8cSEd Schouten tmp_char[1] = d_char[1];
276072fcea8cSEd Schouten tmp_char[2] = d_char[2];
276172fcea8cSEd Schouten d_word3 = point;
276272fcea8cSEd Schouten d_word2 = d_word;
276372fcea8cSEd Schouten tposit = position;
276472fcea8cSEd Schouten while ((tposit < curr_line->line_length) &&
276572fcea8cSEd Schouten ((*d_word3 != ' ') && (*d_word3 != '\t')))
276672fcea8cSEd Schouten {
276772fcea8cSEd Schouten tposit++;
276872fcea8cSEd Schouten *d_word2 = *d_word3;
276972fcea8cSEd Schouten d_word2++;
277072fcea8cSEd Schouten d_word3++;
277172fcea8cSEd Schouten }
277272fcea8cSEd Schouten while ((tposit < curr_line->line_length) &&
277372fcea8cSEd Schouten ((*d_word3 == ' ') || (*d_word3 == '\t')))
277472fcea8cSEd Schouten {
277572fcea8cSEd Schouten tposit++;
277672fcea8cSEd Schouten *d_word2 = *d_word3;
277772fcea8cSEd Schouten d_word2++;
277872fcea8cSEd Schouten d_word3++;
277972fcea8cSEd Schouten }
278096b676e9SEd Schouten *d_word2 = '\0';
278172fcea8cSEd Schouten d_wrd_len = difference = d_word2 - d_word;
278272fcea8cSEd Schouten d_word2 = point;
278372fcea8cSEd Schouten while (tposit < curr_line->line_length)
278472fcea8cSEd Schouten {
278572fcea8cSEd Schouten tposit++;
278672fcea8cSEd Schouten *d_word2 = *d_word3;
278772fcea8cSEd Schouten d_word2++;
278872fcea8cSEd Schouten d_word3++;
278972fcea8cSEd Schouten }
279072fcea8cSEd Schouten curr_line->line_length -= difference;
279196b676e9SEd Schouten *d_word2 = '\0';
279272fcea8cSEd Schouten draw_line(scr_vert, scr_horz,point,position,curr_line->line_length);
279372fcea8cSEd Schouten d_char[0] = tmp_char[0];
279472fcea8cSEd Schouten d_char[1] = tmp_char[1];
279572fcea8cSEd Schouten d_char[2] = tmp_char[2];
279672fcea8cSEd Schouten text_changes = TRUE;
279772fcea8cSEd Schouten formatted = FALSE;
279872fcea8cSEd Schouten }
279972fcea8cSEd Schouten
280091517e3bSJohn Baldwin /* undelete last deleted word */
280172fcea8cSEd Schouten void
undel_word(void)280291517e3bSJohn Baldwin undel_word(void)
280372fcea8cSEd Schouten {
280472fcea8cSEd Schouten int temp;
280572fcea8cSEd Schouten int tposit;
280672fcea8cSEd Schouten unsigned char *tmp_old_ptr;
280772fcea8cSEd Schouten unsigned char *tmp_space;
280872fcea8cSEd Schouten unsigned char *tmp_ptr;
280972fcea8cSEd Schouten unsigned char *d_word_ptr;
281072fcea8cSEd Schouten
281172fcea8cSEd Schouten /*
281272fcea8cSEd Schouten | resize line to handle undeleted word
281372fcea8cSEd Schouten */
281472fcea8cSEd Schouten if ((curr_line->max_length - (curr_line->line_length + d_wrd_len)) < 5)
281572fcea8cSEd Schouten point = resiz_line(d_wrd_len, curr_line, position);
281672fcea8cSEd Schouten tmp_ptr = tmp_space = malloc(curr_line->line_length + d_wrd_len);
281772fcea8cSEd Schouten d_word_ptr = d_word;
281872fcea8cSEd Schouten temp = 1;
281972fcea8cSEd Schouten /*
282072fcea8cSEd Schouten | copy d_word contents into temp space
282172fcea8cSEd Schouten */
282272fcea8cSEd Schouten while (temp <= d_wrd_len)
282372fcea8cSEd Schouten {
282472fcea8cSEd Schouten temp++;
282572fcea8cSEd Schouten *tmp_ptr = *d_word_ptr;
282672fcea8cSEd Schouten tmp_ptr++;
282772fcea8cSEd Schouten d_word_ptr++;
282872fcea8cSEd Schouten }
282972fcea8cSEd Schouten tmp_old_ptr = point;
283072fcea8cSEd Schouten tposit = position;
283172fcea8cSEd Schouten /*
283272fcea8cSEd Schouten | copy contents of line from curent position to eol into
283372fcea8cSEd Schouten | temp space
283472fcea8cSEd Schouten */
283572fcea8cSEd Schouten while (tposit < curr_line->line_length)
283672fcea8cSEd Schouten {
283772fcea8cSEd Schouten temp++;
283872fcea8cSEd Schouten tposit++;
283972fcea8cSEd Schouten *tmp_ptr = *tmp_old_ptr;
284072fcea8cSEd Schouten tmp_ptr++;
284172fcea8cSEd Schouten tmp_old_ptr++;
284272fcea8cSEd Schouten }
284372fcea8cSEd Schouten curr_line->line_length += d_wrd_len;
284472fcea8cSEd Schouten tmp_old_ptr = point;
284596b676e9SEd Schouten *tmp_ptr = '\0';
284672fcea8cSEd Schouten tmp_ptr = tmp_space;
284772fcea8cSEd Schouten tposit = 1;
284872fcea8cSEd Schouten /*
284972fcea8cSEd Schouten | now copy contents from temp space back to original line
285072fcea8cSEd Schouten */
285172fcea8cSEd Schouten while (tposit < temp)
285272fcea8cSEd Schouten {
285372fcea8cSEd Schouten tposit++;
285472fcea8cSEd Schouten *tmp_old_ptr = *tmp_ptr;
285572fcea8cSEd Schouten tmp_ptr++;
285672fcea8cSEd Schouten tmp_old_ptr++;
285772fcea8cSEd Schouten }
285896b676e9SEd Schouten *tmp_old_ptr = '\0';
285972fcea8cSEd Schouten free(tmp_space);
286072fcea8cSEd Schouten draw_line(scr_vert, scr_horz, point, position, curr_line->line_length);
286172fcea8cSEd Schouten }
286272fcea8cSEd Schouten
286391517e3bSJohn Baldwin /* delete from cursor to end of line */
286472fcea8cSEd Schouten void
del_line(void)286591517e3bSJohn Baldwin del_line(void)
286672fcea8cSEd Schouten {
286772fcea8cSEd Schouten unsigned char *dl1;
286872fcea8cSEd Schouten unsigned char *dl2;
286972fcea8cSEd Schouten int tposit;
287072fcea8cSEd Schouten
287172fcea8cSEd Schouten if (d_line != NULL)
287272fcea8cSEd Schouten free(d_line);
287372fcea8cSEd Schouten d_line = malloc(curr_line->line_length);
287472fcea8cSEd Schouten dl1 = d_line;
287572fcea8cSEd Schouten dl2 = point;
287672fcea8cSEd Schouten tposit = position;
287772fcea8cSEd Schouten while (tposit < curr_line->line_length)
287872fcea8cSEd Schouten {
287972fcea8cSEd Schouten *dl1 = *dl2;
288072fcea8cSEd Schouten dl1++;
288172fcea8cSEd Schouten dl2++;
288272fcea8cSEd Schouten tposit++;
288372fcea8cSEd Schouten }
288472fcea8cSEd Schouten dlt_line->line_length = 1 + tposit - position;
288596b676e9SEd Schouten *dl1 = '\0';
288696b676e9SEd Schouten *point = '\0';
288772fcea8cSEd Schouten curr_line->line_length = position;
288872fcea8cSEd Schouten wclrtoeol(text_win);
288972fcea8cSEd Schouten if (curr_line->next_line != NULL)
289072fcea8cSEd Schouten {
289172fcea8cSEd Schouten right(FALSE);
289272fcea8cSEd Schouten delete(FALSE);
289372fcea8cSEd Schouten }
289472fcea8cSEd Schouten text_changes = TRUE;
289572fcea8cSEd Schouten }
289672fcea8cSEd Schouten
289791517e3bSJohn Baldwin /* undelete last deleted line */
289872fcea8cSEd Schouten void
undel_line(void)289991517e3bSJohn Baldwin undel_line(void)
290072fcea8cSEd Schouten {
290172fcea8cSEd Schouten unsigned char *ud1;
290272fcea8cSEd Schouten unsigned char *ud2;
290372fcea8cSEd Schouten int tposit;
290472fcea8cSEd Schouten
290572fcea8cSEd Schouten if (dlt_line->line_length == 0)
290672fcea8cSEd Schouten return;
290772fcea8cSEd Schouten
290872fcea8cSEd Schouten insert_line(TRUE);
290972fcea8cSEd Schouten left(TRUE);
291072fcea8cSEd Schouten point = resiz_line(dlt_line->line_length, curr_line, position);
291172fcea8cSEd Schouten curr_line->line_length += dlt_line->line_length - 1;
291272fcea8cSEd Schouten ud1 = point;
291372fcea8cSEd Schouten ud2 = d_line;
291472fcea8cSEd Schouten tposit = 1;
291572fcea8cSEd Schouten while (tposit < dlt_line->line_length)
291672fcea8cSEd Schouten {
291772fcea8cSEd Schouten tposit++;
291872fcea8cSEd Schouten *ud1 = *ud2;
291972fcea8cSEd Schouten ud1++;
292072fcea8cSEd Schouten ud2++;
292172fcea8cSEd Schouten }
292296b676e9SEd Schouten *ud1 = '\0';
292372fcea8cSEd Schouten draw_line(scr_vert, scr_horz,point,position,curr_line->line_length);
292472fcea8cSEd Schouten }
292572fcea8cSEd Schouten
292691517e3bSJohn Baldwin /* advance to next word */
292772fcea8cSEd Schouten void
adv_word(void)292891517e3bSJohn Baldwin adv_word(void)
292972fcea8cSEd Schouten {
293072fcea8cSEd Schouten while ((position < curr_line->line_length) && ((*point != 32) && (*point != 9)))
293172fcea8cSEd Schouten right(TRUE);
293272fcea8cSEd Schouten while ((position < curr_line->line_length) && ((*point == 32) || (*point == 9)))
293372fcea8cSEd Schouten right(TRUE);
293472fcea8cSEd Schouten }
293572fcea8cSEd Schouten
293691517e3bSJohn Baldwin /* move relative to current line */
293772fcea8cSEd Schouten void
move_rel(int direction,int lines)293891517e3bSJohn Baldwin move_rel(int direction, int lines)
293972fcea8cSEd Schouten {
294072fcea8cSEd Schouten int i;
294172fcea8cSEd Schouten char *tmp;
294272fcea8cSEd Schouten
29437bf1ea96SEd Schouten if (direction == 'u')
294472fcea8cSEd Schouten {
294572fcea8cSEd Schouten scr_pos = 0;
294672fcea8cSEd Schouten while (position > 1)
294772fcea8cSEd Schouten left(TRUE);
294872fcea8cSEd Schouten for (i = 0; i < lines; i++)
294972fcea8cSEd Schouten {
295072fcea8cSEd Schouten up();
295172fcea8cSEd Schouten }
295272fcea8cSEd Schouten if ((last_line > 5) && ( scr_vert < 4))
295372fcea8cSEd Schouten {
295472fcea8cSEd Schouten tmp = point;
295572fcea8cSEd Schouten tmp_line = curr_line;
295672fcea8cSEd Schouten for (i= 0;(i<5)&&(curr_line->prev_line != NULL); i++)
295772fcea8cSEd Schouten {
295872fcea8cSEd Schouten up();
295972fcea8cSEd Schouten }
296072fcea8cSEd Schouten scr_vert = scr_vert + i;
296172fcea8cSEd Schouten curr_line = tmp_line;
296296b676e9SEd Schouten absolute_lin += i;
296372fcea8cSEd Schouten point = tmp;
296472fcea8cSEd Schouten scanline(point);
296572fcea8cSEd Schouten }
296672fcea8cSEd Schouten }
296772fcea8cSEd Schouten else
296872fcea8cSEd Schouten {
296972fcea8cSEd Schouten if ((position != 1) && (curr_line->next_line != NULL))
297072fcea8cSEd Schouten {
297172fcea8cSEd Schouten nextline();
297272fcea8cSEd Schouten scr_pos = scr_horz = 0;
297372fcea8cSEd Schouten if (horiz_offset)
297472fcea8cSEd Schouten {
297572fcea8cSEd Schouten horiz_offset = 0;
297672fcea8cSEd Schouten midscreen(scr_vert, point);
297772fcea8cSEd Schouten }
297872fcea8cSEd Schouten }
297972fcea8cSEd Schouten else
298072fcea8cSEd Schouten adv_line();
298172fcea8cSEd Schouten for (i = 1; i < lines; i++)
298272fcea8cSEd Schouten {
298372fcea8cSEd Schouten down();
298472fcea8cSEd Schouten }
298572fcea8cSEd Schouten if ((last_line > 10) && (scr_vert > (last_line - 5)))
298672fcea8cSEd Schouten {
298772fcea8cSEd Schouten tmp = point;
298872fcea8cSEd Schouten tmp_line = curr_line;
298972fcea8cSEd Schouten for (i=0; (i<5) && (curr_line->next_line != NULL); i++)
299072fcea8cSEd Schouten {
299172fcea8cSEd Schouten down();
299272fcea8cSEd Schouten }
299396b676e9SEd Schouten absolute_lin -= i;
299472fcea8cSEd Schouten scr_vert = scr_vert - i;
299572fcea8cSEd Schouten curr_line = tmp_line;
299672fcea8cSEd Schouten point = tmp;
299772fcea8cSEd Schouten scanline(point);
299872fcea8cSEd Schouten }
299972fcea8cSEd Schouten }
300072fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset));
300172fcea8cSEd Schouten }
300272fcea8cSEd Schouten
300391517e3bSJohn Baldwin /* go to end of line */
300472fcea8cSEd Schouten void
eol(void)300591517e3bSJohn Baldwin eol(void)
300672fcea8cSEd Schouten {
300772fcea8cSEd Schouten if (position < curr_line->line_length)
300872fcea8cSEd Schouten {
300972fcea8cSEd Schouten while (position < curr_line->line_length)
301072fcea8cSEd Schouten right(TRUE);
301172fcea8cSEd Schouten }
301272fcea8cSEd Schouten else if (curr_line->next_line != NULL)
301372fcea8cSEd Schouten {
301472fcea8cSEd Schouten right(TRUE);
301572fcea8cSEd Schouten while (position < curr_line->line_length)
301672fcea8cSEd Schouten right(TRUE);
301772fcea8cSEd Schouten }
301872fcea8cSEd Schouten }
301972fcea8cSEd Schouten
302091517e3bSJohn Baldwin /* move to beginning of line */
302172fcea8cSEd Schouten void
bol(void)302291517e3bSJohn Baldwin bol(void)
302372fcea8cSEd Schouten {
302472fcea8cSEd Schouten if (point != curr_line->line)
302572fcea8cSEd Schouten {
302672fcea8cSEd Schouten while (point != curr_line->line)
302772fcea8cSEd Schouten left(TRUE);
302872fcea8cSEd Schouten }
302972fcea8cSEd Schouten else if (curr_line->prev_line != NULL)
303072fcea8cSEd Schouten {
303172fcea8cSEd Schouten scr_pos = 0;
303272fcea8cSEd Schouten up();
303372fcea8cSEd Schouten }
303472fcea8cSEd Schouten }
303572fcea8cSEd Schouten
303691517e3bSJohn Baldwin /* advance to beginning of next line */
303772fcea8cSEd Schouten void
adv_line(void)303891517e3bSJohn Baldwin adv_line(void)
303972fcea8cSEd Schouten {
304072fcea8cSEd Schouten if ((point != curr_line->line) || (scr_pos > 0))
304172fcea8cSEd Schouten {
304272fcea8cSEd Schouten while (position < curr_line->line_length)
304372fcea8cSEd Schouten right(TRUE);
304472fcea8cSEd Schouten right(TRUE);
304572fcea8cSEd Schouten }
304672fcea8cSEd Schouten else if (curr_line->next_line != NULL)
304772fcea8cSEd Schouten {
304872fcea8cSEd Schouten scr_pos = 0;
304972fcea8cSEd Schouten down();
305072fcea8cSEd Schouten }
305172fcea8cSEd Schouten }
305272fcea8cSEd Schouten
305372fcea8cSEd Schouten void
from_top(void)305491517e3bSJohn Baldwin from_top(void)
305596b676e9SEd Schouten {
305696b676e9SEd Schouten struct text *tmpline = first_line;
305796b676e9SEd Schouten int x = 1;
305896b676e9SEd Schouten
305996b676e9SEd Schouten while ((tmpline != NULL) && (tmpline != curr_line))
306096b676e9SEd Schouten {
306196b676e9SEd Schouten x++;
306296b676e9SEd Schouten tmpline = tmpline->next_line;
306396b676e9SEd Schouten }
306496b676e9SEd Schouten absolute_lin = x;
306596b676e9SEd Schouten }
306696b676e9SEd Schouten
306791517e3bSJohn Baldwin /* execute shell command */
306896b676e9SEd Schouten void
sh_command(char * string)306991517e3bSJohn Baldwin sh_command(char *string)
307072fcea8cSEd Schouten {
307172fcea8cSEd Schouten char *temp_point;
307272fcea8cSEd Schouten char *last_slash;
307372fcea8cSEd Schouten char *path; /* directory path to executable */
307472fcea8cSEd Schouten int parent; /* zero if child, child's pid if parent */
307572fcea8cSEd Schouten int value;
307672fcea8cSEd Schouten int return_val;
307772fcea8cSEd Schouten struct text *line_holder;
307872fcea8cSEd Schouten
307972fcea8cSEd Schouten if (restrict_mode())
308072fcea8cSEd Schouten {
308172fcea8cSEd Schouten return;
308272fcea8cSEd Schouten }
308372fcea8cSEd Schouten
308472fcea8cSEd Schouten if (!(path = getenv("SHELL")))
308572fcea8cSEd Schouten path = "/bin/sh";
308672fcea8cSEd Schouten last_slash = temp_point = path;
308796b676e9SEd Schouten while (*temp_point != '\0')
308872fcea8cSEd Schouten {
308972fcea8cSEd Schouten if (*temp_point == '/')
309072fcea8cSEd Schouten last_slash = ++temp_point;
309172fcea8cSEd Schouten else
309272fcea8cSEd Schouten temp_point++;
309372fcea8cSEd Schouten }
309472fcea8cSEd Schouten
309572fcea8cSEd Schouten /*
309672fcea8cSEd Schouten | if in_pipe is true, then output of the shell operation will be
309772fcea8cSEd Schouten | read by the editor, and curses doesn't need to be turned off
309872fcea8cSEd Schouten */
309972fcea8cSEd Schouten
310072fcea8cSEd Schouten if (!in_pipe)
310172fcea8cSEd Schouten {
310272fcea8cSEd Schouten keypad(com_win, FALSE);
310372fcea8cSEd Schouten keypad(text_win, FALSE);
310472fcea8cSEd Schouten echo();
310572fcea8cSEd Schouten nl();
310672fcea8cSEd Schouten noraw();
310772fcea8cSEd Schouten resetty();
310872fcea8cSEd Schouten
310972fcea8cSEd Schouten #ifndef NCURSE
311072fcea8cSEd Schouten endwin();
311172fcea8cSEd Schouten #endif
311272fcea8cSEd Schouten }
311372fcea8cSEd Schouten
311472fcea8cSEd Schouten if (in_pipe)
311572fcea8cSEd Schouten {
311672fcea8cSEd Schouten pipe(pipe_in); /* create a pipe */
311772fcea8cSEd Schouten parent = fork();
311872fcea8cSEd Schouten if (!parent) /* if the child */
311972fcea8cSEd Schouten {
312072fcea8cSEd Schouten /*
312172fcea8cSEd Schouten | child process which will fork and exec shell command (if shell output is
312272fcea8cSEd Schouten | to be read by editor)
312372fcea8cSEd Schouten */
312472fcea8cSEd Schouten in_pipe = FALSE;
312572fcea8cSEd Schouten /*
312672fcea8cSEd Schouten | redirect stdout to pipe
312772fcea8cSEd Schouten */
312872fcea8cSEd Schouten temp_stdout = dup(1);
312972fcea8cSEd Schouten close(1);
313072fcea8cSEd Schouten dup(pipe_in[1]);
313172fcea8cSEd Schouten /*
313272fcea8cSEd Schouten | redirect stderr to pipe
313372fcea8cSEd Schouten */
313472fcea8cSEd Schouten temp_stderr = dup(2);
313572fcea8cSEd Schouten close(2);
313672fcea8cSEd Schouten dup(pipe_in[1]);
313772fcea8cSEd Schouten close(pipe_in[1]);
313872fcea8cSEd Schouten /*
313972fcea8cSEd Schouten | child will now continue down 'if (!in_pipe)'
314072fcea8cSEd Schouten | path below
314172fcea8cSEd Schouten */
314272fcea8cSEd Schouten }
314372fcea8cSEd Schouten else /* if the parent */
314472fcea8cSEd Schouten {
314572fcea8cSEd Schouten /*
314672fcea8cSEd Schouten | prepare editor to read from the pipe
314772fcea8cSEd Schouten */
314872fcea8cSEd Schouten signal(SIGCHLD, SIG_IGN);
314972fcea8cSEd Schouten line_holder = curr_line;
315072fcea8cSEd Schouten tmp_vert = scr_vert;
315172fcea8cSEd Schouten close(pipe_in[1]);
315272fcea8cSEd Schouten get_fd = pipe_in[0];
315372fcea8cSEd Schouten get_file("");
315472fcea8cSEd Schouten close(pipe_in[0]);
315572fcea8cSEd Schouten scr_vert = tmp_vert;
315672fcea8cSEd Schouten scr_horz = scr_pos = 0;
315772fcea8cSEd Schouten position = 1;
315872fcea8cSEd Schouten curr_line = line_holder;
315996b676e9SEd Schouten from_top();
316072fcea8cSEd Schouten point = curr_line->line;
316172fcea8cSEd Schouten out_pipe = FALSE;
316272fcea8cSEd Schouten signal(SIGCHLD, SIG_DFL);
316372fcea8cSEd Schouten /*
316472fcea8cSEd Schouten | since flag "in_pipe" is still TRUE, the path which waits for the child
316572fcea8cSEd Schouten | process to die will be avoided.
316672fcea8cSEd Schouten | (the pipe is closed, no more output can be expected)
316772fcea8cSEd Schouten */
316872fcea8cSEd Schouten }
316972fcea8cSEd Schouten }
317072fcea8cSEd Schouten if (!in_pipe)
317172fcea8cSEd Schouten {
317272fcea8cSEd Schouten signal(SIGINT, SIG_IGN);
317372fcea8cSEd Schouten if (out_pipe)
317472fcea8cSEd Schouten {
317572fcea8cSEd Schouten pipe(pipe_out);
317672fcea8cSEd Schouten }
317772fcea8cSEd Schouten /*
317872fcea8cSEd Schouten | fork process which will exec command
317972fcea8cSEd Schouten */
318072fcea8cSEd Schouten parent = fork();
318172fcea8cSEd Schouten if (!parent) /* if the child */
318272fcea8cSEd Schouten {
318372fcea8cSEd Schouten if (shell_fork)
318472fcea8cSEd Schouten putchar('\n');
318572fcea8cSEd Schouten if (out_pipe)
318672fcea8cSEd Schouten {
318772fcea8cSEd Schouten /*
318872fcea8cSEd Schouten | prepare the child process (soon to exec a shell command) to read from the
318972fcea8cSEd Schouten | pipe (which will be output from the editor's buffer)
319072fcea8cSEd Schouten */
319172fcea8cSEd Schouten close(0);
319272fcea8cSEd Schouten dup(pipe_out[0]);
319372fcea8cSEd Schouten close(pipe_out[0]);
319472fcea8cSEd Schouten close(pipe_out[1]);
319572fcea8cSEd Schouten }
319672fcea8cSEd Schouten for (value = 1; value < 24; value++)
319772fcea8cSEd Schouten signal(value, SIG_DFL);
319896b676e9SEd Schouten execl(path, last_slash, "-c", string, NULL);
319996b676e9SEd Schouten fprintf(stderr, exec_err_msg, path);
320096b676e9SEd Schouten exit(-1);
320172fcea8cSEd Schouten }
320272fcea8cSEd Schouten else /* if the parent */
320372fcea8cSEd Schouten {
320472fcea8cSEd Schouten if (out_pipe)
320572fcea8cSEd Schouten {
320672fcea8cSEd Schouten /*
320772fcea8cSEd Schouten | output the contents of the buffer to the pipe (to be read by the
320872fcea8cSEd Schouten | process forked and exec'd above as stdin)
320972fcea8cSEd Schouten */
321072fcea8cSEd Schouten close(pipe_out[0]);
321172fcea8cSEd Schouten line_holder = first_line;
321272fcea8cSEd Schouten while (line_holder != NULL)
321372fcea8cSEd Schouten {
321472fcea8cSEd Schouten write(pipe_out[1], line_holder->line, (line_holder->line_length-1));
321572fcea8cSEd Schouten write(pipe_out[1], "\n", 1);
321672fcea8cSEd Schouten line_holder = line_holder->next_line;
321772fcea8cSEd Schouten }
321872fcea8cSEd Schouten close(pipe_out[1]);
321972fcea8cSEd Schouten out_pipe = FALSE;
322072fcea8cSEd Schouten }
322172fcea8cSEd Schouten do
322272fcea8cSEd Schouten {
322372fcea8cSEd Schouten return_val = wait((int *) 0);
322472fcea8cSEd Schouten }
322572fcea8cSEd Schouten while ((return_val != parent) && (return_val != -1));
322672fcea8cSEd Schouten /*
322772fcea8cSEd Schouten | if this process is actually the child of the editor, exit. Here's how it
322872fcea8cSEd Schouten | works:
322972fcea8cSEd Schouten | The editor forks a process. If output must be sent to the command to be
323072fcea8cSEd Schouten | exec'd another process is forked, and that process (the child's child)
323172fcea8cSEd Schouten | will exec the command. In this case, "shell_fork" will be FALSE. If no
323272fcea8cSEd Schouten | output is to be performed to the shell command, "shell_fork" will be TRUE.
323372fcea8cSEd Schouten | If this is the editor process, shell_fork will be true, otherwise this is
323472fcea8cSEd Schouten | the child of the edit process.
323572fcea8cSEd Schouten */
323672fcea8cSEd Schouten if (!shell_fork)
323772fcea8cSEd Schouten exit(0);
323872fcea8cSEd Schouten }
323972fcea8cSEd Schouten signal(SIGINT, edit_abort);
324072fcea8cSEd Schouten }
324172fcea8cSEd Schouten if (shell_fork)
324272fcea8cSEd Schouten {
32438f04da68SDimitry Andric fputs(continue_msg, stdout);
324472fcea8cSEd Schouten fflush(stdout);
324572fcea8cSEd Schouten while ((in = getchar()) != '\n')
324672fcea8cSEd Schouten ;
324772fcea8cSEd Schouten }
324872fcea8cSEd Schouten
324972fcea8cSEd Schouten if (!in_pipe)
325072fcea8cSEd Schouten {
325172fcea8cSEd Schouten fixterm();
325272fcea8cSEd Schouten noecho();
325372fcea8cSEd Schouten nonl();
325472fcea8cSEd Schouten raw();
325572fcea8cSEd Schouten keypad(text_win, TRUE);
325672fcea8cSEd Schouten keypad(com_win, TRUE);
325772fcea8cSEd Schouten if (info_window)
325872fcea8cSEd Schouten clearok(info_win, TRUE);
325972fcea8cSEd Schouten }
326072fcea8cSEd Schouten
326172fcea8cSEd Schouten redraw();
326272fcea8cSEd Schouten }
326372fcea8cSEd Schouten
326491517e3bSJohn Baldwin /* set up the terminal for operating with ae */
326572fcea8cSEd Schouten void
set_up_term(void)326691517e3bSJohn Baldwin set_up_term(void)
326772fcea8cSEd Schouten {
326872fcea8cSEd Schouten if (!curses_initialized)
326972fcea8cSEd Schouten {
327072fcea8cSEd Schouten initscr();
327172fcea8cSEd Schouten savetty();
327272fcea8cSEd Schouten noecho();
327372fcea8cSEd Schouten raw();
327472fcea8cSEd Schouten nonl();
327572fcea8cSEd Schouten curses_initialized = TRUE;
327672fcea8cSEd Schouten }
327772fcea8cSEd Schouten
327872fcea8cSEd Schouten if (((LINES > 15) && (COLS >= 80)) && info_window)
327972fcea8cSEd Schouten last_line = LINES - 8;
328072fcea8cSEd Schouten else
328172fcea8cSEd Schouten {
328272fcea8cSEd Schouten info_window = FALSE;
328372fcea8cSEd Schouten last_line = LINES - 2;
328472fcea8cSEd Schouten }
328572fcea8cSEd Schouten
328672fcea8cSEd Schouten idlok(stdscr, TRUE);
328772fcea8cSEd Schouten com_win = newwin(1, COLS, (LINES - 1), 0);
328872fcea8cSEd Schouten keypad(com_win, TRUE);
328972fcea8cSEd Schouten idlok(com_win, TRUE);
329072fcea8cSEd Schouten wrefresh(com_win);
329172fcea8cSEd Schouten if (!info_window)
329272fcea8cSEd Schouten text_win = newwin((LINES - 1), COLS, 0, 0);
329372fcea8cSEd Schouten else
329472fcea8cSEd Schouten text_win = newwin((LINES - 7), COLS, 6, 0);
329572fcea8cSEd Schouten keypad(text_win, TRUE);
329672fcea8cSEd Schouten idlok(text_win, TRUE);
329772fcea8cSEd Schouten wrefresh(text_win);
329872fcea8cSEd Schouten help_win = newwin((LINES - 1), COLS, 0, 0);
329972fcea8cSEd Schouten keypad(help_win, TRUE);
330072fcea8cSEd Schouten idlok(help_win, TRUE);
330172fcea8cSEd Schouten if (info_window)
330272fcea8cSEd Schouten {
330372fcea8cSEd Schouten info_type = CONTROL_KEYS;
330496b676e9SEd Schouten info_win = newwin(6, COLS, 0, 0);
330572fcea8cSEd Schouten werase(info_win);
330672fcea8cSEd Schouten paint_info_win();
330772fcea8cSEd Schouten }
330872fcea8cSEd Schouten
330972fcea8cSEd Schouten last_col = COLS - 1;
331072fcea8cSEd Schouten local_LINES = LINES;
331172fcea8cSEd Schouten local_COLS = COLS;
331272fcea8cSEd Schouten
331372fcea8cSEd Schouten #ifdef NCURSE
331472fcea8cSEd Schouten if (ee_chinese)
331572fcea8cSEd Schouten nc_setattrib(A_NC_BIG5);
331672fcea8cSEd Schouten #endif /* NCURSE */
331772fcea8cSEd Schouten
331872fcea8cSEd Schouten }
331972fcea8cSEd Schouten
332072fcea8cSEd Schouten void
resize_check(void)332191517e3bSJohn Baldwin resize_check(void)
332272fcea8cSEd Schouten {
332372fcea8cSEd Schouten if ((LINES == local_LINES) && (COLS == local_COLS))
332472fcea8cSEd Schouten return;
332572fcea8cSEd Schouten
332672fcea8cSEd Schouten if (info_window)
332772fcea8cSEd Schouten delwin(info_win);
332872fcea8cSEd Schouten delwin(text_win);
332972fcea8cSEd Schouten delwin(com_win);
333072fcea8cSEd Schouten delwin(help_win);
333172fcea8cSEd Schouten set_up_term();
333272fcea8cSEd Schouten redraw();
333372fcea8cSEd Schouten wrefresh(text_win);
333472fcea8cSEd Schouten }
333572fcea8cSEd Schouten
333672fcea8cSEd Schouten static char item_alpha[] = "abcdefghijklmnopqrstuvwxyz0123456789 ";
333772fcea8cSEd Schouten
333872fcea8cSEd Schouten int
menu_op(struct menu_entries menu_list[])333991517e3bSJohn Baldwin menu_op(struct menu_entries menu_list[])
334072fcea8cSEd Schouten {
334172fcea8cSEd Schouten WINDOW *temp_win;
334272fcea8cSEd Schouten int max_width, max_height;
334372fcea8cSEd Schouten int x_off, y_off;
334472fcea8cSEd Schouten int counter;
334572fcea8cSEd Schouten int length;
334672fcea8cSEd Schouten int input;
334796b676e9SEd Schouten int temp;
334872fcea8cSEd Schouten int list_size;
334972fcea8cSEd Schouten int top_offset; /* offset from top where menu items start */
335072fcea8cSEd Schouten int vert_size; /* vertical size for menu list item display */
335172fcea8cSEd Schouten int off_start = 1; /* offset from start of menu items to start display */
335272fcea8cSEd Schouten
335372fcea8cSEd Schouten
335472fcea8cSEd Schouten /*
335572fcea8cSEd Schouten | determine number and width of menu items
335672fcea8cSEd Schouten */
335772fcea8cSEd Schouten
335872fcea8cSEd Schouten list_size = 1;
335972fcea8cSEd Schouten while (menu_list[list_size + 1].item_string != NULL)
336072fcea8cSEd Schouten list_size++;
336172fcea8cSEd Schouten max_width = 0;
336272fcea8cSEd Schouten for (counter = 0; counter <= list_size; counter++)
336372fcea8cSEd Schouten {
336472fcea8cSEd Schouten if ((length = strlen(menu_list[counter].item_string)) > max_width)
336572fcea8cSEd Schouten max_width = length;
336672fcea8cSEd Schouten }
336772fcea8cSEd Schouten max_width += 3;
336872fcea8cSEd Schouten max_width = max(max_width, strlen(menu_cancel_msg));
336972fcea8cSEd Schouten max_width = max(max_width, max(strlen(more_above_str), strlen(more_below_str)));
337072fcea8cSEd Schouten max_width += 6;
337172fcea8cSEd Schouten
337272fcea8cSEd Schouten /*
337372fcea8cSEd Schouten | make sure that window is large enough to handle menu
337472fcea8cSEd Schouten | if not, print error message and return to calling function
337572fcea8cSEd Schouten */
337672fcea8cSEd Schouten
337772fcea8cSEd Schouten if (max_width > COLS)
337872fcea8cSEd Schouten {
337972fcea8cSEd Schouten wmove(com_win, 0, 0);
338072fcea8cSEd Schouten werase(com_win);
3381*0667538bSBaptiste Daroussin wprintw(com_win, "%s", menu_too_lrg_msg);
338272fcea8cSEd Schouten wrefresh(com_win);
338372fcea8cSEd Schouten clear_com_win = TRUE;
338472fcea8cSEd Schouten return(0);
338572fcea8cSEd Schouten }
338672fcea8cSEd Schouten
338772fcea8cSEd Schouten top_offset = 0;
338872fcea8cSEd Schouten
338972fcea8cSEd Schouten if (list_size > LINES)
339072fcea8cSEd Schouten {
339172fcea8cSEd Schouten max_height = LINES;
339272fcea8cSEd Schouten if (max_height > 11)
339372fcea8cSEd Schouten vert_size = max_height - 8;
339472fcea8cSEd Schouten else
339572fcea8cSEd Schouten vert_size = max_height;
339672fcea8cSEd Schouten }
339772fcea8cSEd Schouten else
339872fcea8cSEd Schouten {
339972fcea8cSEd Schouten vert_size = list_size;
340072fcea8cSEd Schouten max_height = list_size;
340172fcea8cSEd Schouten }
340272fcea8cSEd Schouten
340372fcea8cSEd Schouten if (LINES >= (vert_size + 8))
340472fcea8cSEd Schouten {
340572fcea8cSEd Schouten if (menu_list[0].argument != MENU_WARN)
340672fcea8cSEd Schouten max_height = vert_size + 8;
340772fcea8cSEd Schouten else
340872fcea8cSEd Schouten max_height = vert_size + 7;
340972fcea8cSEd Schouten top_offset = 4;
341072fcea8cSEd Schouten }
341172fcea8cSEd Schouten x_off = (COLS - max_width) / 2;
341272fcea8cSEd Schouten y_off = (LINES - max_height - 1) / 2;
341372fcea8cSEd Schouten temp_win = newwin(max_height, max_width, y_off, x_off);
341472fcea8cSEd Schouten keypad(temp_win, TRUE);
341572fcea8cSEd Schouten
341672fcea8cSEd Schouten paint_menu(menu_list, max_width, max_height, list_size, top_offset, temp_win, off_start, vert_size);
341772fcea8cSEd Schouten
341872fcea8cSEd Schouten counter = 1;
341972fcea8cSEd Schouten do
342072fcea8cSEd Schouten {
342172fcea8cSEd Schouten if (off_start > 2)
342272fcea8cSEd Schouten wmove(temp_win, (1 + counter + top_offset - off_start), 3);
342372fcea8cSEd Schouten else
342472fcea8cSEd Schouten wmove(temp_win, (counter + top_offset - off_start), 3);
342572fcea8cSEd Schouten
342672fcea8cSEd Schouten wrefresh(temp_win);
342796b676e9SEd Schouten in = wgetch(temp_win);
342896b676e9SEd Schouten input = in;
342996b676e9SEd Schouten if (input == -1)
343096b676e9SEd Schouten exit(0);
343172fcea8cSEd Schouten
343231dcbfadSAndrey A. Chernov if (isascii(input) && isalnum(input))
343372fcea8cSEd Schouten {
343431dcbfadSAndrey A. Chernov if (isalpha(input))
343572fcea8cSEd Schouten {
343672fcea8cSEd Schouten temp = 1 + tolower(input) - 'a';
343772fcea8cSEd Schouten }
343831dcbfadSAndrey A. Chernov else if (isdigit(input))
343972fcea8cSEd Schouten {
344072fcea8cSEd Schouten temp = (2 + 'z' - 'a') + (input - '0');
344172fcea8cSEd Schouten }
344272fcea8cSEd Schouten
344372fcea8cSEd Schouten if (temp <= list_size)
344472fcea8cSEd Schouten {
344572fcea8cSEd Schouten input = '\n';
344672fcea8cSEd Schouten counter = temp;
344772fcea8cSEd Schouten }
344872fcea8cSEd Schouten }
344972fcea8cSEd Schouten else
345072fcea8cSEd Schouten {
345172fcea8cSEd Schouten switch (input)
345272fcea8cSEd Schouten {
345372fcea8cSEd Schouten case ' ': /* space */
345472fcea8cSEd Schouten case '\004': /* ^d, down */
345572fcea8cSEd Schouten case KEY_RIGHT:
345672fcea8cSEd Schouten case KEY_DOWN:
345772fcea8cSEd Schouten counter++;
345872fcea8cSEd Schouten if (counter > list_size)
345972fcea8cSEd Schouten counter = 1;
346072fcea8cSEd Schouten break;
346172fcea8cSEd Schouten case '\010': /* ^h, backspace*/
346272fcea8cSEd Schouten case '\025': /* ^u, up */
346372fcea8cSEd Schouten case 127: /* ^?, delete */
346472fcea8cSEd Schouten case KEY_BACKSPACE:
346572fcea8cSEd Schouten case KEY_LEFT:
346672fcea8cSEd Schouten case KEY_UP:
346772fcea8cSEd Schouten counter--;
346872fcea8cSEd Schouten if (counter == 0)
346972fcea8cSEd Schouten counter = list_size;
347072fcea8cSEd Schouten break;
347172fcea8cSEd Schouten case '\033': /* escape key */
347272fcea8cSEd Schouten if (menu_list[0].argument != MENU_WARN)
347372fcea8cSEd Schouten counter = 0;
347472fcea8cSEd Schouten break;
347572fcea8cSEd Schouten case '\014': /* ^l */
347672fcea8cSEd Schouten case '\022': /* ^r, redraw */
347772fcea8cSEd Schouten paint_menu(menu_list, max_width, max_height,
347872fcea8cSEd Schouten list_size, top_offset, temp_win,
347972fcea8cSEd Schouten off_start, vert_size);
348072fcea8cSEd Schouten break;
348172fcea8cSEd Schouten default:
348272fcea8cSEd Schouten break;
348372fcea8cSEd Schouten }
348472fcea8cSEd Schouten }
348572fcea8cSEd Schouten
348672fcea8cSEd Schouten if (((list_size - off_start) >= (vert_size - 1)) &&
348772fcea8cSEd Schouten (counter > (off_start + vert_size - 3)) &&
348872fcea8cSEd Schouten (off_start > 1))
348972fcea8cSEd Schouten {
349072fcea8cSEd Schouten if (counter == list_size)
349172fcea8cSEd Schouten off_start = (list_size - vert_size) + 2;
349272fcea8cSEd Schouten else
349372fcea8cSEd Schouten off_start++;
349472fcea8cSEd Schouten
349572fcea8cSEd Schouten paint_menu(menu_list, max_width, max_height,
349672fcea8cSEd Schouten list_size, top_offset, temp_win, off_start,
349772fcea8cSEd Schouten vert_size);
349872fcea8cSEd Schouten }
349972fcea8cSEd Schouten else if ((list_size != vert_size) &&
350072fcea8cSEd Schouten (counter > (off_start + vert_size - 2)))
350172fcea8cSEd Schouten {
350272fcea8cSEd Schouten if (counter == list_size)
350372fcea8cSEd Schouten off_start = 2 + (list_size - vert_size);
350472fcea8cSEd Schouten else if (off_start == 1)
350572fcea8cSEd Schouten off_start = 3;
350672fcea8cSEd Schouten else
350772fcea8cSEd Schouten off_start++;
350872fcea8cSEd Schouten
350972fcea8cSEd Schouten paint_menu(menu_list, max_width, max_height,
351072fcea8cSEd Schouten list_size, top_offset, temp_win, off_start,
351172fcea8cSEd Schouten vert_size);
351272fcea8cSEd Schouten }
351372fcea8cSEd Schouten else if (counter < off_start)
351472fcea8cSEd Schouten {
351572fcea8cSEd Schouten if (counter <= 2)
351672fcea8cSEd Schouten off_start = 1;
351772fcea8cSEd Schouten else
351872fcea8cSEd Schouten off_start = counter;
351972fcea8cSEd Schouten
352072fcea8cSEd Schouten paint_menu(menu_list, max_width, max_height,
352172fcea8cSEd Schouten list_size, top_offset, temp_win, off_start,
352272fcea8cSEd Schouten vert_size);
352372fcea8cSEd Schouten }
352472fcea8cSEd Schouten }
352572fcea8cSEd Schouten while ((input != '\r') && (input != '\n') && (counter != 0));
352672fcea8cSEd Schouten
352772fcea8cSEd Schouten werase(temp_win);
352872fcea8cSEd Schouten wrefresh(temp_win);
352972fcea8cSEd Schouten delwin(temp_win);
353072fcea8cSEd Schouten
353172fcea8cSEd Schouten if ((menu_list[counter].procedure != NULL) ||
353272fcea8cSEd Schouten (menu_list[counter].iprocedure != NULL) ||
353372fcea8cSEd Schouten (menu_list[counter].nprocedure != NULL))
353472fcea8cSEd Schouten {
353572fcea8cSEd Schouten if (menu_list[counter].argument != -1)
353672fcea8cSEd Schouten (*menu_list[counter].iprocedure)(menu_list[counter].argument);
353772fcea8cSEd Schouten else if (menu_list[counter].ptr_argument != NULL)
353872fcea8cSEd Schouten (*menu_list[counter].procedure)(menu_list[counter].ptr_argument);
353972fcea8cSEd Schouten else
354072fcea8cSEd Schouten (*menu_list[counter].nprocedure)();
354172fcea8cSEd Schouten }
354272fcea8cSEd Schouten
354372fcea8cSEd Schouten if (info_window)
354472fcea8cSEd Schouten paint_info_win();
354572fcea8cSEd Schouten redraw();
354672fcea8cSEd Schouten
354772fcea8cSEd Schouten return(counter);
354872fcea8cSEd Schouten }
354972fcea8cSEd Schouten
355072fcea8cSEd Schouten void
paint_menu(struct menu_entries menu_list[],int max_width,int max_height,int list_size,int top_offset,WINDOW * menu_win,int off_start,int vert_size)355191517e3bSJohn Baldwin paint_menu(struct menu_entries menu_list[], int max_width, int max_height,
355291517e3bSJohn Baldwin int list_size, int top_offset, WINDOW *menu_win, int off_start,
355391517e3bSJohn Baldwin int vert_size)
355472fcea8cSEd Schouten {
355572fcea8cSEd Schouten int counter, temp_int;
355672fcea8cSEd Schouten
355772fcea8cSEd Schouten werase(menu_win);
355872fcea8cSEd Schouten
355972fcea8cSEd Schouten /*
356072fcea8cSEd Schouten | output top and bottom portions of menu box only if window
356172fcea8cSEd Schouten | large enough
356272fcea8cSEd Schouten */
356372fcea8cSEd Schouten
356472fcea8cSEd Schouten if (max_height > vert_size)
356572fcea8cSEd Schouten {
356672fcea8cSEd Schouten wmove(menu_win, 1, 1);
356772fcea8cSEd Schouten if (!nohighlight)
356872fcea8cSEd Schouten wstandout(menu_win);
356972fcea8cSEd Schouten waddch(menu_win, '+');
357072fcea8cSEd Schouten for (counter = 0; counter < (max_width - 4); counter++)
357172fcea8cSEd Schouten waddch(menu_win, '-');
357272fcea8cSEd Schouten waddch(menu_win, '+');
357372fcea8cSEd Schouten
357472fcea8cSEd Schouten wmove(menu_win, (max_height - 2), 1);
357572fcea8cSEd Schouten waddch(menu_win, '+');
357672fcea8cSEd Schouten for (counter = 0; counter < (max_width - 4); counter++)
357772fcea8cSEd Schouten waddch(menu_win, '-');
357872fcea8cSEd Schouten waddch(menu_win, '+');
357972fcea8cSEd Schouten wstandend(menu_win);
358072fcea8cSEd Schouten wmove(menu_win, 2, 3);
358172fcea8cSEd Schouten waddstr(menu_win, menu_list[0].item_string);
358272fcea8cSEd Schouten wmove(menu_win, (max_height - 3), 3);
358372fcea8cSEd Schouten if (menu_list[0].argument != MENU_WARN)
358472fcea8cSEd Schouten waddstr(menu_win, menu_cancel_msg);
358572fcea8cSEd Schouten }
358672fcea8cSEd Schouten if (!nohighlight)
358772fcea8cSEd Schouten wstandout(menu_win);
358872fcea8cSEd Schouten
358972fcea8cSEd Schouten for (counter = 0; counter < (vert_size + top_offset); counter++)
359072fcea8cSEd Schouten {
359172fcea8cSEd Schouten if (top_offset == 4)
359272fcea8cSEd Schouten {
359372fcea8cSEd Schouten temp_int = counter + 2;
359472fcea8cSEd Schouten }
359572fcea8cSEd Schouten else
359672fcea8cSEd Schouten temp_int = counter;
359772fcea8cSEd Schouten
359872fcea8cSEd Schouten wmove(menu_win, temp_int, 1);
359972fcea8cSEd Schouten waddch(menu_win, '|');
360072fcea8cSEd Schouten wmove(menu_win, temp_int, (max_width - 2));
360172fcea8cSEd Schouten waddch(menu_win, '|');
360272fcea8cSEd Schouten }
360372fcea8cSEd Schouten wstandend(menu_win);
360472fcea8cSEd Schouten
360572fcea8cSEd Schouten if (list_size > vert_size)
360672fcea8cSEd Schouten {
360772fcea8cSEd Schouten if (off_start >= 3)
360872fcea8cSEd Schouten {
360972fcea8cSEd Schouten temp_int = 1;
361072fcea8cSEd Schouten wmove(menu_win, top_offset, 3);
361172fcea8cSEd Schouten waddstr(menu_win, more_above_str);
361272fcea8cSEd Schouten }
361372fcea8cSEd Schouten else
361472fcea8cSEd Schouten temp_int = 0;
361572fcea8cSEd Schouten
361672fcea8cSEd Schouten for (counter = off_start;
361772fcea8cSEd Schouten ((temp_int + counter - off_start) < (vert_size - 1));
361872fcea8cSEd Schouten counter++)
361972fcea8cSEd Schouten {
362072fcea8cSEd Schouten wmove(menu_win, (top_offset + temp_int +
362172fcea8cSEd Schouten (counter - off_start)), 3);
362272fcea8cSEd Schouten if (list_size > 1)
362372fcea8cSEd Schouten wprintw(menu_win, "%c) ", item_alpha[min((counter - 1), max_alpha_char)]);
362472fcea8cSEd Schouten waddstr(menu_win, menu_list[counter].item_string);
362572fcea8cSEd Schouten }
362672fcea8cSEd Schouten
362772fcea8cSEd Schouten wmove(menu_win, (top_offset + (vert_size - 1)), 3);
362872fcea8cSEd Schouten
362972fcea8cSEd Schouten if (counter == list_size)
363072fcea8cSEd Schouten {
363172fcea8cSEd Schouten if (list_size > 1)
363272fcea8cSEd Schouten wprintw(menu_win, "%c) ", item_alpha[min((counter - 1), max_alpha_char)]);
3633*0667538bSBaptiste Daroussin wprintw(menu_win, "%s", menu_list[counter].item_string);
363472fcea8cSEd Schouten }
363572fcea8cSEd Schouten else
3636*0667538bSBaptiste Daroussin wprintw(menu_win, "%s", more_below_str);
363772fcea8cSEd Schouten }
363872fcea8cSEd Schouten else
363972fcea8cSEd Schouten {
364072fcea8cSEd Schouten for (counter = 1; counter <= list_size; counter++)
364172fcea8cSEd Schouten {
364272fcea8cSEd Schouten wmove(menu_win, (top_offset + counter - 1), 3);
364372fcea8cSEd Schouten if (list_size > 1)
364472fcea8cSEd Schouten wprintw(menu_win, "%c) ", item_alpha[min((counter - 1), max_alpha_char)]);
364572fcea8cSEd Schouten waddstr(menu_win, menu_list[counter].item_string);
364672fcea8cSEd Schouten }
364772fcea8cSEd Schouten }
364872fcea8cSEd Schouten }
364972fcea8cSEd Schouten
365072fcea8cSEd Schouten void
help(void)365191517e3bSJohn Baldwin help(void)
365272fcea8cSEd Schouten {
365372fcea8cSEd Schouten int counter;
365472fcea8cSEd Schouten
365572fcea8cSEd Schouten werase(help_win);
365672fcea8cSEd Schouten clearok(help_win, TRUE);
365772fcea8cSEd Schouten for (counter = 0; counter < 22; counter++)
365872fcea8cSEd Schouten {
365972fcea8cSEd Schouten wmove(help_win, counter, 0);
366072fcea8cSEd Schouten waddstr(help_win, (emacs_keys_mode) ?
366172fcea8cSEd Schouten emacs_help_text[counter] : help_text[counter]);
366272fcea8cSEd Schouten }
366372fcea8cSEd Schouten wrefresh(help_win);
366472fcea8cSEd Schouten werase(com_win);
366572fcea8cSEd Schouten wmove(com_win, 0, 0);
3666*0667538bSBaptiste Daroussin wprintw(com_win, "%s", press_any_key_msg);
366772fcea8cSEd Schouten wrefresh(com_win);
366872fcea8cSEd Schouten counter = wgetch(com_win);
366996b676e9SEd Schouten if (counter == -1)
367096b676e9SEd Schouten exit(0);
367172fcea8cSEd Schouten werase(com_win);
367272fcea8cSEd Schouten wmove(com_win, 0, 0);
367372fcea8cSEd Schouten werase(help_win);
367472fcea8cSEd Schouten wrefresh(help_win);
367572fcea8cSEd Schouten wrefresh(com_win);
367672fcea8cSEd Schouten redraw();
367772fcea8cSEd Schouten }
367872fcea8cSEd Schouten
367972fcea8cSEd Schouten void
paint_info_win(void)368091517e3bSJohn Baldwin paint_info_win(void)
368172fcea8cSEd Schouten {
368272fcea8cSEd Schouten int counter;
368372fcea8cSEd Schouten
368472fcea8cSEd Schouten if (!info_window)
368572fcea8cSEd Schouten return;
368672fcea8cSEd Schouten
368772fcea8cSEd Schouten werase(info_win);
368872fcea8cSEd Schouten for (counter = 0; counter < 5; counter++)
368972fcea8cSEd Schouten {
369072fcea8cSEd Schouten wmove(info_win, counter, 0);
369172fcea8cSEd Schouten wclrtoeol(info_win);
369272fcea8cSEd Schouten if (info_type == CONTROL_KEYS)
369372fcea8cSEd Schouten waddstr(info_win, (emacs_keys_mode) ?
369472fcea8cSEd Schouten emacs_control_keys[counter] : control_keys[counter]);
369572fcea8cSEd Schouten else if (info_type == COMMANDS)
369672fcea8cSEd Schouten waddstr(info_win, command_strings[counter]);
369772fcea8cSEd Schouten }
369896b676e9SEd Schouten wmove(info_win, 5, 0);
369996b676e9SEd Schouten if (!nohighlight)
370096b676e9SEd Schouten wstandout(info_win);
370196b676e9SEd Schouten waddstr(info_win, separator);
370296b676e9SEd Schouten wstandend(info_win);
370372fcea8cSEd Schouten wrefresh(info_win);
370472fcea8cSEd Schouten }
370572fcea8cSEd Schouten
370672fcea8cSEd Schouten void
no_info_window(void)370791517e3bSJohn Baldwin no_info_window(void)
370872fcea8cSEd Schouten {
370972fcea8cSEd Schouten if (!info_window)
371072fcea8cSEd Schouten return;
371172fcea8cSEd Schouten delwin(info_win);
371272fcea8cSEd Schouten delwin(text_win);
371372fcea8cSEd Schouten info_window = FALSE;
371472fcea8cSEd Schouten last_line = LINES - 2;
371572fcea8cSEd Schouten text_win = newwin((LINES - 1), COLS, 0, 0);
371672fcea8cSEd Schouten keypad(text_win, TRUE);
371772fcea8cSEd Schouten idlok(text_win, TRUE);
371872fcea8cSEd Schouten clearok(text_win, TRUE);
371972fcea8cSEd Schouten midscreen(scr_vert, point);
372072fcea8cSEd Schouten wrefresh(text_win);
372172fcea8cSEd Schouten clear_com_win = TRUE;
372272fcea8cSEd Schouten }
372372fcea8cSEd Schouten
372472fcea8cSEd Schouten void
create_info_window(void)372591517e3bSJohn Baldwin create_info_window(void)
372672fcea8cSEd Schouten {
372772fcea8cSEd Schouten if (info_window)
372872fcea8cSEd Schouten return;
372972fcea8cSEd Schouten last_line = LINES - 8;
373072fcea8cSEd Schouten delwin(text_win);
373172fcea8cSEd Schouten text_win = newwin((LINES - 7), COLS, 6, 0);
373272fcea8cSEd Schouten keypad(text_win, TRUE);
373372fcea8cSEd Schouten idlok(text_win, TRUE);
373472fcea8cSEd Schouten werase(text_win);
373572fcea8cSEd Schouten info_window = TRUE;
373696b676e9SEd Schouten info_win = newwin(6, COLS, 0, 0);
373772fcea8cSEd Schouten werase(info_win);
373872fcea8cSEd Schouten info_type = CONTROL_KEYS;
373972fcea8cSEd Schouten midscreen(min(scr_vert, last_line), point);
374072fcea8cSEd Schouten clearok(info_win, TRUE);
374172fcea8cSEd Schouten paint_info_win();
374272fcea8cSEd Schouten wrefresh(text_win);
374372fcea8cSEd Schouten clear_com_win = TRUE;
374472fcea8cSEd Schouten }
374572fcea8cSEd Schouten
374672fcea8cSEd Schouten int
file_op(int arg)374791517e3bSJohn Baldwin file_op(int arg)
374872fcea8cSEd Schouten {
374972fcea8cSEd Schouten char *string;
375072fcea8cSEd Schouten int flag;
375172fcea8cSEd Schouten
375272fcea8cSEd Schouten if (restrict_mode())
375372fcea8cSEd Schouten {
375472fcea8cSEd Schouten return(0);
375572fcea8cSEd Schouten }
375672fcea8cSEd Schouten
375772fcea8cSEd Schouten if (arg == READ_FILE)
375872fcea8cSEd Schouten {
375972fcea8cSEd Schouten string = get_string(file_read_prompt_str, TRUE);
376072fcea8cSEd Schouten recv_file = TRUE;
376172fcea8cSEd Schouten tmp_file = resolve_name(string);
376272fcea8cSEd Schouten check_fp();
376372fcea8cSEd Schouten if (tmp_file != string)
376472fcea8cSEd Schouten free(tmp_file);
376572fcea8cSEd Schouten free(string);
376672fcea8cSEd Schouten }
376772fcea8cSEd Schouten else if (arg == WRITE_FILE)
376872fcea8cSEd Schouten {
376972fcea8cSEd Schouten string = get_string(file_write_prompt_str, TRUE);
377072fcea8cSEd Schouten tmp_file = resolve_name(string);
3771cfe04e82SEd Schouten write_file(tmp_file, 1);
377272fcea8cSEd Schouten if (tmp_file != string)
377372fcea8cSEd Schouten free(tmp_file);
377472fcea8cSEd Schouten free(string);
377572fcea8cSEd Schouten }
377672fcea8cSEd Schouten else if (arg == SAVE_FILE)
377772fcea8cSEd Schouten {
377872fcea8cSEd Schouten /*
377972fcea8cSEd Schouten | changes made here should be reflected in finish()
378072fcea8cSEd Schouten */
378172fcea8cSEd Schouten
378272fcea8cSEd Schouten if (in_file_name)
378372fcea8cSEd Schouten flag = TRUE;
378472fcea8cSEd Schouten else
378572fcea8cSEd Schouten flag = FALSE;
378672fcea8cSEd Schouten
378772fcea8cSEd Schouten string = in_file_name;
378896b676e9SEd Schouten if ((string == NULL) || (*string == '\0'))
378972fcea8cSEd Schouten string = get_string(save_file_name_prompt, TRUE);
379096b676e9SEd Schouten if ((string == NULL) || (*string == '\0'))
379172fcea8cSEd Schouten {
379272fcea8cSEd Schouten wmove(com_win, 0, 0);
3793*0667538bSBaptiste Daroussin wprintw(com_win, "%s", file_not_saved_msg);
379472fcea8cSEd Schouten wclrtoeol(com_win);
379572fcea8cSEd Schouten wrefresh(com_win);
379672fcea8cSEd Schouten clear_com_win = TRUE;
379772fcea8cSEd Schouten return(0);
379872fcea8cSEd Schouten }
379972fcea8cSEd Schouten if (!flag)
380072fcea8cSEd Schouten {
380172fcea8cSEd Schouten tmp_file = resolve_name(string);
380272fcea8cSEd Schouten if (tmp_file != string)
380372fcea8cSEd Schouten {
380472fcea8cSEd Schouten free(string);
380572fcea8cSEd Schouten string = tmp_file;
380672fcea8cSEd Schouten }
380772fcea8cSEd Schouten }
3808cfe04e82SEd Schouten if (write_file(string, 1))
380972fcea8cSEd Schouten {
381072fcea8cSEd Schouten in_file_name = string;
381172fcea8cSEd Schouten text_changes = FALSE;
381272fcea8cSEd Schouten }
381372fcea8cSEd Schouten else if (!flag)
381472fcea8cSEd Schouten free(string);
381572fcea8cSEd Schouten }
381672fcea8cSEd Schouten return(0);
381772fcea8cSEd Schouten }
381872fcea8cSEd Schouten
381972fcea8cSEd Schouten void
shell_op(void)382091517e3bSJohn Baldwin shell_op(void)
382172fcea8cSEd Schouten {
382272fcea8cSEd Schouten char *string;
382372fcea8cSEd Schouten
382472fcea8cSEd Schouten if (((string = get_string(shell_prompt, TRUE)) != NULL) &&
382596b676e9SEd Schouten (*string != '\0'))
382672fcea8cSEd Schouten {
382772fcea8cSEd Schouten sh_command(string);
382872fcea8cSEd Schouten free(string);
382972fcea8cSEd Schouten }
383072fcea8cSEd Schouten }
383172fcea8cSEd Schouten
383272fcea8cSEd Schouten void
leave_op(void)383391517e3bSJohn Baldwin leave_op(void)
383472fcea8cSEd Schouten {
383572fcea8cSEd Schouten if (text_changes)
383672fcea8cSEd Schouten {
383772fcea8cSEd Schouten menu_op(leave_menu);
383872fcea8cSEd Schouten }
383972fcea8cSEd Schouten else
384072fcea8cSEd Schouten quit(TRUE);
384172fcea8cSEd Schouten }
384272fcea8cSEd Schouten
384372fcea8cSEd Schouten void
redraw(void)384491517e3bSJohn Baldwin redraw(void)
384572fcea8cSEd Schouten {
384672fcea8cSEd Schouten if (info_window)
384772fcea8cSEd Schouten {
384872fcea8cSEd Schouten clearok(info_win, TRUE);
384972fcea8cSEd Schouten paint_info_win();
385072fcea8cSEd Schouten }
385172fcea8cSEd Schouten else
385272fcea8cSEd Schouten clearok(text_win, TRUE);
385372fcea8cSEd Schouten midscreen(scr_vert, point);
385472fcea8cSEd Schouten }
385572fcea8cSEd Schouten
385672fcea8cSEd Schouten /*
385772fcea8cSEd Schouten | The following routines will "format" a paragraph (as defined by a
385872fcea8cSEd Schouten | block of text with blank lines before and after the block).
385972fcea8cSEd Schouten */
386072fcea8cSEd Schouten
386191517e3bSJohn Baldwin /* test if line has any non-space characters */
386272fcea8cSEd Schouten int
Blank_Line(struct text * test_line)386391517e3bSJohn Baldwin Blank_Line(struct text *test_line)
386472fcea8cSEd Schouten {
386572fcea8cSEd Schouten unsigned char *line;
386672fcea8cSEd Schouten int length;
386772fcea8cSEd Schouten
386872fcea8cSEd Schouten if (test_line == NULL)
386972fcea8cSEd Schouten return(TRUE);
387072fcea8cSEd Schouten
387172fcea8cSEd Schouten length = 1;
387272fcea8cSEd Schouten line = test_line->line;
387372fcea8cSEd Schouten
387472fcea8cSEd Schouten /*
387572fcea8cSEd Schouten | To handle troff/nroff documents, consider a line with a
387672fcea8cSEd Schouten | period ('.') in the first column to be blank. To handle mail
387772fcea8cSEd Schouten | messages with included text, consider a line with a '>' blank.
387872fcea8cSEd Schouten */
387972fcea8cSEd Schouten
388072fcea8cSEd Schouten if ((*line == '.') || (*line == '>'))
388172fcea8cSEd Schouten return(TRUE);
388272fcea8cSEd Schouten
388372fcea8cSEd Schouten while (((*line == ' ') || (*line == '\t')) && (length < test_line->line_length))
388472fcea8cSEd Schouten {
388572fcea8cSEd Schouten length++;
388672fcea8cSEd Schouten line++;
388772fcea8cSEd Schouten }
388872fcea8cSEd Schouten if (length != test_line->line_length)
388972fcea8cSEd Schouten return(FALSE);
389072fcea8cSEd Schouten else
389172fcea8cSEd Schouten return(TRUE);
389272fcea8cSEd Schouten }
389372fcea8cSEd Schouten
389491517e3bSJohn Baldwin /* format the paragraph according to set margins */
389572fcea8cSEd Schouten void
Format(void)389691517e3bSJohn Baldwin Format(void)
389772fcea8cSEd Schouten {
389872fcea8cSEd Schouten int string_count;
389972fcea8cSEd Schouten int offset;
390072fcea8cSEd Schouten int temp_case;
390172fcea8cSEd Schouten int status;
390272fcea8cSEd Schouten int tmp_af;
390372fcea8cSEd Schouten int counter;
390472fcea8cSEd Schouten unsigned char *line;
390572fcea8cSEd Schouten unsigned char *tmp_srchstr;
390672fcea8cSEd Schouten unsigned char *temp1, *temp2;
390772fcea8cSEd Schouten unsigned char *temp_dword;
390872fcea8cSEd Schouten unsigned char temp_d_char[3];
390972fcea8cSEd Schouten
391072fcea8cSEd Schouten temp_d_char[0] = d_char[0];
391172fcea8cSEd Schouten temp_d_char[1] = d_char[1];
391272fcea8cSEd Schouten temp_d_char[2] = d_char[2];
391372fcea8cSEd Schouten
391472fcea8cSEd Schouten /*
391572fcea8cSEd Schouten | if observ_margins is not set, or the current line is blank,
391672fcea8cSEd Schouten | do not format the current paragraph
391772fcea8cSEd Schouten */
391872fcea8cSEd Schouten
391972fcea8cSEd Schouten if ((!observ_margins) || (Blank_Line(curr_line)))
392072fcea8cSEd Schouten return;
392172fcea8cSEd Schouten
392272fcea8cSEd Schouten /*
392372fcea8cSEd Schouten | save the currently set flags, and clear them
392472fcea8cSEd Schouten */
392572fcea8cSEd Schouten
392672fcea8cSEd Schouten wmove(com_win, 0, 0);
392772fcea8cSEd Schouten wclrtoeol(com_win);
3928*0667538bSBaptiste Daroussin wprintw(com_win, "%s", formatting_msg);
392972fcea8cSEd Schouten wrefresh(com_win);
393072fcea8cSEd Schouten
393172fcea8cSEd Schouten /*
393272fcea8cSEd Schouten | get current position in paragraph, so after formatting, the cursor
393372fcea8cSEd Schouten | will be in the same relative position
393472fcea8cSEd Schouten */
393572fcea8cSEd Schouten
393672fcea8cSEd Schouten tmp_af = auto_format;
393772fcea8cSEd Schouten auto_format = FALSE;
393872fcea8cSEd Schouten offset = position;
393972fcea8cSEd Schouten if (position != 1)
394072fcea8cSEd Schouten prev_word();
394172fcea8cSEd Schouten temp_dword = d_word;
394272fcea8cSEd Schouten d_word = NULL;
394372fcea8cSEd Schouten temp_case = case_sen;
394472fcea8cSEd Schouten case_sen = TRUE;
394572fcea8cSEd Schouten tmp_srchstr = srch_str;
394672fcea8cSEd Schouten temp2 = srch_str = (unsigned char *) malloc(1 + curr_line->line_length - position);
394772fcea8cSEd Schouten if ((*point == ' ') || (*point == '\t'))
394872fcea8cSEd Schouten adv_word();
394972fcea8cSEd Schouten offset -= position;
395072fcea8cSEd Schouten counter = position;
395172fcea8cSEd Schouten line = temp1 = point;
395296b676e9SEd Schouten while ((*temp1 != '\0') && (*temp1 != ' ') && (*temp1 != '\t') && (counter < curr_line->line_length))
395372fcea8cSEd Schouten {
395472fcea8cSEd Schouten *temp2 = *temp1;
395572fcea8cSEd Schouten temp2++;
395672fcea8cSEd Schouten temp1++;
395772fcea8cSEd Schouten counter++;
395872fcea8cSEd Schouten }
395996b676e9SEd Schouten *temp2 = '\0';
396072fcea8cSEd Schouten if (position != 1)
396172fcea8cSEd Schouten bol();
396272fcea8cSEd Schouten while (!Blank_Line(curr_line->prev_line))
396372fcea8cSEd Schouten bol();
396472fcea8cSEd Schouten string_count = 0;
396572fcea8cSEd Schouten status = TRUE;
396672fcea8cSEd Schouten while ((line != point) && (status))
396772fcea8cSEd Schouten {
396872fcea8cSEd Schouten status = search(FALSE);
396972fcea8cSEd Schouten string_count++;
397072fcea8cSEd Schouten }
397172fcea8cSEd Schouten
397272fcea8cSEd Schouten wmove(com_win, 0, 0);
397372fcea8cSEd Schouten wclrtoeol(com_win);
3974*0667538bSBaptiste Daroussin wprintw(com_win, "%s", formatting_msg);
397572fcea8cSEd Schouten wrefresh(com_win);
397672fcea8cSEd Schouten
397772fcea8cSEd Schouten /*
397872fcea8cSEd Schouten | now get back to the start of the paragraph to start formatting
397972fcea8cSEd Schouten */
398072fcea8cSEd Schouten
398172fcea8cSEd Schouten if (position != 1)
398272fcea8cSEd Schouten bol();
398372fcea8cSEd Schouten while (!Blank_Line(curr_line->prev_line))
398472fcea8cSEd Schouten bol();
398572fcea8cSEd Schouten
398672fcea8cSEd Schouten observ_margins = FALSE;
398772fcea8cSEd Schouten
398872fcea8cSEd Schouten /*
398972fcea8cSEd Schouten | Start going through lines, putting spaces at end of lines if they do
399072fcea8cSEd Schouten | not already exist. Append lines together to get one long line, and
399172fcea8cSEd Schouten | eliminate spacing at begin of lines.
399272fcea8cSEd Schouten */
399372fcea8cSEd Schouten
399472fcea8cSEd Schouten while (!Blank_Line(curr_line->next_line))
399572fcea8cSEd Schouten {
399672fcea8cSEd Schouten eol();
399772fcea8cSEd Schouten left(TRUE);
399872fcea8cSEd Schouten if (*point != ' ')
399972fcea8cSEd Schouten {
400072fcea8cSEd Schouten right(TRUE);
400172fcea8cSEd Schouten insert(' ');
400272fcea8cSEd Schouten }
400372fcea8cSEd Schouten else
400472fcea8cSEd Schouten right(TRUE);
400572fcea8cSEd Schouten del_char();
400672fcea8cSEd Schouten if ((*point == ' ') || (*point == '\t'))
400772fcea8cSEd Schouten del_word();
400872fcea8cSEd Schouten }
400972fcea8cSEd Schouten
401072fcea8cSEd Schouten /*
401172fcea8cSEd Schouten | Now there is one long line. Eliminate extra spaces within the line
401272fcea8cSEd Schouten | after the first word (so as not to blow away any indenting the user
401372fcea8cSEd Schouten | may have put in).
401472fcea8cSEd Schouten */
401572fcea8cSEd Schouten
401672fcea8cSEd Schouten bol();
401772fcea8cSEd Schouten adv_word();
401872fcea8cSEd Schouten while (position < curr_line->line_length)
401972fcea8cSEd Schouten {
402072fcea8cSEd Schouten if ((*point == ' ') && (*(point + 1) == ' '))
402172fcea8cSEd Schouten del_char();
402272fcea8cSEd Schouten else
402372fcea8cSEd Schouten right(TRUE);
402472fcea8cSEd Schouten }
402572fcea8cSEd Schouten
402672fcea8cSEd Schouten /*
402772fcea8cSEd Schouten | Now make sure there are two spaces after a '.'.
402872fcea8cSEd Schouten */
402972fcea8cSEd Schouten
403072fcea8cSEd Schouten bol();
403172fcea8cSEd Schouten while (position < curr_line->line_length)
403272fcea8cSEd Schouten {
403372fcea8cSEd Schouten if ((*point == '.') && (*(point + 1) == ' '))
403472fcea8cSEd Schouten {
403572fcea8cSEd Schouten right(TRUE);
403672fcea8cSEd Schouten insert(' ');
403772fcea8cSEd Schouten insert(' ');
403872fcea8cSEd Schouten while (*point == ' ')
403972fcea8cSEd Schouten del_char();
404072fcea8cSEd Schouten }
404172fcea8cSEd Schouten right(TRUE);
404272fcea8cSEd Schouten }
404372fcea8cSEd Schouten
404472fcea8cSEd Schouten observ_margins = TRUE;
404572fcea8cSEd Schouten bol();
404672fcea8cSEd Schouten
404772fcea8cSEd Schouten wmove(com_win, 0, 0);
404872fcea8cSEd Schouten wclrtoeol(com_win);
4049*0667538bSBaptiste Daroussin wprintw(com_win, "%s", formatting_msg);
405072fcea8cSEd Schouten wrefresh(com_win);
405172fcea8cSEd Schouten
405272fcea8cSEd Schouten /*
405372fcea8cSEd Schouten | create lines between margins
405472fcea8cSEd Schouten */
405572fcea8cSEd Schouten
405672fcea8cSEd Schouten while (position < curr_line->line_length)
405772fcea8cSEd Schouten {
405872fcea8cSEd Schouten while ((scr_pos < right_margin) && (position < curr_line->line_length))
405972fcea8cSEd Schouten right(TRUE);
406072fcea8cSEd Schouten if (position < curr_line->line_length)
406172fcea8cSEd Schouten {
406272fcea8cSEd Schouten prev_word();
406372fcea8cSEd Schouten if (position == 1)
406472fcea8cSEd Schouten adv_word();
406572fcea8cSEd Schouten insert_line(TRUE);
406672fcea8cSEd Schouten }
406772fcea8cSEd Schouten }
406872fcea8cSEd Schouten
406972fcea8cSEd Schouten /*
407072fcea8cSEd Schouten | go back to begin of paragraph, put cursor back to original position
407172fcea8cSEd Schouten */
407272fcea8cSEd Schouten
407372fcea8cSEd Schouten bol();
407472fcea8cSEd Schouten while (!Blank_Line(curr_line->prev_line))
407572fcea8cSEd Schouten bol();
407672fcea8cSEd Schouten
407772fcea8cSEd Schouten /*
407872fcea8cSEd Schouten | find word cursor was in
407972fcea8cSEd Schouten */
408072fcea8cSEd Schouten
408172fcea8cSEd Schouten while ((status) && (string_count > 0))
408272fcea8cSEd Schouten {
408372fcea8cSEd Schouten search(FALSE);
408472fcea8cSEd Schouten string_count--;
408572fcea8cSEd Schouten }
408672fcea8cSEd Schouten
408772fcea8cSEd Schouten /*
408872fcea8cSEd Schouten | offset the cursor to where it was before from the start of the word
408972fcea8cSEd Schouten */
409072fcea8cSEd Schouten
409172fcea8cSEd Schouten while (offset > 0)
409272fcea8cSEd Schouten {
409372fcea8cSEd Schouten offset--;
409472fcea8cSEd Schouten right(TRUE);
409572fcea8cSEd Schouten }
409672fcea8cSEd Schouten
409772fcea8cSEd Schouten /*
409872fcea8cSEd Schouten | reset flags and strings to what they were before formatting
409972fcea8cSEd Schouten */
410072fcea8cSEd Schouten
410172fcea8cSEd Schouten if (d_word != NULL)
410272fcea8cSEd Schouten free(d_word);
410372fcea8cSEd Schouten d_word = temp_dword;
410472fcea8cSEd Schouten case_sen = temp_case;
410572fcea8cSEd Schouten free(srch_str);
410672fcea8cSEd Schouten srch_str = tmp_srchstr;
410772fcea8cSEd Schouten d_char[0] = temp_d_char[0];
410872fcea8cSEd Schouten d_char[1] = temp_d_char[1];
410972fcea8cSEd Schouten d_char[2] = temp_d_char[2];
411072fcea8cSEd Schouten auto_format = tmp_af;
411172fcea8cSEd Schouten
411272fcea8cSEd Schouten midscreen(scr_vert, point);
411372fcea8cSEd Schouten werase(com_win);
411472fcea8cSEd Schouten wrefresh(com_win);
411572fcea8cSEd Schouten }
411672fcea8cSEd Schouten
411772fcea8cSEd Schouten unsigned char *init_name[3] = {
4118cfe04e82SEd Schouten "/usr/share/misc/init.ee",
411972fcea8cSEd Schouten NULL,
412072fcea8cSEd Schouten ".init.ee"
412172fcea8cSEd Schouten };
412272fcea8cSEd Schouten
412391517e3bSJohn Baldwin /* check for init file and read it if it exists */
412472fcea8cSEd Schouten void
ee_init(void)412591517e3bSJohn Baldwin ee_init(void)
412672fcea8cSEd Schouten {
412772fcea8cSEd Schouten FILE *init_file;
412872fcea8cSEd Schouten unsigned char *string;
412972fcea8cSEd Schouten unsigned char *str1;
413072fcea8cSEd Schouten unsigned char *str2;
413172fcea8cSEd Schouten char *home;
413272fcea8cSEd Schouten int counter;
413372fcea8cSEd Schouten int temp_int;
413472fcea8cSEd Schouten
413572fcea8cSEd Schouten string = getenv("HOME");
413696b676e9SEd Schouten if (string == NULL)
413796b676e9SEd Schouten string = "/tmp";
413872fcea8cSEd Schouten str1 = home = malloc(strlen(string)+10);
413972fcea8cSEd Schouten strcpy(home, string);
414072fcea8cSEd Schouten strcat(home, "/.init.ee");
414172fcea8cSEd Schouten init_name[1] = home;
414272fcea8cSEd Schouten string = malloc(512);
414372fcea8cSEd Schouten
414472fcea8cSEd Schouten for (counter = 0; counter < 3; counter++)
414572fcea8cSEd Schouten {
414672fcea8cSEd Schouten if (!(access(init_name[counter], 4)))
414772fcea8cSEd Schouten {
414872fcea8cSEd Schouten init_file = fopen(init_name[counter], "r");
414972fcea8cSEd Schouten while ((str2 = fgets(string, 512, init_file)) != NULL)
415072fcea8cSEd Schouten {
415172fcea8cSEd Schouten str1 = str2 = string;
415272fcea8cSEd Schouten while (*str2 != '\n')
415372fcea8cSEd Schouten str2++;
415496b676e9SEd Schouten *str2 = '\0';
415572fcea8cSEd Schouten
415672fcea8cSEd Schouten if (unique_test(string, init_strings) != 1)
415772fcea8cSEd Schouten continue;
415872fcea8cSEd Schouten
415972fcea8cSEd Schouten if (compare(str1, CASE, FALSE))
416072fcea8cSEd Schouten case_sen = TRUE;
416172fcea8cSEd Schouten else if (compare(str1, NOCASE, FALSE))
416272fcea8cSEd Schouten case_sen = FALSE;
416372fcea8cSEd Schouten else if (compare(str1, EXPAND, FALSE))
416472fcea8cSEd Schouten expand_tabs = TRUE;
416572fcea8cSEd Schouten else if (compare(str1, NOEXPAND, FALSE))
416672fcea8cSEd Schouten expand_tabs = FALSE;
416772fcea8cSEd Schouten else if (compare(str1, INFO, FALSE))
416872fcea8cSEd Schouten info_window = TRUE;
416972fcea8cSEd Schouten else if (compare(str1, NOINFO, FALSE))
417072fcea8cSEd Schouten info_window = FALSE;
417172fcea8cSEd Schouten else if (compare(str1, MARGINS, FALSE))
417272fcea8cSEd Schouten observ_margins = TRUE;
417372fcea8cSEd Schouten else if (compare(str1, NOMARGINS, FALSE))
417472fcea8cSEd Schouten observ_margins = FALSE;
417572fcea8cSEd Schouten else if (compare(str1, AUTOFORMAT, FALSE))
417672fcea8cSEd Schouten {
417772fcea8cSEd Schouten auto_format = TRUE;
417872fcea8cSEd Schouten observ_margins = TRUE;
417972fcea8cSEd Schouten }
418072fcea8cSEd Schouten else if (compare(str1, NOAUTOFORMAT, FALSE))
418172fcea8cSEd Schouten auto_format = FALSE;
418272fcea8cSEd Schouten else if (compare(str1, Echo, FALSE))
418372fcea8cSEd Schouten {
418472fcea8cSEd Schouten str1 = next_word(str1);
418596b676e9SEd Schouten if (*str1 != '\0')
418672fcea8cSEd Schouten echo_string(str1);
418772fcea8cSEd Schouten }
418872fcea8cSEd Schouten else if (compare(str1, PRINTCOMMAND, FALSE))
418972fcea8cSEd Schouten {
419072fcea8cSEd Schouten str1 = next_word(str1);
419172fcea8cSEd Schouten print_command = malloc(strlen(str1)+1);
419272fcea8cSEd Schouten strcpy(print_command, str1);
419372fcea8cSEd Schouten }
419472fcea8cSEd Schouten else if (compare(str1, RIGHTMARGIN, FALSE))
419572fcea8cSEd Schouten {
419672fcea8cSEd Schouten str1 = next_word(str1);
419772fcea8cSEd Schouten if ((*str1 >= '0') && (*str1 <= '9'))
419872fcea8cSEd Schouten {
419972fcea8cSEd Schouten temp_int = atoi(str1);
420072fcea8cSEd Schouten if (temp_int > 0)
420172fcea8cSEd Schouten right_margin = temp_int;
420272fcea8cSEd Schouten }
420372fcea8cSEd Schouten }
420472fcea8cSEd Schouten else if (compare(str1, HIGHLIGHT, FALSE))
420572fcea8cSEd Schouten nohighlight = FALSE;
420672fcea8cSEd Schouten else if (compare(str1, NOHIGHLIGHT, FALSE))
420772fcea8cSEd Schouten nohighlight = TRUE;
420872fcea8cSEd Schouten else if (compare(str1, EIGHTBIT, FALSE))
420972fcea8cSEd Schouten eightbit = TRUE;
421072fcea8cSEd Schouten else if (compare(str1, NOEIGHTBIT, FALSE))
421172fcea8cSEd Schouten {
421272fcea8cSEd Schouten eightbit = FALSE;
421372fcea8cSEd Schouten ee_chinese = FALSE;
421472fcea8cSEd Schouten }
421572fcea8cSEd Schouten else if (compare(str1, EMACS_string, FALSE))
421672fcea8cSEd Schouten emacs_keys_mode = TRUE;
421772fcea8cSEd Schouten else if (compare(str1, NOEMACS_string, FALSE))
421872fcea8cSEd Schouten emacs_keys_mode = FALSE;
421972fcea8cSEd Schouten else if (compare(str1, chinese_cmd, FALSE))
422072fcea8cSEd Schouten {
422172fcea8cSEd Schouten ee_chinese = TRUE;
422272fcea8cSEd Schouten eightbit = TRUE;
422372fcea8cSEd Schouten }
422472fcea8cSEd Schouten else if (compare(str1, nochinese_cmd, FALSE))
422572fcea8cSEd Schouten ee_chinese = FALSE;
422672fcea8cSEd Schouten }
422772fcea8cSEd Schouten fclose(init_file);
422872fcea8cSEd Schouten }
422972fcea8cSEd Schouten }
423072fcea8cSEd Schouten free(string);
423172fcea8cSEd Schouten free(home);
423272fcea8cSEd Schouten
423372fcea8cSEd Schouten string = getenv("LANG");
423472fcea8cSEd Schouten if (string != NULL)
423572fcea8cSEd Schouten {
423672fcea8cSEd Schouten if (strcmp(string, "zh_TW.big5") == 0)
423772fcea8cSEd Schouten {
423872fcea8cSEd Schouten ee_chinese = TRUE;
423972fcea8cSEd Schouten eightbit = TRUE;
424072fcea8cSEd Schouten }
424172fcea8cSEd Schouten }
424272fcea8cSEd Schouten }
424372fcea8cSEd Schouten
424472fcea8cSEd Schouten /*
424572fcea8cSEd Schouten | Save current configuration to .init.ee file in the current directory.
424672fcea8cSEd Schouten */
424772fcea8cSEd Schouten
424872fcea8cSEd Schouten void
dump_ee_conf(void)424991517e3bSJohn Baldwin dump_ee_conf(void)
425072fcea8cSEd Schouten {
425172fcea8cSEd Schouten FILE *init_file;
425272fcea8cSEd Schouten FILE *old_init_file = NULL;
425372fcea8cSEd Schouten char *file_name = ".init.ee";
425472fcea8cSEd Schouten char *home_dir = "~/.init.ee";
425572fcea8cSEd Schouten char buffer[512];
425672fcea8cSEd Schouten struct stat buf;
425772fcea8cSEd Schouten char *string;
425872fcea8cSEd Schouten int length;
425972fcea8cSEd Schouten int option = 0;
426072fcea8cSEd Schouten
426172fcea8cSEd Schouten if (restrict_mode())
426272fcea8cSEd Schouten {
426372fcea8cSEd Schouten return;
426472fcea8cSEd Schouten }
426572fcea8cSEd Schouten
426672fcea8cSEd Schouten option = menu_op(config_dump_menu);
426772fcea8cSEd Schouten
426872fcea8cSEd Schouten werase(com_win);
426972fcea8cSEd Schouten wmove(com_win, 0, 0);
427072fcea8cSEd Schouten
427172fcea8cSEd Schouten if (option == 0)
427272fcea8cSEd Schouten {
4273*0667538bSBaptiste Daroussin wprintw(com_win, "%s", conf_not_saved_msg);
427472fcea8cSEd Schouten wrefresh(com_win);
427572fcea8cSEd Schouten return;
427672fcea8cSEd Schouten }
427772fcea8cSEd Schouten else if (option == 2)
427872fcea8cSEd Schouten file_name = resolve_name(home_dir);
427972fcea8cSEd Schouten
428072fcea8cSEd Schouten /*
428172fcea8cSEd Schouten | If a .init.ee file exists, move it to .init.ee.old.
428272fcea8cSEd Schouten */
428372fcea8cSEd Schouten
428472fcea8cSEd Schouten if (stat(file_name, &buf) != -1)
428572fcea8cSEd Schouten {
428672fcea8cSEd Schouten sprintf(buffer, "%s.old", file_name);
428772fcea8cSEd Schouten unlink(buffer);
428872fcea8cSEd Schouten link(file_name, buffer);
428972fcea8cSEd Schouten unlink(file_name);
429072fcea8cSEd Schouten old_init_file = fopen(buffer, "r");
429172fcea8cSEd Schouten }
429272fcea8cSEd Schouten
429372fcea8cSEd Schouten init_file = fopen(file_name, "w");
429472fcea8cSEd Schouten if (init_file == NULL)
429572fcea8cSEd Schouten {
4296*0667538bSBaptiste Daroussin wprintw(com_win, "%s", conf_dump_err_msg);
429772fcea8cSEd Schouten wrefresh(com_win);
429872fcea8cSEd Schouten return;
429972fcea8cSEd Schouten }
430072fcea8cSEd Schouten
430172fcea8cSEd Schouten if (old_init_file != NULL)
430272fcea8cSEd Schouten {
430372fcea8cSEd Schouten /*
430472fcea8cSEd Schouten | Copy non-configuration info into new .init.ee file.
430572fcea8cSEd Schouten */
430672fcea8cSEd Schouten while ((string = fgets(buffer, 512, old_init_file)) != NULL)
430772fcea8cSEd Schouten {
430872fcea8cSEd Schouten length = strlen(string);
430996b676e9SEd Schouten string[length - 1] = '\0';
431072fcea8cSEd Schouten
431172fcea8cSEd Schouten if (unique_test(string, init_strings) == 1)
431272fcea8cSEd Schouten {
431372fcea8cSEd Schouten if (compare(string, Echo, FALSE))
431472fcea8cSEd Schouten {
431572fcea8cSEd Schouten fprintf(init_file, "%s\n", string);
431672fcea8cSEd Schouten }
431772fcea8cSEd Schouten }
431872fcea8cSEd Schouten else
431972fcea8cSEd Schouten fprintf(init_file, "%s\n", string);
432072fcea8cSEd Schouten }
432172fcea8cSEd Schouten
432272fcea8cSEd Schouten fclose(old_init_file);
432372fcea8cSEd Schouten }
432472fcea8cSEd Schouten
432572fcea8cSEd Schouten fprintf(init_file, "%s\n", case_sen ? CASE : NOCASE);
432672fcea8cSEd Schouten fprintf(init_file, "%s\n", expand_tabs ? EXPAND : NOEXPAND);
432772fcea8cSEd Schouten fprintf(init_file, "%s\n", info_window ? INFO : NOINFO );
432872fcea8cSEd Schouten fprintf(init_file, "%s\n", observ_margins ? MARGINS : NOMARGINS );
432972fcea8cSEd Schouten fprintf(init_file, "%s\n", auto_format ? AUTOFORMAT : NOAUTOFORMAT );
433072fcea8cSEd Schouten fprintf(init_file, "%s %s\n", PRINTCOMMAND, print_command);
433172fcea8cSEd Schouten fprintf(init_file, "%s %d\n", RIGHTMARGIN, right_margin);
433272fcea8cSEd Schouten fprintf(init_file, "%s\n", nohighlight ? NOHIGHLIGHT : HIGHLIGHT );
433372fcea8cSEd Schouten fprintf(init_file, "%s\n", eightbit ? EIGHTBIT : NOEIGHTBIT );
433472fcea8cSEd Schouten fprintf(init_file, "%s\n", emacs_keys_mode ? EMACS_string : NOEMACS_string );
433572fcea8cSEd Schouten fprintf(init_file, "%s\n", ee_chinese ? chinese_cmd : nochinese_cmd );
433672fcea8cSEd Schouten
433772fcea8cSEd Schouten fclose(init_file);
433872fcea8cSEd Schouten
433972fcea8cSEd Schouten wprintw(com_win, conf_dump_success_msg, file_name);
434072fcea8cSEd Schouten wrefresh(com_win);
434172fcea8cSEd Schouten
434272fcea8cSEd Schouten if ((option == 2) && (file_name != home_dir))
434372fcea8cSEd Schouten {
434472fcea8cSEd Schouten free(file_name);
434572fcea8cSEd Schouten }
434672fcea8cSEd Schouten }
434772fcea8cSEd Schouten
434891517e3bSJohn Baldwin /* echo the given string */
434972fcea8cSEd Schouten void
echo_string(char * string)435091517e3bSJohn Baldwin echo_string(char *string)
435172fcea8cSEd Schouten {
435272fcea8cSEd Schouten char *temp;
435372fcea8cSEd Schouten int Counter;
435472fcea8cSEd Schouten
435572fcea8cSEd Schouten temp = string;
435696b676e9SEd Schouten while (*temp != '\0')
435772fcea8cSEd Schouten {
435872fcea8cSEd Schouten if (*temp == '\\')
435972fcea8cSEd Schouten {
436072fcea8cSEd Schouten temp++;
436172fcea8cSEd Schouten if (*temp == 'n')
436272fcea8cSEd Schouten putchar('\n');
436372fcea8cSEd Schouten else if (*temp == 't')
436472fcea8cSEd Schouten putchar('\t');
436572fcea8cSEd Schouten else if (*temp == 'b')
436672fcea8cSEd Schouten putchar('\b');
436772fcea8cSEd Schouten else if (*temp == 'r')
436872fcea8cSEd Schouten putchar('\r');
436972fcea8cSEd Schouten else if (*temp == 'f')
437072fcea8cSEd Schouten putchar('\f');
437172fcea8cSEd Schouten else if ((*temp == 'e') || (*temp == 'E'))
437272fcea8cSEd Schouten putchar('\033'); /* escape */
437372fcea8cSEd Schouten else if (*temp == '\\')
437472fcea8cSEd Schouten putchar('\\');
437572fcea8cSEd Schouten else if (*temp == '\'')
437672fcea8cSEd Schouten putchar('\'');
437772fcea8cSEd Schouten else if ((*temp >= '0') && (*temp <= '9'))
437872fcea8cSEd Schouten {
437972fcea8cSEd Schouten Counter = 0;
438072fcea8cSEd Schouten while ((*temp >= '0') && (*temp <= '9'))
438172fcea8cSEd Schouten {
438272fcea8cSEd Schouten Counter = (8 * Counter) + (*temp - '0');
438372fcea8cSEd Schouten temp++;
438472fcea8cSEd Schouten }
438572fcea8cSEd Schouten putchar(Counter);
438672fcea8cSEd Schouten temp--;
438772fcea8cSEd Schouten }
438872fcea8cSEd Schouten temp++;
438972fcea8cSEd Schouten }
439072fcea8cSEd Schouten else
439172fcea8cSEd Schouten {
439272fcea8cSEd Schouten putchar(*temp);
439372fcea8cSEd Schouten temp++;
439472fcea8cSEd Schouten }
439572fcea8cSEd Schouten }
439672fcea8cSEd Schouten
439772fcea8cSEd Schouten fflush(stdout);
439872fcea8cSEd Schouten }
439972fcea8cSEd Schouten
440091517e3bSJohn Baldwin /* check spelling of words in the editor */
440172fcea8cSEd Schouten void
spell_op(void)440291517e3bSJohn Baldwin spell_op(void)
440372fcea8cSEd Schouten {
440472fcea8cSEd Schouten if (restrict_mode())
440572fcea8cSEd Schouten {
440672fcea8cSEd Schouten return;
440772fcea8cSEd Schouten }
440872fcea8cSEd Schouten top(); /* go to top of file */
440972fcea8cSEd Schouten insert_line(FALSE); /* create two blank lines */
441072fcea8cSEd Schouten insert_line(FALSE);
441172fcea8cSEd Schouten top();
441272fcea8cSEd Schouten command(shell_echo_msg);
441372fcea8cSEd Schouten adv_line();
441472fcea8cSEd Schouten wmove(com_win, 0, 0);
4415*0667538bSBaptiste Daroussin wprintw(com_win, "%s", spell_in_prog_msg);
441672fcea8cSEd Schouten wrefresh(com_win);
441772fcea8cSEd Schouten command("<>!spell"); /* send contents of buffer to command 'spell'
441872fcea8cSEd Schouten and read the results back into the editor */
441972fcea8cSEd Schouten }
442072fcea8cSEd Schouten
442172fcea8cSEd Schouten void
ispell_op(void)442291517e3bSJohn Baldwin ispell_op(void)
442372fcea8cSEd Schouten {
4424cfe04e82SEd Schouten char template[128], *name;
442572fcea8cSEd Schouten char string[256];
4426cfe04e82SEd Schouten int fd;
442772fcea8cSEd Schouten
442872fcea8cSEd Schouten if (restrict_mode())
442972fcea8cSEd Schouten {
443072fcea8cSEd Schouten return;
443172fcea8cSEd Schouten }
4432cfe04e82SEd Schouten (void)sprintf(template, "/tmp/ee.XXXXXXXX");
443396b676e9SEd Schouten fd = mkstemp(template);
443425a33bfeSJessica Clarke name = template;
4435cfe04e82SEd Schouten if (fd < 0) {
4436cfe04e82SEd Schouten wmove(com_win, 0, 0);
4437cfe04e82SEd Schouten wprintw(com_win, create_file_fail_msg, name);
4438cfe04e82SEd Schouten wrefresh(com_win);
4439cfe04e82SEd Schouten return;
4440cfe04e82SEd Schouten }
4441cfe04e82SEd Schouten close(fd);
4442cfe04e82SEd Schouten if (write_file(name, 0))
444372fcea8cSEd Schouten {
444472fcea8cSEd Schouten sprintf(string, "ispell %s", name);
444572fcea8cSEd Schouten sh_command(string);
444672fcea8cSEd Schouten delete_text();
444772fcea8cSEd Schouten tmp_file = name;
444872fcea8cSEd Schouten recv_file = TRUE;
444972fcea8cSEd Schouten check_fp();
445072fcea8cSEd Schouten unlink(name);
445172fcea8cSEd Schouten }
445272fcea8cSEd Schouten }
445372fcea8cSEd Schouten
445472fcea8cSEd Schouten int
first_word_len(struct text * test_line)445591517e3bSJohn Baldwin first_word_len(struct text *test_line)
445672fcea8cSEd Schouten {
445772fcea8cSEd Schouten int counter;
445872fcea8cSEd Schouten unsigned char *pnt;
445972fcea8cSEd Schouten
446072fcea8cSEd Schouten if (test_line == NULL)
446172fcea8cSEd Schouten return(0);
446272fcea8cSEd Schouten
446372fcea8cSEd Schouten pnt = test_line->line;
446496b676e9SEd Schouten if ((pnt == NULL) || (*pnt == '\0') ||
446572fcea8cSEd Schouten (*pnt == '.') || (*pnt == '>'))
446672fcea8cSEd Schouten return(0);
446772fcea8cSEd Schouten
446872fcea8cSEd Schouten if ((*pnt == ' ') || (*pnt == '\t'))
446972fcea8cSEd Schouten {
447072fcea8cSEd Schouten pnt = next_word(pnt);
447172fcea8cSEd Schouten }
447272fcea8cSEd Schouten
447396b676e9SEd Schouten if (*pnt == '\0')
447472fcea8cSEd Schouten return(0);
447572fcea8cSEd Schouten
447672fcea8cSEd Schouten counter = 0;
447796b676e9SEd Schouten while ((*pnt != '\0') && ((*pnt != ' ') && (*pnt != '\t')))
447872fcea8cSEd Schouten {
447972fcea8cSEd Schouten pnt++;
448072fcea8cSEd Schouten counter++;
448172fcea8cSEd Schouten }
448296b676e9SEd Schouten while ((*pnt != '\0') && ((*pnt == ' ') || (*pnt == '\t')))
448372fcea8cSEd Schouten {
448472fcea8cSEd Schouten pnt++;
448572fcea8cSEd Schouten counter++;
448672fcea8cSEd Schouten }
448772fcea8cSEd Schouten return(counter);
448872fcea8cSEd Schouten }
448972fcea8cSEd Schouten
449091517e3bSJohn Baldwin /* format the paragraph according to set margins */
449172fcea8cSEd Schouten void
Auto_Format(void)449291517e3bSJohn Baldwin Auto_Format(void)
449372fcea8cSEd Schouten {
449472fcea8cSEd Schouten int string_count;
449572fcea8cSEd Schouten int offset;
449672fcea8cSEd Schouten int temp_case;
449772fcea8cSEd Schouten int word_len;
449872fcea8cSEd Schouten int temp_dwl;
449972fcea8cSEd Schouten int tmp_d_line_length;
450072fcea8cSEd Schouten int leave_loop = FALSE;
450172fcea8cSEd Schouten int status;
450272fcea8cSEd Schouten int counter;
450372fcea8cSEd Schouten char not_blank;
450472fcea8cSEd Schouten unsigned char *line;
450572fcea8cSEd Schouten unsigned char *tmp_srchstr;
450672fcea8cSEd Schouten unsigned char *temp1, *temp2;
450772fcea8cSEd Schouten unsigned char *temp_dword;
450872fcea8cSEd Schouten unsigned char temp_d_char[3];
450972fcea8cSEd Schouten unsigned char *tmp_d_line;
451072fcea8cSEd Schouten
451172fcea8cSEd Schouten
451272fcea8cSEd Schouten temp_d_char[0] = d_char[0];
451372fcea8cSEd Schouten temp_d_char[1] = d_char[1];
451472fcea8cSEd Schouten temp_d_char[2] = d_char[2];
451572fcea8cSEd Schouten
451672fcea8cSEd Schouten /*
451772fcea8cSEd Schouten | if observ_margins is not set, or the current line is blank,
451872fcea8cSEd Schouten | do not format the current paragraph
451972fcea8cSEd Schouten */
452072fcea8cSEd Schouten
452172fcea8cSEd Schouten if ((!observ_margins) || (Blank_Line(curr_line)))
452272fcea8cSEd Schouten return;
452372fcea8cSEd Schouten
452472fcea8cSEd Schouten /*
452572fcea8cSEd Schouten | get current position in paragraph, so after formatting, the cursor
452672fcea8cSEd Schouten | will be in the same relative position
452772fcea8cSEd Schouten */
452872fcea8cSEd Schouten
452972fcea8cSEd Schouten tmp_d_line = d_line;
453072fcea8cSEd Schouten tmp_d_line_length = dlt_line->line_length;
453172fcea8cSEd Schouten d_line = NULL;
453272fcea8cSEd Schouten auto_format = FALSE;
453372fcea8cSEd Schouten offset = position;
453496b676e9SEd Schouten if ((position != 1) && ((*point == ' ') || (*point == '\t') || (position == curr_line->line_length) || (*point == '\0')))
453572fcea8cSEd Schouten prev_word();
453672fcea8cSEd Schouten temp_dword = d_word;
453772fcea8cSEd Schouten temp_dwl = d_wrd_len;
453872fcea8cSEd Schouten d_wrd_len = 0;
453972fcea8cSEd Schouten d_word = NULL;
454072fcea8cSEd Schouten temp_case = case_sen;
454172fcea8cSEd Schouten case_sen = TRUE;
454272fcea8cSEd Schouten tmp_srchstr = srch_str;
454372fcea8cSEd Schouten temp2 = srch_str = (unsigned char *) malloc(1 + curr_line->line_length - position);
454472fcea8cSEd Schouten if ((*point == ' ') || (*point == '\t'))
454572fcea8cSEd Schouten adv_word();
454672fcea8cSEd Schouten offset -= position;
454772fcea8cSEd Schouten counter = position;
454872fcea8cSEd Schouten line = temp1 = point;
454996b676e9SEd Schouten while ((*temp1 != '\0') && (*temp1 != ' ') && (*temp1 != '\t') && (counter < curr_line->line_length))
455072fcea8cSEd Schouten {
455172fcea8cSEd Schouten *temp2 = *temp1;
455272fcea8cSEd Schouten temp2++;
455372fcea8cSEd Schouten temp1++;
455472fcea8cSEd Schouten counter++;
455572fcea8cSEd Schouten }
455696b676e9SEd Schouten *temp2 = '\0';
455772fcea8cSEd Schouten if (position != 1)
455872fcea8cSEd Schouten bol();
455972fcea8cSEd Schouten while (!Blank_Line(curr_line->prev_line))
456072fcea8cSEd Schouten bol();
456172fcea8cSEd Schouten string_count = 0;
456272fcea8cSEd Schouten status = TRUE;
456372fcea8cSEd Schouten while ((line != point) && (status))
456472fcea8cSEd Schouten {
456572fcea8cSEd Schouten status = search(FALSE);
456672fcea8cSEd Schouten string_count++;
456772fcea8cSEd Schouten }
456872fcea8cSEd Schouten
456972fcea8cSEd Schouten /*
457072fcea8cSEd Schouten | now get back to the start of the paragraph to start checking
457172fcea8cSEd Schouten */
457272fcea8cSEd Schouten
457372fcea8cSEd Schouten if (position != 1)
457472fcea8cSEd Schouten bol();
457572fcea8cSEd Schouten while (!Blank_Line(curr_line->prev_line))
457672fcea8cSEd Schouten bol();
457772fcea8cSEd Schouten
457872fcea8cSEd Schouten /*
457972fcea8cSEd Schouten | Start going through lines, putting spaces at end of lines if they do
458072fcea8cSEd Schouten | not already exist. Check line length, and move words to the next line
458172fcea8cSEd Schouten | if they cross the margin. Then get words from the next line if they
458272fcea8cSEd Schouten | will fit in before the margin.
458372fcea8cSEd Schouten */
458472fcea8cSEd Schouten
458572fcea8cSEd Schouten counter = 0;
458672fcea8cSEd Schouten
458772fcea8cSEd Schouten while (!leave_loop)
458872fcea8cSEd Schouten {
458972fcea8cSEd Schouten if (position != curr_line->line_length)
459072fcea8cSEd Schouten eol();
459172fcea8cSEd Schouten left(TRUE);
459272fcea8cSEd Schouten if (*point != ' ')
459372fcea8cSEd Schouten {
459472fcea8cSEd Schouten right(TRUE);
459572fcea8cSEd Schouten insert(' ');
459672fcea8cSEd Schouten }
459772fcea8cSEd Schouten else
459872fcea8cSEd Schouten right(TRUE);
459972fcea8cSEd Schouten
460072fcea8cSEd Schouten not_blank = FALSE;
460172fcea8cSEd Schouten
460272fcea8cSEd Schouten /*
460372fcea8cSEd Schouten | fill line if first word on next line will fit
460472fcea8cSEd Schouten | in the line without crossing the margin
460572fcea8cSEd Schouten */
460672fcea8cSEd Schouten
460772fcea8cSEd Schouten while ((curr_line->next_line != NULL) &&
460872fcea8cSEd Schouten ((word_len = first_word_len(curr_line->next_line)) > 0)
460972fcea8cSEd Schouten && ((scr_pos + word_len) < right_margin))
461072fcea8cSEd Schouten {
461172fcea8cSEd Schouten adv_line();
461272fcea8cSEd Schouten if ((*point == ' ') || (*point == '\t'))
461372fcea8cSEd Schouten adv_word();
461472fcea8cSEd Schouten del_word();
461572fcea8cSEd Schouten if (position != 1)
461672fcea8cSEd Schouten bol();
461772fcea8cSEd Schouten
461872fcea8cSEd Schouten /*
461972fcea8cSEd Schouten | We know this line was not blank before, so
462072fcea8cSEd Schouten | make sure that it doesn't have one of the
462172fcea8cSEd Schouten | leading characters that indicate the line
462272fcea8cSEd Schouten | should not be modified.
462372fcea8cSEd Schouten |
462472fcea8cSEd Schouten | We also know that this character should not
462572fcea8cSEd Schouten | be left as the first character of this line.
462672fcea8cSEd Schouten */
462772fcea8cSEd Schouten
462872fcea8cSEd Schouten if ((Blank_Line(curr_line)) &&
462972fcea8cSEd Schouten (curr_line->line[0] != '.') &&
463072fcea8cSEd Schouten (curr_line->line[0] != '>'))
463172fcea8cSEd Schouten {
463272fcea8cSEd Schouten del_line();
463372fcea8cSEd Schouten not_blank = FALSE;
463472fcea8cSEd Schouten }
463572fcea8cSEd Schouten else
463672fcea8cSEd Schouten not_blank = TRUE;
463772fcea8cSEd Schouten
463872fcea8cSEd Schouten /*
463972fcea8cSEd Schouten | go to end of previous line
464072fcea8cSEd Schouten */
464172fcea8cSEd Schouten left(TRUE);
464272fcea8cSEd Schouten undel_word();
464372fcea8cSEd Schouten eol();
464472fcea8cSEd Schouten /*
464572fcea8cSEd Schouten | make sure there's a space at the end of the line
464672fcea8cSEd Schouten */
464772fcea8cSEd Schouten left(TRUE);
464872fcea8cSEd Schouten if (*point != ' ')
464972fcea8cSEd Schouten {
465072fcea8cSEd Schouten right(TRUE);
465172fcea8cSEd Schouten insert(' ');
465272fcea8cSEd Schouten }
465372fcea8cSEd Schouten else
465472fcea8cSEd Schouten right(TRUE);
465572fcea8cSEd Schouten }
465672fcea8cSEd Schouten
465772fcea8cSEd Schouten /*
465872fcea8cSEd Schouten | make sure line does not cross right margin
465972fcea8cSEd Schouten */
466072fcea8cSEd Schouten
466172fcea8cSEd Schouten while (right_margin <= scr_pos)
466272fcea8cSEd Schouten {
466372fcea8cSEd Schouten prev_word();
466472fcea8cSEd Schouten if (position != 1)
466572fcea8cSEd Schouten {
466672fcea8cSEd Schouten del_word();
466772fcea8cSEd Schouten if (Blank_Line(curr_line->next_line))
466872fcea8cSEd Schouten insert_line(TRUE);
466972fcea8cSEd Schouten else
467072fcea8cSEd Schouten adv_line();
467172fcea8cSEd Schouten if ((*point == ' ') || (*point == '\t'))
467272fcea8cSEd Schouten adv_word();
467372fcea8cSEd Schouten undel_word();
467472fcea8cSEd Schouten not_blank = TRUE;
467572fcea8cSEd Schouten if (position != 1)
467672fcea8cSEd Schouten bol();
467772fcea8cSEd Schouten left(TRUE);
467872fcea8cSEd Schouten }
467972fcea8cSEd Schouten }
468072fcea8cSEd Schouten
468172fcea8cSEd Schouten if ((!Blank_Line(curr_line->next_line)) || (not_blank))
468272fcea8cSEd Schouten {
468372fcea8cSEd Schouten adv_line();
468472fcea8cSEd Schouten counter++;
468572fcea8cSEd Schouten }
468672fcea8cSEd Schouten else
468772fcea8cSEd Schouten leave_loop = TRUE;
468872fcea8cSEd Schouten }
468972fcea8cSEd Schouten
469072fcea8cSEd Schouten /*
469172fcea8cSEd Schouten | go back to begin of paragraph, put cursor back to original position
469272fcea8cSEd Schouten */
469372fcea8cSEd Schouten
469472fcea8cSEd Schouten if (position != 1)
469572fcea8cSEd Schouten bol();
469672fcea8cSEd Schouten while ((counter-- > 0) || (!Blank_Line(curr_line->prev_line)))
469772fcea8cSEd Schouten bol();
469872fcea8cSEd Schouten
469972fcea8cSEd Schouten /*
470072fcea8cSEd Schouten | find word cursor was in
470172fcea8cSEd Schouten */
470272fcea8cSEd Schouten
470372fcea8cSEd Schouten status = TRUE;
470472fcea8cSEd Schouten while ((status) && (string_count > 0))
470572fcea8cSEd Schouten {
470672fcea8cSEd Schouten status = search(FALSE);
470772fcea8cSEd Schouten string_count--;
470872fcea8cSEd Schouten }
470972fcea8cSEd Schouten
471072fcea8cSEd Schouten /*
471172fcea8cSEd Schouten | offset the cursor to where it was before from the start of the word
471272fcea8cSEd Schouten */
471372fcea8cSEd Schouten
471472fcea8cSEd Schouten while (offset > 0)
471572fcea8cSEd Schouten {
471672fcea8cSEd Schouten offset--;
471772fcea8cSEd Schouten right(TRUE);
471872fcea8cSEd Schouten }
471972fcea8cSEd Schouten
472072fcea8cSEd Schouten if ((string_count > 0) && (offset < 0))
472172fcea8cSEd Schouten {
472272fcea8cSEd Schouten while (offset < 0)
472372fcea8cSEd Schouten {
472472fcea8cSEd Schouten offset++;
472572fcea8cSEd Schouten left(TRUE);
472672fcea8cSEd Schouten }
472772fcea8cSEd Schouten }
472872fcea8cSEd Schouten
472972fcea8cSEd Schouten /*
473072fcea8cSEd Schouten | reset flags and strings to what they were before formatting
473172fcea8cSEd Schouten */
473272fcea8cSEd Schouten
473372fcea8cSEd Schouten if (d_word != NULL)
473472fcea8cSEd Schouten free(d_word);
473572fcea8cSEd Schouten d_word = temp_dword;
473672fcea8cSEd Schouten d_wrd_len = temp_dwl;
473772fcea8cSEd Schouten case_sen = temp_case;
473872fcea8cSEd Schouten free(srch_str);
473972fcea8cSEd Schouten srch_str = tmp_srchstr;
474072fcea8cSEd Schouten d_char[0] = temp_d_char[0];
474172fcea8cSEd Schouten d_char[1] = temp_d_char[1];
474272fcea8cSEd Schouten d_char[2] = temp_d_char[2];
474372fcea8cSEd Schouten auto_format = TRUE;
474472fcea8cSEd Schouten dlt_line->line_length = tmp_d_line_length;
474572fcea8cSEd Schouten d_line = tmp_d_line;
474672fcea8cSEd Schouten
474772fcea8cSEd Schouten formatted = TRUE;
474872fcea8cSEd Schouten midscreen(scr_vert, point);
474972fcea8cSEd Schouten }
475072fcea8cSEd Schouten
475172fcea8cSEd Schouten void
modes_op(void)475291517e3bSJohn Baldwin modes_op(void)
475372fcea8cSEd Schouten {
475472fcea8cSEd Schouten int ret_value;
475572fcea8cSEd Schouten int counter;
475672fcea8cSEd Schouten char *string;
475772fcea8cSEd Schouten
475872fcea8cSEd Schouten do
475972fcea8cSEd Schouten {
476072fcea8cSEd Schouten sprintf(modes_menu[1].item_string, "%s %s", mode_strings[1],
476172fcea8cSEd Schouten (expand_tabs ? ON : OFF));
476272fcea8cSEd Schouten sprintf(modes_menu[2].item_string, "%s %s", mode_strings[2],
476372fcea8cSEd Schouten (case_sen ? ON : OFF));
476472fcea8cSEd Schouten sprintf(modes_menu[3].item_string, "%s %s", mode_strings[3],
476572fcea8cSEd Schouten (observ_margins ? ON : OFF));
476672fcea8cSEd Schouten sprintf(modes_menu[4].item_string, "%s %s", mode_strings[4],
476772fcea8cSEd Schouten (auto_format ? ON : OFF));
476872fcea8cSEd Schouten sprintf(modes_menu[5].item_string, "%s %s", mode_strings[5],
476972fcea8cSEd Schouten (eightbit ? ON : OFF));
477072fcea8cSEd Schouten sprintf(modes_menu[6].item_string, "%s %s", mode_strings[6],
477172fcea8cSEd Schouten (info_window ? ON : OFF));
477272fcea8cSEd Schouten sprintf(modes_menu[7].item_string, "%s %s", mode_strings[7],
477372fcea8cSEd Schouten (emacs_keys_mode ? ON : OFF));
477472fcea8cSEd Schouten sprintf(modes_menu[8].item_string, "%s %d", mode_strings[8],
477572fcea8cSEd Schouten right_margin);
477672fcea8cSEd Schouten sprintf(modes_menu[9].item_string, "%s %s", mode_strings[9],
477772fcea8cSEd Schouten (ee_chinese ? ON : OFF));
477872fcea8cSEd Schouten
477972fcea8cSEd Schouten ret_value = menu_op(modes_menu);
478072fcea8cSEd Schouten
478172fcea8cSEd Schouten switch (ret_value)
478272fcea8cSEd Schouten {
478372fcea8cSEd Schouten case 1:
478472fcea8cSEd Schouten expand_tabs = !expand_tabs;
478572fcea8cSEd Schouten break;
478672fcea8cSEd Schouten case 2:
478772fcea8cSEd Schouten case_sen = !case_sen;
478872fcea8cSEd Schouten break;
478972fcea8cSEd Schouten case 3:
479072fcea8cSEd Schouten observ_margins = !observ_margins;
479172fcea8cSEd Schouten break;
479272fcea8cSEd Schouten case 4:
479372fcea8cSEd Schouten auto_format = !auto_format;
479472fcea8cSEd Schouten if (auto_format)
479572fcea8cSEd Schouten observ_margins = TRUE;
479672fcea8cSEd Schouten break;
479772fcea8cSEd Schouten case 5:
479872fcea8cSEd Schouten eightbit = !eightbit;
479972fcea8cSEd Schouten if (!eightbit)
480072fcea8cSEd Schouten ee_chinese = FALSE;
480172fcea8cSEd Schouten #ifdef NCURSE
480272fcea8cSEd Schouten if (ee_chinese)
480372fcea8cSEd Schouten nc_setattrib(A_NC_BIG5);
480472fcea8cSEd Schouten else
480572fcea8cSEd Schouten nc_clearattrib(A_NC_BIG5);
480672fcea8cSEd Schouten #endif /* NCURSE */
480772fcea8cSEd Schouten
480872fcea8cSEd Schouten redraw();
480972fcea8cSEd Schouten wnoutrefresh(text_win);
481072fcea8cSEd Schouten break;
481172fcea8cSEd Schouten case 6:
481272fcea8cSEd Schouten if (info_window)
481372fcea8cSEd Schouten no_info_window();
481472fcea8cSEd Schouten else
481572fcea8cSEd Schouten create_info_window();
481672fcea8cSEd Schouten break;
481772fcea8cSEd Schouten case 7:
481872fcea8cSEd Schouten emacs_keys_mode = !emacs_keys_mode;
481972fcea8cSEd Schouten if (info_window)
482072fcea8cSEd Schouten paint_info_win();
482172fcea8cSEd Schouten break;
482272fcea8cSEd Schouten case 8:
482372fcea8cSEd Schouten string = get_string(margin_prompt, TRUE);
482472fcea8cSEd Schouten if (string != NULL)
482572fcea8cSEd Schouten {
482672fcea8cSEd Schouten counter = atoi(string);
482772fcea8cSEd Schouten if (counter > 0)
482872fcea8cSEd Schouten right_margin = counter;
482972fcea8cSEd Schouten free(string);
483072fcea8cSEd Schouten }
483172fcea8cSEd Schouten break;
483272fcea8cSEd Schouten case 9:
483372fcea8cSEd Schouten ee_chinese = !ee_chinese;
483472fcea8cSEd Schouten if (ee_chinese != FALSE)
483572fcea8cSEd Schouten eightbit = TRUE;
483672fcea8cSEd Schouten #ifdef NCURSE
483772fcea8cSEd Schouten if (ee_chinese)
483872fcea8cSEd Schouten nc_setattrib(A_NC_BIG5);
483972fcea8cSEd Schouten else
484072fcea8cSEd Schouten nc_clearattrib(A_NC_BIG5);
484172fcea8cSEd Schouten #endif /* NCURSE */
484272fcea8cSEd Schouten redraw();
484372fcea8cSEd Schouten break;
484472fcea8cSEd Schouten default:
484572fcea8cSEd Schouten break;
484672fcea8cSEd Schouten }
484772fcea8cSEd Schouten }
484872fcea8cSEd Schouten while (ret_value != 0);
484972fcea8cSEd Schouten }
485072fcea8cSEd Schouten
485191517e3bSJohn Baldwin /* a strchr() look-alike for systems without strchr() */
485272fcea8cSEd Schouten char *
is_in_string(char * string,char * substring)485391517e3bSJohn Baldwin is_in_string(char *string, char *substring)
485472fcea8cSEd Schouten {
485572fcea8cSEd Schouten char *full, *sub;
485672fcea8cSEd Schouten
485796b676e9SEd Schouten for (sub = substring; (sub != NULL) && (*sub != '\0'); sub++)
485872fcea8cSEd Schouten {
485996b676e9SEd Schouten for (full = string; (full != NULL) && (*full != '\0');
486072fcea8cSEd Schouten full++)
486172fcea8cSEd Schouten {
486272fcea8cSEd Schouten if (*sub == *full)
486372fcea8cSEd Schouten return(full);
486472fcea8cSEd Schouten }
486572fcea8cSEd Schouten }
486672fcea8cSEd Schouten return(NULL);
486772fcea8cSEd Schouten }
486872fcea8cSEd Schouten
486972fcea8cSEd Schouten /*
487072fcea8cSEd Schouten | handle names of the form "~/file", "~user/file",
487172fcea8cSEd Schouten | "$HOME/foo", "~/$FOO", etc.
487272fcea8cSEd Schouten */
487372fcea8cSEd Schouten
487472fcea8cSEd Schouten char *
resolve_name(char * name)487591517e3bSJohn Baldwin resolve_name(char *name)
487672fcea8cSEd Schouten {
487772fcea8cSEd Schouten char long_buffer[1024];
487872fcea8cSEd Schouten char short_buffer[128];
487972fcea8cSEd Schouten char *buffer;
488072fcea8cSEd Schouten char *slash;
488172fcea8cSEd Schouten char *tmp;
488272fcea8cSEd Schouten char *start_of_var;
488372fcea8cSEd Schouten int offset;
488472fcea8cSEd Schouten int index;
488572fcea8cSEd Schouten int counter;
488672fcea8cSEd Schouten struct passwd *user;
488772fcea8cSEd Schouten
488872fcea8cSEd Schouten if (name[0] == '~')
488972fcea8cSEd Schouten {
489072fcea8cSEd Schouten if (name[1] == '/')
489172fcea8cSEd Schouten {
489272fcea8cSEd Schouten index = getuid();
489372fcea8cSEd Schouten user = (struct passwd *) getpwuid(index);
489472fcea8cSEd Schouten slash = name + 1;
489572fcea8cSEd Schouten }
489672fcea8cSEd Schouten else
489772fcea8cSEd Schouten {
489872fcea8cSEd Schouten slash = strchr(name, '/');
489972fcea8cSEd Schouten if (slash == NULL)
490072fcea8cSEd Schouten return(name);
490196b676e9SEd Schouten *slash = '\0';
490272fcea8cSEd Schouten user = (struct passwd *) getpwnam((name + 1));
490372fcea8cSEd Schouten *slash = '/';
490472fcea8cSEd Schouten }
490572fcea8cSEd Schouten if (user == NULL)
490672fcea8cSEd Schouten {
490772fcea8cSEd Schouten return(name);
490872fcea8cSEd Schouten }
490972fcea8cSEd Schouten buffer = malloc(strlen(user->pw_dir) + strlen(slash) + 1);
491072fcea8cSEd Schouten strcpy(buffer, user->pw_dir);
491172fcea8cSEd Schouten strcat(buffer, slash);
491272fcea8cSEd Schouten }
491372fcea8cSEd Schouten else
491472fcea8cSEd Schouten buffer = name;
491572fcea8cSEd Schouten
491672fcea8cSEd Schouten if (is_in_string(buffer, "$"))
491772fcea8cSEd Schouten {
491872fcea8cSEd Schouten tmp = buffer;
491972fcea8cSEd Schouten index = 0;
492072fcea8cSEd Schouten
492196b676e9SEd Schouten while ((*tmp != '\0') && (index < 1024))
492272fcea8cSEd Schouten {
492372fcea8cSEd Schouten
492496b676e9SEd Schouten while ((*tmp != '\0') && (*tmp != '$') &&
492572fcea8cSEd Schouten (index < 1024))
492672fcea8cSEd Schouten {
492772fcea8cSEd Schouten long_buffer[index] = *tmp;
492872fcea8cSEd Schouten tmp++;
492972fcea8cSEd Schouten index++;
493072fcea8cSEd Schouten }
493172fcea8cSEd Schouten
493272fcea8cSEd Schouten if ((*tmp == '$') && (index < 1024))
493372fcea8cSEd Schouten {
493472fcea8cSEd Schouten counter = 0;
493572fcea8cSEd Schouten start_of_var = tmp;
493672fcea8cSEd Schouten tmp++;
493772fcea8cSEd Schouten if (*tmp == '{') /* } */ /* bracketed variable name */
493872fcea8cSEd Schouten {
493972fcea8cSEd Schouten tmp++; /* { */
494096b676e9SEd Schouten while ((*tmp != '\0') &&
494172fcea8cSEd Schouten (*tmp != '}') &&
494272fcea8cSEd Schouten (counter < 128))
494372fcea8cSEd Schouten {
494472fcea8cSEd Schouten short_buffer[counter] = *tmp;
494572fcea8cSEd Schouten counter++;
494672fcea8cSEd Schouten tmp++;
494772fcea8cSEd Schouten } /* { */
494872fcea8cSEd Schouten if (*tmp == '}')
494972fcea8cSEd Schouten tmp++;
495072fcea8cSEd Schouten }
495172fcea8cSEd Schouten else
495272fcea8cSEd Schouten {
495396b676e9SEd Schouten while ((*tmp != '\0') &&
495472fcea8cSEd Schouten (*tmp != '/') &&
495572fcea8cSEd Schouten (*tmp != '$') &&
495672fcea8cSEd Schouten (counter < 128))
495772fcea8cSEd Schouten {
495872fcea8cSEd Schouten short_buffer[counter] = *tmp;
495972fcea8cSEd Schouten counter++;
496072fcea8cSEd Schouten tmp++;
496172fcea8cSEd Schouten }
496272fcea8cSEd Schouten }
496396b676e9SEd Schouten short_buffer[counter] = '\0';
496472fcea8cSEd Schouten if ((slash = getenv(short_buffer)) != NULL)
496572fcea8cSEd Schouten {
496672fcea8cSEd Schouten offset = strlen(slash);
496772fcea8cSEd Schouten if ((offset + index) < 1024)
496872fcea8cSEd Schouten strcpy(&long_buffer[index], slash);
496972fcea8cSEd Schouten index += offset;
497072fcea8cSEd Schouten }
497172fcea8cSEd Schouten else
497272fcea8cSEd Schouten {
497372fcea8cSEd Schouten while ((start_of_var != tmp) && (index < 1024))
497472fcea8cSEd Schouten {
497572fcea8cSEd Schouten long_buffer[index] = *start_of_var;
497672fcea8cSEd Schouten start_of_var++;
497772fcea8cSEd Schouten index++;
497872fcea8cSEd Schouten }
497972fcea8cSEd Schouten }
498072fcea8cSEd Schouten }
498172fcea8cSEd Schouten }
498272fcea8cSEd Schouten
498372fcea8cSEd Schouten if (index == 1024)
498472fcea8cSEd Schouten return(buffer);
498572fcea8cSEd Schouten else
498696b676e9SEd Schouten long_buffer[index] = '\0';
498772fcea8cSEd Schouten
498872fcea8cSEd Schouten if (name != buffer)
498972fcea8cSEd Schouten free(buffer);
499072fcea8cSEd Schouten buffer = malloc(index + 1);
499172fcea8cSEd Schouten strcpy(buffer, long_buffer);
499272fcea8cSEd Schouten }
499372fcea8cSEd Schouten
499472fcea8cSEd Schouten return(buffer);
499572fcea8cSEd Schouten }
499672fcea8cSEd Schouten
499772fcea8cSEd Schouten int
restrict_mode(void)499891517e3bSJohn Baldwin restrict_mode(void)
499972fcea8cSEd Schouten {
500072fcea8cSEd Schouten if (!restricted)
500172fcea8cSEd Schouten return(FALSE);
500272fcea8cSEd Schouten
500372fcea8cSEd Schouten wmove(com_win, 0, 0);
5004*0667538bSBaptiste Daroussin wprintw(com_win, "%s", restricted_msg);
500572fcea8cSEd Schouten wclrtoeol(com_win);
500672fcea8cSEd Schouten wrefresh(com_win);
500772fcea8cSEd Schouten clear_com_win = TRUE;
500872fcea8cSEd Schouten return(TRUE);
500972fcea8cSEd Schouten }
501072fcea8cSEd Schouten
501172fcea8cSEd Schouten /*
501272fcea8cSEd Schouten | The following routine tests the input string against the list of
501372fcea8cSEd Schouten | strings, to determine if the string is a unique match with one of the
501472fcea8cSEd Schouten | valid values.
501572fcea8cSEd Schouten */
501672fcea8cSEd Schouten
501772fcea8cSEd Schouten int
unique_test(char * string,char * list[])501891517e3bSJohn Baldwin unique_test(char *string, char *list[])
501972fcea8cSEd Schouten {
502072fcea8cSEd Schouten int counter;
502172fcea8cSEd Schouten int num_match;
502272fcea8cSEd Schouten int result;
502372fcea8cSEd Schouten
502472fcea8cSEd Schouten num_match = 0;
502572fcea8cSEd Schouten counter = 0;
502672fcea8cSEd Schouten while (list[counter] != NULL)
502772fcea8cSEd Schouten {
502872fcea8cSEd Schouten result = compare(string, list[counter], FALSE);
502972fcea8cSEd Schouten if (result)
503072fcea8cSEd Schouten num_match++;
503172fcea8cSEd Schouten counter++;
503272fcea8cSEd Schouten }
503372fcea8cSEd Schouten return(num_match);
503472fcea8cSEd Schouten }
503572fcea8cSEd Schouten
503672fcea8cSEd Schouten #ifndef NO_CATGETS
503772fcea8cSEd Schouten /*
503872fcea8cSEd Schouten | Get the catalog entry, and if it got it from the catalog,
503972fcea8cSEd Schouten | make a copy, since the buffer will be overwritten by the
504072fcea8cSEd Schouten | next call to catgets().
504172fcea8cSEd Schouten */
504272fcea8cSEd Schouten
504372fcea8cSEd Schouten char *
catgetlocal(int number,char * string)504491517e3bSJohn Baldwin catgetlocal(int number, char *string)
504572fcea8cSEd Schouten {
504672fcea8cSEd Schouten char *temp1;
504772fcea8cSEd Schouten char *temp2;
504872fcea8cSEd Schouten
504972fcea8cSEd Schouten temp1 = catgets(catalog, 1, number, string);
505072fcea8cSEd Schouten if (temp1 != string)
505172fcea8cSEd Schouten {
505272fcea8cSEd Schouten temp2 = malloc(strlen(temp1) + 1);
505372fcea8cSEd Schouten strcpy(temp2, temp1);
505472fcea8cSEd Schouten temp1 = temp2;
505572fcea8cSEd Schouten }
505672fcea8cSEd Schouten return(temp1);
505772fcea8cSEd Schouten }
505872fcea8cSEd Schouten #endif /* NO_CATGETS */
505972fcea8cSEd Schouten
506072fcea8cSEd Schouten /*
506172fcea8cSEd Schouten | The following is to allow for using message catalogs which allow
506272fcea8cSEd Schouten | the software to be 'localized', that is, to use different languages
506372fcea8cSEd Schouten | all with the same binary. For more information, see your system
506472fcea8cSEd Schouten | documentation, or the X/Open Internationalization Guide.
506572fcea8cSEd Schouten */
506672fcea8cSEd Schouten
506772fcea8cSEd Schouten void
strings_init(void)506891517e3bSJohn Baldwin strings_init(void)
506972fcea8cSEd Schouten {
507072fcea8cSEd Schouten int counter;
507172fcea8cSEd Schouten
507272fcea8cSEd Schouten setlocale(LC_ALL, "");
5073f39e07f3SAndrey A. Chernov #ifndef NO_CATGETS
5074cfe04e82SEd Schouten catalog = catopen("ee", NL_CAT_LOCALE);
507572fcea8cSEd Schouten #endif /* NO_CATGETS */
507672fcea8cSEd Schouten
507772fcea8cSEd Schouten modes_menu[0].item_string = catgetlocal( 1, "modes menu");
507872fcea8cSEd Schouten mode_strings[1] = catgetlocal( 2, "tabs to spaces ");
507972fcea8cSEd Schouten mode_strings[2] = catgetlocal( 3, "case sensitive search");
508072fcea8cSEd Schouten mode_strings[3] = catgetlocal( 4, "margins observed ");
508172fcea8cSEd Schouten mode_strings[4] = catgetlocal( 5, "auto-paragraph format");
508272fcea8cSEd Schouten mode_strings[5] = catgetlocal( 6, "eightbit characters ");
508372fcea8cSEd Schouten mode_strings[6] = catgetlocal( 7, "info window ");
508472fcea8cSEd Schouten mode_strings[8] = catgetlocal( 8, "right margin ");
508572fcea8cSEd Schouten leave_menu[0].item_string = catgetlocal( 9, "leave menu");
508672fcea8cSEd Schouten leave_menu[1].item_string = catgetlocal( 10, "save changes");
508772fcea8cSEd Schouten leave_menu[2].item_string = catgetlocal( 11, "no save");
508872fcea8cSEd Schouten file_menu[0].item_string = catgetlocal( 12, "file menu");
508972fcea8cSEd Schouten file_menu[1].item_string = catgetlocal( 13, "read a file");
509072fcea8cSEd Schouten file_menu[2].item_string = catgetlocal( 14, "write a file");
509172fcea8cSEd Schouten file_menu[3].item_string = catgetlocal( 15, "save file");
509272fcea8cSEd Schouten file_menu[4].item_string = catgetlocal( 16, "print editor contents");
509372fcea8cSEd Schouten search_menu[0].item_string = catgetlocal( 17, "search menu");
509472fcea8cSEd Schouten search_menu[1].item_string = catgetlocal( 18, "search for ...");
509572fcea8cSEd Schouten search_menu[2].item_string = catgetlocal( 19, "search");
509672fcea8cSEd Schouten spell_menu[0].item_string = catgetlocal( 20, "spell menu");
509772fcea8cSEd Schouten spell_menu[1].item_string = catgetlocal( 21, "use 'spell'");
509872fcea8cSEd Schouten spell_menu[2].item_string = catgetlocal( 22, "use 'ispell'");
509972fcea8cSEd Schouten misc_menu[0].item_string = catgetlocal( 23, "miscellaneous menu");
510072fcea8cSEd Schouten misc_menu[1].item_string = catgetlocal( 24, "format paragraph");
510172fcea8cSEd Schouten misc_menu[2].item_string = catgetlocal( 25, "shell command");
510272fcea8cSEd Schouten misc_menu[3].item_string = catgetlocal( 26, "check spelling");
510372fcea8cSEd Schouten main_menu[0].item_string = catgetlocal( 27, "main menu");
510472fcea8cSEd Schouten main_menu[1].item_string = catgetlocal( 28, "leave editor");
510572fcea8cSEd Schouten main_menu[2].item_string = catgetlocal( 29, "help");
510672fcea8cSEd Schouten main_menu[3].item_string = catgetlocal( 30, "file operations");
510772fcea8cSEd Schouten main_menu[4].item_string = catgetlocal( 31, "redraw screen");
510872fcea8cSEd Schouten main_menu[5].item_string = catgetlocal( 32, "settings");
510972fcea8cSEd Schouten main_menu[6].item_string = catgetlocal( 33, "search");
511072fcea8cSEd Schouten main_menu[7].item_string = catgetlocal( 34, "miscellaneous");
511172fcea8cSEd Schouten help_text[0] = catgetlocal( 35, "Control keys: ");
511272fcea8cSEd Schouten help_text[1] = catgetlocal( 36, "^a ascii code ^i tab ^r right ");
511372fcea8cSEd Schouten help_text[2] = catgetlocal( 37, "^b bottom of text ^j newline ^t top of text ");
511472fcea8cSEd Schouten help_text[3] = catgetlocal( 38, "^c command ^k delete char ^u up ");
511572fcea8cSEd Schouten help_text[4] = catgetlocal( 39, "^d down ^l left ^v undelete word ");
511672fcea8cSEd Schouten help_text[5] = catgetlocal( 40, "^e search prompt ^m newline ^w delete word ");
511772fcea8cSEd Schouten help_text[6] = catgetlocal( 41, "^f undelete char ^n next page ^x search ");
511872fcea8cSEd Schouten help_text[7] = catgetlocal( 42, "^g begin of line ^o end of line ^y delete line ");
511972fcea8cSEd Schouten help_text[8] = catgetlocal( 43, "^h backspace ^p prev page ^z undelete line ");
5120cfe04e82SEd Schouten help_text[9] = catgetlocal( 44, "^[ (escape) menu ESC-Enter: exit ee ");
512172fcea8cSEd Schouten help_text[10] = catgetlocal( 45, " ");
512272fcea8cSEd Schouten help_text[11] = catgetlocal( 46, "Commands: ");
512372fcea8cSEd Schouten help_text[12] = catgetlocal( 47, "help : get this info file : print file name ");
512472fcea8cSEd Schouten help_text[13] = catgetlocal( 48, "read : read a file char : ascii code of char ");
512572fcea8cSEd Schouten help_text[14] = catgetlocal( 49, "write : write a file case : case sensitive search ");
512672fcea8cSEd Schouten help_text[15] = catgetlocal( 50, "exit : leave and save nocase : case insensitive search ");
512772fcea8cSEd Schouten help_text[16] = catgetlocal( 51, "quit : leave, no save !cmd : execute \"cmd\" in shell ");
512872fcea8cSEd Schouten help_text[17] = catgetlocal( 52, "line : display line # 0-9 : go to line \"#\" ");
512972fcea8cSEd Schouten help_text[18] = catgetlocal( 53, "expand : expand tabs noexpand: do not expand tabs ");
513072fcea8cSEd Schouten help_text[19] = catgetlocal( 54, " ");
513172fcea8cSEd Schouten help_text[20] = catgetlocal( 55, " ee [+#] [-i] [-e] [-h] [file(s)] ");
513272fcea8cSEd Schouten help_text[21] = catgetlocal( 56, "+# :go to line # -i :no info window -e : don't expand tabs -h :no highlight");
513372fcea8cSEd Schouten control_keys[0] = catgetlocal( 57, "^[ (escape) menu ^e search prompt ^y delete line ^u up ^p prev page ");
513472fcea8cSEd Schouten control_keys[1] = catgetlocal( 58, "^a ascii code ^x search ^z undelete line ^d down ^n next page ");
513572fcea8cSEd Schouten control_keys[2] = catgetlocal( 59, "^b bottom of text ^g begin of line ^w delete word ^l left ");
513672fcea8cSEd Schouten control_keys[3] = catgetlocal( 60, "^t top of text ^o end of line ^v undelete word ^r right ");
5137cfe04e82SEd Schouten control_keys[4] = catgetlocal( 61, "^c command ^k delete char ^f undelete char ESC-Enter: exit ee ");
513872fcea8cSEd Schouten command_strings[0] = catgetlocal( 62, "help : get help info |file : print file name |line : print line # ");
513972fcea8cSEd Schouten command_strings[1] = catgetlocal( 63, "read : read a file |char : ascii code of char |0-9 : go to line \"#\"");
514072fcea8cSEd Schouten command_strings[2] = catgetlocal( 64, "write: write a file |case : case sensitive search |exit : leave and save ");
514172fcea8cSEd Schouten command_strings[3] = catgetlocal( 65, "!cmd : shell \"cmd\" |nocase: ignore case in search |quit : leave, no save");
514272fcea8cSEd Schouten command_strings[4] = catgetlocal( 66, "expand: expand tabs |noexpand: do not expand tabs ");
514372fcea8cSEd Schouten com_win_message = catgetlocal( 67, " press Escape (^[) for menu");
514472fcea8cSEd Schouten no_file_string = catgetlocal( 68, "no file");
514572fcea8cSEd Schouten ascii_code_str = catgetlocal( 69, "ascii code: ");
514672fcea8cSEd Schouten printer_msg_str = catgetlocal( 70, "sending contents of buffer to \"%s\" ");
514772fcea8cSEd Schouten command_str = catgetlocal( 71, "command: ");
514872fcea8cSEd Schouten file_write_prompt_str = catgetlocal( 72, "name of file to write: ");
514972fcea8cSEd Schouten file_read_prompt_str = catgetlocal( 73, "name of file to read: ");
515072fcea8cSEd Schouten char_str = catgetlocal( 74, "character = %d");
515172fcea8cSEd Schouten unkn_cmd_str = catgetlocal( 75, "unknown command \"%s\"");
515272fcea8cSEd Schouten non_unique_cmd_msg = catgetlocal( 76, "entered command is not unique");
515372fcea8cSEd Schouten line_num_str = catgetlocal( 77, "line %d ");
515472fcea8cSEd Schouten line_len_str = catgetlocal( 78, "length = %d");
515572fcea8cSEd Schouten current_file_str = catgetlocal( 79, "current file is \"%s\" ");
515672fcea8cSEd Schouten usage0 = catgetlocal( 80, "usage: %s [-i] [-e] [-h] [+line_number] [file(s)]\n");
515772fcea8cSEd Schouten usage1 = catgetlocal( 81, " -i turn off info window\n");
515872fcea8cSEd Schouten usage2 = catgetlocal( 82, " -e do not convert tabs to spaces\n");
515972fcea8cSEd Schouten usage3 = catgetlocal( 83, " -h do not use highlighting\n");
516072fcea8cSEd Schouten file_is_dir_msg = catgetlocal( 84, "file \"%s\" is a directory");
516172fcea8cSEd Schouten new_file_msg = catgetlocal( 85, "new file \"%s\"");
516272fcea8cSEd Schouten cant_open_msg = catgetlocal( 86, "can't open \"%s\"");
516372fcea8cSEd Schouten open_file_msg = catgetlocal( 87, "file \"%s\", %d lines");
516472fcea8cSEd Schouten file_read_fin_msg = catgetlocal( 88, "finished reading file \"%s\"");
516572fcea8cSEd Schouten reading_file_msg = catgetlocal( 89, "reading file \"%s\"");
516672fcea8cSEd Schouten read_only_msg = catgetlocal( 90, ", read only");
516772fcea8cSEd Schouten file_read_lines_msg = catgetlocal( 91, "file \"%s\", %d lines");
516872fcea8cSEd Schouten save_file_name_prompt = catgetlocal( 92, "enter name of file: ");
516972fcea8cSEd Schouten file_not_saved_msg = catgetlocal( 93, "no filename entered: file not saved");
517072fcea8cSEd Schouten changes_made_prompt = catgetlocal( 94, "changes have been made, are you sure? (y/n [n]) ");
517172fcea8cSEd Schouten yes_char = catgetlocal( 95, "y");
517272fcea8cSEd Schouten file_exists_prompt = catgetlocal( 96, "file already exists, overwrite? (y/n) [n] ");
517372fcea8cSEd Schouten create_file_fail_msg = catgetlocal( 97, "unable to create file \"%s\"");
517472fcea8cSEd Schouten writing_file_msg = catgetlocal( 98, "writing file \"%s\"");
517572fcea8cSEd Schouten file_written_msg = catgetlocal( 99, "\"%s\" %d lines, %d characters");
517672fcea8cSEd Schouten searching_msg = catgetlocal( 100, " ...searching");
517772fcea8cSEd Schouten str_not_found_msg = catgetlocal( 101, "string \"%s\" not found");
517872fcea8cSEd Schouten search_prompt_str = catgetlocal( 102, "search for: ");
517996b676e9SEd Schouten exec_err_msg = catgetlocal( 103, "could not exec %s\n");
518072fcea8cSEd Schouten continue_msg = catgetlocal( 104, "press return to continue ");
518172fcea8cSEd Schouten menu_cancel_msg = catgetlocal( 105, "press Esc to cancel");
518272fcea8cSEd Schouten menu_size_err_msg = catgetlocal( 106, "menu too large for window");
518372fcea8cSEd Schouten press_any_key_msg = catgetlocal( 107, "press any key to continue ");
518472fcea8cSEd Schouten shell_prompt = catgetlocal( 108, "shell command: ");
518572fcea8cSEd Schouten formatting_msg = catgetlocal( 109, "...formatting paragraph...");
518672fcea8cSEd Schouten shell_echo_msg = catgetlocal( 110, "<!echo 'list of unrecognized words'; echo -=-=-=-=-=-");
518772fcea8cSEd Schouten spell_in_prog_msg = catgetlocal( 111, "sending contents of edit buffer to 'spell'");
518872fcea8cSEd Schouten margin_prompt = catgetlocal( 112, "right margin is: ");
518972fcea8cSEd Schouten restricted_msg = catgetlocal( 113, "restricted mode: unable to perform requested operation");
519072fcea8cSEd Schouten ON = catgetlocal( 114, "ON");
519172fcea8cSEd Schouten OFF = catgetlocal( 115, "OFF");
519272fcea8cSEd Schouten HELP = catgetlocal( 116, "HELP");
519372fcea8cSEd Schouten WRITE = catgetlocal( 117, "WRITE");
519472fcea8cSEd Schouten READ = catgetlocal( 118, "READ");
519572fcea8cSEd Schouten LINE = catgetlocal( 119, "LINE");
519672fcea8cSEd Schouten FILE_str = catgetlocal( 120, "FILE");
519772fcea8cSEd Schouten CHARACTER = catgetlocal( 121, "CHARACTER");
519872fcea8cSEd Schouten REDRAW = catgetlocal( 122, "REDRAW");
519972fcea8cSEd Schouten RESEQUENCE = catgetlocal( 123, "RESEQUENCE");
520072fcea8cSEd Schouten AUTHOR = catgetlocal( 124, "AUTHOR");
520172fcea8cSEd Schouten VERSION = catgetlocal( 125, "VERSION");
520272fcea8cSEd Schouten CASE = catgetlocal( 126, "CASE");
520372fcea8cSEd Schouten NOCASE = catgetlocal( 127, "NOCASE");
520472fcea8cSEd Schouten EXPAND = catgetlocal( 128, "EXPAND");
520572fcea8cSEd Schouten NOEXPAND = catgetlocal( 129, "NOEXPAND");
520672fcea8cSEd Schouten Exit_string = catgetlocal( 130, "EXIT");
520772fcea8cSEd Schouten QUIT_string = catgetlocal( 131, "QUIT");
520872fcea8cSEd Schouten INFO = catgetlocal( 132, "INFO");
520972fcea8cSEd Schouten NOINFO = catgetlocal( 133, "NOINFO");
521072fcea8cSEd Schouten MARGINS = catgetlocal( 134, "MARGINS");
521172fcea8cSEd Schouten NOMARGINS = catgetlocal( 135, "NOMARGINS");
521272fcea8cSEd Schouten AUTOFORMAT = catgetlocal( 136, "AUTOFORMAT");
521372fcea8cSEd Schouten NOAUTOFORMAT = catgetlocal( 137, "NOAUTOFORMAT");
521472fcea8cSEd Schouten Echo = catgetlocal( 138, "ECHO");
521572fcea8cSEd Schouten PRINTCOMMAND = catgetlocal( 139, "PRINTCOMMAND");
521672fcea8cSEd Schouten RIGHTMARGIN = catgetlocal( 140, "RIGHTMARGIN");
521772fcea8cSEd Schouten HIGHLIGHT = catgetlocal( 141, "HIGHLIGHT");
521872fcea8cSEd Schouten NOHIGHLIGHT = catgetlocal( 142, "NOHIGHLIGHT");
521972fcea8cSEd Schouten EIGHTBIT = catgetlocal( 143, "EIGHTBIT");
522072fcea8cSEd Schouten NOEIGHTBIT = catgetlocal( 144, "NOEIGHTBIT");
522172fcea8cSEd Schouten /*
522272fcea8cSEd Schouten | additions
522372fcea8cSEd Schouten */
522472fcea8cSEd Schouten mode_strings[7] = catgetlocal( 145, "emacs key bindings ");
522572fcea8cSEd Schouten emacs_help_text[0] = help_text[0];
522672fcea8cSEd Schouten emacs_help_text[1] = catgetlocal( 146, "^a beginning of line ^i tab ^r restore word ");
522796b676e9SEd Schouten emacs_help_text[2] = catgetlocal( 147, "^b back 1 char ^j undel char ^t top of text ");
522896b676e9SEd Schouten emacs_help_text[3] = catgetlocal( 148, "^c command ^k delete line ^u bottom of text ");
522972fcea8cSEd Schouten emacs_help_text[4] = catgetlocal( 149, "^d delete char ^l undelete line ^v next page ");
523072fcea8cSEd Schouten emacs_help_text[5] = catgetlocal( 150, "^e end of line ^m newline ^w delete word ");
523172fcea8cSEd Schouten emacs_help_text[6] = catgetlocal( 151, "^f forward 1 char ^n next line ^x search ");
523272fcea8cSEd Schouten emacs_help_text[7] = catgetlocal( 152, "^g go back 1 page ^o ascii char insert ^y search prompt ");
523372fcea8cSEd Schouten emacs_help_text[8] = catgetlocal( 153, "^h backspace ^p prev line ^z next word ");
523472fcea8cSEd Schouten emacs_help_text[9] = help_text[9];
523572fcea8cSEd Schouten emacs_help_text[10] = help_text[10];
523672fcea8cSEd Schouten emacs_help_text[11] = help_text[11];
523772fcea8cSEd Schouten emacs_help_text[12] = help_text[12];
523872fcea8cSEd Schouten emacs_help_text[13] = help_text[13];
523972fcea8cSEd Schouten emacs_help_text[14] = help_text[14];
524072fcea8cSEd Schouten emacs_help_text[15] = help_text[15];
524172fcea8cSEd Schouten emacs_help_text[16] = help_text[16];
524272fcea8cSEd Schouten emacs_help_text[17] = help_text[17];
524372fcea8cSEd Schouten emacs_help_text[18] = help_text[18];
524472fcea8cSEd Schouten emacs_help_text[19] = help_text[19];
524572fcea8cSEd Schouten emacs_help_text[20] = help_text[20];
524672fcea8cSEd Schouten emacs_help_text[21] = help_text[21];
524796b676e9SEd Schouten emacs_control_keys[0] = catgetlocal( 154, "^[ (escape) menu ^y search prompt ^k delete line ^p prev li ^g prev page");
524896b676e9SEd Schouten emacs_control_keys[1] = catgetlocal( 155, "^o ascii code ^x search ^l undelete line ^n next li ^v next page");
524996b676e9SEd Schouten emacs_control_keys[2] = catgetlocal( 156, "^u end of file ^a begin of line ^w delete word ^b back 1 char ^z next word");
525096b676e9SEd Schouten emacs_control_keys[3] = catgetlocal( 157, "^t top of text ^e end of line ^r restore word ^f forward char ");
5251cfe04e82SEd Schouten emacs_control_keys[4] = catgetlocal( 158, "^c command ^d delete char ^j undelete char ESC-Enter: exit");
525272fcea8cSEd Schouten EMACS_string = catgetlocal( 159, "EMACS");
525372fcea8cSEd Schouten NOEMACS_string = catgetlocal( 160, "NOEMACS");
525472fcea8cSEd Schouten usage4 = catgetlocal( 161, " +# put cursor at line #\n");
525572fcea8cSEd Schouten conf_dump_err_msg = catgetlocal( 162, "unable to open .init.ee for writing, no configuration saved!");
525672fcea8cSEd Schouten conf_dump_success_msg = catgetlocal( 163, "ee configuration saved in file %s");
525772fcea8cSEd Schouten modes_menu[10].item_string = catgetlocal( 164, "save editor configuration");
525872fcea8cSEd Schouten config_dump_menu[0].item_string = catgetlocal( 165, "save ee configuration");
525972fcea8cSEd Schouten config_dump_menu[1].item_string = catgetlocal( 166, "save in current directory");
526072fcea8cSEd Schouten config_dump_menu[2].item_string = catgetlocal( 167, "save in home directory");
526172fcea8cSEd Schouten conf_not_saved_msg = catgetlocal( 168, "ee configuration not saved");
526272fcea8cSEd Schouten ree_no_file_msg = catgetlocal( 169, "must specify a file when invoking ree");
526372fcea8cSEd Schouten menu_too_lrg_msg = catgetlocal( 180, "menu too large for window");
526472fcea8cSEd Schouten more_above_str = catgetlocal( 181, "^^more^^");
526572fcea8cSEd Schouten more_below_str = catgetlocal( 182, "VVmoreVV");
526672fcea8cSEd Schouten mode_strings[9] = catgetlocal( 183, "16 bit characters ");
526772fcea8cSEd Schouten chinese_cmd = catgetlocal( 184, "16BIT");
526872fcea8cSEd Schouten nochinese_cmd = catgetlocal( 185, "NO16BIT");
526972fcea8cSEd Schouten
527072fcea8cSEd Schouten commands[0] = HELP;
527172fcea8cSEd Schouten commands[1] = WRITE;
527272fcea8cSEd Schouten commands[2] = READ;
527372fcea8cSEd Schouten commands[3] = LINE;
527472fcea8cSEd Schouten commands[4] = FILE_str;
527572fcea8cSEd Schouten commands[5] = REDRAW;
527672fcea8cSEd Schouten commands[6] = RESEQUENCE;
527772fcea8cSEd Schouten commands[7] = AUTHOR;
527872fcea8cSEd Schouten commands[8] = VERSION;
527972fcea8cSEd Schouten commands[9] = CASE;
528072fcea8cSEd Schouten commands[10] = NOCASE;
528172fcea8cSEd Schouten commands[11] = EXPAND;
528272fcea8cSEd Schouten commands[12] = NOEXPAND;
528372fcea8cSEd Schouten commands[13] = Exit_string;
528472fcea8cSEd Schouten commands[14] = QUIT_string;
528572fcea8cSEd Schouten commands[15] = "<";
528672fcea8cSEd Schouten commands[16] = ">";
528772fcea8cSEd Schouten commands[17] = "!";
528872fcea8cSEd Schouten commands[18] = "0";
528972fcea8cSEd Schouten commands[19] = "1";
529072fcea8cSEd Schouten commands[20] = "2";
529172fcea8cSEd Schouten commands[21] = "3";
529272fcea8cSEd Schouten commands[22] = "4";
529372fcea8cSEd Schouten commands[23] = "5";
529472fcea8cSEd Schouten commands[24] = "6";
529572fcea8cSEd Schouten commands[25] = "7";
529672fcea8cSEd Schouten commands[26] = "8";
529772fcea8cSEd Schouten commands[27] = "9";
529872fcea8cSEd Schouten commands[28] = CHARACTER;
529972fcea8cSEd Schouten commands[29] = chinese_cmd;
530072fcea8cSEd Schouten commands[30] = nochinese_cmd;
530172fcea8cSEd Schouten commands[31] = NULL;
530272fcea8cSEd Schouten init_strings[0] = CASE;
530372fcea8cSEd Schouten init_strings[1] = NOCASE;
530472fcea8cSEd Schouten init_strings[2] = EXPAND;
530572fcea8cSEd Schouten init_strings[3] = NOEXPAND;
530672fcea8cSEd Schouten init_strings[4] = INFO;
530772fcea8cSEd Schouten init_strings[5] = NOINFO;
530872fcea8cSEd Schouten init_strings[6] = MARGINS;
530972fcea8cSEd Schouten init_strings[7] = NOMARGINS;
531072fcea8cSEd Schouten init_strings[8] = AUTOFORMAT;
531172fcea8cSEd Schouten init_strings[9] = NOAUTOFORMAT;
531272fcea8cSEd Schouten init_strings[10] = Echo;
531372fcea8cSEd Schouten init_strings[11] = PRINTCOMMAND;
531472fcea8cSEd Schouten init_strings[12] = RIGHTMARGIN;
531572fcea8cSEd Schouten init_strings[13] = HIGHLIGHT;
531672fcea8cSEd Schouten init_strings[14] = NOHIGHLIGHT;
531772fcea8cSEd Schouten init_strings[15] = EIGHTBIT;
531872fcea8cSEd Schouten init_strings[16] = NOEIGHTBIT;
531972fcea8cSEd Schouten init_strings[17] = EMACS_string;
532072fcea8cSEd Schouten init_strings[18] = NOEMACS_string;
532172fcea8cSEd Schouten init_strings[19] = chinese_cmd;
532272fcea8cSEd Schouten init_strings[20] = nochinese_cmd;
532372fcea8cSEd Schouten init_strings[21] = NULL;
532472fcea8cSEd Schouten
532572fcea8cSEd Schouten /*
532672fcea8cSEd Schouten | allocate space for strings here for settings menu
532772fcea8cSEd Schouten */
532872fcea8cSEd Schouten
532972fcea8cSEd Schouten for (counter = 1; counter < NUM_MODES_ITEMS; counter++)
533072fcea8cSEd Schouten {
533172fcea8cSEd Schouten modes_menu[counter].item_string = malloc(80);
533272fcea8cSEd Schouten }
533372fcea8cSEd Schouten
533472fcea8cSEd Schouten #ifndef NO_CATGETS
533572fcea8cSEd Schouten catclose(catalog);
533672fcea8cSEd Schouten #endif /* NO_CATGETS */
533772fcea8cSEd Schouten }
533872fcea8cSEd Schouten
5339