static bool ParseDirect(const char* s, size_t len, bool (*parseFunc)(const char* s, size_t len, Style& style), Style& style) { if (parseFunc(s, len, style)) { return true; } else { ParseFail("Parse failed on: '%.*s'\n", (int) len, s); return false; } }
static bool ParseCompound(const char* s, size_t len, bool (*parseFunc)(const char* s, size_t len, T& t), StyleCategories cat, Style& style) { T val; if (parseFunc(s, len, val)) { style.Set(cat, val); return true; } else { ParseFail("Parse failed, unknown value: '%.*s'\n", (int) len, s); return false; } }
Func *Parser::parseInEnv(Pepper *pepper, const char *text, bool isFunc) { GC *gc = pepper->gc(); SymbolTable *syms = pepper->syms(); Value *regs = pepper->regs(); regs[6] = Map::makeMap(gc, "func", regs[0], "block", regs[1], NULL); regs[7] = Map::makeMap(gc, "read", regs[2], NULL); regs[8] = Map::makeMap(gc, "class", regs[3], NULL); Func *f = isFunc ? parseFunc(gc, syms, regs, text) : parseStatList(gc, syms, regs, text); return f; }
CWBool CWWTPSendAcknowledgedPacket(int seqNum, CWList msgElemlist, CWBool (assembleFunc)(CWProtocolMessage **, int *, int, int, CWList), CWBool (parseFunc)(char*, int, int, void*), CWBool (saveFunc)(void*), void *valuesPtr) { CWProtocolMessage *messages = NULL; CWProtocolMessage msg; int fragmentsNum = 0, i; struct timespec timewait; int gTimeToSleep = gCWRetransmitTimer; int gMaxTimeToSleep = CW_ECHO_INTERVAL_DEFAULT/2; msg.msg = NULL; if(!(assembleFunc(&messages, &fragmentsNum, gWTPPathMTU, seqNum, msgElemlist))) { goto cw_failure; } gWTPRetransmissionCount= 0; while(gWTPRetransmissionCount < gCWMaxRetransmit) { CWDebugLog("Transmission Num:%d", gWTPRetransmissionCount); for(i = 0; i < fragmentsNum; i++) { #ifdef CW_NO_DTLS if(!CWNetworkSendUnsafeConnected(gWTPSocket, messages[i].msg, messages[i].offset)) #else if(!CWSecuritySend(gWTPSession, messages[i].msg, messages[i].offset)) #endif { CWDebugLog("Failure sending Request"); goto cw_failure; } } timewait.tv_sec = time(0) + gTimeToSleep; timewait.tv_nsec = 0; CW_REPEAT_FOREVER { CWThreadMutexLock(&gInterfaceMutex); if (CWGetCountElementFromSafeList(gPacketReceiveList) > 0) CWErrorRaise(CW_ERROR_SUCCESS, NULL); else { if (CWErr(CWWaitThreadConditionTimeout(&gInterfaceWait, &gInterfaceMutex, &timewait))) CWErrorRaise(CW_ERROR_SUCCESS, NULL); } CWThreadMutexUnlock(&gInterfaceMutex); switch(CWErrorGetLastErrorCode()) { case CW_ERROR_TIME_EXPIRED: { gWTPRetransmissionCount++; goto cw_continue_external_loop; break; } case CW_ERROR_SUCCESS: { /* there's something to read */ if(!(CWReceiveMessage(&msg))) { CW_FREE_PROTOCOL_MESSAGE(msg); CWDebugLog("Failure Receiving Response"); goto cw_failure; } if(!(parseFunc(msg.msg, msg.offset, seqNum, valuesPtr))) { if(CWErrorGetLastErrorCode() != CW_ERROR_INVALID_FORMAT) { CW_FREE_PROTOCOL_MESSAGE(msg); CWDebugLog("Failure Parsing Response"); goto cw_failure; } else { CWErrorHandleLast(); { gWTPRetransmissionCount++; goto cw_continue_external_loop; } break; } } if((saveFunc(valuesPtr))) { goto cw_success; } else { if(CWErrorGetLastErrorCode() != CW_ERROR_INVALID_FORMAT) { CW_FREE_PROTOCOL_MESSAGE(msg); CWDebugLog("Failure Saving Response"); goto cw_failure; } } break; } case CW_ERROR_INTERRUPTED: { gWTPRetransmissionCount++; goto cw_continue_external_loop; break; } default: { CWErrorHandleLast(); CWDebugLog("Failure"); goto cw_failure; break; } } } cw_continue_external_loop: CWDebugLog("Retransmission time is over"); gTimeToSleep<<=1; if ( gTimeToSleep > gMaxTimeToSleep ) gTimeToSleep = gMaxTimeToSleep; } /* too many retransmissions */ return CWErrorRaise(CW_ERROR_NEED_RESOURCE, "Peer Dead"); cw_success: for(i = 0; i < fragmentsNum; i++) { CW_FREE_PROTOCOL_MESSAGE(messages[i]); } CW_FREE_OBJECT(messages); CW_FREE_PROTOCOL_MESSAGE(msg); return CW_TRUE; cw_failure: if(messages != NULL) { for(i = 0; i < fragmentsNum; i++) { CW_FREE_PROTOCOL_MESSAGE(messages[i]); } CW_FREE_OBJECT(messages); } CWDebugLog("Failure"); return CW_FALSE; }