/*
* Copyright (C) 1995-1997 Christopher D. Granz
*
* This header may not be removed.
*
* Refer to the file "License" included in this package for further
* information and before using any of the following.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h>
#include "areacon.h"
/*
* Globals
*/
extern char cNullChar;
/*
* Functions
*/
/*
* Gets one letter from a file.
*/
char fget_letter( FILE *pFile )
{
char c;
do
{
if ( feof( pFile ) )
{
error( "Unexpected EOF." );
return ( '\0' );
}
c = getc( pFile );
}
while ( isspace( c ) != 0 );
return ( c );
}
/*
* Gets one word (terminated by a space) from a file.
*/
char *fget_word( FILE *pFile )
{
static char cOutput[MAX_STRING];
char c = '\0';
int i;
do
{
if ( feof( pFile ) != 0 )
break;
c = getc( pFile );
}
while ( isspace( c ) != 0 );
for ( i = 0; isspace( c ) == 0; i++ )
{
if ( i >= ( MAX_INPUT - 1 ) )
{
error( "Word too long." );
return ( EMPTY_STRING );
}
if ( feof( pFile ) != 0 )
break;
cOutput[i] = c;
c = getc( pFile );
}
cOutput[i] = '\0';
return ( cOutput );
}
void fput_string( FILE *pFile, char *pFormat, ... )
{
va_list pArgs;
char cBuf[MAX_STRING];
int i;
va_start( pArgs, pFormat );
#ifdef _sysBSD
vsnprintf( cBuf, MAX_STRING, pFormat, pArgs );
#else
vsprintf( cBuf, pFormat, pArgs );
#endif
putc( '\"', pFile );
for ( i = 0; cBuf[i] != '\0'; i++ )
{
switch ( cBuf[i] )
{
case '\\': putc( '\\', pFile ); putc( '\\', pFile ); break;
case '"' : putc( '\\', pFile ); putc( '"', pFile ); break;
case '\n':
putc( '\\', pFile );
putc( 'n', pFile );
if ( cBuf[i + 1] != '\r' )
putc( '\n', pFile );
break;
case '\r':
putc( '\\', pFile );
putc( 'r', pFile );
if ( i > 0 && cBuf[i - 1] == '\n' )
putc( '\n', pFile );
break;
case '\t': putc( '\\', pFile ); putc( 't', pFile ); break;
case '\a': putc( '\\', pFile ); putc( 'a', pFile ); break;
default : putc( cBuf[i], pFile ); break;
}
}
putc( '\"', pFile );
va_end( pArgs );
}
char *fget_string( FILE *pFile )
{
static char cOutput[MAX_STRING];
char c[2] = { '\0', '\0' };
int i;
do
{
if ( feof( pFile ) != 0 )
{
error( "Unexpected EOF." );
return ( EMPTY_STRING );
}
c[0] = getc( pFile );
}
while ( isspace( c[0] ) != 0 );
if ( c[0] == '~' )
return ( EMPTY_STRING );
for ( i = 0; c[0] != '~'; i++ )
{
if ( i >= ( MAX_STRING - 1 ) )
{
error( "String too long." );
return ( EMPTY_STRING );
}
if ( feof( pFile ) != 0 )
{
error( "Unexpected EOF." );
return ( EMPTY_STRING );
}
cOutput[i] = c[0];
switch ( c[0] )
{
case '\n': cOutput[++i] = '\r'; break;
default : break;
}
c[0] = getc( pFile );
}
cOutput[i] = '\0';
return ( str_dup( cOutput ) );
}
/*
* Get a string until the end of the line is reached.
*/
char *fget_string_eol( FILE *pFile )
{
static char cOutput[MAX_STRING];
char c[2] = { '\0', '\0' };
int i;
do
{
if ( feof( pFile ) != 0 )
{
error( "Unexpected EOF." );
return ( EMPTY_STRING );
}
c[0] = getc( pFile );
}
while ( c[0] == ' ' );
if ( c[0] == '\n' )
return ( EMPTY_STRING );
for ( i = 0; c[0] != '\n'; i++ )
{
if ( i >= ( MAX_STRING - 1 ) )
{
error( "String too long." );
return ( EMPTY_STRING );
}
if ( feof( pFile ) != 0 )
break;
cOutput[i] = c[0];
c[0] = getc( pFile );
}
cOutput[i] = '\0';
do
{
if ( feof( pFile ) != 0 )
break;
c[0] = getc( pFile );
}
while ( c[0] == '\n' || c[0] == '\r' );
fseek( pFile, -1L, SEEK_CUR );
return ( cOutput );
}
/*
* Gets a number from a file.
*/
long fget_number( FILE *pFile )
{
char cBuf[MAX_INPUT];
char c;
long lOutput;
int i;
bool b = FALSE;
do
{
if ( feof( pFile ) != 0 )
{
error( "Unexpected EOF." );
return ( 0 );
}
c = getc( pFile );
}
while ( isspace( c ) != 0 );
if ( c == '+' )
c = getc( pFile );
else if ( c == '-' )
{
b = TRUE;
c = getc( pFile );
}
for ( i = 0; isdigit( c ); i++ )
{
if ( i >= ( MAX_INPUT - 1 ) )
{
error( "Word too long." );
return ( 0 );
}
if ( feof( pFile ) != 0 )
{
error( "Unexpected EOF." );
return ( 0 );
}
cBuf[i] = c;
c = getc( pFile );
}
cBuf[i] = '\0';
if ( cBuf[0] == '\0' )
{
error( "Number not found." );
return ( 0 );
}
lOutput = atol( cBuf );
return ( ( b == TRUE ? -lOutput : lOutput ) );
}
/*
* (Taken from db.c of ROM2.4)
*/
static long flag_convert( char cLetter )
{
char c;
long lBitSum = 0;
if ( 'A' <= cLetter && cLetter <= 'Z' )
{
lBitSum = 1;
for ( c = cLetter; c > 'A'; c-- )
lBitSum *= 2;
}
else if ( 'a' <= cLetter && cLetter <= 'z' )
{
lBitSum = 67108864; /* 2^26 */
for ( c = cLetter; c > 'a'; c-- )
lBitSum *= 2;
}
return ( lBitSum );
}
/*
* (Taken from db.c of ROM2.4.)
*/
long fget_flags( FILE *pFile )
{
int i;
char c;
bool b = FALSE;
do
{
c = getc( pFile );
}
while ( isspace( c ) != 0 );
if ( c == '-' )
{
b = TRUE;
c = getc( pFile );
}
i = 0;
if ( isdigit( c ) == 0 )
{
while ( ( 'A' <= c && c <= 'Z' ) || ( 'a' <= c && c <= 'z' ) )
{
i += flag_convert( c );
c = getc( pFile );
}
}
while ( isdigit( c ) != 0 )
{
i = ( i * 10 + c - '0' );
c = getc( pFile );
}
if ( c == '|' )
i += fget_flags( pFile );
else if ( c != ' ' )
ungetc( c, pFile );
if ( b == TRUE )
return ( -1 * i );
return ( i );
}
/*
* End of fileio.c
*/