/*----------------------------------------------------------------------* rtp_term_promptstring *----------------------------------------------------------------------*/ int rtp_term_promptstring (char * string, unsigned int handle_arrows) { /* ----------------------------------- */ /* Endptr always points to */ /* null-terminator. */ /* ----------------------------------- */ char * endptr = &string[rtp_strlen(string)]; int ch; char clbuff[80]; rtp_memset((unsigned char *)clbuff, ' ', 79); clbuff[0] = '\r'; clbuff[78] = '\r'; clbuff[79] = 0; #define CLEAR_LINE() rtp_term_cputs(clbuff) /* ----------------------------------- */ /* Print out the default answer. */ /* ----------------------------------- */ rtp_term_cputs(string); ch = rtp_term_getch( ); while (ch != -1) { switch(ch) { /* ----------------------------------- */ /* Return. */ /* ----------------------------------- */ case '\n': case '\r': rtp_term_putc('\n'); return (0); /* ----------------------------------- */ /* Backspace. */ /* ----------------------------------- */ case '\b': if(endptr > string) { rtp_term_cputs("\b \b"); *(--endptr) = 0; } /* ----------------------------------- */ goto getnext; /* Get next character. */ /* ----------------------------------- */ case TERMINAL_UP_ARROW: if(handle_arrows) { /* ----------------------------------- */ /* Erase the current line. */ /* ----------------------------------- */ CLEAR_LINE(); /* ----------------------------------- */ return (rtp_term_up_arrow ( )); /* TERMINAL_UP_ARROW */ } /* ----------------------------------- */ break; case TERMINAL_DOWN_ARROW: if(handle_arrows) { /* ----------------------------------- */ /* Erase the current line. */ /* ----------------------------------- */ CLEAR_LINE(); /* ----------------------------------- */ return (rtp_term_down_arrow ( )); /* TERMINAL_DOWN_ARROW */ } /* ----------------------------------- */ break; case TERMINAL_ESCAPE: if(handle_arrows) { /* ----------------------------------- */ /* Erase the current line. */ /* ----------------------------------- */ CLEAR_LINE(); /* ----------------------------------- */ return (rtp_term_escape_key ( )); /* TERMINAL_ESCAPE */ } /* ----------------------------------- */ break; } /* ----------------------------------- */ /* Display the editing. */ /* ----------------------------------- */ rtp_term_putc((char)ch); *endptr++ = (char)ch; *endptr = 0; getnext: ch = rtp_term_getch( ); } return (-1); }
/* ** Clear the line to the new width (just reset the line width). */ Boolean _DtTermPrimBufferClearLineWc ( const TermBuffer tb, const short row, short newWidth ) { TermLine line; TermCharInfoRec charInfo; short newLength; /* ** Some simple bounds checking. */ if (!VALID_ROW(tb, row)) { return(False); } /* ** force the width to the desired value ** ** (We take the direct approach because _DtTermPrimBufferSetLineWidth ** doesn't allow the line width to decrease.) */ line = LINE_OF_TBUF(tb, row); /* ** if this line is part of the selection, disown the selection... */ if (IS_IN_SELECTION(line, MIN(newWidth, WIDTH(line)), MAX(newWidth, WIDTH(line)))) { (void) _DtTermPrimSelectDisown(WIDGET(tb)); } /* ** Clip the new width to the buffer width. */ newWidth = MIN(newWidth, COLS(tb)); if (newWidth < WIDTH(line)) { if (newWidth == 0) { newLength = 0; } else { /* ** handle the case of clearing the second column of a two column ** character... */ _DtTermPrimGetCharacterInfo(tb, row, MAX(0, newWidth - 1), &charInfo); if ((charInfo.width == 2 ) && (charInfo.startCol == MAX(0, newWidth - 1))) { /* ** we are clearing column 2 of 2, replace column 1 of 1 with ** a space... */ *charInfo.u.pwc = L' '; } newLength = charInfo.idx + 1; } /* ** Call the helper function if it exists */ if (CLEAR_LINE(tb)) { (*CLEAR_LINE(tb))(tb, row, newWidth); } WRAPPED(line) = False; WIDTH(line) = newWidth; LENGTH(line) = newLength; } return(True); }