54 #define FailSyn(Msg) {DefSyntaxError(Msg); return false;}
55 #define FailSem(Msg) {DefSemanticsError(Fi, Msg, OpCode); return false;}
65 #define cval _cont_val
66 #define sval _string_val
67 #define dval _discr_val
118 strcmp(
AttName[MaxAtt],
"case weight") )
123 if ( TStack[0].Type ==
'B' )
178 if ( c == EOF || c ==
'\n' && LastWasPeriod )
183 if ( ! LastWasPeriod )
Append(
'.');
202 LastWasPeriod = ( c ==
'.' );
220 if ( c ==
' ' && (!
BN ||
Buff[
BN-1] ==
' ' ) )
return;
274 while (
Find(
"and") )
326 if ( (o =
FindOne(AddOps)) >= 0 )
335 while ( (o =
FindOne(AddOps)) >= 0 )
358 while ( (o =
FindOne(MultOps)) >= 0 )
411 FailSyn(
"attribute, value, or '('");
422 char *EndPtr, *Str, Date[11], Time[9];
423 int o, FirstBN, Fi=
BN;
441 Str = strdup(
Buff + FirstBN);
458 if ( (
Buff[BN+4] ==
'/' &&
Buff[BN+7] ==
'/' ||
459 Buff[BN+4] ==
'-' &&
Buff[BN+7] ==
'-' )&&
460 isdigit(
Buff[BN+1]) && isdigit(
Buff[BN+2]) &&
461 isdigit(
Buff[BN+3]) &&
462 isdigit(
Buff[BN+5]) && isdigit(
Buff[BN+6]) &&
463 isdigit(
Buff[BN+8]) && isdigit(
Buff[BN+9]) )
465 memcpy(Date,
Buff+BN, 10);
475 if (
Buff[BN+2] ==
':' &&
Buff[BN+5] ==
':' &&
476 isdigit(
Buff[BN+1]) &&
477 isdigit(
Buff[BN+3]) && isdigit(
Buff[BN+4]) &&
478 isdigit(
Buff[BN+6]) && isdigit(
Buff[BN+7]) )
480 memcpy(Time,
Buff+BN, 8);
491 F = strtod(
Buff+BN, &EndPtr);
495 if ( EndPtr >
Buff+BN+1 && *(EndPtr-1) ==
'.' )
506 if ( (o =
FindOne(Funcs)) >= 0 )
510 if ( !
Find(
"(") )
FailSyn(
"'(' after function name");
515 if ( !
Find(
")") )
FailSyn(
"')' after function argument");
521 if (
Buff[BN] ==
'?' )
524 if ( TStack[
TSN-1].Type ==
'N' )
534 if ( ! memcmp(
Buff+BN,
"N/A", 3) )
537 if ( TStack[
TSN-1].Type ==
'N' )
568 return ( !
Buff[
BN] ?
false : ! memcmp(
Buff+
BN, S, strlen(S)) );
585 for ( a = 0 ; Alt[a] ; a++ )
587 if (
Find(Alt[a]) )
return a;
656 for ( ; (RestOfText[i] & 0x80) ; i++)
659 RestOfText[i] = RestOfText[i+1] =
'.';
672 char Exp[1000], XMsg[1000], Op[1000];
680 sprintf(Exp,
"%.10s...%.10s",
Buff+Fi,
Buff+
BN-10);
684 sprintf(Exp,
"%.*s",
BN - Fi,
Buff+Fi);
689 case OP_AND: sprintf(Op,
"%s",
"and");
break;
690 case OP_OR: sprintf(Op,
"%s",
"or");
break;
692 case OP_EQ: sprintf(Op,
"%s",
"=");
break;
694 case OP_NE: sprintf(Op,
"%s",
"<>");
break;
695 case OP_GT: sprintf(Op,
"%s",
">");
break;
696 case OP_GE: sprintf(Op,
"%s",
">=");
break;
697 case OP_LT: sprintf(Op,
"%s",
"<");
break;
698 case OP_LE: sprintf(Op,
"%s",
"<=");
break;
699 case OP_PLUS: sprintf(Op,
"%s",
"+");
break;
700 case OP_MINUS: sprintf(Op,
"%s",
"-");
break;
701 case OP_UMINUS: sprintf(Op,
"%s",
"unary -");
break;
702 case OP_MULT: sprintf(Op,
"%s",
"*");
break;
703 case OP_DIV: sprintf(Op,
"%s",
"/");
break;
704 case OP_MOD: sprintf(Op,
"%s",
"%");
break;
705 case OP_POW: sprintf(Op,
"%s",
"^");
break;
706 case OP_SIN: sprintf(Op,
"%s",
"sin");
break;
707 case OP_COS: sprintf(Op,
"%s",
"cos");
break;
708 case OP_TAN: sprintf(Op,
"%s",
"tan");
break;
709 case OP_LOG: sprintf(Op,
"%s",
"log");
break;
710 case OP_EXP: sprintf(Op,
"%s",
"exp");
break;
711 case OP_INT: sprintf(Op,
"%s",
"int");
714 sprintf(XMsg,
"%s with '%s'", Msg, Op);
734 if (
Buff[Fi] ==
' ' ) Fi++;
792 if ( TStack[
TSN-2].Type !=
'B' || TStack[
TSN-1].Type !=
'B' )
801 if ( TStack[
TSN-2].Type != TStack[
TSN-1].Type )
803 FailSem(
"incompatible values");
813 if ( TStack[
TSN-2].Type !=
'N' || TStack[
TSN-1].Type !=
'N' )
815 FailSem(
"non-arithmetic value");
823 if ( TStack[
TSN-2].Type !=
'S' || TStack[
TSN-1].Type !=
'S' )
825 FailSem(
"incompatible values");
837 if ( TStack[
TSN-2].Type !=
'N' || TStack[
TSN-1].Type !=
'N' )
839 FailSem(
"non-arithmetic value");
845 if ( TStack[
TSN-1].Type !=
'N' )
847 FailSem(
"non-arithmetic value");
858 if ( TStack[
TSN-1].Type !=
'N' )
860 FailSem(
"non-arithmetic argument");
880 #define CUnknownVal(AV) (AV.cval==_UNK.cval)
881 #define DUnknownVal(AV) (AV.dval==_UNK.dval)
882 #define DUNA(a) (DUnknownVal(XStack[a]) || NotApplicVal(XStack[a]))
883 #define CUNA(a) (CUnknownVal(XStack[a]) || NotApplicVal(XStack[a]))
884 #define C1(x) (CUNA(XSN-1) ? _UNK.cval : (x))
885 #define C2(x) (CUNA(XSN-1) || CUNA(XSN-2) ? _UNK.cval : (x))
886 #define CD2(x) (CUNA(XSN-1) || CUNA(XSN-2) ? _UNK.dval : (x))
887 #define D2(x) (DUNA(XSN-1) || DUNA(XSN-2) ? _UNK.dval : (x))
894 int XSN=0,
DN, bv1, bv2, Mult;
901 for (
DN = 0 ; ;
DN++)
903 switch (
DefOp((DElt = D[
DN])) )
910 XStack[XSN++].cval =
CVal(Case, Att);
921 XStack[XSN++].cval =
DefNVal(DElt);
925 XStack[XSN++].sval =
DefSVal(DElt);
929 bv1 = XStack[XSN-2].dval;
930 bv2 = XStack[XSN-1].dval;
931 XStack[XSN-2].dval = ( bv1 == 3 || bv2 == 3 ? 3 :
932 D2(bv1 == 2 && bv2 == 2 ? 2 : 3) );
937 bv1 = XStack[XSN-2].dval;
938 bv2 = XStack[XSN-1].dval;
939 XStack[XSN-2].dval = ( bv1 == 2 || bv2 == 2 ? 2 :
940 D2(bv1 == 2 || bv2 == 2 ? 2 : 3) );
945 cv1 = XStack[XSN-2].cval;
946 cv2 = XStack[XSN-1].cval;
947 XStack[XSN-2].dval = ( cv1 == cv2 ? 2 : 3 );
952 cv1 = XStack[XSN-2].cval;
953 cv2 = XStack[XSN-1].cval;
954 XStack[XSN-2].dval = ( cv1 != cv2 ? 2 : 3 );
959 cv1 = XStack[XSN-2].cval;
960 cv2 = XStack[XSN-1].cval;
961 XStack[XSN-2].dval =
CD2(cv1 > cv2 ? 2 : 3);
966 cv1 = XStack[XSN-2].cval;
967 cv2 = XStack[XSN-1].cval;
968 XStack[XSN-2].dval =
CD2(cv1 >= cv2 ? 2 : 3);
973 cv1 = XStack[XSN-2].cval;
974 cv2 = XStack[XSN-1].cval;
975 XStack[XSN-2].dval =
CD2(cv1 < cv2 ? 2 : 3);
980 cv1 = XStack[XSN-2].cval;
981 cv2 = XStack[XSN-1].cval;
982 XStack[XSN-2].dval =
CD2(cv1 <= cv2 ? 2 : 3);
987 sv1 = XStack[XSN-2].sval;
988 sv2 = XStack[XSN-1].sval;
990 ( ! sv1 && ! sv2 ? 2 :
992 ! strcmp(sv1, sv2) ? 2 : 3 );
997 sv1 = XStack[XSN-2].sval;
998 sv2 = XStack[XSN-1].sval;
1000 ( ! sv1 && ! sv2 ? 3 :
1001 ! sv1 || ! sv2 ? 2 :
1002 strcmp(sv1, sv2) ? 2 : 3 );
1007 cv1 = XStack[XSN-2].cval;
1008 cv2 = XStack[XSN-1].cval;
1009 XStack[XSN-2].cval =
C2(cv1 + cv2);
1014 cv1 = XStack[XSN-2].cval;
1015 cv2 = XStack[XSN-1].cval;
1016 XStack[XSN-2].cval =
C2(cv1 - cv2);
1021 cv1 = XStack[XSN-2].cval;
1022 cv2 = XStack[XSN-1].cval;
1023 XStack[XSN-2].cval =
C2(cv1 * cv2);
1030 cv1 = XStack[XSN-2].cval;
1031 cv2 = XStack[XSN-1].cval;
1038 XStack[XSN-2].cval = _UNK.cval;
1044 while ( fabs(cv2) > 1 )
1049 XStack[XSN-2].cval = rint(cv1 * Mult) / Mult;
1055 cv1 = XStack[XSN-2].cval;
1056 cv2 = XStack[XSN-1].cval;
1057 XStack[XSN-2].cval =
C2(fmod(cv1, cv2));
1062 cv1 = XStack[XSN-2].cval;
1063 cv2 = XStack[XSN-1].cval;
1064 XStack[XSN-2].cval =
1066 ( cv1 < 0 && ceil(cv2) != cv2 ) ? _UNK.cval :
1072 cv1 = XStack[XSN-1].cval;
1073 XStack[XSN-1].cval =
C1(-cv1);
1077 cv1 = XStack[XSN-1].cval;
1078 XStack[XSN-1].cval =
C1(sin(cv1));
1082 cv1 = XStack[XSN-1].cval;
1083 XStack[XSN-1].cval =
C1(cos(cv1));
1087 cv1 = XStack[XSN-1].cval;
1088 XStack[XSN-1].cval =
C1(tan(cv1));
1092 cv1 = XStack[XSN-1].cval;
1093 XStack[XSN-1].cval =
1094 (
CUNA(XSN-1) || cv1 <= 0 ? _UNK.cval : log(cv1) );
1098 cv1 = XStack[XSN-1].cval;
1099 XStack[XSN-1].cval =
C1(exp(cv1));
1103 cv1 = XStack[XSN-1].cval;
1104 XStack[XSN-1].cval =
C1(rint(cv1));
1108 ReturnVal.cval = XStack[0].cval;