/
Sapphire/bin/
Sapphire/db/
Sapphire/db/OLC_rooms/
Sapphire/db/abi/
Sapphire/db/em_src/
Sapphire/db/helps/
Sapphire/db/helps/emman/ifunc/
Sapphire/db/npcs/Tatt/
Sapphire/db/objects/Tatt/
Sapphire/db/q_data/
Sapphire/db/rooms/Tatt/
Sapphire/doc/
Sapphire/doc/em/
Sapphire/etc/
Sapphire/src/abic/
Sapphire/src/areacon/
Sapphire/src/client/
Sapphire/src/embc/
Sapphire/src/emi/
Sapphire/src/emi/test/
Sapphire/src/include/
Sapphire/src/sapphire/em/
Sapphire/src/tcon/
/*
 * 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
 */