/*
....[@@@..[@@@..............[@.................. MUD++ is a written from
....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and
....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++.
....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing
....[@......[@..[@@@@@..[@@@@@.................. development project. All
................................................ contributions are welcome.
....Copyright(C).1995.Melvin.Smith.............. Enjoy.
------------------------------------------------------------------------------
Melvin Smith (aka Fusion) msmith@falcon.mercer.peachnet.edu
MUD++ development mailing list mudpp-list@spice.com
------------------------------------------------------------------------------
file.cc
*/
#include "file.h"
void error( char * );
void InFile::error( const char * str )
{
Cout << fname << ':' << getLineNo() << ": " << str << endl;
exit(0);
}
char *InFile::getstring( char *buf )
{
char *ch = buf;
// Dont have to check eof() here, get returns 0 if EOF which isn't space
while( isspace( get( *ch ) ) )
;
if( eof() )
{
*buf = '\0';
return buf;
}
if( *ch == TERM_CHAR )
{
*ch = '\0';
return buf;
}
ch++;
while( !eof() && ( get( *ch ) != TERM_CHAR ) )
ch++;
if( eof() && *ch != TERM_CHAR )
error( "getstring: TERM_CHAR not found - unexpected end of file");
*ch = '\0';
return buf;
}
int InFile::getnum()
{
char buf[256];
char *ch = buf;
// Dont have to check eof() here, get returns 0 if EOF which isn't space
while( isspace( get( *ch ) ) )
;
if( eof() )
{
*(++ch) = '\0';
return atoi( buf );
}
if( !isdigit( *ch ) && *ch != '-' && *ch != '+' )
{
*(++ch) = '\0';
printf( "buf so far =[%s]\n", buf );
error("InFile::getnum.1() - non-numeric character");
}
while( isdigit( get( *(++ch) ) ) )
;
if( !eof() )
putback();
if( !eof() )
while( isspace( get( *ch ) ) )
if( *ch == '\n' )
break;
if( *ch != '\n' )
putback();
*ch = '\0';
return atoi( buf );
}
unsigned long InFile::getlong()
{
char buf[256];
char *ch = buf;
// Dont have to check eof() here, get returns 0 if EOF which isn't space
while( isspace( get( *ch ) ) )
;
if( !isdigit( *ch ) && *ch != '-' && *ch != '+' )
{
*(++ch) = '\0';
printf( "buf so far =[%s]\n", buf );
error("InFile::getnum.1() - non-numeric character");
}
while( isdigit( get( *(++ch) ) ) )
;
if( !eof() )
putback();
if( !eof() )
while( isspace( get( *ch ) ) )
if( *ch == '\n' )
break;
if( *ch != '\n' )
putback();
*ch = '\0';
return atol( buf );
}
// For my database scheme the chars '{', '}', '#', ';' are
// considered words. getword treats them that way
// getstring does not, using '~` to end strings
// This is mainly for multiline strings.
char *InFile::getword ( char *buf )
{
char *ch = buf;
// Dont have to check eof() here, get returns 0 if EOF which isn't space
while( isspace( get( *ch ) ) )
;
if( *ch == '{' || *ch == '}' || *ch == '#' || *ch == ';' )
{
*(ch+1) = '\0';
return buf;
}
while( !eof() && !isspace( get( *++ch ) ) )
if( *ch == '{' || *ch == '}' )
{
putback();
break;
}
*ch = '\0';
return buf;
}
// Bit fields are written in file in the following format:
//
// <number of fields N> <field 1> <field2> ... <fieldN>
//
void InFile::getbitfield( unsigned long * field )
{
int fields = getnum();
for( int i = 0; i < fields; i++ )
{
field[i] = getlong();
}
}