rsalz@uunet.uu.net (Rich Salz) (10/18/89)
Submitted-by: Mark James <jamesm@cpsc.UCalgary.CA> Posting-number: Volume 20, Issue 32 Archive-name: reactivekbd/part04 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 4 (of 4)." # Contents: functions.c PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'functions.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'functions.c'\" else echo shar: Extracting \"'functions.c'\" \(35838 characters\) sed "s/^X//" >'functions.c' <<'END_OF_FILE' X#include "file+rk.h" X#include "rk_button.h" X#include <sys/ioctl.h> X#include <stdio.h> X Xextern char *cursor_left, *cursor_right; Xextern char *enter_insert_mode, *exit_insert_mode; Xextern char *pre_insert_char, *post_insert_char; Xextern char *enter_delete_mode, *exit_delete_mode, *delete_a_char; Xextern char *clear_screen; Xextern char *enter_standout_mode, *exit_standout_mode; /* JJD 9-86 */ Xextern int current_key_map; Xextern char meta_prefixes[MAXEXTENSIONS][MAXEXTENSIONS]; Xextern int meta_map[MAXEXTENSIONS][MAXEXTENSIONS]; X Xextern pred_number; Xextern pty_master; Xextern char output_string[],temp_str[]; Xextern output_string_length; Xextern char pred_mode,pred_on_display,lisp_mode,nl_truncate_mode,eol_only_mode,eol_longer_mode,add_space_mode,show_eol_mode; Xextern char pred_buff[]; Xextern (*keymap[128][MAXEXTENSIONS]) (); Xextern char trace_mode; Xextern struct sgttyb new_stdin, old_stdin; Xextern int maxk; Xextern int maxprime; Xextern max_freq; Xextern max_nodes; X Xappend_to_output_string(c) X char c; X{ X output_string[output_string_length++] = c; X} X Xint Xaccept_forward_word(e) X ED_STRUCT *e; X{ /* JJD 9-86 */ X char *ch; X int how_many, num_to_advance; X X if (!pred_mode) X return forward_word(e); X how_many = e->universal_argument; X num_to_advance = 0; X /* truncate prediction to after first NL */ X if (ch = index(pred_buff, '\n')) X *(++ch) = '\0'; X ch = &pred_buff[0]; /* changed from editor data */ X X while (how_many--) { X if ((!isalnum(*ch)) && (*ch != '-') && (*ch != '_')) X while (*ch && (!isalnum(*ch)) && (*ch != '-') && (*ch != '_')) X num_to_advance++, ch++; X X while (*ch && (isalnum(*ch) || (*ch == '-') || (*ch == '_'))) X num_to_advance++, ch++; X if(isspace(*ch)&&add_space_mode&&(*ch!='\n')) X num_to_advance++, ch++; X if (*ch == '\0') X how_many = 0; X } X X e->universal_argument = num_to_advance; X return accept_forward_char(e); X} X Xint BOGUS(e) X ED_STRUCT *e; X{ X e->universal_argument = 1; X write (1, "\07", 1); X return(OK); X} X Xint Xforward_word(e) X ED_STRUCT *e; X{ X X char *ch; X int how_many, num_to_advance; X X how_many = e->universal_argument; X num_to_advance = 0; X ch = e->dot; X X while (how_many--) { X if ((!isalnum(*ch)) && (*ch != '-') && (*ch != '_')) X while (*ch && (!isalnum(*ch)) && (*ch != '-') && (*ch != '_')) X num_to_advance++, ch++; X X while (*ch && (isalnum(*ch) || (*ch == '-') || (*ch == '_'))) X num_to_advance++, ch++; X X if (*ch == '\0') X how_many = 0; X } X X e->universal_argument = num_to_advance; X return forward_char(e); X} X X Xint Xbackward_word(e) X ED_STRUCT *e; X{ X X char *ch, *cb; X int num_to_go, how_many; X X cb = e->current_buffer; X ch = e->dot; X num_to_go = 0; X how_many = e->universal_argument; X X if (ch-- == cb) X return OK; X X while (how_many--) { X while ((ch >= cb) && (!isalnum(*ch)) && (*ch != '-') && (*ch != '_')) X num_to_go++, ch--; X X while ((ch >= cb) && X (isalnum(*ch) || X (*ch == '-') || X (*ch == '_'))) X num_to_go++, ch--; X X if (ch < e->current_buffer) X how_many = 0; X } X X e->universal_argument = num_to_go; X return backward_char(e); X} X X Xint Xdelete_word(e) X ED_STRUCT *e; X{ X X char *ch; X int how_many, num_to_advance; X X how_many = e->universal_argument; X num_to_advance = 0; X ch = e->dot; X X while (how_many--) { X if ((!isalnum(*ch)) && (*ch != '-') && (*ch != '_')) X while (*ch && (!isalnum(*ch)) && (*ch != '-') && (*ch != '_')) X num_to_advance++, ch++; X X while (*ch && (isalnum(*ch) || (*ch == '-') || (*ch == '_'))) X num_to_advance++, ch++; X X if (*ch == '\0') X how_many = 0; X } X X e->universal_argument = num_to_advance; X return delete_char(e); X} X X Xint Xbackspace_word(e) X ED_STRUCT *e; X{ X X char *ch, *cb; X int num_to_go, how_many; X X cb = e->current_buffer; X ch = e->dot; X num_to_go = 0; X how_many = e->universal_argument; X X if (ch-- == cb) X return OK; X X while (how_many--) { X while ((ch >= cb) && (!isalnum(*ch)) && (*ch != '-') && (*ch != '_')) X num_to_go++, ch--; X X while ((ch >= cb) && X (isalnum(*ch) || X (*ch == '-') || X (*ch == '_'))) X num_to_go++, ch--; X X if (ch < e->current_buffer) X how_many = 0; X } X X e->universal_argument = num_to_go; X return backspace_char(e); X} X X Xint Xforward_paren(e) X ED_STRUCT *e; X{ X X char *ch = e->dot - 1; /* pretend to go back one */ X int paren_count = 1; X int num_to_advance = 0; X X while (*++ch && paren_count) { X num_to_advance++; X if (*ch == ')') X paren_count--; /* a ')' with no intervening ()'s */ X else if (*ch == '(') /* search for ) matching this ( */ X while (*++ch && paren_count) { X num_to_advance++; X if (*ch == ')') X paren_count--; X else if (*ch == '(') X paren_count++; X } X } X X e->universal_argument = num_to_advance; X return forward_char(e); X} X X Xint Xbackward_paren(e) X ED_STRUCT *e; X{ X X char *ch, *cb; X int paren_count = 1; X int num_to_go = 0; X X ch = e->dot; X cb = e->current_buffer; X X if (ch != cb) /* not already at the beginning */ X while ((--ch >= cb) && paren_count) { X num_to_go++; X if (*ch == '(') X paren_count--; /* a '(' with no intervening X * ()'s */ X else if (*ch == ')') /* search for ( matching this X * ) */ X while ((--ch >= cb) && paren_count) { X num_to_go++; X if (*ch == '(') X paren_count--; X else if (*ch == ')') X paren_count++; X } X } X X e->universal_argument = num_to_go; X return backward_char(e); X} X Xint Xtoggle_lisp_mode(e) X ED_STRUCT *e; X{ X lisp_mode = !lisp_mode; X return OK; X} X Xint Xtoggle_add_space_mode(e) X ED_STRUCT *e; X{ X add_space_mode = !add_space_mode; X return OK; X} X Xint Xtoggle_show_eol_mode(e) X ED_STRUCT *e; X{ X show_eol_mode = !show_eol_mode; X if (pred_on_display) X erase_pred_buffer(e); X if (pred_mode) X make_a_prediction(pred_buff); X return OK; X} X Xint Xtoggle_nl_truncate_mode(e) X ED_STRUCT *e; X{ /* JJD 9-86 */ X nl_truncate_mode = !nl_truncate_mode; X if (pred_on_display) X erase_pred_buffer(e); X if (pred_mode) X make_a_prediction(pred_buff); X return OK; X} X Xint Xtoggle_eol_only_mode(e) X ED_STRUCT *e; X{ /* JJD 9-86 */ X eol_only_mode = !eol_only_mode; X if (pred_on_display) X erase_pred_buffer(e); X if (pred_mode) X make_a_prediction(pred_buff); X return OK; X} X Xint Xtoggle_eol_longer_mode(e) X ED_STRUCT *e; X{ /* JJD 9-86 */ X eol_longer_mode = !eol_longer_mode; X if (pred_on_display) X erase_pred_buffer(e); X if (pred_mode) X make_a_prediction(pred_buff); X return OK; X} X Xint Xtoggle_pred_mode(e) X ED_STRUCT *e; X{ /* JJD 9-86 */ X pred_mode = !pred_mode; X if (pred_on_display) X erase_pred_buffer(e); X if (pred_mode) X make_a_prediction(pred_buff); X return OK; X} X Xint Xshow_free_nodes(e) X ED_STRUCT *e; X{ /* JJD 1-87, revised 3-89 */ X extern int next_free; X char tbuf[128]; /* extern in rk_button */ X extern long psize; X sprintf(tbuf, "\015\nK=%d, COUNT=%d, NODES=%d, PRIME=%d; psize=%d, nodes=%d\015\n", X maxk, max_freq, max_nodes, maxprime, psize, next_free); X write(1, tbuf, strlen(tbuf)); X write(1, "Continue: ", 10); /* JJD 3-89 added */ X draw_current_edit_line(e); /* JJD 3-89 added */ X return OK; X} X Xint Xshow_version(e) X ED_STRUCT *e; X{ /* JJD 3-89 added */ X char tbuf[128]; X sprintf(tbuf, "\015\nRK_Button Version: %s", RK_VERSION); X strcat(tbuf, ", with file_completion (^C).\015\n"); X write(1, tbuf, strlen(tbuf)); X write(1, "Continue: ", 10); X draw_current_edit_line(e); X return OK; X} X Xint Xprime_from_file(e) X ED_STRUCT *e; X{ /* JJD 9-86 */ X char filename[256]; X FILE *from; X int i; X char c; X extern Buffer Buf; /* externs in rk_button */ X extern char context[MAX_CMD_LINE_LENGTH]; X X erase_current_edit_line(e); X e->dot = e->current_buffer; X e->mark = e->current_buffer; X *(e->dot) = '\0'; X X ioctl(0, TIOCGETP, &new_stdin); X ioctl(0, TIOCSETP, &old_stdin); X strcpy(filename, ""); X printf("File to prime from ([RETURN] to cancel): "); X fflush(stdout); X gets(filename); X if (filename[0] == '\0') { X printf("Command cancelled.\r\n"); X fflush(stdout); X } else { X if ((from = fopen(filename, "r")) == NULL) { X printf("cannot open: %s\r\n", filename); X fflush(stdout); X } else { X while (((int) (c = getc(from))) != EOF) X for (i = maxk; i > 0; i--) X Buf[i] = move_up(Buf[i - 1], c); X fclose(from); X show_free_nodes(e); X } X } X ioctl(0, TIOCSETP, &new_stdin); X X return OK; X} X X Xint Xclose_paren(e) X ED_STRUCT *e; X{ X X char *old_dot; X X if (!lisp_mode) X return self_insert(e); X X old_dot = e->dot; X if (*old_dot != ')') /* if not on a ')', insert one */ X self_insert(e); X X forward_char(e); /* skip past ')' so bkd-prn works */ X backward_paren(e); /* flash back to matching '(' */ X sleep(1); X X e->universal_argument = 1 + old_dot - e->dot; X return forward_char(e); /* skip ahead to old dot + 1 */ X} X X Xint Xopen_paren(e) X ED_STRUCT *e; X{ X X char *old_dot; X X self_insert(e); /* stick in an open_paren */ X if (!lisp_mode) X return OK; X X old_dot = e->dot; X if ((*old_dot == ')') || (*old_dot == 0)) { X e->current_input_char = ')'; /* if on a ')' or at the end */ X self_insert(e); /* then insert matching ')' */ X backward_char(e); /* and go back inside () */ X } X return OK; X} X X Xint Xincrement_universal_argument(e) X ED_STRUCT *e; X{ X X if (e->universal_argument > UNIVERSAL_ARGUMENT_MAXIMUM) X write(1, "\07", 1); X else X e->universal_argument *= 4; X X return OK; X} X X Xint Xclear_display(e) X ED_STRUCT *e; X{ X X e->universal_argument = 1; X output_string_length = 0; X if (clear_screen) { X tputs(clear_screen, ONE_LINE, append_to_output_string); X write(1, output_string, output_string_length); X } else X write(1, "\r\n\r\n", 2); X draw_current_edit_line(e); X X return OK; X} X X X Xint Xprevious_line(e) X ED_STRUCT *e; X{ X X int how_many; X X how_many = e->universal_argument; X e->current_ed_buff_ptr->dot = e->dot; X e->current_ed_buff_ptr->mark = e->mark; X erase_current_edit_line(e); X for (; how_many; --how_many) X e->current_ed_buff_ptr = e->current_ed_buff_ptr->prev_ptr; X e->current_buffer = e->current_ed_buff_ptr->string; X e->dot = e->current_ed_buff_ptr->dot; X e->mark = e->current_ed_buff_ptr->mark; X draw_current_edit_line(e); X e->universal_argument = 1; X return OK; X} X X Xint Xprevious_pred(e) X ED_STRUCT *e; X{ /* JJD 9-86 */ X X if (pred_number) X pred_number--; X return OK; X} X Xint Xnext_pred(e) X ED_STRUCT *e; X{ /* JJD 9-86 */ X X if (++pred_number > 127) X pred_number = 127; X return OK; X} X Xint Xnext_line(e) X ED_STRUCT *e; X{ X X int how_many; X X how_many = e->universal_argument; X e->current_ed_buff_ptr->dot = e->dot; X X e->current_ed_buff_ptr->mark = e->mark; X X erase_current_edit_line(e); X for (; how_many; --how_many) X e->current_ed_buff_ptr = e->current_ed_buff_ptr->next_ptr; X e->current_buffer = e->current_ed_buff_ptr->string; X e->dot = e->current_ed_buff_ptr->dot; X X e->mark = e->current_ed_buff_ptr->mark; X X draw_current_edit_line(e); X e->universal_argument = 1; X return OK; X} X X Xint Xdiscard_current_edit_line(e) X ED_STRUCT *e; X{ X X strcpy(e->kill_buffer, e->current_buffer); X erase_current_edit_line(e); X e->dot = e->current_buffer; X X e->mark = e->current_buffer; X X *e->dot = '\0'; X X return OK; X} X X Xint Xdiscard_rest_of_line(e) X ED_STRUCT *e; X{ X X strcpy(e->kill_buffer, e->dot); X e->universal_argument = strlen(e->dot); X X if (e->universal_argument == 0) { X e->universal_argument = 1; X return OK; X } else X X { X if (e->mark > e->dot) X e->mark = e->dot; X return delete_char(e); X } X X} X X Xint Xyank_from_kill_buffer(e) X ED_STRUCT *e; X{ X X int count; X X output_string_length = 0; X strcpy(temp_str, e->dot); X strcpy(e->dot, e->kill_buffer); X X if (e->mark > e->dot) X e->mark += strlen(e->kill_buffer); X X e->dot = e->dot + strlen(e->kill_buffer); X strcpy(e->dot, temp_str); X display_string_into_output_string(e->kill_buffer); X count = display_string_into_output_string(temp_str); X for (; count; --count) X tputs(cursor_left, ONE_LINE, append_to_output_string); X write(1, output_string, output_string_length); X X return OK; X} X X X Xint Xdisplay_pred_buffer(e) X ED_STRUCT *e; X{ /* JJD 9-86 ???? */ X X int count; X X output_string[0] = '\0'; X output_string_length = 0; X X if (enter_standout_mode) X tputs(enter_standout_mode, ONE_LINE, append_to_output_string); X count = display_string_into_output_string(pred_buff); X if (enter_standout_mode) X tputs(exit_standout_mode, ONE_LINE, append_to_output_string); X count += display_string_into_output_string(e->dot); X X for (; count; --count) X tputs(cursor_left, ONE_LINE, append_to_output_string); X write(1, output_string, output_string_length); X pred_on_display = 1; X X return OK; X} X X Xint Xerase_pred_buffer(e) X ED_STRUCT *e; X{ /* JJD 9-86 */ X X int num_to_erase, count; X X output_string[0] = '\0'; X output_string_length = 0; X X if (enter_standout_mode) X tputs(exit_standout_mode, ONE_LINE, append_to_output_string); X display_string_into_output_string(e->dot); X X num_to_erase = get_display_length(pred_buff); X for (count = num_to_erase; count; --count) X output_string[output_string_length++] = ' '; X num_to_erase += get_display_length(e->dot); X for (count = num_to_erase; count; --count) X tputs(cursor_left, ONE_LINE, append_to_output_string); X write(1, output_string, output_string_length); X pred_on_display = 0; X X return OK; X} X Xint Xinsert_interrupt_char(e) X ED_STRUCT *e; X{ X X struct tchars pty_tchars; X X ioctl(pty_master, TIOCGETC, &pty_tchars); X X erase_current_edit_line(e); X e->dot = e->current_buffer; X X e->mark = e->current_buffer; X X *(e->dot++) = pty_tchars.t_intrc; X *(e->dot) = '\0'; X return FINISHED_BUT_DONT_ADD_CTRL_M; X} X Xint Xinsert_quit_char(e) X ED_STRUCT *e; X{ X X struct tchars pty_tchars; X X ioctl(pty_master, TIOCGETC, &pty_tchars); X X erase_current_edit_line(e); X e->dot = e->current_buffer; X e->mark = e->current_buffer; X *(e->dot++) = pty_tchars.t_quitc; X *(e->dot) = '\0'; X return FINISHED_BUT_DONT_ADD_CTRL_M; X} X Xint Xinsert_stop_char(e) X ED_STRUCT *e; X{ /* JJD 9-86 */ X X struct tchars pty_tchars; X X ioctl(pty_master, TIOCGETC, &pty_tchars); X X erase_current_edit_line(e); X e->dot = e->current_buffer; X e->mark = e->current_buffer; X *(e->dot++) = pty_tchars.t_stopc; X *(e->dot) = '\0'; X return FINISHED_BUT_DONT_ADD_CTRL_M; X} X Xint Xinsert_start_char(e) X ED_STRUCT *e; X{ /* JJD 9-86 */ X X struct tchars pty_tchars; X X ioctl(pty_master, TIOCGETC, &pty_tchars); X X erase_current_edit_line(e); X e->dot = e->current_buffer; X e->mark = e->current_buffer; X *(e->dot++) = pty_tchars.t_startc; X *(e->dot) = '\0'; X return FINISHED_BUT_DONT_ADD_CTRL_M; X} X Xint Xinsert_eof_char(e) X ED_STRUCT *e; X{ /* JJD 9-86 */ X X struct tchars pty_tchars; X X ioctl(pty_master, TIOCGETC, &pty_tchars); X X erase_current_edit_line(e); X e->dot = e->current_buffer; X e->mark = e->current_buffer; X *(e->dot++) = pty_tchars.t_eofc; X *(e->dot) = '\0'; X return FINISHED_BUT_DONT_ADD_CTRL_M; X} X Xint Xinsert_suspend_char(e) X ED_STRUCT *e; X{ X X struct ltchars pty_ltchars; X X ioctl(pty_master, TIOCGLTC, &pty_ltchars); X X erase_current_edit_line(e); X e->dot = e->current_buffer; X e->mark = e->current_buffer; X *(e->dot++) = pty_ltchars.t_suspc; X *(e->dot) = '\0'; X return FINISHED_BUT_DONT_ADD_CTRL_M; X} X X X Xint Xtwiddle_chars(e) X ED_STRUCT *e; X{ X X char temp_char; X int num_to_back_up, count; X X output_string_length = 0; X X if (strlen(e->current_buffer) == 0) { X *e->dot++ = '\024'; X *e->dot = '\0'; X return FINISHED_BUT_DONT_ADD_CTRL_M; X } else if ((e->dot - e->current_buffer) < 2) X write(1, "\07", 1); X else { X temp_char = *(e->dot - 1); X *(e->dot - 1) = *(e->dot - 2); X *(e->dot - 2) = temp_char; X num_to_back_up = get_char_display_length(*(e->dot - 2)); X num_to_back_up += get_char_display_length(*(e->dot - 1)); X for (count = num_to_back_up; count; --count) X tputs(cursor_left, ONE_LINE, append_to_output_string); X display_char_into_output_string(*(e->dot - 2)); X display_char_into_output_string(*(e->dot - 1)); X write(1, output_string, output_string_length); X } X X e->universal_argument = 1; X X return OK; X} X Xint Xbeginning_of_line(e) X ED_STRUCT *e; X{ X X e->universal_argument = 1; X output_string[0] = '\0'; X output_string_length = 0; X while (e->dot != e->current_buffer) { X e->dot--; X if ((*(e->dot) < 32) || (*(e->dot) == 127)) { X tputs(cursor_left, ONE_LINE, append_to_output_string); X tputs(cursor_left, ONE_LINE, append_to_output_string); X } else X tputs(cursor_left, ONE_LINE, append_to_output_string); X } X X write(1, output_string, output_string_length); X X return OK; X} X Xint Xend_of_line(e) X ED_STRUCT *e; X{ X X e->universal_argument = 1; X output_string[0] = '\0'; X output_string_length = 0; X display_string_into_output_string(e->dot); X e->dot = &(e->current_buffer[strlen(e->current_buffer)]); X X write(1, output_string, output_string_length); X X return OK; X} X Xint Xquote_char(e) X ED_STRUCT *e; X{ X X char quoted_char; X X READ(0, "ed_char, 1); X quoted_char &= 127; X if (quoted_char == '\0') { X write(1, "\07", 1); X return OK; X } else { X e->current_input_char = quoted_char; X return self_insert(e); X } X} X Xmeta_prefix(e) X ED_STRUCT *e; X{ X char metad_char; X int i=0; X int status; X X if(e==0) X abortit("meta_prefix passed a nil pointer, aborting...\n",-1); X X while((i<MAXEXTENSIONS) && (meta_prefixes[i][current_key_map]) && X (e->current_input_char!=meta_prefixes[i][current_key_map])) X i++; X if(i==MAXEXTENSIONS) X return(BOGUS(e)); X current_key_map=meta_map[i][current_key_map]; X X if (pred_mode && pred_buff[0] && !pred_on_display) X display_pred_buffer(e); /* JJD 9-86 */ X READ(0, &metad_char, 1); X if (pred_on_display) erase_pred_buffer (e); /* JJD 3-89 added */ X metad_char &= 127; /* clear high bit */ X e->current_input_char = metad_char; X status = (keymap[(int) metad_char][current_key_map])(e); X current_key_map=0; X return(status); X} X X X X X Xint Xbackward_char(e) X ED_STRUCT *e; X{ X X int num_to_go, count, needs_beep; X X output_string[0] = '\0'; X output_string_length = 0; X X if ((e->dot - e->universal_argument) < e->current_buffer) X num_to_go = e->dot - e->current_buffer, needs_beep = 1; X else X num_to_go = e->universal_argument, needs_beep = 0; X X count = num_to_go; X while (count-- > 0) { X e->dot--; X tputs(cursor_left, ONE_LINE, append_to_output_string); X if ((*(e->dot) < 32) || (*(e->dot) == 127)) X tputs(cursor_left, ONE_LINE, append_to_output_string); X } X X if (needs_beep) X output_string[output_string_length++] = '\07'; X X write(1, output_string, output_string_length); X X e->universal_argument = 1; X X return OK; X} X Xint Xaccept_to_end_of_line(e) X ED_STRUCT *e; X{ /* JJD 9-86 */ X X char *ptr; X X if (!pred_mode) X return end_of_line(e); X /* truncate prediction to after first NL */ X if (ptr = index(pred_buff, '\n')){ X *(++ptr) = '\0'; X } X /* only go to end of prediction */ X e->universal_argument = strlen(pred_buff); X return accept_forward_char(e); X} X Xint Xaccept_forward_char(e) X ED_STRUCT *e; X{ /* JJD 9-86 */ X X int num_to_go, count, needs_beep, finished = 0; X X if (!pred_mode) X return forward_char(e); X if (pred_buff[0] == '\n') X return finish_editing_line(e); X output_string[0] = '\0'; X output_string_length = 0; X X num_to_go = strlen(pred_buff); X if (e->universal_argument > num_to_go) /* to end of prediction */ X needs_beep = 1; X else X num_to_go = e->universal_argument, needs_beep = 0; X X /* there is at most 1 NL at the end of the prediction */ X if (pred_buff[num_to_go - 1] == '\n') { X num_to_go--; X finished = 1; X } X pred_buff[num_to_go] = '\0'; X display_string_into_output_string(pred_buff); X strcat(pred_buff, e->dot); X strcpy(e->dot, pred_buff); X if (e->mark > e->dot) X e->mark += num_to_go; X e->dot += num_to_go; X count = display_string_into_output_string(e->dot); X for (; count; --count) X tputs(cursor_left, ONE_LINE, append_to_output_string); X X if (needs_beep) X output_string[output_string_length++] = '\07'; X write(1, output_string, output_string_length); X e->universal_argument = 1; X X if (finished) X return finish_editing_line(e); X else X return OK; X} X Xint Xforward_char(e) X ED_STRUCT *e; X{ X X int num_to_go, count, needs_beep; X X output_string[0] = '\0'; X output_string_length = 0; X X if (e->universal_argument > strlen(e->dot)) X num_to_go = strlen(e->dot), needs_beep = 1; X else X num_to_go = e->universal_argument, needs_beep = 0; X X count = num_to_go; X while (count-- > 0) X display_char_into_output_string(*(e->dot++)); X X if (needs_beep) X output_string[output_string_length++] = '\07'; X X write(1, output_string, output_string_length); X X e->universal_argument = 1; X X return OK; X} X X Xint Xbackspace_char(e) X ED_STRUCT *e; X{ X X int rest_of_line_display_length, count; X int num_to_delete; X char *c, *new_dot; X char *old_dot = e->dot; /* JJD 3-89 added */ X X output_string[0] = '\0'; X output_string_length = 0; X X if ((e->dot - e->current_buffer) < e->universal_argument) X new_dot = e->current_buffer; X else X new_dot = e->dot - e->universal_argument; X X num_to_delete = 0; X for (c = e->dot - 1; c >= new_dot; --c) X if ((*c < 32) || (*c == 127)) X num_to_delete += 2; X else X num_to_delete++; X X if (delete_a_char) { X for (count = num_to_delete; count; --count) X tputs(cursor_left, ONE_LINE, append_to_output_string); X X if (enter_delete_mode) X tputs(enter_delete_mode, ONE_LINE, append_to_output_string); X X for (count = num_to_delete; count; --count) X tputs(delete_a_char, ONE_LINE, append_to_output_string); X X if (enter_delete_mode) X tputs(exit_delete_mode, ONE_LINE, append_to_output_string); X } else { X for (count = num_to_delete; count; --count) X tputs(cursor_left, ONE_LINE, append_to_output_string); X X rest_of_line_display_length = X display_string_into_output_string(e->dot); X X for (count = num_to_delete; count; --count) X output_string[output_string_length++] = ' '; X X for (count = num_to_delete + rest_of_line_display_length; count; --count) X tputs(cursor_left, ONE_LINE, append_to_output_string); X } X X if (e->dot - e->universal_argument < e->current_buffer) X output_string[output_string_length++] = '\07'; X X strcpy(temp_str, e->dot); X strcpy(new_dot, temp_str); X e->dot = new_dot; X if (e->mark >= new_dot) X e->mark -= (old_dot - new_dot); X e->universal_argument = 1; X write(1, output_string, output_string_length); X X return OK; X} X Xint Xdelete_char(e) X ED_STRUCT *e; X{ X X int count; X int num_to_delete, num_to_back_up; X char *c, *new_dot; X char *old_dot = e->dot; /* JJD 3-89 added */ X X if (*(e->dot) == '\0') { X struct tchars pty_tchars; X ioctl(pty_master, TIOCGETC, &pty_tchars); X erase_pred_buffer(e); X erase_current_edit_line(e); X *(e->dot++) = pty_tchars.t_eofc; X *(e->dot) = '\0'; X return FINISHED_BUT_DONT_ADD_CTRL_M; X } X output_string[0] = '\0'; X output_string_length = 0; X X if (e->universal_argument > strlen(e->dot)) X new_dot = e->dot + strlen(e->dot); X else X new_dot = e->dot + e->universal_argument; X X num_to_delete = 0; X for (c = e->dot; c < new_dot; ++c) X if ((*c < 32) || (*c == 127)) X num_to_delete += 2; X else X num_to_delete++; X X if (delete_a_char) { X if (enter_delete_mode) X tputs(enter_delete_mode, ONE_LINE, append_to_output_string); X X for (count = num_to_delete; count; --count) X tputs(delete_a_char, ONE_LINE, append_to_output_string); X X if (enter_delete_mode) X tputs(exit_delete_mode, ONE_LINE, append_to_output_string); X } else { X num_to_back_up = display_string_into_output_string(new_dot); X for (count = num_to_delete; count; --count) X output_string[output_string_length++] = ' '; X for (count = num_to_back_up + num_to_delete; count; --count) X tputs(cursor_left, ONE_LINE, append_to_output_string); X } X X if (e->universal_argument > strlen(e->dot)) X output_string[output_string_length++] = '\07'; X X strcpy(temp_str, new_dot); X strcpy(e->dot, temp_str); X e->universal_argument = 1; X if (e->mark >= new_dot) X e->mark += (old_dot - new_dot); X write(1, output_string, output_string_length); X X return OK; X} X X Xint Xfinish_editing_line(e) X ED_STRUCT *e; X{ X X char *old_dot; X X e->universal_argument = 1; X old_dot = e->dot; X beginning_of_line(e); X e->dot = old_dot; /* necessary to preserve cursor position X * accross newlines */ X return FINISHED_EDITING; X} X X Xint Xself_insert(e) X ED_STRUCT *e; X{ X X int num_to_back_up, count; X char *old_dot = e->dot; /* JJD 3-89 added */ X X strcpy(output_string, ""); X output_string_length = 0; X X if (*(e->dot) == '\0') { X for (count = e->universal_argument; count; --count) X display_char_into_output_string(e->current_input_char); X } else { X if (enter_insert_mode || pre_insert_char) { X if (enter_insert_mode) X tputs(enter_insert_mode, ONE_LINE, append_to_output_string); X X for (count = e->universal_argument; count; --count) { X if (pre_insert_char) X tputs(pre_insert_char, ONE_LINE, append_to_output_string); X if ((e->current_input_char < 32)) { X output_string[output_string_length++] = '^'; X if (post_insert_char) X tputs(post_insert_char, ONE_LINE, X append_to_output_string); X if (pre_insert_char) X tputs(pre_insert_char, ONE_LINE, X append_to_output_string); X output_string[output_string_length++] = X e->current_input_char + '@'; X } else if (e->current_input_char == 127) { X output_string[output_string_length++] = '^'; X if (post_insert_char) X tputs(post_insert_char, ONE_LINE, X append_to_output_string); X if (pre_insert_char) X tputs(pre_insert_char, ONE_LINE, X append_to_output_string); X output_string[output_string_length++] = '?'; X } else X output_string[output_string_length++] = X e->current_input_char; X X if (post_insert_char) X tputs(post_insert_char, ONE_LINE, append_to_output_string); X } X X if (enter_insert_mode) X tputs(exit_insert_mode, ONE_LINE, append_to_output_string); X } else { X for (count = e->universal_argument; count; --count) X display_char_into_output_string(e->current_input_char); X num_to_back_up = X display_string_into_output_string(e->dot); X for (count = num_to_back_up; count; --count) X tputs(cursor_left, ONE_LINE, append_to_output_string); X } X } X X strcpy(temp_str, e->dot); X for (count = e->universal_argument; count; --count) X *(e->dot++) = e->current_input_char; X strcpy(e->dot, temp_str); X if (e->mark > old_dot) X e->mark += (e->dot - old_dot); X write(1, output_string, output_string_length); X X e->universal_argument = 1; X return OK; X} X X Xrun_program_connected_to_standard_tty(cmd) X char *cmd; X{ X X int status; X void (*sig)(); X X ioctl(0, TIOCGETP, &new_stdin); X ioctl(0, TIOCSETP, &old_stdin); X printf("Now running \"%s\"\r\n", cmd); X sig=signal(SIGCHLD,SIG_DFL); X status = system(cmd); X signal(SIGCHLD,sig); X printf("Finished running \"%s\"\r\n", cmd); X ioctl(0, TIOCSETP, &new_stdin); X write(1, "Continue: ", 10); X return status; X} X X Xquietly_run_program_connected_to_standard_tty(cmd) X char *cmd; X{ X X int status; X void (*sig)(); X X ioctl(0, TIOCGETP, &new_stdin); X ioctl(0, TIOCSETP, &old_stdin); X sig=signal(SIGCHLD,SIG_DFL); X status = system(cmd); X signal(SIGCHLD,sig); X ioctl(0, TIOCSETP, &new_stdin); X return status; X} X X X Xint Xuppercase_word(e) X ED_STRUCT *e; X{ X X char *ch, *cb; X X cb = e->current_buffer; X ch = e->dot; X X if (ch != cb) /* not at beginning of buffer */ X while ((ch >= cb) && (!isalnum(*ch)) && (*ch != '-') && (*ch != '_')) X ch--; /* search backwards until in a word */ X X while ((ch >= cb) && (isalnum(*ch) || (*ch == '-') || (*ch == '_'))) X ch--; /* find first letter in word */ X X while (isalnum(*++ch) || (*ch == '-') || (*ch == '_')) X if ((*ch >= 'a') && (*ch <= 'z')) X *ch -= 32; /* uppercase all lowers */ X X erase_current_edit_line(e); X draw_current_edit_line(e); X return OK; X} X Xint Xlowercase_word(e) X ED_STRUCT *e; X{ X X char *ch, *cb; X X cb = e->current_buffer; X ch = e->dot; X X if (ch != cb) /* not at beginning of buffer */ X while ((ch >= cb) && (!isalnum(*ch)) && (*ch != '-') && (*ch != '_')) X ch--; /* search backwards until in a word */ X X while ((ch >= cb) && (isalnum(*ch) || (*ch == '-') || (*ch == '_'))) X ch--; /* find first letter in word */ X X while (isalnum(*++ch) || (*ch == '-') || (*ch == '_')) X if ((*ch >= 'A') && (*ch <= 'Z')) X *ch += 32; /* lowercase all uppers */ X X erase_current_edit_line(e); X draw_current_edit_line(e); X return OK; X} X X Xint Xcapitalize_word(e) X ED_STRUCT *e; X{ X X char *ch, *cb; X int subword_flag = 0; X X cb = e->current_buffer; X ch = e->dot; X X if (ch != cb) /* not at beginning of buffer */ X while ((ch >= cb) && (!isalnum(*ch)) && (*ch != '-') && (*ch != '_')) X ch--; /* search backwards until in a word */ X X while ((ch >= cb) && (isalnum(*ch) || (*ch == '-') || (*ch == '_'))) X ch--; /* find first letter in word */ X X if ((*++ch >= 'a') && (*ch <= 'z')) X *ch -= 32; /* uppercase first letter */ X X while (isalnum(*++ch) || (*ch == '-') || (*ch == '_')) X if (!isalnum(*ch)) X subword_flag = 1; /* next char starts subword */ X else if (subword_flag) { X subword_flag = 0; X if ((*ch >= 'a') && (*ch <= 'z')) X *ch -= 32; /* uppercase first letter */ X } else if ((*ch >= 'A') && (*ch <= 'Z')) X *ch += 32; /* lowercase subsequent letters */ X X erase_current_edit_line(e); X draw_current_edit_line(e); X return OK; X} X Xint Xul_to_dash_word(e) X ED_STRUCT *e; X{ X X char *ch, *cb; X X cb = e->current_buffer; X ch = e->dot; X X if (ch != cb) /* not at beginning of buffer */ X while ((ch >= cb) && (!isalnum(*ch)) && (*ch != '-') && (*ch != '_')) X ch--; /* search backwards until in a word */ X X while ((ch >= cb) && (isalnum(*ch) || (*ch == '-') || (*ch == '_'))) X ch--; /* find first letter in word */ X X while (isalnum(*++ch) || (*ch == '-') || (*ch == '_')) X if (*ch == '_') /* replace underscores with hyphens */ X *ch = '-'; X X erase_current_edit_line(e); X draw_current_edit_line(e); X return OK; X} X Xint Xdash_to_ul_word(e) X ED_STRUCT *e; X{ X X char *ch, *cb; X X cb = e->current_buffer; X ch = e->dot; X X if (ch != cb) /* not at beginning of buffer */ X while ((ch >= cb) && (!isalnum(*ch)) && (*ch != '-') && (*ch != '_')) X ch--; /* search backwards until in a word */ X X while ((ch >= cb) && (isalnum(*ch) || (*ch == '-') || (*ch == '_'))) X ch--; /* find first letter in word */ X X while (isalnum(*++ch) || (*ch == '-') || (*ch == '_')) X if (*ch == '-') /* replace hyphens with underscores */ X *ch = '_'; X X erase_current_edit_line(e); X draw_current_edit_line(e); X return OK; X} X X X/* Xint Xdescribe_bindings(e) X ED_STRUCT *e; X{ X X char cmd[256]; X X erase_current_edit_line(e); X write(1, "One moment. . .", 15); X strcpy(cmd, "/usr/ucb/more "); X strcat(cmd, getenv("HOME")); X strcat(cmd, ".rk.key_map"); X quietly_run_program_connected_to_standard_tty(cmd); X write(1, "Continue: ", 10); X draw_current_edit_line(e); X return OK; X} X*/ X X X Xrun_tty_program(e) X ED_STRUCT *e; X{ X X char cmd[512]; X X erase_current_edit_line(e); X e->dot = e->current_buffer; X e->mark = e->current_buffer; X *(e->dot) = '\0'; X X ioctl(0, TIOCGETP, &new_stdin); X ioctl(0, TIOCSETP, &old_stdin); X strcpy(cmd, ""); X printf("Command to run ([RETURN] to cancel): "); X fflush(stdout); X gets(cmd); X if (cmd[0] == '\0') { X printf("Command cancelled.\r\n"); X ioctl(0, TIOCSETP, &new_stdin); X } else { X ioctl(0, TIOCSETP, &new_stdin); X run_program_connected_to_standard_tty(cmd); X } X X return OK; X} X Xrun_talk(e) X ED_STRUCT *e; X{ X X char cmd[256], *who_to; X X erase_current_edit_line(e); X e->dot = e->current_buffer; X e->mark = e->current_buffer; X *(e->dot) = '\0'; X X ioctl(0, TIOCGETP, &new_stdin); X ioctl(0, TIOCSETP, &old_stdin); X strcpy(cmd, "talk "); X who_to = &cmd[5]; X printf("Talk to whom ([RETURN] to cancel): "); X fflush(stdout); X gets(who_to); X if (who_to[0] == '\0') { X printf("Talk cancelled.\r\n"); X ioctl(0, TIOCSETP, &new_stdin); X } else { X ioctl(0, TIOCSETP, &new_stdin); X run_program_connected_to_standard_tty(cmd); X } X X return OK; X} X Xrun_write(e) X ED_STRUCT *e; X{ X X char cmd[256], *who_to; X X erase_current_edit_line(e); X e->dot = e->current_buffer; X e->mark = e->current_buffer; X *(e->dot) = '\0'; X X ioctl(0, TIOCGETP, &new_stdin); X ioctl(0, TIOCSETP, &old_stdin); X strcpy(cmd, "write "); X who_to = &cmd[6]; X printf("write to whom ([RETURN] to cancel): "); X fflush(stdout); X gets(who_to); X if (who_to[0] == '\0') { X printf("Write cancelled.\r\n"); X ioctl(0, TIOCSETP, &new_stdin); X } else { X ioctl(0, TIOCSETP, &new_stdin); X run_program_connected_to_standard_tty(cmd); X } X X return OK; X} X Xrun_pp(e) X ED_STRUCT *e; X{ /* JJD 9-86 */ X X char cmd[256], *who_to; X X erase_current_edit_line(e); X e->dot = e->current_buffer; X e->mark = e->current_buffer; X *(e->dot) = '\0'; X X ioctl(0, TIOCGETP, &new_stdin); X ioctl(0, TIOCSETP, &old_stdin); X strcpy(cmd, "pp "); X who_to = &cmd[3]; X printf("pp what file ([RETURN] to cancel): "); X fflush(stdout); X gets(who_to); X if (who_to[0] == '\0') { X printf("pp cancelled.\r\n"); X ioctl(0, TIOCSETP, &new_stdin); X } else { X ioctl(0, TIOCSETP, &new_stdin); X run_program_connected_to_standard_tty(cmd); X } X X return OK; X} X Xrun_mesg(e) X ED_STRUCT *e; X{ X X char cmd[256], *on_or_off; X X erase_current_edit_line(e); X e->dot = e->current_buffer; X e->mark = e->current_buffer; X *(e->dot) = '\0'; X X ioctl(0, TIOCGETP, &new_stdin); X ioctl(0, TIOCSETP, &old_stdin); X strcpy(cmd, "mesg "); X on_or_off = &cmd[5]; X printf("Do you want \"mesg y\" or \"mesg n\" "); X printf("(type y or n and press [RETURN]): "); X fflush(stdout); X gets(on_or_off); X if (!strncmp(on_or_off, "on", 2)) X strcpy(on_or_off, "y"); X else if (!strncmp(on_or_off, "off", 3)) X strcpy(on_or_off, "n"); X else if (*on_or_off == 'y' || *on_or_off == 'n') X on_or_off[1] = '\0'; X else if (on_or_off[0] == '\0') { X printf("Mesg cancelled.\r\n"); X ioctl(0, TIOCSETP, &new_stdin); X return OK; X } else { X printf("Mesg cancelled because you didn't respond with y or n.\r\n"); X ioctl(0, TIOCSETP, &new_stdin); X return OK; X } X X ioctl(0, TIOCSETP, &new_stdin); X run_program_connected_to_standard_tty(cmd); X return OK; X} X Xint describe_arguments(e) X ED_STRUCT *e; X{ X extern num_buffers; X extern char silent; X extern char login; X extern max_len; X extern max_eol; X extern char *zero_freq_file; X extern char *prime_file; X extern char *key_file; X X X printf("\r\nCurrent Command Line Argument Values:\r\n"); X printf(" -b (Number of buffers) = %d\r\n", num_buffers); X printf(" -e (End of Line length) = %d\r\n",max_eol); X printf(" -f (Maximum Frequency) = %d\r\n",max_freq); X printf(" -i (Inline Length) = %d\r\n",max_len); X printf(" -k (Key Bindings File) = \"%s\"\r\n",key_file); X printf(" -n (Nodes to allocate) = %d\r\n",max_nodes); X printf(" -o (Order of model) = %d\r\n",maxk); X printf(" -p (Prime File) = \"%s\"\r\n",prime_file); X printf(" -s (Maximum to prime) = %d\r\n",maxprime); X printf(" -z (Zero Frequency File)= \"%s\"\r\n",zero_freq_file); X printf(" -A (add_space_mode) = %s\r\n",add_space_mode?"TRUE":"FALSE"); X printf(" -E (eol_only_mode) = %s\r\n",eol_only_mode?"TRUE":"FALSE"); X printf(" -L (eol_longer_mode) = %s\r\n",eol_longer_mode?"TRUE":"FALSE"); X printf(" -N (nl_truncate_mode) = %s\r\n",nl_truncate_mode?"TRUE":"FALSE"); X printf(" -P (pred_mode) = %s\r\n",pred_mode?"TRUE":"FALSE"); X printf(" -S (show_eol_mode) = %s\r\n",show_eol_mode?"TRUE":"FALSE"); X printf(" -g (login shell) = %s\r\n",login?"TRUE":"FALSE"); X printf(" -l (lisp_mode) = %s\r\n",lisp_mode?"TRUE":"FALSE"); X printf(" -m (silent startup) = %s\r\n",silent?"TRUE":"FALSE"); X write(1, "Continue: ", 10); X draw_current_edit_line(e); X return OK; X} END_OF_FILE if test 35838 -ne `wc -c <'functions.c'`; then echo shar: \"'functions.c'\" unpacked with wrong size! fi # end of 'functions.c' fi echo shar: End of archive 4 \(of 4\). cp /dev/null ark4isdone MISSING="" for I in 1 2 3 4 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 4 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Please send comp.sources.unix-related mail to rsalz@uunet.uu.net. Use a domain-based address or give alternate paths, or you may lose out.