//pdn S4135 05.04.99 comment uninitialized Interface_Static::IVal("iges.convert.read");
#include <IGESData_ParamReader.ixx>
#include <IGESData_IGESType.hxx>
#include <Interface_FileParameter.hxx>
#include <Interface_FileReaderData.hxx>
#include <Interface_Macros.hxx>
#include <Interface_Static.hxx>
#include <stdio.h>
#include <IGESData_Status.hxx>
 
// MGE 03/08/98
#include <MoniTool_Msg.hxx>

static Standard_Integer testconv = -1;  // cf parametre de session

//  ....              Gestion generale (etat, courant ...)              ....


//=======================================================================
//function : IGESData_ParamReader
//purpose  : 
//=======================================================================

IGESData_ParamReader::IGESData_ParamReader(const Handle(Interface_ParamList)& list,
                                           const Handle(Interface_Check)& ach,
                                           const Standard_Integer base,
                                           const Standard_Integer nbpar,
                                           const Standard_Integer num)
{
  Clear();
  theparams = list;  thecheck = ach;  thelast = Standard_True;
  thebase   = base;
  thenbpar  = (nbpar > 0 ? nbpar : list->Length());
  thenum    = 0;
  testconv  = -1;
}


//=======================================================================
//function : EntityNumber
//purpose  : 
//=======================================================================

Standard_Integer IGESData_ParamReader::EntityNumber () const
{
  return thenum;
}


//=======================================================================
//function : Clear
//purpose  : 
//=======================================================================

void IGESData_ParamReader::Clear ()
{
  thecurr = 1;
  thestage = IGESData_ReadOwn;
  pbrealint=pbrealform=0;
}


//=======================================================================
//function : CurrentNumber
//purpose  : 
//=======================================================================

Standard_Integer IGESData_ParamReader::CurrentNumber () const
{
  return thecurr;
}


//=======================================================================
//function : SetCurrentNumber
//purpose  : 
//=======================================================================

void IGESData_ParamReader::SetCurrentNumber (const Standard_Integer num)
{
  //if (num <= NbParams() + 1) thecurr = num;  // NbParams+1 : "fin d'objet"
  //else thecurr = 0;
  thecurr = num;
}


//=======================================================================
//function : Stage
//purpose  : 
//=======================================================================

IGESData_ReadStage IGESData_ParamReader::Stage () const
{
  return thestage;
}


//=======================================================================
//function : NextStage
//purpose  : 
//=======================================================================

void IGESData_ParamReader::NextStage ()
{
  if (thestage != IGESData_ReadEnd) thestage =
    (IGESData_ReadStage) (((long) thestage) + 1);
}


//=======================================================================
//function : EndAll
//purpose  : 
//=======================================================================

void IGESData_ParamReader::EndAll ()
{
  thestage = IGESData_ReadEnd;
}


//  ....                  Acces de base aux parametres                  ....


//=======================================================================
//function : NbParams
//purpose  : 
//=======================================================================

Standard_Integer IGESData_ParamReader::NbParams () const
{
  return (thenbpar - 1);
}


//=======================================================================
//function : ParamType
//purpose  : 
//=======================================================================

Interface_ParamType IGESData_ParamReader::ParamType
  (const Standard_Integer num) const
{
  return theparams->Value(num+thebase).ParamType();
}


//=======================================================================
//function : ParamValue
//purpose  : 
//=======================================================================

const Standard_CString IGESData_ParamReader::ParamValue
  (const Standard_Integer num) const
{
  return theparams->Value(num+thebase).CValue();
}


//=======================================================================
//function : IsParamDefined
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::IsParamDefined
  (const Standard_Integer num) const
{
  if (num >= thenbpar) return Standard_False;
  return (theparams->Value(num+thebase).ParamType() != Interface_ParamVoid);
}


//=======================================================================
//function : IsParamEntity
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::IsParamEntity
  (const Standard_Integer num) const
{
  return (ParamNumber(num) != 0);
}


//=======================================================================
//function : ParamNumber
//purpose  : 
//=======================================================================

Standard_Integer IGESData_ParamReader::ParamNumber
  (const Standard_Integer num) const
{
  return theparams->Value(num+thebase).EntityNumber();
}


//=======================================================================
//function : ParamEntity
//purpose  : 
//=======================================================================

Handle(IGESData_IGESEntity) IGESData_ParamReader::ParamEntity
       (const Handle(IGESData_IGESReaderData)& IR, const Standard_Integer num)
{
  Standard_Integer n = ParamNumber(num);
  if (n == 0) thecheck->AddFail("IGES ParamReader : ParamEntity, bad param");
  return GetCasted(IGESData_IGESEntity,IR->BoundEntity(n));
}


//  ....                    Assistance a la lecture                    ....

//  Les fonctions Read* offrent les services suivants :
//  Gestion des erreurs : le Check est alimente, par Fail ou Corrected selon
//  Si Fail, retour de fonction False (peut etre utile), sinon True
//  En outre, un Status est gere (de type enum DataState)
//    (peut etre interroge suite a appel Read* si retour True/False trop court)
//
//  Gestion du pointeur courant (sur option, nais elle est mise par defaut) :
//  Les parametres sont designes via un ParmCursor, qui peut etre fabrique par
//  les methodes ad hoc  Current et CurrentList, et qui peut demander a avancer
//  le pointeur courant une fois la lecture faite
//  En outre, pour un HArray1, on peut preciser index de depart


//=======================================================================
//function : Current
//purpose  : 
//=======================================================================

IGESData_ParamCursor IGESData_ParamReader::Current () const
{
  return IGESData_ParamCursor(thecurr);
}


//=======================================================================
//function : CurrentList
//purpose  : 
//=======================================================================

IGESData_ParamCursor IGESData_ParamReader::CurrentList
  (const Standard_Integer nb, const Standard_Integer size) const
{
  return IGESData_ParamCursor(thecurr,nb,size);
}


// PrepareRead for MoniTool


