From 58473e825c76e859d9785a3fc4c7aee404adb95e Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Sun, 25 Aug 2019 16:29:55 -0700 Subject: [PATCH] iocsh more error handling sooo many ways to fail... --- modules/libcom/src/iocsh/iocsh.cpp | 51 +++++++++++++++++++----------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/modules/libcom/src/iocsh/iocsh.cpp b/modules/libcom/src/iocsh/iocsh.cpp index b3fe936cb..1ba1de635 100644 --- a/modules/libcom/src/iocsh/iocsh.cpp +++ b/modules/libcom/src/iocsh/iocsh.cpp @@ -1156,34 +1156,49 @@ static void onCallFunc(const iocshArgBuf *args) { iocshContext *context = (iocshContext *) epicsThreadPrivateGet(iocshContextId); +#define USAGE() fprintf(epicsGetStderr(), "Usage: on error [continue | break | halt | wait ]\n") + if(!context || !context->scope) { // we are not called through iocshBody()... } else if(args->aval.ac<3 || strcmp(args->aval.av[1], "error")!=0) { - fprintf(epicsGetStderr(), "Usage: on error [continue | break | halt | wait ]\n"); + USAGE(); } else if(context->scope->interactive) { fprintf(epicsGetStderr(), "Interactive shell ignores on error ...\n"); - } else if(strcmp(args->aval.av[2], "continue")==0) { - context->scope->onerr = Continue; - - } else if(strcmp(args->aval.av[2], "break")==0) { - context->scope->onerr = Break; - - } else if(strcmp(args->aval.av[2], "halt")==0) { - context->scope->onerr = Halt; - context->scope->timeout = 0.0; - - } else if(strcmp(args->aval.av[2], "wait")==0) { - context->scope->onerr = Halt; - if(args->aval.ac==3 || epicsParseDouble(args->aval.av[3], &context->scope->timeout, NULL)) { - context->scope->timeout = 5.0; - } - } else { - fprintf(epicsGetStderr(), "Usage: on error [continue | break | halt | wait ]\n"); + // don't fault on previous, ignored, errors + context->scope->errored = false; + + if(strcmp(args->aval.av[2], "continue")==0) { + context->scope->onerr = Continue; + + } else if(strcmp(args->aval.av[2], "break")==0) { + context->scope->onerr = Break; + + } else if(strcmp(args->aval.av[2], "halt")==0) { + context->scope->onerr = Halt; + context->scope->timeout = 0.0; + + } else if(strcmp(args->aval.av[2], "wait")==0) { + context->scope->onerr = Halt; + if(args->aval.ac<=3) { + USAGE(); + } else if(epicsParseDouble(args->aval.av[3], &context->scope->timeout, NULL)) { + context->scope->timeout = 5.0; + } else { + USAGE(); + fprintf(epicsGetStderr(), "Unable to parse 'on error wait' time %s\n", args->aval.av[3]); + } + + } else { + fprintf(epicsGetStderr(), "Usage: on error [continue | break | halt | wait ]\n"); + context->scope->errored = true; + } } + +#undef USAGE } /*