- Adapted indenation to new agreed upon system
- Added support for second generation scriptcontext based counter
This commit is contained in:
550
mumoconf.c
550
mumoconf.c
@ -62,13 +62,13 @@
|
||||
Once again, the demands for command evaluation are high. Therefore a
|
||||
recursice descent parser.
|
||||
*/
|
||||
|
||||
typedef struct __MYTOKEN {
|
||||
char *pCommand;
|
||||
char *pPtr;
|
||||
int iCurrentToken;
|
||||
char Token[80];
|
||||
} sParser, *psParser;
|
||||
|
||||
typedef struct __MYTOKEN {
|
||||
char *pCommand;
|
||||
char *pPtr;
|
||||
int iCurrentToken;
|
||||
char Token[80];
|
||||
} sParser, *psParser;
|
||||
|
||||
/* define Token Types */
|
||||
#define UNKNOWN 0
|
||||
@ -80,295 +80,271 @@
|
||||
#define NUMBER 6
|
||||
#define ENDCONFIG 7
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
static int GetNextToken(psParser self)
|
||||
{
|
||||
char *pPtr;
|
||||
int i;
|
||||
|
||||
pPtr = self->pPtr;
|
||||
|
||||
/* skip whitespace */
|
||||
while( (*pPtr == ' ') || (*pPtr == '\t') )
|
||||
{
|
||||
pPtr++;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
static int GetNextToken(psParser self)
|
||||
{
|
||||
char *pPtr;
|
||||
int i;
|
||||
|
||||
/* check for end */
|
||||
if( (*pPtr == '\n') || (*pPtr == '\0') || (*pPtr == '\r') )
|
||||
{
|
||||
self->pPtr = pPtr;
|
||||
self->Token[0] = *pPtr;
|
||||
self->Token[1] = '\0';
|
||||
self->iCurrentToken = END;
|
||||
return END;
|
||||
}
|
||||
pPtr = self->pPtr;
|
||||
|
||||
/* skip whitespace */
|
||||
while ((*pPtr == ' ') || (*pPtr == '\t')) {
|
||||
pPtr++;
|
||||
}
|
||||
|
||||
/* check for end */
|
||||
if ((*pPtr == '\n') || (*pPtr == '\0') || (*pPtr == '\r')) {
|
||||
self->pPtr = pPtr;
|
||||
self->Token[0] = *pPtr;
|
||||
self->Token[1] = '\0';
|
||||
self->iCurrentToken = END;
|
||||
return END;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* check equaL SIGN */
|
||||
if(*pPtr == '=')
|
||||
{
|
||||
strcpy(self->Token,"=");
|
||||
self->iCurrentToken = EQUALITY;
|
||||
self->pPtr = pPtr +1;
|
||||
return EQUALITY;
|
||||
}
|
||||
|
||||
/* number */
|
||||
if( (isdigit((int)*pPtr)) || (*pPtr == '.')
|
||||
||(*pPtr == '+') || (*pPtr == '-') )
|
||||
{
|
||||
i = 0;
|
||||
while (isdigit((int)*pPtr) || (*pPtr == '.')
|
||||
||(*pPtr == '+') || (*pPtr == '-') )
|
||||
{
|
||||
self->Token[i] = *pPtr;
|
||||
i++;
|
||||
pPtr++;
|
||||
}
|
||||
self->Token[i] = '\0';
|
||||
self->iCurrentToken = NUMBER;
|
||||
self->pPtr = pPtr;
|
||||
return NUMBER;
|
||||
}
|
||||
|
||||
/* a Symbol ? */
|
||||
if(isalnum((int)*pPtr))
|
||||
{
|
||||
i = 0;
|
||||
while( (!isspace((int)*pPtr)) && (*pPtr != '=')
|
||||
&& (*pPtr != '+') && (*pPtr != '-')
|
||||
&& (*pPtr != '\0') && (*pPtr != '\n') )
|
||||
{
|
||||
self->Token[i] = *pPtr;
|
||||
i++;
|
||||
pPtr++;
|
||||
}
|
||||
self->Token[i] = '\0';
|
||||
self->pPtr = pPtr;
|
||||
/* now it can be one of the keywords, a motor or a symbol */
|
||||
if(strcmp(self->Token,"alias") == 0)
|
||||
{
|
||||
self->iCurrentToken = ALIAS;
|
||||
return ALIAS;
|
||||
}
|
||||
else if(strcmp(self->Token,"pos") == 0)
|
||||
{
|
||||
self->iCurrentToken = POS;
|
||||
return POS;
|
||||
}
|
||||
else if(strcmp(self->Token,"endconfig") == 0)
|
||||
{
|
||||
self->iCurrentToken = ENDCONFIG;
|
||||
return ENDCONFIG;
|
||||
}
|
||||
else
|
||||
{
|
||||
self->iCurrentToken = SYMBOL;
|
||||
return SYMBOL;
|
||||
}
|
||||
}
|
||||
return UNKNOWN;
|
||||
}
|
||||
|
||||
/* check equaL SIGN */
|
||||
if (*pPtr == '=') {
|
||||
strcpy(self->Token, "=");
|
||||
self->iCurrentToken = EQUALITY;
|
||||
self->pPtr = pPtr + 1;
|
||||
return EQUALITY;
|
||||
}
|
||||
|
||||
/* number */
|
||||
if ((isdigit((int) *pPtr)) || (*pPtr == '.')
|
||||
|| (*pPtr == '+') || (*pPtr == '-')) {
|
||||
i = 0;
|
||||
while (isdigit((int) *pPtr) || (*pPtr == '.')
|
||||
|| (*pPtr == '+') || (*pPtr == '-')) {
|
||||
self->Token[i] = *pPtr;
|
||||
i++;
|
||||
pPtr++;
|
||||
}
|
||||
self->Token[i] = '\0';
|
||||
self->iCurrentToken = NUMBER;
|
||||
self->pPtr = pPtr;
|
||||
return NUMBER;
|
||||
}
|
||||
|
||||
/* a Symbol ? */
|
||||
if (isalnum((int) *pPtr)) {
|
||||
i = 0;
|
||||
while ((!isspace((int) *pPtr)) && (*pPtr != '=')
|
||||
&& (*pPtr != '+') && (*pPtr != '-')
|
||||
&& (*pPtr != '\0') && (*pPtr != '\n')) {
|
||||
self->Token[i] = *pPtr;
|
||||
i++;
|
||||
pPtr++;
|
||||
}
|
||||
self->Token[i] = '\0';
|
||||
self->pPtr = pPtr;
|
||||
/* now it can be one of the keywords, a motor or a symbol */
|
||||
if (strcmp(self->Token, "alias") == 0) {
|
||||
self->iCurrentToken = ALIAS;
|
||||
return ALIAS;
|
||||
} else if (strcmp(self->Token, "pos") == 0) {
|
||||
self->iCurrentToken = POS;
|
||||
return POS;
|
||||
} else if (strcmp(self->Token, "endconfig") == 0) {
|
||||
self->iCurrentToken = ENDCONFIG;
|
||||
return ENDCONFIG;
|
||||
} else {
|
||||
self->iCurrentToken = SYMBOL;
|
||||
return SYMBOL;
|
||||
}
|
||||
}
|
||||
return UNKNOWN;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
in this code we need to find a motor for a name quite frequently.......
|
||||
*/
|
||||
pMotor FindMotor(SicsInterp *pSics, char *name)
|
||||
{
|
||||
CommandList *pC;
|
||||
pMotor pMot;
|
||||
|
||||
pC = FindCommand(pSics,name);
|
||||
if(!pC)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
pMot = (pMotor)pC->pData;
|
||||
if(!pMot)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
if(strcmp(pMot->pDescriptor->name,"Motor") != 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
return pMot;
|
||||
pMotor FindMotor(SicsInterp * pSics, char *name)
|
||||
{
|
||||
CommandList *pC;
|
||||
pMotor pMot;
|
||||
|
||||
pC = FindCommand(pSics, name);
|
||||
if (!pC) {
|
||||
return NULL;
|
||||
}
|
||||
pMot = (pMotor) pC->pData;
|
||||
if (!pMot) {
|
||||
return NULL;
|
||||
}
|
||||
if (strcmp(pMot->pDescriptor->name, "Motor") != 0) {
|
||||
return NULL;
|
||||
}
|
||||
return pMot;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
int MakeMulti(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[])
|
||||
{
|
||||
/* this does not do much, just installs the configuration command */
|
||||
pMulMot pNew = NULL;
|
||||
int iRet;
|
||||
char pBueffel[512];
|
||||
|
||||
if(argc < 2)
|
||||
{
|
||||
SCWrite(pCon,"You need to specify a name for a MultiMotor",eError);
|
||||
return 0;
|
||||
}
|
||||
int MakeMulti(SConnection * pCon, SicsInterp * pSics, void *pData,
|
||||
int argc, char *argv[])
|
||||
{
|
||||
/* this does not do much, just installs the configuration command */
|
||||
pMulMot pNew = NULL;
|
||||
int iRet;
|
||||
char pBueffel[512];
|
||||
|
||||
/* check rights */
|
||||
if(!SCMatchRights(pCon,usMugger))
|
||||
{
|
||||
SCWrite(pCon,"ERROR: you are not permitted to do this",eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
pNew = MakeMultiMotor();
|
||||
if(!pNew)
|
||||
{
|
||||
SCWrite(pCon,"No Memory for creating MultiMot",eError);
|
||||
return 0;
|
||||
}
|
||||
pNew->name = strdup(argv[1]);
|
||||
iRet = AddCommand(pSics,argv[1],ConfigMulti,NULL,pNew);
|
||||
if(!iRet)
|
||||
{
|
||||
sprintf(pBueffel,"ERROR: duplicate command %s not created",argv[2]);
|
||||
SCWrite(pCon,pBueffel,eError);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
static int ParseAlias(SicsInterp *pSics,psParser pPP, pMulMot self, SConnection *pCon)
|
||||
{
|
||||
int iToken;
|
||||
char pError[132];
|
||||
pMotor pMot;
|
||||
|
||||
/* next token should be a motor name */
|
||||
iToken = GetNextToken(pPP);
|
||||
if(iToken != SYMBOL)
|
||||
{
|
||||
sprintf(pError,"ERROR: Token %s not recognized in MulMot alias",
|
||||
pPP->Token);
|
||||
SCWrite(pCon,pError,eError);
|
||||
return 0;
|
||||
}
|
||||
/* try find the motor and verify that it is a motor */
|
||||
pMot = FindMotor(pSics,pPP->Token);
|
||||
if(!pMot)
|
||||
{
|
||||
sprintf(pError,"ERROR: Motor %s not found, no alias created",
|
||||
pPP->Token);
|
||||
SCWrite(pCon,pError,eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* now pMot holds all info ever needed about the motor */
|
||||
/* the next Token should be a symbol giving the alias */
|
||||
iToken = GetNextToken(pPP);
|
||||
if(iToken == EQUALITY) /* tolerate Equality */
|
||||
{
|
||||
iToken = GetNextToken(pPP);
|
||||
}
|
||||
if(iToken != SYMBOL)
|
||||
{
|
||||
sprintf(pError,"ERROR: Token %s not recognized in MulMot alias",
|
||||
pPP->Token);
|
||||
SCWrite(pCon,pError,eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* now we have all that is ever needed to create an alias. We have done
|
||||
so much work in order to get here, that it will be done, here and
|
||||
now!
|
||||
*/
|
||||
StringDictAddPair(self->pAlias,pPP->Token,pMot->name);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
static int ParsePos(SicsInterp *pSics,psParser pPP,
|
||||
pMulMot self, SConnection *pCon)
|
||||
{
|
||||
pMotor pMot = NULL;
|
||||
char pError[132];
|
||||
int iToken;
|
||||
float fVal;
|
||||
|
||||
iToken = GetNextToken(pPP);
|
||||
if(iToken != SYMBOL) /* we want a name here */
|
||||
{
|
||||
sprintf(pError,"ERROR: Invalid Token %s in ParsePos",pPP->Token);
|
||||
SCWrite(pCon,pError,eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* The rest of the stuff should be the motors to drive until
|
||||
we are there
|
||||
*/
|
||||
StringDictAddPair(self->pNamPos,pPP->Token,pPP->pPtr);
|
||||
return 1;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int ConfigMulti(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[])
|
||||
{
|
||||
pMulMot self;
|
||||
char pBueffel[512];
|
||||
char pError[132];
|
||||
int i, iToken, iRet;
|
||||
sParser PP;
|
||||
CommandList *pCom = NULL;
|
||||
|
||||
assert(pCon);
|
||||
assert(pSics);
|
||||
assert(pData);
|
||||
|
||||
self = (pMulMot)pData;
|
||||
|
||||
iRet = Arg2Text(argc,argv,pBueffel,511);
|
||||
if(!iRet)
|
||||
{
|
||||
sprintf(pBueffel,"Argument string to long for %s configuration",argv[0]);
|
||||
SCWrite(pCon,pBueffel,eError);
|
||||
return 0;
|
||||
}
|
||||
strtolower(pBueffel);
|
||||
|
||||
/* first token is name, ignore */
|
||||
PP.pCommand = pBueffel;
|
||||
PP.pPtr = pBueffel;
|
||||
iToken = GetNextToken(&PP);
|
||||
iToken = GetNextToken(&PP);
|
||||
while(iToken != END)
|
||||
{
|
||||
switch(iToken)
|
||||
{
|
||||
case END:
|
||||
return 1; /* ignored */
|
||||
break;
|
||||
case ENDCONFIG:
|
||||
/* reconfigure command to final state */
|
||||
pCom = FindCommand(pSics,argv[0]);
|
||||
assert(pCom != NULL);
|
||||
pCom->OFunc = MultiWrapper;
|
||||
pCom->KFunc = KillMultiMotor;
|
||||
return 1;
|
||||
break;
|
||||
case ALIAS:
|
||||
return ParseAlias(pSics,&PP,self,pCon);
|
||||
break;
|
||||
case POS:
|
||||
return ParsePos(pSics,&PP,self,pCon);
|
||||
break;
|
||||
default:
|
||||
sprintf(pError,"ERROR: Invalid Token %s found in %s",
|
||||
PP.Token, argv[0]);
|
||||
SCWrite(pCon,pBueffel,eError);
|
||||
return 0;
|
||||
}
|
||||
iToken = GetNextToken(&PP);
|
||||
}
|
||||
/* should never end here */
|
||||
sprintf(pError,"ERROR: %s was NOT understood in mumoconf",pBueffel);
|
||||
SCWrite(pCon,pError,eError);
|
||||
if (argc < 2) {
|
||||
SCWrite(pCon, "You need to specify a name for a MultiMotor", eError);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* check rights */
|
||||
if (!SCMatchRights(pCon, usMugger)) {
|
||||
SCWrite(pCon, "ERROR: you are not permitted to do this", eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
pNew = MakeMultiMotor();
|
||||
if (!pNew) {
|
||||
SCWrite(pCon, "No Memory for creating MultiMot", eError);
|
||||
return 0;
|
||||
}
|
||||
pNew->name = strdup(argv[1]);
|
||||
iRet = AddCommand(pSics, argv[1], ConfigMulti, NULL, pNew);
|
||||
if (!iRet) {
|
||||
sprintf(pBueffel, "ERROR: duplicate command %s not created", argv[2]);
|
||||
SCWrite(pCon, pBueffel, eError);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
static int ParseAlias(SicsInterp * pSics, psParser pPP, pMulMot self,
|
||||
SConnection * pCon)
|
||||
{
|
||||
int iToken;
|
||||
char pError[132];
|
||||
pMotor pMot;
|
||||
|
||||
/* next token should be a motor name */
|
||||
iToken = GetNextToken(pPP);
|
||||
if (iToken != SYMBOL) {
|
||||
sprintf(pError, "ERROR: Token %s not recognized in MulMot alias",
|
||||
pPP->Token);
|
||||
SCWrite(pCon, pError, eError);
|
||||
return 0;
|
||||
}
|
||||
/* try find the motor and verify that it is a motor */
|
||||
pMot = FindMotor(pSics, pPP->Token);
|
||||
if (!pMot) {
|
||||
sprintf(pError, "ERROR: Motor %s not found, no alias created",
|
||||
pPP->Token);
|
||||
SCWrite(pCon, pError, eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* now pMot holds all info ever needed about the motor */
|
||||
/* the next Token should be a symbol giving the alias */
|
||||
iToken = GetNextToken(pPP);
|
||||
if (iToken == EQUALITY) { /* tolerate Equality */
|
||||
iToken = GetNextToken(pPP);
|
||||
}
|
||||
if (iToken != SYMBOL) {
|
||||
sprintf(pError, "ERROR: Token %s not recognized in MulMot alias",
|
||||
pPP->Token);
|
||||
SCWrite(pCon, pError, eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* now we have all that is ever needed to create an alias. We have done
|
||||
so much work in order to get here, that it will be done, here and
|
||||
now!
|
||||
*/
|
||||
StringDictAddPair(self->pAlias, pPP->Token, pMot->name);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
static int ParsePos(SicsInterp * pSics, psParser pPP,
|
||||
pMulMot self, SConnection * pCon)
|
||||
{
|
||||
pMotor pMot = NULL;
|
||||
char pError[132];
|
||||
int iToken;
|
||||
float fVal;
|
||||
|
||||
iToken = GetNextToken(pPP);
|
||||
if (iToken != SYMBOL) { /* we want a name here */
|
||||
sprintf(pError, "ERROR: Invalid Token %s in ParsePos", pPP->Token);
|
||||
SCWrite(pCon, pError, eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* The rest of the stuff should be the motors to drive until
|
||||
we are there
|
||||
*/
|
||||
StringDictAddPair(self->pNamPos, pPP->Token, pPP->pPtr);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int ConfigMulti(SConnection * pCon, SicsInterp * pSics, void *pData,
|
||||
int argc, char *argv[])
|
||||
{
|
||||
pMulMot self;
|
||||
char pBueffel[512];
|
||||
char pError[132];
|
||||
int i, iToken, iRet;
|
||||
sParser PP;
|
||||
CommandList *pCom = NULL;
|
||||
|
||||
assert(pCon);
|
||||
assert(pSics);
|
||||
assert(pData);
|
||||
|
||||
self = (pMulMot) pData;
|
||||
|
||||
iRet = Arg2Text(argc, argv, pBueffel, 511);
|
||||
if (!iRet) {
|
||||
sprintf(pBueffel, "Argument string to long for %s configuration",
|
||||
argv[0]);
|
||||
SCWrite(pCon, pBueffel, eError);
|
||||
return 0;
|
||||
}
|
||||
strtolower(pBueffel);
|
||||
|
||||
/* first token is name, ignore */
|
||||
PP.pCommand = pBueffel;
|
||||
PP.pPtr = pBueffel;
|
||||
iToken = GetNextToken(&PP);
|
||||
iToken = GetNextToken(&PP);
|
||||
while (iToken != END) {
|
||||
switch (iToken) {
|
||||
case END:
|
||||
return 1; /* ignored */
|
||||
break;
|
||||
case ENDCONFIG:
|
||||
/* reconfigure command to final state */
|
||||
pCom = FindCommand(pSics, argv[0]);
|
||||
assert(pCom != NULL);
|
||||
pCom->OFunc = MultiWrapper;
|
||||
pCom->KFunc = KillMultiMotor;
|
||||
return 1;
|
||||
break;
|
||||
case ALIAS:
|
||||
return ParseAlias(pSics, &PP, self, pCon);
|
||||
break;
|
||||
case POS:
|
||||
return ParsePos(pSics, &PP, self, pCon);
|
||||
break;
|
||||
default:
|
||||
sprintf(pError, "ERROR: Invalid Token %s found in %s",
|
||||
PP.Token, argv[0]);
|
||||
SCWrite(pCon, pBueffel, eError);
|
||||
return 0;
|
||||
}
|
||||
iToken = GetNextToken(&PP);
|
||||
}
|
||||
/* should never end here */
|
||||
sprintf(pError, "ERROR: %s was NOT understood in mumoconf", pBueffel);
|
||||
SCWrite(pCon, pError, eError);
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user