99 lines
2.4 KiB
Plaintext
99 lines
2.4 KiB
Plaintext
// Filename: chanparse.I
|
|
// Created by: cary (06Feb99)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
#include <notify.h>
|
|
|
|
INLINE void ChanEatFrontWhite(std::string& S) {
|
|
int i = S.find_first_not_of(" \t\r\f\n");
|
|
if ((i != std::string::npos) && (i != 0))
|
|
S.erase(0, i);
|
|
}
|
|
|
|
INLINE void ChanCheckScoping(std::string& S) {
|
|
if (S[0] != '(') {
|
|
// error, unscoped text usually indicates a problem
|
|
nout << "error, '" << S << "' does not start with a (" << endl;
|
|
S.erase(0, S.find_first_of("("));
|
|
}
|
|
}
|
|
|
|
INLINE void ChanDescope(std::string& S) {
|
|
int i = ChanMatchingParen(S);
|
|
nassertv(i != -1);
|
|
S = S.substr(1, i-2);
|
|
ChanEatFrontWhite(S);
|
|
}
|
|
|
|
INLINE std::string ChanReadNextWord(std::string& S) {
|
|
int i = S.find_first_of(" \t\r\f\n");
|
|
std::string stmp = S.substr(0, i);
|
|
S.erase(0, i);
|
|
ChanEatFrontWhite(S);
|
|
return stmp;
|
|
}
|
|
|
|
INLINE int ChanReadNextInt(std::string& S) {
|
|
int i = S.find_first_of(" \t\r\f\n");
|
|
std::string stmp = S.substr(0, i);
|
|
S.erase(0, i);
|
|
ChanEatFrontWhite(S);
|
|
istringstream st(stmp.c_str());
|
|
st >> i;
|
|
return i;
|
|
}
|
|
|
|
INLINE bool ChanReadNextBool(std::string& S) {
|
|
int i = S.find_first_of(" \t\r\f\n");
|
|
std::string stmp = S.substr(0, i);
|
|
S.erase(0, i);
|
|
ChanEatFrontWhite(S);
|
|
bool ret = false;
|
|
if ((stmp.length() != 2) || (stmp[0] != '#')) {
|
|
// error, this isn't gonna be either #t or #f
|
|
nout << "error, '" << stmp << "' is not either #t or #f" << endl;
|
|
ret = false;
|
|
}
|
|
if (stmp[1] == 't')
|
|
ret = true;
|
|
else if (stmp[1] != 'f') {
|
|
// error this isn't either #t or #f
|
|
nout << "error, '" << stmp << "' is not either #t or #f" << endl;
|
|
ret = false;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// #f or int
|
|
INLINE int ChanReadNextIntB(std::string& S) {
|
|
int i = S.find_first_of(" \t\r\f\n");
|
|
std::string stmp = S.substr(0, i);
|
|
S.erase(0, i);
|
|
ChanEatFrontWhite(S);
|
|
i = -1;
|
|
if (stmp[0] == '#')
|
|
if ((stmp.length() != 2)||(stmp[1] != 'f')) {
|
|
// error, not #f.. #t is not allowed in this case
|
|
nout << "error, '" << stmp << "' is not allowed, only #f or an int"
|
|
<< endl;
|
|
i = -1;
|
|
}
|
|
else {
|
|
istringstream st(stmp.c_str());
|
|
st >> i;
|
|
}
|
|
return i;
|
|
}
|
|
|
|
INLINE float ChanReadNextFloat(std::string& S) {
|
|
int i = S.find_first_of(" \t\r\f\n");
|
|
std::string stmp = S.substr(0, i);
|
|
S.erase(0, i);
|
|
ChanEatFrontWhite(S);
|
|
istringstream st(stmp.c_str());
|
|
float ret;
|
|
st >> ret;
|
|
return ret;
|
|
}
|