mirror of
https://github.com/cc65/cc65.git
synced 2026-01-22 17:16:21 +00:00
81 lines
2.4 KiB
C
81 lines
2.4 KiB
C
/* Created: 2025-06-15 Russell-S-Harper
|
|
** Modified: <iso-date> <author>
|
|
** Notes: <e.g. revisions made to support target, edge cases, bugs, etc.>
|
|
**
|
|
** char* __fastcall__ cgets (char* buffer, int size);
|
|
*/
|
|
|
|
#include <stddef.h>
|
|
#include <conio.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
|
|
#ifndef CRLF
|
|
#define CRLF "\r\n"
|
|
#endif /* CRLF */
|
|
|
|
char* __fastcall__ cgets (char* buffer, int size)
|
|
/* Get a string of characters directly from the console. The function returns
|
|
** when size - 1 characters or either CR/LF are read. Note the parameters are
|
|
** more aligned with stdio fgets() as opposed to the quirky "standard" conio
|
|
** cgets(). Besides providing saner parameters, the function also echoes CRLF
|
|
** when either CR/LF are read but does NOT append either in the buffer. This is
|
|
** to correspond to stdio fgets() which echoes CRLF, but prevents a "gotcha"
|
|
** where the buffer might not be able to accommodate both CR and LF at the end.
|
|
**
|
|
** param: buffer - where to save the input, must be non-NULL
|
|
** param: size - size of the buffer, must be > 1
|
|
** return: buffer if successful, NULL on error
|
|
*/
|
|
{
|
|
int i = 0;
|
|
unsigned char w, x, y;
|
|
char c;
|
|
|
|
if (buffer && size > 1) {
|
|
/* Just need the width */
|
|
screensize (&w, &y);
|
|
/* Actually just the last column! */
|
|
--w;
|
|
cursor (1);
|
|
for (--size; i < size; ) {
|
|
c = cgetc ();
|
|
/* Handle CR/LF */
|
|
if (strchr (CRLF, c)) {
|
|
/* Echo CRLF, but don't append either CR/LF */
|
|
cputs (CRLF);
|
|
break;
|
|
}
|
|
/* Handle backspace */
|
|
if (c == '\b'
|
|
#ifdef CH_DEL
|
|
|| c == CH_DEL
|
|
#endif
|
|
) {
|
|
if (i > 0) {
|
|
/* Remove the character */
|
|
--i;
|
|
/* Logic to account for line wrapping */
|
|
y = wherey ();
|
|
x = wherex ();
|
|
y = x? y: y - 1;
|
|
x = x? x - 1: w;
|
|
/* Clear the character */
|
|
gotoxy (x, y);
|
|
cputc (' ');
|
|
gotoxy (x, y);
|
|
}
|
|
/* Handle regular characters */
|
|
} else if (isprint (c)) {
|
|
cputc (c);
|
|
buffer[i++] = c;
|
|
}
|
|
}
|
|
cursor (0);
|
|
buffer[i] = '\0';
|
|
}
|
|
|
|
/* Done */
|
|
return (i > 0)? buffer: NULL;
|
|
}
|