//=======================================================================
//function : PrepareRead
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::PrepareRead
  (const IGESData_ParamCursor& PC, const Standard_Boolean several,
   const Standard_Integer size)
{
  theindex  = PC.Start();
  themaxind = PC.Limit();
  thenbitem = PC.Count();
  theitemsz = PC.ItemSize();
  theoffset = PC.Offset();
  thetermsz = PC.TermSize();
  if (!several && thenbitem > 1) {
   // AddFail (mess," : List not allowed","");
    return Standard_False;
  }
  if (size > 1) {
    if (thetermsz % size != 0) {
      return Standard_False;
    }
  }
  if (theindex <= 0 || (themaxind-1) > NbParams()) {
    return Standard_False;
  }
  if (PC.Advance()) 
    SetCurrentNumber (themaxind);  //themaxind : prochain index
  thelast = Standard_True;
  return Standard_True;
}


//=======================================================================
//function : PrepareRead
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::PrepareRead
  (const IGESData_ParamCursor& PC, const Standard_CString mess,
   const Standard_Boolean several, const Standard_Integer size)
{
  theindex  = PC.Start();
  themaxind = PC.Limit();
  thenbitem = PC.Count();
  theitemsz = PC.ItemSize();
  theoffset = PC.Offset();
  thetermsz = PC.TermSize();
  if (!several && thenbitem > 1) {
    AddFail (mess," : List not allowed","");
    return Standard_False;
  }
  if (size > 1) {
    if (thetermsz % size != 0) {
      AddFail (mess," : term size mismatch","");
      return Standard_False;
    }
  }
  if (theindex <= 0 || (themaxind-1) > NbParams()) {
    if (thenbitem == 1) AddFail (mess," : Parameter number out of range","");
    //else AddFail (mess," : too many values to read" ,"");
    else AddWarning (mess," : too many values to read" ,"");
    return Standard_False;
  }
  if (PC.Advance()) SetCurrentNumber (themaxind);  //themaxind : prochain index
  thelast = Standard_True;
  return Standard_True;
}


//  theindex donne le debut de la lecture; tjrs cale sur debut d item
//  thenbterm donne debut a lire dans l item
//  Ainsi, l indice vrai est   theindex + thenbterm
//  thenbterm avance par +nb. Quand il a depasse thetermsz, item suivant
//  theindex est lui-meme limite (critere d arret) a themaxind


//=======================================================================
//function : FirstRead
//purpose  : 
//=======================================================================

Standard_Integer IGESData_ParamReader::FirstRead (const Standard_Integer nb)
{
  theindex += theoffset;   // On se cale d office sur le debut du terme a lire
  Standard_Integer res = theindex;
  thenbterm = nb;
  if (thenbterm >= thetermsz) {
    theindex += theitemsz;
    thenbterm = 0;
  }
  return res;
}


//=======================================================================
//function : NextRead
//purpose  : 
//=======================================================================

Standard_Integer IGESData_ParamReader::NextRead (const Standard_Integer nb)
{
  Standard_Integer res = theindex;
  if (theindex >= themaxind) res = 0;
  thenbterm += nb;    // Par Item : en lire thetermsz, puis item suivant
  if (thenbterm >= thetermsz) {
    theindex += theitemsz;
    thenbterm = 0;
  }
  return res;
}


//=======================================================================
//function : DefinedElseSkip
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::DefinedElseSkip ()
{
  if (thecurr > NbParams())    return Standard_False;   // Skip en butee
  if (IsParamDefined(thecurr)) return Standard_True;    // Defined
  SetCurrentNumber (thecurr+1);                         // Skip
  return Standard_False;
}


// ReadInteger for MoniTool

//=======================================================================
//function : ReadInteger
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadInteger (const IGESData_ParamCursor& PC,
						    Standard_Integer& val)
{
  if (!PrepareRead(PC,Standard_False)) return Standard_False;
  const Interface_FileParameter& FP = theparams->Value(theindex+thebase);
  if (FP.ParamType() != Interface_ParamInteger) {
    if (FP.ParamType() == Interface_ParamVoid){
      val = 0;
      return Standard_True;
    }    // DEFAULT
    return Standard_False;
  }
  val = atoi(FP.CValue());
  return Standard_True;
}


//=======================================================================
//function : ReadInteger
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadInteger
  (const IGESData_ParamCursor& PC, const Standard_CString mess,
   Standard_Integer& val)
{
  if (!PrepareRead(PC,mess,Standard_False)) return Standard_False;
  const Interface_FileParameter& FP = theparams->Value(theindex+thebase);
  if (FP.ParamType() != Interface_ParamInteger) {
    if (FP.ParamType() == Interface_ParamVoid)
      { val = 0; return Standard_True; }    // DEFAULT
    AddFail (mess," : not given as an Integer","");
    return Standard_False;
  }
  val = atoi(FP.CValue());
  return Standard_True;
}


// ReadBoolean for MoniTool

//=======================================================================
//function : ReadBoolean
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadBoolean
  (const IGESData_ParamCursor& PC, const MoniTool_Msg& amsg,
   Standard_Boolean& val, const Standard_Boolean exact)
{
  if (!PrepareRead(PC,Standard_False)) return Standard_False;
  const Interface_FileParameter& FP = theparams->Value(theindex+thebase);
  if (FP.ParamType() != Interface_ParamInteger) {
    if (FP.ParamType() == Interface_ParamVoid) {
      val = Standard_False;
      return Standard_True;
    }     // DEFAULT
    SendFail (amsg);
    return Standard_False;
  }
  
  //  Un Booleen, c est 0/1. Mais on peut tolerer d autres valeurs
  //  On peut toujours consulter LastReadStatus apres la lecture pour etre sur
  Standard_Integer flag = atoi (FP.CValue());
  if (flag != 0 && flag != 1) {
    if (exact) {
      SendFail (amsg);
      thelast = Standard_True;
      return Standard_False;
    }
    else {
      SendWarning (amsg);
    }
  }
  val = (flag > 0);
  return Standard_True;
}


