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 57cfe04e82SEd Schouten #include <sys/cdefs.h> 58cfe04e82SEd Schouten __FBSDID("$FreeBSD$"); 59cfe04e82SEd Schouten 6072fcea8cSEd Schouten char *ee_copyright_message = 6196b676e9SEd Schouten "Copyright (c) 1986, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 2009 Hugh Mahon "; 6272fcea8cSEd Schouten 6396b676e9SEd Schouten #include "ee_version.h" 6472fcea8cSEd Schouten 657bf1ea96SEd Schouten char *version = "@(#) ee, version " EE_VERSION " $Revision: 1.104 $"; 6672fcea8cSEd Schouten 6772fcea8cSEd Schouten #ifdef NCURSE 6872fcea8cSEd Schouten #include "new_curse.h" 69cfe04e82SEd Schouten #elif HAS_NCURSES 70cfe04e82SEd Schouten #include <ncurses.h> 7172fcea8cSEd Schouten #else 7272fcea8cSEd Schouten #include <curses.h> 7372fcea8cSEd Schouten #endif 7472fcea8cSEd Schouten 7572fcea8cSEd Schouten #include <ctype.h> 76cfe04e82SEd Schouten #include <signal.h> 7796b676e9SEd Schouten #include <fcntl.h> 78cfe04e82SEd Schouten #include <sys/types.h> 79cfe04e82SEd Schouten #include <sys/stat.h> 8096b676e9SEd Schouten #include <errno.h> 8196b676e9SEd Schouten #include <string.h> 8296b676e9SEd Schouten #include <pwd.h> 83db07ef76SAndrey A. Chernov #include <locale.h> 8496b676e9SEd Schouten 85cfe04e82SEd Schouten #ifdef HAS_SYS_WAIT 86cfe04e82SEd Schouten #include <sys/wait.h> 87cfe04e82SEd Schouten #endif 8896b676e9SEd Schouten 89cfe04e82SEd Schouten #ifdef HAS_STDLIB 90cfe04e82SEd Schouten #include <stdlib.h> 91cfe04e82SEd Schouten #endif 9296b676e9SEd Schouten 9396b676e9SEd Schouten #ifdef HAS_STDARG 9496b676e9SEd Schouten #include <stdarg.h> 9596b676e9SEd Schouten #endif 9696b676e9SEd Schouten 97cfe04e82SEd Schouten #ifdef HAS_UNISTD 98cfe04e82SEd Schouten #include <unistd.h> 99cfe04e82SEd Schouten #endif 10072fcea8cSEd Schouten 10172fcea8cSEd Schouten #ifndef NO_CATGETS 10272fcea8cSEd Schouten #include <nl_types.h> 10372fcea8cSEd Schouten 10472fcea8cSEd Schouten nl_catd catalog; 10572fcea8cSEd Schouten #else 10672fcea8cSEd Schouten #define catgetlocal(a, b) (b) 10772fcea8cSEd Schouten #endif /* NO_CATGETS */ 10872fcea8cSEd Schouten 10972fcea8cSEd Schouten #ifndef SIGCHLD 11072fcea8cSEd Schouten #define SIGCHLD SIGCLD 11172fcea8cSEd Schouten #endif 11272fcea8cSEd Schouten 11372fcea8cSEd Schouten #define TAB 9 11472fcea8cSEd Schouten #define max(a, b) (a > b ? a : b) 11572fcea8cSEd Schouten #define min(a, b) (a < b ? a : b) 11672fcea8cSEd Schouten 11772fcea8cSEd Schouten /* 11872fcea8cSEd Schouten | defines for type of data to show in info window 11972fcea8cSEd Schouten */ 12072fcea8cSEd Schouten 12172fcea8cSEd Schouten #define CONTROL_KEYS 1 12272fcea8cSEd Schouten #define COMMANDS 2 12372fcea8cSEd Schouten 12472fcea8cSEd Schouten struct text { 12572fcea8cSEd Schouten unsigned char *line; /* line of characters */ 12672fcea8cSEd Schouten int line_number; /* line number */ 12772fcea8cSEd Schouten int line_length; /* actual number of characters in the line */ 12872fcea8cSEd Schouten int max_length; /* maximum number of characters the line handles */ 12972fcea8cSEd Schouten struct text *next_line; /* next line of text */ 13072fcea8cSEd Schouten struct text *prev_line; /* previous line of text */ 13172fcea8cSEd Schouten }; 13272fcea8cSEd Schouten 13372fcea8cSEd Schouten struct text *first_line; /* first line of current buffer */ 13472fcea8cSEd Schouten struct text *dlt_line; /* structure for info on deleted line */ 13572fcea8cSEd Schouten struct text *curr_line; /* current line cursor is on */ 13672fcea8cSEd Schouten struct text *tmp_line; /* temporary line pointer */ 13772fcea8cSEd Schouten struct text *srch_line; /* temporary pointer for search routine */ 13872fcea8cSEd Schouten 13972fcea8cSEd Schouten struct files { /* structure to store names of files to be edited*/ 14072fcea8cSEd Schouten unsigned char *name; /* name of file */ 14172fcea8cSEd Schouten struct files *next_name; 14272fcea8cSEd Schouten }; 14372fcea8cSEd Schouten 14472fcea8cSEd Schouten struct files *top_of_stack = NULL; 14572fcea8cSEd Schouten 14672fcea8cSEd Schouten int d_wrd_len; /* length of deleted word */ 14772fcea8cSEd Schouten int position; /* offset in bytes from begin of line */ 14872fcea8cSEd Schouten int scr_pos; /* horizontal position */ 14972fcea8cSEd Schouten int scr_vert; /* vertical position on screen */ 15072fcea8cSEd Schouten int scr_horz; /* horizontal position on screen */ 15196b676e9SEd Schouten int absolute_lin; /* number of lines from top */ 15272fcea8cSEd Schouten int tmp_vert, tmp_horz; 15372fcea8cSEd Schouten int input_file; /* indicate to read input file */ 15472fcea8cSEd Schouten int recv_file; /* indicate reading a file */ 15572fcea8cSEd Schouten int edit; /* continue executing while true */ 15672fcea8cSEd Schouten int gold; /* 'gold' function key pressed */ 15772fcea8cSEd Schouten int fildes; /* file descriptor */ 15872fcea8cSEd Schouten int case_sen; /* case sensitive search flag */ 15972fcea8cSEd Schouten int last_line; /* last line for text display */ 16072fcea8cSEd Schouten int last_col; /* last column for text display */ 16172fcea8cSEd Schouten int horiz_offset = 0; /* offset from left edge of text */ 16272fcea8cSEd Schouten int clear_com_win; /* flag to indicate com_win needs clearing */ 16372fcea8cSEd Schouten int text_changes = FALSE; /* indicate changes have been made to text */ 16472fcea8cSEd Schouten int get_fd; /* file descriptor for reading a file */ 16572fcea8cSEd Schouten int info_window = TRUE; /* flag to indicate if help window visible */ 16672fcea8cSEd Schouten int info_type = CONTROL_KEYS; /* flag to indicate type of info to display */ 16772fcea8cSEd Schouten int expand_tabs = TRUE; /* flag for expanding tabs */ 16872fcea8cSEd Schouten int right_margin = 0; /* the right margin */ 16972fcea8cSEd Schouten int observ_margins = TRUE; /* flag for whether margins are observed */ 17072fcea8cSEd Schouten int shell_fork; 17172fcea8cSEd Schouten int temp_stdin; /* temporary storage for stdin */ 17272fcea8cSEd Schouten int temp_stdout; /* temp storage for stdout descriptor */ 17372fcea8cSEd Schouten int temp_stderr; /* temp storage for stderr descriptor */ 17472fcea8cSEd Schouten int pipe_out[2]; /* pipe file desc for output */ 17572fcea8cSEd Schouten int pipe_in[2]; /* pipe file descriptors for input */ 17672fcea8cSEd Schouten int out_pipe; /* flag that info is piped out */ 17772fcea8cSEd Schouten int in_pipe; /* flag that info is piped in */ 17872fcea8cSEd Schouten int formatted = FALSE; /* flag indicating paragraph formatted */ 17972fcea8cSEd Schouten int auto_format = FALSE; /* flag for auto_format mode */ 18072fcea8cSEd Schouten int restricted = FALSE; /* flag to indicate restricted mode */ 18172fcea8cSEd Schouten int nohighlight = FALSE; /* turns off highlighting */ 18272fcea8cSEd Schouten int eightbit = TRUE; /* eight bit character flag */ 18372fcea8cSEd Schouten int local_LINES = 0; /* copy of LINES, to detect when win resizes */ 18472fcea8cSEd Schouten int local_COLS = 0; /* copy of COLS, to detect when win resizes */ 18572fcea8cSEd Schouten int curses_initialized = FALSE; /* flag indicating if curses has been started*/ 18672fcea8cSEd Schouten int emacs_keys_mode = FALSE; /* mode for if emacs key binings are used */ 18772fcea8cSEd Schouten int ee_chinese = FALSE; /* allows handling of multi-byte characters */ 18872fcea8cSEd Schouten /* by checking for high bit in a byte the */ 18972fcea8cSEd Schouten /* code recognizes a two-byte character */ 19072fcea8cSEd Schouten /* sequence */ 19172fcea8cSEd Schouten 19272fcea8cSEd Schouten unsigned char *point; /* points to current position in line */ 19372fcea8cSEd Schouten unsigned char *srch_str; /* pointer for search string */ 19472fcea8cSEd Schouten unsigned char *u_srch_str; /* pointer to non-case sensitive search */ 19572fcea8cSEd Schouten unsigned char *srch_1; /* pointer to start of suspect string */ 19672fcea8cSEd Schouten unsigned char *srch_2; /* pointer to next character of string */ 19772fcea8cSEd Schouten unsigned char *srch_3; 19872fcea8cSEd Schouten unsigned char *in_file_name = NULL; /* name of input file */ 19972fcea8cSEd Schouten char *tmp_file; /* temporary file name */ 20072fcea8cSEd Schouten unsigned char *d_char; /* deleted character */ 20172fcea8cSEd Schouten unsigned char *d_word; /* deleted word */ 20272fcea8cSEd Schouten unsigned char *d_line; /* deleted line */ 20372fcea8cSEd Schouten char in_string[513]; /* buffer for reading a file */ 20496b676e9SEd Schouten unsigned char *print_command = (unsigned char *)"lpr"; /* string to use for the print command */ 20572fcea8cSEd Schouten unsigned char *start_at_line = NULL; /* move to this line at start of session*/ 20672fcea8cSEd Schouten int in; /* input character */ 20772fcea8cSEd Schouten 20872fcea8cSEd Schouten FILE *temp_fp; /* temporary file pointer */ 20972fcea8cSEd Schouten FILE *bit_bucket; /* file pointer to /dev/null */ 21072fcea8cSEd Schouten 21172fcea8cSEd Schouten char *table[] = { 21272fcea8cSEd Schouten "^@", "^A", "^B", "^C", "^D", "^E", "^F", "^G", "^H", "\t", "^J", 21372fcea8cSEd Schouten "^K", "^L", "^M", "^N", "^O", "^P", "^Q", "^R", "^S", "^T", "^U", 21472fcea8cSEd Schouten "^V", "^W", "^X", "^Y", "^Z", "^[", "^\\", "^]", "^^", "^_" 21572fcea8cSEd Schouten }; 21672fcea8cSEd Schouten 21772fcea8cSEd Schouten WINDOW *com_win; 21872fcea8cSEd Schouten WINDOW *text_win; 21972fcea8cSEd Schouten WINDOW *help_win; 22072fcea8cSEd Schouten WINDOW *info_win; 22172fcea8cSEd Schouten 22272fcea8cSEd Schouten #if defined(__STDC__) || defined(__cplusplus) 22372fcea8cSEd Schouten #define P_(s) s 22472fcea8cSEd Schouten #else 22572fcea8cSEd Schouten #define P_(s) () 22672fcea8cSEd Schouten #endif 22772fcea8cSEd Schouten 22872fcea8cSEd Schouten 22972fcea8cSEd Schouten /* 23072fcea8cSEd Schouten | The following structure allows menu items to be flexibly declared. 23172fcea8cSEd Schouten | The first item is the string describing the selection, the second 23272fcea8cSEd Schouten | is the address of the procedure to call when the item is selected, 23372fcea8cSEd Schouten | and the third is the argument for the procedure. 23472fcea8cSEd Schouten | 23572fcea8cSEd Schouten | For those systems with i18n, the string should be accompanied by a 23672fcea8cSEd Schouten | catalog number. The 'int *' should be replaced with 'void *' on 23772fcea8cSEd Schouten | systems with that type. 23872fcea8cSEd Schouten | 23972fcea8cSEd Schouten | The first menu item will be the title of the menu, with NULL 24072fcea8cSEd Schouten | parameters for the procedure and argument, followed by the menu items. 24172fcea8cSEd Schouten | 24272fcea8cSEd Schouten | If the procedure value is NULL, the menu item is displayed, but no 24372fcea8cSEd Schouten | procedure is called when the item is selected. The number of the 24472fcea8cSEd Schouten | item will be returned. If the third (argument) parameter is -1, no 24572fcea8cSEd Schouten | argument is given to the procedure when it is called. 24672fcea8cSEd Schouten */ 24772fcea8cSEd Schouten 24872fcea8cSEd Schouten struct menu_entries { 24972fcea8cSEd Schouten char *item_string; 25072fcea8cSEd Schouten int (*procedure)P_((struct menu_entries *)); 25172fcea8cSEd Schouten struct menu_entries *ptr_argument; 25272fcea8cSEd Schouten int (*iprocedure)P_((int)); 25372fcea8cSEd Schouten void (*nprocedure)P_((void)); 25472fcea8cSEd Schouten int argument; 25572fcea8cSEd Schouten }; 25672fcea8cSEd Schouten 25772fcea8cSEd Schouten int main P_((int argc, char *argv[])); 25872fcea8cSEd Schouten unsigned char *resiz_line P_((int factor, struct text *rline, int rpos)); 25972fcea8cSEd Schouten void insert P_((int character)); 26072fcea8cSEd Schouten void delete P_((int disp)); 26172fcea8cSEd Schouten void scanline P_((unsigned char *pos)); 26272fcea8cSEd Schouten int tabshift P_((int temp_int)); 26372fcea8cSEd Schouten int out_char P_((WINDOW *window, int character, int column)); 26472fcea8cSEd Schouten int len_char P_((int character, int column)); 26572fcea8cSEd Schouten void draw_line P_((int vertical, int horiz, unsigned char *ptr, int t_pos, int length)); 26672fcea8cSEd Schouten void insert_line P_((int disp)); 26772fcea8cSEd Schouten struct text *txtalloc P_((void)); 26872fcea8cSEd Schouten struct files *name_alloc P_((void)); 26972fcea8cSEd Schouten unsigned char *next_word P_((unsigned char *string)); 27072fcea8cSEd Schouten void prev_word P_((void)); 27172fcea8cSEd Schouten void control P_((void)); 27272fcea8cSEd Schouten void emacs_control P_((void)); 27372fcea8cSEd Schouten void bottom P_((void)); 27472fcea8cSEd Schouten void top P_((void)); 27572fcea8cSEd Schouten void nextline P_((void)); 27672fcea8cSEd Schouten void prevline P_((void)); 27772fcea8cSEd Schouten void left P_((int disp)); 27872fcea8cSEd Schouten void right P_((int disp)); 27972fcea8cSEd Schouten void find_pos P_((void)); 28072fcea8cSEd Schouten void up P_((void)); 28172fcea8cSEd Schouten void down P_((void)); 28272fcea8cSEd Schouten void function_key P_((void)); 28372fcea8cSEd Schouten void print_buffer P_((void)); 28472fcea8cSEd Schouten void command_prompt P_((void)); 28572fcea8cSEd Schouten void command P_((char *cmd_str1)); 28672fcea8cSEd Schouten int scan P_((char *line, int offset, int column)); 28772fcea8cSEd Schouten char *get_string P_((char *prompt, int advance)); 28872fcea8cSEd Schouten int compare P_((char *string1, char *string2, int sensitive)); 28972fcea8cSEd Schouten void goto_line P_((char *cmd_str)); 29072fcea8cSEd Schouten void midscreen P_((int line, unsigned char *pnt)); 29172fcea8cSEd Schouten void get_options P_((int numargs, char *arguments[])); 29272fcea8cSEd Schouten void check_fp P_((void)); 29372fcea8cSEd Schouten void get_file P_((char *file_name)); 29472fcea8cSEd Schouten void get_line P_((int length, unsigned char *in_string, int *append)); 29572fcea8cSEd Schouten void draw_screen P_((void)); 29672fcea8cSEd Schouten void finish P_((void)); 29772fcea8cSEd Schouten int quit P_((int noverify)); 29872fcea8cSEd Schouten void edit_abort P_((int arg)); 29972fcea8cSEd Schouten void delete_text P_((void)); 300cfe04e82SEd Schouten int write_file P_((char *file_name, int warn_if_exists)); 30172fcea8cSEd Schouten int search P_((int display_message)); 30272fcea8cSEd Schouten void search_prompt P_((void)); 30372fcea8cSEd Schouten void del_char P_((void)); 30472fcea8cSEd Schouten void undel_char P_((void)); 30572fcea8cSEd Schouten void del_word P_((void)); 30672fcea8cSEd Schouten void undel_word P_((void)); 30772fcea8cSEd Schouten void del_line P_((void)); 30872fcea8cSEd Schouten void undel_line P_((void)); 30972fcea8cSEd Schouten void adv_word P_((void)); 3108f04da68SDimitry Andric void move_rel P_((int direction, int lines)); 31172fcea8cSEd Schouten void eol P_((void)); 31272fcea8cSEd Schouten void bol P_((void)); 31372fcea8cSEd Schouten void adv_line P_((void)); 31472fcea8cSEd Schouten void sh_command P_((char *string)); 31572fcea8cSEd Schouten void set_up_term P_((void)); 31672fcea8cSEd Schouten void resize_check P_((void)); 31772fcea8cSEd Schouten int menu_op P_((struct menu_entries *)); 31872fcea8cSEd Schouten void paint_menu P_((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)); 31972fcea8cSEd Schouten void help P_((void)); 32072fcea8cSEd Schouten void paint_info_win P_((void)); 32172fcea8cSEd Schouten void no_info_window P_((void)); 32272fcea8cSEd Schouten void create_info_window P_((void)); 32372fcea8cSEd Schouten int file_op P_((int arg)); 32472fcea8cSEd Schouten void shell_op P_((void)); 32572fcea8cSEd Schouten void leave_op P_((void)); 32672fcea8cSEd Schouten void redraw P_((void)); 32772fcea8cSEd Schouten int Blank_Line P_((struct text *test_line)); 32872fcea8cSEd Schouten void Format P_((void)); 32972fcea8cSEd Schouten void ee_init P_((void)); 33072fcea8cSEd Schouten void dump_ee_conf P_((void)); 33172fcea8cSEd Schouten void echo_string P_((char *string)); 33272fcea8cSEd Schouten void spell_op P_((void)); 33372fcea8cSEd Schouten void ispell_op P_((void)); 33472fcea8cSEd Schouten int first_word_len P_((struct text *test_line)); 33572fcea8cSEd Schouten void Auto_Format P_((void)); 33672fcea8cSEd Schouten void modes_op P_((void)); 33772fcea8cSEd Schouten char *is_in_string P_((char *string, char *substring)); 33872fcea8cSEd Schouten char *resolve_name P_((char *name)); 33972fcea8cSEd Schouten int restrict_mode P_((void)); 34072fcea8cSEd Schouten int unique_test P_((char *string, char *list[])); 34172fcea8cSEd Schouten void strings_init P_((void)); 34272fcea8cSEd Schouten 34372fcea8cSEd Schouten #undef P_ 34472fcea8cSEd Schouten /* 34572fcea8cSEd Schouten | allocate space here for the strings that will be in the menu 34672fcea8cSEd Schouten */ 34772fcea8cSEd Schouten 34872fcea8cSEd Schouten struct menu_entries modes_menu[] = { 34972fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, 0}, /* title */ 35072fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 1. tabs to spaces */ 35172fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 2. case sensitive search*/ 35272fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 3. margins observed */ 35372fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 4. auto-paragraph */ 35472fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 5. eightbit characters*/ 35572fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 6. info window */ 35672fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 7. emacs key bindings*/ 35772fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 8. right margin */ 35872fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, /* 9. chinese text */ 35972fcea8cSEd Schouten {"", NULL, NULL, NULL, dump_ee_conf, -1}, /* 10. save editor config */ 36072fcea8cSEd Schouten {NULL, NULL, NULL, NULL, NULL, -1} /* terminator */ 36172fcea8cSEd Schouten }; 36272fcea8cSEd Schouten 36372fcea8cSEd Schouten char *mode_strings[11]; 36472fcea8cSEd Schouten 36572fcea8cSEd Schouten #define NUM_MODES_ITEMS 10 36672fcea8cSEd Schouten 36772fcea8cSEd Schouten struct menu_entries config_dump_menu[] = { 36872fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, 0}, 36972fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, 37072fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, 37172fcea8cSEd Schouten {NULL, NULL, NULL, NULL, NULL, -1} 37272fcea8cSEd Schouten }; 37372fcea8cSEd Schouten 37472fcea8cSEd Schouten struct menu_entries leave_menu[] = { 37572fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, 37672fcea8cSEd Schouten {"", NULL, NULL, NULL, finish, -1}, 37772fcea8cSEd Schouten {"", NULL, NULL, quit, NULL, TRUE}, 37872fcea8cSEd Schouten {NULL, NULL, NULL, NULL, NULL, -1} 37972fcea8cSEd Schouten }; 38072fcea8cSEd Schouten 38172fcea8cSEd Schouten #define READ_FILE 1 38272fcea8cSEd Schouten #define WRITE_FILE 2 38372fcea8cSEd Schouten #define SAVE_FILE 3 38472fcea8cSEd Schouten 38572fcea8cSEd Schouten struct menu_entries file_menu[] = { 38672fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, 38772fcea8cSEd Schouten {"", NULL, NULL, file_op, NULL, READ_FILE}, 38872fcea8cSEd Schouten {"", NULL, NULL, file_op, NULL, WRITE_FILE}, 38972fcea8cSEd Schouten {"", NULL, NULL, file_op, NULL, SAVE_FILE}, 39072fcea8cSEd Schouten {"", NULL, NULL, NULL, print_buffer, -1}, 39172fcea8cSEd Schouten {NULL, NULL, NULL, NULL, NULL, -1} 39272fcea8cSEd Schouten }; 39372fcea8cSEd Schouten 39472fcea8cSEd Schouten struct menu_entries search_menu[] = { 39572fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, 0}, 39672fcea8cSEd Schouten {"", NULL, NULL, NULL, search_prompt, -1}, 39772fcea8cSEd Schouten {"", NULL, NULL, search, NULL, TRUE}, 39872fcea8cSEd Schouten {NULL, NULL, NULL, NULL, NULL, -1} 39972fcea8cSEd Schouten }; 40072fcea8cSEd Schouten 40172fcea8cSEd Schouten struct menu_entries spell_menu[] = { 40272fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, 40372fcea8cSEd Schouten {"", NULL, NULL, NULL, spell_op, -1}, 40472fcea8cSEd Schouten {"", NULL, NULL, NULL, ispell_op, -1}, 40572fcea8cSEd Schouten {NULL, NULL, NULL, NULL, NULL, -1} 40672fcea8cSEd Schouten }; 40772fcea8cSEd Schouten 40872fcea8cSEd Schouten struct menu_entries misc_menu[] = { 40972fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, 41072fcea8cSEd Schouten {"", NULL, NULL, NULL, Format, -1}, 41172fcea8cSEd Schouten {"", NULL, NULL, NULL, shell_op, -1}, 41272fcea8cSEd Schouten {"", menu_op, spell_menu, NULL, NULL, -1}, 41372fcea8cSEd Schouten {NULL, NULL, NULL, NULL, NULL, -1} 41472fcea8cSEd Schouten }; 41572fcea8cSEd Schouten 41672fcea8cSEd Schouten struct menu_entries main_menu[] = { 41772fcea8cSEd Schouten {"", NULL, NULL, NULL, NULL, -1}, 41872fcea8cSEd Schouten {"", NULL, NULL, NULL, leave_op, -1}, 41972fcea8cSEd Schouten {"", NULL, NULL, NULL, help, -1}, 42072fcea8cSEd Schouten {"", menu_op, file_menu, NULL, NULL, -1}, 42172fcea8cSEd Schouten {"", NULL, NULL, NULL, redraw, -1}, 42272fcea8cSEd Schouten {"", NULL, NULL, NULL, modes_op, -1}, 42372fcea8cSEd Schouten {"", menu_op, search_menu, NULL, NULL, -1}, 42472fcea8cSEd Schouten {"", menu_op, misc_menu, NULL, NULL, -1}, 42572fcea8cSEd Schouten {NULL, NULL, NULL, NULL, NULL, -1} 42672fcea8cSEd Schouten }; 42772fcea8cSEd Schouten 42872fcea8cSEd Schouten char *help_text[23]; 42972fcea8cSEd Schouten char *control_keys[5]; 43072fcea8cSEd Schouten 43172fcea8cSEd Schouten char *emacs_help_text[22]; 43272fcea8cSEd Schouten char *emacs_control_keys[5]; 43372fcea8cSEd Schouten 43472fcea8cSEd Schouten char *command_strings[5]; 43572fcea8cSEd Schouten char *commands[32]; 43672fcea8cSEd Schouten char *init_strings[22]; 43772fcea8cSEd Schouten 43872fcea8cSEd Schouten #define MENU_WARN 1 43972fcea8cSEd Schouten 44072fcea8cSEd Schouten #define max_alpha_char 36 44172fcea8cSEd Schouten 44272fcea8cSEd Schouten /* 44372fcea8cSEd Schouten | Declarations for strings for localization 44472fcea8cSEd Schouten */ 44572fcea8cSEd Schouten 44672fcea8cSEd Schouten char *com_win_message; /* to be shown in com_win if no info window */ 44772fcea8cSEd Schouten char *no_file_string; 44872fcea8cSEd Schouten char *ascii_code_str; 44972fcea8cSEd Schouten char *printer_msg_str; 45072fcea8cSEd Schouten char *command_str; 45172fcea8cSEd Schouten char *file_write_prompt_str; 45272fcea8cSEd Schouten char *file_read_prompt_str; 45372fcea8cSEd Schouten char *char_str; 45472fcea8cSEd Schouten char *unkn_cmd_str; 45572fcea8cSEd Schouten char *non_unique_cmd_msg; 45672fcea8cSEd Schouten char *line_num_str; 45772fcea8cSEd Schouten char *line_len_str; 45872fcea8cSEd Schouten char *current_file_str; 45972fcea8cSEd Schouten char *usage0; 46072fcea8cSEd Schouten char *usage1; 46172fcea8cSEd Schouten char *usage2; 46272fcea8cSEd Schouten char *usage3; 46372fcea8cSEd Schouten char *usage4; 46472fcea8cSEd Schouten char *file_is_dir_msg; 46572fcea8cSEd Schouten char *new_file_msg; 46672fcea8cSEd Schouten char *cant_open_msg; 46772fcea8cSEd Schouten char *open_file_msg; 46872fcea8cSEd Schouten char *file_read_fin_msg; 46972fcea8cSEd Schouten char *reading_file_msg; 47072fcea8cSEd Schouten char *read_only_msg; 47172fcea8cSEd Schouten char *file_read_lines_msg; 47272fcea8cSEd Schouten char *save_file_name_prompt; 47372fcea8cSEd Schouten char *file_not_saved_msg; 47472fcea8cSEd Schouten char *changes_made_prompt; 47572fcea8cSEd Schouten char *yes_char; 47672fcea8cSEd Schouten char *file_exists_prompt; 47772fcea8cSEd Schouten char *create_file_fail_msg; 47872fcea8cSEd Schouten char *writing_file_msg; 47972fcea8cSEd Schouten char *file_written_msg; 48072fcea8cSEd Schouten char *searching_msg; 48172fcea8cSEd Schouten char *str_not_found_msg; 48272fcea8cSEd Schouten char *search_prompt_str; 48372fcea8cSEd Schouten char *exec_err_msg; 48472fcea8cSEd Schouten char *continue_msg; 48572fcea8cSEd Schouten char *menu_cancel_msg; 48672fcea8cSEd Schouten char *menu_size_err_msg; 48772fcea8cSEd Schouten char *press_any_key_msg; 48872fcea8cSEd Schouten char *shell_prompt; 48972fcea8cSEd Schouten char *formatting_msg; 49072fcea8cSEd Schouten char *shell_echo_msg; 49172fcea8cSEd Schouten char *spell_in_prog_msg; 49272fcea8cSEd Schouten char *margin_prompt; 49372fcea8cSEd Schouten char *restricted_msg; 49472fcea8cSEd Schouten char *ON; 49572fcea8cSEd Schouten char *OFF; 49672fcea8cSEd Schouten char *HELP; 49772fcea8cSEd Schouten char *WRITE; 49872fcea8cSEd Schouten char *READ; 49972fcea8cSEd Schouten char *LINE; 50072fcea8cSEd Schouten char *FILE_str; 50172fcea8cSEd Schouten char *CHARACTER; 50272fcea8cSEd Schouten char *REDRAW; 50372fcea8cSEd Schouten char *RESEQUENCE; 50472fcea8cSEd Schouten char *AUTHOR; 50572fcea8cSEd Schouten char *VERSION; 50672fcea8cSEd Schouten char *CASE; 50772fcea8cSEd Schouten char *NOCASE; 50872fcea8cSEd Schouten char *EXPAND; 50972fcea8cSEd Schouten char *NOEXPAND; 51072fcea8cSEd Schouten char *Exit_string; 51172fcea8cSEd Schouten char *QUIT_string; 51272fcea8cSEd Schouten char *INFO; 51372fcea8cSEd Schouten char *NOINFO; 51472fcea8cSEd Schouten char *MARGINS; 51572fcea8cSEd Schouten char *NOMARGINS; 51672fcea8cSEd Schouten char *AUTOFORMAT; 51772fcea8cSEd Schouten char *NOAUTOFORMAT; 51872fcea8cSEd Schouten char *Echo; 51972fcea8cSEd Schouten char *PRINTCOMMAND; 52072fcea8cSEd Schouten char *RIGHTMARGIN; 52172fcea8cSEd Schouten char *HIGHLIGHT; 52272fcea8cSEd Schouten char *NOHIGHLIGHT; 52372fcea8cSEd Schouten char *EIGHTBIT; 52472fcea8cSEd Schouten char *NOEIGHTBIT; 52572fcea8cSEd Schouten char *EMACS_string; 52672fcea8cSEd Schouten char *NOEMACS_string; 52772fcea8cSEd Schouten char *conf_dump_err_msg; 52872fcea8cSEd Schouten char *conf_dump_success_msg; 52972fcea8cSEd Schouten char *conf_not_saved_msg; 53072fcea8cSEd Schouten char *ree_no_file_msg; 53172fcea8cSEd Schouten char *cancel_string; 53272fcea8cSEd Schouten char *menu_too_lrg_msg; 53372fcea8cSEd Schouten char *more_above_str, *more_below_str; 53496b676e9SEd Schouten char *separator = "==============================================================================="; 53572fcea8cSEd Schouten 53672fcea8cSEd Schouten char *chinese_cmd, *nochinese_cmd; 53772fcea8cSEd Schouten 53896b676e9SEd Schouten #ifndef __STDC__ 53996b676e9SEd Schouten #ifndef HAS_STDLIB 54096b676e9SEd Schouten extern char *malloc(); 54196b676e9SEd Schouten extern char *realloc(); 54296b676e9SEd Schouten extern char *getenv(); 54396b676e9SEd Schouten FILE *fopen(); /* declaration for open function */ 54496b676e9SEd Schouten #endif /* HAS_STDLIB */ 54596b676e9SEd Schouten #endif /* __STDC__ */ 54672fcea8cSEd Schouten 54772fcea8cSEd Schouten int 54872fcea8cSEd Schouten main(argc, argv) /* beginning of main program */ 54972fcea8cSEd Schouten int argc; 55072fcea8cSEd Schouten char *argv[]; 55172fcea8cSEd Schouten { 55296b676e9SEd Schouten int counter; 55396b676e9SEd Schouten 55496b676e9SEd Schouten for (counter = 1; counter < 24; counter++) 55596b676e9SEd Schouten signal(counter, SIG_IGN); 55672fcea8cSEd Schouten 557*0cb61a32SYuri Pankov /* Always read from (and write to) a terminal. */ 558*0cb61a32SYuri Pankov if (!isatty(STDIN_FILENO) || !isatty(STDOUT_FILENO)) { 559*0cb61a32SYuri Pankov fprintf(stderr, 560*0cb61a32SYuri Pankov "ee's standard input and output must be a terminal\n"); 561*0cb61a32SYuri Pankov exit(1); 562*0cb61a32SYuri Pankov } 563*0cb61a32SYuri Pankov 56472fcea8cSEd Schouten signal(SIGCHLD, SIG_DFL); 56572fcea8cSEd Schouten signal(SIGSEGV, SIG_DFL); 56672fcea8cSEd Schouten signal(SIGINT, edit_abort); 56772fcea8cSEd Schouten d_char = malloc(3); /* provide a buffer for multi-byte chars */ 56872fcea8cSEd Schouten d_word = malloc(150); 56996b676e9SEd Schouten *d_word = '\0'; 57072fcea8cSEd Schouten d_line = NULL; 57172fcea8cSEd Schouten dlt_line = txtalloc(); 57272fcea8cSEd Schouten dlt_line->line = d_line; 57372fcea8cSEd Schouten dlt_line->line_length = 0; 57472fcea8cSEd Schouten curr_line = first_line = txtalloc(); 57572fcea8cSEd Schouten curr_line->line = point = malloc(10); 57672fcea8cSEd Schouten curr_line->line_length = 1; 57772fcea8cSEd Schouten curr_line->max_length = 10; 57872fcea8cSEd Schouten curr_line->prev_line = NULL; 57972fcea8cSEd Schouten curr_line->next_line = NULL; 58072fcea8cSEd Schouten curr_line->line_number = 1; 58172fcea8cSEd Schouten srch_str = NULL; 58272fcea8cSEd Schouten u_srch_str = NULL; 58372fcea8cSEd Schouten position = 1; 58472fcea8cSEd Schouten scr_pos =0; 58572fcea8cSEd Schouten scr_vert = 0; 58672fcea8cSEd Schouten scr_horz = 0; 58796b676e9SEd Schouten absolute_lin = 1; 58896b676e9SEd Schouten bit_bucket = fopen("/dev/null", "w"); 58972fcea8cSEd Schouten edit = TRUE; 59072fcea8cSEd Schouten gold = case_sen = FALSE; 59172fcea8cSEd Schouten shell_fork = TRUE; 59272fcea8cSEd Schouten strings_init(); 59372fcea8cSEd Schouten ee_init(); 59472fcea8cSEd Schouten if (argc > 0 ) 59572fcea8cSEd Schouten get_options(argc, argv); 59672fcea8cSEd Schouten set_up_term(); 59772fcea8cSEd Schouten if (right_margin == 0) 59872fcea8cSEd Schouten right_margin = COLS - 1; 59972fcea8cSEd Schouten if (top_of_stack == NULL) 60072fcea8cSEd Schouten { 60172fcea8cSEd Schouten if (restrict_mode()) 60272fcea8cSEd Schouten { 60372fcea8cSEd Schouten wmove(com_win, 0, 0); 60472fcea8cSEd Schouten werase(com_win); 60572fcea8cSEd Schouten wprintw(com_win, ree_no_file_msg); 60672fcea8cSEd Schouten wrefresh(com_win); 60772fcea8cSEd Schouten edit_abort(0); 60872fcea8cSEd Schouten } 60972fcea8cSEd Schouten wprintw(com_win, no_file_string); 61072fcea8cSEd Schouten wrefresh(com_win); 61172fcea8cSEd Schouten } 61272fcea8cSEd Schouten else 61372fcea8cSEd Schouten check_fp(); 61472fcea8cSEd Schouten 61572fcea8cSEd Schouten clear_com_win = TRUE; 61672fcea8cSEd Schouten 61796b676e9SEd Schouten counter = 0; 61896b676e9SEd Schouten 61972fcea8cSEd Schouten while(edit) 62072fcea8cSEd Schouten { 62196b676e9SEd Schouten /* 62296b676e9SEd Schouten | display line and column information 62396b676e9SEd Schouten */ 624cfe04e82SEd Schouten if (info_window) 625cfe04e82SEd Schouten { 626cfe04e82SEd Schouten if (!nohighlight) 62796b676e9SEd Schouten wstandout(info_win); 62896b676e9SEd Schouten wmove(info_win, 5, 0); 62996b676e9SEd Schouten wprintw(info_win, separator); 63096b676e9SEd Schouten wmove(info_win, 5, 5); 63196b676e9SEd Schouten wprintw(info_win, "line %d col %d lines from top %d ", 63296b676e9SEd Schouten curr_line->line_number, scr_horz, absolute_lin); 63396b676e9SEd Schouten wstandend(info_win); 63496b676e9SEd Schouten wrefresh(info_win); 635cfe04e82SEd Schouten } 636cfe04e82SEd Schouten 63796b676e9SEd Schouten wrefresh(text_win); 63872fcea8cSEd Schouten in = wgetch(text_win); 63972fcea8cSEd Schouten if (in == -1) 64096b676e9SEd Schouten exit(0); /* without this exit ee will go into an 64196b676e9SEd Schouten infinite loop if the network 64296b676e9SEd Schouten session detaches */ 64372fcea8cSEd Schouten 64472fcea8cSEd Schouten resize_check(); 64572fcea8cSEd Schouten 64672fcea8cSEd Schouten if (clear_com_win) 64772fcea8cSEd Schouten { 64872fcea8cSEd Schouten clear_com_win = FALSE; 64972fcea8cSEd Schouten wmove(com_win, 0, 0); 65072fcea8cSEd Schouten werase(com_win); 65172fcea8cSEd Schouten if (!info_window) 65272fcea8cSEd Schouten { 65372fcea8cSEd Schouten wprintw(com_win, "%s", com_win_message); 65472fcea8cSEd Schouten } 65572fcea8cSEd Schouten wrefresh(com_win); 65672fcea8cSEd Schouten } 65772fcea8cSEd Schouten 65872fcea8cSEd Schouten if (in > 255) 65972fcea8cSEd Schouten function_key(); 66072fcea8cSEd Schouten else if ((in == '\10') || (in == 127)) 66172fcea8cSEd Schouten { 66272fcea8cSEd Schouten in = 8; /* make sure key is set to backspace */ 66372fcea8cSEd Schouten delete(TRUE); 66472fcea8cSEd Schouten } 66572fcea8cSEd Schouten else if ((in > 31) || (in == 9)) 66672fcea8cSEd Schouten insert(in); 66772fcea8cSEd Schouten else if ((in >= 0) && (in <= 31)) 66872fcea8cSEd Schouten { 66972fcea8cSEd Schouten if (emacs_keys_mode) 67072fcea8cSEd Schouten emacs_control(); 67172fcea8cSEd Schouten else 67272fcea8cSEd Schouten control(); 67372fcea8cSEd Schouten } 67472fcea8cSEd Schouten } 67572fcea8cSEd Schouten return(0); 67672fcea8cSEd Schouten } 67772fcea8cSEd Schouten 67872fcea8cSEd Schouten unsigned char * 67972fcea8cSEd Schouten resiz_line(factor, rline, rpos) /* resize the line to length + factor*/ 68072fcea8cSEd Schouten int factor; /* resize factor */ 68172fcea8cSEd Schouten struct text *rline; /* position in line */ 68272fcea8cSEd Schouten int rpos; 68372fcea8cSEd Schouten { 68472fcea8cSEd Schouten unsigned char *rpoint; 68572fcea8cSEd Schouten int resiz_var; 68672fcea8cSEd Schouten 68772fcea8cSEd Schouten rline->max_length += factor; 68872fcea8cSEd Schouten rpoint = rline->line = realloc(rline->line, rline->max_length ); 68972fcea8cSEd Schouten for (resiz_var = 1 ; (resiz_var < rpos) ; resiz_var++) 69072fcea8cSEd Schouten rpoint++; 69172fcea8cSEd Schouten return(rpoint); 69272fcea8cSEd Schouten } 69372fcea8cSEd Schouten 69472fcea8cSEd Schouten void 69572fcea8cSEd Schouten insert(character) /* insert character into line */ 69672fcea8cSEd Schouten int character; /* new character */ 69772fcea8cSEd Schouten { 69872fcea8cSEd Schouten int counter; 69972fcea8cSEd Schouten int value; 70072fcea8cSEd Schouten unsigned char *temp; /* temporary pointer */ 70172fcea8cSEd Schouten unsigned char *temp2; /* temporary pointer */ 70272fcea8cSEd Schouten 70372fcea8cSEd Schouten if ((character == '\011') && (expand_tabs)) 70472fcea8cSEd Schouten { 70572fcea8cSEd Schouten counter = len_char('\011', scr_horz); 70672fcea8cSEd Schouten for (; counter > 0; counter--) 70772fcea8cSEd Schouten insert(' '); 70872fcea8cSEd Schouten if (auto_format) 70972fcea8cSEd Schouten Auto_Format(); 71072fcea8cSEd Schouten return; 71172fcea8cSEd Schouten } 71272fcea8cSEd Schouten text_changes = TRUE; 71372fcea8cSEd Schouten if ((curr_line->max_length - curr_line->line_length) < 5) 71472fcea8cSEd Schouten point = resiz_line(10, curr_line, position); 71572fcea8cSEd Schouten curr_line->line_length++; 71672fcea8cSEd Schouten temp = point; 71772fcea8cSEd Schouten counter = position; 71872fcea8cSEd Schouten while (counter < curr_line->line_length) /* find end of line */ 71972fcea8cSEd Schouten { 72072fcea8cSEd Schouten counter++; 72172fcea8cSEd Schouten temp++; 72272fcea8cSEd Schouten } 72372fcea8cSEd Schouten temp++; /* increase length of line by one */ 72472fcea8cSEd Schouten while (point < temp) 72572fcea8cSEd Schouten { 72672fcea8cSEd Schouten temp2=temp - 1; 72772fcea8cSEd Schouten *temp= *temp2; /* shift characters over by one */ 72872fcea8cSEd Schouten temp--; 72972fcea8cSEd Schouten } 73072fcea8cSEd Schouten *point = character; /* insert new character */ 73172fcea8cSEd Schouten wclrtoeol(text_win); 732f39e07f3SAndrey A. Chernov if (!isprint((unsigned char)character)) /* check for TAB character*/ 73372fcea8cSEd Schouten { 73472fcea8cSEd Schouten scr_pos = scr_horz += out_char(text_win, character, scr_horz); 73572fcea8cSEd Schouten point++; 73672fcea8cSEd Schouten position++; 73772fcea8cSEd Schouten } 73872fcea8cSEd Schouten else 73972fcea8cSEd Schouten { 740f39e07f3SAndrey A. Chernov waddch(text_win, (unsigned char)character); 74172fcea8cSEd Schouten scr_pos = ++scr_horz; 74272fcea8cSEd Schouten point++; 74372fcea8cSEd Schouten position ++; 74472fcea8cSEd Schouten } 74572fcea8cSEd Schouten 74672fcea8cSEd Schouten if ((observ_margins) && (right_margin < scr_pos)) 74772fcea8cSEd Schouten { 74872fcea8cSEd Schouten counter = position; 74972fcea8cSEd Schouten while (scr_pos > right_margin) 75072fcea8cSEd Schouten prev_word(); 75172fcea8cSEd Schouten if (scr_pos == 0) 75272fcea8cSEd Schouten { 75372fcea8cSEd Schouten while (position < counter) 75472fcea8cSEd Schouten right(TRUE); 75572fcea8cSEd Schouten } 75672fcea8cSEd Schouten else 75772fcea8cSEd Schouten { 75872fcea8cSEd Schouten counter -= position; 75972fcea8cSEd Schouten insert_line(TRUE); 76072fcea8cSEd Schouten for (value = 0; value < counter; value++) 76172fcea8cSEd Schouten right(TRUE); 76272fcea8cSEd Schouten } 76372fcea8cSEd Schouten } 76472fcea8cSEd Schouten 76572fcea8cSEd Schouten if ((scr_horz - horiz_offset) > last_col) 76672fcea8cSEd Schouten { 76772fcea8cSEd Schouten horiz_offset += 8; 76872fcea8cSEd Schouten midscreen(scr_vert, point); 76972fcea8cSEd Schouten } 77072fcea8cSEd Schouten 77172fcea8cSEd Schouten if ((auto_format) && (character == ' ') && (!formatted)) 77272fcea8cSEd Schouten Auto_Format(); 77372fcea8cSEd Schouten else if ((character != ' ') && (character != '\t')) 77472fcea8cSEd Schouten formatted = FALSE; 77572fcea8cSEd Schouten 77672fcea8cSEd Schouten draw_line(scr_vert, scr_horz, point, position, curr_line->line_length); 77772fcea8cSEd Schouten } 77872fcea8cSEd Schouten 77972fcea8cSEd Schouten void 78072fcea8cSEd Schouten delete(disp) /* delete character */ 78172fcea8cSEd Schouten int disp; 78272fcea8cSEd Schouten { 78372fcea8cSEd Schouten unsigned char *tp; 78472fcea8cSEd Schouten unsigned char *temp2; 78572fcea8cSEd Schouten struct text *temp_buff; 78672fcea8cSEd Schouten int temp_vert; 78772fcea8cSEd Schouten int temp_pos; 78872fcea8cSEd Schouten int del_width = 1; 78972fcea8cSEd Schouten 79072fcea8cSEd Schouten if (point != curr_line->line) /* if not at beginning of line */ 79172fcea8cSEd Schouten { 79272fcea8cSEd Schouten text_changes = TRUE; 79372fcea8cSEd Schouten temp2 = tp = point; 79472fcea8cSEd Schouten if ((ee_chinese) && (position >= 2) && (*(point - 2) > 127)) 79572fcea8cSEd Schouten { 79672fcea8cSEd Schouten del_width = 2; 79772fcea8cSEd Schouten } 79872fcea8cSEd Schouten tp -= del_width; 79972fcea8cSEd Schouten point -= del_width; 80072fcea8cSEd Schouten position -= del_width; 80172fcea8cSEd Schouten temp_pos = position; 80272fcea8cSEd Schouten curr_line->line_length -= del_width; 80372fcea8cSEd Schouten if ((*tp < ' ') || (*tp >= 127)) /* check for TAB */ 80472fcea8cSEd Schouten scanline(tp); 80572fcea8cSEd Schouten else 80672fcea8cSEd Schouten scr_horz -= del_width; 80772fcea8cSEd Schouten scr_pos = scr_horz; 80872fcea8cSEd Schouten if (in == 8) 80972fcea8cSEd Schouten { 81072fcea8cSEd Schouten if (del_width == 1) 81172fcea8cSEd Schouten *d_char = *point; /* save deleted character */ 81272fcea8cSEd Schouten else 81372fcea8cSEd Schouten { 81472fcea8cSEd Schouten d_char[0] = *point; 81572fcea8cSEd Schouten d_char[1] = *(point + 1); 81672fcea8cSEd Schouten } 81796b676e9SEd Schouten d_char[del_width] = '\0'; 81872fcea8cSEd Schouten } 81972fcea8cSEd Schouten while (temp_pos <= curr_line->line_length) 82072fcea8cSEd Schouten { 82172fcea8cSEd Schouten temp_pos++; 82272fcea8cSEd Schouten *tp = *temp2; 82372fcea8cSEd Schouten tp++; 82472fcea8cSEd Schouten temp2++; 82572fcea8cSEd Schouten } 8267bf1ea96SEd Schouten if ((scr_horz < horiz_offset) && (horiz_offset > 0)) 82772fcea8cSEd Schouten { 82872fcea8cSEd Schouten horiz_offset -= 8; 82972fcea8cSEd Schouten midscreen(scr_vert, point); 83072fcea8cSEd Schouten } 83172fcea8cSEd Schouten } 83272fcea8cSEd Schouten else if (curr_line->prev_line != NULL) 83372fcea8cSEd Schouten { 83472fcea8cSEd Schouten text_changes = TRUE; 83572fcea8cSEd Schouten left(disp); /* go to previous line */ 83672fcea8cSEd Schouten temp_buff = curr_line->next_line; 83772fcea8cSEd Schouten point = resiz_line(temp_buff->line_length, curr_line, position); 83872fcea8cSEd Schouten if (temp_buff->next_line != NULL) 83972fcea8cSEd Schouten temp_buff->next_line->prev_line = curr_line; 84072fcea8cSEd Schouten curr_line->next_line = temp_buff->next_line; 84172fcea8cSEd Schouten temp2 = temp_buff->line; 84272fcea8cSEd Schouten if (in == 8) 84372fcea8cSEd Schouten { 84472fcea8cSEd Schouten d_char[0] = '\n'; 84596b676e9SEd Schouten d_char[1] = '\0'; 84672fcea8cSEd Schouten } 84772fcea8cSEd Schouten tp = point; 84872fcea8cSEd Schouten temp_pos = 1; 84972fcea8cSEd Schouten while (temp_pos < temp_buff->line_length) 85072fcea8cSEd Schouten { 85172fcea8cSEd Schouten curr_line->line_length++; 85272fcea8cSEd Schouten temp_pos++; 85372fcea8cSEd Schouten *tp = *temp2; 85472fcea8cSEd Schouten tp++; 85572fcea8cSEd Schouten temp2++; 85672fcea8cSEd Schouten } 85796b676e9SEd Schouten *tp = '\0'; 85872fcea8cSEd Schouten free(temp_buff->line); 85972fcea8cSEd Schouten free(temp_buff); 86072fcea8cSEd Schouten temp_buff = curr_line; 86172fcea8cSEd Schouten temp_vert = scr_vert; 86272fcea8cSEd Schouten scr_pos = scr_horz; 86372fcea8cSEd Schouten if (scr_vert < last_line) 86472fcea8cSEd Schouten { 86572fcea8cSEd Schouten wmove(text_win, scr_vert + 1, 0); 86672fcea8cSEd Schouten wdeleteln(text_win); 86772fcea8cSEd Schouten } 86872fcea8cSEd Schouten while ((temp_buff != NULL) && (temp_vert < last_line)) 86972fcea8cSEd Schouten { 87072fcea8cSEd Schouten temp_buff = temp_buff->next_line; 87172fcea8cSEd Schouten temp_vert++; 87272fcea8cSEd Schouten } 87372fcea8cSEd Schouten if ((temp_vert == last_line) && (temp_buff != NULL)) 87472fcea8cSEd Schouten { 87572fcea8cSEd Schouten tp = temp_buff->line; 87672fcea8cSEd Schouten wmove(text_win, last_line,0); 87772fcea8cSEd Schouten wclrtobot(text_win); 87872fcea8cSEd Schouten draw_line(last_line, 0, tp, 1, temp_buff->line_length); 87972fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset)); 88072fcea8cSEd Schouten } 88172fcea8cSEd Schouten } 88272fcea8cSEd Schouten draw_line(scr_vert, scr_horz, point, position, curr_line->line_length); 88372fcea8cSEd Schouten formatted = FALSE; 88472fcea8cSEd Schouten } 88572fcea8cSEd Schouten 88672fcea8cSEd Schouten void 88772fcea8cSEd Schouten scanline(pos) /* find the proper horizontal position for the pointer */ 88872fcea8cSEd Schouten unsigned char *pos; 88972fcea8cSEd Schouten { 89072fcea8cSEd Schouten int temp; 89172fcea8cSEd Schouten unsigned char *ptr; 89272fcea8cSEd Schouten 89372fcea8cSEd Schouten ptr = curr_line->line; 89472fcea8cSEd Schouten temp = 0; 89572fcea8cSEd Schouten while (ptr < pos) 89672fcea8cSEd Schouten { 89772fcea8cSEd Schouten if (*ptr <= 8) 89872fcea8cSEd Schouten temp += 2; 89972fcea8cSEd Schouten else if (*ptr == 9) 90072fcea8cSEd Schouten temp += tabshift(temp); 90172fcea8cSEd Schouten else if ((*ptr >= 10) && (*ptr <= 31)) 90272fcea8cSEd Schouten temp += 2; 90372fcea8cSEd Schouten else if ((*ptr >= 32) && (*ptr < 127)) 90472fcea8cSEd Schouten temp++; 90572fcea8cSEd Schouten else if (*ptr == 127) 90672fcea8cSEd Schouten temp += 2; 90772fcea8cSEd Schouten else if (!eightbit) 90872fcea8cSEd Schouten temp += 5; 90972fcea8cSEd Schouten else 91072fcea8cSEd Schouten temp++; 91172fcea8cSEd Schouten ptr++; 91272fcea8cSEd Schouten } 91372fcea8cSEd Schouten scr_horz = temp; 91472fcea8cSEd Schouten if ((scr_horz - horiz_offset) > last_col) 91572fcea8cSEd Schouten { 91672fcea8cSEd Schouten horiz_offset = (scr_horz - (scr_horz % 8)) - (COLS - 8); 91772fcea8cSEd Schouten midscreen(scr_vert, point); 91872fcea8cSEd Schouten } 91972fcea8cSEd Schouten else if (scr_horz < horiz_offset) 92072fcea8cSEd Schouten { 92172fcea8cSEd Schouten horiz_offset = max(0, (scr_horz - (scr_horz % 8))); 92272fcea8cSEd Schouten midscreen(scr_vert, point); 92372fcea8cSEd Schouten } 92472fcea8cSEd Schouten } 92572fcea8cSEd Schouten 92672fcea8cSEd Schouten int 92772fcea8cSEd Schouten tabshift(temp_int) /* give the number of spaces to shift */ 92872fcea8cSEd Schouten int temp_int; 92972fcea8cSEd Schouten { 93072fcea8cSEd Schouten int leftover; 93172fcea8cSEd Schouten 93272fcea8cSEd Schouten leftover = ((temp_int + 1) % 8); 93372fcea8cSEd Schouten if (leftover == 0) 93472fcea8cSEd Schouten return (1); 93572fcea8cSEd Schouten else 93672fcea8cSEd Schouten return (9 - leftover); 93772fcea8cSEd Schouten } 93872fcea8cSEd Schouten 93972fcea8cSEd Schouten int 94072fcea8cSEd Schouten out_char(window, character, column) /* output non-printing character */ 94172fcea8cSEd Schouten WINDOW *window; 9421ac3735cSMarcel Moolenaar int character; 94372fcea8cSEd Schouten int column; 94472fcea8cSEd Schouten { 94572fcea8cSEd Schouten int i1, i2; 94696b676e9SEd Schouten char *string; 94772fcea8cSEd Schouten char string2[8]; 94872fcea8cSEd Schouten 94972fcea8cSEd Schouten if (character == TAB) 95072fcea8cSEd Schouten { 95172fcea8cSEd Schouten i1 = tabshift(column); 95272fcea8cSEd Schouten for (i2 = 0; 95372fcea8cSEd Schouten (i2 < i1) && (((column+i2+1)-horiz_offset) < last_col); i2++) 95472fcea8cSEd Schouten { 95572fcea8cSEd Schouten waddch(window, ' '); 95672fcea8cSEd Schouten } 95772fcea8cSEd Schouten return(i1); 95872fcea8cSEd Schouten } 95972fcea8cSEd Schouten else if ((character >= '\0') && (character < ' ')) 96072fcea8cSEd Schouten { 96172fcea8cSEd Schouten string = table[(int) character]; 96272fcea8cSEd Schouten } 96372fcea8cSEd Schouten else if ((character < 0) || (character >= 127)) 96472fcea8cSEd Schouten { 96572fcea8cSEd Schouten if (character == 127) 96672fcea8cSEd Schouten string = "^?"; 96772fcea8cSEd Schouten else if (!eightbit) 96872fcea8cSEd Schouten { 96972fcea8cSEd Schouten sprintf(string2, "<%d>", (character < 0) ? (character + 256) : character); 97072fcea8cSEd Schouten string = string2; 97172fcea8cSEd Schouten } 97272fcea8cSEd Schouten else 97372fcea8cSEd Schouten { 974f39e07f3SAndrey A. Chernov waddch(window, (unsigned char)character ); 97572fcea8cSEd Schouten return(1); 97672fcea8cSEd Schouten } 97772fcea8cSEd Schouten } 97872fcea8cSEd Schouten else 97972fcea8cSEd Schouten { 980f39e07f3SAndrey A. Chernov waddch(window, (unsigned char)character); 98172fcea8cSEd Schouten return(1); 98272fcea8cSEd Schouten } 98396b676e9SEd Schouten for (i2 = 0; (string[i2] != '\0') && (((column+i2+1)-horiz_offset) < last_col); i2++) 984f39e07f3SAndrey A. Chernov waddch(window, (unsigned char)string[i2]); 98572fcea8cSEd Schouten return(strlen(string)); 98672fcea8cSEd Schouten } 98772fcea8cSEd Schouten 98872fcea8cSEd Schouten int 98972fcea8cSEd Schouten len_char(character, column) /* return the length of the character */ 9901ac3735cSMarcel Moolenaar int character; 99172fcea8cSEd Schouten int column; /* the column must be known to provide spacing for tabs */ 99272fcea8cSEd Schouten { 99372fcea8cSEd Schouten int length; 99472fcea8cSEd Schouten 99572fcea8cSEd Schouten if (character == '\t') 99672fcea8cSEd Schouten length = tabshift(column); 99772fcea8cSEd Schouten else if ((character >= 0) && (character < 32)) 99872fcea8cSEd Schouten length = 2; 99972fcea8cSEd Schouten else if ((character >= 32) && (character <= 126)) 100072fcea8cSEd Schouten length = 1; 100172fcea8cSEd Schouten else if (character == 127) 100272fcea8cSEd Schouten length = 2; 100372fcea8cSEd Schouten else if (((character > 126) || (character < 0)) && (!eightbit)) 100472fcea8cSEd Schouten length = 5; 100572fcea8cSEd Schouten else 100672fcea8cSEd Schouten length = 1; 100772fcea8cSEd Schouten 100872fcea8cSEd Schouten return(length); 100972fcea8cSEd Schouten } 101072fcea8cSEd Schouten 101172fcea8cSEd Schouten void 101272fcea8cSEd Schouten draw_line(vertical, horiz, ptr, t_pos, length) /* redraw line from current position */ 101372fcea8cSEd Schouten int vertical; /* current vertical position on screen */ 101472fcea8cSEd Schouten int horiz; /* current horizontal position on screen */ 101572fcea8cSEd Schouten unsigned char *ptr; /* pointer to line */ 101672fcea8cSEd Schouten int t_pos; /* current position (offset in bytes) from bol */ 101772fcea8cSEd Schouten int length; /* length (in bytes) of line */ 101872fcea8cSEd Schouten { 101972fcea8cSEd Schouten int d; /* partial length of special or tab char to display */ 102072fcea8cSEd Schouten unsigned char *temp; /* temporary pointer to position in line */ 102172fcea8cSEd Schouten int abs_column; /* offset in screen units from begin of line */ 102272fcea8cSEd Schouten int column; /* horizontal position on screen */ 102372fcea8cSEd Schouten int row; /* vertical position on screen */ 102472fcea8cSEd Schouten int posit; /* temporary position indicator within line */ 102572fcea8cSEd Schouten 102672fcea8cSEd Schouten abs_column = horiz; 102772fcea8cSEd Schouten column = horiz - horiz_offset; 102872fcea8cSEd Schouten row = vertical; 102972fcea8cSEd Schouten temp = ptr; 103072fcea8cSEd Schouten d = 0; 103172fcea8cSEd Schouten posit = t_pos; 103272fcea8cSEd Schouten if (column < 0) 103372fcea8cSEd Schouten { 103472fcea8cSEd Schouten wmove(text_win, row, 0); 103572fcea8cSEd Schouten wclrtoeol(text_win); 103672fcea8cSEd Schouten } 103772fcea8cSEd Schouten while (column < 0) 103872fcea8cSEd Schouten { 103972fcea8cSEd Schouten d = len_char(*temp, abs_column); 104072fcea8cSEd Schouten abs_column += d; 104172fcea8cSEd Schouten column += d; 104272fcea8cSEd Schouten posit++; 104372fcea8cSEd Schouten temp++; 104472fcea8cSEd Schouten } 104572fcea8cSEd Schouten wmove(text_win, row, column); 104672fcea8cSEd Schouten wclrtoeol(text_win); 104772fcea8cSEd Schouten while ((posit < length) && (column <= last_col)) 104872fcea8cSEd Schouten { 1049f39e07f3SAndrey A. Chernov if (!isprint(*temp)) 105072fcea8cSEd Schouten { 105172fcea8cSEd Schouten column += len_char(*temp, abs_column); 105272fcea8cSEd Schouten abs_column += out_char(text_win, *temp, abs_column); 105372fcea8cSEd Schouten } 105472fcea8cSEd Schouten else 105572fcea8cSEd Schouten { 105672fcea8cSEd Schouten abs_column++; 105772fcea8cSEd Schouten column++; 105872fcea8cSEd Schouten waddch(text_win, *temp); 105972fcea8cSEd Schouten } 106072fcea8cSEd Schouten posit++; 106172fcea8cSEd Schouten temp++; 106272fcea8cSEd Schouten } 106372fcea8cSEd Schouten if (column < last_col) 106472fcea8cSEd Schouten wclrtoeol(text_win); 106572fcea8cSEd Schouten wmove(text_win, vertical, (horiz - horiz_offset)); 106672fcea8cSEd Schouten } 106772fcea8cSEd Schouten 106872fcea8cSEd Schouten void 106972fcea8cSEd Schouten insert_line(disp) /* insert new line */ 107072fcea8cSEd Schouten int disp; 107172fcea8cSEd Schouten { 107272fcea8cSEd Schouten int temp_pos; 107372fcea8cSEd Schouten int temp_pos2; 107472fcea8cSEd Schouten unsigned char *temp; 107572fcea8cSEd Schouten unsigned char *extra; 107672fcea8cSEd Schouten struct text *temp_nod; 107772fcea8cSEd Schouten 107872fcea8cSEd Schouten text_changes = TRUE; 107972fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset)); 108072fcea8cSEd Schouten wclrtoeol(text_win); 108172fcea8cSEd Schouten temp_nod= txtalloc(); 108272fcea8cSEd Schouten temp_nod->line = extra= malloc(10); 108372fcea8cSEd Schouten temp_nod->line_length = 1; 108472fcea8cSEd Schouten temp_nod->max_length = 10; 108596b676e9SEd Schouten temp_nod->line_number = curr_line->line_number + 1; 108672fcea8cSEd Schouten temp_nod->next_line = curr_line->next_line; 108772fcea8cSEd Schouten if (temp_nod->next_line != NULL) 108872fcea8cSEd Schouten temp_nod->next_line->prev_line = temp_nod; 108972fcea8cSEd Schouten temp_nod->prev_line = curr_line; 109072fcea8cSEd Schouten curr_line->next_line = temp_nod; 109172fcea8cSEd Schouten temp_pos2 = position; 109272fcea8cSEd Schouten temp = point; 109372fcea8cSEd Schouten if (temp_pos2 < curr_line->line_length) 109472fcea8cSEd Schouten { 109572fcea8cSEd Schouten temp_pos = 1; 109672fcea8cSEd Schouten while (temp_pos2 < curr_line->line_length) 109772fcea8cSEd Schouten { 109872fcea8cSEd Schouten if ((temp_nod->max_length - temp_nod->line_length)< 5) 109972fcea8cSEd Schouten extra = resiz_line(10, temp_nod, temp_pos); 110072fcea8cSEd Schouten temp_nod->line_length++; 110172fcea8cSEd Schouten temp_pos++; 110272fcea8cSEd Schouten temp_pos2++; 110372fcea8cSEd Schouten *extra= *temp; 110472fcea8cSEd Schouten extra++; 110572fcea8cSEd Schouten temp++; 110672fcea8cSEd Schouten } 110772fcea8cSEd Schouten temp=point; 110896b676e9SEd Schouten *temp = '\0'; 110972fcea8cSEd Schouten temp = resiz_line((1 - temp_nod->line_length), curr_line, position); 111072fcea8cSEd Schouten curr_line->line_length = 1 + temp - curr_line->line; 111172fcea8cSEd Schouten } 111272fcea8cSEd Schouten curr_line->line_length = position; 111396b676e9SEd Schouten absolute_lin++; 111472fcea8cSEd Schouten curr_line = temp_nod; 111596b676e9SEd Schouten *extra = '\0'; 111672fcea8cSEd Schouten position = 1; 111772fcea8cSEd Schouten point= curr_line->line; 111872fcea8cSEd Schouten if (disp) 111972fcea8cSEd Schouten { 112072fcea8cSEd Schouten if (scr_vert < last_line) 112172fcea8cSEd Schouten { 112272fcea8cSEd Schouten scr_vert++; 112372fcea8cSEd Schouten wclrtoeol(text_win); 112472fcea8cSEd Schouten wmove(text_win, scr_vert, 0); 112572fcea8cSEd Schouten winsertln(text_win); 112672fcea8cSEd Schouten } 112772fcea8cSEd Schouten else 112872fcea8cSEd Schouten { 112972fcea8cSEd Schouten wmove(text_win, 0,0); 113072fcea8cSEd Schouten wdeleteln(text_win); 113172fcea8cSEd Schouten wmove(text_win, last_line,0); 113272fcea8cSEd Schouten wclrtobot(text_win); 113372fcea8cSEd Schouten } 113472fcea8cSEd Schouten scr_pos = scr_horz = 0; 113572fcea8cSEd Schouten if (horiz_offset) 113672fcea8cSEd Schouten { 113772fcea8cSEd Schouten horiz_offset = 0; 113872fcea8cSEd Schouten midscreen(scr_vert, point); 113972fcea8cSEd Schouten } 114072fcea8cSEd Schouten draw_line(scr_vert, scr_horz, point, position, 114172fcea8cSEd Schouten curr_line->line_length); 114272fcea8cSEd Schouten } 114372fcea8cSEd Schouten } 114472fcea8cSEd Schouten 114572fcea8cSEd Schouten struct text *txtalloc() /* allocate space for line structure */ 114672fcea8cSEd Schouten { 114772fcea8cSEd Schouten return((struct text *) malloc(sizeof( struct text))); 114872fcea8cSEd Schouten } 114972fcea8cSEd Schouten 115072fcea8cSEd Schouten struct files *name_alloc() /* allocate space for file name list node */ 115172fcea8cSEd Schouten { 115272fcea8cSEd Schouten return((struct files *) malloc(sizeof( struct files))); 115372fcea8cSEd Schouten } 115472fcea8cSEd Schouten 115572fcea8cSEd Schouten unsigned char *next_word(string) /* move to next word in string */ 115672fcea8cSEd Schouten unsigned char *string; 115772fcea8cSEd Schouten { 115896b676e9SEd Schouten while ((*string != '\0') && ((*string != 32) && (*string != 9))) 115972fcea8cSEd Schouten string++; 116096b676e9SEd Schouten while ((*string != '\0') && ((*string == 32) || (*string == 9))) 116172fcea8cSEd Schouten string++; 116272fcea8cSEd Schouten return(string); 116372fcea8cSEd Schouten } 116472fcea8cSEd Schouten 116572fcea8cSEd Schouten void 116672fcea8cSEd Schouten prev_word() /* move to start of previous word in text */ 116772fcea8cSEd Schouten { 116872fcea8cSEd Schouten if (position != 1) 116972fcea8cSEd Schouten { 117072fcea8cSEd Schouten if ((position != 1) && ((point[-1] == ' ') || (point[-1] == '\t'))) 117172fcea8cSEd Schouten { /* if at the start of a word */ 117272fcea8cSEd Schouten while ((position != 1) && ((*point != ' ') && (*point != '\t'))) 117372fcea8cSEd Schouten left(TRUE); 117472fcea8cSEd Schouten } 117572fcea8cSEd Schouten while ((position != 1) && ((*point == ' ') || (*point == '\t'))) 117672fcea8cSEd Schouten left(TRUE); 117772fcea8cSEd Schouten while ((position != 1) && ((*point != ' ') && (*point != '\t'))) 117872fcea8cSEd Schouten left(TRUE); 117972fcea8cSEd Schouten if ((position != 1) && ((*point == ' ') || (*point == '\t'))) 118072fcea8cSEd Schouten right(TRUE); 118172fcea8cSEd Schouten } 118272fcea8cSEd Schouten else 118372fcea8cSEd Schouten left(TRUE); 118472fcea8cSEd Schouten } 118572fcea8cSEd Schouten 118672fcea8cSEd Schouten void 118772fcea8cSEd Schouten control() /* use control for commands */ 118872fcea8cSEd Schouten { 118972fcea8cSEd Schouten char *string; 119072fcea8cSEd Schouten 119172fcea8cSEd Schouten if (in == 1) /* control a */ 119272fcea8cSEd Schouten { 119372fcea8cSEd Schouten string = get_string(ascii_code_str, TRUE); 119496b676e9SEd Schouten if (*string != '\0') 119572fcea8cSEd Schouten { 119672fcea8cSEd Schouten in = atoi(string); 119772fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset)); 119872fcea8cSEd Schouten insert(in); 119972fcea8cSEd Schouten } 120072fcea8cSEd Schouten free(string); 120172fcea8cSEd Schouten } 120272fcea8cSEd Schouten else if (in == 2) /* control b */ 120372fcea8cSEd Schouten bottom(); 120472fcea8cSEd Schouten else if (in == 3) /* control c */ 120572fcea8cSEd Schouten { 120672fcea8cSEd Schouten command_prompt(); 120772fcea8cSEd Schouten } 120872fcea8cSEd Schouten else if (in == 4) /* control d */ 120972fcea8cSEd Schouten down(); 121072fcea8cSEd Schouten else if (in == 5) /* control e */ 121172fcea8cSEd Schouten search_prompt(); 121272fcea8cSEd Schouten else if (in == 6) /* control f */ 121372fcea8cSEd Schouten undel_char(); 121472fcea8cSEd Schouten else if (in == 7) /* control g */ 121572fcea8cSEd Schouten bol(); 121672fcea8cSEd Schouten else if (in == 8) /* control h */ 121772fcea8cSEd Schouten delete(TRUE); 121872fcea8cSEd Schouten else if (in == 9) /* control i */ 121972fcea8cSEd Schouten ; 122072fcea8cSEd Schouten else if (in == 10) /* control j */ 122172fcea8cSEd Schouten insert_line(TRUE); 122272fcea8cSEd Schouten else if (in == 11) /* control k */ 122372fcea8cSEd Schouten del_char(); 122472fcea8cSEd Schouten else if (in == 12) /* control l */ 122572fcea8cSEd Schouten left(TRUE); 122672fcea8cSEd Schouten else if (in == 13) /* control m */ 122772fcea8cSEd Schouten insert_line(TRUE); 122872fcea8cSEd Schouten else if (in == 14) /* control n */ 12297bf1ea96SEd Schouten move_rel('d', max(5, (last_line - 5))); 123072fcea8cSEd Schouten else if (in == 15) /* control o */ 123172fcea8cSEd Schouten eol(); 123272fcea8cSEd Schouten else if (in == 16) /* control p */ 12337bf1ea96SEd Schouten move_rel('u', max(5, (last_line - 5))); 123472fcea8cSEd Schouten else if (in == 17) /* control q */ 123572fcea8cSEd Schouten ; 123672fcea8cSEd Schouten else if (in == 18) /* control r */ 123772fcea8cSEd Schouten right(TRUE); 123872fcea8cSEd Schouten else if (in == 19) /* control s */ 123972fcea8cSEd Schouten ; 124072fcea8cSEd Schouten else if (in == 20) /* control t */ 124172fcea8cSEd Schouten top(); 124272fcea8cSEd Schouten else if (in == 21) /* control u */ 124372fcea8cSEd Schouten up(); 124472fcea8cSEd Schouten else if (in == 22) /* control v */ 124572fcea8cSEd Schouten undel_word(); 124672fcea8cSEd Schouten else if (in == 23) /* control w */ 124772fcea8cSEd Schouten del_word(); 124872fcea8cSEd Schouten else if (in == 24) /* control x */ 124972fcea8cSEd Schouten search(TRUE); 125072fcea8cSEd Schouten else if (in == 25) /* control y */ 125172fcea8cSEd Schouten del_line(); 125272fcea8cSEd Schouten else if (in == 26) /* control z */ 125372fcea8cSEd Schouten undel_line(); 125472fcea8cSEd Schouten else if (in == 27) /* control [ (escape) */ 125572fcea8cSEd Schouten { 125672fcea8cSEd Schouten menu_op(main_menu); 125772fcea8cSEd Schouten } 125872fcea8cSEd Schouten } 125972fcea8cSEd Schouten 126072fcea8cSEd Schouten /* 126172fcea8cSEd Schouten | Emacs control-key bindings 126272fcea8cSEd Schouten */ 126372fcea8cSEd Schouten 126472fcea8cSEd Schouten void 126572fcea8cSEd Schouten emacs_control() 126672fcea8cSEd Schouten { 126772fcea8cSEd Schouten char *string; 126872fcea8cSEd Schouten 126972fcea8cSEd Schouten if (in == 1) /* control a */ 127072fcea8cSEd Schouten bol(); 127172fcea8cSEd Schouten else if (in == 2) /* control b */ 127272fcea8cSEd Schouten left(TRUE); 127372fcea8cSEd Schouten else if (in == 3) /* control c */ 127472fcea8cSEd Schouten { 127572fcea8cSEd Schouten command_prompt(); 127672fcea8cSEd Schouten } 127772fcea8cSEd Schouten else if (in == 4) /* control d */ 127872fcea8cSEd Schouten del_char(); 127972fcea8cSEd Schouten else if (in == 5) /* control e */ 128072fcea8cSEd Schouten eol(); 128172fcea8cSEd Schouten else if (in == 6) /* control f */ 128272fcea8cSEd Schouten right(TRUE); 128372fcea8cSEd Schouten else if (in == 7) /* control g */ 12847bf1ea96SEd Schouten move_rel('u', max(5, (last_line - 5))); 128572fcea8cSEd Schouten else if (in == 8) /* control h */ 128672fcea8cSEd Schouten delete(TRUE); 128772fcea8cSEd Schouten else if (in == 9) /* control i */ 128872fcea8cSEd Schouten ; 128972fcea8cSEd Schouten else if (in == 10) /* control j */ 129072fcea8cSEd Schouten undel_char(); 129172fcea8cSEd Schouten else if (in == 11) /* control k */ 129272fcea8cSEd Schouten del_line(); 129372fcea8cSEd Schouten else if (in == 12) /* control l */ 129472fcea8cSEd Schouten undel_line(); 129572fcea8cSEd Schouten else if (in == 13) /* control m */ 129672fcea8cSEd Schouten insert_line(TRUE); 129772fcea8cSEd Schouten else if (in == 14) /* control n */ 129872fcea8cSEd Schouten down(); 129972fcea8cSEd Schouten else if (in == 15) /* control o */ 130072fcea8cSEd Schouten { 130172fcea8cSEd Schouten string = get_string(ascii_code_str, TRUE); 130296b676e9SEd Schouten if (*string != '\0') 130372fcea8cSEd Schouten { 130472fcea8cSEd Schouten in = atoi(string); 130572fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset)); 130672fcea8cSEd Schouten insert(in); 130772fcea8cSEd Schouten } 130872fcea8cSEd Schouten free(string); 130972fcea8cSEd Schouten } 131072fcea8cSEd Schouten else if (in == 16) /* control p */ 131172fcea8cSEd Schouten up(); 131272fcea8cSEd Schouten else if (in == 17) /* control q */ 131372fcea8cSEd Schouten ; 131472fcea8cSEd Schouten else if (in == 18) /* control r */ 131572fcea8cSEd Schouten undel_word(); 131672fcea8cSEd Schouten else if (in == 19) /* control s */ 131772fcea8cSEd Schouten ; 131872fcea8cSEd Schouten else if (in == 20) /* control t */ 131972fcea8cSEd Schouten top(); 132072fcea8cSEd Schouten else if (in == 21) /* control u */ 132172fcea8cSEd Schouten bottom(); 132272fcea8cSEd Schouten else if (in == 22) /* control v */ 13237bf1ea96SEd Schouten move_rel('d', max(5, (last_line - 5))); 132472fcea8cSEd Schouten else if (in == 23) /* control w */ 132572fcea8cSEd Schouten del_word(); 132672fcea8cSEd Schouten else if (in == 24) /* control x */ 132772fcea8cSEd Schouten search(TRUE); 132872fcea8cSEd Schouten else if (in == 25) /* control y */ 132972fcea8cSEd Schouten search_prompt(); 133072fcea8cSEd Schouten else if (in == 26) /* control z */ 133172fcea8cSEd Schouten adv_word(); 133272fcea8cSEd Schouten else if (in == 27) /* control [ (escape) */ 133372fcea8cSEd Schouten { 133472fcea8cSEd Schouten menu_op(main_menu); 133572fcea8cSEd Schouten } 133672fcea8cSEd Schouten } 133772fcea8cSEd Schouten 133872fcea8cSEd Schouten void 133972fcea8cSEd Schouten bottom() /* go to bottom of file */ 134072fcea8cSEd Schouten { 134172fcea8cSEd Schouten while (curr_line->next_line != NULL) 134296b676e9SEd Schouten { 134372fcea8cSEd Schouten curr_line = curr_line->next_line; 134496b676e9SEd Schouten absolute_lin++; 134596b676e9SEd Schouten } 134672fcea8cSEd Schouten point = curr_line->line; 134772fcea8cSEd Schouten if (horiz_offset) 134872fcea8cSEd Schouten horiz_offset = 0; 134972fcea8cSEd Schouten position = 1; 135072fcea8cSEd Schouten midscreen(last_line, point); 135172fcea8cSEd Schouten scr_pos = scr_horz; 135272fcea8cSEd Schouten } 135372fcea8cSEd Schouten 135472fcea8cSEd Schouten void 135572fcea8cSEd Schouten top() /* go to top of file */ 135672fcea8cSEd Schouten { 135772fcea8cSEd Schouten while (curr_line->prev_line != NULL) 135896b676e9SEd Schouten { 135972fcea8cSEd Schouten curr_line = curr_line->prev_line; 136096b676e9SEd Schouten absolute_lin--; 136196b676e9SEd Schouten } 136272fcea8cSEd Schouten point = curr_line->line; 136372fcea8cSEd Schouten if (horiz_offset) 136472fcea8cSEd Schouten horiz_offset = 0; 136572fcea8cSEd Schouten position = 1; 136672fcea8cSEd Schouten midscreen(0, point); 136772fcea8cSEd Schouten scr_pos = scr_horz; 136872fcea8cSEd Schouten } 136972fcea8cSEd Schouten 137072fcea8cSEd Schouten void 137172fcea8cSEd Schouten nextline() /* move pointers to start of next line */ 137272fcea8cSEd Schouten { 137372fcea8cSEd Schouten curr_line = curr_line->next_line; 137496b676e9SEd Schouten absolute_lin++; 137572fcea8cSEd Schouten point = curr_line->line; 137672fcea8cSEd Schouten position = 1; 137772fcea8cSEd Schouten if (scr_vert == last_line) 137872fcea8cSEd Schouten { 137972fcea8cSEd Schouten wmove(text_win, 0,0); 138072fcea8cSEd Schouten wdeleteln(text_win); 138172fcea8cSEd Schouten wmove(text_win, last_line,0); 138272fcea8cSEd Schouten wclrtobot(text_win); 138372fcea8cSEd Schouten draw_line(last_line,0,point,1,curr_line->line_length); 138472fcea8cSEd Schouten } 138572fcea8cSEd Schouten else 138672fcea8cSEd Schouten scr_vert++; 138772fcea8cSEd Schouten } 138872fcea8cSEd Schouten 138972fcea8cSEd Schouten void 139072fcea8cSEd Schouten prevline() /* move pointers to start of previous line*/ 139172fcea8cSEd Schouten { 139272fcea8cSEd Schouten curr_line = curr_line->prev_line; 139396b676e9SEd Schouten absolute_lin--; 139472fcea8cSEd Schouten point = curr_line->line; 139572fcea8cSEd Schouten position = 1; 139672fcea8cSEd Schouten if (scr_vert == 0) 139772fcea8cSEd Schouten { 139872fcea8cSEd Schouten winsertln(text_win); 139972fcea8cSEd Schouten draw_line(0,0,point,1,curr_line->line_length); 140072fcea8cSEd Schouten } 140172fcea8cSEd Schouten else 140272fcea8cSEd Schouten scr_vert--; 140372fcea8cSEd Schouten while (position < curr_line->line_length) 140472fcea8cSEd Schouten { 140572fcea8cSEd Schouten position++; 140672fcea8cSEd Schouten point++; 140772fcea8cSEd Schouten } 140872fcea8cSEd Schouten } 140972fcea8cSEd Schouten 141072fcea8cSEd Schouten void 141172fcea8cSEd Schouten left(disp) /* move left one character */ 141272fcea8cSEd Schouten int disp; 141372fcea8cSEd Schouten { 141472fcea8cSEd Schouten if (point != curr_line->line) /* if not at begin of line */ 141572fcea8cSEd Schouten { 141672fcea8cSEd Schouten if ((ee_chinese) && (position >= 2) && (*(point - 2) > 127)) 141772fcea8cSEd Schouten { 141872fcea8cSEd Schouten point--; 141972fcea8cSEd Schouten position--; 142072fcea8cSEd Schouten } 142172fcea8cSEd Schouten point--; 142272fcea8cSEd Schouten position--; 142372fcea8cSEd Schouten scanline(point); 142472fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset)); 142572fcea8cSEd Schouten scr_pos = scr_horz; 142672fcea8cSEd Schouten } 142772fcea8cSEd Schouten else if (curr_line->prev_line != NULL) 142872fcea8cSEd Schouten { 142972fcea8cSEd Schouten if (!disp) 143072fcea8cSEd Schouten { 143196b676e9SEd Schouten absolute_lin--; 143272fcea8cSEd Schouten curr_line = curr_line->prev_line; 143372fcea8cSEd Schouten point = curr_line->line + curr_line->line_length; 143472fcea8cSEd Schouten position = curr_line->line_length; 143572fcea8cSEd Schouten return; 143672fcea8cSEd Schouten } 143772fcea8cSEd Schouten position = 1; 143872fcea8cSEd Schouten prevline(); 143972fcea8cSEd Schouten scanline(point); 144072fcea8cSEd Schouten scr_pos = scr_horz; 144172fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset)); 144272fcea8cSEd Schouten } 144372fcea8cSEd Schouten } 144472fcea8cSEd Schouten 144572fcea8cSEd Schouten void 144672fcea8cSEd Schouten right(disp) /* move right one character */ 144772fcea8cSEd Schouten int disp; 144872fcea8cSEd Schouten { 144972fcea8cSEd Schouten if (position < curr_line->line_length) 145072fcea8cSEd Schouten { 145172fcea8cSEd Schouten if ((ee_chinese) && (*point > 127) && 145272fcea8cSEd Schouten ((curr_line->line_length - position) >= 2)) 145372fcea8cSEd Schouten { 145472fcea8cSEd Schouten point++; 145572fcea8cSEd Schouten position++; 145672fcea8cSEd Schouten } 145772fcea8cSEd Schouten point++; 145872fcea8cSEd Schouten position++; 145972fcea8cSEd Schouten scanline(point); 146072fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset)); 146172fcea8cSEd Schouten scr_pos = scr_horz; 146272fcea8cSEd Schouten } 146372fcea8cSEd Schouten else if (curr_line->next_line != NULL) 146472fcea8cSEd Schouten { 146572fcea8cSEd Schouten if (!disp) 146672fcea8cSEd Schouten { 146796b676e9SEd Schouten absolute_lin++; 146872fcea8cSEd Schouten curr_line = curr_line->next_line; 146972fcea8cSEd Schouten point = curr_line->line; 147072fcea8cSEd Schouten position = 1; 147172fcea8cSEd Schouten return; 147272fcea8cSEd Schouten } 147372fcea8cSEd Schouten nextline(); 147472fcea8cSEd Schouten scr_pos = scr_horz = 0; 147572fcea8cSEd Schouten if (horiz_offset) 147672fcea8cSEd Schouten { 147772fcea8cSEd Schouten horiz_offset = 0; 147872fcea8cSEd Schouten midscreen(scr_vert, point); 147972fcea8cSEd Schouten } 148072fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset)); 148172fcea8cSEd Schouten position = 1; 148272fcea8cSEd Schouten } 148372fcea8cSEd Schouten } 148472fcea8cSEd Schouten 148572fcea8cSEd Schouten void 148672fcea8cSEd Schouten find_pos() /* move to the same column as on other line */ 148772fcea8cSEd Schouten { 148872fcea8cSEd Schouten scr_horz = 0; 148972fcea8cSEd Schouten position = 1; 149072fcea8cSEd Schouten while ((scr_horz < scr_pos) && (position < curr_line->line_length)) 149172fcea8cSEd Schouten { 149272fcea8cSEd Schouten if (*point == 9) 149372fcea8cSEd Schouten scr_horz += tabshift(scr_horz); 149472fcea8cSEd Schouten else if (*point < ' ') 149572fcea8cSEd Schouten scr_horz += 2; 149672fcea8cSEd Schouten else if ((ee_chinese) && (*point > 127) && 149772fcea8cSEd Schouten ((curr_line->line_length - position) >= 2)) 149872fcea8cSEd Schouten { 149972fcea8cSEd Schouten scr_horz += 2; 150072fcea8cSEd Schouten point++; 150172fcea8cSEd Schouten position++; 150272fcea8cSEd Schouten } 150372fcea8cSEd Schouten else 150472fcea8cSEd Schouten scr_horz++; 150572fcea8cSEd Schouten position++; 150672fcea8cSEd Schouten point++; 150772fcea8cSEd Schouten } 150872fcea8cSEd Schouten if ((scr_horz - horiz_offset) > last_col) 150972fcea8cSEd Schouten { 151072fcea8cSEd Schouten horiz_offset = (scr_horz - (scr_horz % 8)) - (COLS - 8); 151172fcea8cSEd Schouten midscreen(scr_vert, point); 151272fcea8cSEd Schouten } 151372fcea8cSEd Schouten else if (scr_horz < horiz_offset) 151472fcea8cSEd Schouten { 151572fcea8cSEd Schouten horiz_offset = max(0, (scr_horz - (scr_horz % 8))); 151672fcea8cSEd Schouten midscreen(scr_vert, point); 151772fcea8cSEd Schouten } 151872fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset)); 151972fcea8cSEd Schouten } 152072fcea8cSEd Schouten 152172fcea8cSEd Schouten void 152272fcea8cSEd Schouten up() /* move up one line */ 152372fcea8cSEd Schouten { 152472fcea8cSEd Schouten if (curr_line->prev_line != NULL) 152572fcea8cSEd Schouten { 152672fcea8cSEd Schouten prevline(); 152772fcea8cSEd Schouten point = curr_line->line; 152872fcea8cSEd Schouten find_pos(); 152972fcea8cSEd Schouten } 153072fcea8cSEd Schouten } 153172fcea8cSEd Schouten 153272fcea8cSEd Schouten void 153372fcea8cSEd Schouten down() /* move down one line */ 153472fcea8cSEd Schouten { 153572fcea8cSEd Schouten if (curr_line->next_line != NULL) 153672fcea8cSEd Schouten { 153772fcea8cSEd Schouten nextline(); 153872fcea8cSEd Schouten find_pos(); 153972fcea8cSEd Schouten } 154072fcea8cSEd Schouten } 154172fcea8cSEd Schouten 154272fcea8cSEd Schouten void 154372fcea8cSEd Schouten function_key() /* process function key */ 154472fcea8cSEd Schouten { 154572fcea8cSEd Schouten if (in == KEY_LEFT) 154672fcea8cSEd Schouten left(TRUE); 154772fcea8cSEd Schouten else if (in == KEY_RIGHT) 154872fcea8cSEd Schouten right(TRUE); 154972fcea8cSEd Schouten else if (in == KEY_HOME) 1550cfe04e82SEd Schouten bol(); 1551cfe04e82SEd Schouten else if (in == KEY_END) 1552cfe04e82SEd Schouten eol(); 155372fcea8cSEd Schouten else if (in == KEY_UP) 155472fcea8cSEd Schouten up(); 155572fcea8cSEd Schouten else if (in == KEY_DOWN) 155672fcea8cSEd Schouten down(); 155772fcea8cSEd Schouten else if (in == KEY_NPAGE) 15587bf1ea96SEd Schouten move_rel('d', max( 5, (last_line - 5))); 155972fcea8cSEd Schouten else if (in == KEY_PPAGE) 15607bf1ea96SEd Schouten move_rel('u', max(5, (last_line - 5))); 156172fcea8cSEd Schouten else if (in == KEY_DL) 156272fcea8cSEd Schouten del_line(); 156372fcea8cSEd Schouten else if (in == KEY_DC) 156472fcea8cSEd Schouten del_char(); 156572fcea8cSEd Schouten else if (in == KEY_BACKSPACE) 156672fcea8cSEd Schouten delete(TRUE); 156772fcea8cSEd Schouten else if (in == KEY_IL) 156872fcea8cSEd Schouten { /* insert a line before current line */ 156972fcea8cSEd Schouten insert_line(TRUE); 157072fcea8cSEd Schouten left(TRUE); 157172fcea8cSEd Schouten } 157272fcea8cSEd Schouten else if (in == KEY_F(1)) 157372fcea8cSEd Schouten gold = !gold; 157472fcea8cSEd Schouten else if (in == KEY_F(2)) 157572fcea8cSEd Schouten { 157672fcea8cSEd Schouten if (gold) 157772fcea8cSEd Schouten { 157872fcea8cSEd Schouten gold = FALSE; 157972fcea8cSEd Schouten undel_line(); 158072fcea8cSEd Schouten } 158172fcea8cSEd Schouten else 158272fcea8cSEd Schouten undel_char(); 158372fcea8cSEd Schouten } 158472fcea8cSEd Schouten else if (in == KEY_F(3)) 158572fcea8cSEd Schouten { 158672fcea8cSEd Schouten if (gold) 158772fcea8cSEd Schouten { 158872fcea8cSEd Schouten gold = FALSE; 158972fcea8cSEd Schouten undel_word(); 159072fcea8cSEd Schouten } 159172fcea8cSEd Schouten else 159272fcea8cSEd Schouten del_word(); 159372fcea8cSEd Schouten } 159472fcea8cSEd Schouten else if (in == KEY_F(4)) 159572fcea8cSEd Schouten { 159672fcea8cSEd Schouten if (gold) 159772fcea8cSEd Schouten { 159872fcea8cSEd Schouten gold = FALSE; 159972fcea8cSEd Schouten paint_info_win(); 160072fcea8cSEd Schouten midscreen(scr_vert, point); 160172fcea8cSEd Schouten } 160272fcea8cSEd Schouten else 160372fcea8cSEd Schouten adv_word(); 160472fcea8cSEd Schouten } 160572fcea8cSEd Schouten else if (in == KEY_F(5)) 160672fcea8cSEd Schouten { 160772fcea8cSEd Schouten if (gold) 160872fcea8cSEd Schouten { 160972fcea8cSEd Schouten gold = FALSE; 161072fcea8cSEd Schouten search_prompt(); 161172fcea8cSEd Schouten } 161272fcea8cSEd Schouten else 161372fcea8cSEd Schouten search(TRUE); 161472fcea8cSEd Schouten } 161572fcea8cSEd Schouten else if (in == KEY_F(6)) 161672fcea8cSEd Schouten { 161772fcea8cSEd Schouten if (gold) 161872fcea8cSEd Schouten { 161972fcea8cSEd Schouten gold = FALSE; 162072fcea8cSEd Schouten bottom(); 162172fcea8cSEd Schouten } 162272fcea8cSEd Schouten else 162372fcea8cSEd Schouten top(); 162472fcea8cSEd Schouten } 162572fcea8cSEd Schouten else if (in == KEY_F(7)) 162672fcea8cSEd Schouten { 162772fcea8cSEd Schouten if (gold) 162872fcea8cSEd Schouten { 162972fcea8cSEd Schouten gold = FALSE; 163072fcea8cSEd Schouten eol(); 163172fcea8cSEd Schouten } 163272fcea8cSEd Schouten else 163372fcea8cSEd Schouten bol(); 163472fcea8cSEd Schouten } 163572fcea8cSEd Schouten else if (in == KEY_F(8)) 163672fcea8cSEd Schouten { 163772fcea8cSEd Schouten if (gold) 163872fcea8cSEd Schouten { 163972fcea8cSEd Schouten gold = FALSE; 164072fcea8cSEd Schouten command_prompt(); 164172fcea8cSEd Schouten } 164272fcea8cSEd Schouten else 164372fcea8cSEd Schouten adv_line(); 164472fcea8cSEd Schouten } 164572fcea8cSEd Schouten } 164672fcea8cSEd Schouten 164772fcea8cSEd Schouten void 164872fcea8cSEd Schouten print_buffer() 164972fcea8cSEd Schouten { 165072fcea8cSEd Schouten char buffer[256]; 165172fcea8cSEd Schouten 165272fcea8cSEd Schouten sprintf(buffer, ">!%s", print_command); 165372fcea8cSEd Schouten wmove(com_win, 0, 0); 165472fcea8cSEd Schouten wclrtoeol(com_win); 165572fcea8cSEd Schouten wprintw(com_win, printer_msg_str, print_command); 165672fcea8cSEd Schouten wrefresh(com_win); 165772fcea8cSEd Schouten command(buffer); 165872fcea8cSEd Schouten } 165972fcea8cSEd Schouten 166072fcea8cSEd Schouten void 166172fcea8cSEd Schouten command_prompt() 166272fcea8cSEd Schouten { 166372fcea8cSEd Schouten char *cmd_str; 166472fcea8cSEd Schouten int result; 166572fcea8cSEd Schouten 166672fcea8cSEd Schouten info_type = COMMANDS; 166772fcea8cSEd Schouten paint_info_win(); 166872fcea8cSEd Schouten cmd_str = get_string(command_str, TRUE); 166972fcea8cSEd Schouten if ((result = unique_test(cmd_str, commands)) != 1) 167072fcea8cSEd Schouten { 167172fcea8cSEd Schouten werase(com_win); 167272fcea8cSEd Schouten wmove(com_win, 0, 0); 167372fcea8cSEd Schouten if (result == 0) 167472fcea8cSEd Schouten wprintw(com_win, unkn_cmd_str, cmd_str); 167572fcea8cSEd Schouten else 167672fcea8cSEd Schouten wprintw(com_win, non_unique_cmd_msg); 167772fcea8cSEd Schouten 167872fcea8cSEd Schouten wrefresh(com_win); 167972fcea8cSEd Schouten 168072fcea8cSEd Schouten info_type = CONTROL_KEYS; 168172fcea8cSEd Schouten paint_info_win(); 168272fcea8cSEd Schouten 168372fcea8cSEd Schouten if (cmd_str != NULL) 168472fcea8cSEd Schouten free(cmd_str); 168572fcea8cSEd Schouten return; 168672fcea8cSEd Schouten } 168772fcea8cSEd Schouten command(cmd_str); 168872fcea8cSEd Schouten wrefresh(com_win); 168972fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset)); 169072fcea8cSEd Schouten info_type = CONTROL_KEYS; 169172fcea8cSEd Schouten paint_info_win(); 169272fcea8cSEd Schouten if (cmd_str != NULL) 169372fcea8cSEd Schouten free(cmd_str); 169472fcea8cSEd Schouten } 169572fcea8cSEd Schouten 169672fcea8cSEd Schouten void 169772fcea8cSEd Schouten command(cmd_str1) /* process commands from keyboard */ 169872fcea8cSEd Schouten char *cmd_str1; 169972fcea8cSEd Schouten { 170072fcea8cSEd Schouten char *cmd_str2 = NULL; 170172fcea8cSEd Schouten char *cmd_str = cmd_str1; 170272fcea8cSEd Schouten 170372fcea8cSEd Schouten clear_com_win = TRUE; 170472fcea8cSEd Schouten if (compare(cmd_str, HELP, FALSE)) 170572fcea8cSEd Schouten help(); 170672fcea8cSEd Schouten else if (compare(cmd_str, WRITE, FALSE)) 170772fcea8cSEd Schouten { 170872fcea8cSEd Schouten if (restrict_mode()) 170972fcea8cSEd Schouten { 171072fcea8cSEd Schouten return; 171172fcea8cSEd Schouten } 171272fcea8cSEd Schouten cmd_str = next_word(cmd_str); 171396b676e9SEd Schouten if (*cmd_str == '\0') 171472fcea8cSEd Schouten { 171572fcea8cSEd Schouten cmd_str = cmd_str2 = get_string(file_write_prompt_str, TRUE); 171672fcea8cSEd Schouten } 171772fcea8cSEd Schouten tmp_file = resolve_name(cmd_str); 1718cfe04e82SEd Schouten write_file(tmp_file, 1); 171972fcea8cSEd Schouten if (tmp_file != cmd_str) 172072fcea8cSEd Schouten free(tmp_file); 172172fcea8cSEd Schouten } 172272fcea8cSEd Schouten else if (compare(cmd_str, READ, FALSE)) 172372fcea8cSEd Schouten { 172472fcea8cSEd Schouten if (restrict_mode()) 172572fcea8cSEd Schouten { 172672fcea8cSEd Schouten return; 172772fcea8cSEd Schouten } 172872fcea8cSEd Schouten cmd_str = next_word(cmd_str); 172996b676e9SEd Schouten if (*cmd_str == '\0') 173072fcea8cSEd Schouten { 173172fcea8cSEd Schouten cmd_str = cmd_str2 = get_string(file_read_prompt_str, TRUE); 173272fcea8cSEd Schouten } 173372fcea8cSEd Schouten tmp_file = cmd_str; 173472fcea8cSEd Schouten recv_file = TRUE; 173572fcea8cSEd Schouten tmp_file = resolve_name(cmd_str); 173672fcea8cSEd Schouten check_fp(); 173772fcea8cSEd Schouten if (tmp_file != cmd_str) 173872fcea8cSEd Schouten free(tmp_file); 173972fcea8cSEd Schouten } 174072fcea8cSEd Schouten else if (compare(cmd_str, LINE, FALSE)) 174172fcea8cSEd Schouten { 174272fcea8cSEd Schouten wmove(com_win, 0, 0); 174372fcea8cSEd Schouten wclrtoeol(com_win); 174472fcea8cSEd Schouten wprintw(com_win, line_num_str, curr_line->line_number); 174572fcea8cSEd Schouten wprintw(com_win, line_len_str, curr_line->line_length); 174672fcea8cSEd Schouten } 174772fcea8cSEd Schouten else if (compare(cmd_str, FILE_str, FALSE)) 174872fcea8cSEd Schouten { 174972fcea8cSEd Schouten wmove(com_win, 0, 0); 175072fcea8cSEd Schouten wclrtoeol(com_win); 175172fcea8cSEd Schouten if (in_file_name == NULL) 175272fcea8cSEd Schouten wprintw(com_win, no_file_string); 175372fcea8cSEd Schouten else 175472fcea8cSEd Schouten wprintw(com_win, current_file_str, in_file_name); 175572fcea8cSEd Schouten } 175672fcea8cSEd Schouten else if ((*cmd_str >= '0') && (*cmd_str <= '9')) 175772fcea8cSEd Schouten goto_line(cmd_str); 175872fcea8cSEd Schouten else if (compare(cmd_str, CHARACTER, FALSE)) 175972fcea8cSEd Schouten { 176072fcea8cSEd Schouten wmove(com_win, 0, 0); 176172fcea8cSEd Schouten wclrtoeol(com_win); 176272fcea8cSEd Schouten wprintw(com_win, char_str, *point); 176372fcea8cSEd Schouten } 176472fcea8cSEd Schouten else if (compare(cmd_str, REDRAW, FALSE)) 176572fcea8cSEd Schouten redraw(); 176672fcea8cSEd Schouten else if (compare(cmd_str, RESEQUENCE, FALSE)) 176772fcea8cSEd Schouten { 176872fcea8cSEd Schouten tmp_line = first_line->next_line; 176972fcea8cSEd Schouten while (tmp_line != NULL) 177072fcea8cSEd Schouten { 177172fcea8cSEd Schouten tmp_line->line_number = tmp_line->prev_line->line_number + 1; 177272fcea8cSEd Schouten tmp_line = tmp_line->next_line; 177372fcea8cSEd Schouten } 177472fcea8cSEd Schouten } 177572fcea8cSEd Schouten else if (compare(cmd_str, AUTHOR, FALSE)) 177672fcea8cSEd Schouten { 177772fcea8cSEd Schouten wmove(com_win, 0, 0); 177872fcea8cSEd Schouten wclrtoeol(com_win); 177972fcea8cSEd Schouten wprintw(com_win, "written by Hugh Mahon"); 178072fcea8cSEd Schouten } 178172fcea8cSEd Schouten else if (compare(cmd_str, VERSION, FALSE)) 178272fcea8cSEd Schouten { 178372fcea8cSEd Schouten wmove(com_win, 0, 0); 178472fcea8cSEd Schouten wclrtoeol(com_win); 178572fcea8cSEd Schouten wprintw(com_win, "%s", version); 178672fcea8cSEd Schouten } 178772fcea8cSEd Schouten else if (compare(cmd_str, CASE, FALSE)) 178872fcea8cSEd Schouten case_sen = TRUE; 178972fcea8cSEd Schouten else if (compare(cmd_str, NOCASE, FALSE)) 179072fcea8cSEd Schouten case_sen = FALSE; 179172fcea8cSEd Schouten else if (compare(cmd_str, EXPAND, FALSE)) 179272fcea8cSEd Schouten expand_tabs = TRUE; 179372fcea8cSEd Schouten else if (compare(cmd_str, NOEXPAND, FALSE)) 179472fcea8cSEd Schouten expand_tabs = FALSE; 179572fcea8cSEd Schouten else if (compare(cmd_str, Exit_string, FALSE)) 179672fcea8cSEd Schouten finish(); 179772fcea8cSEd Schouten else if (compare(cmd_str, chinese_cmd, FALSE)) 179872fcea8cSEd Schouten { 179972fcea8cSEd Schouten ee_chinese = TRUE; 180072fcea8cSEd Schouten #ifdef NCURSE 180172fcea8cSEd Schouten nc_setattrib(A_NC_BIG5); 180272fcea8cSEd Schouten #endif /* NCURSE */ 180372fcea8cSEd Schouten } 180472fcea8cSEd Schouten else if (compare(cmd_str, nochinese_cmd, FALSE)) 180572fcea8cSEd Schouten { 180672fcea8cSEd Schouten ee_chinese = FALSE; 180772fcea8cSEd Schouten #ifdef NCURSE 180872fcea8cSEd Schouten nc_clearattrib(A_NC_BIG5); 180972fcea8cSEd Schouten #endif /* NCURSE */ 181072fcea8cSEd Schouten } 181172fcea8cSEd Schouten else if (compare(cmd_str, QUIT_string, FALSE)) 181272fcea8cSEd Schouten quit(0); 181372fcea8cSEd Schouten else if (*cmd_str == '!') 181472fcea8cSEd Schouten { 181572fcea8cSEd Schouten cmd_str++; 181672fcea8cSEd Schouten if ((*cmd_str == ' ') || (*cmd_str == 9)) 181772fcea8cSEd Schouten cmd_str = next_word(cmd_str); 181872fcea8cSEd Schouten sh_command(cmd_str); 181972fcea8cSEd Schouten } 182072fcea8cSEd Schouten else if ((*cmd_str == '<') && (!in_pipe)) 182172fcea8cSEd Schouten { 182272fcea8cSEd Schouten in_pipe = TRUE; 182372fcea8cSEd Schouten shell_fork = FALSE; 182472fcea8cSEd Schouten cmd_str++; 182572fcea8cSEd Schouten if ((*cmd_str == ' ') || (*cmd_str == '\t')) 182672fcea8cSEd Schouten cmd_str = next_word(cmd_str); 182772fcea8cSEd Schouten command(cmd_str); 182872fcea8cSEd Schouten in_pipe = FALSE; 182972fcea8cSEd Schouten shell_fork = TRUE; 183072fcea8cSEd Schouten } 183172fcea8cSEd Schouten else if ((*cmd_str == '>') && (!out_pipe)) 183272fcea8cSEd Schouten { 183372fcea8cSEd Schouten out_pipe = TRUE; 183472fcea8cSEd Schouten cmd_str++; 183572fcea8cSEd Schouten if ((*cmd_str == ' ') || (*cmd_str == '\t')) 183672fcea8cSEd Schouten cmd_str = next_word(cmd_str); 183772fcea8cSEd Schouten command(cmd_str); 183872fcea8cSEd Schouten out_pipe = FALSE; 183972fcea8cSEd Schouten } 184072fcea8cSEd Schouten else 184172fcea8cSEd Schouten { 184272fcea8cSEd Schouten wmove(com_win, 0, 0); 184372fcea8cSEd Schouten wclrtoeol(com_win); 184472fcea8cSEd Schouten wprintw(com_win, unkn_cmd_str, cmd_str); 184572fcea8cSEd Schouten } 184672fcea8cSEd Schouten if (cmd_str2 != NULL) 184772fcea8cSEd Schouten free(cmd_str2); 184872fcea8cSEd Schouten } 184972fcea8cSEd Schouten 185072fcea8cSEd Schouten int 185172fcea8cSEd Schouten scan(line, offset, column) /* determine horizontal position for get_string */ 185272fcea8cSEd Schouten char *line; 185372fcea8cSEd Schouten int offset; 185472fcea8cSEd Schouten int column; 185572fcea8cSEd Schouten { 185672fcea8cSEd Schouten char *stemp; 185772fcea8cSEd Schouten int i; 185872fcea8cSEd Schouten int j; 185972fcea8cSEd Schouten 186072fcea8cSEd Schouten stemp = line; 186172fcea8cSEd Schouten i = 0; 186272fcea8cSEd Schouten j = column; 186372fcea8cSEd Schouten while (i < offset) 186472fcea8cSEd Schouten { 186572fcea8cSEd Schouten i++; 186672fcea8cSEd Schouten j += len_char(*stemp, j); 186772fcea8cSEd Schouten stemp++; 186872fcea8cSEd Schouten } 186972fcea8cSEd Schouten return(j); 187072fcea8cSEd Schouten } 187172fcea8cSEd Schouten 187272fcea8cSEd Schouten char * 187372fcea8cSEd Schouten get_string(prompt, advance) /* read string from input on command line */ 187472fcea8cSEd Schouten char *prompt; /* string containing user prompt message */ 187572fcea8cSEd Schouten int advance; /* if true, skip leading spaces and tabs */ 187672fcea8cSEd Schouten { 187772fcea8cSEd Schouten char *string; 187872fcea8cSEd Schouten char *tmp_string; 187972fcea8cSEd Schouten char *nam_str; 188072fcea8cSEd Schouten char *g_point; 188172fcea8cSEd Schouten int tmp_int; 188272fcea8cSEd Schouten int g_horz, g_position, g_pos; 188372fcea8cSEd Schouten int esc_flag; 188472fcea8cSEd Schouten 188572fcea8cSEd Schouten g_point = tmp_string = malloc(512); 188672fcea8cSEd Schouten wmove(com_win,0,0); 188772fcea8cSEd Schouten wclrtoeol(com_win); 188872fcea8cSEd Schouten waddstr(com_win, prompt); 188972fcea8cSEd Schouten wrefresh(com_win); 189072fcea8cSEd Schouten nam_str = tmp_string; 189172fcea8cSEd Schouten clear_com_win = TRUE; 189272fcea8cSEd Schouten g_horz = g_position = scan(prompt, strlen(prompt), 0); 189372fcea8cSEd Schouten g_pos = 0; 189472fcea8cSEd Schouten do 189572fcea8cSEd Schouten { 189672fcea8cSEd Schouten esc_flag = FALSE; 189772fcea8cSEd Schouten in = wgetch(com_win); 189872fcea8cSEd Schouten if (in == -1) 189996b676e9SEd Schouten exit(0); 190072fcea8cSEd Schouten if (((in == 8) || (in == 127) || (in == KEY_BACKSPACE)) && (g_pos > 0)) 190172fcea8cSEd Schouten { 190272fcea8cSEd Schouten tmp_int = g_horz; 190372fcea8cSEd Schouten g_pos--; 190472fcea8cSEd Schouten g_horz = scan(g_point, g_pos, g_position); 190572fcea8cSEd Schouten tmp_int = tmp_int - g_horz; 190672fcea8cSEd Schouten for (; 0 < tmp_int; tmp_int--) 190772fcea8cSEd Schouten { 190872fcea8cSEd Schouten if ((g_horz+tmp_int) < (last_col - 1)) 190972fcea8cSEd Schouten { 191072fcea8cSEd Schouten waddch(com_win, '\010'); 191172fcea8cSEd Schouten waddch(com_win, ' '); 191272fcea8cSEd Schouten waddch(com_win, '\010'); 191372fcea8cSEd Schouten } 191472fcea8cSEd Schouten } 191572fcea8cSEd Schouten nam_str--; 191672fcea8cSEd Schouten } 191772fcea8cSEd Schouten else if ((in != 8) && (in != 127) && (in != '\n') && (in != '\r') && (in < 256)) 191872fcea8cSEd Schouten { 191972fcea8cSEd Schouten if (in == '\026') /* control-v, accept next character verbatim */ 192072fcea8cSEd Schouten { /* allows entry of ^m, ^j, and ^h */ 192172fcea8cSEd Schouten esc_flag = TRUE; 192272fcea8cSEd Schouten in = wgetch(com_win); 192372fcea8cSEd Schouten if (in == -1) 192496b676e9SEd Schouten exit(0); 192572fcea8cSEd Schouten } 192672fcea8cSEd Schouten *nam_str = in; 192772fcea8cSEd Schouten g_pos++; 1928f39e07f3SAndrey A. Chernov if (!isprint((unsigned char)in) && (g_horz < (last_col - 1))) 192972fcea8cSEd Schouten g_horz += out_char(com_win, in, g_horz); 193072fcea8cSEd Schouten else 193172fcea8cSEd Schouten { 193272fcea8cSEd Schouten g_horz++; 193372fcea8cSEd Schouten if (g_horz < (last_col - 1)) 1934f39e07f3SAndrey A. Chernov waddch(com_win, (unsigned char)in); 193572fcea8cSEd Schouten } 193672fcea8cSEd Schouten nam_str++; 193772fcea8cSEd Schouten } 193872fcea8cSEd Schouten wrefresh(com_win); 193972fcea8cSEd Schouten if (esc_flag) 194096b676e9SEd Schouten in = '\0'; 194172fcea8cSEd Schouten } while ((in != '\n') && (in != '\r')); 194296b676e9SEd Schouten *nam_str = '\0'; 194372fcea8cSEd Schouten nam_str = tmp_string; 194472fcea8cSEd Schouten if (((*nam_str == ' ') || (*nam_str == 9)) && (advance)) 194572fcea8cSEd Schouten nam_str = next_word(nam_str); 194672fcea8cSEd Schouten string = malloc(strlen(nam_str) + 1); 194772fcea8cSEd Schouten strcpy(string, nam_str); 194872fcea8cSEd Schouten free(tmp_string); 194972fcea8cSEd Schouten wrefresh(com_win); 195072fcea8cSEd Schouten return(string); 195172fcea8cSEd Schouten } 195272fcea8cSEd Schouten 195372fcea8cSEd Schouten int 195472fcea8cSEd Schouten compare(string1, string2, sensitive) /* compare two strings */ 195572fcea8cSEd Schouten char *string1; 195672fcea8cSEd Schouten char *string2; 195772fcea8cSEd Schouten int sensitive; 195872fcea8cSEd Schouten { 195972fcea8cSEd Schouten char *strng1; 196072fcea8cSEd Schouten char *strng2; 196172fcea8cSEd Schouten int tmp; 196272fcea8cSEd Schouten int equal; 196372fcea8cSEd Schouten 196472fcea8cSEd Schouten strng1 = string1; 196572fcea8cSEd Schouten strng2 = string2; 196672fcea8cSEd Schouten tmp = 0; 196796b676e9SEd Schouten if ((strng1 == NULL) || (strng2 == NULL) || (*strng1 == '\0') || (*strng2 == '\0')) 196872fcea8cSEd Schouten return(FALSE); 196972fcea8cSEd Schouten equal = TRUE; 197072fcea8cSEd Schouten while (equal) 197172fcea8cSEd Schouten { 197272fcea8cSEd Schouten if (sensitive) 197372fcea8cSEd Schouten { 197472fcea8cSEd Schouten if (*strng1 != *strng2) 197572fcea8cSEd Schouten equal = FALSE; 197672fcea8cSEd Schouten } 197772fcea8cSEd Schouten else 197872fcea8cSEd Schouten { 197931dcbfadSAndrey A. Chernov if (toupper((unsigned char)*strng1) != toupper((unsigned char)*strng2)) 198072fcea8cSEd Schouten equal = FALSE; 198172fcea8cSEd Schouten } 198272fcea8cSEd Schouten strng1++; 198372fcea8cSEd Schouten strng2++; 198496b676e9SEd Schouten if ((*strng1 == '\0') || (*strng2 == '\0') || (*strng1 == ' ') || (*strng2 == ' ')) 198572fcea8cSEd Schouten break; 198672fcea8cSEd Schouten tmp++; 198772fcea8cSEd Schouten } 198872fcea8cSEd Schouten return(equal); 198972fcea8cSEd Schouten } 199072fcea8cSEd Schouten 199172fcea8cSEd Schouten void 199272fcea8cSEd Schouten goto_line(cmd_str) 199372fcea8cSEd Schouten char *cmd_str; 199472fcea8cSEd Schouten { 199572fcea8cSEd Schouten int number; 199672fcea8cSEd Schouten int i; 199772fcea8cSEd Schouten char *ptr; 19987bf1ea96SEd Schouten char direction = '\0'; 199972fcea8cSEd Schouten struct text *t_line; 200072fcea8cSEd Schouten 200172fcea8cSEd Schouten ptr = cmd_str; 200272fcea8cSEd Schouten i= 0; 200372fcea8cSEd Schouten while ((*ptr >='0') && (*ptr <= '9')) 200472fcea8cSEd Schouten { 200572fcea8cSEd Schouten i= i * 10 + (*ptr - '0'); 200672fcea8cSEd Schouten ptr++; 200772fcea8cSEd Schouten } 200872fcea8cSEd Schouten number = i; 200972fcea8cSEd Schouten i = 0; 201072fcea8cSEd Schouten t_line = curr_line; 201172fcea8cSEd Schouten while ((t_line->line_number > number) && (t_line->prev_line != NULL)) 201272fcea8cSEd Schouten { 201372fcea8cSEd Schouten i++; 201472fcea8cSEd Schouten t_line = t_line->prev_line; 20157bf1ea96SEd Schouten direction = 'u'; 201672fcea8cSEd Schouten } 201772fcea8cSEd Schouten while ((t_line->line_number < number) && (t_line->next_line != NULL)) 201872fcea8cSEd Schouten { 201972fcea8cSEd Schouten i++; 20207bf1ea96SEd Schouten direction = 'd'; 202172fcea8cSEd Schouten t_line = t_line->next_line; 202272fcea8cSEd Schouten } 202372fcea8cSEd Schouten if ((i < 30) && (i > 0)) 202472fcea8cSEd Schouten { 202572fcea8cSEd Schouten move_rel(direction, i); 202672fcea8cSEd Schouten } 202772fcea8cSEd Schouten else 202872fcea8cSEd Schouten { 20297bf1ea96SEd Schouten if (direction != 'd') 203096b676e9SEd Schouten { 203196b676e9SEd Schouten absolute_lin += i; 203296b676e9SEd Schouten } 203396b676e9SEd Schouten else 203496b676e9SEd Schouten { 203596b676e9SEd Schouten absolute_lin -= i; 203696b676e9SEd Schouten } 203772fcea8cSEd Schouten curr_line = t_line; 203872fcea8cSEd Schouten point = curr_line->line; 203972fcea8cSEd Schouten position = 1; 204072fcea8cSEd Schouten midscreen((last_line / 2), point); 204172fcea8cSEd Schouten scr_pos = scr_horz; 204272fcea8cSEd Schouten } 204372fcea8cSEd Schouten wmove(com_win, 0, 0); 204472fcea8cSEd Schouten wclrtoeol(com_win); 204572fcea8cSEd Schouten wprintw(com_win, line_num_str, curr_line->line_number); 204672fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset)); 204772fcea8cSEd Schouten } 204872fcea8cSEd Schouten 204972fcea8cSEd Schouten void 205072fcea8cSEd Schouten midscreen(line, pnt) /* put current line in middle of screen */ 205172fcea8cSEd Schouten int line; 205272fcea8cSEd Schouten unsigned char *pnt; 205372fcea8cSEd Schouten { 205472fcea8cSEd Schouten struct text *mid_line; 205572fcea8cSEd Schouten int i; 205672fcea8cSEd Schouten 205772fcea8cSEd Schouten line = min(line, last_line); 205872fcea8cSEd Schouten mid_line = curr_line; 205972fcea8cSEd Schouten for (i = 0; ((i < line) && (curr_line->prev_line != NULL)); i++) 206072fcea8cSEd Schouten curr_line = curr_line->prev_line; 206172fcea8cSEd Schouten scr_vert = scr_horz = 0; 206272fcea8cSEd Schouten wmove(text_win, 0, 0); 206372fcea8cSEd Schouten draw_screen(); 206472fcea8cSEd Schouten scr_vert = i; 206572fcea8cSEd Schouten curr_line = mid_line; 206672fcea8cSEd Schouten scanline(pnt); 206772fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset)); 206872fcea8cSEd Schouten } 206972fcea8cSEd Schouten 207072fcea8cSEd Schouten void 207172fcea8cSEd Schouten get_options(numargs, arguments) /* get arguments from command line */ 207272fcea8cSEd Schouten int numargs; 207372fcea8cSEd Schouten char *arguments[]; 207472fcea8cSEd Schouten { 207572fcea8cSEd Schouten char *buff; 207672fcea8cSEd Schouten int count; 2077cfe04e82SEd Schouten struct files *temp_names = NULL; 207872fcea8cSEd Schouten char *name; 207972fcea8cSEd Schouten char *ptr; 2080cfe04e82SEd Schouten int no_more_opts = FALSE; 208172fcea8cSEd Schouten 208272fcea8cSEd Schouten /* 208372fcea8cSEd Schouten | see if editor was invoked as 'ree' (restricted mode) 208472fcea8cSEd Schouten */ 208572fcea8cSEd Schouten 208672fcea8cSEd Schouten if (!(name = strrchr(arguments[0], '/'))) 208772fcea8cSEd Schouten name = arguments[0]; 208872fcea8cSEd Schouten else 208972fcea8cSEd Schouten name++; 209072fcea8cSEd Schouten if (!strcmp(name, "ree")) 209172fcea8cSEd Schouten restricted = TRUE; 209272fcea8cSEd Schouten 209372fcea8cSEd Schouten top_of_stack = NULL; 209472fcea8cSEd Schouten input_file = FALSE; 209572fcea8cSEd Schouten recv_file = FALSE; 209672fcea8cSEd Schouten count = 1; 2097cfe04e82SEd Schouten while ((count < numargs)&& (!no_more_opts)) 209872fcea8cSEd Schouten { 209972fcea8cSEd Schouten buff = arguments[count]; 210072fcea8cSEd Schouten if (!strcmp("-i", buff)) 210172fcea8cSEd Schouten { 210272fcea8cSEd Schouten info_window = FALSE; 210372fcea8cSEd Schouten } 210472fcea8cSEd Schouten else if (!strcmp("-e", buff)) 210572fcea8cSEd Schouten { 210672fcea8cSEd Schouten expand_tabs = FALSE; 210772fcea8cSEd Schouten } 210872fcea8cSEd Schouten else if (!strcmp("-h", buff)) 210972fcea8cSEd Schouten { 211072fcea8cSEd Schouten nohighlight = TRUE; 211172fcea8cSEd Schouten } 211272fcea8cSEd Schouten else if (!strcmp("-?", buff)) 211372fcea8cSEd Schouten { 211472fcea8cSEd Schouten fprintf(stderr, usage0, arguments[0]); 21158f04da68SDimitry Andric fputs(usage1, stderr); 21168f04da68SDimitry Andric fputs(usage2, stderr); 21178f04da68SDimitry Andric fputs(usage3, stderr); 21188f04da68SDimitry Andric fputs(usage4, stderr); 211972fcea8cSEd Schouten exit(1); 212072fcea8cSEd Schouten } 212196b676e9SEd Schouten else if ((*buff == '+') && (start_at_line == NULL)) 212272fcea8cSEd Schouten { 212372fcea8cSEd Schouten buff++; 212472fcea8cSEd Schouten start_at_line = buff; 212572fcea8cSEd Schouten } 2126cfe04e82SEd Schouten else if (!(strcmp("--", buff))) 2127cfe04e82SEd Schouten no_more_opts = TRUE; 212872fcea8cSEd Schouten else 212972fcea8cSEd Schouten { 2130cfe04e82SEd Schouten count--; 2131cfe04e82SEd Schouten no_more_opts = TRUE; 2132cfe04e82SEd Schouten } 2133cfe04e82SEd Schouten count++; 2134cfe04e82SEd Schouten } 2135cfe04e82SEd Schouten while (count < numargs) 2136cfe04e82SEd Schouten { 2137cfe04e82SEd Schouten buff = arguments[count]; 213872fcea8cSEd Schouten if (top_of_stack == NULL) 213972fcea8cSEd Schouten { 214072fcea8cSEd Schouten temp_names = top_of_stack = name_alloc(); 214172fcea8cSEd Schouten } 214272fcea8cSEd Schouten else 214372fcea8cSEd Schouten { 214472fcea8cSEd Schouten temp_names->next_name = name_alloc(); 214572fcea8cSEd Schouten temp_names = temp_names->next_name; 214672fcea8cSEd Schouten } 214772fcea8cSEd Schouten ptr = temp_names->name = malloc(strlen(buff) + 1); 214896b676e9SEd Schouten while (*buff != '\0') 214972fcea8cSEd Schouten { 215072fcea8cSEd Schouten *ptr = *buff; 215172fcea8cSEd Schouten buff++; 215272fcea8cSEd Schouten ptr++; 215372fcea8cSEd Schouten } 215496b676e9SEd Schouten *ptr = '\0'; 215572fcea8cSEd Schouten temp_names->next_name = NULL; 215672fcea8cSEd Schouten input_file = TRUE; 215772fcea8cSEd Schouten recv_file = TRUE; 215872fcea8cSEd Schouten count++; 215972fcea8cSEd Schouten } 216072fcea8cSEd Schouten } 216172fcea8cSEd Schouten 216272fcea8cSEd Schouten void 216372fcea8cSEd Schouten check_fp() /* open or close files according to flags */ 216472fcea8cSEd Schouten { 216572fcea8cSEd Schouten int line_num; 216672fcea8cSEd Schouten int temp; 216772fcea8cSEd Schouten struct stat buf; 216872fcea8cSEd Schouten 216972fcea8cSEd Schouten clear_com_win = TRUE; 217072fcea8cSEd Schouten tmp_vert = scr_vert; 217172fcea8cSEd Schouten tmp_horz = scr_horz; 217272fcea8cSEd Schouten tmp_line = curr_line; 217372fcea8cSEd Schouten if (input_file) 217472fcea8cSEd Schouten { 217572fcea8cSEd Schouten in_file_name = tmp_file = top_of_stack->name; 217672fcea8cSEd Schouten top_of_stack = top_of_stack->next_name; 217772fcea8cSEd Schouten } 217872fcea8cSEd Schouten temp = stat(tmp_file, &buf); 217972fcea8cSEd Schouten buf.st_mode &= ~07777; 218072fcea8cSEd Schouten if ((temp != -1) && (buf.st_mode != 0100000) && (buf.st_mode != 0)) 218172fcea8cSEd Schouten { 218272fcea8cSEd Schouten wprintw(com_win, file_is_dir_msg, tmp_file); 218372fcea8cSEd Schouten wrefresh(com_win); 218472fcea8cSEd Schouten if (input_file) 218572fcea8cSEd Schouten { 218672fcea8cSEd Schouten quit(0); 218772fcea8cSEd Schouten return; 218872fcea8cSEd Schouten } 218972fcea8cSEd Schouten else 219072fcea8cSEd Schouten return; 219172fcea8cSEd Schouten } 219272fcea8cSEd Schouten if ((get_fd = open(tmp_file, O_RDONLY)) == -1) 219372fcea8cSEd Schouten { 219472fcea8cSEd Schouten wmove(com_win, 0, 0); 219572fcea8cSEd Schouten wclrtoeol(com_win); 219672fcea8cSEd Schouten if (input_file) 219772fcea8cSEd Schouten wprintw(com_win, new_file_msg, tmp_file); 219872fcea8cSEd Schouten else 219972fcea8cSEd Schouten wprintw(com_win, cant_open_msg, tmp_file); 220072fcea8cSEd Schouten wrefresh(com_win); 220172fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset)); 220272fcea8cSEd Schouten wrefresh(text_win); 220372fcea8cSEd Schouten recv_file = FALSE; 220472fcea8cSEd Schouten input_file = FALSE; 220572fcea8cSEd Schouten return; 220672fcea8cSEd Schouten } 220772fcea8cSEd Schouten else 220872fcea8cSEd Schouten get_file(tmp_file); 220972fcea8cSEd Schouten 221072fcea8cSEd Schouten recv_file = FALSE; 221172fcea8cSEd Schouten line_num = curr_line->line_number; 221272fcea8cSEd Schouten scr_vert = tmp_vert; 221372fcea8cSEd Schouten scr_horz = tmp_horz; 221472fcea8cSEd Schouten if (input_file) 221572fcea8cSEd Schouten curr_line= first_line; 221672fcea8cSEd Schouten else 221772fcea8cSEd Schouten curr_line = tmp_line; 221872fcea8cSEd Schouten point = curr_line->line; 221972fcea8cSEd Schouten draw_screen(); 222072fcea8cSEd Schouten if (input_file) 222172fcea8cSEd Schouten { 222272fcea8cSEd Schouten input_file = FALSE; 222372fcea8cSEd Schouten if (start_at_line != NULL) 222472fcea8cSEd Schouten { 222572fcea8cSEd Schouten line_num = atoi(start_at_line) - 1; 22267bf1ea96SEd Schouten move_rel('d', line_num); 222772fcea8cSEd Schouten line_num = 0; 222872fcea8cSEd Schouten start_at_line = NULL; 222972fcea8cSEd Schouten } 223072fcea8cSEd Schouten } 223172fcea8cSEd Schouten else 223272fcea8cSEd Schouten { 223372fcea8cSEd Schouten wmove(com_win, 0, 0); 223472fcea8cSEd Schouten wclrtoeol(com_win); 223572fcea8cSEd Schouten text_changes = TRUE; 223696b676e9SEd Schouten if ((tmp_file != NULL) && (*tmp_file != '\0')) 223772fcea8cSEd Schouten wprintw(com_win, file_read_fin_msg, tmp_file); 223872fcea8cSEd Schouten } 223972fcea8cSEd Schouten wrefresh(com_win); 224072fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset)); 224172fcea8cSEd Schouten wrefresh(text_win); 224272fcea8cSEd Schouten } 224372fcea8cSEd Schouten 224472fcea8cSEd Schouten void 224572fcea8cSEd Schouten get_file(file_name) /* read specified file into current buffer */ 224672fcea8cSEd Schouten char *file_name; 224772fcea8cSEd Schouten { 224872fcea8cSEd Schouten int can_read; /* file has at least one character */ 224972fcea8cSEd Schouten int length; /* length of line read by read */ 225072fcea8cSEd Schouten int append; /* should text be appended to current line */ 225172fcea8cSEd Schouten struct text *temp_line; 225272fcea8cSEd Schouten char ro_flag = FALSE; 225372fcea8cSEd Schouten 225472fcea8cSEd Schouten if (recv_file) /* if reading a file */ 225572fcea8cSEd Schouten { 225672fcea8cSEd Schouten wmove(com_win, 0, 0); 225772fcea8cSEd Schouten wclrtoeol(com_win); 225872fcea8cSEd Schouten wprintw(com_win, reading_file_msg, file_name); 225972fcea8cSEd Schouten if (access(file_name, 2)) /* check permission to write */ 226072fcea8cSEd Schouten { 226172fcea8cSEd Schouten if ((errno == ENOTDIR) || (errno == EACCES) || (errno == EROFS) || (errno == ETXTBSY) || (errno == EFAULT)) 226272fcea8cSEd Schouten { 226372fcea8cSEd Schouten wprintw(com_win, read_only_msg); 226472fcea8cSEd Schouten ro_flag = TRUE; 226572fcea8cSEd Schouten } 226672fcea8cSEd Schouten } 226772fcea8cSEd Schouten wrefresh(com_win); 226872fcea8cSEd Schouten } 226972fcea8cSEd Schouten if (curr_line->line_length > 1) /* if current line is not blank */ 227072fcea8cSEd Schouten { 227172fcea8cSEd Schouten insert_line(FALSE); 227272fcea8cSEd Schouten left(FALSE); 227372fcea8cSEd Schouten append = FALSE; 227472fcea8cSEd Schouten } 227572fcea8cSEd Schouten else 227672fcea8cSEd Schouten append = TRUE; 227772fcea8cSEd Schouten can_read = FALSE; /* test if file has any characters */ 227872fcea8cSEd Schouten while (((length = read(get_fd, in_string, 512)) != 0) && (length != -1)) 227972fcea8cSEd Schouten { 228072fcea8cSEd Schouten can_read = TRUE; /* if set file has at least 1 character */ 228172fcea8cSEd Schouten get_line(length, in_string, &append); 228272fcea8cSEd Schouten } 228372fcea8cSEd Schouten if ((can_read) && (curr_line->line_length == 1)) 228472fcea8cSEd Schouten { 228572fcea8cSEd Schouten temp_line = curr_line->prev_line; 228672fcea8cSEd Schouten temp_line->next_line = curr_line->next_line; 228772fcea8cSEd Schouten if (temp_line->next_line != NULL) 228872fcea8cSEd Schouten temp_line->next_line->prev_line = temp_line; 228972fcea8cSEd Schouten if (curr_line->line != NULL) 229072fcea8cSEd Schouten free(curr_line->line); 229172fcea8cSEd Schouten free(curr_line); 229272fcea8cSEd Schouten curr_line = temp_line; 229372fcea8cSEd Schouten } 229472fcea8cSEd Schouten if (input_file) /* if this is the file to be edited display number of lines */ 229572fcea8cSEd Schouten { 229672fcea8cSEd Schouten wmove(com_win, 0, 0); 229772fcea8cSEd Schouten wclrtoeol(com_win); 229872fcea8cSEd Schouten wprintw(com_win, file_read_lines_msg, in_file_name, curr_line->line_number); 229972fcea8cSEd Schouten if (ro_flag) 230072fcea8cSEd Schouten wprintw(com_win, read_only_msg); 230172fcea8cSEd Schouten wrefresh(com_win); 230272fcea8cSEd Schouten } 230372fcea8cSEd Schouten else if (can_read) /* not input_file and file is non-zero size */ 230472fcea8cSEd Schouten text_changes = TRUE; 230572fcea8cSEd Schouten 230672fcea8cSEd Schouten if (recv_file) /* if reading a file */ 230772fcea8cSEd Schouten { 230872fcea8cSEd Schouten in = EOF; 230972fcea8cSEd Schouten } 231072fcea8cSEd Schouten } 231172fcea8cSEd Schouten 231272fcea8cSEd Schouten void 231372fcea8cSEd Schouten get_line(length, in_string, append) /* read string and split into lines */ 231472fcea8cSEd Schouten int length; /* length of string read by read */ 231572fcea8cSEd Schouten unsigned char *in_string; /* string read by read */ 231672fcea8cSEd Schouten int *append; /* TRUE if must append more text to end of current line */ 231772fcea8cSEd Schouten { 231872fcea8cSEd Schouten unsigned char *str1; 231972fcea8cSEd Schouten unsigned char *str2; 232072fcea8cSEd Schouten int num; /* offset from start of string */ 232172fcea8cSEd Schouten int char_count; /* length of new line (or added portion */ 232272fcea8cSEd Schouten int temp_counter; /* temporary counter value */ 232372fcea8cSEd Schouten struct text *tline; /* temporary pointer to new line */ 232472fcea8cSEd Schouten int first_time; /* if TRUE, the first time through the loop */ 232572fcea8cSEd Schouten 232672fcea8cSEd Schouten str2 = in_string; 232772fcea8cSEd Schouten num = 0; 232872fcea8cSEd Schouten first_time = TRUE; 232972fcea8cSEd Schouten while (num < length) 233072fcea8cSEd Schouten { 233172fcea8cSEd Schouten if (!first_time) 233272fcea8cSEd Schouten { 233372fcea8cSEd Schouten if (num < length) 233472fcea8cSEd Schouten { 233572fcea8cSEd Schouten str2++; 233672fcea8cSEd Schouten num++; 233772fcea8cSEd Schouten } 233872fcea8cSEd Schouten } 233972fcea8cSEd Schouten else 234072fcea8cSEd Schouten first_time = FALSE; 234172fcea8cSEd Schouten str1 = str2; 234272fcea8cSEd Schouten char_count = 1; 234372fcea8cSEd Schouten /* find end of line */ 234472fcea8cSEd Schouten while ((*str2 != '\n') && (num < length)) 234572fcea8cSEd Schouten { 234672fcea8cSEd Schouten str2++; 234772fcea8cSEd Schouten num++; 234872fcea8cSEd Schouten char_count++; 234972fcea8cSEd Schouten } 235072fcea8cSEd Schouten if (!(*append)) /* if not append to current line, insert new one */ 235172fcea8cSEd Schouten { 235272fcea8cSEd Schouten tline = txtalloc(); /* allocate data structure for next line */ 235396b676e9SEd Schouten tline->line_number = curr_line->line_number + 1; 235472fcea8cSEd Schouten tline->next_line = curr_line->next_line; 235572fcea8cSEd Schouten tline->prev_line = curr_line; 235672fcea8cSEd Schouten curr_line->next_line = tline; 235772fcea8cSEd Schouten if (tline->next_line != NULL) 235872fcea8cSEd Schouten tline->next_line->prev_line = tline; 235972fcea8cSEd Schouten curr_line = tline; 236072fcea8cSEd Schouten curr_line->line = point = (unsigned char *) malloc(char_count); 236172fcea8cSEd Schouten curr_line->line_length = char_count; 236272fcea8cSEd Schouten curr_line->max_length = char_count; 236372fcea8cSEd Schouten } 236472fcea8cSEd Schouten else 236572fcea8cSEd Schouten { 236672fcea8cSEd Schouten point = resiz_line(char_count, curr_line, curr_line->line_length); 236772fcea8cSEd Schouten curr_line->line_length += (char_count - 1); 236872fcea8cSEd Schouten } 236972fcea8cSEd Schouten for (temp_counter = 1; temp_counter < char_count; temp_counter++) 237072fcea8cSEd Schouten { 237172fcea8cSEd Schouten *point = *str1; 237272fcea8cSEd Schouten point++; 237372fcea8cSEd Schouten str1++; 237472fcea8cSEd Schouten } 237596b676e9SEd Schouten *point = '\0'; 237672fcea8cSEd Schouten *append = FALSE; 237772fcea8cSEd Schouten if ((num == length) && (*str2 != '\n')) 237872fcea8cSEd Schouten *append = TRUE; 237972fcea8cSEd Schouten } 238072fcea8cSEd Schouten } 238172fcea8cSEd Schouten 238272fcea8cSEd Schouten void 238372fcea8cSEd Schouten draw_screen() /* redraw the screen from current postion */ 238472fcea8cSEd Schouten { 238572fcea8cSEd Schouten struct text *temp_line; 238672fcea8cSEd Schouten unsigned char *line_out; 238772fcea8cSEd Schouten int temp_vert; 238872fcea8cSEd Schouten 238972fcea8cSEd Schouten temp_line = curr_line; 239072fcea8cSEd Schouten temp_vert = scr_vert; 239172fcea8cSEd Schouten wclrtobot(text_win); 239272fcea8cSEd Schouten while ((temp_line != NULL) && (temp_vert <= last_line)) 239372fcea8cSEd Schouten { 239472fcea8cSEd Schouten line_out = temp_line->line; 239572fcea8cSEd Schouten draw_line(temp_vert, 0, line_out, 1, temp_line->line_length); 239672fcea8cSEd Schouten temp_vert++; 239772fcea8cSEd Schouten temp_line = temp_line->next_line; 239872fcea8cSEd Schouten } 239972fcea8cSEd Schouten wmove(text_win, temp_vert, 0); 240072fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset)); 240172fcea8cSEd Schouten } 240272fcea8cSEd Schouten 240372fcea8cSEd Schouten void 240472fcea8cSEd Schouten finish() /* prepare to exit edit session */ 240572fcea8cSEd Schouten { 240672fcea8cSEd Schouten char *file_name = in_file_name; 240772fcea8cSEd Schouten 240872fcea8cSEd Schouten /* 240972fcea8cSEd Schouten | changes made here should be reflected in the 'save' 241072fcea8cSEd Schouten | portion of file_op() 241172fcea8cSEd Schouten */ 241272fcea8cSEd Schouten 241396b676e9SEd Schouten if ((file_name == NULL) || (*file_name == '\0')) 241472fcea8cSEd Schouten file_name = get_string(save_file_name_prompt, TRUE); 241572fcea8cSEd Schouten 241696b676e9SEd Schouten if ((file_name == NULL) || (*file_name == '\0')) 241772fcea8cSEd Schouten { 241872fcea8cSEd Schouten wmove(com_win, 0, 0); 241972fcea8cSEd Schouten wprintw(com_win, file_not_saved_msg); 242072fcea8cSEd Schouten wclrtoeol(com_win); 242172fcea8cSEd Schouten wrefresh(com_win); 242272fcea8cSEd Schouten clear_com_win = TRUE; 242372fcea8cSEd Schouten return; 242472fcea8cSEd Schouten } 242572fcea8cSEd Schouten 242672fcea8cSEd Schouten tmp_file = resolve_name(file_name); 242772fcea8cSEd Schouten if (tmp_file != file_name) 242872fcea8cSEd Schouten { 242972fcea8cSEd Schouten free(file_name); 243072fcea8cSEd Schouten file_name = tmp_file; 243172fcea8cSEd Schouten } 243272fcea8cSEd Schouten 2433cfe04e82SEd Schouten if (write_file(file_name, 1)) 243472fcea8cSEd Schouten { 243572fcea8cSEd Schouten text_changes = FALSE; 243672fcea8cSEd Schouten quit(0); 243772fcea8cSEd Schouten } 243872fcea8cSEd Schouten } 243972fcea8cSEd Schouten 244072fcea8cSEd Schouten int 244172fcea8cSEd Schouten quit(noverify) /* exit editor */ 244272fcea8cSEd Schouten int noverify; 244372fcea8cSEd Schouten { 244472fcea8cSEd Schouten char *ans; 244572fcea8cSEd Schouten 244672fcea8cSEd Schouten touchwin(text_win); 244772fcea8cSEd Schouten wrefresh(text_win); 244872fcea8cSEd Schouten if ((text_changes) && (!noverify)) 244972fcea8cSEd Schouten { 245072fcea8cSEd Schouten ans = get_string(changes_made_prompt, TRUE); 245131dcbfadSAndrey A. Chernov if (toupper((unsigned char)*ans) == toupper((unsigned char)*yes_char)) 245272fcea8cSEd Schouten text_changes = FALSE; 245372fcea8cSEd Schouten else 245472fcea8cSEd Schouten return(0); 245572fcea8cSEd Schouten free(ans); 245672fcea8cSEd Schouten } 245772fcea8cSEd Schouten if (top_of_stack == NULL) 245872fcea8cSEd Schouten { 245972fcea8cSEd Schouten if (info_window) 246072fcea8cSEd Schouten wrefresh(info_win); 246172fcea8cSEd Schouten wrefresh(com_win); 246272fcea8cSEd Schouten resetty(); 246372fcea8cSEd Schouten endwin(); 246472fcea8cSEd Schouten putchar('\n'); 246572fcea8cSEd Schouten exit(0); 246672fcea8cSEd Schouten } 246772fcea8cSEd Schouten else 246872fcea8cSEd Schouten { 246972fcea8cSEd Schouten delete_text(); 247072fcea8cSEd Schouten recv_file = TRUE; 247172fcea8cSEd Schouten input_file = TRUE; 247272fcea8cSEd Schouten check_fp(); 247372fcea8cSEd Schouten } 247472fcea8cSEd Schouten return(0); 247572fcea8cSEd Schouten } 247672fcea8cSEd Schouten 247772fcea8cSEd Schouten void 247872fcea8cSEd Schouten edit_abort(arg) 247972fcea8cSEd Schouten int arg; 248072fcea8cSEd Schouten { 248172fcea8cSEd Schouten wrefresh(com_win); 248272fcea8cSEd Schouten resetty(); 248372fcea8cSEd Schouten endwin(); 248472fcea8cSEd Schouten putchar('\n'); 248572fcea8cSEd Schouten exit(1); 248672fcea8cSEd Schouten } 248772fcea8cSEd Schouten 248872fcea8cSEd Schouten void 248972fcea8cSEd Schouten delete_text() 249072fcea8cSEd Schouten { 249172fcea8cSEd Schouten while (curr_line->next_line != NULL) 249272fcea8cSEd Schouten curr_line = curr_line->next_line; 249372fcea8cSEd Schouten while (curr_line != first_line) 249472fcea8cSEd Schouten { 249572fcea8cSEd Schouten free(curr_line->line); 249672fcea8cSEd Schouten curr_line = curr_line->prev_line; 249796b676e9SEd Schouten absolute_lin--; 249872fcea8cSEd Schouten free(curr_line->next_line); 249972fcea8cSEd Schouten } 250072fcea8cSEd Schouten curr_line->next_line = NULL; 250196b676e9SEd Schouten *curr_line->line = '\0'; 250272fcea8cSEd Schouten curr_line->line_length = 1; 250372fcea8cSEd Schouten curr_line->line_number = 1; 250472fcea8cSEd Schouten point = curr_line->line; 250572fcea8cSEd Schouten scr_pos = scr_vert = scr_horz = 0; 250672fcea8cSEd Schouten position = 1; 250772fcea8cSEd Schouten } 250872fcea8cSEd Schouten 250972fcea8cSEd Schouten int 2510cfe04e82SEd Schouten write_file(file_name, warn_if_exists) 251172fcea8cSEd Schouten char *file_name; 2512cfe04e82SEd Schouten int warn_if_exists; 251372fcea8cSEd Schouten { 251472fcea8cSEd Schouten char cr; 251572fcea8cSEd Schouten char *tmp_point; 251672fcea8cSEd Schouten struct text *out_line; 251772fcea8cSEd Schouten int lines, charac; 251872fcea8cSEd Schouten int temp_pos; 251972fcea8cSEd Schouten int write_flag = TRUE; 252072fcea8cSEd Schouten 252172fcea8cSEd Schouten charac = lines = 0; 2522cfe04e82SEd Schouten if (warn_if_exists && 2523cfe04e82SEd Schouten ((in_file_name == NULL) || strcmp(in_file_name, file_name))) 252472fcea8cSEd Schouten { 252572fcea8cSEd Schouten if ((temp_fp = fopen(file_name, "r"))) 252672fcea8cSEd Schouten { 252772fcea8cSEd Schouten tmp_point = get_string(file_exists_prompt, TRUE); 252831dcbfadSAndrey A. Chernov if (toupper((unsigned char)*tmp_point) == toupper((unsigned char)*yes_char)) 252972fcea8cSEd Schouten write_flag = TRUE; 253072fcea8cSEd Schouten else 253172fcea8cSEd Schouten write_flag = FALSE; 253272fcea8cSEd Schouten fclose(temp_fp); 253372fcea8cSEd Schouten free(tmp_point); 253472fcea8cSEd Schouten } 253572fcea8cSEd Schouten } 253672fcea8cSEd Schouten 253772fcea8cSEd Schouten clear_com_win = TRUE; 253872fcea8cSEd Schouten 253972fcea8cSEd Schouten if (write_flag) 254072fcea8cSEd Schouten { 254172fcea8cSEd Schouten if ((temp_fp = fopen(file_name, "w")) == NULL) 254272fcea8cSEd Schouten { 254372fcea8cSEd Schouten clear_com_win = TRUE; 254472fcea8cSEd Schouten wmove(com_win,0,0); 254572fcea8cSEd Schouten wclrtoeol(com_win); 254672fcea8cSEd Schouten wprintw(com_win, create_file_fail_msg, file_name); 254772fcea8cSEd Schouten wrefresh(com_win); 254872fcea8cSEd Schouten return(FALSE); 254972fcea8cSEd Schouten } 255072fcea8cSEd Schouten else 255172fcea8cSEd Schouten { 255272fcea8cSEd Schouten wmove(com_win,0,0); 255372fcea8cSEd Schouten wclrtoeol(com_win); 255472fcea8cSEd Schouten wprintw(com_win, writing_file_msg, file_name); 255572fcea8cSEd Schouten wrefresh(com_win); 255672fcea8cSEd Schouten cr = '\n'; 255772fcea8cSEd Schouten out_line = first_line; 255872fcea8cSEd Schouten while (out_line != NULL) 255972fcea8cSEd Schouten { 256072fcea8cSEd Schouten temp_pos = 1; 256172fcea8cSEd Schouten tmp_point= out_line->line; 256272fcea8cSEd Schouten while (temp_pos < out_line->line_length) 256372fcea8cSEd Schouten { 256472fcea8cSEd Schouten putc(*tmp_point, temp_fp); 256572fcea8cSEd Schouten tmp_point++; 256672fcea8cSEd Schouten temp_pos++; 256772fcea8cSEd Schouten } 256872fcea8cSEd Schouten charac += out_line->line_length; 256972fcea8cSEd Schouten out_line = out_line->next_line; 257072fcea8cSEd Schouten putc(cr, temp_fp); 257172fcea8cSEd Schouten lines++; 257272fcea8cSEd Schouten } 257372fcea8cSEd Schouten fclose(temp_fp); 257472fcea8cSEd Schouten wmove(com_win,0,0); 257572fcea8cSEd Schouten wclrtoeol(com_win); 257672fcea8cSEd Schouten wprintw(com_win, file_written_msg, file_name, lines, charac); 257772fcea8cSEd Schouten wrefresh(com_win); 257872fcea8cSEd Schouten return(TRUE); 257972fcea8cSEd Schouten } 258072fcea8cSEd Schouten } 258172fcea8cSEd Schouten else 258272fcea8cSEd Schouten return(FALSE); 258372fcea8cSEd Schouten } 258472fcea8cSEd Schouten 258572fcea8cSEd Schouten int 258672fcea8cSEd Schouten search(display_message) /* search for string in srch_str */ 258772fcea8cSEd Schouten int display_message; 258872fcea8cSEd Schouten { 258972fcea8cSEd Schouten int lines_moved; 259072fcea8cSEd Schouten int iter; 259172fcea8cSEd Schouten int found; 259272fcea8cSEd Schouten 259396b676e9SEd Schouten if ((srch_str == NULL) || (*srch_str == '\0')) 259472fcea8cSEd Schouten return(FALSE); 259572fcea8cSEd Schouten if (display_message) 259672fcea8cSEd Schouten { 259772fcea8cSEd Schouten wmove(com_win, 0, 0); 259872fcea8cSEd Schouten wclrtoeol(com_win); 259972fcea8cSEd Schouten wprintw(com_win, searching_msg); 260072fcea8cSEd Schouten wrefresh(com_win); 260172fcea8cSEd Schouten clear_com_win = TRUE; 260272fcea8cSEd Schouten } 260372fcea8cSEd Schouten lines_moved = 0; 260472fcea8cSEd Schouten found = FALSE; 260572fcea8cSEd Schouten srch_line = curr_line; 260672fcea8cSEd Schouten srch_1 = point; 260772fcea8cSEd Schouten if (position < curr_line->line_length) 260872fcea8cSEd Schouten srch_1++; 260972fcea8cSEd Schouten iter = position + 1; 261072fcea8cSEd Schouten while ((!found) && (srch_line != NULL)) 261172fcea8cSEd Schouten { 261272fcea8cSEd Schouten while ((iter < srch_line->line_length) && (!found)) 261372fcea8cSEd Schouten { 261472fcea8cSEd Schouten srch_2 = srch_1; 261572fcea8cSEd Schouten if (case_sen) /* if case sensitive */ 261672fcea8cSEd Schouten { 261772fcea8cSEd Schouten srch_3 = srch_str; 261896b676e9SEd Schouten while ((*srch_2 == *srch_3) && (*srch_3 != '\0')) 261972fcea8cSEd Schouten { 262072fcea8cSEd Schouten found = TRUE; 262172fcea8cSEd Schouten srch_2++; 262272fcea8cSEd Schouten srch_3++; 262372fcea8cSEd Schouten } /* end while */ 262472fcea8cSEd Schouten } 262572fcea8cSEd Schouten else /* if not case sensitive */ 262672fcea8cSEd Schouten { 262772fcea8cSEd Schouten srch_3 = u_srch_str; 262896b676e9SEd Schouten while ((toupper(*srch_2) == *srch_3) && (*srch_3 != '\0')) 262972fcea8cSEd Schouten { 263072fcea8cSEd Schouten found = TRUE; 263172fcea8cSEd Schouten srch_2++; 263272fcea8cSEd Schouten srch_3++; 263372fcea8cSEd Schouten } 263472fcea8cSEd Schouten } /* end else */ 263596b676e9SEd Schouten if (!((*srch_3 == '\0') && (found))) 263672fcea8cSEd Schouten { 263772fcea8cSEd Schouten found = FALSE; 263872fcea8cSEd Schouten if (iter < srch_line->line_length) 263972fcea8cSEd Schouten srch_1++; 264072fcea8cSEd Schouten iter++; 264172fcea8cSEd Schouten } 264272fcea8cSEd Schouten } 264372fcea8cSEd Schouten if (!found) 264472fcea8cSEd Schouten { 264572fcea8cSEd Schouten srch_line = srch_line->next_line; 264672fcea8cSEd Schouten if (srch_line != NULL) 264772fcea8cSEd Schouten srch_1 = srch_line->line; 264872fcea8cSEd Schouten iter = 1; 264972fcea8cSEd Schouten lines_moved++; 265072fcea8cSEd Schouten } 265172fcea8cSEd Schouten } 265272fcea8cSEd Schouten if (found) 265372fcea8cSEd Schouten { 265472fcea8cSEd Schouten if (display_message) 265572fcea8cSEd Schouten { 265672fcea8cSEd Schouten wmove(com_win, 0, 0); 265772fcea8cSEd Schouten wclrtoeol(com_win); 265872fcea8cSEd Schouten wrefresh(com_win); 265972fcea8cSEd Schouten } 266072fcea8cSEd Schouten if (lines_moved == 0) 266172fcea8cSEd Schouten { 266272fcea8cSEd Schouten while (position < iter) 266372fcea8cSEd Schouten right(TRUE); 266472fcea8cSEd Schouten } 266572fcea8cSEd Schouten else 266672fcea8cSEd Schouten { 266772fcea8cSEd Schouten if (lines_moved < 30) 266872fcea8cSEd Schouten { 26697bf1ea96SEd Schouten move_rel('d', lines_moved); 267072fcea8cSEd Schouten while (position < iter) 267172fcea8cSEd Schouten right(TRUE); 267272fcea8cSEd Schouten } 267372fcea8cSEd Schouten else 267472fcea8cSEd Schouten { 267596b676e9SEd Schouten absolute_lin += lines_moved; 267672fcea8cSEd Schouten curr_line = srch_line; 267772fcea8cSEd Schouten point = srch_1; 267872fcea8cSEd Schouten position = iter; 267972fcea8cSEd Schouten scanline(point); 268072fcea8cSEd Schouten scr_pos = scr_horz; 268172fcea8cSEd Schouten midscreen((last_line / 2), point); 268272fcea8cSEd Schouten } 268372fcea8cSEd Schouten } 268472fcea8cSEd Schouten } 268572fcea8cSEd Schouten else 268672fcea8cSEd Schouten { 268772fcea8cSEd Schouten if (display_message) 268872fcea8cSEd Schouten { 268972fcea8cSEd Schouten wmove(com_win, 0, 0); 269072fcea8cSEd Schouten wclrtoeol(com_win); 269172fcea8cSEd Schouten wprintw(com_win, str_not_found_msg, srch_str); 269272fcea8cSEd Schouten wrefresh(com_win); 269372fcea8cSEd Schouten } 269472fcea8cSEd Schouten wmove(text_win, scr_vert,(scr_horz - horiz_offset)); 269572fcea8cSEd Schouten } 269672fcea8cSEd Schouten return(found); 269772fcea8cSEd Schouten } 269872fcea8cSEd Schouten 269972fcea8cSEd Schouten void 270072fcea8cSEd Schouten search_prompt() /* prompt and read search string (srch_str) */ 270172fcea8cSEd Schouten { 270272fcea8cSEd Schouten if (srch_str != NULL) 270372fcea8cSEd Schouten free(srch_str); 270496b676e9SEd Schouten if ((u_srch_str != NULL) && (*u_srch_str != '\0')) 270572fcea8cSEd Schouten free(u_srch_str); 270672fcea8cSEd Schouten srch_str = get_string(search_prompt_str, FALSE); 270772fcea8cSEd Schouten gold = FALSE; 270872fcea8cSEd Schouten srch_3 = srch_str; 270972fcea8cSEd Schouten srch_1 = u_srch_str = malloc(strlen(srch_str) + 1); 271096b676e9SEd Schouten while (*srch_3 != '\0') 271172fcea8cSEd Schouten { 271272fcea8cSEd Schouten *srch_1 = toupper(*srch_3); 271372fcea8cSEd Schouten srch_1++; 271472fcea8cSEd Schouten srch_3++; 271572fcea8cSEd Schouten } 271696b676e9SEd Schouten *srch_1 = '\0'; 271772fcea8cSEd Schouten search(TRUE); 271872fcea8cSEd Schouten } 271972fcea8cSEd Schouten 272072fcea8cSEd Schouten void 272172fcea8cSEd Schouten del_char() /* delete current character */ 272272fcea8cSEd Schouten { 272372fcea8cSEd Schouten in = 8; /* backspace */ 272472fcea8cSEd Schouten if (position < curr_line->line_length) /* if not end of line */ 272572fcea8cSEd Schouten { 272672fcea8cSEd Schouten if ((ee_chinese) && (*point > 127) && 272772fcea8cSEd Schouten ((curr_line->line_length - position) >= 2)) 272872fcea8cSEd Schouten { 272972fcea8cSEd Schouten point++; 273072fcea8cSEd Schouten position++; 273172fcea8cSEd Schouten } 273272fcea8cSEd Schouten position++; 273372fcea8cSEd Schouten point++; 273472fcea8cSEd Schouten scanline(point); 273572fcea8cSEd Schouten delete(TRUE); 273672fcea8cSEd Schouten } 273772fcea8cSEd Schouten else 273872fcea8cSEd Schouten { 27397bf1ea96SEd Schouten right(TRUE); 27407bf1ea96SEd Schouten delete(TRUE); 274172fcea8cSEd Schouten } 274272fcea8cSEd Schouten } 274372fcea8cSEd Schouten 274472fcea8cSEd Schouten void 274572fcea8cSEd Schouten undel_char() /* undelete last deleted character */ 274672fcea8cSEd Schouten { 274772fcea8cSEd Schouten if (d_char[0] == '\n') /* insert line if last del_char deleted eol */ 274872fcea8cSEd Schouten insert_line(TRUE); 274972fcea8cSEd Schouten else 275072fcea8cSEd Schouten { 275172fcea8cSEd Schouten in = d_char[0]; 275272fcea8cSEd Schouten insert(in); 275396b676e9SEd Schouten if (d_char[1] != '\0') 275472fcea8cSEd Schouten { 275572fcea8cSEd Schouten in = d_char[1]; 275672fcea8cSEd Schouten insert(in); 275772fcea8cSEd Schouten } 275872fcea8cSEd Schouten } 275972fcea8cSEd Schouten } 276072fcea8cSEd Schouten 276172fcea8cSEd Schouten void 276272fcea8cSEd Schouten del_word() /* delete word in front of cursor */ 276372fcea8cSEd Schouten { 276472fcea8cSEd Schouten int tposit; 276572fcea8cSEd Schouten int difference; 276672fcea8cSEd Schouten unsigned char *d_word2; 276772fcea8cSEd Schouten unsigned char *d_word3; 276872fcea8cSEd Schouten unsigned char tmp_char[3]; 276972fcea8cSEd Schouten 277072fcea8cSEd Schouten if (d_word != NULL) 277172fcea8cSEd Schouten free(d_word); 277272fcea8cSEd Schouten d_word = malloc(curr_line->line_length); 277372fcea8cSEd Schouten tmp_char[0] = d_char[0]; 277472fcea8cSEd Schouten tmp_char[1] = d_char[1]; 277572fcea8cSEd Schouten tmp_char[2] = d_char[2]; 277672fcea8cSEd Schouten d_word3 = point; 277772fcea8cSEd Schouten d_word2 = d_word; 277872fcea8cSEd Schouten tposit = position; 277972fcea8cSEd Schouten while ((tposit < curr_line->line_length) && 278072fcea8cSEd Schouten ((*d_word3 != ' ') && (*d_word3 != '\t'))) 278172fcea8cSEd Schouten { 278272fcea8cSEd Schouten tposit++; 278372fcea8cSEd Schouten *d_word2 = *d_word3; 278472fcea8cSEd Schouten d_word2++; 278572fcea8cSEd Schouten d_word3++; 278672fcea8cSEd Schouten } 278772fcea8cSEd Schouten while ((tposit < curr_line->line_length) && 278872fcea8cSEd Schouten ((*d_word3 == ' ') || (*d_word3 == '\t'))) 278972fcea8cSEd Schouten { 279072fcea8cSEd Schouten tposit++; 279172fcea8cSEd Schouten *d_word2 = *d_word3; 279272fcea8cSEd Schouten d_word2++; 279372fcea8cSEd Schouten d_word3++; 279472fcea8cSEd Schouten } 279596b676e9SEd Schouten *d_word2 = '\0'; 279672fcea8cSEd Schouten d_wrd_len = difference = d_word2 - d_word; 279772fcea8cSEd Schouten d_word2 = point; 279872fcea8cSEd Schouten while (tposit < curr_line->line_length) 279972fcea8cSEd Schouten { 280072fcea8cSEd Schouten tposit++; 280172fcea8cSEd Schouten *d_word2 = *d_word3; 280272fcea8cSEd Schouten d_word2++; 280372fcea8cSEd Schouten d_word3++; 280472fcea8cSEd Schouten } 280572fcea8cSEd Schouten curr_line->line_length -= difference; 280696b676e9SEd Schouten *d_word2 = '\0'; 280772fcea8cSEd Schouten draw_line(scr_vert, scr_horz,point,position,curr_line->line_length); 280872fcea8cSEd Schouten d_char[0] = tmp_char[0]; 280972fcea8cSEd Schouten d_char[1] = tmp_char[1]; 281072fcea8cSEd Schouten d_char[2] = tmp_char[2]; 281172fcea8cSEd Schouten text_changes = TRUE; 281272fcea8cSEd Schouten formatted = FALSE; 281372fcea8cSEd Schouten } 281472fcea8cSEd Schouten 281572fcea8cSEd Schouten void 281672fcea8cSEd Schouten undel_word() /* undelete last deleted word */ 281772fcea8cSEd Schouten { 281872fcea8cSEd Schouten int temp; 281972fcea8cSEd Schouten int tposit; 282072fcea8cSEd Schouten unsigned char *tmp_old_ptr; 282172fcea8cSEd Schouten unsigned char *tmp_space; 282272fcea8cSEd Schouten unsigned char *tmp_ptr; 282372fcea8cSEd Schouten unsigned char *d_word_ptr; 282472fcea8cSEd Schouten 282572fcea8cSEd Schouten /* 282672fcea8cSEd Schouten | resize line to handle undeleted word 282772fcea8cSEd Schouten */ 282872fcea8cSEd Schouten if ((curr_line->max_length - (curr_line->line_length + d_wrd_len)) < 5) 282972fcea8cSEd Schouten point = resiz_line(d_wrd_len, curr_line, position); 283072fcea8cSEd Schouten tmp_ptr = tmp_space = malloc(curr_line->line_length + d_wrd_len); 283172fcea8cSEd Schouten d_word_ptr = d_word; 283272fcea8cSEd Schouten temp = 1; 283372fcea8cSEd Schouten /* 283472fcea8cSEd Schouten | copy d_word contents into temp space 283572fcea8cSEd Schouten */ 283672fcea8cSEd Schouten while (temp <= d_wrd_len) 283772fcea8cSEd Schouten { 283872fcea8cSEd Schouten temp++; 283972fcea8cSEd Schouten *tmp_ptr = *d_word_ptr; 284072fcea8cSEd Schouten tmp_ptr++; 284172fcea8cSEd Schouten d_word_ptr++; 284272fcea8cSEd Schouten } 284372fcea8cSEd Schouten tmp_old_ptr = point; 284472fcea8cSEd Schouten tposit = position; 284572fcea8cSEd Schouten /* 284672fcea8cSEd Schouten | copy contents of line from curent position to eol into 284772fcea8cSEd Schouten | temp space 284872fcea8cSEd Schouten */ 284972fcea8cSEd Schouten while (tposit < curr_line->line_length) 285072fcea8cSEd Schouten { 285172fcea8cSEd Schouten temp++; 285272fcea8cSEd Schouten tposit++; 285372fcea8cSEd Schouten *tmp_ptr = *tmp_old_ptr; 285472fcea8cSEd Schouten tmp_ptr++; 285572fcea8cSEd Schouten tmp_old_ptr++; 285672fcea8cSEd Schouten } 285772fcea8cSEd Schouten curr_line->line_length += d_wrd_len; 285872fcea8cSEd Schouten tmp_old_ptr = point; 285996b676e9SEd Schouten *tmp_ptr = '\0'; 286072fcea8cSEd Schouten tmp_ptr = tmp_space; 286172fcea8cSEd Schouten tposit = 1; 286272fcea8cSEd Schouten /* 286372fcea8cSEd Schouten | now copy contents from temp space back to original line 286472fcea8cSEd Schouten */ 286572fcea8cSEd Schouten while (tposit < temp) 286672fcea8cSEd Schouten { 286772fcea8cSEd Schouten tposit++; 286872fcea8cSEd Schouten *tmp_old_ptr = *tmp_ptr; 286972fcea8cSEd Schouten tmp_ptr++; 287072fcea8cSEd Schouten tmp_old_ptr++; 287172fcea8cSEd Schouten } 287296b676e9SEd Schouten *tmp_old_ptr = '\0'; 287372fcea8cSEd Schouten free(tmp_space); 287472fcea8cSEd Schouten draw_line(scr_vert, scr_horz, point, position, curr_line->line_length); 287572fcea8cSEd Schouten } 287672fcea8cSEd Schouten 287772fcea8cSEd Schouten void 287872fcea8cSEd Schouten del_line() /* delete from cursor to end of line */ 287972fcea8cSEd Schouten { 288072fcea8cSEd Schouten unsigned char *dl1; 288172fcea8cSEd Schouten unsigned char *dl2; 288272fcea8cSEd Schouten int tposit; 288372fcea8cSEd Schouten 288472fcea8cSEd Schouten if (d_line != NULL) 288572fcea8cSEd Schouten free(d_line); 288672fcea8cSEd Schouten d_line = malloc(curr_line->line_length); 288772fcea8cSEd Schouten dl1 = d_line; 288872fcea8cSEd Schouten dl2 = point; 288972fcea8cSEd Schouten tposit = position; 289072fcea8cSEd Schouten while (tposit < curr_line->line_length) 289172fcea8cSEd Schouten { 289272fcea8cSEd Schouten *dl1 = *dl2; 289372fcea8cSEd Schouten dl1++; 289472fcea8cSEd Schouten dl2++; 289572fcea8cSEd Schouten tposit++; 289672fcea8cSEd Schouten } 289772fcea8cSEd Schouten dlt_line->line_length = 1 + tposit - position; 289896b676e9SEd Schouten *dl1 = '\0'; 289996b676e9SEd Schouten *point = '\0'; 290072fcea8cSEd Schouten curr_line->line_length = position; 290172fcea8cSEd Schouten wclrtoeol(text_win); 290272fcea8cSEd Schouten if (curr_line->next_line != NULL) 290372fcea8cSEd Schouten { 290472fcea8cSEd Schouten right(FALSE); 290572fcea8cSEd Schouten delete(FALSE); 290672fcea8cSEd Schouten } 290772fcea8cSEd Schouten text_changes = TRUE; 290872fcea8cSEd Schouten } 290972fcea8cSEd Schouten 291072fcea8cSEd Schouten void 291172fcea8cSEd Schouten undel_line() /* undelete last deleted line */ 291272fcea8cSEd Schouten { 291372fcea8cSEd Schouten unsigned char *ud1; 291472fcea8cSEd Schouten unsigned char *ud2; 291572fcea8cSEd Schouten int tposit; 291672fcea8cSEd Schouten 291772fcea8cSEd Schouten if (dlt_line->line_length == 0) 291872fcea8cSEd Schouten return; 291972fcea8cSEd Schouten 292072fcea8cSEd Schouten insert_line(TRUE); 292172fcea8cSEd Schouten left(TRUE); 292272fcea8cSEd Schouten point = resiz_line(dlt_line->line_length, curr_line, position); 292372fcea8cSEd Schouten curr_line->line_length += dlt_line->line_length - 1; 292472fcea8cSEd Schouten ud1 = point; 292572fcea8cSEd Schouten ud2 = d_line; 292672fcea8cSEd Schouten tposit = 1; 292772fcea8cSEd Schouten while (tposit < dlt_line->line_length) 292872fcea8cSEd Schouten { 292972fcea8cSEd Schouten tposit++; 293072fcea8cSEd Schouten *ud1 = *ud2; 293172fcea8cSEd Schouten ud1++; 293272fcea8cSEd Schouten ud2++; 293372fcea8cSEd Schouten } 293496b676e9SEd Schouten *ud1 = '\0'; 293572fcea8cSEd Schouten draw_line(scr_vert, scr_horz,point,position,curr_line->line_length); 293672fcea8cSEd Schouten } 293772fcea8cSEd Schouten 293872fcea8cSEd Schouten void 293972fcea8cSEd Schouten adv_word() /* advance to next word */ 294072fcea8cSEd Schouten { 294172fcea8cSEd Schouten while ((position < curr_line->line_length) && ((*point != 32) && (*point != 9))) 294272fcea8cSEd Schouten right(TRUE); 294372fcea8cSEd Schouten while ((position < curr_line->line_length) && ((*point == 32) || (*point == 9))) 294472fcea8cSEd Schouten right(TRUE); 294572fcea8cSEd Schouten } 294672fcea8cSEd Schouten 294772fcea8cSEd Schouten void 294872fcea8cSEd Schouten move_rel(direction, lines) /* move relative to current line */ 29498f04da68SDimitry Andric int direction; 295072fcea8cSEd Schouten int lines; 295172fcea8cSEd Schouten { 295272fcea8cSEd Schouten int i; 295372fcea8cSEd Schouten char *tmp; 295472fcea8cSEd Schouten 29557bf1ea96SEd Schouten if (direction == 'u') 295672fcea8cSEd Schouten { 295772fcea8cSEd Schouten scr_pos = 0; 295872fcea8cSEd Schouten while (position > 1) 295972fcea8cSEd Schouten left(TRUE); 296072fcea8cSEd Schouten for (i = 0; i < lines; i++) 296172fcea8cSEd Schouten { 296272fcea8cSEd Schouten up(); 296372fcea8cSEd Schouten } 296472fcea8cSEd Schouten if ((last_line > 5) && ( scr_vert < 4)) 296572fcea8cSEd Schouten { 296672fcea8cSEd Schouten tmp = point; 296772fcea8cSEd Schouten tmp_line = curr_line; 296872fcea8cSEd Schouten for (i= 0;(i<5)&&(curr_line->prev_line != NULL); i++) 296972fcea8cSEd Schouten { 297072fcea8cSEd Schouten up(); 297172fcea8cSEd Schouten } 297272fcea8cSEd Schouten scr_vert = scr_vert + i; 297372fcea8cSEd Schouten curr_line = tmp_line; 297496b676e9SEd Schouten absolute_lin += i; 297572fcea8cSEd Schouten point = tmp; 297672fcea8cSEd Schouten scanline(point); 297772fcea8cSEd Schouten } 297872fcea8cSEd Schouten } 297972fcea8cSEd Schouten else 298072fcea8cSEd Schouten { 298172fcea8cSEd Schouten if ((position != 1) && (curr_line->next_line != NULL)) 298272fcea8cSEd Schouten { 298372fcea8cSEd Schouten nextline(); 298472fcea8cSEd Schouten scr_pos = scr_horz = 0; 298572fcea8cSEd Schouten if (horiz_offset) 298672fcea8cSEd Schouten { 298772fcea8cSEd Schouten horiz_offset = 0; 298872fcea8cSEd Schouten midscreen(scr_vert, point); 298972fcea8cSEd Schouten } 299072fcea8cSEd Schouten } 299172fcea8cSEd Schouten else 299272fcea8cSEd Schouten adv_line(); 299372fcea8cSEd Schouten for (i = 1; i < lines; i++) 299472fcea8cSEd Schouten { 299572fcea8cSEd Schouten down(); 299672fcea8cSEd Schouten } 299772fcea8cSEd Schouten if ((last_line > 10) && (scr_vert > (last_line - 5))) 299872fcea8cSEd Schouten { 299972fcea8cSEd Schouten tmp = point; 300072fcea8cSEd Schouten tmp_line = curr_line; 300172fcea8cSEd Schouten for (i=0; (i<5) && (curr_line->next_line != NULL); i++) 300272fcea8cSEd Schouten { 300372fcea8cSEd Schouten down(); 300472fcea8cSEd Schouten } 300596b676e9SEd Schouten absolute_lin -= i; 300672fcea8cSEd Schouten scr_vert = scr_vert - i; 300772fcea8cSEd Schouten curr_line = tmp_line; 300872fcea8cSEd Schouten point = tmp; 300972fcea8cSEd Schouten scanline(point); 301072fcea8cSEd Schouten } 301172fcea8cSEd Schouten } 301272fcea8cSEd Schouten wmove(text_win, scr_vert, (scr_horz - horiz_offset)); 301372fcea8cSEd Schouten } 301472fcea8cSEd Schouten 301572fcea8cSEd Schouten void 301672fcea8cSEd Schouten eol() /* go to end of line */ 301772fcea8cSEd Schouten { 301872fcea8cSEd Schouten if (position < curr_line->line_length) 301972fcea8cSEd Schouten { 302072fcea8cSEd Schouten while (position < curr_line->line_length) 302172fcea8cSEd Schouten right(TRUE); 302272fcea8cSEd Schouten } 302372fcea8cSEd Schouten else if (curr_line->next_line != NULL) 302472fcea8cSEd Schouten { 302572fcea8cSEd Schouten right(TRUE); 302672fcea8cSEd Schouten while (position < curr_line->line_length) 302772fcea8cSEd Schouten right(TRUE); 302872fcea8cSEd Schouten } 302972fcea8cSEd Schouten } 303072fcea8cSEd Schouten 303172fcea8cSEd Schouten void 303272fcea8cSEd Schouten bol() /* move to beginning of line */ 303372fcea8cSEd Schouten { 303472fcea8cSEd Schouten if (point != curr_line->line) 303572fcea8cSEd Schouten { 303672fcea8cSEd Schouten while (point != curr_line->line) 303772fcea8cSEd Schouten left(TRUE); 303872fcea8cSEd Schouten } 303972fcea8cSEd Schouten else if (curr_line->prev_line != NULL) 304072fcea8cSEd Schouten { 304172fcea8cSEd Schouten scr_pos = 0; 304272fcea8cSEd Schouten up(); 304372fcea8cSEd Schouten } 304472fcea8cSEd Schouten } 304572fcea8cSEd Schouten 304672fcea8cSEd Schouten void 304772fcea8cSEd Schouten adv_line() /* advance to beginning of next line */ 304872fcea8cSEd Schouten { 304972fcea8cSEd Schouten if ((point != curr_line->line) || (scr_pos > 0)) 305072fcea8cSEd Schouten { 305172fcea8cSEd Schouten while (position < curr_line->line_length) 305272fcea8cSEd Schouten right(TRUE); 305372fcea8cSEd Schouten right(TRUE); 305472fcea8cSEd Schouten } 305572fcea8cSEd Schouten else if (curr_line->next_line != NULL) 305672fcea8cSEd Schouten { 305772fcea8cSEd Schouten scr_pos = 0; 305872fcea8cSEd Schouten down(); 305972fcea8cSEd Schouten } 306072fcea8cSEd Schouten } 306172fcea8cSEd Schouten 306272fcea8cSEd Schouten void 306396b676e9SEd Schouten from_top() 306496b676e9SEd Schouten { 306596b676e9SEd Schouten struct text *tmpline = first_line; 306696b676e9SEd Schouten int x = 1; 306796b676e9SEd Schouten 306896b676e9SEd Schouten while ((tmpline != NULL) && (tmpline != curr_line)) 306996b676e9SEd Schouten { 307096b676e9SEd Schouten x++; 307196b676e9SEd Schouten tmpline = tmpline->next_line; 307296b676e9SEd Schouten } 307396b676e9SEd Schouten absolute_lin = x; 307496b676e9SEd Schouten } 307596b676e9SEd Schouten 307696b676e9SEd Schouten void 307772fcea8cSEd Schouten sh_command(string) /* execute shell command */ 307872fcea8cSEd Schouten char *string; /* string containing user command */ 307972fcea8cSEd Schouten { 308072fcea8cSEd Schouten char *temp_point; 308172fcea8cSEd Schouten char *last_slash; 308272fcea8cSEd Schouten char *path; /* directory path to executable */ 308372fcea8cSEd Schouten int parent; /* zero if child, child's pid if parent */ 308472fcea8cSEd Schouten int value; 308572fcea8cSEd Schouten int return_val; 308672fcea8cSEd Schouten struct text *line_holder; 308772fcea8cSEd Schouten 308872fcea8cSEd Schouten if (restrict_mode()) 308972fcea8cSEd Schouten { 309072fcea8cSEd Schouten return; 309172fcea8cSEd Schouten } 309272fcea8cSEd Schouten 309372fcea8cSEd Schouten if (!(path = getenv("SHELL"))) 309472fcea8cSEd Schouten path = "/bin/sh"; 309572fcea8cSEd Schouten last_slash = temp_point = path; 309696b676e9SEd Schouten while (*temp_point != '\0') 309772fcea8cSEd Schouten { 309872fcea8cSEd Schouten if (*temp_point == '/') 309972fcea8cSEd Schouten last_slash = ++temp_point; 310072fcea8cSEd Schouten else 310172fcea8cSEd Schouten temp_point++; 310272fcea8cSEd Schouten } 310372fcea8cSEd Schouten 310472fcea8cSEd Schouten /* 310572fcea8cSEd Schouten | if in_pipe is true, then output of the shell operation will be 310672fcea8cSEd Schouten | read by the editor, and curses doesn't need to be turned off 310772fcea8cSEd Schouten */ 310872fcea8cSEd Schouten 310972fcea8cSEd Schouten if (!in_pipe) 311072fcea8cSEd Schouten { 311172fcea8cSEd Schouten keypad(com_win, FALSE); 311272fcea8cSEd Schouten keypad(text_win, FALSE); 311372fcea8cSEd Schouten echo(); 311472fcea8cSEd Schouten nl(); 311572fcea8cSEd Schouten noraw(); 311672fcea8cSEd Schouten resetty(); 311772fcea8cSEd Schouten 311872fcea8cSEd Schouten #ifndef NCURSE 311972fcea8cSEd Schouten endwin(); 312072fcea8cSEd Schouten #endif 312172fcea8cSEd Schouten } 312272fcea8cSEd Schouten 312372fcea8cSEd Schouten if (in_pipe) 312472fcea8cSEd Schouten { 312572fcea8cSEd Schouten pipe(pipe_in); /* create a pipe */ 312672fcea8cSEd Schouten parent = fork(); 312772fcea8cSEd Schouten if (!parent) /* if the child */ 312872fcea8cSEd Schouten { 312972fcea8cSEd Schouten /* 313072fcea8cSEd Schouten | child process which will fork and exec shell command (if shell output is 313172fcea8cSEd Schouten | to be read by editor) 313272fcea8cSEd Schouten */ 313372fcea8cSEd Schouten in_pipe = FALSE; 313472fcea8cSEd Schouten /* 313572fcea8cSEd Schouten | redirect stdout to pipe 313672fcea8cSEd Schouten */ 313772fcea8cSEd Schouten temp_stdout = dup(1); 313872fcea8cSEd Schouten close(1); 313972fcea8cSEd Schouten dup(pipe_in[1]); 314072fcea8cSEd Schouten /* 314172fcea8cSEd Schouten | redirect stderr to pipe 314272fcea8cSEd Schouten */ 314372fcea8cSEd Schouten temp_stderr = dup(2); 314472fcea8cSEd Schouten close(2); 314572fcea8cSEd Schouten dup(pipe_in[1]); 314672fcea8cSEd Schouten close(pipe_in[1]); 314772fcea8cSEd Schouten /* 314872fcea8cSEd Schouten | child will now continue down 'if (!in_pipe)' 314972fcea8cSEd Schouten | path below 315072fcea8cSEd Schouten */ 315172fcea8cSEd Schouten } 315272fcea8cSEd Schouten else /* if the parent */ 315372fcea8cSEd Schouten { 315472fcea8cSEd Schouten /* 315572fcea8cSEd Schouten | prepare editor to read from the pipe 315672fcea8cSEd Schouten */ 315772fcea8cSEd Schouten signal(SIGCHLD, SIG_IGN); 315872fcea8cSEd Schouten line_holder = curr_line; 315972fcea8cSEd Schouten tmp_vert = scr_vert; 316072fcea8cSEd Schouten close(pipe_in[1]); 316172fcea8cSEd Schouten get_fd = pipe_in[0]; 316272fcea8cSEd Schouten get_file(""); 316372fcea8cSEd Schouten close(pipe_in[0]); 316472fcea8cSEd Schouten scr_vert = tmp_vert; 316572fcea8cSEd Schouten scr_horz = scr_pos = 0; 316672fcea8cSEd Schouten position = 1; 316772fcea8cSEd Schouten curr_line = line_holder; 316896b676e9SEd Schouten from_top(); 316972fcea8cSEd Schouten point = curr_line->line; 317072fcea8cSEd Schouten out_pipe = FALSE; 317172fcea8cSEd Schouten signal(SIGCHLD, SIG_DFL); 317272fcea8cSEd Schouten /* 317372fcea8cSEd Schouten | since flag "in_pipe" is still TRUE, the path which waits for the child 317472fcea8cSEd Schouten | process to die will be avoided. 317572fcea8cSEd Schouten | (the pipe is closed, no more output can be expected) 317672fcea8cSEd Schouten */ 317772fcea8cSEd Schouten } 317872fcea8cSEd Schouten } 317972fcea8cSEd Schouten if (!in_pipe) 318072fcea8cSEd Schouten { 318172fcea8cSEd Schouten signal(SIGINT, SIG_IGN); 318272fcea8cSEd Schouten if (out_pipe) 318372fcea8cSEd Schouten { 318472fcea8cSEd Schouten pipe(pipe_out); 318572fcea8cSEd Schouten } 318672fcea8cSEd Schouten /* 318772fcea8cSEd Schouten | fork process which will exec command 318872fcea8cSEd Schouten */ 318972fcea8cSEd Schouten parent = fork(); 319072fcea8cSEd Schouten if (!parent) /* if the child */ 319172fcea8cSEd Schouten { 319272fcea8cSEd Schouten if (shell_fork) 319372fcea8cSEd Schouten putchar('\n'); 319472fcea8cSEd Schouten if (out_pipe) 319572fcea8cSEd Schouten { 319672fcea8cSEd Schouten /* 319772fcea8cSEd Schouten | prepare the child process (soon to exec a shell command) to read from the 319872fcea8cSEd Schouten | pipe (which will be output from the editor's buffer) 319972fcea8cSEd Schouten */ 320072fcea8cSEd Schouten close(0); 320172fcea8cSEd Schouten dup(pipe_out[0]); 320272fcea8cSEd Schouten close(pipe_out[0]); 320372fcea8cSEd Schouten close(pipe_out[1]); 320472fcea8cSEd Schouten } 320572fcea8cSEd Schouten for (value = 1; value < 24; value++) 320672fcea8cSEd Schouten signal(value, SIG_DFL); 320796b676e9SEd Schouten execl(path, last_slash, "-c", string, NULL); 320896b676e9SEd Schouten fprintf(stderr, exec_err_msg, path); 320996b676e9SEd Schouten exit(-1); 321072fcea8cSEd Schouten } 321172fcea8cSEd Schouten else /* if the parent */ 321272fcea8cSEd Schouten { 321372fcea8cSEd Schouten if (out_pipe) 321472fcea8cSEd Schouten { 321572fcea8cSEd Schouten /* 321672fcea8cSEd Schouten | output the contents of the buffer to the pipe (to be read by the 321772fcea8cSEd Schouten | process forked and exec'd above as stdin) 321872fcea8cSEd Schouten */ 321972fcea8cSEd Schouten close(pipe_out[0]); 322072fcea8cSEd Schouten line_holder = first_line; 322172fcea8cSEd Schouten while (line_holder != NULL) 322272fcea8cSEd Schouten { 322372fcea8cSEd Schouten write(pipe_out[1], line_holder->line, (line_holder->line_length-1)); 322472fcea8cSEd Schouten write(pipe_out[1], "\n", 1); 322572fcea8cSEd Schouten line_holder = line_holder->next_line; 322672fcea8cSEd Schouten } 322772fcea8cSEd Schouten close(pipe_out[1]); 322872fcea8cSEd Schouten out_pipe = FALSE; 322972fcea8cSEd Schouten } 323072fcea8cSEd Schouten do 323172fcea8cSEd Schouten { 323272fcea8cSEd Schouten return_val = wait((int *) 0); 323372fcea8cSEd Schouten } 323472fcea8cSEd Schouten while ((return_val != parent) && (return_val != -1)); 323572fcea8cSEd Schouten /* 323672fcea8cSEd Schouten | if this process is actually the child of the editor, exit. Here's how it 323772fcea8cSEd Schouten | works: 323872fcea8cSEd Schouten | The editor forks a process. If output must be sent to the command to be 323972fcea8cSEd Schouten | exec'd another process is forked, and that process (the child's child) 324072fcea8cSEd Schouten | will exec the command. In this case, "shell_fork" will be FALSE. If no 324172fcea8cSEd Schouten | output is to be performed to the shell command, "shell_fork" will be TRUE. 324272fcea8cSEd Schouten | If this is the editor process, shell_fork will be true, otherwise this is 324372fcea8cSEd Schouten | the child of the edit process. 324472fcea8cSEd Schouten */ 324572fcea8cSEd Schouten if (!shell_fork) 324672fcea8cSEd Schouten exit(0); 324772fcea8cSEd Schouten } 324872fcea8cSEd Schouten signal(SIGINT, edit_abort); 324972fcea8cSEd Schouten } 325072fcea8cSEd Schouten if (shell_fork) 325172fcea8cSEd Schouten { 32528f04da68SDimitry Andric fputs(continue_msg, stdout); 325372fcea8cSEd Schouten fflush(stdout); 325472fcea8cSEd Schouten while ((in = getchar()) != '\n') 325572fcea8cSEd Schouten ; 325672fcea8cSEd Schouten } 325772fcea8cSEd Schouten 325872fcea8cSEd Schouten if (!in_pipe) 325972fcea8cSEd Schouten { 326072fcea8cSEd Schouten fixterm(); 326172fcea8cSEd Schouten noecho(); 326272fcea8cSEd Schouten nonl(); 326372fcea8cSEd Schouten raw(); 326472fcea8cSEd Schouten keypad(text_win, TRUE); 326572fcea8cSEd Schouten keypad(com_win, TRUE); 326672fcea8cSEd Schouten if (info_window) 326772fcea8cSEd Schouten clearok(info_win, TRUE); 326872fcea8cSEd Schouten } 326972fcea8cSEd Schouten 327072fcea8cSEd Schouten redraw(); 327172fcea8cSEd Schouten } 327272fcea8cSEd Schouten 327372fcea8cSEd Schouten void 327472fcea8cSEd Schouten set_up_term() /* set up the terminal for operating with ae */ 327572fcea8cSEd Schouten { 327672fcea8cSEd Schouten if (!curses_initialized) 327772fcea8cSEd Schouten { 327872fcea8cSEd Schouten initscr(); 327972fcea8cSEd Schouten savetty(); 328072fcea8cSEd Schouten noecho(); 328172fcea8cSEd Schouten raw(); 328272fcea8cSEd Schouten nonl(); 328372fcea8cSEd Schouten curses_initialized = TRUE; 328472fcea8cSEd Schouten } 328572fcea8cSEd Schouten 328672fcea8cSEd Schouten if (((LINES > 15) && (COLS >= 80)) && info_window) 328772fcea8cSEd Schouten last_line = LINES - 8; 328872fcea8cSEd Schouten else 328972fcea8cSEd Schouten { 329072fcea8cSEd Schouten info_window = FALSE; 329172fcea8cSEd Schouten last_line = LINES - 2; 329272fcea8cSEd Schouten } 329372fcea8cSEd Schouten 329472fcea8cSEd Schouten idlok(stdscr, TRUE); 329572fcea8cSEd Schouten com_win = newwin(1, COLS, (LINES - 1), 0); 329672fcea8cSEd Schouten keypad(com_win, TRUE); 329772fcea8cSEd Schouten idlok(com_win, TRUE); 329872fcea8cSEd Schouten wrefresh(com_win); 329972fcea8cSEd Schouten if (!info_window) 330072fcea8cSEd Schouten text_win = newwin((LINES - 1), COLS, 0, 0); 330172fcea8cSEd Schouten else 330272fcea8cSEd Schouten text_win = newwin((LINES - 7), COLS, 6, 0); 330372fcea8cSEd Schouten keypad(text_win, TRUE); 330472fcea8cSEd Schouten idlok(text_win, TRUE); 330572fcea8cSEd Schouten wrefresh(text_win); 330672fcea8cSEd Schouten help_win = newwin((LINES - 1), COLS, 0, 0); 330772fcea8cSEd Schouten keypad(help_win, TRUE); 330872fcea8cSEd Schouten idlok(help_win, TRUE); 330972fcea8cSEd Schouten if (info_window) 331072fcea8cSEd Schouten { 331172fcea8cSEd Schouten info_type = CONTROL_KEYS; 331296b676e9SEd Schouten info_win = newwin(6, COLS, 0, 0); 331372fcea8cSEd Schouten werase(info_win); 331472fcea8cSEd Schouten paint_info_win(); 331572fcea8cSEd Schouten } 331672fcea8cSEd Schouten 331772fcea8cSEd Schouten last_col = COLS - 1; 331872fcea8cSEd Schouten local_LINES = LINES; 331972fcea8cSEd Schouten local_COLS = COLS; 332072fcea8cSEd Schouten 332172fcea8cSEd Schouten #ifdef NCURSE 332272fcea8cSEd Schouten if (ee_chinese) 332372fcea8cSEd Schouten nc_setattrib(A_NC_BIG5); 332472fcea8cSEd Schouten #endif /* NCURSE */ 332572fcea8cSEd Schouten 332672fcea8cSEd Schouten } 332772fcea8cSEd Schouten 332872fcea8cSEd Schouten void 332972fcea8cSEd Schouten resize_check() 333072fcea8cSEd Schouten { 333172fcea8cSEd Schouten if ((LINES == local_LINES) && (COLS == local_COLS)) 333272fcea8cSEd Schouten return; 333372fcea8cSEd Schouten 333472fcea8cSEd Schouten if (info_window) 333572fcea8cSEd Schouten delwin(info_win); 333672fcea8cSEd Schouten delwin(text_win); 333772fcea8cSEd Schouten delwin(com_win); 333872fcea8cSEd Schouten delwin(help_win); 333972fcea8cSEd Schouten set_up_term(); 334072fcea8cSEd Schouten redraw(); 334172fcea8cSEd Schouten wrefresh(text_win); 334272fcea8cSEd Schouten } 334372fcea8cSEd Schouten 334472fcea8cSEd Schouten static char item_alpha[] = "abcdefghijklmnopqrstuvwxyz0123456789 "; 334572fcea8cSEd Schouten 334672fcea8cSEd Schouten int 334772fcea8cSEd Schouten menu_op(menu_list) 334872fcea8cSEd Schouten struct menu_entries menu_list[]; 334972fcea8cSEd Schouten { 335072fcea8cSEd Schouten WINDOW *temp_win; 335172fcea8cSEd Schouten int max_width, max_height; 335272fcea8cSEd Schouten int x_off, y_off; 335372fcea8cSEd Schouten int counter; 335472fcea8cSEd Schouten int length; 335572fcea8cSEd Schouten int input; 335696b676e9SEd Schouten int temp; 335772fcea8cSEd Schouten int list_size; 335872fcea8cSEd Schouten int top_offset; /* offset from top where menu items start */ 335972fcea8cSEd Schouten int vert_pos; /* vertical position */ 336072fcea8cSEd Schouten int vert_size; /* vertical size for menu list item display */ 336172fcea8cSEd Schouten int off_start = 1; /* offset from start of menu items to start display */ 336272fcea8cSEd Schouten 336372fcea8cSEd Schouten 336472fcea8cSEd Schouten /* 336572fcea8cSEd Schouten | determine number and width of menu items 336672fcea8cSEd Schouten */ 336772fcea8cSEd Schouten 336872fcea8cSEd Schouten list_size = 1; 336972fcea8cSEd Schouten while (menu_list[list_size + 1].item_string != NULL) 337072fcea8cSEd Schouten list_size++; 337172fcea8cSEd Schouten max_width = 0; 337272fcea8cSEd Schouten for (counter = 0; counter <= list_size; counter++) 337372fcea8cSEd Schouten { 337472fcea8cSEd Schouten if ((length = strlen(menu_list[counter].item_string)) > max_width) 337572fcea8cSEd Schouten max_width = length; 337672fcea8cSEd Schouten } 337772fcea8cSEd Schouten max_width += 3; 337872fcea8cSEd Schouten max_width = max(max_width, strlen(menu_cancel_msg)); 337972fcea8cSEd Schouten max_width = max(max_width, max(strlen(more_above_str), strlen(more_below_str))); 338072fcea8cSEd Schouten max_width += 6; 338172fcea8cSEd Schouten 338272fcea8cSEd Schouten /* 338372fcea8cSEd Schouten | make sure that window is large enough to handle menu 338472fcea8cSEd Schouten | if not, print error message and return to calling function 338572fcea8cSEd Schouten */ 338672fcea8cSEd Schouten 338772fcea8cSEd Schouten if (max_width > COLS) 338872fcea8cSEd Schouten { 338972fcea8cSEd Schouten wmove(com_win, 0, 0); 339072fcea8cSEd Schouten werase(com_win); 339172fcea8cSEd Schouten wprintw(com_win, menu_too_lrg_msg); 339272fcea8cSEd Schouten wrefresh(com_win); 339372fcea8cSEd Schouten clear_com_win = TRUE; 339472fcea8cSEd Schouten return(0); 339572fcea8cSEd Schouten } 339672fcea8cSEd Schouten 339772fcea8cSEd Schouten top_offset = 0; 339872fcea8cSEd Schouten 339972fcea8cSEd Schouten if (list_size > LINES) 340072fcea8cSEd Schouten { 340172fcea8cSEd Schouten max_height = LINES; 340272fcea8cSEd Schouten if (max_height > 11) 340372fcea8cSEd Schouten vert_size = max_height - 8; 340472fcea8cSEd Schouten else 340572fcea8cSEd Schouten vert_size = max_height; 340672fcea8cSEd Schouten } 340772fcea8cSEd Schouten else 340872fcea8cSEd Schouten { 340972fcea8cSEd Schouten vert_size = list_size; 341072fcea8cSEd Schouten max_height = list_size; 341172fcea8cSEd Schouten } 341272fcea8cSEd Schouten 341372fcea8cSEd Schouten if (LINES >= (vert_size + 8)) 341472fcea8cSEd Schouten { 341572fcea8cSEd Schouten if (menu_list[0].argument != MENU_WARN) 341672fcea8cSEd Schouten max_height = vert_size + 8; 341772fcea8cSEd Schouten else 341872fcea8cSEd Schouten max_height = vert_size + 7; 341972fcea8cSEd Schouten top_offset = 4; 342072fcea8cSEd Schouten } 342172fcea8cSEd Schouten x_off = (COLS - max_width) / 2; 342272fcea8cSEd Schouten y_off = (LINES - max_height - 1) / 2; 342372fcea8cSEd Schouten temp_win = newwin(max_height, max_width, y_off, x_off); 342472fcea8cSEd Schouten keypad(temp_win, TRUE); 342572fcea8cSEd Schouten 342672fcea8cSEd Schouten paint_menu(menu_list, max_width, max_height, list_size, top_offset, temp_win, off_start, vert_size); 342772fcea8cSEd Schouten 342872fcea8cSEd Schouten counter = 1; 342972fcea8cSEd Schouten vert_pos = 0; 343072fcea8cSEd Schouten do 343172fcea8cSEd Schouten { 343272fcea8cSEd Schouten if (off_start > 2) 343372fcea8cSEd Schouten wmove(temp_win, (1 + counter + top_offset - off_start), 3); 343472fcea8cSEd Schouten else 343572fcea8cSEd Schouten wmove(temp_win, (counter + top_offset - off_start), 3); 343672fcea8cSEd Schouten 343772fcea8cSEd Schouten wrefresh(temp_win); 343896b676e9SEd Schouten in = wgetch(temp_win); 343996b676e9SEd Schouten input = in; 344096b676e9SEd Schouten if (input == -1) 344196b676e9SEd Schouten exit(0); 344272fcea8cSEd Schouten 344331dcbfadSAndrey A. Chernov if (isascii(input) && isalnum(input)) 344472fcea8cSEd Schouten { 344531dcbfadSAndrey A. Chernov if (isalpha(input)) 344672fcea8cSEd Schouten { 344772fcea8cSEd Schouten temp = 1 + tolower(input) - 'a'; 344872fcea8cSEd Schouten } 344931dcbfadSAndrey A. Chernov else if (isdigit(input)) 345072fcea8cSEd Schouten { 345172fcea8cSEd Schouten temp = (2 + 'z' - 'a') + (input - '0'); 345272fcea8cSEd Schouten } 345372fcea8cSEd Schouten 345472fcea8cSEd Schouten if (temp <= list_size) 345572fcea8cSEd Schouten { 345672fcea8cSEd Schouten input = '\n'; 345772fcea8cSEd Schouten counter = temp; 345872fcea8cSEd Schouten } 345972fcea8cSEd Schouten } 346072fcea8cSEd Schouten else 346172fcea8cSEd Schouten { 346272fcea8cSEd Schouten switch (input) 346372fcea8cSEd Schouten { 346472fcea8cSEd Schouten case ' ': /* space */ 346572fcea8cSEd Schouten case '\004': /* ^d, down */ 346672fcea8cSEd Schouten case KEY_RIGHT: 346772fcea8cSEd Schouten case KEY_DOWN: 346872fcea8cSEd Schouten counter++; 346972fcea8cSEd Schouten if (counter > list_size) 347072fcea8cSEd Schouten counter = 1; 347172fcea8cSEd Schouten break; 347272fcea8cSEd Schouten case '\010': /* ^h, backspace*/ 347372fcea8cSEd Schouten case '\025': /* ^u, up */ 347472fcea8cSEd Schouten case 127: /* ^?, delete */ 347572fcea8cSEd Schouten case KEY_BACKSPACE: 347672fcea8cSEd Schouten case KEY_LEFT: 347772fcea8cSEd Schouten case KEY_UP: 347872fcea8cSEd Schouten counter--; 347972fcea8cSEd Schouten if (counter == 0) 348072fcea8cSEd Schouten counter = list_size; 348172fcea8cSEd Schouten break; 348272fcea8cSEd Schouten case '\033': /* escape key */ 348372fcea8cSEd Schouten if (menu_list[0].argument != MENU_WARN) 348472fcea8cSEd Schouten counter = 0; 348572fcea8cSEd Schouten break; 348672fcea8cSEd Schouten case '\014': /* ^l */ 348772fcea8cSEd Schouten case '\022': /* ^r, redraw */ 348872fcea8cSEd Schouten paint_menu(menu_list, max_width, max_height, 348972fcea8cSEd Schouten list_size, top_offset, temp_win, 349072fcea8cSEd Schouten off_start, vert_size); 349172fcea8cSEd Schouten break; 349272fcea8cSEd Schouten default: 349372fcea8cSEd Schouten break; 349472fcea8cSEd Schouten } 349572fcea8cSEd Schouten } 349672fcea8cSEd Schouten 349772fcea8cSEd Schouten if (((list_size - off_start) >= (vert_size - 1)) && 349872fcea8cSEd Schouten (counter > (off_start + vert_size - 3)) && 349972fcea8cSEd Schouten (off_start > 1)) 350072fcea8cSEd Schouten { 350172fcea8cSEd Schouten if (counter == list_size) 350272fcea8cSEd Schouten off_start = (list_size - vert_size) + 2; 350372fcea8cSEd Schouten else 350472fcea8cSEd Schouten off_start++; 350572fcea8cSEd Schouten 350672fcea8cSEd Schouten paint_menu(menu_list, max_width, max_height, 350772fcea8cSEd Schouten list_size, top_offset, temp_win, off_start, 350872fcea8cSEd Schouten vert_size); 350972fcea8cSEd Schouten } 351072fcea8cSEd Schouten else if ((list_size != vert_size) && 351172fcea8cSEd Schouten (counter > (off_start + vert_size - 2))) 351272fcea8cSEd Schouten { 351372fcea8cSEd Schouten if (counter == list_size) 351472fcea8cSEd Schouten off_start = 2 + (list_size - vert_size); 351572fcea8cSEd Schouten else if (off_start == 1) 351672fcea8cSEd Schouten off_start = 3; 351772fcea8cSEd Schouten else 351872fcea8cSEd Schouten off_start++; 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 else if (counter < off_start) 352572fcea8cSEd Schouten { 352672fcea8cSEd Schouten if (counter <= 2) 352772fcea8cSEd Schouten off_start = 1; 352872fcea8cSEd Schouten else 352972fcea8cSEd Schouten off_start = counter; 353072fcea8cSEd Schouten 353172fcea8cSEd Schouten paint_menu(menu_list, max_width, max_height, 353272fcea8cSEd Schouten list_size, top_offset, temp_win, off_start, 353372fcea8cSEd Schouten vert_size); 353472fcea8cSEd Schouten } 353572fcea8cSEd Schouten } 353672fcea8cSEd Schouten while ((input != '\r') && (input != '\n') && (counter != 0)); 353772fcea8cSEd Schouten 353872fcea8cSEd Schouten werase(temp_win); 353972fcea8cSEd Schouten wrefresh(temp_win); 354072fcea8cSEd Schouten delwin(temp_win); 354172fcea8cSEd Schouten 354272fcea8cSEd Schouten if ((menu_list[counter].procedure != NULL) || 354372fcea8cSEd Schouten (menu_list[counter].iprocedure != NULL) || 354472fcea8cSEd Schouten (menu_list[counter].nprocedure != NULL)) 354572fcea8cSEd Schouten { 354672fcea8cSEd Schouten if (menu_list[counter].argument != -1) 354772fcea8cSEd Schouten (*menu_list[counter].iprocedure)(menu_list[counter].argument); 354872fcea8cSEd Schouten else if (menu_list[counter].ptr_argument != NULL) 354972fcea8cSEd Schouten (*menu_list[counter].procedure)(menu_list[counter].ptr_argument); 355072fcea8cSEd Schouten else 355172fcea8cSEd Schouten (*menu_list[counter].nprocedure)(); 355272fcea8cSEd Schouten } 355372fcea8cSEd Schouten 355472fcea8cSEd Schouten if (info_window) 355572fcea8cSEd Schouten paint_info_win(); 355672fcea8cSEd Schouten redraw(); 355772fcea8cSEd Schouten 355872fcea8cSEd Schouten return(counter); 355972fcea8cSEd Schouten } 356072fcea8cSEd Schouten 356172fcea8cSEd Schouten void 356272fcea8cSEd Schouten paint_menu(menu_list, max_width, max_height, list_size, top_offset, menu_win, 356372fcea8cSEd Schouten off_start, vert_size) 356472fcea8cSEd Schouten struct menu_entries menu_list[]; 356572fcea8cSEd Schouten int max_width, max_height, list_size, top_offset; 356672fcea8cSEd Schouten WINDOW *menu_win; 356772fcea8cSEd Schouten int off_start, vert_size; 356872fcea8cSEd Schouten { 356972fcea8cSEd Schouten int counter, temp_int; 357072fcea8cSEd Schouten 357172fcea8cSEd Schouten werase(menu_win); 357272fcea8cSEd Schouten 357372fcea8cSEd Schouten /* 357472fcea8cSEd Schouten | output top and bottom portions of menu box only if window 357572fcea8cSEd Schouten | large enough 357672fcea8cSEd Schouten */ 357772fcea8cSEd Schouten 357872fcea8cSEd Schouten if (max_height > vert_size) 357972fcea8cSEd Schouten { 358072fcea8cSEd Schouten wmove(menu_win, 1, 1); 358172fcea8cSEd Schouten if (!nohighlight) 358272fcea8cSEd Schouten wstandout(menu_win); 358372fcea8cSEd Schouten waddch(menu_win, '+'); 358472fcea8cSEd Schouten for (counter = 0; counter < (max_width - 4); counter++) 358572fcea8cSEd Schouten waddch(menu_win, '-'); 358672fcea8cSEd Schouten waddch(menu_win, '+'); 358772fcea8cSEd Schouten 358872fcea8cSEd Schouten wmove(menu_win, (max_height - 2), 1); 358972fcea8cSEd Schouten waddch(menu_win, '+'); 359072fcea8cSEd Schouten for (counter = 0; counter < (max_width - 4); counter++) 359172fcea8cSEd Schouten waddch(menu_win, '-'); 359272fcea8cSEd Schouten waddch(menu_win, '+'); 359372fcea8cSEd Schouten wstandend(menu_win); 359472fcea8cSEd Schouten wmove(menu_win, 2, 3); 359572fcea8cSEd Schouten waddstr(menu_win, menu_list[0].item_string); 359672fcea8cSEd Schouten wmove(menu_win, (max_height - 3), 3); 359772fcea8cSEd Schouten if (menu_list[0].argument != MENU_WARN) 359872fcea8cSEd Schouten waddstr(menu_win, menu_cancel_msg); 359972fcea8cSEd Schouten } 360072fcea8cSEd Schouten if (!nohighlight) 360172fcea8cSEd Schouten wstandout(menu_win); 360272fcea8cSEd Schouten 360372fcea8cSEd Schouten for (counter = 0; counter < (vert_size + top_offset); counter++) 360472fcea8cSEd Schouten { 360572fcea8cSEd Schouten if (top_offset == 4) 360672fcea8cSEd Schouten { 360772fcea8cSEd Schouten temp_int = counter + 2; 360872fcea8cSEd Schouten } 360972fcea8cSEd Schouten else 361072fcea8cSEd Schouten temp_int = counter; 361172fcea8cSEd Schouten 361272fcea8cSEd Schouten wmove(menu_win, temp_int, 1); 361372fcea8cSEd Schouten waddch(menu_win, '|'); 361472fcea8cSEd Schouten wmove(menu_win, temp_int, (max_width - 2)); 361572fcea8cSEd Schouten waddch(menu_win, '|'); 361672fcea8cSEd Schouten } 361772fcea8cSEd Schouten wstandend(menu_win); 361872fcea8cSEd Schouten 361972fcea8cSEd Schouten if (list_size > vert_size) 362072fcea8cSEd Schouten { 362172fcea8cSEd Schouten if (off_start >= 3) 362272fcea8cSEd Schouten { 362372fcea8cSEd Schouten temp_int = 1; 362472fcea8cSEd Schouten wmove(menu_win, top_offset, 3); 362572fcea8cSEd Schouten waddstr(menu_win, more_above_str); 362672fcea8cSEd Schouten } 362772fcea8cSEd Schouten else 362872fcea8cSEd Schouten temp_int = 0; 362972fcea8cSEd Schouten 363072fcea8cSEd Schouten for (counter = off_start; 363172fcea8cSEd Schouten ((temp_int + counter - off_start) < (vert_size - 1)); 363272fcea8cSEd Schouten counter++) 363372fcea8cSEd Schouten { 363472fcea8cSEd Schouten wmove(menu_win, (top_offset + temp_int + 363572fcea8cSEd Schouten (counter - off_start)), 3); 363672fcea8cSEd Schouten if (list_size > 1) 363772fcea8cSEd Schouten wprintw(menu_win, "%c) ", item_alpha[min((counter - 1), max_alpha_char)]); 363872fcea8cSEd Schouten waddstr(menu_win, menu_list[counter].item_string); 363972fcea8cSEd Schouten } 364072fcea8cSEd Schouten 364172fcea8cSEd Schouten wmove(menu_win, (top_offset + (vert_size - 1)), 3); 364272fcea8cSEd Schouten 364372fcea8cSEd Schouten if (counter == list_size) 364472fcea8cSEd Schouten { 364572fcea8cSEd Schouten if (list_size > 1) 364672fcea8cSEd Schouten wprintw(menu_win, "%c) ", item_alpha[min((counter - 1), max_alpha_char)]); 364772fcea8cSEd Schouten wprintw(menu_win, menu_list[counter].item_string); 364872fcea8cSEd Schouten } 364972fcea8cSEd Schouten else 365072fcea8cSEd Schouten wprintw(menu_win, more_below_str); 365172fcea8cSEd Schouten } 365272fcea8cSEd Schouten else 365372fcea8cSEd Schouten { 365472fcea8cSEd Schouten for (counter = 1; counter <= list_size; counter++) 365572fcea8cSEd Schouten { 365672fcea8cSEd Schouten wmove(menu_win, (top_offset + counter - 1), 3); 365772fcea8cSEd Schouten if (list_size > 1) 365872fcea8cSEd Schouten wprintw(menu_win, "%c) ", item_alpha[min((counter - 1), max_alpha_char)]); 365972fcea8cSEd Schouten waddstr(menu_win, menu_list[counter].item_string); 366072fcea8cSEd Schouten } 366172fcea8cSEd Schouten } 366272fcea8cSEd Schouten } 366372fcea8cSEd Schouten 366472fcea8cSEd Schouten void 366572fcea8cSEd Schouten help() 366672fcea8cSEd Schouten { 366772fcea8cSEd Schouten int counter; 366872fcea8cSEd Schouten 366972fcea8cSEd Schouten werase(help_win); 367072fcea8cSEd Schouten clearok(help_win, TRUE); 367172fcea8cSEd Schouten for (counter = 0; counter < 22; counter++) 367272fcea8cSEd Schouten { 367372fcea8cSEd Schouten wmove(help_win, counter, 0); 367472fcea8cSEd Schouten waddstr(help_win, (emacs_keys_mode) ? 367572fcea8cSEd Schouten emacs_help_text[counter] : help_text[counter]); 367672fcea8cSEd Schouten } 367772fcea8cSEd Schouten wrefresh(help_win); 367872fcea8cSEd Schouten werase(com_win); 367972fcea8cSEd Schouten wmove(com_win, 0, 0); 368072fcea8cSEd Schouten wprintw(com_win, press_any_key_msg); 368172fcea8cSEd Schouten wrefresh(com_win); 368272fcea8cSEd Schouten counter = wgetch(com_win); 368396b676e9SEd Schouten if (counter == -1) 368496b676e9SEd Schouten exit(0); 368572fcea8cSEd Schouten werase(com_win); 368672fcea8cSEd Schouten wmove(com_win, 0, 0); 368772fcea8cSEd Schouten werase(help_win); 368872fcea8cSEd Schouten wrefresh(help_win); 368972fcea8cSEd Schouten wrefresh(com_win); 369072fcea8cSEd Schouten redraw(); 369172fcea8cSEd Schouten } 369272fcea8cSEd Schouten 369372fcea8cSEd Schouten void 369472fcea8cSEd Schouten paint_info_win() 369572fcea8cSEd Schouten { 369672fcea8cSEd Schouten int counter; 369772fcea8cSEd Schouten 369872fcea8cSEd Schouten if (!info_window) 369972fcea8cSEd Schouten return; 370072fcea8cSEd Schouten 370172fcea8cSEd Schouten werase(info_win); 370272fcea8cSEd Schouten for (counter = 0; counter < 5; counter++) 370372fcea8cSEd Schouten { 370472fcea8cSEd Schouten wmove(info_win, counter, 0); 370572fcea8cSEd Schouten wclrtoeol(info_win); 370672fcea8cSEd Schouten if (info_type == CONTROL_KEYS) 370772fcea8cSEd Schouten waddstr(info_win, (emacs_keys_mode) ? 370872fcea8cSEd Schouten emacs_control_keys[counter] : control_keys[counter]); 370972fcea8cSEd Schouten else if (info_type == COMMANDS) 371072fcea8cSEd Schouten waddstr(info_win, command_strings[counter]); 371172fcea8cSEd Schouten } 371296b676e9SEd Schouten wmove(info_win, 5, 0); 371396b676e9SEd Schouten if (!nohighlight) 371496b676e9SEd Schouten wstandout(info_win); 371596b676e9SEd Schouten waddstr(info_win, separator); 371696b676e9SEd Schouten wstandend(info_win); 371772fcea8cSEd Schouten wrefresh(info_win); 371872fcea8cSEd Schouten } 371972fcea8cSEd Schouten 372072fcea8cSEd Schouten void 372172fcea8cSEd Schouten no_info_window() 372272fcea8cSEd Schouten { 372372fcea8cSEd Schouten if (!info_window) 372472fcea8cSEd Schouten return; 372572fcea8cSEd Schouten delwin(info_win); 372672fcea8cSEd Schouten delwin(text_win); 372772fcea8cSEd Schouten info_window = FALSE; 372872fcea8cSEd Schouten last_line = LINES - 2; 372972fcea8cSEd Schouten text_win = newwin((LINES - 1), COLS, 0, 0); 373072fcea8cSEd Schouten keypad(text_win, TRUE); 373172fcea8cSEd Schouten idlok(text_win, TRUE); 373272fcea8cSEd Schouten clearok(text_win, TRUE); 373372fcea8cSEd Schouten midscreen(scr_vert, point); 373472fcea8cSEd Schouten wrefresh(text_win); 373572fcea8cSEd Schouten clear_com_win = TRUE; 373672fcea8cSEd Schouten } 373772fcea8cSEd Schouten 373872fcea8cSEd Schouten void 373972fcea8cSEd Schouten create_info_window() 374072fcea8cSEd Schouten { 374172fcea8cSEd Schouten if (info_window) 374272fcea8cSEd Schouten return; 374372fcea8cSEd Schouten last_line = LINES - 8; 374472fcea8cSEd Schouten delwin(text_win); 374572fcea8cSEd Schouten text_win = newwin((LINES - 7), COLS, 6, 0); 374672fcea8cSEd Schouten keypad(text_win, TRUE); 374772fcea8cSEd Schouten idlok(text_win, TRUE); 374872fcea8cSEd Schouten werase(text_win); 374972fcea8cSEd Schouten info_window = TRUE; 375096b676e9SEd Schouten info_win = newwin(6, COLS, 0, 0); 375172fcea8cSEd Schouten werase(info_win); 375272fcea8cSEd Schouten info_type = CONTROL_KEYS; 375372fcea8cSEd Schouten midscreen(min(scr_vert, last_line), point); 375472fcea8cSEd Schouten clearok(info_win, TRUE); 375572fcea8cSEd Schouten paint_info_win(); 375672fcea8cSEd Schouten wrefresh(text_win); 375772fcea8cSEd Schouten clear_com_win = TRUE; 375872fcea8cSEd Schouten } 375972fcea8cSEd Schouten 376072fcea8cSEd Schouten int 376172fcea8cSEd Schouten file_op(arg) 376272fcea8cSEd Schouten int arg; 376372fcea8cSEd Schouten { 376472fcea8cSEd Schouten char *string; 376572fcea8cSEd Schouten int flag; 376672fcea8cSEd Schouten 376772fcea8cSEd Schouten if (restrict_mode()) 376872fcea8cSEd Schouten { 376972fcea8cSEd Schouten return(0); 377072fcea8cSEd Schouten } 377172fcea8cSEd Schouten 377272fcea8cSEd Schouten if (arg == READ_FILE) 377372fcea8cSEd Schouten { 377472fcea8cSEd Schouten string = get_string(file_read_prompt_str, TRUE); 377572fcea8cSEd Schouten recv_file = TRUE; 377672fcea8cSEd Schouten tmp_file = resolve_name(string); 377772fcea8cSEd Schouten check_fp(); 377872fcea8cSEd Schouten if (tmp_file != string) 377972fcea8cSEd Schouten free(tmp_file); 378072fcea8cSEd Schouten free(string); 378172fcea8cSEd Schouten } 378272fcea8cSEd Schouten else if (arg == WRITE_FILE) 378372fcea8cSEd Schouten { 378472fcea8cSEd Schouten string = get_string(file_write_prompt_str, TRUE); 378572fcea8cSEd Schouten tmp_file = resolve_name(string); 3786cfe04e82SEd Schouten write_file(tmp_file, 1); 378772fcea8cSEd Schouten if (tmp_file != string) 378872fcea8cSEd Schouten free(tmp_file); 378972fcea8cSEd Schouten free(string); 379072fcea8cSEd Schouten } 379172fcea8cSEd Schouten else if (arg == SAVE_FILE) 379272fcea8cSEd Schouten { 379372fcea8cSEd Schouten /* 379472fcea8cSEd Schouten | changes made here should be reflected in finish() 379572fcea8cSEd Schouten */ 379672fcea8cSEd Schouten 379772fcea8cSEd Schouten if (in_file_name) 379872fcea8cSEd Schouten flag = TRUE; 379972fcea8cSEd Schouten else 380072fcea8cSEd Schouten flag = FALSE; 380172fcea8cSEd Schouten 380272fcea8cSEd Schouten string = in_file_name; 380396b676e9SEd Schouten if ((string == NULL) || (*string == '\0')) 380472fcea8cSEd Schouten string = get_string(save_file_name_prompt, TRUE); 380596b676e9SEd Schouten if ((string == NULL) || (*string == '\0')) 380672fcea8cSEd Schouten { 380772fcea8cSEd Schouten wmove(com_win, 0, 0); 380872fcea8cSEd Schouten wprintw(com_win, file_not_saved_msg); 380972fcea8cSEd Schouten wclrtoeol(com_win); 381072fcea8cSEd Schouten wrefresh(com_win); 381172fcea8cSEd Schouten clear_com_win = TRUE; 381272fcea8cSEd Schouten return(0); 381372fcea8cSEd Schouten } 381472fcea8cSEd Schouten if (!flag) 381572fcea8cSEd Schouten { 381672fcea8cSEd Schouten tmp_file = resolve_name(string); 381772fcea8cSEd Schouten if (tmp_file != string) 381872fcea8cSEd Schouten { 381972fcea8cSEd Schouten free(string); 382072fcea8cSEd Schouten string = tmp_file; 382172fcea8cSEd Schouten } 382272fcea8cSEd Schouten } 3823cfe04e82SEd Schouten if (write_file(string, 1)) 382472fcea8cSEd Schouten { 382572fcea8cSEd Schouten in_file_name = string; 382672fcea8cSEd Schouten text_changes = FALSE; 382772fcea8cSEd Schouten } 382872fcea8cSEd Schouten else if (!flag) 382972fcea8cSEd Schouten free(string); 383072fcea8cSEd Schouten } 383172fcea8cSEd Schouten return(0); 383272fcea8cSEd Schouten } 383372fcea8cSEd Schouten 383472fcea8cSEd Schouten void 383572fcea8cSEd Schouten shell_op() 383672fcea8cSEd Schouten { 383772fcea8cSEd Schouten char *string; 383872fcea8cSEd Schouten 383972fcea8cSEd Schouten if (((string = get_string(shell_prompt, TRUE)) != NULL) && 384096b676e9SEd Schouten (*string != '\0')) 384172fcea8cSEd Schouten { 384272fcea8cSEd Schouten sh_command(string); 384372fcea8cSEd Schouten free(string); 384472fcea8cSEd Schouten } 384572fcea8cSEd Schouten } 384672fcea8cSEd Schouten 384772fcea8cSEd Schouten void 384872fcea8cSEd Schouten leave_op() 384972fcea8cSEd Schouten { 385072fcea8cSEd Schouten if (text_changes) 385172fcea8cSEd Schouten { 385272fcea8cSEd Schouten menu_op(leave_menu); 385372fcea8cSEd Schouten } 385472fcea8cSEd Schouten else 385572fcea8cSEd Schouten quit(TRUE); 385672fcea8cSEd Schouten } 385772fcea8cSEd Schouten 385872fcea8cSEd Schouten void 385972fcea8cSEd Schouten redraw() 386072fcea8cSEd Schouten { 386172fcea8cSEd Schouten if (info_window) 386272fcea8cSEd Schouten { 386372fcea8cSEd Schouten clearok(info_win, TRUE); 386472fcea8cSEd Schouten paint_info_win(); 386572fcea8cSEd Schouten } 386672fcea8cSEd Schouten else 386772fcea8cSEd Schouten clearok(text_win, TRUE); 386872fcea8cSEd Schouten midscreen(scr_vert, point); 386972fcea8cSEd Schouten } 387072fcea8cSEd Schouten 387172fcea8cSEd Schouten /* 387272fcea8cSEd Schouten | The following routines will "format" a paragraph (as defined by a 387372fcea8cSEd Schouten | block of text with blank lines before and after the block). 387472fcea8cSEd Schouten */ 387572fcea8cSEd Schouten 387672fcea8cSEd Schouten int 387772fcea8cSEd Schouten Blank_Line(test_line) /* test if line has any non-space characters */ 387872fcea8cSEd Schouten struct text *test_line; 387972fcea8cSEd Schouten { 388072fcea8cSEd Schouten unsigned char *line; 388172fcea8cSEd Schouten int length; 388272fcea8cSEd Schouten 388372fcea8cSEd Schouten if (test_line == NULL) 388472fcea8cSEd Schouten return(TRUE); 388572fcea8cSEd Schouten 388672fcea8cSEd Schouten length = 1; 388772fcea8cSEd Schouten line = test_line->line; 388872fcea8cSEd Schouten 388972fcea8cSEd Schouten /* 389072fcea8cSEd Schouten | To handle troff/nroff documents, consider a line with a 389172fcea8cSEd Schouten | period ('.') in the first column to be blank. To handle mail 389272fcea8cSEd Schouten | messages with included text, consider a line with a '>' blank. 389372fcea8cSEd Schouten */ 389472fcea8cSEd Schouten 389572fcea8cSEd Schouten if ((*line == '.') || (*line == '>')) 389672fcea8cSEd Schouten return(TRUE); 389772fcea8cSEd Schouten 389872fcea8cSEd Schouten while (((*line == ' ') || (*line == '\t')) && (length < test_line->line_length)) 389972fcea8cSEd Schouten { 390072fcea8cSEd Schouten length++; 390172fcea8cSEd Schouten line++; 390272fcea8cSEd Schouten } 390372fcea8cSEd Schouten if (length != test_line->line_length) 390472fcea8cSEd Schouten return(FALSE); 390572fcea8cSEd Schouten else 390672fcea8cSEd Schouten return(TRUE); 390772fcea8cSEd Schouten } 390872fcea8cSEd Schouten 390972fcea8cSEd Schouten void 391072fcea8cSEd Schouten Format() /* format the paragraph according to set margins */ 391172fcea8cSEd Schouten { 391272fcea8cSEd Schouten int string_count; 391372fcea8cSEd Schouten int offset; 391472fcea8cSEd Schouten int temp_case; 391572fcea8cSEd Schouten int status; 391672fcea8cSEd Schouten int tmp_af; 391772fcea8cSEd Schouten int counter; 391872fcea8cSEd Schouten unsigned char *line; 391972fcea8cSEd Schouten unsigned char *tmp_srchstr; 392072fcea8cSEd Schouten unsigned char *temp1, *temp2; 392172fcea8cSEd Schouten unsigned char *temp_dword; 392272fcea8cSEd Schouten unsigned char temp_d_char[3]; 392372fcea8cSEd Schouten 392472fcea8cSEd Schouten temp_d_char[0] = d_char[0]; 392572fcea8cSEd Schouten temp_d_char[1] = d_char[1]; 392672fcea8cSEd Schouten temp_d_char[2] = d_char[2]; 392772fcea8cSEd Schouten 392872fcea8cSEd Schouten /* 392972fcea8cSEd Schouten | if observ_margins is not set, or the current line is blank, 393072fcea8cSEd Schouten | do not format the current paragraph 393172fcea8cSEd Schouten */ 393272fcea8cSEd Schouten 393372fcea8cSEd Schouten if ((!observ_margins) || (Blank_Line(curr_line))) 393472fcea8cSEd Schouten return; 393572fcea8cSEd Schouten 393672fcea8cSEd Schouten /* 393772fcea8cSEd Schouten | save the currently set flags, and clear them 393872fcea8cSEd Schouten */ 393972fcea8cSEd Schouten 394072fcea8cSEd Schouten wmove(com_win, 0, 0); 394172fcea8cSEd Schouten wclrtoeol(com_win); 394272fcea8cSEd Schouten wprintw(com_win, formatting_msg); 394372fcea8cSEd Schouten wrefresh(com_win); 394472fcea8cSEd Schouten 394572fcea8cSEd Schouten /* 394672fcea8cSEd Schouten | get current position in paragraph, so after formatting, the cursor 394772fcea8cSEd Schouten | will be in the same relative position 394872fcea8cSEd Schouten */ 394972fcea8cSEd Schouten 395072fcea8cSEd Schouten tmp_af = auto_format; 395172fcea8cSEd Schouten auto_format = FALSE; 395272fcea8cSEd Schouten offset = position; 395372fcea8cSEd Schouten if (position != 1) 395472fcea8cSEd Schouten prev_word(); 395572fcea8cSEd Schouten temp_dword = d_word; 395672fcea8cSEd Schouten d_word = NULL; 395772fcea8cSEd Schouten temp_case = case_sen; 395872fcea8cSEd Schouten case_sen = TRUE; 395972fcea8cSEd Schouten tmp_srchstr = srch_str; 396072fcea8cSEd Schouten temp2 = srch_str = (unsigned char *) malloc(1 + curr_line->line_length - position); 396172fcea8cSEd Schouten if ((*point == ' ') || (*point == '\t')) 396272fcea8cSEd Schouten adv_word(); 396372fcea8cSEd Schouten offset -= position; 396472fcea8cSEd Schouten counter = position; 396572fcea8cSEd Schouten line = temp1 = point; 396696b676e9SEd Schouten while ((*temp1 != '\0') && (*temp1 != ' ') && (*temp1 != '\t') && (counter < curr_line->line_length)) 396772fcea8cSEd Schouten { 396872fcea8cSEd Schouten *temp2 = *temp1; 396972fcea8cSEd Schouten temp2++; 397072fcea8cSEd Schouten temp1++; 397172fcea8cSEd Schouten counter++; 397272fcea8cSEd Schouten } 397396b676e9SEd Schouten *temp2 = '\0'; 397472fcea8cSEd Schouten if (position != 1) 397572fcea8cSEd Schouten bol(); 397672fcea8cSEd Schouten while (!Blank_Line(curr_line->prev_line)) 397772fcea8cSEd Schouten bol(); 397872fcea8cSEd Schouten string_count = 0; 397972fcea8cSEd Schouten status = TRUE; 398072fcea8cSEd Schouten while ((line != point) && (status)) 398172fcea8cSEd Schouten { 398272fcea8cSEd Schouten status = search(FALSE); 398372fcea8cSEd Schouten string_count++; 398472fcea8cSEd Schouten } 398572fcea8cSEd Schouten 398672fcea8cSEd Schouten wmove(com_win, 0, 0); 398772fcea8cSEd Schouten wclrtoeol(com_win); 398872fcea8cSEd Schouten wprintw(com_win, formatting_msg); 398972fcea8cSEd Schouten wrefresh(com_win); 399072fcea8cSEd Schouten 399172fcea8cSEd Schouten /* 399272fcea8cSEd Schouten | now get back to the start of the paragraph to start formatting 399372fcea8cSEd Schouten */ 399472fcea8cSEd Schouten 399572fcea8cSEd Schouten if (position != 1) 399672fcea8cSEd Schouten bol(); 399772fcea8cSEd Schouten while (!Blank_Line(curr_line->prev_line)) 399872fcea8cSEd Schouten bol(); 399972fcea8cSEd Schouten 400072fcea8cSEd Schouten observ_margins = FALSE; 400172fcea8cSEd Schouten 400272fcea8cSEd Schouten /* 400372fcea8cSEd Schouten | Start going through lines, putting spaces at end of lines if they do 400472fcea8cSEd Schouten | not already exist. Append lines together to get one long line, and 400572fcea8cSEd Schouten | eliminate spacing at begin of lines. 400672fcea8cSEd Schouten */ 400772fcea8cSEd Schouten 400872fcea8cSEd Schouten while (!Blank_Line(curr_line->next_line)) 400972fcea8cSEd Schouten { 401072fcea8cSEd Schouten eol(); 401172fcea8cSEd Schouten left(TRUE); 401272fcea8cSEd Schouten if (*point != ' ') 401372fcea8cSEd Schouten { 401472fcea8cSEd Schouten right(TRUE); 401572fcea8cSEd Schouten insert(' '); 401672fcea8cSEd Schouten } 401772fcea8cSEd Schouten else 401872fcea8cSEd Schouten right(TRUE); 401972fcea8cSEd Schouten del_char(); 402072fcea8cSEd Schouten if ((*point == ' ') || (*point == '\t')) 402172fcea8cSEd Schouten del_word(); 402272fcea8cSEd Schouten } 402372fcea8cSEd Schouten 402472fcea8cSEd Schouten /* 402572fcea8cSEd Schouten | Now there is one long line. Eliminate extra spaces within the line 402672fcea8cSEd Schouten | after the first word (so as not to blow away any indenting the user 402772fcea8cSEd Schouten | may have put in). 402872fcea8cSEd Schouten */ 402972fcea8cSEd Schouten 403072fcea8cSEd Schouten bol(); 403172fcea8cSEd Schouten adv_word(); 403272fcea8cSEd Schouten while (position < curr_line->line_length) 403372fcea8cSEd Schouten { 403472fcea8cSEd Schouten if ((*point == ' ') && (*(point + 1) == ' ')) 403572fcea8cSEd Schouten del_char(); 403672fcea8cSEd Schouten else 403772fcea8cSEd Schouten right(TRUE); 403872fcea8cSEd Schouten } 403972fcea8cSEd Schouten 404072fcea8cSEd Schouten /* 404172fcea8cSEd Schouten | Now make sure there are two spaces after a '.'. 404272fcea8cSEd Schouten */ 404372fcea8cSEd Schouten 404472fcea8cSEd Schouten bol(); 404572fcea8cSEd Schouten while (position < curr_line->line_length) 404672fcea8cSEd Schouten { 404772fcea8cSEd Schouten if ((*point == '.') && (*(point + 1) == ' ')) 404872fcea8cSEd Schouten { 404972fcea8cSEd Schouten right(TRUE); 405072fcea8cSEd Schouten insert(' '); 405172fcea8cSEd Schouten insert(' '); 405272fcea8cSEd Schouten while (*point == ' ') 405372fcea8cSEd Schouten del_char(); 405472fcea8cSEd Schouten } 405572fcea8cSEd Schouten right(TRUE); 405672fcea8cSEd Schouten } 405772fcea8cSEd Schouten 405872fcea8cSEd Schouten observ_margins = TRUE; 405972fcea8cSEd Schouten bol(); 406072fcea8cSEd Schouten 406172fcea8cSEd Schouten wmove(com_win, 0, 0); 406272fcea8cSEd Schouten wclrtoeol(com_win); 406372fcea8cSEd Schouten wprintw(com_win, formatting_msg); 406472fcea8cSEd Schouten wrefresh(com_win); 406572fcea8cSEd Schouten 406672fcea8cSEd Schouten /* 406772fcea8cSEd Schouten | create lines between margins 406872fcea8cSEd Schouten */ 406972fcea8cSEd Schouten 407072fcea8cSEd Schouten while (position < curr_line->line_length) 407172fcea8cSEd Schouten { 407272fcea8cSEd Schouten while ((scr_pos < right_margin) && (position < curr_line->line_length)) 407372fcea8cSEd Schouten right(TRUE); 407472fcea8cSEd Schouten if (position < curr_line->line_length) 407572fcea8cSEd Schouten { 407672fcea8cSEd Schouten prev_word(); 407772fcea8cSEd Schouten if (position == 1) 407872fcea8cSEd Schouten adv_word(); 407972fcea8cSEd Schouten insert_line(TRUE); 408072fcea8cSEd Schouten } 408172fcea8cSEd Schouten } 408272fcea8cSEd Schouten 408372fcea8cSEd Schouten /* 408472fcea8cSEd Schouten | go back to begin of paragraph, put cursor back to original position 408572fcea8cSEd Schouten */ 408672fcea8cSEd Schouten 408772fcea8cSEd Schouten bol(); 408872fcea8cSEd Schouten while (!Blank_Line(curr_line->prev_line)) 408972fcea8cSEd Schouten bol(); 409072fcea8cSEd Schouten 409172fcea8cSEd Schouten /* 409272fcea8cSEd Schouten | find word cursor was in 409372fcea8cSEd Schouten */ 409472fcea8cSEd Schouten 409572fcea8cSEd Schouten while ((status) && (string_count > 0)) 409672fcea8cSEd Schouten { 409772fcea8cSEd Schouten search(FALSE); 409872fcea8cSEd Schouten string_count--; 409972fcea8cSEd Schouten } 410072fcea8cSEd Schouten 410172fcea8cSEd Schouten /* 410272fcea8cSEd Schouten | offset the cursor to where it was before from the start of the word 410372fcea8cSEd Schouten */ 410472fcea8cSEd Schouten 410572fcea8cSEd Schouten while (offset > 0) 410672fcea8cSEd Schouten { 410772fcea8cSEd Schouten offset--; 410872fcea8cSEd Schouten right(TRUE); 410972fcea8cSEd Schouten } 411072fcea8cSEd Schouten 411172fcea8cSEd Schouten /* 411272fcea8cSEd Schouten | reset flags and strings to what they were before formatting 411372fcea8cSEd Schouten */ 411472fcea8cSEd Schouten 411572fcea8cSEd Schouten if (d_word != NULL) 411672fcea8cSEd Schouten free(d_word); 411772fcea8cSEd Schouten d_word = temp_dword; 411872fcea8cSEd Schouten case_sen = temp_case; 411972fcea8cSEd Schouten free(srch_str); 412072fcea8cSEd Schouten srch_str = tmp_srchstr; 412172fcea8cSEd Schouten d_char[0] = temp_d_char[0]; 412272fcea8cSEd Schouten d_char[1] = temp_d_char[1]; 412372fcea8cSEd Schouten d_char[2] = temp_d_char[2]; 412472fcea8cSEd Schouten auto_format = tmp_af; 412572fcea8cSEd Schouten 412672fcea8cSEd Schouten midscreen(scr_vert, point); 412772fcea8cSEd Schouten werase(com_win); 412872fcea8cSEd Schouten wrefresh(com_win); 412972fcea8cSEd Schouten } 413072fcea8cSEd Schouten 413172fcea8cSEd Schouten unsigned char *init_name[3] = { 4132cfe04e82SEd Schouten "/usr/share/misc/init.ee", 413372fcea8cSEd Schouten NULL, 413472fcea8cSEd Schouten ".init.ee" 413572fcea8cSEd Schouten }; 413672fcea8cSEd Schouten 413772fcea8cSEd Schouten void 413872fcea8cSEd Schouten ee_init() /* check for init file and read it if it exists */ 413972fcea8cSEd Schouten { 414072fcea8cSEd Schouten FILE *init_file; 414172fcea8cSEd Schouten unsigned char *string; 414272fcea8cSEd Schouten unsigned char *str1; 414372fcea8cSEd Schouten unsigned char *str2; 414472fcea8cSEd Schouten char *home; 414572fcea8cSEd Schouten int counter; 414672fcea8cSEd Schouten int temp_int; 414772fcea8cSEd Schouten 414872fcea8cSEd Schouten string = getenv("HOME"); 414996b676e9SEd Schouten if (string == NULL) 415096b676e9SEd Schouten string = "/tmp"; 415172fcea8cSEd Schouten str1 = home = malloc(strlen(string)+10); 415272fcea8cSEd Schouten strcpy(home, string); 415372fcea8cSEd Schouten strcat(home, "/.init.ee"); 415472fcea8cSEd Schouten init_name[1] = home; 415572fcea8cSEd Schouten string = malloc(512); 415672fcea8cSEd Schouten 415772fcea8cSEd Schouten for (counter = 0; counter < 3; counter++) 415872fcea8cSEd Schouten { 415972fcea8cSEd Schouten if (!(access(init_name[counter], 4))) 416072fcea8cSEd Schouten { 416172fcea8cSEd Schouten init_file = fopen(init_name[counter], "r"); 416272fcea8cSEd Schouten while ((str2 = fgets(string, 512, init_file)) != NULL) 416372fcea8cSEd Schouten { 416472fcea8cSEd Schouten str1 = str2 = string; 416572fcea8cSEd Schouten while (*str2 != '\n') 416672fcea8cSEd Schouten str2++; 416796b676e9SEd Schouten *str2 = '\0'; 416872fcea8cSEd Schouten 416972fcea8cSEd Schouten if (unique_test(string, init_strings) != 1) 417072fcea8cSEd Schouten continue; 417172fcea8cSEd Schouten 417272fcea8cSEd Schouten if (compare(str1, CASE, FALSE)) 417372fcea8cSEd Schouten case_sen = TRUE; 417472fcea8cSEd Schouten else if (compare(str1, NOCASE, FALSE)) 417572fcea8cSEd Schouten case_sen = FALSE; 417672fcea8cSEd Schouten else if (compare(str1, EXPAND, FALSE)) 417772fcea8cSEd Schouten expand_tabs = TRUE; 417872fcea8cSEd Schouten else if (compare(str1, NOEXPAND, FALSE)) 417972fcea8cSEd Schouten expand_tabs = FALSE; 418072fcea8cSEd Schouten else if (compare(str1, INFO, FALSE)) 418172fcea8cSEd Schouten info_window = TRUE; 418272fcea8cSEd Schouten else if (compare(str1, NOINFO, FALSE)) 418372fcea8cSEd Schouten info_window = FALSE; 418472fcea8cSEd Schouten else if (compare(str1, MARGINS, FALSE)) 418572fcea8cSEd Schouten observ_margins = TRUE; 418672fcea8cSEd Schouten else if (compare(str1, NOMARGINS, FALSE)) 418772fcea8cSEd Schouten observ_margins = FALSE; 418872fcea8cSEd Schouten else if (compare(str1, AUTOFORMAT, FALSE)) 418972fcea8cSEd Schouten { 419072fcea8cSEd Schouten auto_format = TRUE; 419172fcea8cSEd Schouten observ_margins = TRUE; 419272fcea8cSEd Schouten } 419372fcea8cSEd Schouten else if (compare(str1, NOAUTOFORMAT, FALSE)) 419472fcea8cSEd Schouten auto_format = FALSE; 419572fcea8cSEd Schouten else if (compare(str1, Echo, FALSE)) 419672fcea8cSEd Schouten { 419772fcea8cSEd Schouten str1 = next_word(str1); 419896b676e9SEd Schouten if (*str1 != '\0') 419972fcea8cSEd Schouten echo_string(str1); 420072fcea8cSEd Schouten } 420172fcea8cSEd Schouten else if (compare(str1, PRINTCOMMAND, FALSE)) 420272fcea8cSEd Schouten { 420372fcea8cSEd Schouten str1 = next_word(str1); 420472fcea8cSEd Schouten print_command = malloc(strlen(str1)+1); 420572fcea8cSEd Schouten strcpy(print_command, str1); 420672fcea8cSEd Schouten } 420772fcea8cSEd Schouten else if (compare(str1, RIGHTMARGIN, FALSE)) 420872fcea8cSEd Schouten { 420972fcea8cSEd Schouten str1 = next_word(str1); 421072fcea8cSEd Schouten if ((*str1 >= '0') && (*str1 <= '9')) 421172fcea8cSEd Schouten { 421272fcea8cSEd Schouten temp_int = atoi(str1); 421372fcea8cSEd Schouten if (temp_int > 0) 421472fcea8cSEd Schouten right_margin = temp_int; 421572fcea8cSEd Schouten } 421672fcea8cSEd Schouten } 421772fcea8cSEd Schouten else if (compare(str1, HIGHLIGHT, FALSE)) 421872fcea8cSEd Schouten nohighlight = FALSE; 421972fcea8cSEd Schouten else if (compare(str1, NOHIGHLIGHT, FALSE)) 422072fcea8cSEd Schouten nohighlight = TRUE; 422172fcea8cSEd Schouten else if (compare(str1, EIGHTBIT, FALSE)) 422272fcea8cSEd Schouten eightbit = TRUE; 422372fcea8cSEd Schouten else if (compare(str1, NOEIGHTBIT, FALSE)) 422472fcea8cSEd Schouten { 422572fcea8cSEd Schouten eightbit = FALSE; 422672fcea8cSEd Schouten ee_chinese = FALSE; 422772fcea8cSEd Schouten } 422872fcea8cSEd Schouten else if (compare(str1, EMACS_string, FALSE)) 422972fcea8cSEd Schouten emacs_keys_mode = TRUE; 423072fcea8cSEd Schouten else if (compare(str1, NOEMACS_string, FALSE)) 423172fcea8cSEd Schouten emacs_keys_mode = FALSE; 423272fcea8cSEd Schouten else if (compare(str1, chinese_cmd, FALSE)) 423372fcea8cSEd Schouten { 423472fcea8cSEd Schouten ee_chinese = TRUE; 423572fcea8cSEd Schouten eightbit = TRUE; 423672fcea8cSEd Schouten } 423772fcea8cSEd Schouten else if (compare(str1, nochinese_cmd, FALSE)) 423872fcea8cSEd Schouten ee_chinese = FALSE; 423972fcea8cSEd Schouten } 424072fcea8cSEd Schouten fclose(init_file); 424172fcea8cSEd Schouten } 424272fcea8cSEd Schouten } 424372fcea8cSEd Schouten free(string); 424472fcea8cSEd Schouten free(home); 424572fcea8cSEd Schouten 424672fcea8cSEd Schouten string = getenv("LANG"); 424772fcea8cSEd Schouten if (string != NULL) 424872fcea8cSEd Schouten { 424972fcea8cSEd Schouten if (strcmp(string, "zh_TW.big5") == 0) 425072fcea8cSEd Schouten { 425172fcea8cSEd Schouten ee_chinese = TRUE; 425272fcea8cSEd Schouten eightbit = TRUE; 425372fcea8cSEd Schouten } 425472fcea8cSEd Schouten } 425572fcea8cSEd Schouten } 425672fcea8cSEd Schouten 425772fcea8cSEd Schouten /* 425872fcea8cSEd Schouten | Save current configuration to .init.ee file in the current directory. 425972fcea8cSEd Schouten */ 426072fcea8cSEd Schouten 426172fcea8cSEd Schouten void 426272fcea8cSEd Schouten dump_ee_conf() 426372fcea8cSEd Schouten { 426472fcea8cSEd Schouten FILE *init_file; 426572fcea8cSEd Schouten FILE *old_init_file = NULL; 426672fcea8cSEd Schouten char *file_name = ".init.ee"; 426772fcea8cSEd Schouten char *home_dir = "~/.init.ee"; 426872fcea8cSEd Schouten char buffer[512]; 426972fcea8cSEd Schouten struct stat buf; 427072fcea8cSEd Schouten char *string; 427172fcea8cSEd Schouten int length; 427272fcea8cSEd Schouten int option = 0; 427372fcea8cSEd Schouten 427472fcea8cSEd Schouten if (restrict_mode()) 427572fcea8cSEd Schouten { 427672fcea8cSEd Schouten return; 427772fcea8cSEd Schouten } 427872fcea8cSEd Schouten 427972fcea8cSEd Schouten option = menu_op(config_dump_menu); 428072fcea8cSEd Schouten 428172fcea8cSEd Schouten werase(com_win); 428272fcea8cSEd Schouten wmove(com_win, 0, 0); 428372fcea8cSEd Schouten 428472fcea8cSEd Schouten if (option == 0) 428572fcea8cSEd Schouten { 428672fcea8cSEd Schouten wprintw(com_win, conf_not_saved_msg); 428772fcea8cSEd Schouten wrefresh(com_win); 428872fcea8cSEd Schouten return; 428972fcea8cSEd Schouten } 429072fcea8cSEd Schouten else if (option == 2) 429172fcea8cSEd Schouten file_name = resolve_name(home_dir); 429272fcea8cSEd Schouten 429372fcea8cSEd Schouten /* 429472fcea8cSEd Schouten | If a .init.ee file exists, move it to .init.ee.old. 429572fcea8cSEd Schouten */ 429672fcea8cSEd Schouten 429772fcea8cSEd Schouten if (stat(file_name, &buf) != -1) 429872fcea8cSEd Schouten { 429972fcea8cSEd Schouten sprintf(buffer, "%s.old", file_name); 430072fcea8cSEd Schouten unlink(buffer); 430172fcea8cSEd Schouten link(file_name, buffer); 430272fcea8cSEd Schouten unlink(file_name); 430372fcea8cSEd Schouten old_init_file = fopen(buffer, "r"); 430472fcea8cSEd Schouten } 430572fcea8cSEd Schouten 430672fcea8cSEd Schouten init_file = fopen(file_name, "w"); 430772fcea8cSEd Schouten if (init_file == NULL) 430872fcea8cSEd Schouten { 430972fcea8cSEd Schouten wprintw(com_win, conf_dump_err_msg); 431072fcea8cSEd Schouten wrefresh(com_win); 431172fcea8cSEd Schouten return; 431272fcea8cSEd Schouten } 431372fcea8cSEd Schouten 431472fcea8cSEd Schouten if (old_init_file != NULL) 431572fcea8cSEd Schouten { 431672fcea8cSEd Schouten /* 431772fcea8cSEd Schouten | Copy non-configuration info into new .init.ee file. 431872fcea8cSEd Schouten */ 431972fcea8cSEd Schouten while ((string = fgets(buffer, 512, old_init_file)) != NULL) 432072fcea8cSEd Schouten { 432172fcea8cSEd Schouten length = strlen(string); 432296b676e9SEd Schouten string[length - 1] = '\0'; 432372fcea8cSEd Schouten 432472fcea8cSEd Schouten if (unique_test(string, init_strings) == 1) 432572fcea8cSEd Schouten { 432672fcea8cSEd Schouten if (compare(string, Echo, FALSE)) 432772fcea8cSEd Schouten { 432872fcea8cSEd Schouten fprintf(init_file, "%s\n", string); 432972fcea8cSEd Schouten } 433072fcea8cSEd Schouten } 433172fcea8cSEd Schouten else 433272fcea8cSEd Schouten fprintf(init_file, "%s\n", string); 433372fcea8cSEd Schouten } 433472fcea8cSEd Schouten 433572fcea8cSEd Schouten fclose(old_init_file); 433672fcea8cSEd Schouten } 433772fcea8cSEd Schouten 433872fcea8cSEd Schouten fprintf(init_file, "%s\n", case_sen ? CASE : NOCASE); 433972fcea8cSEd Schouten fprintf(init_file, "%s\n", expand_tabs ? EXPAND : NOEXPAND); 434072fcea8cSEd Schouten fprintf(init_file, "%s\n", info_window ? INFO : NOINFO ); 434172fcea8cSEd Schouten fprintf(init_file, "%s\n", observ_margins ? MARGINS : NOMARGINS ); 434272fcea8cSEd Schouten fprintf(init_file, "%s\n", auto_format ? AUTOFORMAT : NOAUTOFORMAT ); 434372fcea8cSEd Schouten fprintf(init_file, "%s %s\n", PRINTCOMMAND, print_command); 434472fcea8cSEd Schouten fprintf(init_file, "%s %d\n", RIGHTMARGIN, right_margin); 434572fcea8cSEd Schouten fprintf(init_file, "%s\n", nohighlight ? NOHIGHLIGHT : HIGHLIGHT ); 434672fcea8cSEd Schouten fprintf(init_file, "%s\n", eightbit ? EIGHTBIT : NOEIGHTBIT ); 434772fcea8cSEd Schouten fprintf(init_file, "%s\n", emacs_keys_mode ? EMACS_string : NOEMACS_string ); 434872fcea8cSEd Schouten fprintf(init_file, "%s\n", ee_chinese ? chinese_cmd : nochinese_cmd ); 434972fcea8cSEd Schouten 435072fcea8cSEd Schouten fclose(init_file); 435172fcea8cSEd Schouten 435272fcea8cSEd Schouten wprintw(com_win, conf_dump_success_msg, file_name); 435372fcea8cSEd Schouten wrefresh(com_win); 435472fcea8cSEd Schouten 435572fcea8cSEd Schouten if ((option == 2) && (file_name != home_dir)) 435672fcea8cSEd Schouten { 435772fcea8cSEd Schouten free(file_name); 435872fcea8cSEd Schouten } 435972fcea8cSEd Schouten } 436072fcea8cSEd Schouten 436172fcea8cSEd Schouten void 436272fcea8cSEd Schouten echo_string(string) /* echo the given string */ 436372fcea8cSEd Schouten char *string; 436472fcea8cSEd Schouten { 436572fcea8cSEd Schouten char *temp; 436672fcea8cSEd Schouten int Counter; 436772fcea8cSEd Schouten 436872fcea8cSEd Schouten temp = string; 436996b676e9SEd Schouten while (*temp != '\0') 437072fcea8cSEd Schouten { 437172fcea8cSEd Schouten if (*temp == '\\') 437272fcea8cSEd Schouten { 437372fcea8cSEd Schouten temp++; 437472fcea8cSEd Schouten if (*temp == 'n') 437572fcea8cSEd Schouten putchar('\n'); 437672fcea8cSEd Schouten else if (*temp == 't') 437772fcea8cSEd Schouten putchar('\t'); 437872fcea8cSEd Schouten else if (*temp == 'b') 437972fcea8cSEd Schouten putchar('\b'); 438072fcea8cSEd Schouten else if (*temp == 'r') 438172fcea8cSEd Schouten putchar('\r'); 438272fcea8cSEd Schouten else if (*temp == 'f') 438372fcea8cSEd Schouten putchar('\f'); 438472fcea8cSEd Schouten else if ((*temp == 'e') || (*temp == 'E')) 438572fcea8cSEd Schouten putchar('\033'); /* escape */ 438672fcea8cSEd Schouten else if (*temp == '\\') 438772fcea8cSEd Schouten putchar('\\'); 438872fcea8cSEd Schouten else if (*temp == '\'') 438972fcea8cSEd Schouten putchar('\''); 439072fcea8cSEd Schouten else if ((*temp >= '0') && (*temp <= '9')) 439172fcea8cSEd Schouten { 439272fcea8cSEd Schouten Counter = 0; 439372fcea8cSEd Schouten while ((*temp >= '0') && (*temp <= '9')) 439472fcea8cSEd Schouten { 439572fcea8cSEd Schouten Counter = (8 * Counter) + (*temp - '0'); 439672fcea8cSEd Schouten temp++; 439772fcea8cSEd Schouten } 439872fcea8cSEd Schouten putchar(Counter); 439972fcea8cSEd Schouten temp--; 440072fcea8cSEd Schouten } 440172fcea8cSEd Schouten temp++; 440272fcea8cSEd Schouten } 440372fcea8cSEd Schouten else 440472fcea8cSEd Schouten { 440572fcea8cSEd Schouten putchar(*temp); 440672fcea8cSEd Schouten temp++; 440772fcea8cSEd Schouten } 440872fcea8cSEd Schouten } 440972fcea8cSEd Schouten 441072fcea8cSEd Schouten fflush(stdout); 441172fcea8cSEd Schouten } 441272fcea8cSEd Schouten 441372fcea8cSEd Schouten void 441472fcea8cSEd Schouten spell_op() /* check spelling of words in the editor */ 441572fcea8cSEd Schouten { 441672fcea8cSEd Schouten if (restrict_mode()) 441772fcea8cSEd Schouten { 441872fcea8cSEd Schouten return; 441972fcea8cSEd Schouten } 442072fcea8cSEd Schouten top(); /* go to top of file */ 442172fcea8cSEd Schouten insert_line(FALSE); /* create two blank lines */ 442272fcea8cSEd Schouten insert_line(FALSE); 442372fcea8cSEd Schouten top(); 442472fcea8cSEd Schouten command(shell_echo_msg); 442572fcea8cSEd Schouten adv_line(); 442672fcea8cSEd Schouten wmove(com_win, 0, 0); 442772fcea8cSEd Schouten wprintw(com_win, spell_in_prog_msg); 442872fcea8cSEd Schouten wrefresh(com_win); 442972fcea8cSEd Schouten command("<>!spell"); /* send contents of buffer to command 'spell' 443072fcea8cSEd Schouten and read the results back into the editor */ 443172fcea8cSEd Schouten } 443272fcea8cSEd Schouten 443372fcea8cSEd Schouten void 443472fcea8cSEd Schouten ispell_op() 443572fcea8cSEd Schouten { 4436cfe04e82SEd Schouten char template[128], *name; 443772fcea8cSEd Schouten char string[256]; 4438cfe04e82SEd Schouten int fd; 443972fcea8cSEd Schouten 444072fcea8cSEd Schouten if (restrict_mode()) 444172fcea8cSEd Schouten { 444272fcea8cSEd Schouten return; 444372fcea8cSEd Schouten } 4444cfe04e82SEd Schouten (void)sprintf(template, "/tmp/ee.XXXXXXXX"); 444596b676e9SEd Schouten fd = mkstemp(template); 4446cfe04e82SEd Schouten if (fd < 0) { 4447cfe04e82SEd Schouten wmove(com_win, 0, 0); 4448cfe04e82SEd Schouten wprintw(com_win, create_file_fail_msg, name); 4449cfe04e82SEd Schouten wrefresh(com_win); 4450cfe04e82SEd Schouten return; 4451cfe04e82SEd Schouten } 4452cfe04e82SEd Schouten close(fd); 4453cfe04e82SEd Schouten if (write_file(name, 0)) 445472fcea8cSEd Schouten { 445572fcea8cSEd Schouten sprintf(string, "ispell %s", name); 445672fcea8cSEd Schouten sh_command(string); 445772fcea8cSEd Schouten delete_text(); 445872fcea8cSEd Schouten tmp_file = name; 445972fcea8cSEd Schouten recv_file = TRUE; 446072fcea8cSEd Schouten check_fp(); 446172fcea8cSEd Schouten unlink(name); 446272fcea8cSEd Schouten } 446372fcea8cSEd Schouten } 446472fcea8cSEd Schouten 446572fcea8cSEd Schouten int 446672fcea8cSEd Schouten first_word_len(test_line) 446772fcea8cSEd Schouten struct text *test_line; 446872fcea8cSEd Schouten { 446972fcea8cSEd Schouten int counter; 447072fcea8cSEd Schouten unsigned char *pnt; 447172fcea8cSEd Schouten 447272fcea8cSEd Schouten if (test_line == NULL) 447372fcea8cSEd Schouten return(0); 447472fcea8cSEd Schouten 447572fcea8cSEd Schouten pnt = test_line->line; 447696b676e9SEd Schouten if ((pnt == NULL) || (*pnt == '\0') || 447772fcea8cSEd Schouten (*pnt == '.') || (*pnt == '>')) 447872fcea8cSEd Schouten return(0); 447972fcea8cSEd Schouten 448072fcea8cSEd Schouten if ((*pnt == ' ') || (*pnt == '\t')) 448172fcea8cSEd Schouten { 448272fcea8cSEd Schouten pnt = next_word(pnt); 448372fcea8cSEd Schouten } 448472fcea8cSEd Schouten 448596b676e9SEd Schouten if (*pnt == '\0') 448672fcea8cSEd Schouten return(0); 448772fcea8cSEd Schouten 448872fcea8cSEd Schouten counter = 0; 448996b676e9SEd Schouten while ((*pnt != '\0') && ((*pnt != ' ') && (*pnt != '\t'))) 449072fcea8cSEd Schouten { 449172fcea8cSEd Schouten pnt++; 449272fcea8cSEd Schouten counter++; 449372fcea8cSEd Schouten } 449496b676e9SEd Schouten while ((*pnt != '\0') && ((*pnt == ' ') || (*pnt == '\t'))) 449572fcea8cSEd Schouten { 449672fcea8cSEd Schouten pnt++; 449772fcea8cSEd Schouten counter++; 449872fcea8cSEd Schouten } 449972fcea8cSEd Schouten return(counter); 450072fcea8cSEd Schouten } 450172fcea8cSEd Schouten 450272fcea8cSEd Schouten void 450372fcea8cSEd Schouten Auto_Format() /* format the paragraph according to set margins */ 450472fcea8cSEd Schouten { 450572fcea8cSEd Schouten int string_count; 450672fcea8cSEd Schouten int offset; 450772fcea8cSEd Schouten int temp_case; 450872fcea8cSEd Schouten int word_len; 450972fcea8cSEd Schouten int temp_dwl; 451072fcea8cSEd Schouten int tmp_d_line_length; 451172fcea8cSEd Schouten int leave_loop = FALSE; 451272fcea8cSEd Schouten int status; 451372fcea8cSEd Schouten int counter; 451472fcea8cSEd Schouten char not_blank; 451572fcea8cSEd Schouten unsigned char *line; 451672fcea8cSEd Schouten unsigned char *tmp_srchstr; 451772fcea8cSEd Schouten unsigned char *temp1, *temp2; 451872fcea8cSEd Schouten unsigned char *temp_dword; 451972fcea8cSEd Schouten unsigned char temp_d_char[3]; 452072fcea8cSEd Schouten unsigned char *tmp_d_line; 452172fcea8cSEd Schouten 452272fcea8cSEd Schouten 452372fcea8cSEd Schouten temp_d_char[0] = d_char[0]; 452472fcea8cSEd Schouten temp_d_char[1] = d_char[1]; 452572fcea8cSEd Schouten temp_d_char[2] = d_char[2]; 452672fcea8cSEd Schouten 452772fcea8cSEd Schouten /* 452872fcea8cSEd Schouten | if observ_margins is not set, or the current line is blank, 452972fcea8cSEd Schouten | do not format the current paragraph 453072fcea8cSEd Schouten */ 453172fcea8cSEd Schouten 453272fcea8cSEd Schouten if ((!observ_margins) || (Blank_Line(curr_line))) 453372fcea8cSEd Schouten return; 453472fcea8cSEd Schouten 453572fcea8cSEd Schouten /* 453672fcea8cSEd Schouten | get current position in paragraph, so after formatting, the cursor 453772fcea8cSEd Schouten | will be in the same relative position 453872fcea8cSEd Schouten */ 453972fcea8cSEd Schouten 454072fcea8cSEd Schouten tmp_d_line = d_line; 454172fcea8cSEd Schouten tmp_d_line_length = dlt_line->line_length; 454272fcea8cSEd Schouten d_line = NULL; 454372fcea8cSEd Schouten auto_format = FALSE; 454472fcea8cSEd Schouten offset = position; 454596b676e9SEd Schouten if ((position != 1) && ((*point == ' ') || (*point == '\t') || (position == curr_line->line_length) || (*point == '\0'))) 454672fcea8cSEd Schouten prev_word(); 454772fcea8cSEd Schouten temp_dword = d_word; 454872fcea8cSEd Schouten temp_dwl = d_wrd_len; 454972fcea8cSEd Schouten d_wrd_len = 0; 455072fcea8cSEd Schouten d_word = NULL; 455172fcea8cSEd Schouten temp_case = case_sen; 455272fcea8cSEd Schouten case_sen = TRUE; 455372fcea8cSEd Schouten tmp_srchstr = srch_str; 455472fcea8cSEd Schouten temp2 = srch_str = (unsigned char *) malloc(1 + curr_line->line_length - position); 455572fcea8cSEd Schouten if ((*point == ' ') || (*point == '\t')) 455672fcea8cSEd Schouten adv_word(); 455772fcea8cSEd Schouten offset -= position; 455872fcea8cSEd Schouten counter = position; 455972fcea8cSEd Schouten line = temp1 = point; 456096b676e9SEd Schouten while ((*temp1 != '\0') && (*temp1 != ' ') && (*temp1 != '\t') && (counter < curr_line->line_length)) 456172fcea8cSEd Schouten { 456272fcea8cSEd Schouten *temp2 = *temp1; 456372fcea8cSEd Schouten temp2++; 456472fcea8cSEd Schouten temp1++; 456572fcea8cSEd Schouten counter++; 456672fcea8cSEd Schouten } 456796b676e9SEd Schouten *temp2 = '\0'; 456872fcea8cSEd Schouten if (position != 1) 456972fcea8cSEd Schouten bol(); 457072fcea8cSEd Schouten while (!Blank_Line(curr_line->prev_line)) 457172fcea8cSEd Schouten bol(); 457272fcea8cSEd Schouten string_count = 0; 457372fcea8cSEd Schouten status = TRUE; 457472fcea8cSEd Schouten while ((line != point) && (status)) 457572fcea8cSEd Schouten { 457672fcea8cSEd Schouten status = search(FALSE); 457772fcea8cSEd Schouten string_count++; 457872fcea8cSEd Schouten } 457972fcea8cSEd Schouten 458072fcea8cSEd Schouten /* 458172fcea8cSEd Schouten | now get back to the start of the paragraph to start checking 458272fcea8cSEd Schouten */ 458372fcea8cSEd Schouten 458472fcea8cSEd Schouten if (position != 1) 458572fcea8cSEd Schouten bol(); 458672fcea8cSEd Schouten while (!Blank_Line(curr_line->prev_line)) 458772fcea8cSEd Schouten bol(); 458872fcea8cSEd Schouten 458972fcea8cSEd Schouten /* 459072fcea8cSEd Schouten | Start going through lines, putting spaces at end of lines if they do 459172fcea8cSEd Schouten | not already exist. Check line length, and move words to the next line 459272fcea8cSEd Schouten | if they cross the margin. Then get words from the next line if they 459372fcea8cSEd Schouten | will fit in before the margin. 459472fcea8cSEd Schouten */ 459572fcea8cSEd Schouten 459672fcea8cSEd Schouten counter = 0; 459772fcea8cSEd Schouten 459872fcea8cSEd Schouten while (!leave_loop) 459972fcea8cSEd Schouten { 460072fcea8cSEd Schouten if (position != curr_line->line_length) 460172fcea8cSEd Schouten eol(); 460272fcea8cSEd Schouten left(TRUE); 460372fcea8cSEd Schouten if (*point != ' ') 460472fcea8cSEd Schouten { 460572fcea8cSEd Schouten right(TRUE); 460672fcea8cSEd Schouten insert(' '); 460772fcea8cSEd Schouten } 460872fcea8cSEd Schouten else 460972fcea8cSEd Schouten right(TRUE); 461072fcea8cSEd Schouten 461172fcea8cSEd Schouten not_blank = FALSE; 461272fcea8cSEd Schouten 461372fcea8cSEd Schouten /* 461472fcea8cSEd Schouten | fill line if first word on next line will fit 461572fcea8cSEd Schouten | in the line without crossing the margin 461672fcea8cSEd Schouten */ 461772fcea8cSEd Schouten 461872fcea8cSEd Schouten while ((curr_line->next_line != NULL) && 461972fcea8cSEd Schouten ((word_len = first_word_len(curr_line->next_line)) > 0) 462072fcea8cSEd Schouten && ((scr_pos + word_len) < right_margin)) 462172fcea8cSEd Schouten { 462272fcea8cSEd Schouten adv_line(); 462372fcea8cSEd Schouten if ((*point == ' ') || (*point == '\t')) 462472fcea8cSEd Schouten adv_word(); 462572fcea8cSEd Schouten del_word(); 462672fcea8cSEd Schouten if (position != 1) 462772fcea8cSEd Schouten bol(); 462872fcea8cSEd Schouten 462972fcea8cSEd Schouten /* 463072fcea8cSEd Schouten | We know this line was not blank before, so 463172fcea8cSEd Schouten | make sure that it doesn't have one of the 463272fcea8cSEd Schouten | leading characters that indicate the line 463372fcea8cSEd Schouten | should not be modified. 463472fcea8cSEd Schouten | 463572fcea8cSEd Schouten | We also know that this character should not 463672fcea8cSEd Schouten | be left as the first character of this line. 463772fcea8cSEd Schouten */ 463872fcea8cSEd Schouten 463972fcea8cSEd Schouten if ((Blank_Line(curr_line)) && 464072fcea8cSEd Schouten (curr_line->line[0] != '.') && 464172fcea8cSEd Schouten (curr_line->line[0] != '>')) 464272fcea8cSEd Schouten { 464372fcea8cSEd Schouten del_line(); 464472fcea8cSEd Schouten not_blank = FALSE; 464572fcea8cSEd Schouten } 464672fcea8cSEd Schouten else 464772fcea8cSEd Schouten not_blank = TRUE; 464872fcea8cSEd Schouten 464972fcea8cSEd Schouten /* 465072fcea8cSEd Schouten | go to end of previous line 465172fcea8cSEd Schouten */ 465272fcea8cSEd Schouten left(TRUE); 465372fcea8cSEd Schouten undel_word(); 465472fcea8cSEd Schouten eol(); 465572fcea8cSEd Schouten /* 465672fcea8cSEd Schouten | make sure there's a space at the end of the line 465772fcea8cSEd Schouten */ 465872fcea8cSEd Schouten left(TRUE); 465972fcea8cSEd Schouten if (*point != ' ') 466072fcea8cSEd Schouten { 466172fcea8cSEd Schouten right(TRUE); 466272fcea8cSEd Schouten insert(' '); 466372fcea8cSEd Schouten } 466472fcea8cSEd Schouten else 466572fcea8cSEd Schouten right(TRUE); 466672fcea8cSEd Schouten } 466772fcea8cSEd Schouten 466872fcea8cSEd Schouten /* 466972fcea8cSEd Schouten | make sure line does not cross right margin 467072fcea8cSEd Schouten */ 467172fcea8cSEd Schouten 467272fcea8cSEd Schouten while (right_margin <= scr_pos) 467372fcea8cSEd Schouten { 467472fcea8cSEd Schouten prev_word(); 467572fcea8cSEd Schouten if (position != 1) 467672fcea8cSEd Schouten { 467772fcea8cSEd Schouten del_word(); 467872fcea8cSEd Schouten if (Blank_Line(curr_line->next_line)) 467972fcea8cSEd Schouten insert_line(TRUE); 468072fcea8cSEd Schouten else 468172fcea8cSEd Schouten adv_line(); 468272fcea8cSEd Schouten if ((*point == ' ') || (*point == '\t')) 468372fcea8cSEd Schouten adv_word(); 468472fcea8cSEd Schouten undel_word(); 468572fcea8cSEd Schouten not_blank = TRUE; 468672fcea8cSEd Schouten if (position != 1) 468772fcea8cSEd Schouten bol(); 468872fcea8cSEd Schouten left(TRUE); 468972fcea8cSEd Schouten } 469072fcea8cSEd Schouten } 469172fcea8cSEd Schouten 469272fcea8cSEd Schouten if ((!Blank_Line(curr_line->next_line)) || (not_blank)) 469372fcea8cSEd Schouten { 469472fcea8cSEd Schouten adv_line(); 469572fcea8cSEd Schouten counter++; 469672fcea8cSEd Schouten } 469772fcea8cSEd Schouten else 469872fcea8cSEd Schouten leave_loop = TRUE; 469972fcea8cSEd Schouten } 470072fcea8cSEd Schouten 470172fcea8cSEd Schouten /* 470272fcea8cSEd Schouten | go back to begin of paragraph, put cursor back to original position 470372fcea8cSEd Schouten */ 470472fcea8cSEd Schouten 470572fcea8cSEd Schouten if (position != 1) 470672fcea8cSEd Schouten bol(); 470772fcea8cSEd Schouten while ((counter-- > 0) || (!Blank_Line(curr_line->prev_line))) 470872fcea8cSEd Schouten bol(); 470972fcea8cSEd Schouten 471072fcea8cSEd Schouten /* 471172fcea8cSEd Schouten | find word cursor was in 471272fcea8cSEd Schouten */ 471372fcea8cSEd Schouten 471472fcea8cSEd Schouten status = TRUE; 471572fcea8cSEd Schouten while ((status) && (string_count > 0)) 471672fcea8cSEd Schouten { 471772fcea8cSEd Schouten status = search(FALSE); 471872fcea8cSEd Schouten string_count--; 471972fcea8cSEd Schouten } 472072fcea8cSEd Schouten 472172fcea8cSEd Schouten /* 472272fcea8cSEd Schouten | offset the cursor to where it was before from the start of the word 472372fcea8cSEd Schouten */ 472472fcea8cSEd Schouten 472572fcea8cSEd Schouten while (offset > 0) 472672fcea8cSEd Schouten { 472772fcea8cSEd Schouten offset--; 472872fcea8cSEd Schouten right(TRUE); 472972fcea8cSEd Schouten } 473072fcea8cSEd Schouten 473172fcea8cSEd Schouten if ((string_count > 0) && (offset < 0)) 473272fcea8cSEd Schouten { 473372fcea8cSEd Schouten while (offset < 0) 473472fcea8cSEd Schouten { 473572fcea8cSEd Schouten offset++; 473672fcea8cSEd Schouten left(TRUE); 473772fcea8cSEd Schouten } 473872fcea8cSEd Schouten } 473972fcea8cSEd Schouten 474072fcea8cSEd Schouten /* 474172fcea8cSEd Schouten | reset flags and strings to what they were before formatting 474272fcea8cSEd Schouten */ 474372fcea8cSEd Schouten 474472fcea8cSEd Schouten if (d_word != NULL) 474572fcea8cSEd Schouten free(d_word); 474672fcea8cSEd Schouten d_word = temp_dword; 474772fcea8cSEd Schouten d_wrd_len = temp_dwl; 474872fcea8cSEd Schouten case_sen = temp_case; 474972fcea8cSEd Schouten free(srch_str); 475072fcea8cSEd Schouten srch_str = tmp_srchstr; 475172fcea8cSEd Schouten d_char[0] = temp_d_char[0]; 475272fcea8cSEd Schouten d_char[1] = temp_d_char[1]; 475372fcea8cSEd Schouten d_char[2] = temp_d_char[2]; 475472fcea8cSEd Schouten auto_format = TRUE; 475572fcea8cSEd Schouten dlt_line->line_length = tmp_d_line_length; 475672fcea8cSEd Schouten d_line = tmp_d_line; 475772fcea8cSEd Schouten 475872fcea8cSEd Schouten formatted = TRUE; 475972fcea8cSEd Schouten midscreen(scr_vert, point); 476072fcea8cSEd Schouten } 476172fcea8cSEd Schouten 476272fcea8cSEd Schouten void 476372fcea8cSEd Schouten modes_op() 476472fcea8cSEd Schouten { 476572fcea8cSEd Schouten int ret_value; 476672fcea8cSEd Schouten int counter; 476772fcea8cSEd Schouten char *string; 476872fcea8cSEd Schouten 476972fcea8cSEd Schouten do 477072fcea8cSEd Schouten { 477172fcea8cSEd Schouten sprintf(modes_menu[1].item_string, "%s %s", mode_strings[1], 477272fcea8cSEd Schouten (expand_tabs ? ON : OFF)); 477372fcea8cSEd Schouten sprintf(modes_menu[2].item_string, "%s %s", mode_strings[2], 477472fcea8cSEd Schouten (case_sen ? ON : OFF)); 477572fcea8cSEd Schouten sprintf(modes_menu[3].item_string, "%s %s", mode_strings[3], 477672fcea8cSEd Schouten (observ_margins ? ON : OFF)); 477772fcea8cSEd Schouten sprintf(modes_menu[4].item_string, "%s %s", mode_strings[4], 477872fcea8cSEd Schouten (auto_format ? ON : OFF)); 477972fcea8cSEd Schouten sprintf(modes_menu[5].item_string, "%s %s", mode_strings[5], 478072fcea8cSEd Schouten (eightbit ? ON : OFF)); 478172fcea8cSEd Schouten sprintf(modes_menu[6].item_string, "%s %s", mode_strings[6], 478272fcea8cSEd Schouten (info_window ? ON : OFF)); 478372fcea8cSEd Schouten sprintf(modes_menu[7].item_string, "%s %s", mode_strings[7], 478472fcea8cSEd Schouten (emacs_keys_mode ? ON : OFF)); 478572fcea8cSEd Schouten sprintf(modes_menu[8].item_string, "%s %d", mode_strings[8], 478672fcea8cSEd Schouten right_margin); 478772fcea8cSEd Schouten sprintf(modes_menu[9].item_string, "%s %s", mode_strings[9], 478872fcea8cSEd Schouten (ee_chinese ? ON : OFF)); 478972fcea8cSEd Schouten 479072fcea8cSEd Schouten ret_value = menu_op(modes_menu); 479172fcea8cSEd Schouten 479272fcea8cSEd Schouten switch (ret_value) 479372fcea8cSEd Schouten { 479472fcea8cSEd Schouten case 1: 479572fcea8cSEd Schouten expand_tabs = !expand_tabs; 479672fcea8cSEd Schouten break; 479772fcea8cSEd Schouten case 2: 479872fcea8cSEd Schouten case_sen = !case_sen; 479972fcea8cSEd Schouten break; 480072fcea8cSEd Schouten case 3: 480172fcea8cSEd Schouten observ_margins = !observ_margins; 480272fcea8cSEd Schouten break; 480372fcea8cSEd Schouten case 4: 480472fcea8cSEd Schouten auto_format = !auto_format; 480572fcea8cSEd Schouten if (auto_format) 480672fcea8cSEd Schouten observ_margins = TRUE; 480772fcea8cSEd Schouten break; 480872fcea8cSEd Schouten case 5: 480972fcea8cSEd Schouten eightbit = !eightbit; 481072fcea8cSEd Schouten if (!eightbit) 481172fcea8cSEd Schouten ee_chinese = FALSE; 481272fcea8cSEd Schouten #ifdef NCURSE 481372fcea8cSEd Schouten if (ee_chinese) 481472fcea8cSEd Schouten nc_setattrib(A_NC_BIG5); 481572fcea8cSEd Schouten else 481672fcea8cSEd Schouten nc_clearattrib(A_NC_BIG5); 481772fcea8cSEd Schouten #endif /* NCURSE */ 481872fcea8cSEd Schouten 481972fcea8cSEd Schouten redraw(); 482072fcea8cSEd Schouten wnoutrefresh(text_win); 482172fcea8cSEd Schouten break; 482272fcea8cSEd Schouten case 6: 482372fcea8cSEd Schouten if (info_window) 482472fcea8cSEd Schouten no_info_window(); 482572fcea8cSEd Schouten else 482672fcea8cSEd Schouten create_info_window(); 482772fcea8cSEd Schouten break; 482872fcea8cSEd Schouten case 7: 482972fcea8cSEd Schouten emacs_keys_mode = !emacs_keys_mode; 483072fcea8cSEd Schouten if (info_window) 483172fcea8cSEd Schouten paint_info_win(); 483272fcea8cSEd Schouten break; 483372fcea8cSEd Schouten case 8: 483472fcea8cSEd Schouten string = get_string(margin_prompt, TRUE); 483572fcea8cSEd Schouten if (string != NULL) 483672fcea8cSEd Schouten { 483772fcea8cSEd Schouten counter = atoi(string); 483872fcea8cSEd Schouten if (counter > 0) 483972fcea8cSEd Schouten right_margin = counter; 484072fcea8cSEd Schouten free(string); 484172fcea8cSEd Schouten } 484272fcea8cSEd Schouten break; 484372fcea8cSEd Schouten case 9: 484472fcea8cSEd Schouten ee_chinese = !ee_chinese; 484572fcea8cSEd Schouten if (ee_chinese != FALSE) 484672fcea8cSEd Schouten eightbit = TRUE; 484772fcea8cSEd Schouten #ifdef NCURSE 484872fcea8cSEd Schouten if (ee_chinese) 484972fcea8cSEd Schouten nc_setattrib(A_NC_BIG5); 485072fcea8cSEd Schouten else 485172fcea8cSEd Schouten nc_clearattrib(A_NC_BIG5); 485272fcea8cSEd Schouten #endif /* NCURSE */ 485372fcea8cSEd Schouten redraw(); 485472fcea8cSEd Schouten break; 485572fcea8cSEd Schouten default: 485672fcea8cSEd Schouten break; 485772fcea8cSEd Schouten } 485872fcea8cSEd Schouten } 485972fcea8cSEd Schouten while (ret_value != 0); 486072fcea8cSEd Schouten } 486172fcea8cSEd Schouten 486272fcea8cSEd Schouten char * 486372fcea8cSEd Schouten is_in_string(string, substring) /* a strchr() look-alike for systems without 486472fcea8cSEd Schouten strchr() */ 486572fcea8cSEd Schouten char * string, *substring; 486672fcea8cSEd Schouten { 486772fcea8cSEd Schouten char *full, *sub; 486872fcea8cSEd Schouten 486996b676e9SEd Schouten for (sub = substring; (sub != NULL) && (*sub != '\0'); sub++) 487072fcea8cSEd Schouten { 487196b676e9SEd Schouten for (full = string; (full != NULL) && (*full != '\0'); 487272fcea8cSEd Schouten full++) 487372fcea8cSEd Schouten { 487472fcea8cSEd Schouten if (*sub == *full) 487572fcea8cSEd Schouten return(full); 487672fcea8cSEd Schouten } 487772fcea8cSEd Schouten } 487872fcea8cSEd Schouten return(NULL); 487972fcea8cSEd Schouten } 488072fcea8cSEd Schouten 488172fcea8cSEd Schouten /* 488272fcea8cSEd Schouten | handle names of the form "~/file", "~user/file", 488372fcea8cSEd Schouten | "$HOME/foo", "~/$FOO", etc. 488472fcea8cSEd Schouten */ 488572fcea8cSEd Schouten 488672fcea8cSEd Schouten char * 488772fcea8cSEd Schouten resolve_name(name) 488872fcea8cSEd Schouten char *name; 488972fcea8cSEd Schouten { 489072fcea8cSEd Schouten char long_buffer[1024]; 489172fcea8cSEd Schouten char short_buffer[128]; 489272fcea8cSEd Schouten char *buffer; 489372fcea8cSEd Schouten char *slash; 489472fcea8cSEd Schouten char *tmp; 489572fcea8cSEd Schouten char *start_of_var; 489672fcea8cSEd Schouten int offset; 489772fcea8cSEd Schouten int index; 489872fcea8cSEd Schouten int counter; 489972fcea8cSEd Schouten struct passwd *user; 490072fcea8cSEd Schouten 490172fcea8cSEd Schouten if (name[0] == '~') 490272fcea8cSEd Schouten { 490372fcea8cSEd Schouten if (name[1] == '/') 490472fcea8cSEd Schouten { 490572fcea8cSEd Schouten index = getuid(); 490672fcea8cSEd Schouten user = (struct passwd *) getpwuid(index); 490772fcea8cSEd Schouten slash = name + 1; 490872fcea8cSEd Schouten } 490972fcea8cSEd Schouten else 491072fcea8cSEd Schouten { 491172fcea8cSEd Schouten slash = strchr(name, '/'); 491272fcea8cSEd Schouten if (slash == NULL) 491372fcea8cSEd Schouten return(name); 491496b676e9SEd Schouten *slash = '\0'; 491572fcea8cSEd Schouten user = (struct passwd *) getpwnam((name + 1)); 491672fcea8cSEd Schouten *slash = '/'; 491772fcea8cSEd Schouten } 491872fcea8cSEd Schouten if (user == NULL) 491972fcea8cSEd Schouten { 492072fcea8cSEd Schouten return(name); 492172fcea8cSEd Schouten } 492272fcea8cSEd Schouten buffer = malloc(strlen(user->pw_dir) + strlen(slash) + 1); 492372fcea8cSEd Schouten strcpy(buffer, user->pw_dir); 492472fcea8cSEd Schouten strcat(buffer, slash); 492572fcea8cSEd Schouten } 492672fcea8cSEd Schouten else 492772fcea8cSEd Schouten buffer = name; 492872fcea8cSEd Schouten 492972fcea8cSEd Schouten if (is_in_string(buffer, "$")) 493072fcea8cSEd Schouten { 493172fcea8cSEd Schouten tmp = buffer; 493272fcea8cSEd Schouten index = 0; 493372fcea8cSEd Schouten 493496b676e9SEd Schouten while ((*tmp != '\0') && (index < 1024)) 493572fcea8cSEd Schouten { 493672fcea8cSEd Schouten 493796b676e9SEd Schouten while ((*tmp != '\0') && (*tmp != '$') && 493872fcea8cSEd Schouten (index < 1024)) 493972fcea8cSEd Schouten { 494072fcea8cSEd Schouten long_buffer[index] = *tmp; 494172fcea8cSEd Schouten tmp++; 494272fcea8cSEd Schouten index++; 494372fcea8cSEd Schouten } 494472fcea8cSEd Schouten 494572fcea8cSEd Schouten if ((*tmp == '$') && (index < 1024)) 494672fcea8cSEd Schouten { 494772fcea8cSEd Schouten counter = 0; 494872fcea8cSEd Schouten start_of_var = tmp; 494972fcea8cSEd Schouten tmp++; 495072fcea8cSEd Schouten if (*tmp == '{') /* } */ /* bracketed variable name */ 495172fcea8cSEd Schouten { 495272fcea8cSEd Schouten tmp++; /* { */ 495396b676e9SEd Schouten while ((*tmp != '\0') && 495472fcea8cSEd Schouten (*tmp != '}') && 495572fcea8cSEd Schouten (counter < 128)) 495672fcea8cSEd Schouten { 495772fcea8cSEd Schouten short_buffer[counter] = *tmp; 495872fcea8cSEd Schouten counter++; 495972fcea8cSEd Schouten tmp++; 496072fcea8cSEd Schouten } /* { */ 496172fcea8cSEd Schouten if (*tmp == '}') 496272fcea8cSEd Schouten tmp++; 496372fcea8cSEd Schouten } 496472fcea8cSEd Schouten else 496572fcea8cSEd Schouten { 496696b676e9SEd Schouten while ((*tmp != '\0') && 496772fcea8cSEd Schouten (*tmp != '/') && 496872fcea8cSEd Schouten (*tmp != '$') && 496972fcea8cSEd Schouten (counter < 128)) 497072fcea8cSEd Schouten { 497172fcea8cSEd Schouten short_buffer[counter] = *tmp; 497272fcea8cSEd Schouten counter++; 497372fcea8cSEd Schouten tmp++; 497472fcea8cSEd Schouten } 497572fcea8cSEd Schouten } 497696b676e9SEd Schouten short_buffer[counter] = '\0'; 497772fcea8cSEd Schouten if ((slash = getenv(short_buffer)) != NULL) 497872fcea8cSEd Schouten { 497972fcea8cSEd Schouten offset = strlen(slash); 498072fcea8cSEd Schouten if ((offset + index) < 1024) 498172fcea8cSEd Schouten strcpy(&long_buffer[index], slash); 498272fcea8cSEd Schouten index += offset; 498372fcea8cSEd Schouten } 498472fcea8cSEd Schouten else 498572fcea8cSEd Schouten { 498672fcea8cSEd Schouten while ((start_of_var != tmp) && (index < 1024)) 498772fcea8cSEd Schouten { 498872fcea8cSEd Schouten long_buffer[index] = *start_of_var; 498972fcea8cSEd Schouten start_of_var++; 499072fcea8cSEd Schouten index++; 499172fcea8cSEd Schouten } 499272fcea8cSEd Schouten } 499372fcea8cSEd Schouten } 499472fcea8cSEd Schouten } 499572fcea8cSEd Schouten 499672fcea8cSEd Schouten if (index == 1024) 499772fcea8cSEd Schouten return(buffer); 499872fcea8cSEd Schouten else 499996b676e9SEd Schouten long_buffer[index] = '\0'; 500072fcea8cSEd Schouten 500172fcea8cSEd Schouten if (name != buffer) 500272fcea8cSEd Schouten free(buffer); 500372fcea8cSEd Schouten buffer = malloc(index + 1); 500472fcea8cSEd Schouten strcpy(buffer, long_buffer); 500572fcea8cSEd Schouten } 500672fcea8cSEd Schouten 500772fcea8cSEd Schouten return(buffer); 500872fcea8cSEd Schouten } 500972fcea8cSEd Schouten 501072fcea8cSEd Schouten int 501172fcea8cSEd Schouten restrict_mode() 501272fcea8cSEd Schouten { 501372fcea8cSEd Schouten if (!restricted) 501472fcea8cSEd Schouten return(FALSE); 501572fcea8cSEd Schouten 501672fcea8cSEd Schouten wmove(com_win, 0, 0); 501772fcea8cSEd Schouten wprintw(com_win, restricted_msg); 501872fcea8cSEd Schouten wclrtoeol(com_win); 501972fcea8cSEd Schouten wrefresh(com_win); 502072fcea8cSEd Schouten clear_com_win = TRUE; 502172fcea8cSEd Schouten return(TRUE); 502272fcea8cSEd Schouten } 502372fcea8cSEd Schouten 502472fcea8cSEd Schouten /* 502572fcea8cSEd Schouten | The following routine tests the input string against the list of 502672fcea8cSEd Schouten | strings, to determine if the string is a unique match with one of the 502772fcea8cSEd Schouten | valid values. 502872fcea8cSEd Schouten */ 502972fcea8cSEd Schouten 503072fcea8cSEd Schouten int 503172fcea8cSEd Schouten unique_test(string, list) 503272fcea8cSEd Schouten char *string; 503372fcea8cSEd Schouten char *list[]; 503472fcea8cSEd Schouten { 503572fcea8cSEd Schouten int counter; 503672fcea8cSEd Schouten int num_match; 503772fcea8cSEd Schouten int result; 503872fcea8cSEd Schouten 503972fcea8cSEd Schouten num_match = 0; 504072fcea8cSEd Schouten counter = 0; 504172fcea8cSEd Schouten while (list[counter] != NULL) 504272fcea8cSEd Schouten { 504372fcea8cSEd Schouten result = compare(string, list[counter], FALSE); 504472fcea8cSEd Schouten if (result) 504572fcea8cSEd Schouten num_match++; 504672fcea8cSEd Schouten counter++; 504772fcea8cSEd Schouten } 504872fcea8cSEd Schouten return(num_match); 504972fcea8cSEd Schouten } 505072fcea8cSEd Schouten 505172fcea8cSEd Schouten #ifndef NO_CATGETS 505272fcea8cSEd Schouten /* 505372fcea8cSEd Schouten | Get the catalog entry, and if it got it from the catalog, 505472fcea8cSEd Schouten | make a copy, since the buffer will be overwritten by the 505572fcea8cSEd Schouten | next call to catgets(). 505672fcea8cSEd Schouten */ 505772fcea8cSEd Schouten 505872fcea8cSEd Schouten char * 505972fcea8cSEd Schouten catgetlocal(number, string) 506072fcea8cSEd Schouten int number; 506172fcea8cSEd Schouten char *string; 506272fcea8cSEd Schouten { 506372fcea8cSEd Schouten char *temp1; 506472fcea8cSEd Schouten char *temp2; 506572fcea8cSEd Schouten 506672fcea8cSEd Schouten temp1 = catgets(catalog, 1, number, string); 506772fcea8cSEd Schouten if (temp1 != string) 506872fcea8cSEd Schouten { 506972fcea8cSEd Schouten temp2 = malloc(strlen(temp1) + 1); 507072fcea8cSEd Schouten strcpy(temp2, temp1); 507172fcea8cSEd Schouten temp1 = temp2; 507272fcea8cSEd Schouten } 507372fcea8cSEd Schouten return(temp1); 507472fcea8cSEd Schouten } 507572fcea8cSEd Schouten #endif /* NO_CATGETS */ 507672fcea8cSEd Schouten 507772fcea8cSEd Schouten /* 507872fcea8cSEd Schouten | The following is to allow for using message catalogs which allow 507972fcea8cSEd Schouten | the software to be 'localized', that is, to use different languages 508072fcea8cSEd Schouten | all with the same binary. For more information, see your system 508172fcea8cSEd Schouten | documentation, or the X/Open Internationalization Guide. 508272fcea8cSEd Schouten */ 508372fcea8cSEd Schouten 508472fcea8cSEd Schouten void 508572fcea8cSEd Schouten strings_init() 508672fcea8cSEd Schouten { 508772fcea8cSEd Schouten int counter; 508872fcea8cSEd Schouten 508972fcea8cSEd Schouten setlocale(LC_ALL, ""); 5090f39e07f3SAndrey A. Chernov #ifndef NO_CATGETS 5091cfe04e82SEd Schouten catalog = catopen("ee", NL_CAT_LOCALE); 509272fcea8cSEd Schouten #endif /* NO_CATGETS */ 509372fcea8cSEd Schouten 509472fcea8cSEd Schouten modes_menu[0].item_string = catgetlocal( 1, "modes menu"); 509572fcea8cSEd Schouten mode_strings[1] = catgetlocal( 2, "tabs to spaces "); 509672fcea8cSEd Schouten mode_strings[2] = catgetlocal( 3, "case sensitive search"); 509772fcea8cSEd Schouten mode_strings[3] = catgetlocal( 4, "margins observed "); 509872fcea8cSEd Schouten mode_strings[4] = catgetlocal( 5, "auto-paragraph format"); 509972fcea8cSEd Schouten mode_strings[5] = catgetlocal( 6, "eightbit characters "); 510072fcea8cSEd Schouten mode_strings[6] = catgetlocal( 7, "info window "); 510172fcea8cSEd Schouten mode_strings[8] = catgetlocal( 8, "right margin "); 510272fcea8cSEd Schouten leave_menu[0].item_string = catgetlocal( 9, "leave menu"); 510372fcea8cSEd Schouten leave_menu[1].item_string = catgetlocal( 10, "save changes"); 510472fcea8cSEd Schouten leave_menu[2].item_string = catgetlocal( 11, "no save"); 510572fcea8cSEd Schouten file_menu[0].item_string = catgetlocal( 12, "file menu"); 510672fcea8cSEd Schouten file_menu[1].item_string = catgetlocal( 13, "read a file"); 510772fcea8cSEd Schouten file_menu[2].item_string = catgetlocal( 14, "write a file"); 510872fcea8cSEd Schouten file_menu[3].item_string = catgetlocal( 15, "save file"); 510972fcea8cSEd Schouten file_menu[4].item_string = catgetlocal( 16, "print editor contents"); 511072fcea8cSEd Schouten search_menu[0].item_string = catgetlocal( 17, "search menu"); 511172fcea8cSEd Schouten search_menu[1].item_string = catgetlocal( 18, "search for ..."); 511272fcea8cSEd Schouten search_menu[2].item_string = catgetlocal( 19, "search"); 511372fcea8cSEd Schouten spell_menu[0].item_string = catgetlocal( 20, "spell menu"); 511472fcea8cSEd Schouten spell_menu[1].item_string = catgetlocal( 21, "use 'spell'"); 511572fcea8cSEd Schouten spell_menu[2].item_string = catgetlocal( 22, "use 'ispell'"); 511672fcea8cSEd Schouten misc_menu[0].item_string = catgetlocal( 23, "miscellaneous menu"); 511772fcea8cSEd Schouten misc_menu[1].item_string = catgetlocal( 24, "format paragraph"); 511872fcea8cSEd Schouten misc_menu[2].item_string = catgetlocal( 25, "shell command"); 511972fcea8cSEd Schouten misc_menu[3].item_string = catgetlocal( 26, "check spelling"); 512072fcea8cSEd Schouten main_menu[0].item_string = catgetlocal( 27, "main menu"); 512172fcea8cSEd Schouten main_menu[1].item_string = catgetlocal( 28, "leave editor"); 512272fcea8cSEd Schouten main_menu[2].item_string = catgetlocal( 29, "help"); 512372fcea8cSEd Schouten main_menu[3].item_string = catgetlocal( 30, "file operations"); 512472fcea8cSEd Schouten main_menu[4].item_string = catgetlocal( 31, "redraw screen"); 512572fcea8cSEd Schouten main_menu[5].item_string = catgetlocal( 32, "settings"); 512672fcea8cSEd Schouten main_menu[6].item_string = catgetlocal( 33, "search"); 512772fcea8cSEd Schouten main_menu[7].item_string = catgetlocal( 34, "miscellaneous"); 512872fcea8cSEd Schouten help_text[0] = catgetlocal( 35, "Control keys: "); 512972fcea8cSEd Schouten help_text[1] = catgetlocal( 36, "^a ascii code ^i tab ^r right "); 513072fcea8cSEd Schouten help_text[2] = catgetlocal( 37, "^b bottom of text ^j newline ^t top of text "); 513172fcea8cSEd Schouten help_text[3] = catgetlocal( 38, "^c command ^k delete char ^u up "); 513272fcea8cSEd Schouten help_text[4] = catgetlocal( 39, "^d down ^l left ^v undelete word "); 513372fcea8cSEd Schouten help_text[5] = catgetlocal( 40, "^e search prompt ^m newline ^w delete word "); 513472fcea8cSEd Schouten help_text[6] = catgetlocal( 41, "^f undelete char ^n next page ^x search "); 513572fcea8cSEd Schouten help_text[7] = catgetlocal( 42, "^g begin of line ^o end of line ^y delete line "); 513672fcea8cSEd Schouten help_text[8] = catgetlocal( 43, "^h backspace ^p prev page ^z undelete line "); 5137cfe04e82SEd Schouten help_text[9] = catgetlocal( 44, "^[ (escape) menu ESC-Enter: exit ee "); 513872fcea8cSEd Schouten help_text[10] = catgetlocal( 45, " "); 513972fcea8cSEd Schouten help_text[11] = catgetlocal( 46, "Commands: "); 514072fcea8cSEd Schouten help_text[12] = catgetlocal( 47, "help : get this info file : print file name "); 514172fcea8cSEd Schouten help_text[13] = catgetlocal( 48, "read : read a file char : ascii code of char "); 514272fcea8cSEd Schouten help_text[14] = catgetlocal( 49, "write : write a file case : case sensitive search "); 514372fcea8cSEd Schouten help_text[15] = catgetlocal( 50, "exit : leave and save nocase : case insensitive search "); 514472fcea8cSEd Schouten help_text[16] = catgetlocal( 51, "quit : leave, no save !cmd : execute \"cmd\" in shell "); 514572fcea8cSEd Schouten help_text[17] = catgetlocal( 52, "line : display line # 0-9 : go to line \"#\" "); 514672fcea8cSEd Schouten help_text[18] = catgetlocal( 53, "expand : expand tabs noexpand: do not expand tabs "); 514772fcea8cSEd Schouten help_text[19] = catgetlocal( 54, " "); 514872fcea8cSEd Schouten help_text[20] = catgetlocal( 55, " ee [+#] [-i] [-e] [-h] [file(s)] "); 514972fcea8cSEd Schouten help_text[21] = catgetlocal( 56, "+# :go to line # -i :no info window -e : don't expand tabs -h :no highlight"); 515072fcea8cSEd Schouten control_keys[0] = catgetlocal( 57, "^[ (escape) menu ^e search prompt ^y delete line ^u up ^p prev page "); 515172fcea8cSEd Schouten control_keys[1] = catgetlocal( 58, "^a ascii code ^x search ^z undelete line ^d down ^n next page "); 515272fcea8cSEd Schouten control_keys[2] = catgetlocal( 59, "^b bottom of text ^g begin of line ^w delete word ^l left "); 515372fcea8cSEd Schouten control_keys[3] = catgetlocal( 60, "^t top of text ^o end of line ^v undelete word ^r right "); 5154cfe04e82SEd Schouten control_keys[4] = catgetlocal( 61, "^c command ^k delete char ^f undelete char ESC-Enter: exit ee "); 515572fcea8cSEd Schouten command_strings[0] = catgetlocal( 62, "help : get help info |file : print file name |line : print line # "); 515672fcea8cSEd Schouten command_strings[1] = catgetlocal( 63, "read : read a file |char : ascii code of char |0-9 : go to line \"#\""); 515772fcea8cSEd Schouten command_strings[2] = catgetlocal( 64, "write: write a file |case : case sensitive search |exit : leave and save "); 515872fcea8cSEd Schouten command_strings[3] = catgetlocal( 65, "!cmd : shell \"cmd\" |nocase: ignore case in search |quit : leave, no save"); 515972fcea8cSEd Schouten command_strings[4] = catgetlocal( 66, "expand: expand tabs |noexpand: do not expand tabs "); 516072fcea8cSEd Schouten com_win_message = catgetlocal( 67, " press Escape (^[) for menu"); 516172fcea8cSEd Schouten no_file_string = catgetlocal( 68, "no file"); 516272fcea8cSEd Schouten ascii_code_str = catgetlocal( 69, "ascii code: "); 516372fcea8cSEd Schouten printer_msg_str = catgetlocal( 70, "sending contents of buffer to \"%s\" "); 516472fcea8cSEd Schouten command_str = catgetlocal( 71, "command: "); 516572fcea8cSEd Schouten file_write_prompt_str = catgetlocal( 72, "name of file to write: "); 516672fcea8cSEd Schouten file_read_prompt_str = catgetlocal( 73, "name of file to read: "); 516772fcea8cSEd Schouten char_str = catgetlocal( 74, "character = %d"); 516872fcea8cSEd Schouten unkn_cmd_str = catgetlocal( 75, "unknown command \"%s\""); 516972fcea8cSEd Schouten non_unique_cmd_msg = catgetlocal( 76, "entered command is not unique"); 517072fcea8cSEd Schouten line_num_str = catgetlocal( 77, "line %d "); 517172fcea8cSEd Schouten line_len_str = catgetlocal( 78, "length = %d"); 517272fcea8cSEd Schouten current_file_str = catgetlocal( 79, "current file is \"%s\" "); 517372fcea8cSEd Schouten usage0 = catgetlocal( 80, "usage: %s [-i] [-e] [-h] [+line_number] [file(s)]\n"); 517472fcea8cSEd Schouten usage1 = catgetlocal( 81, " -i turn off info window\n"); 517572fcea8cSEd Schouten usage2 = catgetlocal( 82, " -e do not convert tabs to spaces\n"); 517672fcea8cSEd Schouten usage3 = catgetlocal( 83, " -h do not use highlighting\n"); 517772fcea8cSEd Schouten file_is_dir_msg = catgetlocal( 84, "file \"%s\" is a directory"); 517872fcea8cSEd Schouten new_file_msg = catgetlocal( 85, "new file \"%s\""); 517972fcea8cSEd Schouten cant_open_msg = catgetlocal( 86, "can't open \"%s\""); 518072fcea8cSEd Schouten open_file_msg = catgetlocal( 87, "file \"%s\", %d lines"); 518172fcea8cSEd Schouten file_read_fin_msg = catgetlocal( 88, "finished reading file \"%s\""); 518272fcea8cSEd Schouten reading_file_msg = catgetlocal( 89, "reading file \"%s\""); 518372fcea8cSEd Schouten read_only_msg = catgetlocal( 90, ", read only"); 518472fcea8cSEd Schouten file_read_lines_msg = catgetlocal( 91, "file \"%s\", %d lines"); 518572fcea8cSEd Schouten save_file_name_prompt = catgetlocal( 92, "enter name of file: "); 518672fcea8cSEd Schouten file_not_saved_msg = catgetlocal( 93, "no filename entered: file not saved"); 518772fcea8cSEd Schouten changes_made_prompt = catgetlocal( 94, "changes have been made, are you sure? (y/n [n]) "); 518872fcea8cSEd Schouten yes_char = catgetlocal( 95, "y"); 518972fcea8cSEd Schouten file_exists_prompt = catgetlocal( 96, "file already exists, overwrite? (y/n) [n] "); 519072fcea8cSEd Schouten create_file_fail_msg = catgetlocal( 97, "unable to create file \"%s\""); 519172fcea8cSEd Schouten writing_file_msg = catgetlocal( 98, "writing file \"%s\""); 519272fcea8cSEd Schouten file_written_msg = catgetlocal( 99, "\"%s\" %d lines, %d characters"); 519372fcea8cSEd Schouten searching_msg = catgetlocal( 100, " ...searching"); 519472fcea8cSEd Schouten str_not_found_msg = catgetlocal( 101, "string \"%s\" not found"); 519572fcea8cSEd Schouten search_prompt_str = catgetlocal( 102, "search for: "); 519696b676e9SEd Schouten exec_err_msg = catgetlocal( 103, "could not exec %s\n"); 519772fcea8cSEd Schouten continue_msg = catgetlocal( 104, "press return to continue "); 519872fcea8cSEd Schouten menu_cancel_msg = catgetlocal( 105, "press Esc to cancel"); 519972fcea8cSEd Schouten menu_size_err_msg = catgetlocal( 106, "menu too large for window"); 520072fcea8cSEd Schouten press_any_key_msg = catgetlocal( 107, "press any key to continue "); 520172fcea8cSEd Schouten shell_prompt = catgetlocal( 108, "shell command: "); 520272fcea8cSEd Schouten formatting_msg = catgetlocal( 109, "...formatting paragraph..."); 520372fcea8cSEd Schouten shell_echo_msg = catgetlocal( 110, "<!echo 'list of unrecognized words'; echo -=-=-=-=-=-"); 520472fcea8cSEd Schouten spell_in_prog_msg = catgetlocal( 111, "sending contents of edit buffer to 'spell'"); 520572fcea8cSEd Schouten margin_prompt = catgetlocal( 112, "right margin is: "); 520672fcea8cSEd Schouten restricted_msg = catgetlocal( 113, "restricted mode: unable to perform requested operation"); 520772fcea8cSEd Schouten ON = catgetlocal( 114, "ON"); 520872fcea8cSEd Schouten OFF = catgetlocal( 115, "OFF"); 520972fcea8cSEd Schouten HELP = catgetlocal( 116, "HELP"); 521072fcea8cSEd Schouten WRITE = catgetlocal( 117, "WRITE"); 521172fcea8cSEd Schouten READ = catgetlocal( 118, "READ"); 521272fcea8cSEd Schouten LINE = catgetlocal( 119, "LINE"); 521372fcea8cSEd Schouten FILE_str = catgetlocal( 120, "FILE"); 521472fcea8cSEd Schouten CHARACTER = catgetlocal( 121, "CHARACTER"); 521572fcea8cSEd Schouten REDRAW = catgetlocal( 122, "REDRAW"); 521672fcea8cSEd Schouten RESEQUENCE = catgetlocal( 123, "RESEQUENCE"); 521772fcea8cSEd Schouten AUTHOR = catgetlocal( 124, "AUTHOR"); 521872fcea8cSEd Schouten VERSION = catgetlocal( 125, "VERSION"); 521972fcea8cSEd Schouten CASE = catgetlocal( 126, "CASE"); 522072fcea8cSEd Schouten NOCASE = catgetlocal( 127, "NOCASE"); 522172fcea8cSEd Schouten EXPAND = catgetlocal( 128, "EXPAND"); 522272fcea8cSEd Schouten NOEXPAND = catgetlocal( 129, "NOEXPAND"); 522372fcea8cSEd Schouten Exit_string = catgetlocal( 130, "EXIT"); 522472fcea8cSEd Schouten QUIT_string = catgetlocal( 131, "QUIT"); 522572fcea8cSEd Schouten INFO = catgetlocal( 132, "INFO"); 522672fcea8cSEd Schouten NOINFO = catgetlocal( 133, "NOINFO"); 522772fcea8cSEd Schouten MARGINS = catgetlocal( 134, "MARGINS"); 522872fcea8cSEd Schouten NOMARGINS = catgetlocal( 135, "NOMARGINS"); 522972fcea8cSEd Schouten AUTOFORMAT = catgetlocal( 136, "AUTOFORMAT"); 523072fcea8cSEd Schouten NOAUTOFORMAT = catgetlocal( 137, "NOAUTOFORMAT"); 523172fcea8cSEd Schouten Echo = catgetlocal( 138, "ECHO"); 523272fcea8cSEd Schouten PRINTCOMMAND = catgetlocal( 139, "PRINTCOMMAND"); 523372fcea8cSEd Schouten RIGHTMARGIN = catgetlocal( 140, "RIGHTMARGIN"); 523472fcea8cSEd Schouten HIGHLIGHT = catgetlocal( 141, "HIGHLIGHT"); 523572fcea8cSEd Schouten NOHIGHLIGHT = catgetlocal( 142, "NOHIGHLIGHT"); 523672fcea8cSEd Schouten EIGHTBIT = catgetlocal( 143, "EIGHTBIT"); 523772fcea8cSEd Schouten NOEIGHTBIT = catgetlocal( 144, "NOEIGHTBIT"); 523872fcea8cSEd Schouten /* 523972fcea8cSEd Schouten | additions 524072fcea8cSEd Schouten */ 524172fcea8cSEd Schouten mode_strings[7] = catgetlocal( 145, "emacs key bindings "); 524272fcea8cSEd Schouten emacs_help_text[0] = help_text[0]; 524372fcea8cSEd Schouten emacs_help_text[1] = catgetlocal( 146, "^a beginning of line ^i tab ^r restore word "); 524496b676e9SEd Schouten emacs_help_text[2] = catgetlocal( 147, "^b back 1 char ^j undel char ^t top of text "); 524596b676e9SEd Schouten emacs_help_text[3] = catgetlocal( 148, "^c command ^k delete line ^u bottom of text "); 524672fcea8cSEd Schouten emacs_help_text[4] = catgetlocal( 149, "^d delete char ^l undelete line ^v next page "); 524772fcea8cSEd Schouten emacs_help_text[5] = catgetlocal( 150, "^e end of line ^m newline ^w delete word "); 524872fcea8cSEd Schouten emacs_help_text[6] = catgetlocal( 151, "^f forward 1 char ^n next line ^x search "); 524972fcea8cSEd Schouten emacs_help_text[7] = catgetlocal( 152, "^g go back 1 page ^o ascii char insert ^y search prompt "); 525072fcea8cSEd Schouten emacs_help_text[8] = catgetlocal( 153, "^h backspace ^p prev line ^z next word "); 525172fcea8cSEd Schouten emacs_help_text[9] = help_text[9]; 525272fcea8cSEd Schouten emacs_help_text[10] = help_text[10]; 525372fcea8cSEd Schouten emacs_help_text[11] = help_text[11]; 525472fcea8cSEd Schouten emacs_help_text[12] = help_text[12]; 525572fcea8cSEd Schouten emacs_help_text[13] = help_text[13]; 525672fcea8cSEd Schouten emacs_help_text[14] = help_text[14]; 525772fcea8cSEd Schouten emacs_help_text[15] = help_text[15]; 525872fcea8cSEd Schouten emacs_help_text[16] = help_text[16]; 525972fcea8cSEd Schouten emacs_help_text[17] = help_text[17]; 526072fcea8cSEd Schouten emacs_help_text[18] = help_text[18]; 526172fcea8cSEd Schouten emacs_help_text[19] = help_text[19]; 526272fcea8cSEd Schouten emacs_help_text[20] = help_text[20]; 526372fcea8cSEd Schouten emacs_help_text[21] = help_text[21]; 526496b676e9SEd Schouten emacs_control_keys[0] = catgetlocal( 154, "^[ (escape) menu ^y search prompt ^k delete line ^p prev li ^g prev page"); 526596b676e9SEd Schouten emacs_control_keys[1] = catgetlocal( 155, "^o ascii code ^x search ^l undelete line ^n next li ^v next page"); 526696b676e9SEd 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"); 526796b676e9SEd Schouten emacs_control_keys[3] = catgetlocal( 157, "^t top of text ^e end of line ^r restore word ^f forward char "); 5268cfe04e82SEd Schouten emacs_control_keys[4] = catgetlocal( 158, "^c command ^d delete char ^j undelete char ESC-Enter: exit"); 526972fcea8cSEd Schouten EMACS_string = catgetlocal( 159, "EMACS"); 527072fcea8cSEd Schouten NOEMACS_string = catgetlocal( 160, "NOEMACS"); 527172fcea8cSEd Schouten usage4 = catgetlocal( 161, " +# put cursor at line #\n"); 527272fcea8cSEd Schouten conf_dump_err_msg = catgetlocal( 162, "unable to open .init.ee for writing, no configuration saved!"); 527372fcea8cSEd Schouten conf_dump_success_msg = catgetlocal( 163, "ee configuration saved in file %s"); 527472fcea8cSEd Schouten modes_menu[10].item_string = catgetlocal( 164, "save editor configuration"); 527572fcea8cSEd Schouten config_dump_menu[0].item_string = catgetlocal( 165, "save ee configuration"); 527672fcea8cSEd Schouten config_dump_menu[1].item_string = catgetlocal( 166, "save in current directory"); 527772fcea8cSEd Schouten config_dump_menu[2].item_string = catgetlocal( 167, "save in home directory"); 527872fcea8cSEd Schouten conf_not_saved_msg = catgetlocal( 168, "ee configuration not saved"); 527972fcea8cSEd Schouten ree_no_file_msg = catgetlocal( 169, "must specify a file when invoking ree"); 528072fcea8cSEd Schouten menu_too_lrg_msg = catgetlocal( 180, "menu too large for window"); 528172fcea8cSEd Schouten more_above_str = catgetlocal( 181, "^^more^^"); 528272fcea8cSEd Schouten more_below_str = catgetlocal( 182, "VVmoreVV"); 528372fcea8cSEd Schouten mode_strings[9] = catgetlocal( 183, "16 bit characters "); 528472fcea8cSEd Schouten chinese_cmd = catgetlocal( 184, "16BIT"); 528572fcea8cSEd Schouten nochinese_cmd = catgetlocal( 185, "NO16BIT"); 528672fcea8cSEd Schouten 528772fcea8cSEd Schouten commands[0] = HELP; 528872fcea8cSEd Schouten commands[1] = WRITE; 528972fcea8cSEd Schouten commands[2] = READ; 529072fcea8cSEd Schouten commands[3] = LINE; 529172fcea8cSEd Schouten commands[4] = FILE_str; 529272fcea8cSEd Schouten commands[5] = REDRAW; 529372fcea8cSEd Schouten commands[6] = RESEQUENCE; 529472fcea8cSEd Schouten commands[7] = AUTHOR; 529572fcea8cSEd Schouten commands[8] = VERSION; 529672fcea8cSEd Schouten commands[9] = CASE; 529772fcea8cSEd Schouten commands[10] = NOCASE; 529872fcea8cSEd Schouten commands[11] = EXPAND; 529972fcea8cSEd Schouten commands[12] = NOEXPAND; 530072fcea8cSEd Schouten commands[13] = Exit_string; 530172fcea8cSEd Schouten commands[14] = QUIT_string; 530272fcea8cSEd Schouten commands[15] = "<"; 530372fcea8cSEd Schouten commands[16] = ">"; 530472fcea8cSEd Schouten commands[17] = "!"; 530572fcea8cSEd Schouten commands[18] = "0"; 530672fcea8cSEd Schouten commands[19] = "1"; 530772fcea8cSEd Schouten commands[20] = "2"; 530872fcea8cSEd Schouten commands[21] = "3"; 530972fcea8cSEd Schouten commands[22] = "4"; 531072fcea8cSEd Schouten commands[23] = "5"; 531172fcea8cSEd Schouten commands[24] = "6"; 531272fcea8cSEd Schouten commands[25] = "7"; 531372fcea8cSEd Schouten commands[26] = "8"; 531472fcea8cSEd Schouten commands[27] = "9"; 531572fcea8cSEd Schouten commands[28] = CHARACTER; 531672fcea8cSEd Schouten commands[29] = chinese_cmd; 531772fcea8cSEd Schouten commands[30] = nochinese_cmd; 531872fcea8cSEd Schouten commands[31] = NULL; 531972fcea8cSEd Schouten init_strings[0] = CASE; 532072fcea8cSEd Schouten init_strings[1] = NOCASE; 532172fcea8cSEd Schouten init_strings[2] = EXPAND; 532272fcea8cSEd Schouten init_strings[3] = NOEXPAND; 532372fcea8cSEd Schouten init_strings[4] = INFO; 532472fcea8cSEd Schouten init_strings[5] = NOINFO; 532572fcea8cSEd Schouten init_strings[6] = MARGINS; 532672fcea8cSEd Schouten init_strings[7] = NOMARGINS; 532772fcea8cSEd Schouten init_strings[8] = AUTOFORMAT; 532872fcea8cSEd Schouten init_strings[9] = NOAUTOFORMAT; 532972fcea8cSEd Schouten init_strings[10] = Echo; 533072fcea8cSEd Schouten init_strings[11] = PRINTCOMMAND; 533172fcea8cSEd Schouten init_strings[12] = RIGHTMARGIN; 533272fcea8cSEd Schouten init_strings[13] = HIGHLIGHT; 533372fcea8cSEd Schouten init_strings[14] = NOHIGHLIGHT; 533472fcea8cSEd Schouten init_strings[15] = EIGHTBIT; 533572fcea8cSEd Schouten init_strings[16] = NOEIGHTBIT; 533672fcea8cSEd Schouten init_strings[17] = EMACS_string; 533772fcea8cSEd Schouten init_strings[18] = NOEMACS_string; 533872fcea8cSEd Schouten init_strings[19] = chinese_cmd; 533972fcea8cSEd Schouten init_strings[20] = nochinese_cmd; 534072fcea8cSEd Schouten init_strings[21] = NULL; 534172fcea8cSEd Schouten 534272fcea8cSEd Schouten /* 534372fcea8cSEd Schouten | allocate space for strings here for settings menu 534472fcea8cSEd Schouten */ 534572fcea8cSEd Schouten 534672fcea8cSEd Schouten for (counter = 1; counter < NUM_MODES_ITEMS; counter++) 534772fcea8cSEd Schouten { 534872fcea8cSEd Schouten modes_menu[counter].item_string = malloc(80); 534972fcea8cSEd Schouten } 535072fcea8cSEd Schouten 535172fcea8cSEd Schouten #ifndef NO_CATGETS 535272fcea8cSEd Schouten catclose(catalog); 535372fcea8cSEd Schouten #endif /* NO_CATGETS */ 535472fcea8cSEd Schouten } 535572fcea8cSEd Schouten 5356