[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

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