%% options copyright owner = Dirk Krause copyright year = 2012-2013 license = bsd %% module #include "dk3all.h" #include "itadmin.h" $!trace-include /** @file itacomp.c Comparison functions. This module provides comparison functions for the sorted containers. */ /** Correct comparison result. @param v Direct result from string comparison. @return -1, 0, or 1. */ static int itadmin_comp_correct(int v) { int back; back = v; if(v < -1) back = -1; if(v > 1) back = 1; return back; } int itadmin_comp_user(void *l, void *r, int cr) { itadmin_user *pl; itadmin_user *pr; char const *sn; int back = 0; if(l) { if(r) { pl = (itadmin_user *)l; switch(cr) { case 1: { sn = (char const *)r; if(pl->us) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->us, sn)); } else { back = -1; } } break; case 2: { pr = (itadmin_user *)r; if(pl->na) { if(pr->na) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->na, pr->na)); } else { back = 1; } } else { if(pr->na) { back = -1; } } if(back == 0) { if(pl->sn) { if(pr->sn) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->sn, pr->sn)); } else { back = 1; } } else { if(pr->sn) { back = -1; } } } if(back == 0) { if(pl->tt) { if(pr->tt) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->tt, pr->tt)); } else { back = 1; } } else { if(pr->tt) { back = -1; } } } if(back == 0) { if(pl->us) { if(pr->us) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->us, pr->us)); } else { back = 1; } } else { if(pr->us) { back = -1; } } } } break; default: { pr = (itadmin_user *)r; if(pl->us) { if(pr->us) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->us, pr->us)); } else { back = 1; } } else { if(pr->us) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } return back; } int itadmin_comp_building(void *l, void *r, int cr) { itadmin_building *pl; itadmin_building *pr; int back = 0; if(l) { if(r) { pl = (itadmin_building *)l; switch(cr) { case 1: { if(pl->s) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->s, (char const *)r)); } else { back = -1; } } break; default: { pr = (itadmin_building *)r; if(pl->s) { if(pr->s) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->s, pr->s)); } else { back = 1; } } else { if(pr->s) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } return back; } int itadmin_comp_speed(void *l, void *r, int cr) { itadmin_speed *pl; itadmin_speed *pr; int back = 0; if(l) { if(r) { pl = (itadmin_speed *)l; switch(cr) { case 1: { if(pl->s) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->s, (char const *)r)); } else { back = -1; } } break; default: { pr = (itadmin_speed *)r; if(pl->s) { if(pr->s) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->s, pr->s)); } else { back = 1; } } else { if(pr->s) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } return back; } int itadmin_comp_vlan(void *l, void *r, int cr) { itadmin_vlan *pl; itadmin_vlan *pr; int back = 0; if(l) { if(r) { pl = (itadmin_vlan *)l; switch(cr) { case 1: { if(pl->s) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->s, (char const *)r)); } else { back = -1; } } break; default: { pr = (itadmin_vlan *)r; if(pl->s) { if(pr->s) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->s, pr->s)); } else { back = 1; } } else { if(pr->s) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } return back; } int itadmin_comp_connect(void *l, void *r, int cr) { itadmin_connect *pl; itadmin_connect *pr; int back = 0; if(l) { if(r) { pl = (itadmin_connect *)l; switch(cr) { case 1: { if(pl->s) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->s, (char const *)r)); } else { back = -1; } } break; default: { pr = (itadmin_connect *)r; if(pl->s) { if(pr->s) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->s, pr->s)); } else { back = 1; } } else { if(pr->s) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } return back; } int itadmin_comp_network(void *l, void *r, int cr) { itadmin_network *pl; itadmin_network *pr; unsigned long *ul; int back = 0; if(l) { if(r) { pl = (itadmin_network *)l; switch(cr) { case 1: { ul = (unsigned long *)r; if(((pl->ip4) & (pl->ma4)) > ((*ul) & (pl->ma4))) { back = 1; } else { if(((pl->ip4) & (pl->ma4)) < ((*ul) & (pl->ma4))) { back = -1; } } } break; default: { pr = (itadmin_network *)r; if(pl->ip4 > pr->ip4) { back = 1; } else { if(pl->ip4 < pr->ip4) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } return back; } int itadmin_comp_netgroup(void *l, void *r, int cr) { itadmin_netgroup *pl; itadmin_netgroup *pr; int back = 0; if(l) { if(r) { pl = (itadmin_netgroup *)l; switch(cr) { case 1: { if(pl->sn) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->sn, (char const *)r)); } else { back = -1; } } break; default: { pr = (itadmin_netgroup *)r; if(pl->sn) { if(pr->sn) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->sn, pr->sn)); } else { back = 1; } } else { if(pr->sn) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } return back; } int itadmin_comp_dhcp_class(void *l, void *r, int cr) { itadmin_dhcp_class *pl; itadmin_dhcp_class *pr; int back = 0; if(l) { if(r) { pl = (itadmin_dhcp_class *)l; switch(cr) { case 1: { if(pl->sn) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->sn, (char const *)r)); } else { back = -1; } } break; default: { pr = (itadmin_dhcp_class *)r; if(pl->sn) { if(pr->sn) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->sn, pr->sn)); } else { back = 1; } } else { if(pr->sn) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } return back; } int itadmin_comp_dhcp_pool(void *l, void *r, int cr) { itadmin_dhcp_pool *pl; itadmin_dhcp_pool *pr; unsigned long *ul; int back = 0; if(l) { if(r) { pl = (itadmin_dhcp_pool *)l; switch(cr) { case 1: { ul = (unsigned long *)r; if(pl->ip4s > *ul) { back = 1; } else { if(pl->ip4e < *ul) { back = -1; } } } break; default: { pr = (itadmin_dhcp_pool *)r; if(pl->ip4s > pr->ip4s) { back = 1; } else { if(pl->ip4s < pr->ip4s) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } return back; } int itadmin_comp_dhcp_group(void *l, void *r, int cr) { itadmin_dhcp_group *pl; itadmin_dhcp_group *pr; int back = 0; if(l) { if(r) { pl = (itadmin_dhcp_group *)l; switch(cr) { case 1: { if(pl->sn) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->sn, (char const *)r)); } else { back = -1; } } break; default: { pr = (itadmin_dhcp_group *)r; if(pl->sn) { if(pr->sn) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->sn, pr->sn)); } else { back = 1; } } else { if(pr->sn) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } return back; } int itadmin_comp_host(void *l, void *r, int cr) { itadmin_host *pl; itadmin_host *pr; unsigned long *ul; int back = 0; if(l) { if(r) { pl = (itadmin_host *)l; switch(cr) { case 3: { ul = (unsigned long *)r; if(pl->ipv4 > *ul) { back = 1; } else { if(pl->ipv4 < *ul) { back = -1; } } } break; case 2: { pr = (itadmin_host *)r; if(pl->ipv4 > pr->ipv4) { back = 1; } else { if(pl->ipv4 < pr->ipv4) { back = -1; } } } break; case 1: { if(pl->sn) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->sn, (char const *)r)); } else { back = -1; } } break; default: { pr = (itadmin_host *)r; if(pl->sn) { if(pr->sn) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->sn, pr->sn)); } else { back = 1; } } else { if(pr->sn) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } return back; } int itadmin_comp_swman(void *l, void *r, int cr) { itadmin_swman *pl; itadmin_swman *pr; int back = 0; if(l) { if(r) { pl = (itadmin_swman *)l; switch(cr) { case 2: { pr = (itadmin_swman *)r; if(pl->ln) { if(pr->ln) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->ln, pr->ln)); } else { back = 1; } } else { if(pr->ln) { back = -1; } } if(back == 0) { if(pl->sn) { if(pr->sn) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->sn, pr->sn)); } else { back = 1; } } else { if(pr->sn) { back = -1; } } } } break; case 1: { if(pl->sn) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->sn, (char const *)r)); } else { back = -1; } } break; default: { pr = (itadmin_swman *)r; if(pl->sn) { if(pr->sn) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->sn, pr->sn)); } else { back = 1; } } else { if(pr->sn) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } return back; } int itadmin_comp_swprod(void *l, void *r, int cr) { itadmin_swprod *pl; itadmin_swprod *pr; int back = 0; if(l) { if(r) { pl = (itadmin_swprod *)l; switch(cr) { case 2: { pr = (itadmin_swprod *)r; back = itadmin_comp_swman((void *)(pl->mn), (void *)(pr->mn), 2); if(back == 0) { if(pl->ln) { if(pr->ln) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->ln, pr->ln)); } else { back = 1; } } else { if(pr->ln) { back = -1; } } } if(back == 0) { if(pl->sn) { if(pr->sn) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->sn, pr->sn)); } else { back = 1; } } else { if(pr->sn) { back = -1; } } } } break; case 1: { if(pl->sn) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->sn, (char const *)r)); } else { back = -1; } } break; default: { pr = (itadmin_swprod *)r; if(pl->sn) { if(pr->sn) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->sn, pr->sn)); } else { back = 1; } } else { if(pr->sn) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } return back; } int itadmin_comp_lictype(void *l, void *r, int cr) { itadmin_lictype *pl; itadmin_lictype *pr; int back = 0; if(l) { if(r) { pl = (itadmin_lictype *)l; switch(cr) { case 2: { pr = (itadmin_lictype *)r; if(pl->ln) { if(pr->ln) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->ln, pr->ln)); } else { back = 1; } } else { if(pr->ln) { back = -1; } } if(back == 0) { if(pl->num > pr->num) { back = 1; } else { if(pl->num < pr->num) { back = -1; } } } } break; case 1: { if(pl->sn) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->sn, (char const *)r)); } else { back = -1; } } break; default: { pr = (itadmin_lictype *)r; if(pl->sn) { if(pr->sn) { back = itadmin_comp_correct(dk3str_c8_cmp(pl->sn, pr->sn)); } else { back = 1; } } else { if(pr->sn) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } return back; } int itadmin_comp_license(void *l, void *r, int cr) { itadmin_license *pl; itadmin_license *pr; unsigned long *ulp; int back = 0; if(l) { if(r) { pl = (itadmin_license *)l; pr = (itadmin_license *)r; ulp = (unsigned long *)r; switch(cr) { case 2: { back = itadmin_comp_swprod((void *)(pl->prod),(void *)(pr->prod),2); if(back == 0) { back = itadmin_comp_lictype((void *)(pl->ltype), (void *)(pr->ltype), 2); } if(back == 0) { back = itadmin_comp_user((void *)(pl->owner), (void *)(pr->owner), 2); } if(back == 0) { back = itadmin_comp_host((void *)(pl->host), (void *)(pr->host), 0); } if(back == 0) { back = itadmin_comp_license(l, r, 0); } } break; case 1: { if(pl->pk > (*ulp)) { back = 1; } else { if(pl->pk < (*ulp)) { back = -1; } } } break; default: { if(pl->pk > pr->pk) { back = 1; } else { if(pl->pk < pr->pk) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } return back; } int itadmin_comp_dhcp_ginw(void *l, void *r, int cr) { itadmin_dhcp_ginw *pl; itadmin_dhcp_ginw *pr; int back = 0; if(l) { if(r) { pl = (itadmin_dhcp_ginw *)l; switch(cr) { case 1: { if(pl->gr) { if((pl->gr)->sn) { back = dk3str_c8_cmp((pl->gr)->sn, (char const *)r); back = itadmin_comp_correct(back); } else back = -1; } else back = -1; } break; default: { pr = (itadmin_dhcp_ginw *)r; if(pl->gr) { if(pr->gr) { if((pl->gr)->sn) { if((pr->gr)->sn) { back = dk3str_c8_cmp((pl->gr)->sn, (pr->gr)->sn); back = itadmin_comp_correct(back); } else back = 1; } else { if((pr->gr)->sn) back = -1; } } else back = 1; } else { if(pr->gr) back = -1; } } break; } } else back = 1; } else { if(r) back = -1; } return back; } int itadmin_comp_date(itadmin_date *l, itadmin_date *r) { int back = 0; if(l) { if(r) { if(l->y > r->y) back = 1; else { if(l->y < r->y) back = -1; } if(back == 0) { if(l->m > r->m) back = 1; else { if(l->m < r->m) back = -1; } } if(back == 0) { if(l->d > r->d) back = 1; else { if(l->d < r->d) back = -1; } } } else back = 1; } else { if(r) back = -1; } return back; } int itadmin_comp_dhcp_option(void *l, void *r, int cr) { itadmin_dhcp_option *pl; itadmin_dhcp_option *pr; int back = 0; if(l) { if(r) { pl = (itadmin_dhcp_option *)l; pr = (itadmin_dhcp_option *)r; if(pl->pk > pr->pk) { back = 1; } else { if(pl->pk < pr->pk) { back = -1; } } if(back == 0) { if(pl->k) { if(pr->k) { back = dk3str_c8_cmp(pl->k, pr->k); back = itadmin_comp_correct(back); } else back = 1; } else { if(pr->k) back = -1; } } } else back = 1; } else { if(r) back = -1; } return back; } int itadmin_comp_string(void *l, void *r, int cr) { int back = 0; if(l) { if(r) { switch(cr) { case 1: { back = itadmin_comp_correct( dk3str_c8_casecmp((char const *)l, (char const *)r) ); } break; default: { back = itadmin_comp_correct( dk3str_c8_cmp((char const *)l, (char const *)r) ); } break; } } else back = 1; } else { if(r) back = -1; } return back; }