Ignore:
Timestamp:
Sep 5, 2008, 5:50:10 AM (17 years ago)
Author:
bird
Message:

kmk/expreval.c: Added conversion operators: num, string and bool. Consoliated some assertions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/expreval.c

    r1728 r1729  
    866866static EXPRRET expr_op_defined(PEXPR pThis)
    867867{
    868     PEXPRVAR          pVar = &pThis->aVars[pThis->iVar];
     868    PEXPRVAR            pVar = &pThis->aVars[pThis->iVar];
    869869    struct variable    *pMakeVar;
    870     assert(pThis->iVar >= 0);
    871870
    872871    expr_var_make_simple_string(pVar);
     
    886885static EXPRRET expr_op_target(PEXPR pThis)
    887886{
    888     PEXPRVAR          pVar = &pThis->aVars[pThis->iVar];
     887    PEXPRVAR            pVar = &pThis->aVars[pThis->iVar];
    889888    struct file        *pFile = NULL;
    890     assert(pThis->iVar >= 0);
    891889
    892890    /*
     
    929927
    930928/**
     929 * Convert to boolean.
     930 *
     931 * @returns Status code.
     932 * @param   pThis       The instance.
     933 */
     934static EXPRRET expr_op_bool(PEXPR pThis)
     935{
     936    expr_var_make_bool(&pThis->aVars[pThis->iVar]);
     937    return kExprRet_Ok;
     938}
     939
     940
     941/**
     942 * Convert to number, works on quoted strings too.
     943 *
     944 * @returns Status code.
     945 * @param   pThis       The instance.
     946 */
     947static EXPRRET expr_op_num(PEXPR pThis)
     948{
     949    PEXPRVAR pVar = &pThis->aVars[pThis->iVar];
     950
     951    /* unquote the string */
     952    if (pVar->enmType == kExprVar_QuotedSimpleString)
     953        pVar->enmType = kExprVar_SimpleString;
     954    else if (pVar->enmType == kExprVar_QuotedString)
     955        pVar->enmType = kExprVar_String;
     956
     957    return expr_var_make_num(pThis, pVar);
     958}
     959
     960
     961/**
     962 * Convert to string (simplified and quoted)
     963 *
     964 * @returns Status code.
     965 * @param   pThis       The instance.
     966 */
     967static EXPRRET expr_op_str(PEXPR pThis)
     968{
     969    PEXPRVAR pVar = &pThis->aVars[pThis->iVar];
     970
     971    expr_var_make_simple_string(pVar);
     972    pVar->enmType = kExprVar_QuotedSimpleString;
     973
     974    return kExprRet_Ok;
     975}
     976
     977
     978/**
    931979 * Pluss (dummy / make_integer)
    932980 *
     
    936984static EXPRRET expr_op_pluss(PEXPR pThis)
    937985{
    938     PEXPRVAR pVar = &pThis->aVars[pThis->iVar];
    939     assert(pThis->iVar >= 0);
    940 
    941     return expr_var_make_num(pThis, pVar);
    942 }
    943 
     986    return expr_var_make_num(pThis, &pThis->aVars[pThis->iVar]);
     987}
    944988
    945989
     
    952996static EXPRRET expr_op_minus(PEXPR pThis)
    953997{
    954     EXPRRET  rc;
    955     PEXPRVAR pVar = &pThis->aVars[pThis->iVar];
    956     assert(pThis->iVar >= 0);
     998    EXPRRET     rc;
     999    PEXPRVAR    pVar = &pThis->aVars[pThis->iVar];
    9571000
    9581001    rc = expr_var_make_num(pThis, pVar);
     
    9731016static EXPRRET expr_op_bitwise_not(PEXPR pThis)
    9741017{
    975     EXPRRET  rc;
    976     PEXPRVAR pVar = &pThis->aVars[pThis->iVar];
    977     assert(pThis->iVar >= 0);
     1018    EXPRRET     rc;
     1019    PEXPRVAR    pVar = &pThis->aVars[pThis->iVar];
    9781020
    9791021    rc = expr_var_make_num(pThis, pVar);
     
    9931035static EXPRRET expr_op_logical_not(PEXPR pThis)
    9941036{
    995     PEXPRVAR pVar = &pThis->aVars[pThis->iVar];
    996     assert(pThis->iVar >= 0);
    997 
    998     expr_var_assign_bool(pVar, !expr_var_make_bool(pVar));
     1037    PEXPRVAR    pVar = &pThis->aVars[pThis->iVar];
     1038
     1039    expr_var_make_bool(pVar);
     1040    pVar->uVal.i = !pVar->uVal.i;
    9991041
    10001042    return kExprRet_Ok;
     
    10101052static EXPRRET expr_op_multiply(PEXPR pThis)
    10111053{
    1012     EXPRRET   rc = kExprRet_Ok;
    1013     PEXPRVAR  pVar1 = &pThis->aVars[pThis->iVar - 1];
    1014     PEXPRVAR  pVar2 = &pThis->aVars[pThis->iVar];
    1015     assert(pThis->iVar >= 1);
     1054    EXPRRET     rc = kExprRet_Ok;
     1055    PEXPRVAR    pVar1 = &pThis->aVars[pThis->iVar - 1];
     1056    PEXPRVAR    pVar2 = &pThis->aVars[pThis->iVar];
    10161057
    10171058    rc = expr_var_make_num(pThis, pVar1);
     
    10371078static EXPRRET expr_op_divide(PEXPR pThis)
    10381079{
    1039     EXPRRET   rc = kExprRet_Ok;
    1040     PEXPRVAR  pVar1 = &pThis->aVars[pThis->iVar - 1];
    1041     PEXPRVAR  pVar2 = &pThis->aVars[pThis->iVar];
    1042     assert(pThis->iVar >= 1);
     1080    EXPRRET     rc = kExprRet_Ok;
     1081    PEXPRVAR    pVar1 = &pThis->aVars[pThis->iVar - 1];
     1082    PEXPRVAR    pVar2 = &pThis->aVars[pThis->iVar];
    10431083
    10441084    rc = expr_var_make_num(pThis, pVar1);
     
    10641104static EXPRRET expr_op_modulus(PEXPR pThis)
    10651105{
    1066     EXPRRET   rc = kExprRet_Ok;
    1067     PEXPRVAR  pVar1 = &pThis->aVars[pThis->iVar - 1];
    1068     PEXPRVAR  pVar2 = &pThis->aVars[pThis->iVar];
    1069     assert(pThis->iVar >= 1);
     1106    EXPRRET     rc = kExprRet_Ok;
     1107    PEXPRVAR    pVar1 = &pThis->aVars[pThis->iVar - 1];
     1108    PEXPRVAR    pVar2 = &pThis->aVars[pThis->iVar];
    10701109
    10711110    rc = expr_var_make_num(pThis, pVar1);
     
    10911130static EXPRRET expr_op_add(PEXPR pThis)
    10921131{
    1093     EXPRRET   rc = kExprRet_Ok;
    1094     PEXPRVAR  pVar1 = &pThis->aVars[pThis->iVar - 1];
    1095     PEXPRVAR  pVar2 = &pThis->aVars[pThis->iVar];
    1096     assert(pThis->iVar >= 1);
     1132    EXPRRET     rc = kExprRet_Ok;
     1133    PEXPRVAR    pVar1 = &pThis->aVars[pThis->iVar - 1];
     1134    PEXPRVAR    pVar2 = &pThis->aVars[pThis->iVar];
    10971135
    10981136    rc = expr_var_make_num(pThis, pVar1);
     
    11171155static EXPRRET expr_op_sub(PEXPR pThis)
    11181156{
    1119     EXPRRET   rc = kExprRet_Ok;
    1120     PEXPRVAR  pVar1 = &pThis->aVars[pThis->iVar - 1];
    1121     PEXPRVAR  pVar2 = &pThis->aVars[pThis->iVar];
    1122     assert(pThis->iVar >= 1);
     1157    EXPRRET     rc = kExprRet_Ok;
     1158    PEXPRVAR    pVar1 = &pThis->aVars[pThis->iVar - 1];
     1159    PEXPRVAR    pVar2 = &pThis->aVars[pThis->iVar];
    11231160
    11241161    rc = expr_var_make_num(pThis, pVar1);
     
    11421179static EXPRRET expr_op_shift_left(PEXPR pThis)
    11431180{
    1144     EXPRRET   rc = kExprRet_Ok;
    1145     PEXPRVAR  pVar1 = &pThis->aVars[pThis->iVar - 1];
    1146     PEXPRVAR  pVar2 = &pThis->aVars[pThis->iVar];
    1147     assert(pThis->iVar >= 1);
     1181    EXPRRET     rc = kExprRet_Ok;
     1182    PEXPRVAR    pVar1 = &pThis->aVars[pThis->iVar - 1];
     1183    PEXPRVAR    pVar2 = &pThis->aVars[pThis->iVar];
    11481184
    11491185    rc = expr_var_make_num(pThis, pVar1);
     
    11681204static EXPRRET expr_op_shift_right(PEXPR pThis)
    11691205{
    1170     EXPRRET   rc = kExprRet_Ok;
    1171     PEXPRVAR  pVar1 = &pThis->aVars[pThis->iVar - 1];
    1172     PEXPRVAR  pVar2 = &pThis->aVars[pThis->iVar];
    1173     assert(pThis->iVar >= 1);
     1206    EXPRRET     rc = kExprRet_Ok;
     1207    PEXPRVAR    pVar1 = &pThis->aVars[pThis->iVar - 1];
     1208    PEXPRVAR    pVar2 = &pThis->aVars[pThis->iVar];
    11741209
    11751210    rc = expr_var_make_num(pThis, pVar1);
     
    11941229static EXPRRET expr_op_less_or_equal_than(PEXPR pThis)
    11951230{
    1196     EXPRRET   rc = kExprRet_Ok;
    1197     PEXPRVAR  pVar1 = &pThis->aVars[pThis->iVar - 1];
    1198     PEXPRVAR  pVar2 = &pThis->aVars[pThis->iVar];
    1199     assert(pThis->iVar >= 1);
     1231    EXPRRET     rc = kExprRet_Ok;
     1232    PEXPRVAR    pVar1 = &pThis->aVars[pThis->iVar - 1];
     1233    PEXPRVAR    pVar2 = &pThis->aVars[pThis->iVar];
    12001234
    12011235    rc = expr_var_unify_types(pThis, pVar1, pVar2, "<=");
     
    12211255static EXPRRET expr_op_less_than(PEXPR pThis)
    12221256{
    1223     EXPRRET   rc = kExprRet_Ok;
    1224     PEXPRVAR  pVar1 = &pThis->aVars[pThis->iVar - 1];
    1225     PEXPRVAR  pVar2 = &pThis->aVars[pThis->iVar];
    1226     assert(pThis->iVar >= 1);
     1257    EXPRRET     rc = kExprRet_Ok;
     1258    PEXPRVAR    pVar1 = &pThis->aVars[pThis->iVar - 1];
     1259    PEXPRVAR    pVar2 = &pThis->aVars[pThis->iVar];
    12271260
    12281261    rc = expr_var_unify_types(pThis, pVar1, pVar2, "<");
     
    12481281static EXPRRET expr_op_greater_or_equal_than(PEXPR pThis)
    12491282{
    1250     EXPRRET   rc = kExprRet_Ok;
    1251     PEXPRVAR  pVar1 = &pThis->aVars[pThis->iVar - 1];
    1252     PEXPRVAR  pVar2 = &pThis->aVars[pThis->iVar];
    1253     assert(pThis->iVar >= 1);
     1283    EXPRRET     rc = kExprRet_Ok;
     1284    PEXPRVAR    pVar1 = &pThis->aVars[pThis->iVar - 1];
     1285    PEXPRVAR    pVar2 = &pThis->aVars[pThis->iVar];
    12541286
    12551287    rc = expr_var_unify_types(pThis, pVar1, pVar2, ">=");
     
    12751307static EXPRRET expr_op_greater_than(PEXPR pThis)
    12761308{
    1277     EXPRRET   rc = kExprRet_Ok;
    1278     PEXPRVAR  pVar1 = &pThis->aVars[pThis->iVar - 1];
    1279     PEXPRVAR  pVar2 = &pThis->aVars[pThis->iVar];
    1280     assert(pThis->iVar >= 1);
     1309    EXPRRET     rc = kExprRet_Ok;
     1310    PEXPRVAR    pVar1 = &pThis->aVars[pThis->iVar - 1];
     1311    PEXPRVAR    pVar2 = &pThis->aVars[pThis->iVar];
    12811312
    12821313    rc = expr_var_unify_types(pThis, pVar1, pVar2, ">");
     
    13021333static EXPRRET expr_op_equal(PEXPR pThis)
    13031334{
    1304     EXPRRET   rc = kExprRet_Ok;
    1305     PEXPRVAR  pVar1 = &pThis->aVars[pThis->iVar - 1];
    1306     PEXPRVAR  pVar2 = &pThis->aVars[pThis->iVar];
    1307     assert(pThis->iVar >= 1);
     1335    EXPRRET     rc = kExprRet_Ok;
     1336    PEXPRVAR    pVar1 = &pThis->aVars[pThis->iVar - 1];
     1337    PEXPRVAR    pVar2 = &pThis->aVars[pThis->iVar];
    13081338
    13091339    /*
     
    13771407static EXPRRET expr_op_bitwise_and(PEXPR pThis)
    13781408{
    1379     PEXPRVAR  pVar1 = &pThis->aVars[pThis->iVar - 1];
    1380     PEXPRVAR  pVar2 = &pThis->aVars[pThis->iVar];
    1381     EXPRRET   rc;
    1382     assert(pThis->iVar >= 1);
     1409    PEXPRVAR    pVar1 = &pThis->aVars[pThis->iVar - 1];
     1410    PEXPRVAR    pVar2 = &pThis->aVars[pThis->iVar];
     1411    EXPRRET     rc;
    13831412
    13841413    rc = expr_var_make_num(pThis, pVar1);
     
    14031432static EXPRRET expr_op_bitwise_xor(PEXPR pThis)
    14041433{
    1405     PEXPRVAR  pVar1 = &pThis->aVars[pThis->iVar - 1];
    1406     PEXPRVAR  pVar2 = &pThis->aVars[pThis->iVar];
    1407     EXPRRET   rc;
    1408     assert(pThis->iVar >= 1);
     1434    PEXPRVAR    pVar1 = &pThis->aVars[pThis->iVar - 1];
     1435    PEXPRVAR    pVar2 = &pThis->aVars[pThis->iVar];
     1436    EXPRRET     rc;
    14091437
    14101438    rc = expr_var_make_num(pThis, pVar1);
     
    14291457static EXPRRET expr_op_bitwise_or(PEXPR pThis)
    14301458{
    1431     PEXPRVAR  pVar1 = &pThis->aVars[pThis->iVar - 1];
    1432     PEXPRVAR  pVar2 = &pThis->aVars[pThis->iVar];
    1433     EXPRRET   rc;
    1434     assert(pThis->iVar >= 1);
     1459    PEXPRVAR    pVar1 = &pThis->aVars[pThis->iVar - 1];
     1460    PEXPRVAR    pVar2 = &pThis->aVars[pThis->iVar];
     1461    EXPRRET     rc;
    14351462
    14361463    rc = expr_var_make_num(pThis, pVar1);
     
    14551482static EXPRRET expr_op_logical_and(PEXPR pThis)
    14561483{
    1457     PEXPRVAR  pVar1 = &pThis->aVars[pThis->iVar - 1];
    1458     PEXPRVAR  pVar2 = &pThis->aVars[pThis->iVar];
    1459     assert(pThis->iVar >= 1);
     1484    PEXPRVAR    pVar1 = &pThis->aVars[pThis->iVar - 1];
     1485    PEXPRVAR    pVar2 = &pThis->aVars[pThis->iVar];
    14601486
    14611487    if (   expr_var_make_bool(pVar1)
     
    14781504static EXPRRET expr_op_logical_or(PEXPR pThis)
    14791505{
    1480     PEXPRVAR  pVar1 = &pThis->aVars[pThis->iVar - 1];
    1481     PEXPRVAR  pVar2 = &pThis->aVars[pThis->iVar];
    1482     assert(pThis->iVar >= 1);
     1506    PEXPRVAR    pVar1 = &pThis->aVars[pThis->iVar - 1];
     1507    PEXPRVAR    pVar2 = &pThis->aVars[pThis->iVar];
    14831508
    14841509    if (   expr_var_make_bool(pVar1)
     
    15331558static EXPRRET expr_op_right_parenthesis(PEXPR pThis)
    15341559{
     1560    assert(0);
    15351561    (void)pThis;
    15361562    return kExprRet_Ok;
     
    15541580    EXPR_OP("defined",     90,      1,    expr_op_defined),
    15551581    EXPR_OP("target",      90,      1,    expr_op_target),
     1582    EXPR_OP("bool",        90,      1,    expr_op_bool),
     1583    EXPR_OP("num",         90,      1,    expr_op_num),
     1584    EXPR_OP("str",         90,      1,    expr_op_str),
    15561585    EXPR_OP("+",           80,      1,    expr_op_pluss),
    15571586    EXPR_OP("-",           80,      1,    expr_op_minus),
     
    19541983        {
    19551984            pOp = pThis->apOps[pThis->iOp--];
     1985            assert(pThis->iVar + 1 >= pOp->cArgs);
    19561986            rc = pOp->pfn(pThis);
    19571987            if (rc < kExprRet_Error)
Note: See TracChangeset for help on using the changeset viewer.