Files
geant4/source/geometry/solids/STEP/src/SdaiBinary.cc
T
2016-06-08 15:34:16 +02:00

373 lines
8.7 KiB
C++

//
//
// $Id: SdaiBinary.cc,v 1.3 1999/12/15 14:50:17 gunter Exp $
// GEANT4 tag $Name: geant4-01-01 $
//
/*
* NIST STEP Core Class Library
* clstepcore/SdaiBinary.cc
* May 1995
* David Sauder
* Development of this software was funded by the United States Government,
* and is not subject to copyright.
*/
/* $Id: SdaiBinary.cc,v */
#include <SdaiBinary.h>
extern Severity
CheckRemainingInput(G4std::istream &in, ErrorDescriptor *err,
const char *typeName, // used in error message
const char *tokenList); // e.g. ",)"
void
SdaiBinary::STEPwrite (G4std::ostream& out) const
{
const char *str = 0;
if (is_null ())
out << "$";
else
{
out << '\"';
str = chars ();
while (*str)
{
out << *str;
str++;
}
out << '\"';
}
}
const char *
SdaiBinary::STEPwrite (SCLstring &s) const
{
const char *str = 0;
if (is_null ())
{
// s.set_null(); // this would free up space? nope
s = "$";
}
else
{
s = "\"";
str = chars ();
while (*str)
{
s.Append(*str);
str++;
}
s.Append(BINARY_DELIM);
}
return s.chars();
}
Severity
SdaiBinary::ReadBinary(G4std::istream& in, ErrorDescriptor *err, int AssignVal,
int needDelims)
{
if(AssignVal)
set_null();
SCLstring str;
char c;
char messageBuf[512];
messageBuf[0] = '\0';
int validDelimiters = 1;
in >> G4std::ws; // skip white space
if( in.good() )
{
in.get(c);
if( (c == '\"') || isxdigit(c) )
{
if( c == '\"' )
{
in.get(c); // push past the delimiter
// since found a valid delimiter it is now invalid until the
// matching ending delim is found
validDelimiters = 0;
}
while(in.good() && isxdigit(c))
{
str.Append(c);
in.get(c);
}
if(in.good() && (c != '\"') )
in.putback(c);
if( AssignVal && (str.Length() > 0) )
operator= (str.chars());
if(c == '\"') // if found ending delimiter
{
// if expecting delim (i.e. validDelimiter == 0)
if(!validDelimiters)
{
validDelimiters = 1; // everything is fine
}
else // found ending delimiter but no initial delimiter
{
validDelimiters = 0;
}
}
// didn't find any delimiters at all and need them.
else if(needDelims)
{
validDelimiters = 0;
}
if (!validDelimiters)
{
err->GreaterSeverity(SEVERITY_WARNING);
if(needDelims)
sprintf(messageBuf,
"Binary value missing double quote delimiters.\n");
else
sprintf(messageBuf,
"Mismatched double quote delimiters for binary.\n");
err->AppendToDetailMsg(messageBuf);
err->AppendToUserMsg(messageBuf);
}
/*
else if ( !isspace(b[0]) && (b[0] != '\0') )
{
err->GreaterSeverity(SEVERITY_WARNING);
sprintf(messageBuf, "Invalid binary value.\n");
err->AppendToDetailMsg(messageBuf);
}
*/
}
else
{
err->GreaterSeverity(SEVERITY_WARNING);
sprintf(messageBuf, "Invalid binary value.\n");
err->AppendToDetailMsg(messageBuf);
err->AppendToUserMsg(messageBuf);
}
}
else
{
err->GreaterSeverity(SEVERITY_INCOMPLETE);
}
return err->severity();
}
Severity
SdaiBinary::StrToVal (const char * s, ErrorDescriptor *err)
{
G4std::istrstream in ((char *)s); // sz defaults to length of s
return ReadBinary(in, err, 1, 0);
}
/*
operator= (s);
if (! strcmp (chars (), s)) return SEVERITY_NULL ;
else return SEVERITY_INPUT_ERROR;
*/
/////////////////////////////////////////////////
#ifdef bpzdofbqlvzbfxck
set_null();
char messageBuf[BUFSIZ];
messageBuf[0] = '\0';
int validDelimiters = 1;
char *start = 0;
char *b = s;
while( *b && isspace(*b) )
b++;
if( *b )
{
if( (b[0] == '\"') || isxdigit(b[0]) )
{
if( b[0] == '\"' )
{
b++; // push past the delimiter
// since found a valid delimiter it is now invalid until the
// matching ending delim is found
validDelimiters = 0;
}
if(isxdigit(b[0]))
start = b;
while(isxdigit(b[0]))
{
b++;
}
if(b[0] == '\"') // if found ending delimiter
{
// if expecting delim (i.e. validDelimiter == 0)
if(!validDelimiters)
{
validDelimiters = 1; // everything is fine
b++; // push past closing quote
}
else // found ending delimiter but no initial delimiter
{
validDelimiters = 0;
}
}
// didn't find any delimiters at all and need them.
else if(NeedDelims)
{
validDelimiters = 0;
}
if (!validDelimiters)
{
err->GreaterSeverity(SEVERITY_WARNING);
sprintf(messageBuf,
"Binary value missing double quote delimiters. \n");
}
else if ( !isspace(b[0]) && (b[0] != '\0') )
{
err->GreaterSeverity(SEVERITY_WARNING);
sprintf(messageBuf, "Invalid binary value.\n");
err->AppendToDetailMsg(messageBuf);
}
}
else
{
err->GreaterSeverity(SEVERITY_WARNING);
sprintf(messageBuf, "Invalid binary value.\n");
err->AppendToDetailMsg(messageBuf);
}
}
else
{
err->GreaterSeverity(SEVERITY_INCOMPLETE);
}
return b;
#endif
// STEPread reads a binary in exchange file format
// delimited by double quotes
Severity
SdaiBinary::STEPread (G4std::istream& in, ErrorDescriptor *err)
{
return ReadBinary(in, err, 1, 1);
/*
int foundEndQuote = 0; // need so this string is not ok: 'hi''
set_null (); // clear the old string
char c;
in >> G4std::ws; // skip white space
in >> c;
// remember the current format state to restore the previous settings
long int flags = in.flags();
in.unsetf(G4std::ios::skipws);
if (c == BINARY_DELIM)
{
while( in.good() && in.get(c) && (c != BINARY_DELIM) )
{
Append (c);
}
Append ('\0');
if(c == BINARY_DELIM)
return SEVERITY_NULL;
else
{ // non-recoverable error
err->AppendToDetailMsg("Missing closing quote on binary value.\n");
err->AppendToUserMsg("Missing closing quote on binary value.\n");
err->GreaterSeverity(SEVERITY_INPUT_ERROR);
return SEVERITY_INPUT_ERROR;
}
}
// otherwise there was not a quote
in.putback (c);
in.flags(flags); // set the format state back to previous settings
return err -> GreaterSeverity (SEVERITY_INCOMPLETE);
*/
}
Severity
SdaiBinary::STEPread (const char *s, ErrorDescriptor *err)
{
G4std::istrstream in((char *)s);
return STEPread (in, err);
}
///////////////////////////////////////////////////////////////////////////////
// * attrValue is validated.
// * err is set if there is an error
// * If optional is 1 then a missing value will be valid otherwise severity
// incomplete will be set.
// * If you don\'t know if the value may be optional then set it false and
// check to see if SEVERITY_INCOMPLETE is set. You can change it later to
// SEVERITY_NULL if it is valid for the value to be missing. No error
// 'message' will be associated with the value being missing so you won\'t
// have to worry about undoing an error message.
// * tokenList contains characters that Terminate the expected value.
// * If tokenList is not zero then the value is expected to Terminate before
// a character found in tokenlist. All values read up to the
// terminating character (delimiter) must be valid or err will be set with an
// appropriate error message. White space between the value and the
// terminating character is not considered to be invalid. If tokenList is
// null then attrValue must only contain a valid value and nothing else
// following.
///////////////////////////////////////////////////////////////////////////////
Severity
SdaiBinary::BinaryValidLevel (G4std::istream &in, ErrorDescriptor *err,
int optional, char *tokenList,
int needDelims, int clearError)
{
if(clearError)
err->ClearErrorMsg();
in >> G4std::ws; // skip white space
char c = in.peek();
if(c == '$' || in.eof())
{
if(!optional)
err->GreaterSeverity(SEVERITY_INCOMPLETE);
if(in)
in >> c;
CheckRemainingInput(in, err, "binary", tokenList);
return err->severity();
}
else
{
ErrorDescriptor error;
ReadBinary(in, &error, 0, needDelims);
CheckRemainingInput(in, &error, "binary", tokenList);
Severity sev = error.severity();
if(sev < SEVERITY_INCOMPLETE)
{
err->AppendToDetailMsg(error.DetailMsg());
err->AppendToUserMsg(error.UserMsg());
err->GreaterSeverity(error.severity());
}
else if(sev == SEVERITY_INCOMPLETE && !optional)
err->GreaterSeverity(SEVERITY_INCOMPLETE);
}
return err->severity();
}
Severity
SdaiBinary::BinaryValidLevel (const char *value, ErrorDescriptor *err,
int optional, char *tokenList,
int needDelims, int clearError)
{
G4std::istrstream in((char *)value);
return BinaryValidLevel (in, err, optional, tokenList,
needDelims, clearError);
}