- various improvements in SE drivers
This commit is contained in:
67
pardef.c
67
pardef.c
@ -31,11 +31,12 @@ typedef enum { NO_OP, FMT_OP, SET_OP, GET_OP, INIT_OP } ParOp;
|
||||
typedef struct Context {
|
||||
struct Context *next;
|
||||
ParData *obj;
|
||||
ParAct act;
|
||||
ParAct action;
|
||||
ParAct act; /* action called */
|
||||
ParAct action; /* copy of act, but set to PAR_NOOP when name does not match */
|
||||
char *parName;
|
||||
int argc;
|
||||
char **argv;
|
||||
char *valueArg;
|
||||
char *thisPar;
|
||||
int returnValue;
|
||||
SConnection *con;
|
||||
@ -283,6 +284,19 @@ int ParLog(void *object) {
|
||||
ParEnd();
|
||||
return next;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
void ParLogForced(void *object) {
|
||||
ParData *o = ParCheck(&parClass, object);
|
||||
int next;
|
||||
|
||||
ParBegin();
|
||||
ctx->now = time(NULL);
|
||||
showTime = 1;
|
||||
ParDo(0, o, PAR_LOG, NULL);
|
||||
o->logTime = ctx->now;
|
||||
o->logPending = 0;
|
||||
ParEnd();
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
static int ParCallBack(int event, void *eventData, void *userData,
|
||||
commandContext cc) {
|
||||
@ -307,7 +321,7 @@ static int ParOutError(SConnection *con, ParData *o) {
|
||||
SCPrintf(con, eError, "ERROR: insufficient privilege for %s.%s", o->name, ctx->thisPar);
|
||||
break;
|
||||
case ILLNUM:
|
||||
SCPrintf(con, eError, "ERROR: illegal value", o->name, ctx->argv[0]);
|
||||
SCPrintf(con, eError, "ERROR: illegal value", o->name, ctx->valueArg);
|
||||
break;
|
||||
case ILLARGC:
|
||||
SCPrintf(con, eError, "ERROR: illegal number of arguments for %s %s", o->name, ctx->thisPar);
|
||||
@ -434,6 +448,7 @@ static int ParExecute(SConnection *con, SicsInterp *sics, void *object, int argc
|
||||
if (strcmp(argv[1], "=") == 0) {
|
||||
ctx->argc = argc - 2;
|
||||
ctx->argv = argv + 2;
|
||||
ctx->valueArg = argv[2];
|
||||
ParDo(con, o, PAR_SET, "");
|
||||
logIt = 1;
|
||||
} else {
|
||||
@ -442,6 +457,7 @@ static int ParExecute(SConnection *con, SicsInterp *sics, void *object, int argc
|
||||
} else {
|
||||
ctx->argc = argc - 2;
|
||||
ctx->argv = argv + 2;
|
||||
ctx->valueArg = argv[2];
|
||||
ParDo(con, o, PAR_SET, argv[1]);
|
||||
logIt = 1;
|
||||
}
|
||||
@ -465,7 +481,7 @@ static int ParExecute(SConnection *con, SicsInterp *sics, void *object, int argc
|
||||
ctx->returnValue = UNKPAR;
|
||||
}
|
||||
iret = ParOutError(con, o);
|
||||
if (logIt) ParLog(o); /* log changes */
|
||||
if (logIt) ParLogForced(o); /* log changes */
|
||||
ParEnd();
|
||||
return iret;
|
||||
}
|
||||
@ -984,15 +1000,17 @@ void ParFloat(float *value, float defValue) {
|
||||
ctx->returnValue = ILLARGC;
|
||||
return;
|
||||
}
|
||||
f = strtod(ctx->argv[0], &endp);
|
||||
if (endp == ctx->argv[0]) {
|
||||
f = ParText2Int(ctx->argv[0]);
|
||||
if (f < 0) {
|
||||
ctx->returnValue = ILLNUM;
|
||||
break;
|
||||
if (ctx->valueArg) {
|
||||
f = strtod(ctx->valueArg, &endp);
|
||||
if (endp == ctx->valueArg) {
|
||||
f = ParText2Int(ctx->valueArg);
|
||||
if (f < 0) {
|
||||
ctx->returnValue = ILLNUM;
|
||||
break;
|
||||
}
|
||||
}
|
||||
*value = f;
|
||||
}
|
||||
*value = f;
|
||||
ParHasChanged();
|
||||
/* fall through */
|
||||
case FMT_OP:
|
||||
@ -1030,15 +1048,17 @@ void ParInt(int *value, int defValue) {
|
||||
ctx->returnValue = ILLARGC;
|
||||
return;
|
||||
}
|
||||
i = strtol(ctx->argv[0], &endp, 0);
|
||||
if (endp == ctx->argv[0]) {
|
||||
i = ParText2Int(ctx->argv[0]);
|
||||
if (i < 0) {
|
||||
ctx->returnValue = ILLNUM;
|
||||
break;
|
||||
if (ctx->valueArg) {
|
||||
i = strtol(ctx->valueArg, &endp, 0);
|
||||
if (endp == ctx->valueArg) {
|
||||
i = ParText2Int(ctx->valueArg);
|
||||
if (i < 0) {
|
||||
ctx->returnValue = ILLNUM;
|
||||
break;
|
||||
}
|
||||
}
|
||||
*value = i;
|
||||
}
|
||||
*value = i;
|
||||
ParHasChanged();
|
||||
/* fall through */
|
||||
case FMT_OP:
|
||||
@ -1128,6 +1148,17 @@ int ParActionIs(ParAct a) {
|
||||
return 0;
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
char *ParGetValueArg() {
|
||||
char *ret;
|
||||
if (ctx->action == PAR_SET) {
|
||||
ret = ctx->valueArg;
|
||||
ctx->valueArg = NULL;
|
||||
return ret;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void *ParObject(void) {
|
||||
return ctx->obj;
|
||||
}
|
||||
|
Reference in New Issue
Block a user