scriptFor è un API di interpretazione di script e formule.
E' utile per inserire in piccoli script, formule matematiche (ma anche di comparazione di stringhe) o condizioni esterne all'esecutivo "da interpretare".
Questo per permettere di condizionare scelte
senza ricompilare il codice.
Si sposta parte del sistema "condizionato e decisionale" al di fuori del programma esecutivo e in modo renderlo parametrico come un qualunque altro dato e memorizzato (ad esempio) in una tabella di un db.
E' usato in tutti i casi dove è difficile prendere anticipatamente decisioni sulla base flag o liste o dove non si sa, nel momento della stesura dell'applicativo, quali condizioni saranno applicate, ma solo i dati sulle quelli lavoreranno.
Prendiamo ad esempio di dover elaborare una condizione e di dare la possibilità all'utente di poterla cambiare come vuole elencandogli le variabili possibili:
(QTA>10 && FATTURATO>1000)
scriptFor fa il parser logico della una stringa (formula) restituendo il risultato.
Attraverso una "funzione di notifica esterna" richiede il valore delle variabili e funzioni che non conosce.
Ritorna anche eventuali errori di sintassi se la formula non è corretta.
Esempio di gestione di una condizione
#include "/easyhand/inc/scriptFor.h"
S_SCRIPT sScript, *psScript;
S_UNIVAL * psRet;
CHAR * pszVal= "(QTA>10 OR FATTURATO>1000)" ;
_(sScript);
sScript.funcExt=_scriptNotify;
psScript=scriptCreate(&sScript);
psRet=scriptGetValue(psScript,pszVal);
if (psScript->enError||!psRet) {
_addErr( "Condizione errata [%s]" ,pszVal);
iRet=2;
}
if (psRet)
{
if (psRet->dValue) iRet=0; else iRet=1;
valDestroy(psRet);
}
psScript=scriptDestroy(psScript);
.
.
.
static void * _scriptNotify(S_SCRIPT * psScript,EN_MESSAGE enMess, CHAR * pszToken, void * pVoid)
{
S_UNIVAL * psVal=NULL;
CHAR * p;
void * pRet=NULL;
switch (enMess) {
case WS_REALGET:
p=coupleGet(_l.cpVal,pszToken);
if (p) {
if (! strcmp (pszToken, "PESONETTO" )||
! strcmp (pszToken, "PESONETTO_IMP" )||
! strcmp (pszToken, "PESOUN" )||
! strcmp (pszToken, "PZCOLLO" )
) {
pRet=psVal=valCreateNumber( atof (p));
} else {
pRet=psVal=valCreateText(p);
}
}
break ;
case WS_REALSET:
ehError();
break ;
}
return pRet;
}
|