home *** CD-ROM | disk | FTP | other *** search
-
- /**
- *
- * 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;
- }
- ar *p;
-
- for (p = s; *p != '\0'; p++)