From 72d4622ddffe46bc538f7008f8a2651deb5ad0a3 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Wed, 3 Jan 2018 18:23:28 -0800 Subject: [PATCH] SCP: Add ECHOF command which takes a quoted string as an argument --- doc/simh_doc.doc | Bin 278016 -> 279552 bytes scp.c | 75 ++++++++++++++++++++++++++++++++++++++++++++--- scp.h | 1 + sim_console.c | 3 ++ 4 files changed, 75 insertions(+), 4 deletions(-) diff --git a/doc/simh_doc.doc b/doc/simh_doc.doc index 62eafc22c354c59cc6d38a81b5e531427325d9cb..bb4f1bf9ac9858c944720bb394e60c37928a4bfe 100644 GIT binary patch delta 40244 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 diff --git a/scp.c b/scp.c index 73817d4d..44ce8ade 100644 --- a/scp.c +++ b/scp.c @@ -1611,15 +1611,57 @@ ASSERT failure have several different actions: #endif -#define HLP_ECHO "*Commands Executing_Command_Files Displaying_Arbitrary_Text" +#define HLP_ECHO "*Commands Executing_Command_Files Displaying_Arbitrary_Text ECHO_Command" /***************** 80 character line width template *************************/ "3Displaying Arbitrary Text\n" - " The ECHO command is a useful way of annotating command files. ECHO prints\n" - " out its arguments on the console (and log):\n\n" + " The ECHO and ECHOF commands are useful ways of annotating command files.\n\n" + "4ECHO command\n" + " The ECHO command prints out its arguments on the console (and log)\n" + " followed by a newline:\n\n" "++ECHO output string to console\n\n" " If there is no argument, ECHO prints a blank line on the console. This\n" " may be used to provide spacing in the console display or log.\n" /***************** 80 character line width template *************************/ +#define HLP_ECHOF "*Commands Executing_Command_Files Displaying_Arbitrary_Text ECHOF_Command" + /***************** 80 character line width template *************************/ + "4ECHOF command\n" + " The ECHOF command prints out its arguments on the console (and log)\n" + " followed by a newline:\n\n" + /***************** 80 character line width template *************************/ + "++ECHOF {-n} \"\"| output string to console\n\n" + " If there is no argument, ECHOF prints a blank line on the console.\n" + " The string argument may be delimited by quote characters. Quotes may\n" + " be either single or double but the opening and closing quote characters\n" + " must match. If the string is enclosed in quotes, the string may\n" + " contain escaped character strings which is interpreted as described\n" + " in Quoted_String_Data and the resulting string is output.\n\n" + " A command alias can be used to replace the ECHO command with the ECHOF\n" + " command:\n\n" + "++sim> SET ENV ECHO=ECHOF\n" + "5Switches\n" + " Switches can be used to influence the behavior of ECHOF commands\n\n" + "6-n\n" + " The -n switch indicates that the supplied string should be output\n" + " without a newline after the string is written.\n" + "5Quoted String Data\n" + " String data enclosed in quotes is transformed interpreting character\n" + " escapes. The following character escapes are explicitly supported:\n" + "++\\r Sends the ASCII Carriage Return character (Decimal value 13)\n" + "++\\n Sends the ASCII Linefeed character (Decimal value 10)\n" + "++\\f Sends the ASCII Formfeed character (Decimal value 12)\n" + "++\\t Sends the ASCII Horizontal Tab character (Decimal value 9)\n" + "++\\v Sends the ASCII Vertical Tab character (Decimal value 11)\n" + "++\\b Sends the ASCII Backspace character (Decimal value 8)\n" + "++\\\\ Sends the ASCII Backslash character (Decimal value 92)\n" + "++\\' Sends the ASCII Single Quote character (Decimal value 39)\n" + "++\\\" Sends the ASCII Double Quote character (Decimal value 34)\n" + "++\\? Sends the ASCII Question Mark character (Decimal value 63)\n" + "++\\e Sends the ASCII Escape character (Decimal value 27)\n" + " as well as octal character values of the form:\n" + "++\\n{n{n}} where each n is an octal digit (0-7)\n" + " and hext character values of the form:\n" + "++\\xh{h} where each h is a hex digit (0-9A-Fa-f)\n" + /***************** 80 character line width template *************************/ #define HLP_SEND "*Commands Executing_Command_Files Injecting_Console_Input" /***************** 80 character line width template *************************/ "3Injecting Console Input\n" @@ -1990,6 +2032,7 @@ static CTAB cmd_table[] = { { "PROCEED", &noop_cmd, 0, HLP_PROCEED }, { "IGNORE", &noop_cmd, 0, HLP_IGNORE }, { "ECHO", &echo_cmd, 0, HLP_ECHO }, + { "ECHOF", &echof_cmd, 0, HLP_ECHOF }, { "ASSERT", &assert_cmd, 1, HLP_ASSERT }, { "SEND", &send_cmd, 1, HLP_SEND }, { "NOSEND", &send_cmd, 0, HLP_SEND }, @@ -2970,6 +3013,29 @@ sim_printf ("%s\n", cptr); return SCPE_OK; } +/* EchoF command */ + +t_stat echof_cmd (int32 flag, CONST char *cptr) +{ +char gbuf[CBUFSIZE]; +uint8 dbuf[CBUFSIZE]; +uint32 dsize = 0; + +GET_SWITCHES (cptr); +if (!*cptr) + return SCPE_2FARG; +if ((*cptr == '"') || (*cptr == '\'')) { + cptr = get_glyph_quoted (cptr, gbuf, 0); + if (*cptr != '\0') + return SCPE_2MARG; /* No more arguments */ + if (SCPE_OK != sim_decode_quoted_string (gbuf, dbuf, &dsize)) + return sim_messagef (SCPE_ARG, "Invalid String\n"); + cptr = dbuf; + } +sim_printf ("%s%s", cptr, (sim_switches & SWMASK('N')) ? "" : "\n"); +return SCPE_OK; +} + /* Do command Syntax: DO {-E} {-V} {...} @@ -3153,7 +3219,8 @@ do { ((cmdp->action != &return_cmd) && (cmdp->action != &goto_cmd) && (cmdp->action != &on_cmd) && - (cmdp->action != &echo_cmd))) + (cmdp->action != &echo_cmd) && + (cmdp->action != &echof_cmd))) sim_last_cmd_stat = stat; /* save command error status */ switch (stat) { case SCPE_AFAIL: diff --git a/scp.h b/scp.h index 381f48a4..d8900cf7 100644 --- a/scp.h +++ b/scp.h @@ -108,6 +108,7 @@ t_stat help_cmd (int32 flag, CONST char *ptr); t_stat screenshot_cmd (int32 flag, CONST char *ptr); t_stat spawn_cmd (int32 flag, CONST char *ptr); t_stat echo_cmd (int32 flag, CONST char *ptr); +t_stat echof_cmd (int32 flag, CONST char *ptr); /* Allow compiler to help validate printf style format arguments */ #if !defined __GNUC__ diff --git a/sim_console.c b/sim_console.c index 99ebf53f..35127ee5 100644 --- a/sim_console.c +++ b/sim_console.c @@ -732,6 +732,7 @@ static CTAB allowed_remote_cmds[] = { { "DIR", &dir_cmd, 0 }, { "LS", &dir_cmd, 0 }, { "ECHO", &echo_cmd, 0 }, + { "ECHOF", &echof_cmd, 0 }, { "SET", &set_cmd, 0 }, { "SHOW", &show_cmd, 0 }, { "HELP", &x_help_cmd, 0 }, @@ -757,6 +758,7 @@ static CTAB allowed_master_remote_cmds[] = { { "DIR", &dir_cmd, 0 }, { "LS", &dir_cmd, 0 }, { "ECHO", &echo_cmd, 0 }, + { "ECHOF", &echof_cmd, 0 }, { "SET", &set_cmd, 0 }, { "SHOW", &show_cmd, 0 }, { "HELP", &x_help_cmd, 0 }, @@ -785,6 +787,7 @@ static CTAB allowed_single_remote_cmds[] = { { "DIR", &dir_cmd, 0 }, { "LS", &dir_cmd, 0 }, { "ECHO", &echo_cmd, 0 }, + { "ECHOF", &echof_cmd, 0 }, { "SHOW", &show_cmd, 0 }, { "HELP", &x_help_cmd, 0 }, { NULL, NULL }