/* 折半查找 */ static void TranslateSwitchBuckets (SwitchBucket *bucketArray, int left, int right, Symbol choice, BBlock currBB, BBlock defBB) { int mid, len, i; AstCaseStatement p; BBlock lhalfBB, rhalfBB; BBlock *dstBBs; Symbol index; if (left > right) return; mid = (left + right) / 2; lhalfBB = (left > mid - 1) ? defBB : CreateBBlock(); rhalfBB = (mid + 1 > right) ? defBB : CreateBBlock(); len = bucketArray[mid]->maxVal - bucketArray[mid]->minVal + 1; dstBBs = HeapAllocate (CurrentHeap, (len + 1)* sizeof(BBlock)); for (i = 0; i < len; ++i) dstBBs[i] = defBB; dstBBs[len] = NULL; for (p = bucketArray[mid]->cases; p; p = p->nextCase) { i = p->expr->val.i[0] - bucketArray[mid]->minVal; dstBBs[i] = p->respBB; } if (currBB != NULL) { StartBBlock (currBB); } GenerateBranch (choice->ty, lhalfBB, JL, choice, IntConstant (bucketArray[mid]->minVal)); StartBBlock (CreateBBlock()); GenerateBranch (choice->ty, rhalfBB, JG, choice, IntConstant (bucketArray[mid]->maxVal)); StartBBlock (CreateBBlock()); if (len != 1) { index = CreateTemp (choice->ty); GenerateAssign (choice->ty, index, SUB, choice, IntConstant (bucketArray[mid]->minVal)); GenerateIndirectJump (dstBBs, len, index); } else { GenerateJump (dstBBs[0]); } StartBBlock (CreateBBlock ()); /* 二分递归 */ TranslateSwitchBuckets (bucketArray, left, mid - 1, choice, lhalfBB, defBB); TranslateSwitchBuckets (bucketArray, mid + 1, right, choice, rhalfBB, defBB); }
struct Header *BuildRequestViaHeader(MESSAGE *message, struct Dialog *dialog) { URI *uri = CreateUri("", "", GetLocalIpAddr(), LOCAL_PORT); VIA_HEADER *via = CreateViaHeader(uri); struct Parameters *ps = ViaHeaderGetParameters(via); char branch[32]; AddParameter(ps, "rport", ""); GenerateBranch(branch); AddParameter(ps, VIA_BRANCH_PARAMETER_NAME, branch); return (struct Header *)via; }