bool ARRAY::AddValue(PGLOBAL g, PVAL vp) { if (Type != vp->GetType()) { sprintf(g->Message, MSG(ADD_BAD_TYPE), GetTypeName(vp->GetType()), GetTypeName(Type)); return TRUE; } // endif Type if (trace) htrc(" adding (%d) from vp=%p\n", Nval, vp); Vblp->SetValue(vp, Nval++); return FALSE; } // end of AddValue
bool ARRAY::FilTest(PGLOBAL g, PVAL valp, OPVAL opc, int opm) { int i; PVAL vp; BYTE bt = OpBmp(g, opc); int top = Nval - 1; if (top < 0) // Array is empty // Return TRUE for ALL because it means that there are no item that // does not verify the condition, which is true indeed. // Return FALSE for ANY because TRUE means that there is at least // one item that verifies the condition, which is false. return opm == 2; if (valp) { if (Type != valp->GetType()) { Value->SetValue_pval(valp); vp = Value; } else vp = valp; } else if (opc != OP_EXIST) { sprintf(g->Message, MSG(MISSING_ARG), opc); longjmp(g->jumper[g->jump_level], TYPE_ARRAY); } else // OP_EXIST return Nval > 0; if (opc == OP_IN || (opc == OP_EQ && opm == 1)) return Find(vp); else if (opc == OP_NE && opm == 2) return !Find(vp); else if (opc == OP_EQ && opm == 2) return (Ndif == 1) ? !(Vcompare(vp, 0) & bt) : FALSE; else if (opc == OP_NE && opm == 1) return (Ndif == 1) ? !(Vcompare(vp, 0) & bt) : TRUE; if (Type != TYPE_LIST) { if (opc == OP_GT || opc == OP_GE) return !(Vcompare(vp, (opm == 1) ? 0 : top) & bt); else return !(Vcompare(vp, (opm == 2) ? 0 : top) & bt); } // endif Type // Case of TYPE_LIST if (opm == 2) { for (i = 0; i < Nval; i++) if (Vcompare(vp, i) & bt) return FALSE; return TRUE; } else { // opm == 1 for (i = 0; i < Nval; i++) if (!(Vcompare(vp, i) & bt)) return TRUE; return FALSE; } // endif opm } // end of FilTest
bool ARRAY::Find(PVAL valp) { register int n; PVAL vp; if (Type != valp->GetType()) { Value->SetValue_pval(valp); vp = Value; } else vp = valp; Inf = Bot, Sup = Top; while (Sup - Inf > 1) { X = (Inf + Sup) >> 1; n = Vblp->CompVal(vp, X); if (n < 0) Sup = X; else if (n > 0) Inf = X; else return TRUE; } // endwhile return FALSE; } // end of Find
bool INICOL::SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) { if (!(To_Val = value)) { sprintf(g->Message, MSG(VALUE_ERROR), Name); return true; } else if (Buf_Type == value->GetType()) { // Values are of the (good) column type if (Buf_Type == TYPE_DATE) { // If any of the date values is formatted // output format must be set for the receiving table if (GetDomain() || ((DTVAL *)value)->IsFormatted()) goto newval; // This will make a new value; } else if (Buf_Type == TYPE_DOUBLE || Buf_Type == TYPE_DECIM) // Float values must be written with the correct (column) precision // Note: maybe this should be forced by ShowValue instead of this ? value->SetPrec(GetScale()); Value = value; // Directly access the external value } else { // Values are not of the (good) column type if (check) { sprintf(g->Message, MSG(TYPE_VALUE_ERR), Name, GetTypeName(Buf_Type), GetTypeName(value->GetType())); return true; } // endif check newval: if (InitValue(g)) // Allocate the matching value block return true; } // endif's Value, Buf_Type // Allocate the internal value buffer AllocBuf(g); // Because Colblk's have been made from a copy of the original TDB in // case of Update, we must reset them to point to the original one. if (To_Tdb->GetOrig()) To_Tdb = (PTDB)To_Tdb->GetOrig(); // Set the Column Status = (ok) ? BUF_EMPTY : BUF_NO; return false; } // end of SetBuffer
void VALBLK::ChkTyp(PVAL v) { if (Check && (Type != v->GetType() || Unsigned != v->IsUnsigned())) { PGLOBAL& g = Global; strcpy(g->Message, MSG(VALTYPE_NOMATCH)); longjmp(g->jumper[g->jump_level], Type); } // endif Type } // end of ChkTyp