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>"); } }
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; }
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; }