//=======================================================================
//function : ReadBoolean
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadBoolean
  (const IGESData_ParamCursor& PC, const Standard_CString mess,
   Standard_Boolean& val, const Standard_Boolean exact)
{
  if (!PrepareRead(PC,mess,Standard_False)) return Standard_False;
  const Interface_FileParameter& FP = theparams->Value(theindex+thebase);
  if (FP.ParamType() != Interface_ParamInteger) {
    if (FP.ParamType() == Interface_ParamVoid)
      {
	val = Standard_False;
	return Standard_True;
      }    // DEFAULT
    AddFail (mess," : not an Integer (for Boolean)","");
    return Standard_False;
  }

  //  Un Booleen, c est 0/1. Mais on peut tolerer d autres valeurs
  //  On peut toujours consulter LastReadStatus apres la lecture pour etre sur
  Standard_Integer flag = atoi (FP.CValue());
  if (flag != 0 && flag != 1) {
    char ssem[100];
    sprintf(ssem," : Value is not 0/1, but %s",FP.CValue());
    if (exact) {
      AddFail (mess,ssem," : Value is not 0/1, but %s");
      thelast = Standard_True;
      return Standard_False;
    }
    else AddWarning (mess,ssem," : Value is not 0/1, but %s");
  }
  val = (flag > 0);
  return Standard_True;
}


// ReadReal for MoniTool

//=======================================================================
//function : ReadReal
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadReal (const IGESData_ParamCursor& PC,
						 Standard_Real& val)
{
  if (!PrepareRead(PC,Standard_False)) return Standard_False;
//  return ReadingReal (theindex,amsg,val);
  return ReadingReal (theindex,val);
}


//=======================================================================
//function : ReadReal
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadReal
  (const IGESData_ParamCursor& PC,const Standard_CString mess,
   Standard_Real& val)
{
  if (!PrepareRead(PC,mess,Standard_False)) return Standard_False;
  return ReadingReal (theindex,mess,val);
}


// ReadXY for MoniTool

//=======================================================================
//function : ReadXY
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadXY
  (const IGESData_ParamCursor& PC,MoniTool_Msg& amsg, gp_XY& val)
{
  if (!PrepareRead(PC,Standard_False,2)) return Standard_False;
  Standard_Real X,Y;
  Standard_Boolean stat =
    (ReadingReal (theindex  ,X)  &&
     ReadingReal (theindex+1,Y)  );
  if (stat) val.SetCoord(X,Y);
  return stat;
}


//=======================================================================
//function : ReadXY
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadXY
  (const IGESData_ParamCursor& PC, const Standard_CString mess, gp_XY& val)
{
  if (!PrepareRead(PC,mess,Standard_False,2)) return Standard_False;
  Standard_Real X,Y;
  Standard_Boolean stat =
    (ReadingReal (theindex  ,mess,X)  &&
     ReadingReal (theindex+1,mess,Y)  );
  if (stat) val.SetCoord(X,Y);
  return stat;
}


// ReadXYZ for MoniTool

//=======================================================================
//function : ReadXYZ
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadXYZ
  (const IGESData_ParamCursor& PC,MoniTool_Msg& amsg, gp_XYZ& val)
{
  if (!PrepareRead(PC,Standard_False,3)) return Standard_False;
  Standard_Real X,Y,Z;
  Standard_Boolean stat =
    (ReadingReal (theindex  ,X)  &&
     ReadingReal (theindex+1,Y)  &&
     ReadingReal (theindex+2,Z)  );
  if (stat) val.SetCoord(X,Y,Z);
  return Standard_True;
}


//=======================================================================
//function : ReadXYZ
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadXYZ
  (const IGESData_ParamCursor& PC, const Standard_CString mess, gp_XYZ& val)
{
  if (!PrepareRead(PC,mess,Standard_False,3)) return Standard_False;
  Standard_Real X,Y,Z;
  Standard_Boolean stat =
    (ReadingReal (theindex  ,mess,X)  &&
     ReadingReal (theindex+1,mess,Y)  &&
     ReadingReal (theindex+2,mess,Z)  );
  if (stat) val.SetCoord(X,Y,Z);
  return Standard_True;
}


// ReadText for MoniTool

//=======================================================================
//function : ReadText
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadText
  (const IGESData_ParamCursor& PC, const MoniTool_Msg& amsg  ,
   Handle(TCollection_HAsciiString)& val)
{
  if (!PrepareRead(PC,Standard_False)) return Standard_False;
  const Interface_FileParameter& FP = theparams->Value(theindex+thebase);
  if (FP.ParamType() != Interface_ParamText) {
    if (FP.ParamType() == Interface_ParamVoid) {
      val = new TCollection_HAsciiString("");
      return Standard_True;
    }
    SendFail (amsg);
    return Standard_False;
  }
  Handle(TCollection_HAsciiString) tval = new TCollection_HAsciiString (FP.CValue());
  Standard_Integer lnt = tval->Length();
  Standard_Integer lnh = tval->Location(1,'H',1,lnt);
  if (lnh <= 1 || lnh >= lnt) {
    SendFail (amsg);
    return Standard_False;
  } else {
    Standard_Integer hol = atoi (tval->SubString(1,lnh-1)->ToCString());
    if (hol != (lnt-lnh)) SendWarning (amsg);
  }
  val = new TCollection_HAsciiString(tval->SubString(lnh+1,lnt)->ToCString());
  return Standard_True;
}


//=======================================================================
//function : ReadText
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadText
  (const IGESData_ParamCursor& PC, const Standard_CString mess,
   Handle(TCollection_HAsciiString)& val)
{
  if (!PrepareRead(PC,mess,Standard_False)) return Standard_False;
  const Interface_FileParameter& FP = theparams->Value(theindex+thebase);
  if (FP.ParamType() != Interface_ParamText) {
    if (FP.ParamType() == Interface_ParamVoid) {
      val = new TCollection_HAsciiString("");
      return Standard_True;
    }
    AddFail (mess," : not given as a Text","");
    return Standard_False;
  }
  Handle(TCollection_HAsciiString) tval = new TCollection_HAsciiString (FP.CValue());
  Standard_Integer lnt = tval->Length();
  Standard_Integer lnh = tval->Location(1,'H',1,lnt);
  if (lnh <= 1 || lnh >= lnt) {
    AddFail (mess," : not in Hollerith Form","");
    return Standard_False;
  }
  else {
    Standard_Integer hol = atoi (tval->SubString(1,lnh-1)->ToCString());
    if (hol != (lnt-lnh)) AddWarning (mess," : bad Hollerith count ","");
  }
  val = new TCollection_HAsciiString(tval->SubString(lnh+1,lnt)->ToCString());
  return Standard_True;
}


