scriptFor

7.14
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; // Funzione di controllo
//  sScript.bVerbose=false; // Mostra i passaggi di elaborazione
    psScript=scriptCreate(&sScript);
 
    psRet=scriptGetValue(psScript,pszVal);
    if (psScript->enError||!psRet) {
        _addErr("Condizione errata [%s]",pszVal);
        iRet=2;
    }
     
    if (psRet)
    {
        // ->dValue contiene il risultato
        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) {
 
        //
        // LETTURA VARIABILE
        //
        case WS_REALGET:
            // Cerco il valore (con un mio sistema) della variabile richiesta  
            p=coupleGet(_l.cpVal,pszToken); // pszToken = Nome della variabile
            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;
 
        //
        // SCRITTURA
        //
        case WS_REALSET: // Settaggio di un valore (tipicamente una variabile)
            ehError();
            break;
  }
 
  return pRet; // Errore
}
    

See also:
Easyhand C/C++: scriptFor | Last modified: 24/06/2016 09.47.58 Europe/Rome | #1.2527
P.. 1428
Page Visible: as draft
Easyhand C/C++
Una mano alle tue idee.
Privacy Policy