From 87b805043721858e012c07b69f36f7d1d2ee2621 Mon Sep 17 00:00:00 2001 From: Hinko Kocevar Date: Fri, 21 Feb 2025 17:03:44 +0100 Subject: [PATCH] handle backslash for EPICS command line library (similar to READLINE) --- modules/libcom/src/osi/epicsReadline.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/modules/libcom/src/osi/epicsReadline.c b/modules/libcom/src/osi/epicsReadline.c index f74430aa1..4551cc972 100644 --- a/modules/libcom/src/osi/epicsReadline.c +++ b/modules/libcom/src/osi/epicsReadline.c @@ -81,7 +81,9 @@ epicsReadline (const char *prompt, void *context) printf("Out of memory!\n"); return NULL; } - while ((c = getc(in)) != '\n') { + int backslash_seen = 0; + do { + c = getc(in); if (c == EOF) { if (ferror(in)) { if ((errno == EINTR) || (errno == EPIPE)) { @@ -104,8 +106,26 @@ epicsReadline (const char *prompt, void *context) } line = cp; } - line[linelen++] = c; - } + if (backslash_seen) { + /* try to handle multi-line string */ + backslash_seen = 0; + if (c == '\n') { + linelen--; /* overwrite the '\' */ + c = getc(in); /* skip current '\n' and get the next char */ + if (c == EOF) { + free(line); + line = NULL; + break; + } + } + } + if (c == '\\') { + backslash_seen = 1; + } + if (c != '\n') { + line[linelen++] = c; + } + } while (c != '\n'); line[linelen] = '\0'; rc->line = line; return line;