[BACK]Return to ee.c CVS log [TXT][DIR] Up to [contributed] / dgamelaunch-openbsd

Annotation of dgamelaunch-openbsd/ee.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:  |     ee (easy editor)
        !             3:  |
        !             4:  |     An easy to use, simple screen oriented editor.
        !             5:  |
        !             6:  |     written by Hugh Mahon
        !             7:  |
        !             8:  |     THIS MATERIAL IS PROVIDED "AS IS".  THERE ARE
        !             9:  |     NO WARRANTIES OF ANY KIND WITH REGARD TO THIS
        !            10:  |     MATERIAL, INCLUDING, BUT NOT LIMITED TO, THE
        !            11:  |     IMPLIED WARRANTIES OF MERCHANTABILITY AND
        !            12:  |     FITNESS FOR A PARTICULAR PURPOSE.  Neither
        !            13:  |     Hewlett-Packard nor Hugh Mahon shall be liable
        !            14:  |     for errors contained herein, nor for
        !            15:  |     incidental or consequential damages in
        !            16:  |     connection with the furnishing, performance or
        !            17:  |     use of this material.  Neither Hewlett-Packard
        !            18:  |     nor Hugh Mahon assumes any responsibility for
        !            19:  |     the use or reliability of this software or
        !            20:  |     documentation.  This software and
        !            21:  |     documentation is totally UNSUPPORTED.  There
        !            22:  |     is no support contract available.  Hewlett-
        !            23:  |     Packard has done NO Quality Assurance on ANY
        !            24:  |     of the program or documentation.  You may find
        !            25:  |     the quality of the materials inferior to
        !            26:  |     supported materials.
        !            27:  |
        !            28:  |     This software is not a product of Hewlett-Packard, Co., or any
        !            29:  |     other company.  No support is implied or offered with this software.
        !            30:  |     You've got the source, and you're on your own.
        !            31:  |
        !            32:  |     This software may be distributed under the terms of Larry Wall's
        !            33:  |     Artistic license, a copy of which is included in this distribution.
        !            34:  |
        !            35:  |     This notice must be included with this software and any derivatives.
        !            36:  |
        !            37:  |     This editor was purposely developed to be simple, both in
        !            38:  |     interface and implementation.  This editor was developed to
        !            39:  |     address a specific audience: the user who is new to computers
        !            40:  |     (especially UNIX).
        !            41:  |
        !            42:  |     ee is not aimed at technical users; for that reason more
        !            43:  |     complex features were intentionally left out.  In addition,
        !            44:  |     ee is intended to be compiled by people with little computer
        !            45:  |     experience, which means that it needs to be small, relatively
        !            46:  |     simple in implementation, and portable.
        !            47:  |
        !            48:  |     This software and documentation contains
        !            49:  |     proprietary information which is protected by
        !            50:  |     copyright.  All rights are reserved.
        !            51:  |
        !            52:  |     $Header: /var/cvs/dgamelaunch/ee.c,v 1.10 2004/01/26 16:54:02 joshk Exp $
        !            53:  |
        !            54:  */
        !            55:
        !            56: #include <wchar.h>
        !            57: wchar_t *ee_copyright_message =
        !            58: L"Copyright (c) 1986, 1990, 1991, 1992, 1993, 1994, 1995, 1996 Hugh Mahon ";
        !            59:
        !            60: wchar_t *ee_long_notice[] = {
        !            61:        L"This software and documentation contains",
        !            62:        L"proprietary information which is protected by",
        !            63:        L"copyright.  All rights are reserved."
        !            64:        };
        !            65:
        !            66: wchar_t *version = L"@(#) ee, version 1.4.1  $Revision: 1.10 $";
        !            67:
        !            68: #include <locale.h>
        !            69: #include <curses.h>
        !            70: #include <signal.h>
        !            71: #include <fcntl.h>
        !            72: #include <sys/types.h>
        !            73: #include <sys/stat.h>
        !            74: #include <errno.h>
        !            75: #include <string.h>
        !            76: #include <pwd.h>
        !            77:
        !            78: #include <sys/wait.h>
        !            79: #include <stdlib.h>
        !            80: #include <stdarg.h>
        !            81: #include <unistd.h>
        !            82: #include <ctype.h>
        !            83:
        !            84: #ifndef SIGCHLD
        !            85: #define SIGCHLD SIGCLD
        !            86: #endif
        !            87:
        !            88: #define MAX_FILE 1048576
        !            89:
        !            90: #define TAB 9
        !            91: #define max(a, b)      (a > b ? a : b)
        !            92: #define min(a, b)      (a < b ? a : b)
        !            93:
        !            94: /*
        !            95:  |     defines for type of data to show in info window
        !            96:  */
        !            97:
        !            98: #define CONTROL_KEYS 1
        !            99: #define COMMANDS     2
        !           100:
        !           101: struct text {
        !           102:        wchar_t *line;          /* line of characters           */
        !           103:        int line_number;        /* line number                  */
        !           104:        int line_length;        /* actual number of characters in the line */
        !           105:        int max_length; /* maximum number of characters the line handles */
        !           106:        struct text *next_line;         /* next line of text            */
        !           107:        struct text *prev_line;         /* previous line of text        */
        !           108:        };
        !           109:
        !           110: struct text *first_line;       /* first line of current buffer         */
        !           111: struct text *dlt_line;         /* structure for info on deleted line   */
        !           112: struct text *curr_line;                /* current line cursor is on            */
        !           113: struct text *tmp_line;         /* temporary line pointer               */
        !           114: struct text *srch_line;                /* temporary pointer for search routine */
        !           115:
        !           116: int d_wrd_len;                 /* length of deleted word               */
        !           117: int position;                  /* offset in bytes from begin of line   */
        !           118: int scr_pos;                   /* horizontal position                  */
        !           119: int scr_vert;                  /* vertical position on screen          */
        !           120: int scr_horz;                  /* horizontal position on screen        */
        !           121: int tmp_vert, tmp_horz;
        !           122: int input_file;                        /* indicate to read input file          */
        !           123: int recv_file;                 /* indicate reading a file              */
        !           124: int edit;                      /* continue executing while true        */
        !           125: int gold;                      /* 'gold' function key pressed          */
        !           126: int fildes;                    /* file descriptor                      */
        !           127: int case_sen;                  /* case sensitive search flag           */
        !           128: int last_line;                 /* last line for text display           */
        !           129: int last_col;                  /* last column for text display         */
        !           130: int horiz_offset = 0;          /* offset from left edge of text        */
        !           131: int clear_com_win;             /* flag to indicate com_win needs clearing */
        !           132: int text_changes = FALSE;      /* indicate changes have been made to text */
        !           133: int get_fd;                    /* file descriptor for reading a file   */
        !           134: int info_window = TRUE;                /* flag to indicate if help window visible */
        !           135: int info_type = CONTROL_KEYS;  /* flag to indicate type of info to display */
        !           136: int expand_tabs = TRUE;                /* flag for expanding tabs              */
        !           137: int right_margin = 0;          /* the right margin                     */
        !           138: int observ_margins = TRUE;     /* flag for whether margins are observed */
        !           139: int out_pipe;                  /* flag that info is piped out          */
        !           140: int in_pipe;                   /* flag that info is piped in           */
        !           141: int formatted = FALSE;         /* flag indicating paragraph formatted  */
        !           142: int nohighlight = FALSE;       /* turns off highlighting               */
        !           143: int eightbit = TRUE;           /* eight bit character flag             */
        !           144: int local_LINES = 0;           /* copy of LINES, to detect when win resizes */
        !           145: int local_COLS = 0;            /* copy of COLS, to detect when win resizes  */
        !           146: int curses_initialized = FALSE;        /* flag indicating if curses has been started*/
        !           147: int emacs_keys_mode = TRUE;    /* mode for if emacs key binings are used    */
        !           148:
        !           149: wchar_t *point;                /* points to current position in line   */
        !           150: wchar_t *srch_str;     /* pointer for search string            */
        !           151: wchar_t *u_srch_str;   /* pointer to non-case sensitive search */
        !           152: wchar_t *srch_1;               /* pointer to start of suspect string   */
        !           153: wchar_t *srch_2;               /* pointer to next character of string  */
        !           154: wchar_t *srch_3;
        !           155: char *in_file_name = NULL;     /* name of input file           */
        !           156: char *tmp_file;        /* temporary file name                  */
        !           157: wchar_t *d_char;               /* deleted character                    */
        !           158: wchar_t *d_word;               /* deleted word                         */
        !           159: wchar_t *d_line;               /* deleted line                         */
        !           160: wchar_t *start_at_line = NULL; /* move to this line at start of session*/
        !           161: int in;                                /* input character                      */
        !           162:
        !           163: FILE *temp_fp;                 /* temporary file pointer               */
        !           164:
        !           165: wchar_t *table[] = {
        !           166:        L"^@", L"^A", L"^B", L"^C", L"^D", L"^E", L"^F", L"^G", L"^H", L"\t", L"^J",
        !           167:        L"^K", L"^L", L"^M", L"^N", L"^O", L"^P", L"^Q", L"^R", L"^S", L"^T", L"^U",
        !           168:        L"^V", L"^W", L"^X", L"^Y", L"^Z", L"^[", L"^\\", L"^]", L"^^", L"^_"
        !           169:        };
        !           170:
        !           171: WINDOW *com_win;
        !           172: WINDOW *text_win;
        !           173: WINDOW *help_win;
        !           174: WINDOW *info_win;
        !           175:
        !           176: #if defined(__STDC__) || defined(__cplusplus)
        !           177: #define P_(s) s
        !           178: #else
        !           179: #define P_(s) ()
        !           180: #endif
        !           181:
        !           182:
        !           183: /*
        !           184:  |     The following structure allows menu items to be flexibly declared.
        !           185:  |     The first item is the string describing the selection, the second
        !           186:  |     is the address of the procedure to call when the item is selected,
        !           187:  |     and the third is the argument for the procedure.
        !           188:  |
        !           189:  |     For those systems with i18n, the string should be accompanied by a
        !           190:  |     catalog number.  The 'int *' should be replaced with 'void *' on
        !           191:  |     systems with that type.
        !           192:  |
        !           193:  |     The first menu item will be the title of the menu, with NULL
        !           194:  |     parameters for the procedure and argument, followed by the menu items.
        !           195:  |
        !           196:  |     If the procedure value is NULL, the menu item is displayed, but no
        !           197:  |     procedure is called when the item is selected.  The number of the
        !           198:  |     item will be returned.  If the third (argument) parameter is -1, no
        !           199:  |     argument is given to the procedure when it is called.
        !           200:  */
        !           201:
        !           202: struct menu_entries
        !           203: {
        !           204:        wchar_t *item_string;
        !           205:        int (*procedure)P_((struct menu_entries *));
        !           206:        struct menu_entries *ptr_argument;
        !           207:        int (*iprocedure)P_((int));
        !           208:        void (*nprocedure)P_((void));
        !           209:        int argument;
        !           210: };
        !           211:
        !           212: int main(int argc, char *argv[]);
        !           213: wchar_t *resiz_line(int factor, struct text *rline, int rpos);
        !           214: void insert(int character);
        !           215: void delete(int disp);
        !           216: void scanline(wchar_t *pos);
        !           217: int tabshift(int temp_int);
        !           218: int out_char(WINDOW *window, int character, int column);
        !           219: int len_char(wchar_t character, int column);
        !           220: void draw_line(int vertical, int horiz, wchar_t *ptr, int t_pos, int length);
        !           221: void insert_line(int disp);
        !           222: struct text *txtalloc(void);
        !           223: wchar_t *next_word(wchar_t *string);
        !           224: void prev_word(void);
        !           225: void control(void);
        !           226: void emacs_control(void);
        !           227: void bottom(void);
        !           228: void top(void);
        !           229: void nextline(void);
        !           230: void prevline(void);
        !           231: void left(int disp);
        !           232: void right(int disp);
        !           233: void find_pos(void);
        !           234: void up(void);
        !           235: void down(void);
        !           236: void function_key(void);
        !           237: void command_prompt(void);
        !           238: void command(wchar_t *cmd_str1);
        !           239: int scan(wchar_t *line, int offset, int column);
        !           240: wchar_t *get_string(wchar_t *prompt, int advance);
        !           241: int compare(wchar_t *string1, wchar_t *string2, int sensitive);
        !           242: void goto_line(wchar_t *cmd_str);
        !           243: void midscreen(int line, wchar_t *pnt);
        !           244: void check_fp(void);
        !           245: void get_file(char *file_name);
        !           246: void get_line(int length, char *in_string, int *append);
        !           247: void draw_screen(void);
        !           248: void ee_finish(void);
        !           249: int quit(int noverify);
        !           250: void edit_abort(int arg);
        !           251: void delete_text(void);
        !           252: int write_file(char *file_name, int fd);
        !           253: int search(int display_message);
        !           254: void search_prompt(void);
        !           255: void del_char(void);
        !           256: void undel_char(void);
        !           257: void del_word(void);
        !           258: void undel_word(void);
        !           259: void del_line(void);
        !           260: void undel_line(void);
        !           261: void adv_word(void);
        !           262: void move_rel(char direction, int lines);
        !           263: void eol(void);
        !           264: void bol(void);
        !           265: void adv_line(void);
        !           266: void set_up_term(void);
        !           267: void resize_check(void);
        !           268: int menu_op(struct menu_entries menu_list[]);
        !           269: void paint_menu(struct menu_entries menu_list[], int max_width, int max_height, int list_size, int top_offset, WINDOW *menu_win, int off_start, int vert_size);
        !           270: void help(void);
        !           271: void paint_info_win(void);
        !           272: void no_info_window(void);
        !           273: void create_info_window(void);
        !           274: int file_op(int arg);
        !           275: void leave_op(void);
        !           276: void redraw(void);
        !           277: int Blank_Line(struct text *test_line);
        !           278: void echo_string(wchar_t *string);
        !           279: int first_word_len(struct text *test_line);
        !           280: wchar_t *is_in_string(wchar_t *string, wchar_t *substring);
        !           281: int unique_test(wchar_t *string, wchar_t *list[]);
        !           282: void strings_init(void);
        !           283:
        !           284: #undef P_
        !           285: /*
        !           286:  |     allocate space here for the strings that will be in the menu
        !           287:  */
        !           288:
        !           289: struct menu_entries leave_menu[] = {
        !           290:        {L"", NULL, NULL, NULL, NULL, -1},
        !           291:        {L"", NULL, NULL, NULL, ee_finish, -1},
        !           292:        {L"", NULL, NULL, quit, NULL, TRUE},
        !           293:        {NULL, NULL, NULL, NULL, NULL, -1}
        !           294:        };
        !           295:
        !           296: #define READ_FILE 1
        !           297: #define WRITE_FILE 2
        !           298: #define SAVE_FILE 3
        !           299:
        !           300: struct menu_entries search_menu[] = {
        !           301:        {L"", NULL, NULL, NULL, NULL, 0},
        !           302:        {L"", NULL, NULL, NULL, search_prompt, -1},
        !           303:        {L"", NULL, NULL, search, NULL, TRUE},
        !           304:        {NULL, NULL, NULL, NULL, NULL, -1}
        !           305:        };
        !           306:
        !           307: struct menu_entries main_menu[] = {
        !           308:        {L"", NULL, NULL, NULL, NULL, -1},
        !           309:        {L"", NULL, NULL, NULL, leave_op, -1},
        !           310:        {L"", NULL, NULL, NULL, help, -1},
        !           311:        {L"", NULL, NULL, file_op, NULL, SAVE_FILE},
        !           312:        {L"", NULL, NULL, NULL, redraw, -1},
        !           313:        {L"", menu_op, search_menu, NULL, NULL, -1},
        !           314:        {NULL, NULL, NULL, NULL, NULL, -1}
        !           315:        };
        !           316:
        !           317: wchar_t *help_text[23];
        !           318: wchar_t *control_keys[5];
        !           319:
        !           320: wchar_t *emacs_help_text[22];
        !           321: wchar_t *emacs_control_keys[5];
        !           322:
        !           323: wchar_t *command_strings[5];
        !           324: wchar_t *commands[32];
        !           325:
        !           326: #define MENU_WARN 1
        !           327:
        !           328: #define max_alpha_char 36
        !           329:
        !           330: /*
        !           331:  |     Declarations for strings for localization
        !           332:  */
        !           333:
        !           334: wchar_t *com_win_message;              /* to be shown in com_win if no info window */
        !           335: char *no_file_string;
        !           336: wchar_t *ascii_code_str;
        !           337: wchar_t *command_str;
        !           338: char *char_str;
        !           339: char *unkn_cmd_str;
        !           340: wchar_t *non_unique_cmd_msg;
        !           341: char *line_num_str;
        !           342: char *line_len_str;
        !           343: char *current_file_str;
        !           344: wchar_t *usage0;
        !           345: wchar_t *usage1;
        !           346: wchar_t *usage2;
        !           347: wchar_t *usage3;
        !           348: wchar_t *usage4;
        !           349: char *file_is_dir_msg;
        !           350: char *new_file_msg;
        !           351: char *cant_open_msg;
        !           352: wchar_t *open_file_msg;
        !           353: char *file_read_fin_msg;
        !           354: char *reading_file_msg;
        !           355: char *read_only_msg;
        !           356: char *file_read_lines_msg;
        !           357: wchar_t *save_file_name_prompt;
        !           358: char *file_not_saved_msg;
        !           359: wchar_t *changes_made_prompt;
        !           360: wchar_t *yes_char;
        !           361: wchar_t *file_exists_prompt;
        !           362: char *create_file_fail_msg;
        !           363: char *writing_file_msg;
        !           364: char *file_written_msg;
        !           365: char *searching_msg;
        !           366: char *str_not_found_msg;
        !           367: wchar_t *search_prompt_str;
        !           368: wchar_t *continue_msg;
        !           369: wchar_t *menu_cancel_msg;
        !           370: wchar_t *menu_size_err_msg;
        !           371: wchar_t *press_any_key_msg;
        !           372: wchar_t *ON;
        !           373: wchar_t *OFF;
        !           374: wchar_t *HELP;
        !           375: wchar_t *SAVE;
        !           376: wchar_t *READ;
        !           377: wchar_t *LINE;
        !           378: wchar_t *FILE_str;
        !           379: wchar_t *CHARACTER;
        !           380: wchar_t *REDRAW;
        !           381: wchar_t *RESEQUENCE;
        !           382: wchar_t *AUTHOR;
        !           383: wchar_t *ee_VERSION;
        !           384: wchar_t *CASE;
        !           385: wchar_t *NOCASE;
        !           386: wchar_t *EXPAND;
        !           387: wchar_t *NOEXPAND;
        !           388: wchar_t *Exit_string;
        !           389: wchar_t *QUIT_string;
        !           390: wchar_t *INFO;
        !           391: wchar_t *NOINFO;
        !           392: wchar_t *MARGINS;
        !           393: wchar_t *NOMARGINS;
        !           394: wchar_t *AUTOFORMAT;
        !           395: wchar_t *NOAUTOFORMAT;
        !           396: wchar_t *Echo;
        !           397: wchar_t *PRINTCOMMAND;
        !           398: wchar_t *RIGHTMARGIN;
        !           399: wchar_t *HIGHLIGHT;
        !           400: wchar_t *NOHIGHLIGHT;
        !           401: wchar_t *EIGHTBIT;
        !           402: wchar_t *NOEIGHTBIT;
        !           403: wchar_t *EMACS_string;
        !           404: wchar_t *NOEMACS_string;
        !           405: wchar_t *cancel_string;
        !           406: char *menu_too_lrg_msg;
        !           407: wchar_t *more_above_str, *more_below_str;
        !           408:
        !           409: #ifndef __STDC__
        !           410: #ifndef HAS_STDLIB
        !           411: extern char *malloc();
        !           412: extern char *realloc();
        !           413: extern char *getenv();
        !           414: FILE *fopen();                 /* declaration for open function        */
        !           415: #endif /* HAS_STDLIB */
        !           416: #endif /* __STDC__ */
        !           417:
        !           418: int
        !           419: main(argc, argv)               /* beginning of main program            */
        !           420: int argc;
        !           421: char *argv[];
        !           422: {
        !           423:        int counter;
        !           424:
        !           425:        setlocale(LC_ALL, "");
        !           426:        for (counter = 1; counter < 24; counter++)
        !           427:        {
        !           428:          if (!(counter == SIGKILL || counter == SIGSTOP))
        !           429:                signal(counter, SIG_IGN);
        !           430:        }
        !           431:
        !           432:        signal(SIGCHLD, SIG_DFL);
        !           433:        signal(SIGSEGV, SIG_DFL);
        !           434:        signal(SIGINT, edit_abort);
        !           435:        d_char = malloc(3 * sizeof(wchar_t));   /* provide a buffer for multi-byte chars */
        !           436:        d_word = malloc(150 * sizeof(wchar_t));
        !           437:        *d_word = '\0';
        !           438:        d_line = NULL;
        !           439:        dlt_line = txtalloc();
        !           440:        dlt_line->line = d_line;
        !           441:        dlt_line->line_length = 0;
        !           442:        curr_line = first_line = txtalloc();
        !           443:        curr_line->line = point = malloc(10 * sizeof(wchar_t));
        !           444:        curr_line->line_length = 1;
        !           445:        curr_line->max_length = 10;
        !           446:        curr_line->prev_line = NULL;
        !           447:        curr_line->next_line = NULL;
        !           448:        curr_line->line_number  = 1;
        !           449:        srch_str = NULL;
        !           450:        u_srch_str = NULL;
        !           451:        position = 1;
        !           452:        scr_pos =0;
        !           453:        scr_vert = 0;
        !           454:        scr_horz = 0;
        !           455:        edit = TRUE;
        !           456:        gold = case_sen = FALSE;
        !           457:        strings_init();
        !           458:
        !           459:        if (argc != 2)
        !           460:        {
        !           461:          puts("need a filename! bailing out.");
        !           462:          return 1;
        !           463:        }
        !           464:        else
        !           465:        {
        !           466:          tmp_file = strdup(argv[1]);
        !           467:          input_file = recv_file = TRUE;
        !           468:        }
        !           469:
        !           470:        set_up_term();
        !           471:        if (right_margin == 0)
        !           472:                right_margin = COLS - 1;
        !           473:
        !           474:        if (!tmp_file)
        !           475:        {
        !           476:                wprintw(com_win, no_file_string);
        !           477:                wrefresh(com_win);
        !           478:        }
        !           479:        else
        !           480:                check_fp();
        !           481:
        !           482:        clear_com_win = TRUE;
        !           483:
        !           484:        while(edit)
        !           485:        {
        !           486:                int keyt;
        !           487:                wrefresh(text_win);
        !           488:                keyt = wget_wch(text_win, &in);
        !           489:                if (keyt == ERR)
        !           490:                        exit(0);
        !           491:
        !           492:                resize_check();
        !           493:
        !           494:                if (clear_com_win)
        !           495:                {
        !           496:                        clear_com_win = FALSE;
        !           497:                        wmove(com_win, 0, 0);
        !           498:                        werase(com_win);
        !           499:                        if (!info_window)
        !           500:                        {
        !           501:                                wprintw(com_win, "%S", com_win_message);
        !           502:                        }
        !           503:                        wrefresh(com_win);
        !           504:                }
        !           505:
        !           506:                if (keyt == KEY_CODE_YES)
        !           507:                        function_key();
        !           508:                else if ((in == '\10') || (in == 127))
        !           509:                {
        !           510:                        in = 8;         /* make sure key is set to backspace */
        !           511:                        delete(TRUE);
        !           512:                }
        !           513:                else if ((in > 31) || (in == 9))
        !           514:                        insert(in);
        !           515:                else if ((in >= 0) && (in <= 31))
        !           516:                {
        !           517:                        if (emacs_keys_mode)
        !           518:                                emacs_control();
        !           519:                        else
        !           520:                                control();
        !           521:                }
        !           522:        }
        !           523:        return(0);
        !           524: }
        !           525:
        !           526: wchar_t *
        !           527: resiz_line(factor, rline, rpos)        /* resize the line to length + factor*/
        !           528: int factor;            /* resize factor                                */
        !           529: struct text *rline;    /* position in line                             */
        !           530: int rpos;
        !           531: {
        !           532:        wchar_t *rpoint;
        !           533:        int resiz_var;
        !           534:
        !           535:        rline->max_length += factor;
        !           536:        rpoint = rline->line = realloc(rline->line, rline->max_length * sizeof(wchar_t));
        !           537:        for (resiz_var = 1 ; (resiz_var < rpos) ; resiz_var++)
        !           538:                rpoint++;
        !           539:        return(rpoint);
        !           540: }
        !           541:
        !           542: void
        !           543: insert(character)              /* insert character into line           */
        !           544: int character;                 /* new character                        */
        !           545: {
        !           546:        int counter;
        !           547:        int value;
        !           548:        wchar_t *temp;  /* temporary pointer                    */
        !           549:        wchar_t *temp2; /* temporary pointer                    */
        !           550:
        !           551:        if ((character == '\011') && (expand_tabs))
        !           552:        {
        !           553:                counter = len_char('\011', scr_horz);
        !           554:                for (; counter > 0; counter--)
        !           555:                        insert(' ');
        !           556:                return;
        !           557:        }
        !           558:        text_changes = TRUE;
        !           559:        if ((curr_line->max_length - curr_line->line_length) < 5)
        !           560:                point = resiz_line(10, curr_line, position);
        !           561:        curr_line->line_length++;
        !           562:        temp = point;
        !           563:        counter = position;
        !           564:        while (counter < curr_line->line_length)        /* find end of line */
        !           565:        {
        !           566:                counter++;
        !           567:                temp++;
        !           568:        }
        !           569:        temp++;                 /* increase length of line by one       */
        !           570:        while (point < temp)
        !           571:        {
        !           572:                temp2=temp - 1;
        !           573:                *temp= *temp2;  /* shift characters over by one         */
        !           574:                temp--;
        !           575:        }
        !           576:        *point = character;     /* insert new character                 */
        !           577:        wclrtoeol(text_win);
        !           578:        if ((character >= 0) && (character < ' ')) /* check for TAB character*/
        !           579:        {
        !           580:                scr_pos = scr_horz += out_char(text_win, character, scr_horz);
        !           581:                point++;
        !           582:                position++;
        !           583:        }
        !           584:        else
        !           585:        {
        !           586:                waddnwstr(text_win, &character, 1);
        !           587:                scr_pos = ++scr_horz;
        !           588:                point++;
        !           589:                position ++;
        !           590:        }
        !           591:
        !           592:        if ((observ_margins) && (right_margin < scr_pos))
        !           593:        {
        !           594:                counter = position;
        !           595:                while (scr_pos > right_margin)
        !           596:                        prev_word();
        !           597:                if (scr_pos == 0)
        !           598:                {
        !           599:                        while (position < counter)
        !           600:                                right(TRUE);
        !           601:                }
        !           602:                else
        !           603:                {
        !           604:                        counter -= position;
        !           605:                        insert_line(TRUE);
        !           606:                        for (value = 0; value < counter; value++)
        !           607:                                right(TRUE);
        !           608:                }
        !           609:        }
        !           610:
        !           611:        if ((scr_horz - horiz_offset) > last_col)
        !           612:        {
        !           613:                horiz_offset += 8;
        !           614:                midscreen(scr_vert, point);
        !           615:        }
        !           616:
        !           617:        else if ((character != ' ') && (character != '\t'))
        !           618:                formatted = FALSE;
        !           619:
        !           620:        draw_line(scr_vert, scr_horz, point, position, curr_line->line_length);
        !           621: }
        !           622:
        !           623: void
        !           624: delete(disp)                   /* delete character             */
        !           625: int disp;
        !           626: {
        !           627:        wchar_t *tp;
        !           628:        wchar_t *temp2;
        !           629:        struct text *temp_buff;
        !           630:        int temp_vert;
        !           631:        int temp_pos;
        !           632:        int del_width = 1;
        !           633:
        !           634:        if (point != curr_line->line)   /* if not at beginning of line  */
        !           635:        {
        !           636:                text_changes = TRUE;
        !           637:                temp2 = tp = point;
        !           638:                tp -= del_width;
        !           639:                point -= del_width;
        !           640:                position -= del_width;
        !           641:                temp_pos = position;
        !           642:                curr_line->line_length -= del_width;
        !           643:                if ((*tp < ' ') || (*tp >= 127))        /* check for TAB */
        !           644:                        scanline(tp);
        !           645:                else
        !           646:                        scr_horz -= del_width;
        !           647:                scr_pos = scr_horz;
        !           648:                if (in == 8)
        !           649:                {
        !           650:                        if (del_width == 1)
        !           651:                                *d_char = *point; /* save deleted character  */
        !           652:                        else
        !           653:                        {
        !           654:                                d_char[0] = *point;
        !           655:                                d_char[1] = *(point + 1);
        !           656:                        }
        !           657:                        d_char[del_width] = '\0';
        !           658:                }
        !           659:                while (temp_pos <= curr_line->line_length)
        !           660:                {
        !           661:                        temp_pos++;
        !           662:                        *tp = *temp2;
        !           663:                        tp++;
        !           664:                        temp2++;
        !           665:                }
        !           666:                if (scr_horz < horiz_offset)
        !           667:                {
        !           668:                        horiz_offset -= 8;
        !           669:                        midscreen(scr_vert, point);
        !           670:                }
        !           671:        }
        !           672:        else if (curr_line->prev_line != NULL)
        !           673:        {
        !           674:                text_changes = TRUE;
        !           675:                left(disp);                     /* go to previous line  */
        !           676:                temp_buff = curr_line->next_line;
        !           677:                point = resiz_line(temp_buff->line_length, curr_line, position);
        !           678:                if (temp_buff->next_line != NULL)
        !           679:                        temp_buff->next_line->prev_line = curr_line;
        !           680:                curr_line->next_line = temp_buff->next_line;
        !           681:                temp2 = temp_buff->line;
        !           682:                if (in == 8)
        !           683:                {
        !           684:                        d_char[0] = '\n';
        !           685:                        d_char[1] = '\0';
        !           686:                }
        !           687:                tp = point;
        !           688:                temp_pos = 1;
        !           689:                while (temp_pos < temp_buff->line_length)
        !           690:                {
        !           691:                        curr_line->line_length++;
        !           692:                        temp_pos++;
        !           693:                        *tp = *temp2;
        !           694:                        tp++;
        !           695:                        temp2++;
        !           696:                }
        !           697:                *tp = '\0';
        !           698:                free(temp_buff->line);
        !           699:                free(temp_buff);
        !           700:                temp_buff = curr_line;
        !           701:                temp_vert = scr_vert;
        !           702:                scr_pos = scr_horz;
        !           703:                if (scr_vert < last_line)
        !           704:                {
        !           705:                        wmove(text_win, scr_vert + 1, 0);
        !           706:                        wdeleteln(text_win);
        !           707:                }
        !           708:                while ((temp_buff != NULL) && (temp_vert < last_line))
        !           709:                {
        !           710:                        temp_buff = temp_buff->next_line;
        !           711:                        temp_vert++;
        !           712:                }
        !           713:                if ((temp_vert == last_line) && (temp_buff != NULL))
        !           714:                {
        !           715:                        tp = temp_buff->line;
        !           716:                        wmove(text_win, last_line,0);
        !           717:                        wclrtobot(text_win);
        !           718:                        draw_line(last_line, 0, tp, 1, temp_buff->line_length);
        !           719:                        wmove(text_win, scr_vert, (scr_horz - horiz_offset));
        !           720:                }
        !           721:        }
        !           722:        draw_line(scr_vert, scr_horz, point, position, curr_line->line_length);
        !           723:        formatted = FALSE;
        !           724: }
        !           725:
        !           726: void
        !           727: scanline(pos)  /* find the proper horizontal position for the pointer  */
        !           728: wchar_t *pos;
        !           729: {
        !           730:        int temp;
        !           731:        wchar_t *ptr;
        !           732:
        !           733:        ptr = curr_line->line;
        !           734:        temp = 0;
        !           735:        while (ptr < pos)
        !           736:        {
        !           737:                if (*ptr <= 8)
        !           738:                        temp += 2;
        !           739:                else if (*ptr == 9)
        !           740:                        temp += tabshift(temp);
        !           741:                else if ((*ptr >= 10) && (*ptr <= 31))
        !           742:                        temp += 2;
        !           743:                else if ((*ptr >= 32) && (*ptr < 127))
        !           744:                        temp++;
        !           745:                else if (*ptr == 127)
        !           746:                        temp += 2;
        !           747:                else if (!eightbit)
        !           748:                        temp += 5;
        !           749:                else
        !           750:                        temp++;
        !           751:                ptr++;
        !           752:        }
        !           753:        scr_horz = temp;
        !           754:        if ((scr_horz - horiz_offset) > last_col)
        !           755:        {
        !           756:                horiz_offset = (scr_horz - (scr_horz % 8)) - (COLS - 8);
        !           757:                midscreen(scr_vert, point);
        !           758:        }
        !           759:        else if (scr_horz < horiz_offset)
        !           760:        {
        !           761:                horiz_offset = max(0, (scr_horz - (scr_horz % 8)));
        !           762:                midscreen(scr_vert, point);
        !           763:        }
        !           764: }
        !           765:
        !           766: int
        !           767: tabshift(temp_int)             /* give the number of spaces to shift   */
        !           768: int temp_int;
        !           769: {
        !           770:        int leftover;
        !           771:
        !           772:        leftover = ((temp_int + 1) % 8);
        !           773:        if (leftover == 0)
        !           774:                return (1);
        !           775:        else
        !           776:                return (9 - leftover);
        !           777: }
        !           778:
        !           779: int
        !           780: out_char(window, character, column)    /* output non-printing character */
        !           781: WINDOW *window;
        !           782: int character;
        !           783: int column;
        !           784: {
        !           785:        int i1, i2;
        !           786:        wchar_t *string;
        !           787:
        !           788:        if (character == TAB)
        !           789:        {
        !           790:                i1 = tabshift(column);
        !           791:                for (i2 = 0;
        !           792:                  (i2 < i1) && (((column+i2+1)-horiz_offset) < last_col); i2++)
        !           793:                {
        !           794:                        waddch(window, ' ');
        !           795:                }
        !           796:                return(i1);
        !           797:        }
        !           798:        else if ((character >= '\0') && (character < ' '))
        !           799:        {
        !           800:                string = table[(int) character];
        !           801:        }
        !           802:        else
        !           803:        {
        !           804:                waddnwstr(window, &character, 1);
        !           805:                return(1);
        !           806:        }
        !           807:        for (i2 = 0; (string[i2] != '\0') && (((column+i2+1)-horiz_offset) < last_col); i2++)
        !           808:                waddch(window, string[i2]);
        !           809:        return(wcslen(string));
        !           810: }
        !           811:
        !           812: int
        !           813: len_char(character, column)    /* return the length of the character   */
        !           814: wchar_t character;
        !           815: int column;    /* the column must be known to provide spacing for tabs */
        !           816: {
        !           817:        int length;
        !           818:
        !           819:        if (character == '\t')
        !           820:                length = tabshift(column);
        !           821:        else if ((character >= 0) && (character < 32))
        !           822:                length = 2;
        !           823:        else if ((character >= 32) && (character <= 126))
        !           824:                length = 1;
        !           825:        else if (character == 127)
        !           826:                length = 2;
        !           827:        else if (((character > 126) || (character < 0)) && (!eightbit))
        !           828:                length = 5;
        !           829:        else
        !           830:                length = 1;
        !           831:
        !           832:        return(length);
        !           833: }
        !           834:
        !           835: void
        !           836: draw_line(vertical, horiz, ptr, t_pos, length) /* redraw line from current position */
        !           837: int vertical;  /* current vertical position on screen          */
        !           838: int horiz;     /* current horizontal position on screen        */
        !           839: wchar_t *ptr;  /* pointer to line                              */
        !           840: int t_pos;     /* current position (offset in bytes) from bol  */
        !           841: int length;    /* length (in bytes) of line                    */
        !           842: {
        !           843:        int d;          /* partial length of special or tab char to display  */
        !           844:        wchar_t *temp;  /* temporary pointer to position in line             */
        !           845:        int abs_column; /* offset in screen units from begin of line         */
        !           846:        int column;     /* horizontal position on screen                     */
        !           847:        int row;        /* vertical position on screen                       */
        !           848:        int posit;      /* temporary position indicator within line          */
        !           849:
        !           850:        abs_column = horiz;
        !           851:        column = horiz - horiz_offset;
        !           852:        row = vertical;
        !           853:        temp = ptr;
        !           854:        d = 0;
        !           855:        posit = t_pos;
        !           856:        if (column < 0)
        !           857:        {
        !           858:                wmove(text_win, row, 0);
        !           859:                wclrtoeol(text_win);
        !           860:        }
        !           861:        while (column < 0)
        !           862:        {
        !           863:                d = len_char(*temp, abs_column);
        !           864:                abs_column += d;
        !           865:                column += d;
        !           866:                posit++;
        !           867:                temp++;
        !           868:        }
        !           869:        wmove(text_win, row, column);
        !           870:        wclrtoeol(text_win);
        !           871:        while ((posit < length) && (column <= last_col))
        !           872:        {
        !           873:                if (*temp < 32)
        !           874:                {
        !           875:                        column += len_char(*temp, abs_column);
        !           876:                        abs_column += out_char(text_win, *temp, abs_column);
        !           877:                }
        !           878:                else
        !           879:                {
        !           880:                        abs_column++;
        !           881:                        column++;
        !           882:                        waddnwstr(text_win, temp, 1);
        !           883:                }
        !           884:                posit++;
        !           885:                temp++;
        !           886:        }
        !           887:        if (column < last_col)
        !           888:                wclrtoeol(text_win);
        !           889:        wmove(text_win, vertical, (horiz - horiz_offset));
        !           890: }
        !           891:
        !           892: void
        !           893: insert_line(disp)                      /* insert new line              */
        !           894: int disp;
        !           895: {
        !           896:        int temp_pos;
        !           897:        int temp_pos2;
        !           898:        wchar_t *temp;
        !           899:        wchar_t *extra;
        !           900:        struct text *temp_nod;
        !           901:
        !           902:        text_changes = TRUE;
        !           903:        wmove(text_win, scr_vert, (scr_horz - horiz_offset));
        !           904:        wclrtoeol(text_win);
        !           905:        temp_nod= txtalloc();
        !           906:        temp_nod->line = extra= malloc(10 * sizeof(wchar_t));
        !           907:        temp_nod->line_length = 1;
        !           908:        temp_nod->max_length = 10;
        !           909:        temp_nod->line_number = curr_line->line_number + 1;
        !           910:        temp_nod->next_line = curr_line->next_line;
        !           911:        if (temp_nod->next_line != NULL)
        !           912:                temp_nod->next_line->prev_line = temp_nod;
        !           913:        temp_nod->prev_line = curr_line;
        !           914:        curr_line->next_line = temp_nod;
        !           915:        temp_pos2 = position;
        !           916:        temp = point;
        !           917:        if (temp_pos2 < curr_line->line_length)
        !           918:        {
        !           919:                temp_pos = 1;
        !           920:                while (temp_pos2 < curr_line->line_length)
        !           921:                {
        !           922:                        if ((temp_nod->max_length - temp_nod->line_length)< 5)
        !           923:                                extra = resiz_line(10, temp_nod, temp_pos);
        !           924:                        temp_nod->line_length++;
        !           925:                        temp_pos++;
        !           926:                        temp_pos2++;
        !           927:                        *extra= *temp;
        !           928:                        extra++;
        !           929:                        temp++;
        !           930:                }
        !           931:                temp=point;
        !           932:                *temp = '\0';
        !           933:                temp = resiz_line((1 - temp_nod->line_length), curr_line, position);
        !           934:                curr_line->line_length = 1 + temp - curr_line->line;
        !           935:        }
        !           936:        curr_line->line_length = position;
        !           937:        curr_line = temp_nod;
        !           938:        *extra = '\0';
        !           939:        position = 1;
        !           940:        point= curr_line->line;
        !           941:        if (disp)
        !           942:        {
        !           943:                if (scr_vert < last_line)
        !           944:                {
        !           945:                        scr_vert++;
        !           946:                        wclrtoeol(text_win);
        !           947:                        wmove(text_win, scr_vert, 0);
        !           948:                        winsertln(text_win);
        !           949:                }
        !           950:                else
        !           951:                {
        !           952:                        wmove(text_win, 0,0);
        !           953:                        wdeleteln(text_win);
        !           954:                        wmove(text_win, last_line,0);
        !           955:                        wclrtobot(text_win);
        !           956:                }
        !           957:                scr_pos = scr_horz = 0;
        !           958:                if (horiz_offset)
        !           959:                {
        !           960:                        horiz_offset = 0;
        !           961:                        midscreen(scr_vert, point);
        !           962:                }
        !           963:                draw_line(scr_vert, scr_horz, point, position,
        !           964:                        curr_line->line_length);
        !           965:        }
        !           966: }
        !           967:
        !           968: struct text *txtalloc()                /* allocate space for line structure    */
        !           969: {
        !           970:        return((struct text *) malloc(sizeof( struct text)));
        !           971: }
        !           972:
        !           973: wchar_t *next_word(string)             /* move to next word in string          */
        !           974: wchar_t *string;
        !           975: {
        !           976:        while ((*string != '\0') && ((*string != 32) && (*string != 9)))
        !           977:                string++;
        !           978:        while ((*string != '\0') && ((*string == 32) || (*string == 9)))
        !           979:                string++;
        !           980:        return(string);
        !           981: }
        !           982:
        !           983: int watoi(wchar_t *s)
        !           984: {
        !           985:        int x = 0;
        !           986:        while (*s >= '0' && *s <= '9')
        !           987:                x = x * 10 + *s++ - '0';
        !           988:        return x;
        !           989: }
        !           990:
        !           991: void
        !           992: prev_word()    /* move to start of previous word in text       */
        !           993: {
        !           994:        if (position != 1)
        !           995:        {
        !           996:                if ((position != 1) && ((point[-1] == ' ') || (point[-1] == '\t')))
        !           997:                {       /* if at the start of a word    */
        !           998:                        while ((position != 1) && ((*point != ' ') && (*point != '\t')))
        !           999:                                left(TRUE);
        !          1000:                }
        !          1001:                while ((position != 1) && ((*point == ' ') || (*point == '\t')))
        !          1002:                        left(TRUE);
        !          1003:                while ((position != 1) && ((*point != ' ') && (*point != '\t')))
        !          1004:                        left(TRUE);
        !          1005:                if ((position != 1) && ((*point == ' ') || (*point == '\t')))
        !          1006:                        right(TRUE);
        !          1007:        }
        !          1008:        else
        !          1009:                left(TRUE);
        !          1010: }
        !          1011:
        !          1012: void
        !          1013: control()                      /* use control for commands             */
        !          1014: {
        !          1015:        wchar_t *string;
        !          1016:
        !          1017:        if (in == 1)            /* control a    */
        !          1018:        {
        !          1019:                string = get_string(ascii_code_str, TRUE);
        !          1020:                if (*string != '\0')
        !          1021:                {
        !          1022:                        in = watoi(string);
        !          1023:                        wmove(text_win, scr_vert, (scr_horz - horiz_offset));
        !          1024:                        insert(in);
        !          1025:                }
        !          1026:                free(string);
        !          1027:        }
        !          1028:        else if (in == 2)       /* control b    */
        !          1029:                bottom();
        !          1030:        else if (in == 3)       /* control c    */
        !          1031:        {
        !          1032:                command_prompt();
        !          1033:        }
        !          1034:        else if (in == 4)       /* control d    */
        !          1035:                down();
        !          1036:        else if (in == 5)       /* control e    */
        !          1037:                search_prompt();
        !          1038:        else if (in == 6)       /* control f    */
        !          1039:                undel_char();
        !          1040:        else if (in == 7)       /* control g    */
        !          1041:                bol();
        !          1042:        else if (in == 8)       /* control h    */
        !          1043:                delete(TRUE);
        !          1044:        else if (in == 9)       /* control i    */
        !          1045:                ;
        !          1046:        else if (in == 10)      /* control j    */
        !          1047:                insert_line(TRUE);
        !          1048:        else if (in == 11)      /* control k    */
        !          1049:                del_char();
        !          1050:        else if (in == 12)      /* control l    */
        !          1051:                left(TRUE);
        !          1052:        else if (in == 13)      /* control m    */
        !          1053:                insert_line(TRUE);
        !          1054:        else if (in == 14)      /* control n    */
        !          1055:                move_rel('d', max(5, (last_line - 5)));
        !          1056:        else if (in == 15)      /* control o    */
        !          1057:                eol();
        !          1058:        else if (in == 16)      /* control p    */
        !          1059:                move_rel('u', max(5, (last_line - 5)));
        !          1060:        else if (in == 17)      /* control q    */
        !          1061:                ;
        !          1062:        else if (in == 18)      /* control r    */
        !          1063:                right(TRUE);
        !          1064:        else if (in == 19)      /* control s    */
        !          1065:                ;
        !          1066:        else if (in == 20)      /* control t    */
        !          1067:                top();
        !          1068:        else if (in == 21)      /* control u    */
        !          1069:                up();
        !          1070:        else if (in == 22)      /* control v    */
        !          1071:                undel_word();
        !          1072:        else if (in == 23)      /* control w    */
        !          1073:                del_word();
        !          1074:        else if (in == 24)      /* control x    */
        !          1075:                search(TRUE);
        !          1076:        else if (in == 25)      /* control y    */
        !          1077:                del_line();
        !          1078:        else if (in == 26)      /* control z    */
        !          1079:                undel_line();
        !          1080:        else if (in == 27)      /* control [ (escape)   */
        !          1081:        {
        !          1082:                menu_op(main_menu);
        !          1083:        }
        !          1084: }
        !          1085:
        !          1086: /*
        !          1087:  |     Emacs control-key bindings
        !          1088:  */
        !          1089:
        !          1090: void
        !          1091: emacs_control()
        !          1092: {
        !          1093:        wchar_t *string;
        !          1094:
        !          1095:        if (in == 1)            /* control a    */
        !          1096:                bol();
        !          1097:        else if (in == 2)       /* control b    */
        !          1098:                left(TRUE);
        !          1099:        else if (in == 3)       /* control c    */
        !          1100:        {
        !          1101:                command_prompt();
        !          1102:        }
        !          1103:        else if (in == 4)       /* control d    */
        !          1104:                del_char();
        !          1105:        else if (in == 5)       /* control e    */
        !          1106:                eol();
        !          1107:        else if (in == 6)       /* control f    */
        !          1108:                right(TRUE);
        !          1109:        else if (in == 7)       /* control g    */
        !          1110:                move_rel('u', max(5, (last_line - 5)));
        !          1111:        else if (in == 8)       /* control h    */
        !          1112:                delete(TRUE);
        !          1113:        else if (in == 9)       /* control i    */
        !          1114:                ;
        !          1115:        else if (in == 10)      /* control j    */
        !          1116:                undel_char();
        !          1117:        else if (in == 11)      /* control k    */
        !          1118:                del_line();
        !          1119:        else if (in == 12)      /* control l    */
        !          1120:                undel_line();
        !          1121:        else if (in == 13)      /* control m    */
        !          1122:                insert_line(TRUE);
        !          1123:        else if (in == 14)      /* control n    */
        !          1124:                down();
        !          1125:        else if (in == 15)      /* control o    */
        !          1126:        {
        !          1127:                string = get_string(ascii_code_str, TRUE);
        !          1128:                if (*string != '\0')
        !          1129:                {
        !          1130:                        in = watoi(string);
        !          1131:                        wmove(text_win, scr_vert, (scr_horz - horiz_offset));
        !          1132:                        insert(in);
        !          1133:                }
        !          1134:                free(string);
        !          1135:        }
        !          1136:        else if (in == 16)      /* control p    */
        !          1137:                up();
        !          1138:        else if (in == 17)      /* control q    */
        !          1139:                ;
        !          1140:        else if (in == 18)      /* control r    */
        !          1141:                undel_word();
        !          1142:        else if (in == 19)      /* control s    */
        !          1143:                ;
        !          1144:        else if (in == 20)      /* control t    */
        !          1145:                top();
        !          1146:        else if (in == 21)      /* control u    */
        !          1147:                bottom();
        !          1148:        else if (in == 22)      /* control v    */
        !          1149:                move_rel('d', max(5, (last_line - 5)));
        !          1150:        else if (in == 23)      /* control w    */
        !          1151:                del_word();
        !          1152:        else if (in == 24)      /* control x    */
        !          1153:                search(TRUE);
        !          1154:        else if (in == 25)      /* control y    */
        !          1155:                search_prompt();
        !          1156:        else if (in == 26)      /* control z    */
        !          1157:                adv_word();
        !          1158:        else if (in == 27)      /* control [ (escape)   */
        !          1159:        {
        !          1160:                menu_op(main_menu);
        !          1161:        }
        !          1162: }
        !          1163:
        !          1164: void
        !          1165: bottom()                       /* go to bottom of file                 */
        !          1166: {
        !          1167:        while (curr_line->next_line != NULL)
        !          1168:                curr_line = curr_line->next_line;
        !          1169:        point = curr_line->line;
        !          1170:        if (horiz_offset)
        !          1171:                horiz_offset = 0;
        !          1172:        position = 1;
        !          1173:        midscreen(last_line, point);
        !          1174:        scr_pos = scr_horz;
        !          1175: }
        !          1176:
        !          1177: void
        !          1178: top()                          /* go to top of file                    */
        !          1179: {
        !          1180:        while (curr_line->prev_line != NULL)
        !          1181:                curr_line = curr_line->prev_line;
        !          1182:        point = curr_line->line;
        !          1183:        if (horiz_offset)
        !          1184:                horiz_offset = 0;
        !          1185:        position = 1;
        !          1186:        midscreen(0, point);
        !          1187:        scr_pos = scr_horz;
        !          1188: }
        !          1189:
        !          1190: void
        !          1191: nextline()                     /* move pointers to start of next line  */
        !          1192: {
        !          1193:        curr_line = curr_line->next_line;
        !          1194:        point = curr_line->line;
        !          1195:        position = 1;
        !          1196:        if (scr_vert == last_line)
        !          1197:        {
        !          1198:                wmove(text_win, 0,0);
        !          1199:                wdeleteln(text_win);
        !          1200:                wmove(text_win, last_line,0);
        !          1201:                wclrtobot(text_win);
        !          1202:                draw_line(last_line,0,point,1,curr_line->line_length);
        !          1203:        }
        !          1204:        else
        !          1205:                scr_vert++;
        !          1206: }
        !          1207:
        !          1208: void
        !          1209: prevline()                     /* move pointers to start of previous line*/
        !          1210: {
        !          1211:        curr_line = curr_line->prev_line;
        !          1212:        point = curr_line->line;
        !          1213:        position = 1;
        !          1214:        if (scr_vert == 0)
        !          1215:        {
        !          1216:                winsertln(text_win);
        !          1217:                draw_line(0,0,point,1,curr_line->line_length);
        !          1218:        }
        !          1219:        else
        !          1220:                scr_vert--;
        !          1221:        while (position < curr_line->line_length)
        !          1222:        {
        !          1223:                position++;
        !          1224:                point++;
        !          1225:        }
        !          1226: }
        !          1227:
        !          1228: void
        !          1229: left(disp)                             /* move left one character      */
        !          1230: int disp;
        !          1231: {
        !          1232:        if (point != curr_line->line)   /* if not at begin of line      */
        !          1233:        {
        !          1234:                point--;
        !          1235:                position--;
        !          1236:                scanline(point);
        !          1237:                wmove(text_win, scr_vert, (scr_horz - horiz_offset));
        !          1238:                scr_pos = scr_horz;
        !          1239:        }
        !          1240:        else if (curr_line->prev_line != NULL)
        !          1241:        {
        !          1242:                if (!disp)
        !          1243:                {
        !          1244:                        curr_line = curr_line->prev_line;
        !          1245:                        point = curr_line->line + curr_line->line_length;
        !          1246:                        position = curr_line->line_length;
        !          1247:                        return;
        !          1248:                }
        !          1249:                position = 1;
        !          1250:                prevline();
        !          1251:                scanline(point);
        !          1252:                scr_pos = scr_horz;
        !          1253:                wmove(text_win, scr_vert, (scr_horz - horiz_offset));
        !          1254:        }
        !          1255: }
        !          1256:
        !          1257: void
        !          1258: right(disp)                            /* move right one character     */
        !          1259: int disp;
        !          1260: {
        !          1261:        if (position < curr_line->line_length)
        !          1262:        {
        !          1263:                point++;
        !          1264:                position++;
        !          1265:                scanline(point);
        !          1266:                wmove(text_win, scr_vert, (scr_horz - horiz_offset));
        !          1267:                scr_pos = scr_horz;
        !          1268:        }
        !          1269:        else if (curr_line->next_line != NULL)
        !          1270:        {
        !          1271:                if (!disp)
        !          1272:                {
        !          1273:                        curr_line = curr_line->next_line;
        !          1274:                        point = curr_line->line;
        !          1275:                        position = 1;
        !          1276:                        return;
        !          1277:                }
        !          1278:                nextline();
        !          1279:                scr_pos = scr_horz = 0;
        !          1280:                if (horiz_offset)
        !          1281:                {
        !          1282:                        horiz_offset = 0;
        !          1283:                        midscreen(scr_vert, point);
        !          1284:                }
        !          1285:                wmove(text_win, scr_vert, (scr_horz - horiz_offset));
        !          1286:                position = 1;
        !          1287:        }
        !          1288: }
        !          1289:
        !          1290: void
        !          1291: find_pos()             /* move to the same column as on other line     */
        !          1292: {
        !          1293:        scr_horz = 0;
        !          1294:        position = 1;
        !          1295:        while ((scr_horz < scr_pos) && (position < curr_line->line_length))
        !          1296:        {
        !          1297:                if (*point == 9)
        !          1298:                        scr_horz += tabshift(scr_horz);
        !          1299:                else if (*point < ' ')
        !          1300:                        scr_horz += 2;
        !          1301:                else if ((*point > 127) && ((curr_line->line_length - position) >= 2))
        !          1302:                {
        !          1303:                        scr_horz += 2;
        !          1304:                        point++;
        !          1305:                        position++;
        !          1306:                }
        !          1307:                else
        !          1308:                        scr_horz++;
        !          1309:                position++;
        !          1310:                point++;
        !          1311:        }
        !          1312:        if ((scr_horz - horiz_offset) > last_col)
        !          1313:        {
        !          1314:                horiz_offset = (scr_horz - (scr_horz % 8)) - (COLS - 8);
        !          1315:                midscreen(scr_vert, point);
        !          1316:        }
        !          1317:        else if (scr_horz < horiz_offset)
        !          1318:        {
        !          1319:                horiz_offset = max(0, (scr_horz - (scr_horz % 8)));
        !          1320:                midscreen(scr_vert, point);
        !          1321:        }
        !          1322:        wmove(text_win, scr_vert, (scr_horz - horiz_offset));
        !          1323: }
        !          1324:
        !          1325: void
        !          1326: up()                                   /* move up one line             */
        !          1327: {
        !          1328:        if (curr_line->prev_line != NULL)
        !          1329:        {
        !          1330:                prevline();
        !          1331:                point = curr_line->line;
        !          1332:                find_pos();
        !          1333:        }
        !          1334: }
        !          1335:
        !          1336: void
        !          1337: down()                                 /* move down one line           */
        !          1338: {
        !          1339:        if (curr_line->next_line != NULL)
        !          1340:        {
        !          1341:                nextline();
        !          1342:                find_pos();
        !          1343:        }
        !          1344: }
        !          1345:
        !          1346: void
        !          1347: function_key()                         /* process function key         */
        !          1348: {
        !          1349:        if (in == KEY_LEFT)
        !          1350:                left(TRUE);
        !          1351:        else if (in == KEY_RIGHT)
        !          1352:                right(TRUE);
        !          1353:        else if ( in == KEY_HOME)
        !          1354:                top();
        !          1355:        else if ( in == KEY_UP)
        !          1356:                up();
        !          1357:        else if (in == KEY_DOWN)
        !          1358:                down();
        !          1359:        else if (in == KEY_NPAGE)
        !          1360:                move_rel('d', max( 5, (last_line - 5)));
        !          1361:        else if (in == KEY_PPAGE)
        !          1362:                move_rel('u', max(5, (last_line - 5)));
        !          1363:        else if (in == KEY_DL)
        !          1364:                del_line();
        !          1365:        else if (in == KEY_DC)
        !          1366:                del_char();
        !          1367:        else if (in == KEY_BACKSPACE)
        !          1368:                delete(TRUE);
        !          1369:        else if (in == KEY_IL)
        !          1370:        {               /* insert a line before current line    */
        !          1371:                insert_line(TRUE);
        !          1372:                left(TRUE);
        !          1373:        }
        !          1374:        else if (in == KEY_F(1))
        !          1375:                gold = !gold;
        !          1376:        else if (in == KEY_F(2))
        !          1377:        {
        !          1378:                if (gold)
        !          1379:                {
        !          1380:                        gold = FALSE;
        !          1381:                        undel_line();
        !          1382:                }
        !          1383:                else
        !          1384:                        undel_char();
        !          1385:        }
        !          1386:        else if (in == KEY_F(3))
        !          1387:        {
        !          1388:                if (gold)
        !          1389:                {
        !          1390:                        gold = FALSE;
        !          1391:                        undel_word();
        !          1392:                }
        !          1393:                else
        !          1394:                        del_word();
        !          1395:        }
        !          1396:        else if (in == KEY_F(4))
        !          1397:        {
        !          1398:                if (gold)
        !          1399:                {
        !          1400:                        gold = FALSE;
        !          1401:                        paint_info_win();
        !          1402:                        midscreen(scr_vert, point);
        !          1403:                }
        !          1404:                else
        !          1405:                        adv_word();
        !          1406:        }
        !          1407:        else if (in == KEY_F(5))
        !          1408:        {
        !          1409:                if (gold)
        !          1410:                {
        !          1411:                        gold = FALSE;
        !          1412:                        search_prompt();
        !          1413:                }
        !          1414:                else
        !          1415:                        search(TRUE);
        !          1416:        }
        !          1417:        else if (in == KEY_F(6))
        !          1418:        {
        !          1419:                if (gold)
        !          1420:                {
        !          1421:                        gold = FALSE;
        !          1422:                        bottom();
        !          1423:                }
        !          1424:                else
        !          1425:                        top();
        !          1426:        }
        !          1427:        else if (in == KEY_F(7))
        !          1428:        {
        !          1429:                if (gold)
        !          1430:                {
        !          1431:                        gold = FALSE;
        !          1432:                        eol();
        !          1433:                }
        !          1434:                else
        !          1435:                        bol();
        !          1436:        }
        !          1437:        else if (in == KEY_F(8))
        !          1438:        {
        !          1439:                if (gold)
        !          1440:                {
        !          1441:                        gold = FALSE;
        !          1442:                        command_prompt();
        !          1443:                }
        !          1444:                else
        !          1445:                        adv_line();
        !          1446:        }
        !          1447: }
        !          1448:
        !          1449: void
        !          1450: command_prompt()
        !          1451: {
        !          1452:        wchar_t *cmd_str;
        !          1453:        int result;
        !          1454:
        !          1455:        info_type = COMMANDS;
        !          1456:        paint_info_win();
        !          1457:        cmd_str = get_string(command_str, TRUE);
        !          1458:        if ((result = unique_test(cmd_str, commands)) != 1)
        !          1459:        {
        !          1460:                werase(com_win);
        !          1461:                wmove(com_win, 0, 0);
        !          1462:                if (result == 0)
        !          1463:                        wprintw(com_win, unkn_cmd_str, cmd_str);
        !          1464:                else
        !          1465:                        wprintw(com_win, "%S", non_unique_cmd_msg);
        !          1466:
        !          1467:                wrefresh(com_win);
        !          1468:
        !          1469:                info_type = CONTROL_KEYS;
        !          1470:                paint_info_win();
        !          1471:
        !          1472:                if (cmd_str != NULL)
        !          1473:                        free(cmd_str);
        !          1474:                return;
        !          1475:        }
        !          1476:        command(cmd_str);
        !          1477:        wrefresh(com_win);
        !          1478:        wmove(text_win, scr_vert, (scr_horz - horiz_offset));
        !          1479:        info_type = CONTROL_KEYS;
        !          1480:        paint_info_win();
        !          1481:        if (cmd_str != NULL)
        !          1482:                free(cmd_str);
        !          1483: }
        !          1484:
        !          1485: void command(wchar_t *cmd_str1)                /* process commands from keyboard       */
        !          1486: {
        !          1487:        wchar_t *cmd_str2 = NULL;
        !          1488:        wchar_t *cmd_str = cmd_str1;
        !          1489:
        !          1490:        clear_com_win = TRUE;
        !          1491:        if (compare(cmd_str, HELP, FALSE))
        !          1492:                help();
        !          1493:        else if (compare(cmd_str, LINE, FALSE))
        !          1494:        {
        !          1495:                wmove(com_win, 0, 0);
        !          1496:                wclrtoeol(com_win);
        !          1497:                wprintw(com_win, line_num_str, curr_line->line_number);
        !          1498:                wprintw(com_win, line_len_str, curr_line->line_length);
        !          1499:        }
        !          1500:        else if (compare(cmd_str, FILE_str, FALSE))
        !          1501:        {
        !          1502:                wmove(com_win, 0, 0);
        !          1503:                wclrtoeol(com_win);
        !          1504:                if (in_file_name == NULL)
        !          1505:                        wprintw(com_win, no_file_string);
        !          1506:                else
        !          1507:                        wprintw(com_win, current_file_str, in_file_name);
        !          1508:        }
        !          1509:        else if ((*cmd_str >= '0') && (*cmd_str <= '9'))
        !          1510:                goto_line(cmd_str);
        !          1511:        else if (compare(cmd_str, CHARACTER, FALSE))
        !          1512:        {
        !          1513:                wmove(com_win, 0, 0);
        !          1514:                wclrtoeol(com_win);
        !          1515:                wprintw(com_win, char_str, *point);
        !          1516:        }
        !          1517:        else if (compare(cmd_str, REDRAW, FALSE))
        !          1518:                redraw();
        !          1519:        else if (compare(cmd_str, RESEQUENCE, FALSE))
        !          1520:        {
        !          1521:                tmp_line = first_line->next_line;
        !          1522:                while (tmp_line != NULL)
        !          1523:                {
        !          1524:                tmp_line->line_number = tmp_line->prev_line->line_number + 1;
        !          1525:                        tmp_line = tmp_line->next_line;
        !          1526:                }
        !          1527:        }
        !          1528:        else if (compare(cmd_str, SAVE, FALSE))
        !          1529:          write_file(tmp_file, -1);
        !          1530:        else if (compare(cmd_str, AUTHOR, FALSE))
        !          1531:        {
        !          1532:                wmove(com_win, 0, 0);
        !          1533:                wclrtoeol(com_win);
        !          1534:                wprintw(com_win, "written by Hugh Mahon");
        !          1535:        }
        !          1536:        else if (compare(cmd_str, ee_VERSION, FALSE))
        !          1537:        {
        !          1538:                wmove(com_win, 0, 0);
        !          1539:                wclrtoeol(com_win);
        !          1540:                wprintw(com_win, "%s", version);
        !          1541:        }
        !          1542:        else if (compare(cmd_str, CASE, FALSE))
        !          1543:                case_sen = TRUE;
        !          1544:        else if (compare(cmd_str, NOCASE, FALSE))
        !          1545:                case_sen = FALSE;
        !          1546:        else if (compare(cmd_str, EXPAND, FALSE))
        !          1547:                expand_tabs = TRUE;
        !          1548:        else if (compare(cmd_str, NOEXPAND, FALSE))
        !          1549:                expand_tabs = FALSE;
        !          1550:        else if (compare(cmd_str, Exit_string, FALSE))
        !          1551:                ee_finish();
        !          1552:        else if (compare(cmd_str, QUIT_string, FALSE))
        !          1553:                quit(0);
        !          1554:        else if ((*cmd_str == '<') && (!in_pipe))
        !          1555:        {
        !          1556:                in_pipe = TRUE;
        !          1557:                cmd_str++;
        !          1558:                if ((*cmd_str == ' ') || (*cmd_str == '\t'))
        !          1559:                        cmd_str = next_word((wchar_t*)cmd_str);
        !          1560:                command(cmd_str);
        !          1561:                in_pipe = FALSE;
        !          1562:        }
        !          1563:        else if ((*cmd_str == '>') && (!out_pipe))
        !          1564:        {
        !          1565:                out_pipe = TRUE;
        !          1566:                cmd_str++;
        !          1567:                if ((*cmd_str == ' ') || (*cmd_str == '\t'))
        !          1568:                        cmd_str = next_word((wchar_t*)cmd_str);
        !          1569:                command(cmd_str);
        !          1570:                out_pipe = FALSE;
        !          1571:        }
        !          1572:        else
        !          1573:        {
        !          1574:                wmove(com_win, 0, 0);
        !          1575:                wclrtoeol(com_win);
        !          1576:                wprintw(com_win, unkn_cmd_str, cmd_str);
        !          1577:        }
        !          1578:        if (cmd_str2 != NULL)
        !          1579:                free(cmd_str2);
        !          1580: }
        !          1581:
        !          1582: int
        !          1583: scan(line, offset, column)     /* determine horizontal position for get_string */
        !          1584: wchar_t *line;
        !          1585: int offset;
        !          1586: int column;
        !          1587: {
        !          1588:        wchar_t *stemp;
        !          1589:        int i;
        !          1590:        int j;
        !          1591:
        !          1592:        stemp = line;
        !          1593:        i = 0;
        !          1594:        j = column;
        !          1595:        while (i < offset)
        !          1596:        {
        !          1597:                i++;
        !          1598:                j += len_char(*stemp, j);
        !          1599:                stemp++;
        !          1600:        }
        !          1601:        return(j);
        !          1602: }
        !          1603:
        !          1604: wchar_t *
        !          1605: get_string(prompt, advance)    /* read string from input on command line */
        !          1606: wchar_t *prompt;               /* string containing user prompt message        */
        !          1607: int advance;           /* if true, skip leading spaces and tabs        */
        !          1608: {
        !          1609:        wchar_t *string;
        !          1610:        wchar_t *tmp_string;
        !          1611:        wchar_t *nam_str;
        !          1612:        wchar_t *g_point;
        !          1613:        int tmp_int;
        !          1614:        int g_horz, g_position, g_pos;
        !          1615:        int esc_flag;
        !          1616:
        !          1617:        g_point = tmp_string = malloc(512 * sizeof(wchar_t));
        !          1618:        wmove(com_win,0,0);
        !          1619:        wclrtoeol(com_win);
        !          1620:        waddwstr(com_win, prompt);
        !          1621:        wrefresh(com_win);
        !          1622:        nam_str = tmp_string;
        !          1623:        clear_com_win = TRUE;
        !          1624:        g_horz = g_position = scan(prompt, wcslen(prompt), 0);
        !          1625:        g_pos = 0;
        !          1626:        do
        !          1627:        {
        !          1628:                int keyt;
        !          1629:                esc_flag = FALSE;
        !          1630:                keyt = wget_wch(com_win, &in);
        !          1631:                if (keyt == ERR)
        !          1632:                        exit(0);
        !          1633:                if (keyt == KEY_CODE_YES)
        !          1634:                {
        !          1635:                        if (in == KEY_BACKSPACE)
        !          1636:                                in = 8;
        !          1637:                        else
        !          1638:                                continue;
        !          1639:                }
        !          1640:                if (((in == 8) || (in == 127)) && (g_pos > 0))
        !          1641:                {
        !          1642:                        tmp_int = g_horz;
        !          1643:                        g_pos--;
        !          1644:                        g_horz = scan(g_point, g_pos, g_position);
        !          1645:                        tmp_int = tmp_int - g_horz;
        !          1646:                        for (; 0 < tmp_int; tmp_int--)
        !          1647:                        {
        !          1648:                                if ((g_horz+tmp_int) < (last_col - 1))
        !          1649:                                {
        !          1650:                                        waddch(com_win, '\010');
        !          1651:                                        waddch(com_win, ' ');
        !          1652:                                        waddch(com_win, '\010');
        !          1653:                                }
        !          1654:                        }
        !          1655:                        nam_str--;
        !          1656:                }
        !          1657:                else if ((in != 8) && (in != 127) && (in != '\n') && (in != '\r'))
        !          1658:                {
        !          1659:                        if (in == '\026')       /* control-v, accept next character verbatim    */
        !          1660:                        {                       /* allows entry of ^m, ^j, and ^h       */
        !          1661:                                int keyt;
        !          1662:                                esc_flag = TRUE;
        !          1663:                                do
        !          1664:                                {
        !          1665:                                        keyt = wget_wch(com_win, &in);
        !          1666:
        !          1667:                                        if (keyt == ERR)
        !          1668:                                                exit(0);
        !          1669:                                } while (keyt != OK);
        !          1670:                        }
        !          1671:                        *nam_str = in;
        !          1672:                        g_pos++;
        !          1673:                        if (in < ' ')
        !          1674:                                g_horz += out_char(com_win, in, g_horz);
        !          1675:                        else
        !          1676:                        {
        !          1677:                                g_horz++;
        !          1678:                                if (g_horz < (last_col - 1))
        !          1679:                                        waddnwstr(com_win, &in, 1);
        !          1680:                        }
        !          1681:                        nam_str++;
        !          1682:                }
        !          1683:                wrefresh(com_win);
        !          1684:                if (esc_flag)
        !          1685:                        in = '\0';
        !          1686:        } while ((in != '\n') && (in != '\r'));
        !          1687:        *nam_str = '\0';
        !          1688:        nam_str = tmp_string;
        !          1689:        if (((*nam_str == ' ') || (*nam_str == 9)) && (advance))
        !          1690:                nam_str = next_word(nam_str);
        !          1691:        string = malloc((wcslen(nam_str) + 1) * sizeof(wchar_t));
        !          1692:        wcscpy(string, nam_str);
        !          1693:        free(tmp_string);
        !          1694:        wrefresh(com_win);
        !          1695:        return(string);
        !          1696: }
        !          1697:
        !          1698: int
        !          1699: compare(string1, string2, sensitive)   /* compare two strings  */
        !          1700: wchar_t *string1;
        !          1701: wchar_t *string2;
        !          1702: int sensitive;
        !          1703: {
        !          1704:        wchar_t *strng1;
        !          1705:        wchar_t *strng2;
        !          1706:        int tmp;
        !          1707:        int equal;
        !          1708:
        !          1709:        strng1 = string1;
        !          1710:        strng2 = string2;
        !          1711:        tmp = 0;
        !          1712:        if ((strng1 == NULL) || (strng2 == NULL) || (*strng1 == '\0') || (*strng2 == '\0'))
        !          1713:                return(FALSE);
        !          1714:        equal = TRUE;
        !          1715:        while (equal)
        !          1716:        {
        !          1717:                if (sensitive)
        !          1718:                {
        !          1719:                        if (*strng1 != *strng2)
        !          1720:                                equal = FALSE;
        !          1721:                }
        !          1722:                else
        !          1723:                {
        !          1724:                        if (toupper(*strng1) != toupper(*strng2))
        !          1725:                                equal = FALSE;
        !          1726:                }
        !          1727:                strng1++;
        !          1728:                strng2++;
        !          1729:                if ((*strng1 == '\0') || (*strng2 == '\0') || (*strng1 == ' ') || (*strng2 == ' '))
        !          1730:                        break;
        !          1731:                tmp++;
        !          1732:        }
        !          1733:        return(equal);
        !          1734: }
        !          1735:
        !          1736: void goto_line(wchar_t *cmd_str)
        !          1737: {
        !          1738:        int number;
        !          1739:        int i;
        !          1740:        wchar_t *ptr;
        !          1741:        char direction = 0;
        !          1742:        struct text *t_line;
        !          1743:
        !          1744:        ptr = cmd_str;
        !          1745:        i= 0;
        !          1746:        while ((*ptr >='0') && (*ptr <= '9'))
        !          1747:        {
        !          1748:                i= i * 10 + (*ptr - '0');
        !          1749:                ptr++;
        !          1750:        }
        !          1751:        number = i;
        !          1752:        i = 0;
        !          1753:        t_line = curr_line;
        !          1754:        while ((t_line->line_number > number) && (t_line->prev_line != NULL))
        !          1755:        {
        !          1756:                i++;
        !          1757:                t_line = t_line->prev_line;
        !          1758:                direction = 'u';
        !          1759:        }
        !          1760:        while ((t_line->line_number < number) && (t_line->next_line != NULL))
        !          1761:        {
        !          1762:                i++;
        !          1763:                direction = 'd';
        !          1764:                t_line = t_line->next_line;
        !          1765:        }
        !          1766:        if ((i < 30) && (i > 0))
        !          1767:        {
        !          1768:                move_rel(direction, i);
        !          1769:        }
        !          1770:        else
        !          1771:        {
        !          1772:                curr_line = t_line;
        !          1773:                point = curr_line->line;
        !          1774:                position = 1;
        !          1775:                midscreen((last_line / 2), point);
        !          1776:                scr_pos = scr_horz;
        !          1777:        }
        !          1778:        wmove(com_win, 0, 0);
        !          1779:        wclrtoeol(com_win);
        !          1780:        wprintw(com_win, line_num_str, curr_line->line_number);
        !          1781:        wmove(text_win, scr_vert, (scr_horz - horiz_offset));
        !          1782: }
        !          1783:
        !          1784: void
        !          1785: midscreen(line, pnt)   /* put current line in middle of screen */
        !          1786: int line;
        !          1787: wchar_t *pnt;
        !          1788: {
        !          1789:        struct text *mid_line;
        !          1790:        int i;
        !          1791:
        !          1792:        line = min(line, last_line);
        !          1793:        mid_line = curr_line;
        !          1794:        for (i = 0; ((i < line) && (curr_line->prev_line != NULL)); i++)
        !          1795:                curr_line = curr_line->prev_line;
        !          1796:        scr_vert = scr_horz = 0;
        !          1797:        wmove(text_win, 0, 0);
        !          1798:        draw_screen();
        !          1799:        scr_vert = i;
        !          1800:        curr_line = mid_line;
        !          1801:        scanline(pnt);
        !          1802:        wmove(text_win, scr_vert, (scr_horz - horiz_offset));
        !          1803: }
        !          1804:
        !          1805: void
        !          1806: check_fp()             /* open or close files according to flags */
        !          1807: {
        !          1808:        int line_num;
        !          1809:        int temp;
        !          1810:        struct stat buf;
        !          1811:
        !          1812:        clear_com_win = TRUE;
        !          1813:        tmp_vert = scr_vert;
        !          1814:        tmp_horz = scr_horz;
        !          1815:        tmp_line = curr_line;
        !          1816:        if (input_file)
        !          1817:                in_file_name = tmp_file;
        !          1818:
        !          1819:        temp = stat(tmp_file, &buf);
        !          1820:        buf.st_mode &= ~07777;
        !          1821:        if ((temp != -1) && (buf.st_mode != 0100000) && (buf.st_mode != 0))
        !          1822:        {
        !          1823:                wprintw(com_win, file_is_dir_msg, tmp_file);
        !          1824:                wrefresh(com_win);
        !          1825:                if (input_file)
        !          1826:                {
        !          1827:                        quit(0);
        !          1828:                        return;
        !          1829:                }
        !          1830:                else
        !          1831:                        return;
        !          1832:        }
        !          1833:        if ((get_fd = open(tmp_file, O_RDONLY)) == -1)
        !          1834:        {
        !          1835:                wmove(com_win, 0, 0);
        !          1836:                wclrtoeol(com_win);
        !          1837:                if (input_file)
        !          1838:                        wprintw(com_win, new_file_msg, tmp_file);
        !          1839:                else
        !          1840:                        wprintw(com_win, cant_open_msg, tmp_file);
        !          1841:                wrefresh(com_win);
        !          1842:                wmove(text_win, scr_vert, (scr_horz - horiz_offset));
        !          1843:                wrefresh(text_win);
        !          1844:                recv_file = FALSE;
        !          1845:                input_file = FALSE;
        !          1846:                return;
        !          1847:        }
        !          1848:        else
        !          1849:                get_file(tmp_file);
        !          1850:
        !          1851:        recv_file = FALSE;
        !          1852:        line_num = curr_line->line_number;
        !          1853:        scr_vert = tmp_vert;
        !          1854:        scr_horz = tmp_horz;
        !          1855:        if (input_file)
        !          1856:                curr_line= first_line;
        !          1857:        else
        !          1858:                curr_line = tmp_line;
        !          1859:        point = curr_line->line;
        !          1860:        draw_screen();
        !          1861:        if (input_file)
        !          1862:        {
        !          1863:                input_file = FALSE;
        !          1864:                if (start_at_line != NULL)
        !          1865:                {
        !          1866:                        line_num = watoi(start_at_line) - 1;
        !          1867:                        move_rel('d', line_num);
        !          1868:                        line_num = 0;
        !          1869:                        start_at_line = NULL;
        !          1870:                }
        !          1871:        }
        !          1872:        else
        !          1873:        {
        !          1874:                wmove(com_win, 0, 0);
        !          1875:                wclrtoeol(com_win);
        !          1876:                text_changes = TRUE;
        !          1877:                if ((tmp_file != NULL) && (*tmp_file != '\0'))
        !          1878:                        wprintw(com_win, file_read_fin_msg, tmp_file);
        !          1879:        }
        !          1880:        wrefresh(com_win);
        !          1881:        wmove(text_win, scr_vert, (scr_horz - horiz_offset));
        !          1882:        wrefresh(text_win);
        !          1883: }
        !          1884:
        !          1885: void
        !          1886: get_file(file_name)    /* read specified file into current buffer      */
        !          1887: char *file_name;
        !          1888: {
        !          1889:        int can_read;           /* file has at least one character      */
        !          1890:        int length;             /* length of line read by read          */
        !          1891:        int append;             /* should text be appended to current line */
        !          1892:        struct text *temp_line;
        !          1893:        char ro_flag = FALSE;
        !          1894:        char in_string[MAX_FILE+1];
        !          1895:
        !          1896:        if (recv_file)          /* if reading a file                    */
        !          1897:        {
        !          1898:                wmove(com_win, 0, 0);
        !          1899:                wclrtoeol(com_win);
        !          1900:                wprintw(com_win, reading_file_msg, file_name);
        !          1901:                if (access(file_name, 2))       /* check permission to write */
        !          1902:                {
        !          1903:                        if ((errno == ENOTDIR) || (errno == EACCES) || (errno == EROFS) || (errno == ETXTBSY) || (errno == EFAULT))
        !          1904:                        {
        !          1905:                                wprintw(com_win, read_only_msg);
        !          1906:                                ro_flag = TRUE;
        !          1907:                        }
        !          1908:                }
        !          1909:                wrefresh(com_win);
        !          1910:        }
        !          1911:        if (curr_line->line_length > 1) /* if current line is not blank */
        !          1912:        {
        !          1913:                insert_line(FALSE);
        !          1914:                left(FALSE);
        !          1915:                append = FALSE;
        !          1916:        }
        !          1917:        else
        !          1918:                append = TRUE;
        !          1919:        can_read = FALSE;               /* test if file has any characters  */
        !          1920:        length = read(get_fd, in_string, sizeof(in_string) - 1);
        !          1921:        // in DGL, config files are better capped
        !          1922:        if (length != -1)
        !          1923:        {
        !          1924:                can_read = TRUE;  /* if set file has at least 1 character   */
        !          1925:                in_string[length] = 0;
        !          1926:                get_line(length, in_string, &append);
        !          1927:        }
        !          1928:        if ((can_read) && (curr_line->line_length == 1) && (curr_line->prev_line))
        !          1929:        {
        !          1930:                temp_line = curr_line->prev_line;
        !          1931:                temp_line->next_line = curr_line->next_line;
        !          1932:                if (temp_line->next_line != NULL)
        !          1933:                        temp_line->next_line->prev_line = temp_line;
        !          1934:                if (curr_line->line != NULL)
        !          1935:                        free(curr_line->line);
        !          1936:                free(curr_line);
        !          1937:                curr_line = temp_line;
        !          1938:        }
        !          1939:        if (input_file) /* if this is the file to be edited display number of lines     */
        !          1940:        {
        !          1941:                wmove(com_win, 0, 0);
        !          1942:                wclrtoeol(com_win);
        !          1943:                wprintw(com_win, file_read_lines_msg, in_file_name, curr_line->line_number);
        !          1944:                if (ro_flag)
        !          1945:                        wprintw(com_win, read_only_msg);
        !          1946:                wrefresh(com_win);
        !          1947:        }
        !          1948:        else if (can_read)      /* not input_file and file is non-zero size */
        !          1949:                text_changes = TRUE;
        !          1950:
        !          1951:        if (recv_file)          /* if reading a file                    */
        !          1952:        {
        !          1953:                in = EOF;
        !          1954:        }
        !          1955: }
        !          1956:
        !          1957: void
        !          1958: get_line(length, in_str, append)       /* read string and split into lines */
        !          1959: int length;            /* length of string read by read                */
        !          1960: char *in_str;          /* string read by read                          */
        !          1961: int *append;   /* TRUE if must append more text to end of current line */
        !          1962: {
        !          1963:        wchar_t *str1;
        !          1964:        wchar_t *str2;
        !          1965:        int num;                /* offset from start of string          */
        !          1966:        int char_count;         /* length of new line (or added portion */
        !          1967:        int temp_counter;       /* temporary counter value              */
        !          1968:        struct text *tline;     /* temporary pointer to new line        */
        !          1969:        int first_time;         /* if TRUE, the first time through the loop */
        !          1970:        wchar_t in_string[MAX_FILE];
        !          1971:        length = mbstowcs(in_string, in_str, sizeof(in_string)/sizeof(wchar_t));
        !          1972:
        !          1973:        if (length == -1) {
        !          1974:            wmove(com_win, 0, 0);
        !          1975:            wprintw(com_win, "ERROR: Encountered a strange character. --more--");
        !          1976:            wclrtoeol(com_win);
        !          1977:            wrefresh(com_win);
        !          1978:            (void) wget_wch(com_win, &in);
        !          1979:            resetty();
        !          1980:            endwin();
        !          1981:            exit(0);
        !          1982:        }
        !          1983:
        !          1984:        str2 = in_string;
        !          1985:        num = 0;
        !          1986:        first_time = TRUE;
        !          1987:        while (num < length)
        !          1988:        {
        !          1989:                if (!first_time)
        !          1990:                {
        !          1991:                        if (num < length)
        !          1992:                        {
        !          1993:                                str2++;
        !          1994:                                num++;
        !          1995:                        }
        !          1996:                }
        !          1997:                else
        !          1998:                        first_time = FALSE;
        !          1999:                str1 = str2;
        !          2000:                char_count = 1;
        !          2001:                /* find end of line     */
        !          2002:                while ((*str2 != '\n') && (num < length))
        !          2003:                {
        !          2004:                        str2++;
        !          2005:                        num++;
        !          2006:                        char_count++;
        !          2007:                }
        !          2008:                if (!(*append)) /* if not append to current line, insert new one */
        !          2009:                {
        !          2010:                        tline = txtalloc();     /* allocate data structure for next line */
        !          2011:                        tline->line_number = curr_line->line_number + 1;
        !          2012:                        tline->next_line = curr_line->next_line;
        !          2013:                        tline->prev_line = curr_line;
        !          2014:                        curr_line->next_line = tline;
        !          2015:                        if (tline->next_line != NULL)
        !          2016:                                tline->next_line->prev_line = tline;
        !          2017:                        curr_line = tline;
        !          2018:                        curr_line->line = point = (wchar_t *) malloc(char_count * sizeof(wchar_t));
        !          2019:                        curr_line->line_length = char_count;
        !          2020:                        curr_line->max_length = char_count;
        !          2021:                }
        !          2022:                else
        !          2023:                {
        !          2024:                        point = resiz_line(char_count, curr_line, curr_line->line_length);
        !          2025:                        curr_line->line_length += (char_count - 1);
        !          2026:                }
        !          2027:                for (temp_counter = 1; temp_counter < char_count; temp_counter++)
        !          2028:                {
        !          2029:                        *point = *str1;
        !          2030:                        point++;
        !          2031:                        str1++;
        !          2032:                }
        !          2033:                *point = '\0';
        !          2034:                *append = FALSE;
        !          2035:                if ((num == length) && (*str2 != '\n'))
        !          2036:                        *append = TRUE;
        !          2037:        }
        !          2038: }
        !          2039:
        !          2040: void
        !          2041: draw_screen()          /* redraw the screen from current postion       */
        !          2042: {
        !          2043:        struct text *temp_line;
        !          2044:        wchar_t *line_out;
        !          2045:        int temp_vert;
        !          2046:
        !          2047:        temp_line = curr_line;
        !          2048:        temp_vert = scr_vert;
        !          2049:        wclrtobot(text_win);
        !          2050:        while ((temp_line != NULL) && (temp_vert <= last_line))
        !          2051:        {
        !          2052:                line_out = temp_line->line;
        !          2053:                draw_line(temp_vert, 0, line_out, 1, temp_line->line_length);
        !          2054:                temp_vert++;
        !          2055:                temp_line = temp_line->next_line;
        !          2056:        }
        !          2057:        wmove(text_win, temp_vert, 0);
        !          2058:        wmove(text_win, scr_vert, (scr_horz - horiz_offset));
        !          2059: }
        !          2060:
        !          2061: void
        !          2062: ee_finish()    /* prepare to exit edit session */
        !          2063: {
        !          2064:        char *file_name = in_file_name;
        !          2065:
        !          2066:        /*
        !          2067:         |      changes made here should be reflected in the 'save'
        !          2068:         |      portion of file_op()
        !          2069:         */
        !          2070:
        !          2071: //     if ((file_name == NULL) || (*file_name == '\0'))
        !          2072: //             file_name = get_string(save_file_name_prompt, TRUE);
        !          2073:
        !          2074:        if ((file_name == NULL) || (*file_name == '\0'))
        !          2075:        {
        !          2076:                wmove(com_win, 0, 0);
        !          2077:                wprintw(com_win, file_not_saved_msg);
        !          2078:                wclrtoeol(com_win);
        !          2079:                wrefresh(com_win);
        !          2080:                clear_com_win = TRUE;
        !          2081:                return;
        !          2082:        }
        !          2083:
        !          2084:        if (write_file(file_name, -1))
        !          2085:        {
        !          2086:                text_changes = FALSE;
        !          2087:                quit(0);
        !          2088:        }
        !          2089: }
        !          2090:
        !          2091: int
        !          2092: quit(noverify)         /* exit editor                  */
        !          2093: int noverify;
        !          2094: {
        !          2095:        wchar_t *ans;
        !          2096:
        !          2097:        touchwin(text_win);
        !          2098:        wrefresh(text_win);
        !          2099:        if ((text_changes) && (!noverify))
        !          2100:        {
        !          2101:                ans = get_string(changes_made_prompt, TRUE);
        !          2102:                if (toupper(*ans) == toupper(*yes_char))
        !          2103:                        text_changes = FALSE;
        !          2104:                else
        !          2105:                        return(0);
        !          2106:                free(ans);
        !          2107:        }
        !          2108:
        !          2109:        if (info_window)
        !          2110:          wrefresh(info_win);
        !          2111:        wrefresh(com_win);
        !          2112:        resetty();
        !          2113:        endwin();
        !          2114:        putchar('\n');
        !          2115:        exit(0);
        !          2116: }
        !          2117:
        !          2118: void
        !          2119: edit_abort(arg)
        !          2120: int arg;
        !          2121: {
        !          2122:        wrefresh(com_win);
        !          2123:        resetty();
        !          2124:        endwin();
        !          2125:        putchar('\n');
        !          2126:        exit(1);
        !          2127: }
        !          2128:
        !          2129: void
        !          2130: delete_text()
        !          2131: {
        !          2132:        while (curr_line->next_line != NULL)
        !          2133:                curr_line = curr_line->next_line;
        !          2134:        while (curr_line != first_line)
        !          2135:        {
        !          2136:                free(curr_line->line);
        !          2137:                curr_line = curr_line->prev_line;
        !          2138:                free(curr_line->next_line);
        !          2139:        }
        !          2140:        curr_line->next_line = NULL;
        !          2141:        *curr_line->line = '\0';
        !          2142:        curr_line->line_length = 1;
        !          2143:        curr_line->line_number = 1;
        !          2144:        point = curr_line->line;
        !          2145:        scr_pos = scr_vert = scr_horz = 0;
        !          2146:        position = 1;
        !          2147: }
        !          2148:
        !          2149: /* If fd >= 0, then use the previously opened file. This is a
        !          2150:    hack to get safe tempfile handling in ispell.*/
        !          2151: int write_file(char *file_name, int fd)
        !          2152: {
        !          2153:        wchar_t cr;
        !          2154:        wchar_t *tmp_point;
        !          2155:        struct text *out_line;
        !          2156:        int lines, charac;
        !          2157:        int temp_pos;
        !          2158:        int write_flag = TRUE;
        !          2159:
        !          2160:        charac = lines = 0;
        !          2161:        if ((fd < 0) &&
        !          2162:             ((in_file_name == NULL) || strcmp(in_file_name, file_name)))
        !          2163:        {
        !          2164:                if ((temp_fp = fopen(file_name, "r")))
        !          2165:                {
        !          2166:                        tmp_point = get_string(file_exists_prompt, TRUE);
        !          2167:                        if (toupper(*tmp_point) == toupper(*yes_char))
        !          2168:                                write_flag = TRUE;
        !          2169:                        else
        !          2170:                                write_flag = FALSE;
        !          2171:                        fclose(temp_fp);
        !          2172:                        free(tmp_point);
        !          2173:                }
        !          2174:        }
        !          2175:
        !          2176:        clear_com_win = TRUE;
        !          2177:
        !          2178:        if (write_flag)
        !          2179:        {
        !          2180:                 if (fd < 0)
        !          2181:                 {
        !          2182:                         temp_fp = fopen(file_name, "w");
        !          2183:                 }
        !          2184:                 else
        !          2185:                 {
        !          2186:                         temp_fp = fdopen(fd, "w");
        !          2187:                 }
        !          2188:
        !          2189:                if (temp_fp == NULL)
        !          2190:                {
        !          2191:                        clear_com_win = TRUE;
        !          2192:                        wmove(com_win,0,0);
        !          2193:                        wclrtoeol(com_win);
        !          2194:                        wprintw(com_win, create_file_fail_msg, file_name);
        !          2195:                        wrefresh(com_win);
        !          2196:                        return(FALSE);
        !          2197:                }
        !          2198:                else
        !          2199:                {
        !          2200:                        wmove(com_win,0,0);
        !          2201:                        wclrtoeol(com_win);
        !          2202:                        wprintw(com_win, writing_file_msg, file_name);
        !          2203:                        wrefresh(com_win);
        !          2204:                        cr = '\n';
        !          2205:                        out_line = first_line;
        !          2206:                        while (out_line != NULL)
        !          2207:                        {
        !          2208:                                temp_pos = 1;
        !          2209:                                tmp_point= out_line->line;
        !          2210:                                while (temp_pos < out_line->line_length)
        !          2211:                                {
        !          2212:                                        fputwc(*tmp_point, temp_fp);
        !          2213:                                        tmp_point++;
        !          2214:                                        temp_pos++;
        !          2215:                                }
        !          2216:                                charac += out_line->line_length;
        !          2217:                                out_line = out_line->next_line;
        !          2218:                                fputwc(cr, temp_fp);
        !          2219:                                lines++;
        !          2220:                        }
        !          2221:                        fclose(temp_fp);
        !          2222:                        wmove(com_win,0,0);
        !          2223:                        wclrtoeol(com_win);
        !          2224:                        wprintw(com_win, file_written_msg, file_name, lines, charac);
        !          2225:                        wrefresh(com_win);
        !          2226:                        return(TRUE);
        !          2227:                }
        !          2228:        }
        !          2229:        else
        !          2230:                return(FALSE);
        !          2231: }
        !          2232:
        !          2233: int
        !          2234: search(display_message)                /* search for string in srch_str        */
        !          2235: int display_message;
        !          2236: {
        !          2237:        int lines_moved;
        !          2238:        int iter;
        !          2239:        int found;
        !          2240:
        !          2241:        if ((srch_str == NULL) || (*srch_str == '\0'))
        !          2242:                return(FALSE);
        !          2243:        if (display_message)
        !          2244:        {
        !          2245:                wmove(com_win, 0, 0);
        !          2246:                wclrtoeol(com_win);
        !          2247:                wprintw(com_win, searching_msg);
        !          2248:                wrefresh(com_win);
        !          2249:                clear_com_win = TRUE;
        !          2250:        }
        !          2251:        lines_moved = 0;
        !          2252:        found = FALSE;
        !          2253:        srch_line = curr_line;
        !          2254:        srch_1 = point;
        !          2255:        if (position < curr_line->line_length)
        !          2256:                srch_1++;
        !          2257:        iter = position + 1;
        !          2258:        while ((!found) && (srch_line != NULL))
        !          2259:        {
        !          2260:                while ((iter < srch_line->line_length) && (!found))
        !          2261:                {
        !          2262:                        srch_2 = srch_1;
        !          2263:                        if (case_sen)   /* if case sensitive            */
        !          2264:                        {
        !          2265:                                srch_3 = srch_str;
        !          2266:                        while ((*srch_2 == *srch_3) && (*srch_3 != '\0'))
        !          2267:                                {
        !          2268:                                        found = TRUE;
        !          2269:                                        srch_2++;
        !          2270:                                        srch_3++;
        !          2271:                                }       /* end while    */
        !          2272:                        }
        !          2273:                        else            /* if not case sensitive        */
        !          2274:                        {
        !          2275:                                srch_3 = u_srch_str;
        !          2276:                        while ((toupper(*srch_2) == *srch_3) && (*srch_3 != '\0'))
        !          2277:                                {
        !          2278:                                        found = TRUE;
        !          2279:                                        srch_2++;
        !          2280:                                        srch_3++;
        !          2281:                                }
        !          2282:                        }       /* end else     */
        !          2283:                        if (!((*srch_3 == '\0') && (found)))
        !          2284:                        {
        !          2285:                                found = FALSE;
        !          2286:                                if (iter < srch_line->line_length)
        !          2287:                                        srch_1++;
        !          2288:                                iter++;
        !          2289:                        }
        !          2290:                }
        !          2291:                if (!found)
        !          2292:                {
        !          2293:                        srch_line = srch_line->next_line;
        !          2294:                        if (srch_line != NULL)
        !          2295:                                srch_1 = srch_line->line;
        !          2296:                        iter = 1;
        !          2297:                        lines_moved++;
        !          2298:                }
        !          2299:        }
        !          2300:        if (found)
        !          2301:        {
        !          2302:                if (display_message)
        !          2303:                {
        !          2304:                        wmove(com_win, 0, 0);
        !          2305:                        wclrtoeol(com_win);
        !          2306:                        wrefresh(com_win);
        !          2307:                }
        !          2308:                if (lines_moved == 0)
        !          2309:                {
        !          2310:                        while (position < iter)
        !          2311:                                right(TRUE);
        !          2312:                }
        !          2313:                else
        !          2314:                {
        !          2315:                        if (lines_moved < 30)
        !          2316:                        {
        !          2317:                                move_rel('d', lines_moved);
        !          2318:                                while (position < iter)
        !          2319:                                        right(TRUE);
        !          2320:                        }
        !          2321:                        else
        !          2322:                        {
        !          2323:                                curr_line = srch_line;
        !          2324:                                point = srch_1;
        !          2325:                                position = iter;
        !          2326:                                scanline(point);
        !          2327:                                scr_pos = scr_horz;
        !          2328:                                midscreen((last_line / 2), point);
        !          2329:                        }
        !          2330:                }
        !          2331:        }
        !          2332:        else
        !          2333:        {
        !          2334:                if (display_message)
        !          2335:                {
        !          2336:                        wmove(com_win, 0, 0);
        !          2337:                        wclrtoeol(com_win);
        !          2338:                        wprintw(com_win, str_not_found_msg, srch_str);
        !          2339:                        wrefresh(com_win);
        !          2340:                }
        !          2341:                wmove(text_win, scr_vert,(scr_horz - horiz_offset));
        !          2342:        }
        !          2343:        return(found);
        !          2344: }
        !          2345:
        !          2346: void
        !          2347: search_prompt()                /* prompt and read search string (srch_str)     */
        !          2348: {
        !          2349:        if (srch_str != NULL)
        !          2350:                free(srch_str);
        !          2351:        if ((u_srch_str != NULL) && (*u_srch_str != '\0'))
        !          2352:                free(u_srch_str);
        !          2353:        srch_str = get_string(search_prompt_str, FALSE);
        !          2354:        gold = FALSE;
        !          2355:        srch_3 = srch_str;
        !          2356:        srch_1 = u_srch_str = (wchar_t*)malloc((wcslen(srch_str) + 1) * sizeof(wchar_t));
        !          2357:        while (*srch_3 != '\0')
        !          2358:        {
        !          2359:                *srch_1 = toupper(*srch_3);
        !          2360:                srch_1++;
        !          2361:                srch_3++;
        !          2362:        }
        !          2363:        *srch_1 = '\0';
        !          2364:        search(TRUE);
        !          2365: }
        !          2366:
        !          2367: void
        !          2368: del_char()                     /* delete current character     */
        !          2369: {
        !          2370:        in = 8;  /* backspace */
        !          2371:        if (position < curr_line->line_length)  /* if not end of line   */
        !          2372:        {
        !          2373:                if ((*point > 127) && ((curr_line->line_length - position) >= 2))
        !          2374:                {
        !          2375:                        point++;
        !          2376:                        position++;
        !          2377:                }
        !          2378:                position++;
        !          2379:                point++;
        !          2380:                scanline(point);
        !          2381:                delete(TRUE);
        !          2382:        }
        !          2383:        else
        !          2384:        {
        !          2385:                right(FALSE);
        !          2386:                delete(FALSE);
        !          2387:        }
        !          2388: }
        !          2389:
        !          2390: void
        !          2391: undel_char()                   /* undelete last deleted character      */
        !          2392: {
        !          2393:        if (d_char[0] == '\n')  /* insert line if last del_char deleted eol */
        !          2394:                insert_line(TRUE);
        !          2395:        else
        !          2396:        {
        !          2397:                in = d_char[0];
        !          2398:                insert(in);
        !          2399:                if (d_char[1] != '\0')
        !          2400:                {
        !          2401:                        in = d_char[1];
        !          2402:                        insert(in);
        !          2403:                }
        !          2404:        }
        !          2405: }
        !          2406:
        !          2407: void
        !          2408: del_word()                     /* delete word in front of cursor       */
        !          2409: {
        !          2410:        int tposit;
        !          2411:        int difference;
        !          2412:        wchar_t *d_word2;
        !          2413:        wchar_t *d_word3;
        !          2414:        wchar_t tmp_char[3];
        !          2415:
        !          2416:        if (d_word != NULL)
        !          2417:                free(d_word);
        !          2418:        d_word = (wchar_t*)malloc(curr_line->line_length * sizeof(wchar_t));
        !          2419:        tmp_char[0] = d_char[0];
        !          2420:        tmp_char[1] = d_char[1];
        !          2421:        tmp_char[2] = d_char[2];
        !          2422:        d_word3 = point;
        !          2423:        d_word2 = d_word;
        !          2424:        tposit = position;
        !          2425:        while ((tposit < curr_line->line_length) &&
        !          2426:                                ((*d_word3 != ' ') && (*d_word3 != '\t')))
        !          2427:        {
        !          2428:                tposit++;
        !          2429:                *d_word2 = *d_word3;
        !          2430:                d_word2++;
        !          2431:                d_word3++;
        !          2432:        }
        !          2433:        while ((tposit < curr_line->line_length) &&
        !          2434:                                ((*d_word3 == ' ') || (*d_word3 == '\t')))
        !          2435:        {
        !          2436:                tposit++;
        !          2437:                *d_word2 = *d_word3;
        !          2438:                d_word2++;
        !          2439:                d_word3++;
        !          2440:        }
        !          2441:        *d_word2 = '\0';
        !          2442:        d_wrd_len = difference = d_word2 - d_word;
        !          2443:        d_word2 = point;
        !          2444:        while (tposit < curr_line->line_length)
        !          2445:        {
        !          2446:                tposit++;
        !          2447:                *d_word2 = *d_word3;
        !          2448:                d_word2++;
        !          2449:                d_word3++;
        !          2450:        }
        !          2451:        curr_line->line_length -= difference;
        !          2452:        *d_word2 = '\0';
        !          2453:        draw_line(scr_vert, scr_horz,point,position,curr_line->line_length);
        !          2454:        d_char[0] = tmp_char[0];
        !          2455:        d_char[1] = tmp_char[1];
        !          2456:        d_char[2] = tmp_char[2];
        !          2457:        text_changes = TRUE;
        !          2458:        formatted = FALSE;
        !          2459: }
        !          2460:
        !          2461: void
        !          2462: undel_word()           /* undelete last deleted word           */
        !          2463: {
        !          2464:        int temp;
        !          2465:        int tposit;
        !          2466:        wchar_t *tmp_old_ptr;
        !          2467:        wchar_t *tmp_space;
        !          2468:        wchar_t *tmp_ptr;
        !          2469:        wchar_t *d_word_ptr;
        !          2470:
        !          2471:        /*
        !          2472:         |      resize line to handle undeleted word
        !          2473:         */
        !          2474:        if ((curr_line->max_length - (curr_line->line_length + d_wrd_len)) < 5)
        !          2475:                point = resiz_line(d_wrd_len, curr_line, position);
        !          2476:        tmp_ptr = tmp_space = (wchar_t*)malloc((curr_line->line_length + d_wrd_len) * sizeof(wchar_t));
        !          2477:        d_word_ptr = d_word;
        !          2478:        temp = 1;
        !          2479:        /*
        !          2480:         |      copy d_word contents into temp space
        !          2481:         */
        !          2482:        while (temp <= d_wrd_len)
        !          2483:        {
        !          2484:                temp++;
        !          2485:                *tmp_ptr = *d_word_ptr;
        !          2486:                tmp_ptr++;
        !          2487:                d_word_ptr++;
        !          2488:        }
        !          2489:        tmp_old_ptr = point;
        !          2490:        tposit = position;
        !          2491:        /*
        !          2492:         |      copy contents of line from curent position to eol into
        !          2493:         |      temp space
        !          2494:         */
        !          2495:        while (tposit < curr_line->line_length)
        !          2496:        {
        !          2497:                temp++;
        !          2498:                tposit++;
        !          2499:                *tmp_ptr = *tmp_old_ptr;
        !          2500:                tmp_ptr++;
        !          2501:                tmp_old_ptr++;
        !          2502:        }
        !          2503:        curr_line->line_length += d_wrd_len;
        !          2504:        tmp_old_ptr = point;
        !          2505:        *tmp_ptr = '\0';
        !          2506:        tmp_ptr = tmp_space;
        !          2507:        tposit = 1;
        !          2508:        /*
        !          2509:         |      now copy contents from temp space back to original line
        !          2510:         */
        !          2511:        while (tposit < temp)
        !          2512:        {
        !          2513:                tposit++;
        !          2514:                *tmp_old_ptr = *tmp_ptr;
        !          2515:                tmp_ptr++;
        !          2516:                tmp_old_ptr++;
        !          2517:        }
        !          2518:        *tmp_old_ptr = '\0';
        !          2519:        free(tmp_space);
        !          2520:        draw_line(scr_vert, scr_horz, point, position, curr_line->line_length);
        !          2521: }
        !          2522:
        !          2523: void
        !          2524: del_line()                     /* delete from cursor to end of line    */
        !          2525: {
        !          2526:        wchar_t *dl1;
        !          2527:        wchar_t *dl2;
        !          2528:        int tposit;
        !          2529:
        !          2530:        if (d_line != NULL)
        !          2531:                free(d_line);
        !          2532:        d_line = (wchar_t*)malloc(curr_line->line_length * sizeof(wchar_t));
        !          2533:        dl1 = d_line;
        !          2534:        dl2 = point;
        !          2535:        tposit = position;
        !          2536:        while (tposit < curr_line->line_length)
        !          2537:        {
        !          2538:                *dl1 = *dl2;
        !          2539:                dl1++;
        !          2540:                dl2++;
        !          2541:                tposit++;
        !          2542:        }
        !          2543:        dlt_line->line_length = 1 + tposit - position;
        !          2544:        *dl1 = *point = '\0';
        !          2545:        curr_line->line_length = position;
        !          2546:        wclrtoeol(text_win);
        !          2547:        if (curr_line->next_line != NULL)
        !          2548:        {
        !          2549:                right(FALSE);
        !          2550:                delete(FALSE);
        !          2551:        }
        !          2552:        text_changes = TRUE;
        !          2553: }
        !          2554:
        !          2555: void
        !          2556: undel_line()                   /* undelete last deleted line           */
        !          2557: {
        !          2558:        wchar_t *ud1;
        !          2559:        wchar_t *ud2;
        !          2560:        int tposit;
        !          2561:
        !          2562:        if (dlt_line->line_length == 0)
        !          2563:                return;
        !          2564:
        !          2565:        insert_line(TRUE);
        !          2566:        left(TRUE);
        !          2567:        point = resiz_line(dlt_line->line_length, curr_line, position);
        !          2568:        curr_line->line_length += dlt_line->line_length - 1;
        !          2569:        ud1 = point;
        !          2570:        ud2 = d_line;
        !          2571:        tposit = 1;
        !          2572:        while (tposit < dlt_line->line_length)
        !          2573:        {
        !          2574:                tposit++;
        !          2575:                *ud1 = *ud2;
        !          2576:                ud1++;
        !          2577:                ud2++;
        !          2578:        }
        !          2579:        *ud1 = '\0';
        !          2580:        draw_line(scr_vert, scr_horz,point,position,curr_line->line_length);
        !          2581: }
        !          2582:
        !          2583: void
        !          2584: adv_word()                     /* advance to next word         */
        !          2585: {
        !          2586: while ((position < curr_line->line_length) && ((*point != 32) && (*point != 9)))
        !          2587:                right(TRUE);
        !          2588: while ((position < curr_line->line_length) && ((*point == 32) || (*point == 9)))
        !          2589:                right(TRUE);
        !          2590: }
        !          2591:
        !          2592: void move_rel(char direction, int lines)       /* move relative to current line        */
        !          2593: {
        !          2594:        int i;
        !          2595:        wchar_t *tmp;
        !          2596:
        !          2597:        if (direction == 'u')
        !          2598:        {
        !          2599:                scr_pos = 0;
        !          2600:                while (position > 1)
        !          2601:                        left(TRUE);
        !          2602:                for (i = 0; i < lines; i++)
        !          2603:                {
        !          2604:                        up();
        !          2605:                }
        !          2606:                if ((last_line > 5) && ( scr_vert < 4))
        !          2607:                {
        !          2608:                        tmp = point;
        !          2609:                        tmp_line = curr_line;
        !          2610:                        for (i= 0;(i<5)&&(curr_line->prev_line != NULL); i++)
        !          2611:                        {
        !          2612:                                up();
        !          2613:                        }
        !          2614:                        scr_vert = scr_vert + i;
        !          2615:                        curr_line = tmp_line;
        !          2616:                        point = tmp;
        !          2617:                        scanline(point);
        !          2618:                }
        !          2619:        }
        !          2620:        else
        !          2621:        {
        !          2622:                if ((position != 1) && (curr_line->next_line != NULL))
        !          2623:                {
        !          2624:                        nextline();
        !          2625:                        scr_pos = scr_horz = 0;
        !          2626:                        if (horiz_offset)
        !          2627:                        {
        !          2628:                                horiz_offset = 0;
        !          2629:                                midscreen(scr_vert, point);
        !          2630:                        }
        !          2631:                }
        !          2632:                else
        !          2633:                        adv_line();
        !          2634:                for (i = 1; i < lines; i++)
        !          2635:                {
        !          2636:                        down();
        !          2637:                }
        !          2638:                if ((last_line > 10) && (scr_vert > (last_line - 5)))
        !          2639:                {
        !          2640:                        tmp = point;
        !          2641:                        tmp_line = curr_line;
        !          2642:                        for (i=0; (i<5) && (curr_line->next_line != NULL); i++)
        !          2643:                        {
        !          2644:                                down();
        !          2645:                        }
        !          2646:                        scr_vert = scr_vert - i;
        !          2647:                        curr_line = tmp_line;
        !          2648:                        point = tmp;
        !          2649:                        scanline(point);
        !          2650:                }
        !          2651:        }
        !          2652:        wmove(text_win, scr_vert, (scr_horz - horiz_offset));
        !          2653: }
        !          2654:
        !          2655: void
        !          2656: eol()                          /* go to end of line                    */
        !          2657: {
        !          2658:        if (position < curr_line->line_length)
        !          2659:        {
        !          2660:                while (position < curr_line->line_length)
        !          2661:                        right(TRUE);
        !          2662:        }
        !          2663:        else if (curr_line->next_line != NULL)
        !          2664:        {
        !          2665:                right(TRUE);
        !          2666:                while (position < curr_line->line_length)
        !          2667:                        right(TRUE);
        !          2668:        }
        !          2669: }
        !          2670:
        !          2671: void
        !          2672: bol()                          /* move to beginning of line    */
        !          2673: {
        !          2674:        if (point != curr_line->line)
        !          2675:        {
        !          2676:                while (point != curr_line->line)
        !          2677:                        left(TRUE);
        !          2678:        }
        !          2679:        else if (curr_line->prev_line != NULL)
        !          2680:        {
        !          2681:                scr_pos = 0;
        !          2682:                up();
        !          2683:        }
        !          2684: }
        !          2685:
        !          2686: void
        !          2687: adv_line()     /* advance to beginning of next line    */
        !          2688: {
        !          2689:        if ((point != curr_line->line) || (scr_pos > 0))
        !          2690:        {
        !          2691:                while (position < curr_line->line_length)
        !          2692:                        right(TRUE);
        !          2693:                right(TRUE);
        !          2694:        }
        !          2695:        else if (curr_line->next_line != NULL)
        !          2696:        {
        !          2697:                scr_pos = 0;
        !          2698:                down();
        !          2699:        }
        !          2700: }
        !          2701:
        !          2702: void
        !          2703: set_up_term()          /* set up the terminal for operating with ae    */
        !          2704: {
        !          2705:        if (!curses_initialized)
        !          2706:        {
        !          2707:                initscr();
        !          2708:                savetty();
        !          2709:                noecho();
        !          2710:                raw();
        !          2711:                nonl();
        !          2712:                curses_initialized = TRUE;
        !          2713:        }
        !          2714:
        !          2715:        if (((LINES > 15) && (COLS >= 80)) && info_window)
        !          2716:                last_line = LINES - 8;
        !          2717:        else
        !          2718:        {
        !          2719:                info_window = FALSE;
        !          2720:                last_line = LINES - 2;
        !          2721:        }
        !          2722:
        !          2723:        idlok(stdscr, TRUE);
        !          2724:        com_win = newwin(1, COLS, (LINES - 1), 0);
        !          2725:        keypad(com_win, TRUE);
        !          2726:        idlok(com_win, TRUE);
        !          2727:        wrefresh(com_win);
        !          2728:        if (!info_window)
        !          2729:                text_win = newwin((LINES - 1), COLS, 0, 0);
        !          2730:        else
        !          2731:                text_win = newwin((LINES - 7), COLS, 6, 0);
        !          2732:        keypad(text_win, TRUE);
        !          2733:        idlok(text_win, TRUE);
        !          2734:        wrefresh(text_win);
        !          2735:        help_win = newwin((LINES - 1), COLS, 0, 0);
        !          2736:        keypad(help_win, TRUE);
        !          2737:        idlok(help_win, TRUE);
        !          2738:        if (info_window)
        !          2739:        {
        !          2740:                info_type = CONTROL_KEYS;
        !          2741:                info_win = newwin(6, COLS, 0, 0);
        !          2742:                werase(info_win);
        !          2743:                paint_info_win();
        !          2744:        }
        !          2745:
        !          2746:        last_col = COLS - 1;
        !          2747:        local_LINES = LINES;
        !          2748:        local_COLS = COLS;
        !          2749: }
        !          2750:
        !          2751: void
        !          2752: resize_check()
        !          2753: {
        !          2754:        if ((LINES == local_LINES) && (COLS == local_COLS))
        !          2755:                return;
        !          2756:
        !          2757:        if (info_window)
        !          2758:                delwin(info_win);
        !          2759:        delwin(text_win);
        !          2760:        delwin(com_win);
        !          2761:        delwin(help_win);
        !          2762:        set_up_term();
        !          2763:        redraw();
        !          2764:        wrefresh(text_win);
        !          2765: }
        !          2766:
        !          2767: static char item_alpha[] = "abcdefghijklmnopqrstuvwxyz0123456789 ";
        !          2768:
        !          2769: int menu_op(struct menu_entries menu_list[])
        !          2770: {
        !          2771:        WINDOW *temp_win;
        !          2772:        int max_width, max_height;
        !          2773:        int x_off, y_off;
        !          2774:        int counter;
        !          2775:        int length;
        !          2776:        int input;
        !          2777:        int temp = 0;
        !          2778:        int list_size;
        !          2779:        int top_offset;         /* offset from top where menu items start */
        !          2780:        int vert_size;          /* vertical size for menu list item display */
        !          2781:        int off_start = 1;      /* offset from start of menu items to start display */
        !          2782:
        !          2783:
        !          2784:        /*
        !          2785:         |      determine number and width of menu items
        !          2786:         */
        !          2787:
        !          2788:        list_size = 1;
        !          2789:        while (menu_list[list_size + 1].item_string != NULL)
        !          2790:                list_size++;
        !          2791:        max_width = 0;
        !          2792:        for (counter = 0; counter <= list_size; counter++)
        !          2793:        {
        !          2794:                if ((length = wcslen(menu_list[counter].item_string)) > max_width)
        !          2795:                        max_width = length;
        !          2796:        }
        !          2797:        max_width += 3;
        !          2798:        max_width = max(max_width, wcslen(menu_cancel_msg));
        !          2799:        max_width = max(max_width, max(wcslen(more_above_str), wcslen(more_below_str)));
        !          2800:        max_width += 6;
        !          2801:
        !          2802:        /*
        !          2803:         |      make sure that window is large enough to handle menu
        !          2804:         |      if not, print error message and return to calling function
        !          2805:         */
        !          2806:
        !          2807:        if (max_width > COLS)
        !          2808:        {
        !          2809:                wmove(com_win, 0, 0);
        !          2810:                werase(com_win);
        !          2811:                wprintw(com_win, menu_too_lrg_msg);
        !          2812:                wrefresh(com_win);
        !          2813:                clear_com_win = TRUE;
        !          2814:                return(0);
        !          2815:        }
        !          2816:
        !          2817:        top_offset = 0;
        !          2818:
        !          2819:        if (list_size > LINES)
        !          2820:        {
        !          2821:                max_height = LINES;
        !          2822:                if (max_height > 11)
        !          2823:                        vert_size = max_height - 8;
        !          2824:                else
        !          2825:                        vert_size = max_height;
        !          2826:        }
        !          2827:        else
        !          2828:        {
        !          2829:                vert_size = list_size;
        !          2830:                max_height = list_size;
        !          2831:        }
        !          2832:
        !          2833:        if (LINES >= (vert_size + 8))
        !          2834:        {
        !          2835:                if (menu_list[0].argument != MENU_WARN)
        !          2836:                        max_height = vert_size + 8;
        !          2837:                else
        !          2838:                        max_height = vert_size + 7;
        !          2839:                top_offset = 4;
        !          2840:        }
        !          2841:        x_off = (COLS - max_width) / 2;
        !          2842:        y_off = (LINES - max_height - 1) / 2;
        !          2843:        temp_win = newwin(max_height, max_width, y_off, x_off);
        !          2844:        keypad(temp_win, TRUE);
        !          2845:
        !          2846:        paint_menu(menu_list, max_width, max_height, list_size, top_offset, temp_win, off_start, vert_size);
        !          2847:
        !          2848:        counter = 1;
        !          2849:        do
        !          2850:        {
        !          2851:                int keyt;
        !          2852:                if (off_start > 2)
        !          2853:                        wmove(temp_win, (1 + counter + top_offset - off_start), 3);
        !          2854:                else
        !          2855:                        wmove(temp_win, (counter + top_offset - off_start), 3);
        !          2856:
        !          2857:                wrefresh(temp_win);
        !          2858:                keyt = wget_wch(temp_win, &in);
        !          2859:                input = in;
        !          2860:                if (keyt == ERR)
        !          2861:                        exit(0);
        !          2862:
        !          2863:                if (keyt == OK && isalnum(tolower(input)))
        !          2864:                {
        !          2865:                        if (isalpha(tolower(input)))
        !          2866:                        {
        !          2867:                                temp = 1 + tolower(input) - 'a';
        !          2868:                        }
        !          2869:                        else if (isdigit(input))
        !          2870:                        {
        !          2871:                                temp = (2 + 'z' - 'a') + (input - '0');
        !          2872:                        }
        !          2873:
        !          2874:                        if (temp <= list_size)
        !          2875:                        {
        !          2876:                                input = '\n';
        !          2877:                                counter = temp;
        !          2878:                        }
        !          2879:                }
        !          2880:                else if (keyt == OK)
        !          2881:                {
        !          2882:                        switch (input)
        !          2883:                        {
        !          2884:                                case ' ':       /* space        */
        !          2885:                                case '\004':    /* ^d, down     */
        !          2886:                                        counter++;
        !          2887:                                        if (counter > list_size)
        !          2888:                                                counter = 1;
        !          2889:                                        break;
        !          2890:                                case '\010':    /* ^h, backspace*/
        !          2891:                                case '\025':    /* ^u, up       */
        !          2892:                                case 127:       /* ^?, delete   */
        !          2893:                                        counter--;
        !          2894:                                        if (counter == 0)
        !          2895:                                                counter = list_size;
        !          2896:                                        break;
        !          2897:                                case '\033':    /* escape key   */
        !          2898:                                        if (menu_list[0].argument != MENU_WARN)
        !          2899:                                                counter = 0;
        !          2900:                                        break;
        !          2901:                                case '\014':    /* ^l           */
        !          2902:                                case '\022':    /* ^r, redraw   */
        !          2903:                                        paint_menu(menu_list, max_width, max_height,
        !          2904:                                                list_size, top_offset, temp_win,
        !          2905:                                                off_start, vert_size);
        !          2906:                                        break;
        !          2907:                                default:
        !          2908:                                        break;
        !          2909:                        }
        !          2910:                }
        !          2911:                else
        !          2912:                {
        !          2913:                        switch (input)
        !          2914:                        {
        !          2915:                                case KEY_RIGHT:
        !          2916:                                case KEY_DOWN:
        !          2917:                                        counter++;
        !          2918:                                        if (counter > list_size)
        !          2919:                                                counter = 1;
        !          2920:                                        break;
        !          2921:                                case 127:       /* ^?, delete   */
        !          2922:                                case KEY_BACKSPACE:
        !          2923:                                case KEY_LEFT:
        !          2924:                                case KEY_UP:
        !          2925:                                        counter--;
        !          2926:                                        if (counter == 0)
        !          2927:                                                counter = list_size;
        !          2928:                                        break;
        !          2929:                                case '\033':    /* escape key   */
        !          2930:                                        if (menu_list[0].argument != MENU_WARN)
        !          2931:                                                counter = 0;
        !          2932:                                        break;
        !          2933:                                case '\014':    /* ^l           */
        !          2934:                                case '\022':    /* ^r, redraw   */
        !          2935:                                        paint_menu(menu_list, max_width, max_height,
        !          2936:                                                list_size, top_offset, temp_win,
        !          2937:                                                off_start, vert_size);
        !          2938:                                        break;
        !          2939:                                default:
        !          2940:                                        break;
        !          2941:                        }
        !          2942:                }
        !          2943:
        !          2944:                if (((list_size - off_start) >= (vert_size - 1)) &&
        !          2945:                        (counter > (off_start + vert_size - 3)) &&
        !          2946:                                (off_start > 1))
        !          2947:                {
        !          2948:                        if (counter == list_size)
        !          2949:                                off_start = (list_size - vert_size) + 2;
        !          2950:                        else
        !          2951:                                off_start++;
        !          2952:
        !          2953:                        paint_menu(menu_list, max_width, max_height,
        !          2954:                                   list_size, top_offset, temp_win, off_start,
        !          2955:                                   vert_size);
        !          2956:                }
        !          2957:                else if ((list_size != vert_size) &&
        !          2958:                                (counter > (off_start + vert_size - 2)))
        !          2959:                {
        !          2960:                        if (counter == list_size)
        !          2961:                                off_start = 2 + (list_size - vert_size);
        !          2962:                        else if (off_start == 1)
        !          2963:                                off_start = 3;
        !          2964:                        else
        !          2965:                                off_start++;
        !          2966:
        !          2967:                        paint_menu(menu_list, max_width, max_height,
        !          2968:                                   list_size, top_offset, temp_win, off_start,
        !          2969:                                   vert_size);
        !          2970:                }
        !          2971:                else if (counter < off_start)
        !          2972:                {
        !          2973:                        if (counter <= 2)
        !          2974:                                off_start = 1;
        !          2975:                        else
        !          2976:                                off_start = counter;
        !          2977:
        !          2978:                        paint_menu(menu_list, max_width, max_height,
        !          2979:                                   list_size, top_offset, temp_win, off_start,
        !          2980:                                   vert_size);
        !          2981:                }
        !          2982:        }
        !          2983:        while ((input != '\r') && (input != '\n') && (counter != 0));
        !          2984:
        !          2985:        werase(temp_win);
        !          2986:        wrefresh(temp_win);
        !          2987:        delwin(temp_win);
        !          2988:
        !          2989:        if ((menu_list[counter].procedure != NULL) ||
        !          2990:            (menu_list[counter].iprocedure != NULL) ||
        !          2991:            (menu_list[counter].nprocedure != NULL))
        !          2992:        {
        !          2993:                if (menu_list[counter].argument != -1)
        !          2994:                        (*menu_list[counter].iprocedure)(menu_list[counter].argument);
        !          2995:                else if (menu_list[counter].ptr_argument != NULL)
        !          2996:                        (*menu_list[counter].procedure)(menu_list[counter].ptr_argument);
        !          2997:                else
        !          2998:                        (*menu_list[counter].nprocedure)();
        !          2999:        }
        !          3000:
        !          3001:        if (info_window)
        !          3002:                paint_info_win();
        !          3003:        redraw();
        !          3004:
        !          3005:        return(counter);
        !          3006: }
        !          3007:
        !          3008: void
        !          3009: paint_menu(menu_list, max_width, max_height, list_size, top_offset, menu_win,
        !          3010:           off_start, vert_size)
        !          3011: struct menu_entries menu_list[];
        !          3012: int max_width, max_height, list_size, top_offset;
        !          3013: WINDOW *menu_win;
        !          3014: int off_start, vert_size;
        !          3015: {
        !          3016:        int counter, temp_int;
        !          3017:
        !          3018:        werase(menu_win);
        !          3019:
        !          3020:        /*
        !          3021:         |      output top and bottom portions of menu box only if window
        !          3022:         |      large enough
        !          3023:         */
        !          3024:
        !          3025:        if (max_height > vert_size)
        !          3026:        {
        !          3027:                wmove(menu_win, 1, 1);
        !          3028:                if (!nohighlight)
        !          3029:                        wstandout(menu_win);
        !          3030:                waddch(menu_win, '+');
        !          3031:                for (counter = 0; counter < (max_width - 4); counter++)
        !          3032:                        waddch(menu_win, '-');
        !          3033:                waddch(menu_win, '+');
        !          3034:
        !          3035:                wmove(menu_win, (max_height - 2), 1);
        !          3036:                waddch(menu_win, '+');
        !          3037:                for (counter = 0; counter < (max_width - 4); counter++)
        !          3038:                        waddch(menu_win, '-');
        !          3039:                waddch(menu_win, '+');
        !          3040:                wstandend(menu_win);
        !          3041:                wmove(menu_win, 2, 3);
        !          3042:                waddwstr(menu_win, menu_list[0].item_string);
        !          3043:                wmove(menu_win, (max_height - 3), 3);
        !          3044:                if (menu_list[0].argument != MENU_WARN)
        !          3045:                        waddwstr(menu_win, menu_cancel_msg);
        !          3046:        }
        !          3047:        if (!nohighlight)
        !          3048:                wstandout(menu_win);
        !          3049:
        !          3050:        for (counter = 0; counter < (vert_size + top_offset); counter++)
        !          3051:        {
        !          3052:                if (top_offset == 4)
        !          3053:                {
        !          3054:                        temp_int = counter + 2;
        !          3055:                }
        !          3056:                else
        !          3057:                        temp_int = counter;
        !          3058:
        !          3059:                wmove(menu_win, temp_int, 1);
        !          3060:                waddch(menu_win, '|');
        !          3061:                wmove(menu_win, temp_int, (max_width - 2));
        !          3062:                waddch(menu_win, '|');
        !          3063:        }
        !          3064:        wstandend(menu_win);
        !          3065:
        !          3066:        if (list_size > vert_size)
        !          3067:        {
        !          3068:                if (off_start >= 3)
        !          3069:                {
        !          3070:                        temp_int = 1;
        !          3071:                        wmove(menu_win, top_offset, 3);
        !          3072:                        waddwstr(menu_win, more_above_str);
        !          3073:                }
        !          3074:                else
        !          3075:                        temp_int = 0;
        !          3076:
        !          3077:                for (counter = off_start;
        !          3078:                        ((temp_int + counter - off_start) < (vert_size - 1));
        !          3079:                                counter++)
        !          3080:                {
        !          3081:                        wmove(menu_win, (top_offset + temp_int +
        !          3082:                                                (counter - off_start)), 3);
        !          3083:                        if (list_size > 1)
        !          3084:                                wprintw(menu_win, "%c) ", item_alpha[min((counter - 1), max_alpha_char)]);
        !          3085:                        waddwstr(menu_win, menu_list[counter].item_string);
        !          3086:                }
        !          3087:
        !          3088:                wmove(menu_win, (top_offset + (vert_size - 1)), 3);
        !          3089:
        !          3090:                if (counter == list_size)
        !          3091:                {
        !          3092:                        if (list_size > 1)
        !          3093:                                wprintw(menu_win, "%c) ", item_alpha[min((counter - 1), max_alpha_char)]);
        !          3094:                        waddwstr(menu_win, menu_list[counter].item_string);
        !          3095:                }
        !          3096:                else
        !          3097:                        waddwstr(menu_win, more_below_str);
        !          3098:        }
        !          3099:        else
        !          3100:        {
        !          3101:                for (counter = 1; counter <= list_size; counter++)
        !          3102:                {
        !          3103:                        wmove(menu_win, (top_offset + counter - 1), 3);
        !          3104:                        if (list_size > 1)
        !          3105:                                wprintw(menu_win, "%c) ", item_alpha[min((counter - 1), max_alpha_char)]);
        !          3106:                        waddwstr(menu_win, menu_list[counter].item_string);
        !          3107:                }
        !          3108:        }
        !          3109: }
        !          3110:
        !          3111: void
        !          3112: help()
        !          3113: {
        !          3114:        int counter, dummy;
        !          3115:
        !          3116:        werase(help_win);
        !          3117:        clearok(help_win, TRUE);
        !          3118:        for (counter = 0; counter < 22; counter++)
        !          3119:        {
        !          3120:                wmove(help_win, counter, 0);
        !          3121:                waddwstr(help_win, (emacs_keys_mode) ?
        !          3122:                        emacs_help_text[counter] : help_text[counter]);
        !          3123:        }
        !          3124:        wrefresh(help_win);
        !          3125:        werase(com_win);
        !          3126:        wmove(com_win, 0, 0);
        !          3127:        waddwstr(com_win, press_any_key_msg);
        !          3128:        wrefresh(com_win);
        !          3129:        counter = wget_wch(com_win, &dummy);
        !          3130:        if (counter == ERR)
        !          3131:                exit(0);
        !          3132:        werase(com_win);
        !          3133:        wmove(com_win, 0, 0);
        !          3134:        werase(help_win);
        !          3135:        wrefresh(help_win);
        !          3136:        wrefresh(com_win);
        !          3137:        redraw();
        !          3138: }
        !          3139:
        !          3140: void
        !          3141: paint_info_win()
        !          3142: {
        !          3143:        int counter;
        !          3144:
        !          3145:        if (!info_window)
        !          3146:                return;
        !          3147:
        !          3148:        werase(info_win);
        !          3149:        for (counter = 0; counter < 5; counter++)
        !          3150:        {
        !          3151:                wmove(info_win, counter, 0);
        !          3152:                wclrtoeol(info_win);
        !          3153:                if (info_type == CONTROL_KEYS)
        !          3154:                        waddwstr(info_win, (emacs_keys_mode) ?
        !          3155:                          emacs_control_keys[counter] : control_keys[counter]);
        !          3156:                else if (info_type == COMMANDS)
        !          3157:                        waddwstr(info_win, command_strings[counter]);
        !          3158:        }
        !          3159:        wmove(info_win, 5, 0);
        !          3160:        if (!nohighlight)
        !          3161:                wstandout(info_win);
        !          3162:        waddstr(info_win, "===============================================================================");
        !          3163:        wstandend(info_win);
        !          3164:        wrefresh(info_win);
        !          3165: }
        !          3166:
        !          3167: void
        !          3168: no_info_window()
        !          3169: {
        !          3170:        if (!info_window)
        !          3171:                return;
        !          3172:        delwin(info_win);
        !          3173:        delwin(text_win);
        !          3174:        info_window = FALSE;
        !          3175:        last_line = LINES - 2;
        !          3176:        text_win = newwin((LINES - 1), COLS, 0, 0);
        !          3177:        keypad(text_win, TRUE);
        !          3178:        idlok(text_win, TRUE);
        !          3179:        clearok(text_win, TRUE);
        !          3180:        midscreen(scr_vert, point);
        !          3181:        wrefresh(text_win);
        !          3182:        clear_com_win = TRUE;
        !          3183: }
        !          3184:
        !          3185: void
        !          3186: create_info_window()
        !          3187: {
        !          3188:        if (info_window)
        !          3189:                return;
        !          3190:        last_line = LINES - 8;
        !          3191:        delwin(text_win);
        !          3192:        text_win = newwin((LINES - 7), COLS, 6, 0);
        !          3193:        keypad(text_win, TRUE);
        !          3194:        idlok(text_win, TRUE);
        !          3195:        werase(text_win);
        !          3196:        info_window = TRUE;
        !          3197:        info_win = newwin(6, COLS, 0, 0);
        !          3198:        werase(info_win);
        !          3199:        info_type = CONTROL_KEYS;
        !          3200:        midscreen(min(scr_vert, last_line), point);
        !          3201:        clearok(info_win, TRUE);
        !          3202:        paint_info_win();
        !          3203:        wrefresh(text_win);
        !          3204:        clear_com_win = TRUE;
        !          3205: }
        !          3206:
        !          3207: int
        !          3208: file_op(arg)
        !          3209: int arg;
        !          3210: {
        !          3211:        char *string;
        !          3212:        int flag;
        !          3213:
        !          3214:        if (arg == SAVE_FILE)
        !          3215:        {
        !          3216:        /*
        !          3217:         |      changes made here should be reflected in ee_finish()
        !          3218:         */
        !          3219:
        !          3220:                if (in_file_name)
        !          3221:                        flag = TRUE;
        !          3222:                else
        !          3223:                        flag = FALSE;
        !          3224:
        !          3225:                string = in_file_name;
        !          3226: //             if ((string == NULL) || (*string == '\0'))
        !          3227: //                     string = get_string(save_file_name_prompt, TRUE);
        !          3228:                if ((string == NULL) || (*string == '\0'))
        !          3229:                {
        !          3230:                        wmove(com_win, 0, 0);
        !          3231:                        wprintw(com_win, file_not_saved_msg);
        !          3232:                        wclrtoeol(com_win);
        !          3233:                        wrefresh(com_win);
        !          3234:                        clear_com_win = TRUE;
        !          3235:                        return(0);
        !          3236:                }
        !          3237:                if (write_file(string, -1))
        !          3238:                {
        !          3239:                        in_file_name = string;
        !          3240:                        text_changes = FALSE;
        !          3241:                }
        !          3242:                else if (!flag)
        !          3243:                        free(string);
        !          3244:        }
        !          3245:        return(0);
        !          3246: }
        !          3247:
        !          3248: void
        !          3249: leave_op()
        !          3250: {
        !          3251:        if (text_changes)
        !          3252:        {
        !          3253:                menu_op(leave_menu);
        !          3254:        }
        !          3255:        else
        !          3256:                quit(TRUE);
        !          3257: }
        !          3258:
        !          3259: void
        !          3260: redraw()
        !          3261: {
        !          3262:        if (info_window)
        !          3263:         {
        !          3264:                 clearok(info_win, TRUE);
        !          3265:                paint_info_win();
        !          3266:         }
        !          3267:         else
        !          3268:                clearok(text_win, TRUE);
        !          3269:        midscreen(scr_vert, point);
        !          3270: }
        !          3271:
        !          3272: /*
        !          3273:  |     The following routines will "format" a paragraph (as defined by a
        !          3274:  |     block of text with blank lines before and after the block).
        !          3275:  */
        !          3276:
        !          3277: int
        !          3278: Blank_Line(test_line)  /* test if line has any non-space characters    */
        !          3279: struct text *test_line;
        !          3280: {
        !          3281:        wchar_t *line;
        !          3282:        int length;
        !          3283:
        !          3284:        if (test_line == NULL)
        !          3285:                return(TRUE);
        !          3286:
        !          3287:        length = 1;
        !          3288:        line = test_line->line;
        !          3289:
        !          3290:        /*
        !          3291:         |      To handle troff/nroff documents, consider a line with a
        !          3292:         |      period ('.') in the first column to be blank.  To handle mail
        !          3293:         |      messages with included text, consider a line with a '>' blank.
        !          3294:         */
        !          3295:
        !          3296:        if ((*line == '.') || (*line == '>'))
        !          3297:                return(TRUE);
        !          3298:
        !          3299:        while (((*line == ' ') || (*line == '\t')) && (length < test_line->line_length))
        !          3300:        {
        !          3301:                length++;
        !          3302:                line++;
        !          3303:        }
        !          3304:        if (length != test_line->line_length)
        !          3305:                return(FALSE);
        !          3306:        else
        !          3307:                return(TRUE);
        !          3308: }
        !          3309:
        !          3310: void
        !          3311: echo_string(string)    /* echo the given string        */
        !          3312: wchar_t *string;
        !          3313: {
        !          3314:        wchar_t *temp;
        !          3315:        int Counter;
        !          3316:
        !          3317:                temp = string;
        !          3318:                while (*temp != '\0')
        !          3319:                {
        !          3320:                        if (*temp == '\\')
        !          3321:                        {
        !          3322:                                temp++;
        !          3323:                                if (*temp == 'n')
        !          3324:                                        putchar('\n');
        !          3325:                                else if (*temp == 't')
        !          3326:                                        putchar('\t');
        !          3327:                                else if (*temp == 'b')
        !          3328:                                        putchar('\b');
        !          3329:                                else if (*temp == 'r')
        !          3330:                                        putchar('\r');
        !          3331:                                else if (*temp == 'f')
        !          3332:                                        putchar('\f');
        !          3333:                                else if ((*temp == 'e') || (*temp == 'E'))
        !          3334:                                        putchar('\033');        /* escape */
        !          3335:                                else if (*temp == '\\')
        !          3336:                                        putchar('\\');
        !          3337:                                else if (*temp == '\'')
        !          3338:                                        putchar('\'');
        !          3339:                                else if ((*temp >= '0') && (*temp <= '9'))
        !          3340:                                {
        !          3341:                                        Counter = 0;
        !          3342:                                        while ((*temp >= '0') && (*temp <= '9'))
        !          3343:                                        {
        !          3344:                                                Counter = (8 * Counter) + (*temp - '0');
        !          3345:                                                temp++;
        !          3346:                                        }
        !          3347:                                        putchar(Counter);
        !          3348:                                        temp--;
        !          3349:                                }
        !          3350:                                temp++;
        !          3351:                        }
        !          3352:                        else
        !          3353:                        {
        !          3354:                                putchar(*temp);
        !          3355:                                temp++;
        !          3356:                        }
        !          3357:                }
        !          3358:
        !          3359:        fflush(stdout);
        !          3360: }
        !          3361:
        !          3362: int
        !          3363: first_word_len(test_line)
        !          3364: struct text *test_line;
        !          3365: {
        !          3366:        int counter;
        !          3367:        wchar_t *pnt;
        !          3368:
        !          3369:        if (test_line == NULL)
        !          3370:                return(0);
        !          3371:
        !          3372:        pnt = test_line->line;
        !          3373:        if ((pnt == NULL) || (*pnt == '\0') ||
        !          3374:            (*pnt == '.') || (*pnt == '>'))
        !          3375:                return(0);
        !          3376:
        !          3377:        if ((*pnt == ' ') || (*pnt == '\t'))
        !          3378:        {
        !          3379:                pnt = next_word(pnt);
        !          3380:        }
        !          3381:
        !          3382:        if (*pnt == '\0')
        !          3383:                return(0);
        !          3384:
        !          3385:        counter = 0;
        !          3386:        while ((*pnt != '\0') && ((*pnt != ' ') && (*pnt != '\t')))
        !          3387:        {
        !          3388:                pnt++;
        !          3389:                counter++;
        !          3390:        }
        !          3391:        while ((*pnt != '\0') && ((*pnt == ' ') || (*pnt == '\t')))
        !          3392:        {
        !          3393:                pnt++;
        !          3394:                counter++;
        !          3395:        }
        !          3396:        return(counter);
        !          3397: }
        !          3398:
        !          3399: wchar_t *
        !          3400: is_in_string(string, substring)        /* a strchr() look-alike for systems without
        !          3401:                                   strchr() */
        !          3402: wchar_t * string, *substring;
        !          3403: {
        !          3404:        wchar_t *full, *sub;
        !          3405:
        !          3406:        for (sub = substring; (sub != NULL) && (*sub != '\0'); sub++)
        !          3407:        {
        !          3408:                for (full = string; (full != NULL) && (*full != '\0');
        !          3409:                                full++)
        !          3410:                {
        !          3411:                        if (*sub == *full)
        !          3412:                                return(full);
        !          3413:                }
        !          3414:        }
        !          3415:        return(NULL);
        !          3416: }
        !          3417:
        !          3418: /*
        !          3419:  |     The following routine tests the input string against the list of
        !          3420:  |     strings, to determine if the string is a unique match with one of the
        !          3421:  |     valid values.
        !          3422:  */
        !          3423:
        !          3424: int
        !          3425: unique_test(string, list)
        !          3426: wchar_t *string;
        !          3427: wchar_t *list[];
        !          3428: {
        !          3429:        int counter;
        !          3430:        int num_match;
        !          3431:        int result;
        !          3432:
        !          3433:        num_match = 0;
        !          3434:        counter = 0;
        !          3435:        while (list[counter] != NULL)
        !          3436:        {
        !          3437:                result = compare(string, list[counter], FALSE);
        !          3438:                if (result)
        !          3439:                        num_match++;
        !          3440:                counter++;
        !          3441:        }
        !          3442:        return(num_match);
        !          3443: }
        !          3444:
        !          3445: /*
        !          3446:  |     The following is to allow for using message catalogs which allow
        !          3447:  |     the software to be 'localized', that is, to use different languages
        !          3448:  |     all with the same binary.  For more information, see your system
        !          3449:  |     documentation, or the X/Open Internationalization Guide.
        !          3450:  */
        !          3451:
        !          3452: void
        !          3453: strings_init()
        !          3454: {
        !          3455:        leave_menu[0].item_string  = L"leave menu";
        !          3456:        leave_menu[1].item_string  = L"save changes";
        !          3457:        leave_menu[2].item_string  = L"no save";
        !          3458:        search_menu[0].item_string = L"search menu";
        !          3459:        search_menu[1].item_string = L"search for ...";
        !          3460:        search_menu[2].item_string = L"search";
        !          3461:        main_menu[0].item_string  = L"main menu";
        !          3462:        main_menu[1].item_string  = L"leave editor";
        !          3463:        main_menu[2].item_string  = L"help";
        !          3464:        main_menu[3].item_string  = L"save file";
        !          3465:        main_menu[4].item_string  = L"redraw screen";
        !          3466:        main_menu[5].item_string  = L"search";
        !          3467:        help_text[0] = L"Control keys:                                                              ";
        !          3468:        help_text[1] = L"^a ascii code           ^i tab                  ^r right                   ";
        !          3469:        help_text[2] = L"^b bottom of text       ^j newline              ^t top of text             ";
        !          3470:        help_text[3] = L"^c command              ^k delete char          ^u up                      ";
        !          3471:        help_text[4] = L"^d down                 ^l left                 ^v undelete word           ";
        !          3472:        help_text[5] = L"^e search prompt        ^m newline              ^w delete word             ";
        !          3473:        help_text[6] = L"^f undelete char        ^n next page            ^x search                  ";
        !          3474:        help_text[7] = L"^g begin of line        ^o end of line          ^y delete line             ";
        !          3475:        help_text[8] = L"^h backspace            ^p prev page            ^z undelete line           ";
        !          3476:        help_text[9] = L"^[ (escape) menu                                                           ";
        !          3477:        help_text[10] = L"                                                                           ";
        !          3478:        help_text[11] = L"Commands:                                                                  ";
        !          3479:        help_text[12] = L"help    : get this info                 file    : print file name          ";
        !          3480:        help_text[13] = L"read    : (disabled)                    char    : ascii code of char       ";
        !          3481:        help_text[14] = L"write   : (disabled)                    case    : case sensitive search    ";
        !          3482:        help_text[15] = L"exit    : leave and save                nocase  : case insensitive search  ";
        !          3483:        help_text[16] = L"quit    : leave, no save                !cmd    : (disabled)               ";
        !          3484:        help_text[17] = L"line    : display line #                0-9     : go to line \"#\"           ";
        !          3485:        help_text[18] = L"expand  : expand tabs                   noexpand: do not expand tabs         ";
        !          3486:        help_text[19] = L"                                                                             ";
        !          3487:        help_text[20] = L"  ee [+#] [-i] [-e] [-h] [file(s)]                                            ";
        !          3488:        help_text[21] = L"+# :go to line #  -i :no info window  -e : don't expand tabs  -h :no highlight";
        !          3489:        control_keys[0] = L"^[ (escape) menu  ^e search prompt  ^y delete line    ^u up     ^p prev page  ";
        !          3490:        control_keys[1] = L"^a ascii code     ^x search         ^z undelete line  ^d down   ^n next page  ";
        !          3491:        control_keys[2] = L"^b bottom of text ^g begin of line  ^w delete word    ^l left                 ";
        !          3492:        control_keys[3] = L"^t top of text    ^o end of line    ^v undelete word  ^r right                ";
        !          3493:        control_keys[4] = L"^c command        ^k delete char    ^f undelete char                          ";
        !          3494:        command_strings[0] = L"help : get help info  |file  : print file name         |line : print line # ";
        !          3495:        command_strings[1] = L"read : (disabled)     |char  : ascii code of char      |0-9 : go to line \"#\"";
        !          3496:        command_strings[2] = L"save: save changes    |case  : case sensitive search   |exit : leave and save ";
        !          3497:        command_strings[3] = L"!cmd : (disabled)     |nocase: ignore case in search   |quit : leave, no save";
        !          3498:        command_strings[4] = L"expand: expand tabs   |noexpand: do not expand tabs                           ";
        !          3499:        com_win_message = L"    press Escape (^[) for menu";
        !          3500:        no_file_string = "no file";
        !          3501:        ascii_code_str = L"ascii code: ";
        !          3502:        command_str = L"command: ";
        !          3503:        char_str = "character = %d";
        !          3504:        unkn_cmd_str = "unknown command \"%S\"";
        !          3505:        non_unique_cmd_msg = L"entered command is not unique";
        !          3506:        line_num_str = "line %d  ";
        !          3507:        line_len_str = "length = %d";
        !          3508:        current_file_str = "current file is \"%S\" ";
        !          3509:        usage0 = L"usage: %s [-i] [-e] [-h] [+line_number] [file(s)]\n";
        !          3510:        usage1 = L"       -i   turn off info window\n";
        !          3511:        usage2 = L"       -e   do not convert tabs to spaces\n";
        !          3512:        usage3 = L"       -h   do not use highlighting\n";
        !          3513:        file_is_dir_msg = "file \"%s\" is a directory";
        !          3514:        new_file_msg = "new file \"%s\"";
        !          3515:        cant_open_msg = "can't open \"%s\"";
        !          3516:        open_file_msg = L"file \"%s\", %d lines";
        !          3517:        file_read_fin_msg = "finished reading file \"%s\"";
        !          3518:        reading_file_msg = "reading file \"%s\"";
        !          3519:        read_only_msg = ", read only";
        !          3520:        file_read_lines_msg = "file \"%s\", %d lines";
        !          3521:        save_file_name_prompt = L"enter name of file: ";
        !          3522:        file_not_saved_msg = "no filename entered: file not saved";
        !          3523:        changes_made_prompt = L"changes have been made, are you sure? (y/n [n]) ";
        !          3524:        yes_char = L"y";
        !          3525:        file_exists_prompt = L"file already exists, overwrite? (y/n) [n] ";
        !          3526:        create_file_fail_msg = "unable to create file \"%s\"";
        !          3527:        writing_file_msg = "writing file \"%s\"";
        !          3528:        file_written_msg = "\"%s\" %d lines, %d characters";
        !          3529:        searching_msg = "           ...searching";
        !          3530:        str_not_found_msg = "string \"%S\" not found";
        !          3531:        search_prompt_str = L"search for: ";
        !          3532:        continue_msg = L"press return to continue ";
        !          3533:        menu_cancel_msg = L"press Esc to cancel";
        !          3534:        menu_size_err_msg = L"menu too large for window";
        !          3535:        press_any_key_msg = L"press any key to continue ";
        !          3536:        ON = L"ON";
        !          3537:        OFF = L"OFF";
        !          3538:        HELP = L"HELP";
        !          3539:        SAVE = L"SAVE";
        !          3540:        READ = L"READ";
        !          3541:        LINE = L"LINE";
        !          3542:        FILE_str = L"FILE";
        !          3543:        CHARACTER = L"CHARACTER";
        !          3544:        REDRAW = L"REDRAW";
        !          3545:        RESEQUENCE = L"RESEQUENCE";
        !          3546:        AUTHOR = L"AUTHOR";
        !          3547:        ee_VERSION = L"VERSION";
        !          3548:        CASE = L"CASE";
        !          3549:        NOCASE = L"NOCASE";
        !          3550:        EXPAND = L"EXPAND";
        !          3551:        NOEXPAND = L"NOEXPAND";
        !          3552:        Exit_string = L"EXIT";
        !          3553:        QUIT_string = L"QUIT";
        !          3554:        INFO = L"INFO";
        !          3555:        NOINFO = L"NOINFO";
        !          3556:        MARGINS = L"MARGINS";
        !          3557:        NOMARGINS = L"NOMARGINS";
        !          3558:        AUTOFORMAT = L"AUTOFORMAT";
        !          3559:        NOAUTOFORMAT = L"NOAUTOFORMAT";
        !          3560:        Echo = L"ECHO";
        !          3561:        PRINTCOMMAND = L"PRINTCOMMAND";
        !          3562:        RIGHTMARGIN = L"RIGHTMARGIN";
        !          3563:        HIGHLIGHT = L"HIGHLIGHT";
        !          3564:        NOHIGHLIGHT = L"NOHIGHLIGHT";
        !          3565:        EIGHTBIT = L"EIGHTBIT";
        !          3566:        NOEIGHTBIT = L"NOEIGHTBIT";
        !          3567:        /*
        !          3568:         |      additions
        !          3569:         */
        !          3570:        emacs_help_text[0] = help_text[0];
        !          3571:        emacs_help_text[1] = L"^a beginning of line    ^i tab                  ^r restore word            ";
        !          3572:        emacs_help_text[2] = L"^b back 1 char          ^j undel char           ^t top of text             ";
        !          3573:        emacs_help_text[3] = L"^c command              ^k delete line          ^u bottom of text          ";
        !          3574:        emacs_help_text[4] = L"^d delete char          ^l undelete line        ^v next page               ";
        !          3575:        emacs_help_text[5] = L"^e end of line          ^m newline              ^w delete word             ";
        !          3576:        emacs_help_text[6] = L"^f forward 1 char       ^n next line            ^x search                  ";
        !          3577:        emacs_help_text[7] = L"^g go back 1 page       ^o ascii char insert    ^y search prompt           ";
        !          3578:        emacs_help_text[8] = L"^h backspace            ^p prev line            ^z next word               ";
        !          3579:        emacs_help_text[9] = help_text[9];
        !          3580:        emacs_help_text[10] = help_text[10];
        !          3581:        emacs_help_text[11] = help_text[11];
        !          3582:        emacs_help_text[12] = help_text[12];
        !          3583:        emacs_help_text[13] = help_text[13];
        !          3584:        emacs_help_text[14] = help_text[14];
        !          3585:        emacs_help_text[15] = help_text[15];
        !          3586:        emacs_help_text[16] = help_text[16];
        !          3587:        emacs_help_text[17] = help_text[17];
        !          3588:        emacs_help_text[18] = help_text[18];
        !          3589:        emacs_help_text[19] = help_text[19];
        !          3590:        emacs_help_text[20] = help_text[20];
        !          3591:        emacs_help_text[21] = help_text[21];
        !          3592:        emacs_control_keys[0] = L"^[ (escape) menu  ^y search prompt  ^k delete line   ^p prev li   ^g prev page";
        !          3593:        emacs_control_keys[1] = L"^o ascii code     ^x search         ^l undelete line ^n next li   ^v next page";
        !          3594:        emacs_control_keys[2] = L"^u end of file    ^a begin of line  ^w delete word   ^b back 1 char           ";
        !          3595:        emacs_control_keys[3] = L"^t top of text    ^e end of line    ^r restore word  ^f forward 1 char        ";
        !          3596:        emacs_control_keys[4] = L"^c command        ^d delete char    ^j undelete char ^z next word              ";
        !          3597:        EMACS_string = L"EMACS";
        !          3598:        NOEMACS_string = L"NOEMACS";
        !          3599:        usage4 = L"       +#   put cursor at line #\n";
        !          3600:        menu_too_lrg_msg = "menu too large for window";
        !          3601:        more_above_str = L"^^more^^";
        !          3602:        more_below_str = L"VVmoreVV";
        !          3603:
        !          3604:
        !          3605:        commands[0] = HELP;
        !          3606:        commands[1] = SAVE;
        !          3607:        commands[2] = READ;
        !          3608:        commands[3] = LINE;
        !          3609:        commands[4] = FILE_str;
        !          3610:        commands[5] = REDRAW;
        !          3611:        commands[6] = RESEQUENCE;
        !          3612:        commands[7] = AUTHOR;
        !          3613:        commands[8] = ee_VERSION;
        !          3614:        commands[9] = CASE;
        !          3615:        commands[10] = NOCASE;
        !          3616:        commands[11] = EXPAND;
        !          3617:        commands[12] = NOEXPAND;
        !          3618:        commands[13] = Exit_string;
        !          3619:        commands[14] = QUIT_string;
        !          3620:        commands[15] = L"<";
        !          3621:        commands[16] = L">";
        !          3622:        commands[17] = L"!";
        !          3623:        commands[18] = L"0";
        !          3624:        commands[19] = L"1";
        !          3625:        commands[20] = L"2";
        !          3626:        commands[21] = L"3";
        !          3627:        commands[22] = L"4";
        !          3628:        commands[23] = L"5";
        !          3629:        commands[24] = L"6";
        !          3630:        commands[25] = L"7";
        !          3631:        commands[26] = L"8";
        !          3632:        commands[27] = L"9";
        !          3633:        commands[28] = CHARACTER;
        !          3634:        commands[29] = NULL;
        !          3635: }
        !          3636:

CVSweb