int cmp_dv_box (caddr_t dv, caddr_t box) { NUMERIC_VAR (dn1); NUMERIC_VAR (dn2); dtp_t dtp1 = dv_ext_to_num ((db_buf_t) dv, (caddr_t) & dn1); dtp_t dtp2; dtp_t res_dtp; NUM_TO_MEM (dn2, dtp2, box); if (dtp1 == DV_DB_NULL || dtp2 == DV_DB_NULL) GPF_T1 ("not supposed to be null in comparison"); if (n_coerce ((caddr_t) & dn1, (caddr_t) & dn2, dtp1, dtp2, &res_dtp)) { switch (res_dtp) { case DV_LONG_INT: return (NUM_COMPARE (*(boxint *) &dn1, *(boxint *) &dn2)); case DV_SINGLE_FLOAT: return cmp_double (*(float *) &dn1, *(float *) &dn2, FLT_EPSILON); case DV_DOUBLE_FLOAT: return cmp_double (*(double *) &dn1, *(double *) &dn2, DBL_EPSILON); case DV_NUMERIC: return (numeric_compare_dvc ((numeric_t) &dn1, (numeric_t) &dn2)); } } else sqlr_new_error ("22003", "SR082", "Non numeric comparison"); return 0; }
static int cmp(const void* ap, const void* bp) { /* you need to modify this function to compare doubles. */ double a; double b; a = * (const double*) ap; b = * (const double*) bp; int result = cmp_double(a,b); return cmp_double(a,b); }
bool pareto_dominate_2d(double x0, double y0, double x1, double y1){ int xr = cmp_double(&x0, &x1); int yr = cmp_double(&y0, &y1); if (xr == 0 && yr < 0) return true; else if (xr < 0 && yr <= 0) return true; else return false; }
/* Update special host's item - "status" */ static void update_key_status(zbx_uint64_t hostid, int host_status, time_t now) { AGENT_RESULT agent; DB_ITEM item; DB_RESULT result; DB_ROW row; int update; zabbix_log(LOG_LEVEL_DEBUG, "In update_key_status(" ZBX_FS_UI64 ",%d)", hostid, host_status); result = DBselect("select %s where h.hostid=i.hostid and i.status=%d" " and h.proxy_hostid=0 and i.key_='%s' and h.hostid=" ZBX_FS_UI64, ZBX_SQL_ITEM_SELECT, ITEM_STATUS_ACTIVE, SERVER_STATUS_KEY, hostid); while (NULL != (row = DBfetch(result))) { DBget_item_from_db(&item, row); /* Do not process new value for status, if previous status is the same */ update = (item.lastvalue_null == 1); update = update || (item.value_type == ITEM_VALUE_TYPE_FLOAT && cmp_double(item.lastvalue_dbl, (double)host_status) == 1); update = update || (item.value_type == ITEM_VALUE_TYPE_UINT64 && item.lastvalue_uint64 != host_status); if (update) { init_result(&agent); SET_UI64_RESULT(&agent, host_status); switch (zbx_process) { case ZBX_PROCESS_SERVER: process_new_value(&item, &agent, now); break; case ZBX_PROCESS_PROXY: proxy_process_new_value(&item, &agent, now); break; } free_result(&agent); } } DBfree_result(result); }
static bool odict_value_compare(const struct odict_entry *e1, const struct odict_entry *e2) { if (!e1 || !e2) return false; if (e1->type != e2->type) { re_printf("type mismatch\n"); return false; } switch (e1->type) { case ODICT_OBJECT: return odict_compare(e1->u.odict, e2->u.odict); case ODICT_ARRAY: return odict_compare(e1->u.odict, e2->u.odict); case ODICT_INT: if (e1->u.integer != e2->u.integer) { re_printf("integer diff: %lld != %lld\n", e1->u.integer, e2->u.integer); } else return true; break; case ODICT_DOUBLE: if (cmp_double(e1->u.dbl, e2->u.dbl)) { return true; } else { re_printf("double differs: %f != %f\n", e1->u.dbl, e2->u.dbl); } break; case ODICT_STRING: if ( 0 == str_cmp(e1->u.str, e2->u.str)) return true; else { re_printf("string differs\n"); } break; case ODICT_BOOL: if (e1->u.boolean == e2->u.boolean) return true; else { re_printf("bool differs\n"); } break; case ODICT_NULL: /* no check */ return true; default: return false; } return false; }
static void cmp_eblocks(t_enxframe *fr1, t_enxframe *fr2, real ftol, real abstol) { int i, j, k; char buf[64], bs[22]; cmp_int(stdout, "nblock", -1, fr1->nblock, fr2->nblock); if ((fr1->nblock == fr2->nblock) && (fr1->nblock > 0)) { for (j = 0; (j < fr1->nblock); j++) { t_enxblock *b1, *b2; /* convenience vars */ b1 = &(fr1->block[j]); b2 = &(fr2->block[j]); sprintf(buf, "step %s: block[%d]", gmx_step_str(fr1->step, bs), j); cmp_int(stdout, buf, -1, b1->nsub, b2->nsub); cmp_int(stdout, buf, -1, b1->id, b2->id); if ( (b1->nsub == b2->nsub) && (b1->id == b2->id) ) { for (i = 0; i < b1->nsub; i++) { t_enxsubblock *s1, *s2; s1 = &(b1->sub[i]); s2 = &(b2->sub[i]); cmp_int(stdout, buf, -1, (int)s1->type, (int)s2->type); cmp_int64(stdout, buf, s1->nr, s2->nr); if ((s1->type == s2->type) && (s1->nr == s2->nr)) { switch (s1->type) { case xdr_datatype_float: for (k = 0; k < s1->nr; k++) { cmp_float(stdout, buf, i, s1->fval[k], s2->fval[k], ftol, abstol); } break; case xdr_datatype_double: for (k = 0; k < s1->nr; k++) { cmp_double(stdout, buf, i, s1->dval[k], s2->dval[k], ftol, abstol); } break; case xdr_datatype_int: for (k = 0; k < s1->nr; k++) { cmp_int(stdout, buf, i, s1->ival[k], s2->ival[k]); } break; case xdr_datatype_int64: for (k = 0; k < s1->nr; k++) { cmp_int64(stdout, buf, s1->lval[k], s2->lval[k]); } break; case xdr_datatype_char: for (k = 0; k < s1->nr; k++) { cmp_uc(stdout, buf, i, s1->cval[k], s2->cval[k]); } break; case xdr_datatype_string: for (k = 0; k < s1->nr; k++) { cmp_str(stdout, buf, i, s1->sval[k], s2->sval[k]); } break; default: gmx_incons("Unknown data type!!"); } } } } } } }
int cmp_l(const void* x, const void* y, void* l) { return cmp_double((double*)l+*(const size_t*)x, (double*)l+*(const size_t*)y); }
static void cmp_inputrec(FILE *fp,t_inputrec *ir1,t_inputrec *ir2,real ftol, real abstol) { int i; fprintf(fp,"comparing inputrec\n"); /* gcc 2.96 doesnt like these defines at all, but issues a huge list * of warnings. Maybe it will change in future versions, but for the * moment I've spelled them out instead. /EL 000820 * #define CIB(s) cmp_int(fp,"inputrec->"#s,0,ir1->##s,ir2->##s) * #define CII(s) cmp_int(fp,"inputrec->"#s,0,ir1->##s,ir2->##s) * #define CIR(s) cmp_real(fp,"inputrec->"#s,0,ir1->##s,ir2->##s,ftol) */ cmp_int(fp,"inputrec->eI",-1,ir1->eI,ir2->eI); cmp_gmx_large_int(fp,"inputrec->nsteps",ir1->nsteps,ir2->nsteps); cmp_gmx_large_int(fp,"inputrec->init_step",ir1->init_step,ir2->init_step); cmp_int(fp,"inputrec->simulation_part",-1,ir1->simulation_part,ir2->simulation_part); cmp_int(fp,"inputrec->ePBC",-1,ir1->ePBC,ir2->ePBC); cmp_int(fp,"inputrec->bPeriodicMols",-1,ir1->bPeriodicMols,ir2->bPeriodicMols); cmp_int(fp,"inputrec->ns_type",-1,ir1->ns_type,ir2->ns_type); cmp_int(fp,"inputrec->nstlist",-1,ir1->nstlist,ir2->nstlist); cmp_int(fp,"inputrec->ndelta",-1,ir1->ndelta,ir2->ndelta); cmp_int(fp,"inputrec->nstcomm",-1,ir1->nstcomm,ir2->nstcomm); cmp_int(fp,"inputrec->comm_mode",-1,ir1->comm_mode,ir2->comm_mode); cmp_int(fp,"inputrec->nstcheckpoint",-1,ir1->nstcheckpoint,ir2->nstcheckpoint); cmp_int(fp,"inputrec->nstlog",-1,ir1->nstlog,ir2->nstlog); cmp_int(fp,"inputrec->nstxout",-1,ir1->nstxout,ir2->nstxout); cmp_int(fp,"inputrec->nstvout",-1,ir1->nstvout,ir2->nstvout); cmp_int(fp,"inputrec->nstfout",-1,ir1->nstfout,ir2->nstfout); cmp_int(fp,"inputrec->nstcalcenergy",-1,ir1->nstcalcenergy,ir2->nstcalcenergy); cmp_int(fp,"inputrec->nstenergy",-1,ir1->nstenergy,ir2->nstenergy); cmp_int(fp,"inputrec->nstxtcout",-1,ir1->nstxtcout,ir2->nstxtcout); cmp_double(fp,"inputrec->init_t",-1,ir1->init_t,ir2->init_t,ftol,abstol); cmp_double(fp,"inputrec->delta_t",-1,ir1->delta_t,ir2->delta_t,ftol,abstol); cmp_real(fp,"inputrec->xtcprec",-1,ir1->xtcprec,ir2->xtcprec,ftol,abstol); cmp_int(fp,"inputrec->nkx",-1,ir1->nkx,ir2->nkx); cmp_int(fp,"inputrec->nky",-1,ir1->nky,ir2->nky); cmp_int(fp,"inputrec->nkz",-1,ir1->nkz,ir2->nkz); cmp_int(fp,"inputrec->pme_order",-1,ir1->pme_order,ir2->pme_order); cmp_real(fp,"inputrec->ewald_rtol",-1,ir1->ewald_rtol,ir2->ewald_rtol,ftol,abstol); cmp_int(fp,"inputrec->ewald_geometry",-1,ir1->ewald_geometry,ir2->ewald_geometry); cmp_real(fp,"inputrec->epsilon_surface",-1,ir1->epsilon_surface,ir2->epsilon_surface,ftol,abstol); cmp_int(fp,"inputrec->bOptFFT",-1,ir1->bOptFFT,ir2->bOptFFT); cmp_int(fp,"inputrec->bContinuation",-1,ir1->bContinuation,ir2->bContinuation); cmp_int(fp,"inputrec->bShakeSOR",-1,ir1->bShakeSOR,ir2->bShakeSOR); cmp_int(fp,"inputrec->etc",-1,ir1->etc,ir2->etc); cmp_int(fp,"inputrec->epc",-1,ir1->epc,ir2->epc); cmp_int(fp,"inputrec->epct",-1,ir1->epct,ir2->epct); cmp_real(fp,"inputrec->tau_p",-1,ir1->tau_p,ir2->tau_p,ftol,abstol); cmp_rvec(fp,"inputrec->ref_p(x)",-1,ir1->ref_p[XX],ir2->ref_p[XX],ftol,abstol); cmp_rvec(fp,"inputrec->ref_p(y)",-1,ir1->ref_p[YY],ir2->ref_p[YY],ftol,abstol); cmp_rvec(fp,"inputrec->ref_p(z)",-1,ir1->ref_p[ZZ],ir2->ref_p[ZZ],ftol,abstol); cmp_rvec(fp,"inputrec->compress(x)",-1,ir1->compress[XX],ir2->compress[XX],ftol,abstol); cmp_rvec(fp,"inputrec->compress(y)",-1,ir1->compress[YY],ir2->compress[YY],ftol,abstol); cmp_rvec(fp,"inputrec->compress(z)",-1,ir1->compress[ZZ],ir2->compress[ZZ],ftol,abstol); cmp_int(fp,"refcoord_scaling",-1,ir1->refcoord_scaling,ir2->refcoord_scaling); cmp_rvec(fp,"inputrec->posres_com",-1,ir1->posres_com,ir2->posres_com,ftol,abstol); cmp_rvec(fp,"inputrec->posres_comB",-1,ir1->posres_comB,ir2->posres_comB,ftol,abstol); cmp_int(fp,"inputrec->andersen_seed",-1,ir1->andersen_seed,ir2->andersen_seed); cmp_real(fp,"inputrec->rlist",-1,ir1->rlist,ir2->rlist,ftol,abstol); cmp_real(fp,"inputrec->rlistlong",-1,ir1->rlistlong,ir2->rlistlong,ftol,abstol); cmp_real(fp,"inputrec->rtpi",-1,ir1->rtpi,ir2->rtpi,ftol,abstol); cmp_int(fp,"inputrec->coulombtype",-1,ir1->coulombtype,ir2->coulombtype); cmp_real(fp,"inputrec->rcoulomb_switch",-1,ir1->rcoulomb_switch,ir2->rcoulomb_switch,ftol,abstol); cmp_real(fp,"inputrec->rcoulomb",-1,ir1->rcoulomb,ir2->rcoulomb,ftol,abstol); cmp_int(fp,"inputrec->vdwtype",-1,ir1->vdwtype,ir2->vdwtype); cmp_real(fp,"inputrec->rvdw_switch",-1,ir1->rvdw_switch,ir2->rvdw_switch,ftol,abstol); cmp_real(fp,"inputrec->rvdw",-1,ir1->rvdw,ir2->rvdw,ftol,abstol); cmp_real(fp,"inputrec->epsilon_r",-1,ir1->epsilon_r,ir2->epsilon_r,ftol,abstol); cmp_real(fp,"inputrec->epsilon_rf",-1,ir1->epsilon_rf,ir2->epsilon_rf,ftol,abstol); cmp_real(fp,"inputrec->tabext",-1,ir1->tabext,ir2->tabext,ftol,abstol); cmp_int(fp,"inputrec->implicit_solvent",-1,ir1->implicit_solvent,ir2->implicit_solvent); cmp_int(fp,"inputrec->gb_algorithm",-1,ir1->gb_algorithm,ir2->gb_algorithm); cmp_int(fp,"inputrec->nstgbradii",-1,ir1->nstgbradii,ir2->nstgbradii); cmp_real(fp,"inputrec->rgbradii",-1,ir1->rgbradii,ir2->rgbradii,ftol,abstol); cmp_real(fp,"inputrec->gb_saltconc",-1,ir1->gb_saltconc,ir2->gb_saltconc,ftol,abstol); cmp_real(fp,"inputrec->gb_epsilon_solvent",-1,ir1->gb_epsilon_solvent,ir2->gb_epsilon_solvent,ftol,abstol); cmp_real(fp,"inputrec->gb_obc_alpha",-1,ir1->gb_obc_alpha,ir2->gb_obc_alpha,ftol,abstol); cmp_real(fp,"inputrec->gb_obc_beta",-1,ir1->gb_obc_beta,ir2->gb_obc_beta,ftol,abstol); cmp_real(fp,"inputrec->gb_obc_gamma",-1,ir1->gb_obc_gamma,ir2->gb_obc_gamma,ftol,abstol); cmp_real(fp,"inputrec->gb_dielectric_offset",-1,ir1->gb_dielectric_offset,ir2->gb_dielectric_offset,ftol,abstol); cmp_int(fp,"inputrec->sa_algorithm",-1,ir1->sa_algorithm,ir2->sa_algorithm); cmp_real(fp,"inputrec->sa_surface_tension",-1,ir1->sa_surface_tension,ir2->sa_surface_tension,ftol,abstol); cmp_int(fp,"inputrec->eDispCorr",-1,ir1->eDispCorr,ir2->eDispCorr); cmp_real(fp,"inputrec->shake_tol",-1,ir1->shake_tol,ir2->shake_tol,ftol,abstol); cmp_int(fp,"inputrec->efep",-1,ir1->efep,ir2->efep); cmp_double(fp,"inputrec->init_lambda",-1,ir1->init_lambda,ir2->init_lambda,ftol,abstol); cmp_double(fp,"inputrec->delta_lambda",-1,ir1->delta_lambda,ir2->delta_lambda,ftol,abstol); cmp_int(fp,"inputrec->n_foreign_lambda",-1,ir1->n_flambda,ir2->n_flambda); for(i=0; i<min(ir1->n_flambda,ir2->n_flambda); i++) { cmp_double(fp,"inputrec->foreign_lambda",-1,ir1->flambda[i],ir2->flambda[i],ftol,abstol); } cmp_real(fp,"inputrec->sc_alpha",-1,ir1->sc_alpha,ir2->sc_alpha,ftol,abstol); cmp_int(fp,"inputrec->sc_power",-1,ir1->sc_power,ir2->sc_power); cmp_real(fp,"inputrec->sc_sigma",-1,ir1->sc_sigma,ir2->sc_sigma,ftol,abstol); cmp_real(fp,"inputrec->sc_sigma_min",-1,ir1->sc_sigma_min,ir2->sc_sigma_min,ftol,abstol); cmp_int(fp,"inputrec->nstdhdl",-1,ir1->nstdhdl,ir2->nstdhdl); cmp_int(fp,"inputrec->separate_dhdl_file",-1,ir1->separate_dhdl_file,ir2->separate_dhdl_file); cmp_int(fp,"inputrec->dhdl_derivatives",-1,ir1->dhdl_derivatives,ir2->dhdl_derivatives); cmp_int(fp,"inputrec->dh_hist_size",-1,ir1->dh_hist_size,ir2->dh_hist_size); cmp_double(fp,"inputrec->dh_hist_spacing",-1,ir1->dh_hist_spacing,ir2->dh_hist_spacing,ftol,abstol); cmp_int(fp,"inputrec->nwall",-1,ir1->nwall,ir2->nwall); cmp_int(fp,"inputrec->wall_type",-1,ir1->wall_type,ir2->wall_type); cmp_int(fp,"inputrec->wall_atomtype[0]",-1,ir1->wall_atomtype[0],ir2->wall_atomtype[0]); cmp_int(fp,"inputrec->wall_atomtype[1]",-1,ir1->wall_atomtype[1],ir2->wall_atomtype[1]); cmp_real(fp,"inputrec->wall_density[0]",-1,ir1->wall_density[0],ir2->wall_density[0],ftol,abstol); cmp_real(fp,"inputrec->wall_density[1]",-1,ir1->wall_density[1],ir2->wall_density[1],ftol,abstol); cmp_real(fp,"inputrec->wall_ewald_zfac",-1,ir1->wall_ewald_zfac,ir2->wall_ewald_zfac,ftol,abstol); cmp_int(fp,"inputrec->ePull",-1,ir1->ePull,ir2->ePull); if (ir1->ePull == ir2->ePull && ir1->ePull != epullNO) cmp_pull(fp,ir1->pull,ir2->pull,ftol,abstol); cmp_int(fp,"inputrec->eDisre",-1,ir1->eDisre,ir2->eDisre); cmp_real(fp,"inputrec->dr_fc",-1,ir1->dr_fc,ir2->dr_fc,ftol,abstol); cmp_int(fp,"inputrec->eDisreWeighting",-1,ir1->eDisreWeighting,ir2->eDisreWeighting); cmp_int(fp,"inputrec->bDisreMixed",-1,ir1->bDisreMixed,ir2->bDisreMixed); cmp_int(fp,"inputrec->nstdisreout",-1,ir1->nstdisreout,ir2->nstdisreout); cmp_real(fp,"inputrec->dr_tau",-1,ir1->dr_tau,ir2->dr_tau,ftol,abstol); cmp_real(fp,"inputrec->orires_fc",-1,ir1->orires_fc,ir2->orires_fc,ftol,abstol); cmp_real(fp,"inputrec->orires_tau",-1,ir1->orires_tau,ir2->orires_tau,ftol,abstol); cmp_int(fp,"inputrec->nstorireout",-1,ir1->nstorireout,ir2->nstorireout); cmp_real(fp,"inputrec->dihre_fc",-1,ir1->dihre_fc,ir2->dihre_fc,ftol,abstol); cmp_real(fp,"inputrec->em_stepsize",-1,ir1->em_stepsize,ir2->em_stepsize,ftol,abstol); cmp_real(fp,"inputrec->em_tol",-1,ir1->em_tol,ir2->em_tol,ftol,abstol); cmp_int(fp,"inputrec->niter",-1,ir1->niter,ir2->niter); cmp_real(fp,"inputrec->fc_stepsize",-1,ir1->fc_stepsize,ir2->fc_stepsize,ftol,abstol); cmp_int(fp,"inputrec->nstcgsteep",-1,ir1->nstcgsteep,ir2->nstcgsteep); cmp_int(fp,"inputrec->nbfgscorr",0,ir1->nbfgscorr,ir2->nbfgscorr); cmp_int(fp,"inputrec->eConstrAlg",-1,ir1->eConstrAlg,ir2->eConstrAlg); cmp_int(fp,"inputrec->nProjOrder",-1,ir1->nProjOrder,ir2->nProjOrder); cmp_real(fp,"inputrec->LincsWarnAngle",-1,ir1->LincsWarnAngle,ir2->LincsWarnAngle,ftol,abstol); cmp_int(fp,"inputrec->nLincsIter",-1,ir1->nLincsIter,ir2->nLincsIter); cmp_real(fp,"inputrec->bd_fric",-1,ir1->bd_fric,ir2->bd_fric,ftol,abstol); cmp_int(fp,"inputrec->ld_seed",-1,ir1->ld_seed,ir2->ld_seed); cmp_real(fp,"inputrec->cos_accel",-1,ir1->cos_accel,ir2->cos_accel,ftol,abstol); cmp_rvec(fp,"inputrec->deform(a)",-1,ir1->deform[XX],ir2->deform[XX],ftol,abstol); cmp_rvec(fp,"inputrec->deform(b)",-1,ir1->deform[YY],ir2->deform[YY],ftol,abstol); cmp_rvec(fp,"inputrec->deform(c)",-1,ir1->deform[ZZ],ir2->deform[ZZ],ftol,abstol); cmp_int(fp,"ir->adress->type" ,-1,ir1->adress->type,ir2->adress->type); cmp_real(fp,"ir->adress->const_wf" ,-1,ir1->adress->const_wf,ir2->adress->const_wf,ftol,abstol); cmp_real(fp,"ir->adress->ex_width" ,-1,ir1->adress->ex_width,ir2->adress->ex_width,ftol,abstol); cmp_real(fp,"ir->adress->hy_width" ,-1,ir1->adress->hy_width,ir2->adress->hy_width,ftol,abstol); cmp_int(fp,"ir->adress->icor" ,-1,ir1->adress->icor,ir2->adress->icor); cmp_int(fp,"ir->adress->site" ,-1,ir1->adress->site,ir2->adress->site); cmp_rvec(fp,"ir->adress->refs" ,-1,ir1->adress->refs,ir2->adress->refs,ftol,abstol); cmp_rvec(fp,"ir->adress->refs_2" ,-1,ir1->adress->refs_2,ir2->adress->refs_2,ftol,abstol); cmp_real(fp,"ir->adress->ex_forcecap", -1,ir1->adress->ex_forcecap,ir2->adress->ex_forcecap,ftol,abstol); cmp_int(fp,"inputrec->userint1",-1,ir1->userint1,ir2->userint1); cmp_int(fp,"inputrec->userint2",-1,ir1->userint2,ir2->userint2); cmp_int(fp,"inputrec->userint3",-1,ir1->userint3,ir2->userint3); cmp_int(fp,"inputrec->userint4",-1,ir1->userint4,ir2->userint4); cmp_real(fp,"inputrec->userreal1",-1,ir1->userreal1,ir2->userreal1,ftol,abstol); cmp_real(fp,"inputrec->userreal2",-1,ir1->userreal2,ir2->userreal2,ftol,abstol); cmp_real(fp,"inputrec->userreal3",-1,ir1->userreal3,ir2->userreal3,ftol,abstol); cmp_real(fp,"inputrec->userreal4",-1,ir1->userreal4,ir2->userreal4,ftol,abstol); cmp_grpopts(fp,&(ir1->opts),&(ir2->opts),ftol,abstol); cmp_cosines(fp,"ex",ir1->ex,ir2->ex,ftol,abstol); cmp_cosines(fp,"et",ir1->et,ir2->et,ftol,abstol); }
int cmp_boxes (ccaddr_t box1, ccaddr_t box2, collation_t *collation1, collation_t *collation2) #endif { NUMERIC_VAR (dn1); NUMERIC_VAR (dn2); dtp_t dtp1, dtp2, res_dtp; if ((IS_BOX_POINTER (box1) && DV_RDF == box_tag (box1)) || (IS_BOX_POINTER (box2) && DV_RDF == box_tag (box2))) return rdf_box_compare (box1, box2); NUM_TO_MEM (dn1, dtp1, box1); NUM_TO_MEM (dn2, dtp2, box2); if (dtp1 == DV_DB_NULL || dtp2 == DV_DB_NULL) return DVC_UNKNOWN; if (n_coerce ((caddr_t) & dn1, (caddr_t) & dn2, dtp1, dtp2, &res_dtp)) { switch (res_dtp) { case DV_LONG_INT: return (NUM_COMPARE (*(boxint *) &dn1, *(boxint *) &dn2)); case DV_SINGLE_FLOAT: return cmp_double (*(float *) &dn1, *(float *) &dn2, FLT_EPSILON); case DV_DOUBLE_FLOAT: return cmp_double (*(double *) &dn1, *(double *) &dn2, DBL_EPSILON); case DV_NUMERIC: return (numeric_compare_dvc ((numeric_t) &dn1, (numeric_t) &dn2)); } } else { int inx = 0, n1, n2; if (!IS_BOX_POINTER (box1) || !IS_BOX_POINTER (box2)) return DVC_LESS; if (DV_COMPOSITE == dtp1 && DV_COMPOSITE == dtp2) return (dv_composite_cmp ((db_buf_t) box1, (db_buf_t) box2, collation1)); if (DV_IRI_ID == dtp1 && DV_IRI_ID == dtp2) return NUM_COMPARE (unbox_iri_id (box1), unbox_iri_id (box2)); n1 = box_length (box1); n2 = box_length (box2); if ((dtp1 == DV_DATETIME && dtp2 == DV_BIN) || (dtp2 == DV_DATETIME && dtp1 == DV_BIN)) dtp1 = dtp2 = DV_DATETIME; switch (dtp1) { case DV_STRING: n1--; break; case DV_UNAME: n1--; dtp1 = DV_STRING; collation1 = collation2 = NULL; break; case DV_LONG_WIDE: dtp1 = DV_WIDE; case DV_WIDE: n1 = n1 / sizeof (wchar_t) - 1; break; case DV_LONG_BIN: dtp1 = DV_BIN; collation1 = collation2 = NULL; break; case DV_DATETIME: dtp1 = DV_BIN; n1 = DT_COMPARE_LENGTH; collation1 = collation2 = NULL; break; default: collation1 = collation2 = NULL; } switch (dtp2) { case DV_STRING: n2--; if (collation1) { if (collation2 && collation1 != collation2) collation1 = default_collation; } else collation1 = collation2; break; case DV_UNAME: n2--; dtp2 = DV_STRING; collation1 = NULL; break; case DV_LONG_BIN: dtp2 = DV_BIN; collation1 = NULL; break; case DV_DATETIME: dtp2 = DV_BIN; n2 = DT_COMPARE_LENGTH; collation1 = NULL; break; case DV_LONG_WIDE: dtp2 = DV_WIDE; case DV_WIDE: n2 = n2 / sizeof (wchar_t) - 1; break; default: collation1 = NULL; } if (IS_WIDE_STRING_DTP (dtp1) && IS_STRING_DTP (dtp2)) { if (box_flags (box2) & (BF_IRI | BF_UTF8)) return compare_wide_to_utf8_with_collation ((wchar_t *) box1, n1, (utf8char *) box2, n2, NULL); else return compare_wide_to_latin1 ((wchar_t *) box1, n1, (unsigned char *) box2, n2); } if (IS_STRING_DTP (dtp1) && IS_WIDE_STRING_DTP (dtp2)) { int res; if (box_flags (box2) & (BF_IRI | BF_UTF8)) res = compare_wide_to_utf8_with_collation ((wchar_t *)box2, n2, (utf8char *) box1, n1, NULL); else res = compare_wide_to_latin1 ((wchar_t *)box2, n2, (unsigned char *) box1, n1); return (res == DVC_LESS ? DVC_GREATER : (res == DVC_GREATER ? DVC_LESS : res)); } else if (dtp1 != dtp2) return DVC_LESS; if (dtp1 == DV_WIDE) { while (1) { if (inx == n1) /* box1 in end? */ { if (inx == n2) return DVC_MATCH; /* box2 of same length */ else return DVC_LESS; /* otherwise box1 is shorter than box2 */ } if (inx == n2) return DVC_GREATER; /* box2 in end (but not box1) */ if ((((wchar_t *) box1)[inx]) < (((wchar_t *) box2)[inx])) return DVC_LESS; if ((((wchar_t *) box1)[inx]) > (((wchar_t *) box2)[inx])) return DVC_GREATER; inx++; } } if (collation1 && !collation1->co_is_wide) { while (1) { if (inx == n1) /* box1 in end? */ { if (inx == n2) return DVC_MATCH; /* box2 of same length */ else return DVC_LESS; /* otherwise box1 is shorter than box2 */ } if (inx == n2) return DVC_GREATER; /* box2 in end (but not box1) */ if (collation1->co_table[(dtp_t) box1[inx]] < collation1->co_table[(dtp_t) box2[inx]]) return DVC_LESS; if (collation1->co_table[(dtp_t) box1[inx]] > collation1->co_table[(dtp_t) box2[inx]]) return DVC_GREATER; inx++; } } else { while (1) { if (inx == n1) /* box1 in end? */ { if (inx == n2) return DVC_MATCH; /* box2 of same length */ else return DVC_LESS; /* otherwise box1 is shorter than box2 */ } if (inx == n2) return DVC_GREATER; /* box2 in end (but not box1) */ if (((dtp_t) box1[inx]) < ((dtp_t) box2[inx])) return DVC_LESS; if (((dtp_t) box1[inx]) > ((dtp_t) box2[inx])) return DVC_GREATER; inx++; } } } return DVC_LESS; /* default, should not happen */ }