forked from epics_driver_modules/require
improve usability of afterInit command
This commit is contained in:
+70
-24
@@ -2,6 +2,7 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <macLib.h>
|
||||
@@ -9,7 +10,7 @@
|
||||
#include <epicsVersion.h>
|
||||
|
||||
#ifdef vxWorks
|
||||
#include "asprintf.h"
|
||||
#include <sysSymTbl.h>
|
||||
#ifdef _WRS_VXWORKS_MAJOR
|
||||
/* vxWorks 6+ */
|
||||
#include <private/shellLibP.h>
|
||||
@@ -18,6 +19,7 @@
|
||||
#include <shellLib.h>
|
||||
#include "strdup.h"
|
||||
#endif
|
||||
#include <symLib.h>
|
||||
#endif
|
||||
|
||||
#ifdef BASE_VERSION
|
||||
@@ -360,7 +362,11 @@ end:
|
||||
struct cmditem
|
||||
{
|
||||
struct cmditem* next;
|
||||
char cmd[1];
|
||||
int type;
|
||||
union {
|
||||
char* a[12];
|
||||
char cmd[256];
|
||||
} x;
|
||||
} *cmdlist, **cmdlast=&cmdlist;
|
||||
|
||||
void afterInitHook(initHookState state)
|
||||
@@ -378,43 +384,72 @@ void afterInitHook(initHookState state)
|
||||
) return;
|
||||
for (item = cmdlist; item != NULL; item = item->next)
|
||||
{
|
||||
#ifdef _WRS_VXWORKS_MAJOR
|
||||
SHELL_EVAL_VALUE result;
|
||||
shellInterpEvaluate(line_exp, "C", &result);
|
||||
#elif defined(vxWorks)
|
||||
execute(item->cmd);
|
||||
#else
|
||||
iocshCmd(item->cmd);
|
||||
#ifndef EPICS_3_13
|
||||
if (item->type == 1)
|
||||
{
|
||||
printf("%s\n", item->x.cmd);
|
||||
iocshCmd(item->x.cmd);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
((void (*)())item->x.a[0])(item->x.a[1], item->x.a[2], item->x.a[3], item->x.a[4], item->x.a[5],
|
||||
item->x.a[6], item->x.a[7], item->x.a[8], item->x.a[9], item->x.a[10], item->x.a[11]);
|
||||
}
|
||||
}
|
||||
|
||||
int afterInit(const char* command)
|
||||
extern volatile int interruptAccept;
|
||||
|
||||
static int first_time = 1;
|
||||
|
||||
static struct cmditem *newItem(char* cmd, int type)
|
||||
{
|
||||
struct cmditem *item;
|
||||
static int first_time = 1;
|
||||
|
||||
if (!command)
|
||||
if (!cmd)
|
||||
{
|
||||
fprintf(stderr, "usage: afterInit \"command line\"\n");
|
||||
return -1;
|
||||
fprintf(stderr, "usage: afterInit command, args...\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (interruptAccept)
|
||||
{
|
||||
fprintf(stderr, "afterInit can only be used before iocInit\n");
|
||||
return NULL;
|
||||
}
|
||||
if (first_time)
|
||||
{
|
||||
first_time = 0;
|
||||
initHookRegister(afterInitHook);
|
||||
}
|
||||
item = malloc(sizeof(struct cmditem) + strlen(command));
|
||||
item = malloc(sizeof(struct cmditem));
|
||||
if (item == NULL)
|
||||
{
|
||||
perror("afterInit");
|
||||
return -1;
|
||||
return NULL;
|
||||
}
|
||||
item->next = 0;
|
||||
strcpy(item -> cmd, command);
|
||||
item->type = type;
|
||||
item->next = NULL;
|
||||
*cmdlast = item;
|
||||
cmdlast = &item->next;
|
||||
return item;
|
||||
}
|
||||
|
||||
int afterInit(char* cmd, char* a1, char* a2, char* a3, char* a4, char* a5, char* a6, char* a7, char* a8, char* a9, char* a10, char* a11)
|
||||
{
|
||||
struct cmditem *item = newItem(cmd, 0);
|
||||
if (!item) return -1;
|
||||
|
||||
item->x.a[0] = cmd;
|
||||
item->x.a[1] = a1;
|
||||
item->x.a[2] = a2;
|
||||
item->x.a[3] = a3;
|
||||
item->x.a[4] = a4;
|
||||
item->x.a[5] = a5;
|
||||
item->x.a[6] = a6;
|
||||
item->x.a[7] = a7;
|
||||
item->x.a[8] = a8;
|
||||
item->x.a[9] = a9;
|
||||
item->x.a[10] = a10;
|
||||
item->x.a[11] = a11;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -427,19 +462,30 @@ static const iocshFuncDef runScriptDef = {
|
||||
&(iocshArg) { "substitutions", iocshArgString },
|
||||
}};
|
||||
|
||||
static void runScriptFunc (const iocshArgBuf *args)
|
||||
static void runScriptFunc(const iocshArgBuf *args)
|
||||
{
|
||||
runScript(args[0].sval, args[1].sval);
|
||||
}
|
||||
|
||||
static const iocshFuncDef afterInitDef = {
|
||||
"afterInit", 1, (const iocshArg *[]) {
|
||||
&(iocshArg) { "commandline", iocshArgString },
|
||||
&(iocshArg) { "commandline", iocshArgArgv },
|
||||
}};
|
||||
|
||||
static void afterInitFunc (const iocshArgBuf *args)
|
||||
static void afterInitFunc(const iocshArgBuf *args)
|
||||
{
|
||||
afterInit(args[0].sval);
|
||||
int i, n;
|
||||
struct cmditem *item = newItem(args[0].aval.av[1], 1);
|
||||
if (!item) return;
|
||||
|
||||
n = sprintf(item->x.cmd, "%.255s", args[0].aval.av[1]);
|
||||
for (i = 2; i < args[0].aval.ac; i++)
|
||||
{
|
||||
if (strpbrk(args[0].aval.av[i], " ,\"\\"))
|
||||
n += sprintf(item->x.cmd+n, " '%.*s'", 255-3-n, args[0].aval.av[i]);
|
||||
else
|
||||
n += sprintf(item->x.cmd+n, " %.*s", 255-1-n, args[0].aval.av[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void runScriptRegister(void)
|
||||
|
||||
Reference in New Issue
Block a user