- various improvements in SE drivers

This commit is contained in:
zolliker
2006-08-17 15:39:37 +00:00
parent 928738dbd8
commit ce25823567
19 changed files with 301 additions and 100 deletions

View File

@ -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;
}