// ReadEntity for MoniTool

//=======================================================================
//function : ReadEntity
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadEntity (const Handle(IGESData_IGESReaderData)& IR, 
						   const IGESData_ParamCursor& PC,
						   IGESData_Status& aStatus, 
						   Handle(IGESData_IGESEntity)& val, 
						   const Standard_Boolean canbenul)
{
  if (!PrepareRead(PC,Standard_False)) return Standard_False;
  Standard_Integer nval;
//  if (!ReadingEntityNumber(theindex,amsg,nval)) return Standard_False;
  if (!ReadingEntityNumber(theindex,nval)) return Standard_False;
  if (nval == 0) {
    val.Nullify();
    if (!canbenul) {
      aStatus = IGESData_ReferenceError;
     // MoniTool_Msg Msg216 ("IGESP_216");
     // amsg.AddString(amsg.Value());
     // SendFail (amsg);

      thelast = Standard_True;
    }
    return canbenul;
  }
  else val = GetCasted(IGESData_IGESEntity,IR->BoundEntity(nval));
  if (val.IsNull()) return canbenul;
  //    Cas du "Nul IGES"
  if (val->TypeNumber() == 0) {           // Null ou pas encore rempli ...
    if (IR->DirType(nval).Type() == 0) {  // le vrai critere (un peu cher)
      val.Nullify();
      if (!canbenul) {
	aStatus = IGESData_EntityError;
	// MoniTool_Msg Msg217 ("IGES_217");
        //amsg.AddString(Msg217.Value());
        //SendFail (amsg);
        thelast = Standard_True;
      }
      return canbenul;
    }
  }
  aStatus = IGESData_EntityOK;
  return Standard_True;
}


//=======================================================================
//function : ReadEntity
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadEntity
  (const Handle(IGESData_IGESReaderData)& IR, const IGESData_ParamCursor& PC,
   const Standard_CString mess, Handle(IGESData_IGESEntity)& val, const Standard_Boolean canbenul)
{
  if (!PrepareRead(PC,mess,Standard_False)) return Standard_False;
  Standard_Integer nval;
  if (!ReadingEntityNumber(theindex,mess,nval)) return Standard_False;
  if (nval == 0) {
    val.Nullify();
    if (!canbenul) {
      AddFail (mess," : Null Reference","");
      thelast = Standard_True;
    }
    return canbenul;
  }
  else val = GetCasted(IGESData_IGESEntity,IR->BoundEntity(nval));
  if (val.IsNull()) return canbenul;
  //    Cas du "Nul IGES"
  if (val->TypeNumber() == 0) {           // Null ou pas encore rempli ...
    if (IR->DirType(nval).Type() == 0) {  // le vrai critere (un peu cher)
      val.Nullify();
      if (!canbenul) {
	AddFail (mess," : IGES Null Entity","");
	thelast = Standard_True;
      }
      return canbenul;
    }
  }
  return Standard_True;
}


// ReadEntity for MoniTool

//=======================================================================
//function : ReadEntity
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadEntity (const Handle(IGESData_IGESReaderData)& IR,
						   const IGESData_ParamCursor& PC,
						   IGESData_Status& aStatus, 
						   const Handle(Standard_Type)& type,
						   Handle(IGESData_IGESEntity)& val,
						   const Standard_Boolean canbenul)
{
  Standard_Boolean res = ReadEntity (IR,PC,aStatus,val,canbenul);
  if (!res) {
    return res;
  }
  if (val.IsNull()) return res;
  if (!val->IsKind(type)) {
    aStatus = IGESData_TypeError;
    // MoniTool_Msg Msg218 ("IGES_218");
    //amsg.AddString(Msg218.Value());
    //SendFail(amsg);
    thelast = Standard_True;
    val.Nullify();
    return Standard_False;
  }
  return Standard_True;
}


//=======================================================================
//function : ReadEntity
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadEntity
  (const Handle(IGESData_IGESReaderData)& IR,
   const IGESData_ParamCursor& PC, const Standard_CString mess,
   const Handle(Standard_Type)& type,
   Handle(IGESData_IGESEntity)& val, const Standard_Boolean canbenul)
{
  Standard_Boolean res = ReadEntity (IR,PC,mess,val,canbenul);
  if (!res) return res;
  if (val.IsNull()) return res;
  if (!val->IsKind(type)) {
    AddFail (mess," : Incorrect Type","");
    thelast = Standard_True;
    val.Nullify();
    return Standard_False;
  }
  return Standard_True;
}


// ReadInts for MoniTool

//=======================================================================
//function : ReadInts
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadInts
  (const IGESData_ParamCursor& PC, const MoniTool_Msg& amsg ,
   Handle(TColStd_HArray1OfInteger)& val,  const Standard_Integer index)
{
  if (!PrepareRead(PC,Standard_True)) return Standard_False;
  if (thenbitem == 0) return Standard_True;    // vide : retour Null ...
  val = new TColStd_HArray1OfInteger (index,index+thenbitem*thetermsz-1);
  Standard_Integer ind = index;

  for (Standard_Integer i = FirstRead(); i > 0; i = NextRead()) {
    const Interface_FileParameter& FP = theparams->Value(i+thebase);
    if (FP.ParamType() == Interface_ParamInteger) {
      val->SetValue (ind, atoi(FP.CValue()));    ind ++;
    } else if (FP.ParamType() == Interface_ParamVoid) {
      val->SetValue (ind,0);    ind ++;    // DEFAULT : rien a dire
    } else {
      SendFail (amsg);
      return Standard_False;
    }
  }
  return Standard_True;
}
  

