/** * * This module defines the various console I/O functions. They may * be called directly, using the names included here, or the header * file CONIO.H may be included so that more standard names may be * used. This source module is provided so that users may customize * the console I/O functions, if desired. Note that "cprintf" and * "cscanf" (included in MC.LIB) call the functions "putch", "getch", * and "ungetch". * **/ #define BDOS_IN 7 /* input function for "getch" */ #define BDOS_OUT 6 /* output function for "putch" */ #define BDOS_CKS 11 /* check keyboard status for "kbhit" */ #define BDOS_BKI 10 /* buffered keyboardd input for "cgets" */ #define BDOS_PRT 9 /* print string for "cputs" */ static char pushback; /* character save for "ungetch" */ /** * * name getch -- get character from console * * synopsis c = getch(); * char c; input character * * description This function obtains the next character typed at * the console or, if one was pushed back via "ungetch", * returns the previously pushed back character. * **/ getch() { int c; if (pushback != '\0') { /* character was pushed back */ c = pushback; pushback = '\0'; return(c); } return(bdos(BDOS_IN, 0xFF) & 127); } /** * * name putch -- send character directly to console * * synopsis putch(c); * char c; character to be sent * * description This function sends the specified character directly * to the user's console. * **/ putch(c) char c; { bdos(BDOS_OUT, c&127); return(c); } /** * * name ungetch -- push character back to console * * synopsis r = ungetch(c); * int r; return code * char c; character to be pushed back * * description This function pushes the indicated character back * on the console. Only a single level of pushback is * allowed. The effect is to cause "getch" to return * the pushed-back character the next time it is called. * * returns r = -1 if character already pushed back * = c otherwise * **/ ungetch(c) char c; { if (pushback != '\0') return(-1); pushback = c; return(c); } /** * * name cgets -- get string directly from console * * synopsis p = cgets(s); * char *p; pointer to result string * char *s; string buffer (first byte = count) * * description This function obtains a string directly from the * user's console. This version uses the buffered * keyboard input function supported by the BDOS, so * that all of the line editing capabilities are available. * The first byte of "s" must be initialized to contain * the number of bytes, minus two, in "s". The string * pointer returned is "s+2", which contains the first * byte of input data. Note that "s[1]" will contain * the number of characters in the string. The carriage * return (which the user at the console must type to * terminate the operation) is replaced by a null byte. * * returns p = pointer to string received * **/ char *cgets(s) char *s; { char *p; if (*s == 0) *s = 250; /* do not allow zero byte count */ bdos(BDOS_BKI, s); p = s+2; p[s[1]] = '\0'; /* set terminating byte */ return(p); } /** * * name cputs -- send character string directly to console * * synopsis cputs(s); * char *s; character string to be sent * * description This function sends the specified string directly to * the user's console. The BDOS function for "print * string" is used. The function locates the terminating * null byte, changes it to a '$' (the terminator * required by the BDOS function), and then changes it * back to the null byte before returning. Thus, the * string to be printed cannot itself contain a '$' and * it cannot reside in read-only memory (ROM). * * Note that a carriage return or linefeed is NOT appended * by this function; they must be included in the string, * if desired. * **/ cputs(s) char *s; { char *p; for (p = s; *p != '\0'; p++) ; /* find string terminator */ *p = '$'; bdos(BDOS_PRT, s); *p = '\0'; return; }