static int invalidcmp(Dt_t* dict, void* a, void* b, Dtdisc_t* disc) { Invalid_t* ap = (Invalid_t*)a; Invalid_t* bp = (Invalid_t*)b; size_t az; size_t bz; int r; if (!(r = strcmp(ap->variable->name, bp->variable->name))) { if (cxisstring(ap->variable->type) || cxisbuffer(ap->variable->type)) { az = ap->value.buffer.size; bz = bp->value.buffer.size; if (!(r = memcmp(ap->value.buffer.data, bp->value.buffer.data, az < bz ? az : bz))) { if (az < bz) r = -1; if (az > bz) r = 1; } } else if (ap->value.number < bp->value.number) r = -1; else if (ap->value.number > bp->value.number) r = 1; } return r; }
static int ordercmp(Dt_t* dict, void* a, void* b, Dtdisc_t* disc) { State_t* state = (State_t*)disc; File_t* ap = (File_t*)a; File_t* bp = (File_t*)b; Key_t* kp; size_t az; size_t bz; int k; int r; for (k = 0, kp = state->keys; k < state->nkeys; k++, kp = kp->next) if (cxisstring(kp->variable->type) || cxisbuffer(kp->variable->type)) { az = ap->data[k].value.buffer.size; bz = bp->data[k].value.buffer.size; if (r = memcmp(ap->data[k].value.buffer.data, bp->data[k].value.buffer.data, az < bz ? az : bz)) return (r < 0) ? -kp->sense : kp->sense; if (az < bz) return -kp->sense; if (az > bz) return kp->sense; } else if (ap->data[k].value.number < bp->data[k].value.number) return -kp->sense; else if (ap->data[k].value.number > bp->data[k].value.number) return kp->sense; if (ap < bp) return -1; if (ap > bp) return 1; return 0; }