//=======================================================================
//function : ReadInts
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadInts
  (const IGESData_ParamCursor& PC, const Standard_CString mess,
   Handle(TColStd_HArray1OfInteger)& val,  const Standard_Integer index)
{
  if (!PrepareRead(PC,mess,Standard_True)) return Standard_False;
  if (thenbitem == 0) return Standard_True;    // vide : retour Null ...
  val = new TColStd_HArray1OfInteger (index,index+thenbitem*thetermsz-1);
  Standard_Integer ind = index;

  for (Standard_Integer i = FirstRead(); i > 0; i = NextRead()) {
    const Interface_FileParameter& FP = theparams->Value(i+thebase);
    if (FP.ParamType() == Interface_ParamInteger) {
      val->SetValue (ind, atoi(FP.CValue()));    ind ++;
    } else if (FP.ParamType() == Interface_ParamVoid) {
      val->SetValue (ind,0);    ind ++;    // DEFAULT : rien a dire
    } else {
      char ssem[100];
      sprintf(ssem," : not an Integer, rank %d",i);
      AddFail (mess,ssem," : not an Integer, rank %d");
      return Standard_False;
    }
  }
  return Standard_True;
}


// ReadReals for MoniTool

//=======================================================================
//function : ReadReals
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadReals
  (const IGESData_ParamCursor& PC,MoniTool_Msg& amsg ,
   Handle(TColStd_HArray1OfReal)& val,  const Standard_Integer index)
{
  if (!PrepareRead(PC,Standard_True)) return Standard_False;
  if (thenbitem == 0) return Standard_True;    // vide : retour Null ...
  val = new TColStd_HArray1OfReal (index,index+thenbitem*thetermsz-1);
  Standard_Integer ind = index;

  for (Standard_Integer i = FirstRead(); i > 0; i = NextRead()) {
    Standard_Real rval;
    if (!ReadingReal(i,rval)) return Standard_False;
    val->SetValue (ind, rval);    ind ++;
  }
  return Standard_True;
}


//=======================================================================
//function : ReadReals
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadReals
  (const IGESData_ParamCursor& PC, const Standard_CString mess,
   Handle(TColStd_HArray1OfReal)& val,  const Standard_Integer index)
{
  if (!PrepareRead(PC,mess,Standard_True)) return Standard_False;
  if (thenbitem == 0) return Standard_True;    // vide : retour Null ...
  val = new TColStd_HArray1OfReal (index,index+thenbitem*thetermsz-1);
  Standard_Integer ind = index;

  for (Standard_Integer i = FirstRead(); i > 0; i = NextRead()) {
    Standard_Real rval;
    if (!ReadingReal(i,mess,rval)) return Standard_False;
    val->SetValue (ind, rval);    ind ++;
  }
  return Standard_True;
}


// ReadTexts for MoniTool

//=======================================================================
//function : ReadTexts
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadTexts
  (const IGESData_ParamCursor& PC, const MoniTool_Msg& amsg  ,
   Handle(Interface_HArray1OfHAsciiString)& val,  const Standard_Integer index)
{
  if (!PrepareRead(PC,Standard_True)) return Standard_False;
  if (thenbitem == 0) return Standard_True;    // vide : retour Null ...
  val = new Interface_HArray1OfHAsciiString(index,index+thenbitem*thetermsz-1);
  Standard_Integer ind = index;

  for (Standard_Integer i = FirstRead(); i > 0; i = NextRead()) {
    const Interface_FileParameter& FP = theparams->Value(i+thebase);
    if (FP.ParamType() != Interface_ParamText) {
      if (FP.ParamType() == Interface_ParamVoid) {
	val->SetValue (ind, new TCollection_HAsciiString(""));
	ind ++;
        //AddWarning (mess," : empty text","");  DEFAULT : rien a dire
	continue;
      }
      SendFail(amsg);
      return Standard_False;
    }
    Handle(TCollection_HAsciiString) tval = new TCollection_HAsciiString (FP.CValue());
    // IGESFile_Read a filtre
    Standard_Integer lnt = tval->Length();
    Standard_Integer lnh = tval->Location(1,'H',1,lnt);
    if (lnh <= 1 || lnh >= lnt) {
      SendFail (amsg);
      return Standard_False;
    } else {
      Standard_Integer hol = atoi (tval->SubString(1,lnh-1)->ToCString());
      if (hol != (lnt-lnh)) SendWarning(amsg);
    }
    val->SetValue (ind, new TCollection_HAsciiString
		   (tval->SubString(lnh+1,lnt)->ToCString()));
    ind++;
  }
  return Standard_True;
}


//=======================================================================
//function : ReadTexts
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadTexts
  (const IGESData_ParamCursor& PC, const Standard_CString mess,
   Handle(Interface_HArray1OfHAsciiString)& val,  const Standard_Integer index)
{
  if (!PrepareRead(PC,mess,Standard_True)) return Standard_False;
  if (thenbitem == 0) return Standard_True;    // vide : retour Null ...
  val = new Interface_HArray1OfHAsciiString(index,index+thenbitem*thetermsz-1);
  Standard_Integer ind = index;

  for (Standard_Integer i = FirstRead(); i > 0; i = NextRead()) {
    const Interface_FileParameter& FP = theparams->Value(i+thebase);
    if (FP.ParamType() != Interface_ParamText) {
      if (FP.ParamType() == Interface_ParamVoid) {
        val->SetValue (ind, new TCollection_HAsciiString(""));
        ind ++;
        //AddWarning (mess," : empty text","");  DEFAULT : rien a dire
        continue;
      }
      AddFail (mess," : not given as a Text","");
      return Standard_False;
    }
    Handle(TCollection_HAsciiString) tval = new TCollection_HAsciiString (FP.CValue());
    // IGESFile_Read a filtre
    Standard_Integer lnt = tval->Length();
    Standard_Integer lnh = tval->Location(1,'H',1,lnt);
    if (lnh <= 1 || lnh >= lnt) {
      AddFail (mess," : not in Hollerith Form","");
      return Standard_False;
    } else {
      Standard_Integer hol = atoi (tval->SubString(1,lnh-1)->ToCString());
      if (hol != (lnt-lnh)) AddWarning(mess," : bad Hollerith count ","");
    }
    val->SetValue (ind, new TCollection_HAsciiString
                   (tval->SubString(lnh+1,lnt)->ToCString()));
    ind++;
  }
  return Standard_True;
}


