예제 #1
0
static void 
_dispExpr(FILE *fp, CExpr *expr, int indent)
{
    if (expr == NULL)
        return;

    if (EXPR_C(expr)->e_gccAttrPre) {
        _dispExprBlock(fp, EXPR_C(expr)->e_gccAttrPre, indent, "<pre>");
    }

    switch(EXPR_STRUCT(expr)) {
    case STRUCT_CExprOfSymbol:
        _dispInnerExprOfSymbol(fp, EXPR_SYMBOL(expr), indent);
        break;
    case STRUCT_CExprOfList:
        _dispInnerExprOfList(fp, EXPR_L(expr), indent);
        break;
    case STRUCT_CExprOfNumberConst:
        _dispInnerExprOfNumberConst(fp, EXPR_NUMBERCONST(expr), indent);
        break;
    case STRUCT_CExprOfCharConst:
        _dispInnerExprOfCharConst(fp, EXPR_CHARCONST(expr), indent);
        break;
    case STRUCT_CExprOfStringConst:
        _dispInnerExprOfStringConst(fp, EXPR_STRINGCONST(expr), indent);
        break;
    case STRUCT_CExprOfGeneralCode:
        _dispInnerExprOfGeneralCode(fp, EXPR_GENERALCODE(expr), indent);
        break;
    case STRUCT_CExprOfUnaryNode:
        _dispInnerExprOfUnaryNode(fp, EXPR_U(expr), indent);
        break;
    case STRUCT_CExprOfBinaryNode:
        _dispInnerExprOfBinaryNode(fp, EXPR_B(expr), indent);
        break;
    case STRUCT_CExprOfArrayDecl:
        _dispInnerExprOfArrayDecl(fp, EXPR_ARRAYDECL(expr), indent);
        break;
    case STRUCT_CExprOfDirective:
        _dispInnerExprOfDirective(fp, EXPR_DIRECTIVE(expr), indent);
        break;
    case STRUCT_CExprOfTypeDesc:
        _dispInnerExprOfTypeDesc(fp, EXPR_T(expr), indent);
        break;
    case STRUCT_CExprOfErrorNode:
        _dispInnerExprOfErrorNode(fp, EXPR_ERRORNODE(expr), indent);
        break;
    case STRUCT_CExprOfNull:
        _dispInnerExprOfNull(fp, EXPR_NULL(expr), indent);
        break;
    case STRUCT_CExpr_UNDEF:
    case STRUCT_CExpr_END:
        ABORT();
    }

    if (EXPR_C(expr)->e_gccAttrPost) {
        _dispExprBlock(fp, EXPR_C(expr)->e_gccAttrPost, indent, "<post>");
    }
}
예제 #2
0
static bool handleQueryAll(int size, const byte *msg, CONTEXT *context)
    {
    byte bind = msg[1];
    TASK *task = firstTask;
    int taskCount = getTaskCount();
    byte* localMem = (byte *) malloc(taskCount+2);
    byte* local = &localMem[2];
    int i = 0;

    if (!localMem)
        {
#ifdef DEBUG
        sendStringf("hQA: M");
#endif
        return false;
        }

    localMem[0] = EXPR_L(EXPR_LIT);

    while(task != NULL && i < taskCount)
        {
        *local++ = task->id;
        task = task->next;
        i++;
        }

    localMem[1] = i;

    if (context->codeBlock || context->task)
        {
        putBindListPtr(context, bind, localMem);
        }
    else
        {
        sendReply(i+2, SCHED_RESP_QUERY_ALL, localMem, context, bind);
        free(localMem);    
        }
    return false;
    }
예제 #3
0
static bool handleNewRef(int type, int size, const byte *msg, CONTEXT *context)
    {
    byte bind = msg[2];
    int count = 1;
    int spaceNeeded = typeToSize(type) * count;
    byte refIndex = msg[3];
    byte *expr = (byte *) &msg[4];
    void *memory;
    byte newReply[2];

    // ToDo: Handle overflow of ref numbers

    if ((refIndex >= MAX_REFS) ||
        (((type != REF_LIST8) && (memory = malloc(spaceNeeded)) == NULL)))
        {
        sendReply(0, REF_RESP_NEW, NULL, context, bind);
        }
    else
        {
        if (type != REF_LIST8)
            {
            if (haskinoRefs[refIndex].ref != NULL)
                {
                free(haskinoRefs[refIndex].ref);
                }
            haskinoRefs[refIndex].ref = memory;
            }
        haskinoRefs[refIndex].type = type;
        haskinoRefs[refIndex].len = count;
        switch (type)
            {
            case REF_BOOL:
                newReply[0] = EXPR(EXPR_BOOL, EXPR_LIT);
                storeBoolRef(expr, context, refIndex);
                break;
            case REF_WORD8:
                newReply[0] = EXPR(EXPR_WORD8, EXPR_LIT);
                storeWord8Ref(expr, context, refIndex);
                break;
            case REF_WORD16:
                newReply[0] = EXPR(EXPR_WORD16, EXPR_LIT);
                storeWord16Ref(expr, context, refIndex);
                break;
            case REF_WORD32:
                newReply[0] = EXPR(EXPR_WORD32, EXPR_LIT);
                storeWord32Ref(expr, context, refIndex);
                break;
            case REF_LIST8:
                newReply[0] = EXPR_L(EXPR_LIT);
                storeList8Ref(expr, context, refIndex);
                break;
            case REF_INT8:
                newReply[0] = EXPR(EXPR_INT8, EXPR_LIT);
                storeInt8Ref(expr, context, refIndex);
                break;
            case REF_INT16:
                newReply[0] = EXPR(EXPR_INT16, EXPR_LIT);
                storeInt16Ref(expr, context, refIndex);
                break;
            case REF_INT32:
                newReply[0] = EXPR(EXPR_INT32, EXPR_LIT);
                storeInt32Ref(expr, context, refIndex);
                break;
            case REF_FLOAT:
                newReply[0] = EXPR_F(EXPR_LIT);
                storeFloatRef(expr, context, refIndex);
                break;
            }
        newReply[1] = refIndex;
        sendReply(sizeof(byte)+1, REF_RESP_NEW, newReply, context, bind);
        }
    return false;
    }