diff --git a/include/conio.h b/include/conio.h index 1bf994511..1f88ac3ce 100644 --- a/include/conio.h +++ b/include/conio.h @@ -118,10 +118,11 @@ char *cgets (char *buffer); ** - call cgets ** - buffer[1] will have the number of characters read ** - the actual string starts at buffer + 2 -** - trailing CRLF are removed ** - terminating \0 is appended ** - therefore the maximum number of characters which can be read is the size ** of the buffer - 3! +** - note: CR/LF are NOT echoed, typically a following call to cputs or +** cprintf will need "\r\n" prepended - "standard" behavior ** ** param: buffer - where to save the input ** return: buffer + 2 (i.e. start of the string) if successful, NULL otherwise diff --git a/libsrc/conio/cgets.c b/libsrc/conio/cgets.c index c0f7f8e0c..bb24f97de 100644 --- a/libsrc/conio/cgets.c +++ b/libsrc/conio/cgets.c @@ -6,12 +6,9 @@ */ #include -#include #include - -#ifndef CRLF -#define CRLF "\r\n" -#endif /* CRLF */ +#include +#include enum {CGETS_SIZE, CGETS_READ, CGETS_DATA, CGETS_HDR_LEN = CGETS_DATA}; @@ -25,32 +22,29 @@ char *cgets (char *buffer) ** - call cgets ** - buffer[1] will have the number of characters read ** - the actual string starts at buffer + 2 -** - trailing CRLF are removed ** - terminating \0 is appended ** - therefore the maximum number of characters which can be read is the size ** of the buffer - 3! +** - note: CR/LF are NOT echoed, typically a following call to cputs or +** cprintf will need "\r\n" prepended - this is standard behavior! ** ** param: buffer - where to save the input -** return: buffer + 2 (or start of the string) if successful, NULL otherwise -** see: cgetsx for equivalent functionality but with a saner interface! +** return: buffer + 2 (i.e. start of the string) or NULL if buffer is NULL */ { - /* Default to NULL */ - char *result = NULL; + /* Return buffer + 2 or NULL if buffer is NULL */ + char *result = buffer? buffer + CGETS_HDR_LEN: NULL; - if (buffer && buffer[CGETS_SIZE]) { + if (result) { /* Initialize just in case the caller didn't! */ buffer[CGETS_READ] = 0; buffer[CGETS_DATA] = '\0'; - /* Call cgetsx to do the real work */ - result = cgetsx (buffer + CGETS_HDR_LEN, (unsigned char)buffer[CGETS_SIZE]); + /* Call cgetsx to do the real work, ignore the result! */ + cgetsx (result, (unsigned char)buffer[CGETS_SIZE]); - /* Trim trailing CRLF and set how many characters were read */ - if (result) { - result[strcspn (result, CRLF)] = '\0'; - buffer[CGETS_READ] = (unsigned char)strlen (result); - } + /* Set how many characters were read */ + buffer[CGETS_READ] = (unsigned char)strlen (result); } /* Done */ @@ -61,8 +55,8 @@ static char *cgetsx (char *buffer, int size) /* Like fgets but specifically for the console. Stops when CR/LF or size - 1 ** characters are read. Will append a terminating \0, so at most size - 1 ** characters can be read. Note that this function could be made public and -** have features like cursor vs no-cursor, and/or echo vs echo-pwd vs no-echo -** added to extend the functionality. +** have features added like cursor vs no-cursor, echo vs echo-pwd vs no-echo, +** or CR/LF handling to extend the functionality. ** ** param: buffer - where to save the input ** param: size - the size of buffer @@ -91,27 +85,25 @@ static char *cgetsx (char *buffer, int size) x = wherex (); y = x? y: y - 1; x = x? x - 1: w; - /* Clear the character and the cursor */ + /* Clear the character */ gotoxy (x, y); - cputs (" "); + cputc (' '); gotoxy (x, y); } - /* Handle CRLF */ - } else if (strchr (CRLF, c)) { - /* Clear the cursor and advance to the next line */ - cputs (" " CRLF); - buffer[i] = c; - buffer[++i] = '\0'; - break; /* Handle regular characters */ - } else { + } else if (isprint (c)) { cputc (c); buffer[i] = c; buffer[++i] = '\0'; + /* Handle CR/LF */ + } else if (c == '\r' || c == '\n') { + buffer[i] = '\0'; + break; } } cursor (0); } + /* Done */ return (i > 0)? buffer: NULL; }