mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-23 21:34:50 +01:00
238 lines
5.3 KiB
C
238 lines
5.3 KiB
C
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#include <stdlib.h>
|
|
#include <math.h>
|
|
#include "cal_tab.h"
|
|
#include "compiler.h"
|
|
#include "eval.h"
|
|
|
|
#define INTCONST 1
|
|
#define DBLCONST 2
|
|
#define HEXCONST 3
|
|
#define VARIABLE 4
|
|
#define OTHER 5
|
|
|
|
int yyparse(char *exp);
|
|
void llinit(void);
|
|
int gettoken(char *lltb, int lltbsiz);
|
|
char yytext[256]="";
|
|
char lastVar[256]="";
|
|
int *errPtr;
|
|
int result;
|
|
int colCount=0;
|
|
|
|
varType *varTable;
|
|
|
|
char last_error_string[1024];
|
|
double globalregs[100];
|
|
|
|
//------------------------------------------------------------------------------
|
|
void *compileExpression(char *exp)
|
|
{
|
|
int errv=0;
|
|
errPtr=&errv;
|
|
llinit();
|
|
if (!yyparse(exp) && !*errPtr)
|
|
{
|
|
return (void*)result;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
void setLastVar(void)
|
|
{
|
|
gettoken(lastVar, sizeof lastVar);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
int setVar(int varNum, double value)
|
|
{
|
|
int i=varNum;
|
|
if (varNum < 0)
|
|
{
|
|
char *var=lastVar;
|
|
if (!_strnicmp(var,"reg",3) && strlen(var) == 5 && isdigit(var[3]) && isdigit(var[4]))
|
|
{
|
|
int x=atoi(var+3);
|
|
if (x < 0 || x > 99) x=0;
|
|
i=EVAL_MAX_VARS+x;
|
|
}
|
|
else
|
|
{
|
|
for (i=0;i<EVAL_MAX_VARS;i++)
|
|
{
|
|
if (!varTable[i].name[0] || !_strnicmp(varTable[i].name,lastVar,sizeof(varTable[i].name)))
|
|
break;
|
|
}
|
|
if (i==EVAL_MAX_VARS) return -1;
|
|
}
|
|
}
|
|
|
|
if (i < 0 || i >= EVAL_MAX_VARS+100)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if (i >= EVAL_MAX_VARS && i < EVAL_MAX_VARS+100)
|
|
{
|
|
globalregs[i - EVAL_MAX_VARS]=value;
|
|
}
|
|
else if (!varTable[i].name[0])
|
|
{
|
|
strncpy(varTable[i].name,lastVar,sizeof(varTable[i].name));
|
|
varTable[i].value = value;
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
int getVar(int varNum)
|
|
{
|
|
if (varNum >= EVAL_MAX_VARS && varNum < EVAL_MAX_VARS+100)
|
|
return createCompiledValue(0, globalregs + (varNum - EVAL_MAX_VARS));
|
|
|
|
if (varNum >= 0 && varNum < EVAL_MAX_VARS)
|
|
return createCompiledValue(0, &(varTable[varNum].value));
|
|
|
|
return createCompiledValue(0, NULL);
|
|
}
|
|
|
|
#if 0
|
|
//------------------------------------------------------------------------------
|
|
double *getVarPtr(char *var)
|
|
{
|
|
int i;
|
|
|
|
if (!_strnicmp(var,"reg",3) && strlen(var) == 5 && isdigit(var[3]) && isdigit(var[4]))
|
|
{
|
|
int x=atoi(var+3);
|
|
if (x < 0 || x > 99) x=0;
|
|
return globalregs + x;
|
|
}
|
|
|
|
for (i=0;i<EVAL_MAX_VARS;i++)
|
|
if (!_strnicmp(varTable[i].name, yytext,sizeof(varTable[i].name)))
|
|
return &(varTable[i].value);
|
|
return NULL;
|
|
}
|
|
#endif
|
|
|
|
//------------------------------------------------------------------------------
|
|
double *registerVar(char *var)
|
|
{
|
|
int i;
|
|
if (!_strnicmp(var,"reg",3) && strlen(var) == 5 && isdigit(var[3]) && isdigit(var[4]))
|
|
{
|
|
int x=atoi(var+3);
|
|
if (x < 0 || x > 99) x=0;
|
|
return globalregs + x;
|
|
}
|
|
|
|
for (i=0;i<EVAL_MAX_VARS;i++)
|
|
if (!varTable[i].name[0] ||
|
|
!_strnicmp(varTable[i].name,var,sizeof(varTable[i].name)))
|
|
break;
|
|
if (i==EVAL_MAX_VARS) return NULL;
|
|
|
|
if (!varTable[i].name[0])
|
|
{
|
|
strncpy(varTable[i].name,var,sizeof(varTable[i].name));
|
|
varTable[i].value = 0.0;
|
|
}
|
|
return &(varTable[i].value);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
int translate(int type)
|
|
{
|
|
int v;
|
|
int n;
|
|
*yytext = 0;
|
|
gettoken(yytext, sizeof yytext);
|
|
|
|
switch (type)
|
|
{
|
|
case INTCONST: return createCompiledValue((double)atoi(yytext), NULL);
|
|
case DBLCONST: return createCompiledValue((double)atof(yytext), NULL);
|
|
case HEXCONST:
|
|
v=0;
|
|
n=0;
|
|
while (1)
|
|
{
|
|
int a=yytext[n++];
|
|
if (a >= '0' && a <= '9') v+=a-'0';
|
|
else if (a >= 'A' && a <= 'F') v+=10+a-'A';
|
|
else if (a >= 'a' && a <= 'f') v+=10+a-'a';
|
|
else break;
|
|
v<<=4;
|
|
}
|
|
return createCompiledValue((double)v, NULL);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
int objectId(int nParams)
|
|
{
|
|
switch (nParams)
|
|
{
|
|
case 1: return FUNCTION1;
|
|
case 2: return FUNCTION2;
|
|
case 3: return FUNCTION3;
|
|
}
|
|
return IDENTIFIER;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
int lookup(int *typeOfObject)
|
|
{
|
|
int i;
|
|
gettoken(yytext, sizeof yytext);
|
|
|
|
if (!_strnicmp(yytext,"reg",3) && strlen(yytext) == 5 && isdigit(yytext[3]) && isdigit(yytext[4]) && (i=atoi(yytext+3))>=0 && i<100)
|
|
{
|
|
*typeOfObject=IDENTIFIER;
|
|
return i+EVAL_MAX_VARS;
|
|
}
|
|
|
|
for (i=0;i<EVAL_MAX_VARS;i++)
|
|
if (!_strnicmp(varTable[i].name, yytext,sizeof(varTable[i].name)))
|
|
{
|
|
*typeOfObject = IDENTIFIER;
|
|
return i;
|
|
}
|
|
|
|
for (i=0;getFunctionFromTable(i);i++)
|
|
{
|
|
functionType *f=getFunctionFromTable(i);
|
|
if (!strcmpi(f->name, yytext))
|
|
{
|
|
*typeOfObject = objectId(f->nParams);
|
|
return i;
|
|
}
|
|
}
|
|
*typeOfObject = IDENTIFIER;
|
|
setLastVar();
|
|
i = setVar(-1, 0);
|
|
return i;
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
void count(void)
|
|
{
|
|
gettoken(yytext, sizeof yytext);
|
|
colCount+=strlen(yytext);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
int yyerror(char *txt)
|
|
{
|
|
*errPtr = colCount;
|
|
return 0;
|
|
} |