// ReadEnts for MoniTool

//=======================================================================
//function : ReadEnts
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadEnts
  (const Handle(IGESData_IGESReaderData)& IR,
   const IGESData_ParamCursor& PC, const MoniTool_Msg& amsg  ,
   Handle(IGESData_HArray1OfIGESEntity)& val,  const Standard_Integer index)
{
  if (!PrepareRead(PC,Standard_True)) return Standard_False;
  if (thenbitem == 0) return Standard_True;    // vide : retour Null ...
  Standard_Integer indmax = index+thenbitem*thetermsz-1;
  val = new IGESData_HArray1OfIGESEntity (index , indmax);
  Standard_Integer ind = index;
  Standard_Integer nbneg = 0, nbnul = 0;

  Standard_Integer i; // svv Jan11 2000 : porting on DEC
  for (i = FirstRead(); i > 0; i = NextRead()) {
    Standard_Integer nval;
    if (!ReadingEntityNumber(i,nval)) nval = 0;  //return Standard_False;
    if (nval < 0) nbneg ++;
    if (nval > 0) {
      DeclareAndCast(IGESData_IGESEntity,anent,IR->BoundEntity(nval));
      if (anent.IsNull()) nbnul ++;
      else if (IR->DirType(nval).Type() == 0) nbnul ++;
      else  {  val->SetValue (ind, anent);  ind ++;  }
    }
  }
  if      (ind == indmax+1) {  }                   // tableau complet
  else if (ind == index)  val.Nullify();         // tableau vide
  else {
    // Trous : ils ont ete elimines, mais le tableau est a retailler
    Handle(IGESData_HArray1OfIGESEntity) tab =
      new IGESData_HArray1OfIGESEntity (index , ind-1);
    for (i = index; i < ind; i ++) tab->SetValue (i,val->Value(i));
    val = tab;
  }
  if (nbnul > 0) {
    SendWarning (amsg);
  }
  return Standard_True;
}


//=======================================================================
//function : ReadEnts
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadEnts
  (const Handle(IGESData_IGESReaderData)& IR,
   const IGESData_ParamCursor& PC, const Standard_CString mess,
   Handle(IGESData_HArray1OfIGESEntity)& val,  const Standard_Integer index)
{
  if (!PrepareRead(PC,mess,Standard_True)) return Standard_False;
  if (thenbitem == 0) return Standard_True;    // vide : retour Null ...
  Standard_Integer indmax = index+thenbitem*thetermsz-1;
  val = new IGESData_HArray1OfIGESEntity (index , indmax);
  Standard_Integer ind = index;
  Standard_Integer nbneg = 0, nbnul = 0;

  Standard_Integer i; // svv Jan11 2000 : porting on DEC
  for (i = FirstRead(); i > 0; i = NextRead()) {
    Standard_Integer nval;
    if (!ReadingEntityNumber(i,mess,nval)) nval = 0;  //return Standard_False;
    if (nval < 0) nbneg ++;
    if (nval > 0) {
      DeclareAndCast(IGESData_IGESEntity,anent,IR->BoundEntity(nval));
      if (anent.IsNull()) nbnul ++;
      else if (IR->DirType(nval).Type() == 0) nbnul ++;
      else  {  val->SetValue (ind, anent);  ind ++;  }
    }
  }
  if      (ind == indmax+1) {  }                   // tableau complet
  else if (ind == index)  val.Nullify();         // tableau vide
  else {
    // Trous : ils ont ete elimines, mais le tableau est a retailler
    Handle(IGESData_HArray1OfIGESEntity) tab =
      new IGESData_HArray1OfIGESEntity (index , ind-1);
    for (i = index; i < ind; i ++) tab->SetValue (i,val->Value(i));
    val = tab;
  }
  //  Messages ?
  char mest[80];
  if (nbneg > 0) {
    sprintf(mest,"Skipped Negative Pointer(s), count %d",nbneg);
    AddWarning (mest,"Skipped Negative Pointer(s), count %d");
  }
  if (nbnul > 0) {
    sprintf(mest,"Skipped Null Type Entity(ies), count %d",nbnul);
    AddWarning (mest,"Skipped Null Type Entity(ies), count %d");
  }
  return Standard_True;
}


// ReadEntList for MoniTool

//=======================================================================
//function : ReadEntList
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadEntList
  (const Handle(IGESData_IGESReaderData)& IR,
   const IGESData_ParamCursor& PC, MoniTool_Msg& amsg,
   Interface_EntityList& val, const Standard_Boolean ord)
{

  if (!PrepareRead(PC,Standard_True)) return Standard_False;
  val.Clear();
  if (thenbitem == 0) return Standard_True;    // vide : retour Null ...
  for (Standard_Integer i = FirstRead(); i > 0; i = NextRead()) {
    Standard_Integer nval;
    if (!ReadingEntityNumber(i,nval)) return Standard_False;
    if (nval < 0) 
      {
        MoniTool_Msg Msg219 ("XSTEP_219");
        amsg.AddString(Msg219.Value());
        SendWarning(amsg);
      }
    if (nval <= 0) continue;
    DeclareAndCast(IGESData_IGESEntity,anent,IR->BoundEntity(nval));
    if (anent.IsNull()) 
       { 
         MoniTool_Msg Msg216 ("XSTEP_216");
         amsg.AddString(Msg216.Value());
         SendWarning(amsg);
       }   
    else if (IR->DirType(nval).Type() == 0) {MoniTool_Msg Msg217 ("XSTEP_217"); SendWarning(Msg217.Value());}
    else if (ord) val.Append (anent);
    else          val.Add    (anent);
  }
  return Standard_True;
}


