/
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 <errno.h>

#include "embc.h"


/*
 * Globals
 */
char *                                                      pCOFilename;
long                                                       lCurrentLine;


/*
 * Functions
 */
FILE *open_file( char *pFilename, char *pFlags )
{
    FILE *pFile;

    if ( ( pFile = fopen( pFilename, pFlags ) ) == NULL )
        fatal( "%s: %s.", pFilename, strerror( errno ) );

    pCOFilename  = str_dup( pFilename );
    lCurrentLine = 1;

    return ( pFile );
}


void close_file( FILE *pFile )
{
    if ( fclose( pFile ) != 0 )
        error( "%s: %s.", pCOFilename, strerror( errno ) );

    str_free( pCOFilename );
}


/*
 * Get one letter from a file.
 */
char fget_letter( FILE *pFile )
{
    char c = '\0';

    do
    {
        if ( feof( pFile ) != 0 )
            break;

        if ( ( c = getc( pFile ) ) == '\n' )
            lCurrentLine++;
    }
    while ( isspace( c ) != 0 );

    return ( c );
}


char *fget_word( FILE *pFile )
{
    static char cOutput[MAX_INPUT];
    char c        = '\0';
    int i;

    do
    {
        if ( ( c = getc( pFile ) ) == EOF )
            break;

        if ( c == '\n' )
            lCurrentLine++;
    }
    while ( isspace( c ) != 0 );

    for ( i = 0; isspace( c ) == 0; i++ )
    {
        if ( i >= ( MAX_INPUT - 1 ) )
        {
            error( "Word too long." );
            return ( EMPTY_STRING );
        }

        cOutput[i] = c;

        if ( ( c = getc( pFile ) ) == EOF )
            break;

        if ( c == '\n' )
            lCurrentLine++;
    }

    cOutput[i]     = '\0';

    return ( cOutput );
}


char *fget_string( FILE *pFile )
{
    static char cOutput[MAX_STRING];
    char c[2]      = { '\0', '\0' };
    int i;

    do
    {
        if ( ( c[0] = getc( pFile ) ) == EOF )
        {
            error( "Unexpected EOF." );
            return ( EMPTY_STRING );
        }

        if ( c[0] == '\n' )
            lCurrentLine++;
    }
    while ( isspace( c[0] ) );

    if ( c[0] != '"' )
    {
        error( "Symbol `\"' not found." );
        return ( EMPTY_STRING );
    }

    c[0]               = getc( pFile );

    if ( c[0] == '\n' )
        lCurrentLine++;

    if ( c[0] == '"' )
        return ( EMPTY_STRING );

    for ( i = 0; ; i++ )
    {
        if ( i >= ( MAX_STRING - 1 ) )
        {
            error( "String too long." );
            return ( EMPTY_STRING );
        }

        if ( feof( pFile ) != 0 )
        {
            error( "Unexpected EOF." );
            return ( EMPTY_STRING );
        }

        if ( c[0] == '\\' )
        {
            switch ( ( c[0] = getc( pFile ) ) )
            {
              case EOF :
                  error( "Unexpected EOF." );
                  return ( EMPTY_STRING );

              case '\\': cOutput[i] = '\\'; break;
              case '"' : cOutput[i] = '"';  break;
              case 'n' : cOutput[i] = '\n'; break;
              case 'r' : cOutput[i] = '\r'; break;
              case 't' : cOutput[i] = '\t'; break;
              case 'a' : cOutput[i] = '\a'; break;
              default  :
                  error( "Unknown escape '\\%s'.", c );
                  break;
            }
        }
        else if ( c[0] != '\n' && c[0] != '\r' && c[0] != '\t' )
            cOutput[i] = c[0];
        else
            i--;

        c[0]           = getc( pFile );

        if ( c[0] == '\n' )
            lCurrentLine++;

        if ( c[0] == '"' )
            break;
    }

    cOutput[i + 1]     = '\0';

    return ( cOutput );
}


/*
 * End of fileio.c
 */