diff target-utils/libcommon/cmdentry.c @ 0:e7502631a0f9

initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 11 Jun 2016 00:13:35 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/libcommon/cmdentry.c	Sat Jun 11 00:13:35 2016 +0000
@@ -0,0 +1,72 @@
+/*
+ * This module implements ASCII command entry via the serial port,
+ * with normal echo and minimal editing (rubout and kill).
+ *
+ * The command string buffer is bss-allocated here as well.  It is
+ * sized to allow a maximum-size S-record to be sent as a command,
+ * as that is how we expect flash loading and XRAM chain-loading
+ * to be done.
+ */
+
+#define	MAXCMD	527
+
+char command[MAXCMD+1];
+
+/*
+ * The command_entry() function takes no arguments, and begins by waiting
+ * for serial input - hence the prompt should be printed before calling it.
+ *
+ * This function returns when one of the following characters is received:
+ * CR - accepts the command
+ * ^C or ^U - cancels the command
+ *
+ * The return value is non-zero if a non-empty command was accepted with CR,
+ * or 0 if the user hit CR with no input or if the command was canceled
+ * with ^C or ^U.  In any case a CRLF is sent out the serial port
+ * to close the input echo line before this function returns.
+ */
+command_entry()
+{
+	int inlen, ch;
+
+	for (inlen = 0; ; ) {
+		ch = mygetchar();
+		if (ch >= ' ' && ch <= '~') {
+			if (inlen < MAXCMD) {
+				command[inlen++] = ch;
+				putchar(ch);
+			} else
+				/* putchar(7) */;
+			continue;
+		}
+		switch (ch) {
+		case '\r':
+		case '\n':
+			command[inlen] = '\0';
+			putchar('\n');
+			return(inlen);
+		case '\b':	/* BS */
+		case 0x7F:	/* DEL */
+			if (inlen) {
+				putchar('\b');
+				putchar(' ');
+				putchar('\b');
+				inlen--;
+			} else
+				/* putchar(7) */;
+			continue;
+		case 0x03:	/* ^C */
+			putchar('^');
+			putchar('C');
+			putchar('\n');
+			return(0);
+		case 0x15:	/* ^U */
+			putchar('^');
+			putchar('U');
+			putchar('\n');
+			return(0);
+		default:
+			/* putchar(7) */;
+		}
+	}
+}