//=======================================================================
//function : ReadEntList
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadEntList
  (const Handle(IGESData_IGESReaderData)& IR,
   const IGESData_ParamCursor& PC, const Standard_CString mess,
   Interface_EntityList& val, const Standard_Boolean ord)
{
  if (!PrepareRead(PC,mess,Standard_True)) return Standard_False;
  val.Clear();
  if (thenbitem == 0) return Standard_True;    // vide : retour Null ...
  for (Standard_Integer i = FirstRead(); i > 0; i = NextRead()) {
    Standard_Integer nval;
    if (!ReadingEntityNumber(i,mess,nval)) return Standard_False;
    if (nval < 0)  AddWarning(" Negative Pointer, skipped","");
    if (nval <= 0) continue;
    DeclareAndCast(IGESData_IGESEntity,anent,IR->BoundEntity(nval));
    if (anent.IsNull()) AddWarning(" Null Pointer, skipped","");
    else if (IR->DirType(nval).Type() == 0) AddWarning(" Pointer to IGES Null Entity, skipped","");
    else if (ord) val.Append (anent);
    else          val.Add    (anent);
  }
  return Standard_True;
}


// ReadingReal for MoniTool

//=======================================================================
//function : ReadingReal
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadingReal (const Standard_Integer num,
						    Standard_Real& val)
{
  const Interface_FileParameter& FP = theparams->Value(num+thebase);
  if(FP.ParamType() == Interface_ParamInteger) {
    if (!pbrealint) {
      if (testconv < 0) testconv = 0; //Interface_Static::IVal("iges.convert.read");
      if (testconv > 0) {
     //   char ssem[100];
        pbrealint = num;
     //   sprintf(ssem,": Integer converted to Real, 1st rank=%d",num);
     //   AddWarning (mess,ssem,"At least one Integer converted to Real, 1st rank=%d");
      }
    }
    Standard_Integer ival = atoi(FP.CValue());
    val = ival;
    return Standard_True; 
  }
  char text[50];
  Standard_CString orig = FP.CValue();
  Standard_Integer i , j = 0;
  for (i = 0; i < 50; i ++) {
    if (orig[i] ==  'D' || orig[i] == 'd')
      text[j++] = 'e';
    else
      text[j++] = orig[i];  
    if (orig[i] == '\0') break;
  }
  if (FP.ParamType() == Interface_ParamReal) val = atof(text);
    //Interface_FileReaderData::Fastof(FP.CValue());
   else if (FP.ParamType() == Interface_ParamEnum) {  // convention
    if (!pbrealform) {
      if (testconv < 0) testconv = 0; //Interface_Static::IVal("iges.convert.read");
      if (testconv > 0) {
       // char ssem[100];
        pbrealform = num;
      //  sprintf(ssem,"Real with no decimal point (added), 1st rank=%d",num);
      //  AddWarning (mess,ssem,"Real with no decimal point (added), 1st rank=%d");
      }
    }
    // Par convention (pas d enum explicite dans IGES), signifie
    // "reconnu comme flottant mais pas blanc-bleu" c-a-d sans point decimal
    // mais avec exposant (sinon ce serait un entier)
    // -> un message avertissement + on ajoute le point puis on convertit
    
    val = atof(text);//Interface_FileReaderData::Fastof(text);
  } else if (FP.ParamType() == Interface_ParamVoid) {
    val = 0.0;    // DEFAULT
  } else {
   // char ssem[100];
  //  sprintf(ssem,": not given as Real, rank %d",num);
  //  AddFail (mess,ssem,": not given as Real, rank %d");
  /*  TCollection_AsciiString mess = amsg.Value();
    if ((mess.Search("ter %d"))||(mess.Search("tre %d")))
       amsg.AddInteger(num); // Parameter index
  */ 
    return Standard_False;
  }
  return Standard_True;
}


//=======================================================================
//function : ReadingReal
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadingReal
  (const Standard_Integer num, const Standard_CString mess,
   Standard_Real& val)
{
  const Interface_FileParameter& FP = theparams->Value(num+thebase);
  if (FP.ParamType() == Interface_ParamInteger) {
    if (!pbrealint) {
      if (testconv < 0) testconv = 0; //Interface_Static::IVal("iges.convert.read");
      if (testconv > 0) {
	char ssem[100];
	pbrealint = num;
	sprintf(ssem,": Integer converted to Real, 1st rank=%d",num);
	AddWarning (mess,ssem,"At least one Integer converted to Real, 1st rank=%d");
      }
    }
    Standard_Integer ival = atoi(FP.CValue());
    val = ival;
    return Standard_True;
  }
  char text[50];
  Standard_CString orig = FP.CValue();
  Standard_Integer i , j = 0;
  for (i = 0; i < 50; i ++) {
    if (orig[i] ==  'D' || orig[i] == 'd')
      text[j++] = 'e';
    else
      text[j++] = orig[i];  
    if (orig[i] == '\0') break;
  }
  if (FP.ParamType() == Interface_ParamReal) val = atof(text);
    //Interface_FileReaderData::Fastof(FP.CValue());
  else if (FP.ParamType() == Interface_ParamEnum) {  // convention
    if (!pbrealform) {
      if (testconv < 0) testconv = 0; //Interface_Static::IVal("iges.convert.read");
      if (testconv > 0) {
	char ssem[100];
	pbrealform = num;
	sprintf(ssem,"Real with no decimal point (added), 1st rank=%d",num);
	AddWarning (mess,ssem,"Real with no decimal point (added), 1st rank=%d");
      }
    }
    // Par convention (pas d enum explicite dans IGES), signifie
    // "reconnu comme flottant mais pas blanc-bleu" c-a-d sans point decimal
    // mais avec exposant (sinon ce serait un entier)
    // -> un message avertissement + on ajoute le point puis on convertit
    
    val = atof(text);//Interface_FileReaderData::Fastof(text);
  } else if (FP.ParamType() == Interface_ParamVoid) {
    val = 0.0;    // DEFAULT
  } else {
    char ssem[100];
    sprintf(ssem,": not given as Real, rank %d",num);
    AddFail (mess,ssem,": not given as Real, rank %d");
    return Standard_False;
  }
  return Standard_True;
}
 

// ReadingEntityNumber for MoniTool

