/* A generic insertion sort */ void insertionSort(void * arr, int numElems, size_t size, int (*compFunc)(void *, void *)) { for(int i = 1; i < numElems; i++) { void * elemMem = malloc(size); assert(elemMem != NULL); memcpy(elemMem, (char *)arr + i * size, size); int j = i - 1; while(j >= 0) { void * lMem = (char *)arr + j * size; void * rMem = (char *)arr + (j + 1) * size; if(compFunc(elemMem, lMem)) memcpy(rMem, lMem, size); else break; j--; } void * dest = (char *)arr + (j + 1) * size; memcpy(dest, elemMem, size); free(elemMem); } }
static TActor *AIGetClosestActor(Vec2i from, int (*compFunc)(TActor *)) { // Search all the actors and find the closest one that // satisfies the condition TActor *closest = NULL; int minDistance = -1; for (int i = 0; i < (int)gActors.size; i++) { TActor *a = CArrayGet(&gActors, i); if (!a->isInUse || a->dead) { continue; } // Never target invulnerables or civilians if (a->flags & (FLAGS_INVULNERABLE | FLAGS_PENALTY)) { continue; } if (compFunc(a)) { int distance = CHEBYSHEV_DISTANCE(from.x, from.y, a->Pos.x, a->Pos.y); if (!closest || distance < minDistance) { minDistance = distance; closest = a; } } } return closest; }
NODE* Search(LINKEDLIST * pList, COMPAREFUNC compFunc, void* pData) { NODE *pStart = pList->pTop; while (pStart) { if (compFunc(pStart, pData) == true) { return pStart; } pStart = pStart->pNext; } return NULL; }