- switch (c=(int)input_char()) {
- case F_RETURN: /* CR */
- t_sendl("\r\n", 2); /* yes, print it and */
- goto done; /* get out */
- case F_CLRSCRN: /* clear screen */
- asclrs();
- t_sendl(curline, cl);
- ascurs(0, cp);
- break;
- case F_CSRUP:
- if (noline) { /* no line fetched yet */
- getnext(); /* getnext so getprev gets current */
- noline = 0; /* we now have line */
- }
- bstrncpy(curline, getprev(), sizeof(curline));
- prtcur(curline);
- break;
- case F_CSRDWN:
- noline = 0; /* mark line fetched */
- bstrncpy(curline, getnext(), sizeof(curline));
- prtcur(curline);
- break;
- case F_INSCHR:
- insert_space(curline, sizeof(curline));
- break;
- case F_DELCHR:
- delchr(1, curline, sizeof(curline)); /* delete one character */
- break;
- case F_CSRLFT: /* Backspace */
- backup(1);
- break;
- case F_CSRRGT:
- forward(1,curline, sizeof(curline));
- break;
- case F_ERSCHR: /* Rubout */
- backup(1);
- delchr(1, curline, sizeof(curline));
- break;
- case F_DELEOL:
- t_clrline(0, t_width);
- if (cl > cp)
- cl = cp;
- break;
- case F_NXTWRD:
- forward(next_word(curline),curline, sizeof(curline));
- break;
- case F_PRVWRD:
- backup(prev_word(curline));
- break;
- case F_DELWRD:
- delchr(next_word(curline), curline, sizeof(curline)); /* delete word */
- break;
- case F_NXTMCH: /* Ctl-X */
- if (cl==0) {
- *string = EOS; /* terminate string */
- return(c); /* give it to him */
- }
- /* Note fall through */
- case F_DELLIN:
- case F_ERSLIN:
- backup(cp); /* backup to beginning of line */
- t_clrline(0,t_width); /* erase line */
- cp = 0;
- cl = 0; /* reset cursor counter */
- break;
- case F_SOL:
- backup(cp);
- break;
- case F_EOL:
- while (cp < cl) {
- forward(1,curline, sizeof(curline));
- }
- while (cp > cl) {
- backup(1);
- }
- break;
- case F_TINS: /* toggle insert mode */
- mode_insert = !mode_insert; /* flip bit */
- break;
- default:
- if (c > 255) { /* function key hit */
- if (cl==0) { /* if first character then */
- *string = EOS; /* terminate string */
- return c; /* return it */
- }
- t_honk_horn(); /* complain */
- } else {
- if (mode_insert) {
- insert_space(curline, sizeof(curline));
- }
- curline[cp++] = c; /* store character in line being built */
- t_char((char)c); /* echo character to terminal */
- if (cp > cl) {
- cl = cp; /* keep current length */
- }
- }
- break;
- } /* end switch */
+ if (usrbrk()) {
+ clrbrk();
+ break;
+ }
+ switch (c=input_char()) {
+ case F_RETURN: /* CR */
+ t_sendl("\r\n", 2); /* yes, print it and */
+ goto done; /* get out */
+ case F_CLRSCRN: /* clear screen */
+ asclrs();
+ t_sendl(curline, cl);
+ ascurs(0, cp);
+ break;
+ case F_CSRUP:
+ if (noline) { /* no line fetched yet */
+ getnext(); /* getnext so getprev gets current */
+ noline = 0; /* we now have line */
+ }
+ bstrncpy(curline, getprev(), sizeof(curline));
+ prtcur(curline);
+ break;
+ case F_CSRDWN:
+ noline = 0; /* mark line fetched */
+ bstrncpy(curline, getnext(), sizeof(curline));
+ prtcur(curline);
+ break;
+ case F_INSCHR:
+ insert_space(curline, sizeof(curline));
+ break;
+ case F_DELCHR:
+ delchr(1, curline, sizeof(curline)); /* delete one character */
+ break;
+ case F_CSRLFT: /* Backspace */
+ backup(curline);
+ break;
+ case F_CSRRGT:
+ forward(curline, sizeof(curline));
+ break;
+ case F_ERSCHR: /* Rubout */
+ backup(curline);
+ delchr(1, curline, sizeof(curline));
+ if (cp == 0) {
+ t_char(' ');
+ t_char(0x8);
+ }
+ break;
+ case F_DELEOL:
+ t_clrline(0, t_width);
+ if (cl > cp)
+ cl = cp;
+ break;
+ case F_NXTWRD:
+ i = next_word(curline);
+ while (i--) {
+ forward(curline, sizeof(curline));
+ }
+ break;
+ case F_PRVWRD:
+ i = prev_word(curline);
+ while (i--) {
+ backup(curline);
+ }
+ break;
+ case F_DELWRD:
+ delchr(next_word(curline), curline, sizeof(curline)); /* delete word */
+ break;
+ case F_NXTMCH: /* Ctl-X */
+ if (cl==0) {
+ *string = EOS; /* terminate string */
+ return(c); /* give it to him */
+ }
+ /* Note fall through */
+ case F_DELLIN:
+ case F_ERSLIN:
+ while (cp > 0) {
+ backup(curline); /* backup to beginning of line */
+ }
+ t_clrline(0, t_width); /* erase line */
+ cp = 0;
+ cl = 0; /* reset cursor counter */
+ t_char(' ');
+ t_char(0x8);
+ break;
+ case F_SOL:
+ while (cp > 0) {
+ backup(curline);
+ }
+ break;
+ case F_EOL:
+ while (cp < cl) {
+ forward(curline, sizeof(curline));
+ }
+ while (cp > cl) {
+ backup(curline);
+ }
+ break;
+ case F_TINS: /* toggle insert mode */
+ mode_insert = !mode_insert; /* flip bit */
+ break;
+ default:
+ if (c > 255) { /* function key hit */
+ if (cl==0) { /* if first character then */
+ *string = EOS; /* terminate string */
+ return c; /* return it */
+ }
+ t_honk_horn(); /* complain */
+ } else {
+ if ((c & 0xC0) == 0xC0) {
+ if ((c & 0xFC) == 0xFC) {
+ more = 5;
+ } else if ((c & 0xF8) == 0xF8) {
+ more = 4;
+ } else if ((c & 0xF0) == 0xF0) {
+ more = 3;
+ } else if ((c & 0xE0) == 0xE0) {
+ more = 2;
+ } else {
+ more = 1;
+ }
+ } else {
+ more = 0;
+ }
+ if (mode_insert) {
+ insert_space(curline, sizeof(curline));
+ }
+ curline[cp++] = c; /* store character in line being built */
+ t_char(c); /* echo character to terminal */
+ while (more--) {
+ c= input_char();
+ insert_hole(curline, sizeof(curline));
+ curline[cp++] = c; /* store character in line being built */
+ t_char(c); /* echo character to terminal */
+ }
+ if (cp > cl) {
+ cl = cp; /* keep current length */
+ curline[cp] = 0;
+ }
+ }
+ break;
+ } /* end switch */