//=======================================================================
//function : ReadingEntityNumber
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadingEntityNumber (const Standard_Integer num, 
							    Standard_Integer& val)
{
  const Interface_FileParameter& FP = theparams->Value(num+thebase);
  val = ParamNumber(num);
  if (val == 0) {
    Standard_Boolean nulref = Standard_False;
    if (FP.ParamType() == Interface_ParamInteger)
        nulref = (atoi(FP.CValue()) == 0);
    else if (FP.ParamType() == Interface_ParamVoid) nulref = Standard_True;
    if (!nulref) {
   //   AddFail (mess," : cannot refer to an Entity","");
      thelast = Standard_True;
      return Standard_False;
    }
  }
  return Standard_True;
}


//=======================================================================
//function : ReadingEntityNumber
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::ReadingEntityNumber
  (const Standard_Integer num, const Standard_CString mess,
   Standard_Integer& val)
{
  const Interface_FileParameter& FP = theparams->Value(num+thebase);
  val = ParamNumber(num);
  if (val == 0) {
    Standard_Boolean nulref = Standard_False;
    if (FP.ParamType() == Interface_ParamInteger)
	nulref = (atoi(FP.CValue()) == 0);
    else if (FP.ParamType() == Interface_ParamVoid) nulref = Standard_True;
    if (!nulref) {
      AddFail (mess," : cannot refer to an Entity","");
      thelast = Standard_True;
      return Standard_False;
    }
  }
  return Standard_True;
}


//=======================================================================
//function : SendFail
//purpose  : 
//=======================================================================

void IGESData_ParamReader::SendFail (const MoniTool_Msg& amsg)
{
  thecheck->SendFail (amsg);
  thelast = Standard_False;
}


//=======================================================================
//function : SendWarning
//purpose  : 
//=======================================================================

void IGESData_ParamReader::SendWarning (const MoniTool_Msg& amsg)
{
  thecheck->SendWarning (amsg);
  thelast = Standard_False;
}



//  ....              Gestion courante du statut de lecture              ....


//=======================================================================
//function : AddFail
//purpose  : 
//=======================================================================

void IGESData_ParamReader::AddFail(const Standard_CString idm,
                                   const Handle(TCollection_HAsciiString)& afail,
                                   const Handle(TCollection_HAsciiString)& bfail)
{
  afail->Insert (1,idm);
  if (bfail != afail) bfail->Insert (1,idm);
  thecheck->AddFail (afail,bfail);
  thelast = Standard_False;
}


//=======================================================================
//function : AddFail
//purpose  : 
//=======================================================================

void IGESData_ParamReader::AddFail(const Standard_CString idm,
                                   const Standard_CString afail,
                                   const Standard_CString bfail)
{
  Handle(TCollection_HAsciiString) af = new TCollection_HAsciiString(afail);
  Handle(TCollection_HAsciiString) bf = af;
  if (bfail[0] != '\0') bf = new TCollection_HAsciiString(bfail);
  AddFail (idm, af,bf);
}


//=======================================================================
//function : AddWarning
//purpose  : 
//=======================================================================

void IGESData_ParamReader::AddWarning(const Standard_CString idm,
                                      const Handle(TCollection_HAsciiString)& aw,
                                      const Handle(TCollection_HAsciiString)& bw)
{
  aw->Insert (1,idm);
  if (bw != aw) bw->Insert (1,idm);
  thecheck->AddWarning (aw,bw);
}


//=======================================================================
//function : AddWarning
//purpose  : 
//=======================================================================

void IGESData_ParamReader::AddWarning(const Standard_CString idm,
                                      const Standard_CString awarn,
                                      const Standard_CString bwarn)
{
  Handle(TCollection_HAsciiString) aw = new TCollection_HAsciiString(awarn);
  Handle(TCollection_HAsciiString) bw = aw;
  if (bwarn[0] != '\0') bw = new TCollection_HAsciiString(bwarn);
  AddWarning (idm, aw,bw);
}


//=======================================================================
//function : AddFail
//purpose  : 
//=======================================================================

void IGESData_ParamReader::AddFail(const Standard_CString afail,
                                   const Standard_CString bfail)
{
  thelast = Standard_False;
  thecheck->AddFail(afail,bfail);
}


//=======================================================================
//function : AddFail
//purpose  : 
//=======================================================================

void IGESData_ParamReader::AddFail(const Handle(TCollection_HAsciiString)& afail,
                                   const Handle(TCollection_HAsciiString)& bfail)
{
  thelast = Standard_False;
  thecheck->AddFail(afail,bfail);
}


//=======================================================================
//function : AddWarning
//purpose  : 
//=======================================================================

void IGESData_ParamReader::AddWarning(const Standard_CString amess,
                                      const Standard_CString bmess)
{
  thecheck->AddWarning(amess,bmess);
}


//=======================================================================
//function : AddWarning
//purpose  : 
//=======================================================================

void IGESData_ParamReader::AddWarning(const Handle(TCollection_HAsciiString)& amess,
                                      const Handle(TCollection_HAsciiString)& bmess)
{
  thecheck->AddWarning(amess,bmess);
}


//=======================================================================
//function : Mend
//purpose  : 
//=======================================================================

void IGESData_ParamReader::Mend (const Standard_CString pref)
{
  thecheck->Mend (pref);
  thelast = Standard_True;
}


//=======================================================================
//function : HasFailed
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::HasFailed () const
{
  return !thelast;
}  //thecheck.HasFailed();


//=======================================================================
//function : Check
//purpose  : 
//=======================================================================

const Handle(Interface_Check)& IGESData_ParamReader::Check () const
{
  return thecheck;
}


//=======================================================================
//function : CCheck
//purpose  : 
//=======================================================================

Handle(Interface_Check)& IGESData_ParamReader::CCheck ()
{
  return thecheck;
}


//=======================================================================
//function : IsCheckEmpty
//purpose  : 
//=======================================================================

Standard_Boolean IGESData_ParamReader::IsCheckEmpty () const
{
  return (!thecheck->HasFailed() && !thecheck->HasWarnings());
}
