home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d5xx
/
d583
/
aroff.lha
/
ARoff
/
Sources
/
fichiers.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-01-04
|
6KB
|
254 lines
/*
* Fonctions d'acces aux fichiers
* (c)1991 par Denis GOUNELLE
*/
#include "aroff.h"
#include "pile.h"
extern struct TeteListe TMac ;
extern struct Macro *CurrentMacro ;
extern struct String *CurrentString ;
extern unsigned char OutputBuf[], Arg[] ;
extern struct InputFile *CurrentInputFile ;
extern long InputMode, OutputLen, TmpLineLen, ArgLen, Flg, EmptyToWrite ;
/***********************************************************************/
static long GetFromMac()
{
register unsigned long c ;
register struct Macro *m ;
m = CurrentMacro ;
if ( (m->m_NextL) && (m->m_NextC >= m->m_NextL->ml_Len) )
{
m->m_NextC = 0 ;
m->m_NextL = (struct MLine *)m->m_NextL->ml_Node.el_Suivant ;
return( '\n' ) ;
}
if ( m->m_NextL )
{
c = m->m_NextL->ml_Text[m->m_NextC] ;
m->m_NextC++ ;
return( c ) ;
}
return( EOF ) ;
}
/***********************************************************************/
long GetChar()
{
char *p ;
struct InputFile *f ;
register unsigned long c ;
register struct Macro *m ;
register struct String *s ;
_restart:
if ( InputMode & IM_EXMACRO )
{
for (;;)
{
c = GetFromMac() ;
if ( c != EOF ) return( c ) ;
BCLR( Flg , F_TRAP ) ;
InputMode = Pop( TE_INMODE , 1 ) ;
if ( InputMode & IM_STRING )
{
s = (struct String *)Pop( TE_STRING , 1 ) ;
CurrentString = s ;
}
if (! (InputMode & IM_EXMACRO)) break ;
m = (struct Macro *)Pop( TE_MACRO , 1 ) ;
CurrentMacro = m ;
if ( m->m_Flag & MF_TRAP ) BSET( Flg , F_TRAP ) ;
if ( m->m_Flag & MF_WAIT )
{
BCLR( m->m_Flag , MF_WAIT ) ;
p = (char *)Pop( TE_OUTLINE , 1 ) ;
c = Pop( TE_TOWRITE , 0 ) ;
if ( c != -1 ) EmptyToWrite = c ;
LigneSuiv( p ) ;
free( p ) ;
}
}
while (! (Flg & F_TRAP))
{
p = (char *)Pop( TE_OUTLINE , 0 ) ;
if ( (! p) || (p == (char *)-1) ) break ;
c = Pop( TE_TOWRITE , 0 ) ;
if ( c != -1 ) EmptyToWrite = c ;
LigneSuiv( p ) ;
free( p ) ;
}
if ( Flg & F_TRAP ) goto _restart ;
BCLR( InputMode , IM_EXMACRO ) ;
CurrentMacro = NULL ;
}
if ( InputMode & IM_STRING )
{
s = CurrentString ;
if ( s->s_pos >= s->s_len )
{
free( s ) ;
InputMode = Pop( TE_INMODE , 1 ) ;
if ( InputMode & IM_STRING )
{
s = (struct String *)Pop( TE_STRING , 1 ) ;
CurrentString = s ;
}
else if ( InputMode & IM_EXMACRO )
{
m = (struct Macro *)Pop( TE_MACRO , 1 ) ;
CurrentMacro = m ;
}
goto _restart ;
}
c = s->s_val[s->s_pos] ;
s->s_pos++ ;
return( c ) ;
}
f = CurrentInputFile ;
/* si fin du tampon, lit LGMAXBUF octets dans le fichier */
if ( f->if_NextC >= f->if_BufLen )
{
if ( f->if_Flag & IFF_LOADED ) return( EOF ) ;
f->if_NextC = 0 ;
f->if_BufLen = read( f->if_Desc , f->if_Buf , LGMAXBUF ) ;
if (f->if_BufLen == -1 ) Fatal( ERR_READ ) ;
if (! f->if_BufLen) return( EOF ) ;
}
/* lecture normale */
c = f->if_Buf[f->if_NextC] ;
f->if_NextC++ ;
return( c ) ;
}
/***********************************************************************/
long PutChar( c )
unsigned char c ;
{
register struct MLine *l ;
if ( InputMode & IM_RDMACRO )
{
if ( c == '\n' ) CurrentMacro->m_NextL = NULL ;
l = CurrentMacro->m_NextL ;
if ( ! l )
{
l = (struct MLine *)myalloc( sizeof(struct MLine) , 1 ) ;
InsereQueue( &(CurrentMacro->m_Def) , l ) ;
CurrentMacro->m_NextL = l ;
CurrentMacro->m_NextC = 0 ;
}
if ( c == '\n' ) return( 0 ) ;
if ( l->ml_Len >= LGMAXSTR ) Fatal( ERR_OVERFLOW ) ;
l->ml_Text[l->ml_Len] = c ;
l->ml_Len++ ;
return( 0 ) ;
}
if ( InputMode & IM_RDARGS )
{
if ( ArgLen >= LGMAXSTR ) Fatal( ERR_OVERFLOW ) ;
Arg[ArgLen] = c ;
ArgLen++ ;
return( 0 ) ;
}
if ( OutputLen >= LGMAXBUF ) Fatal( ERR_OVERFLOW ) ;
OutputBuf[OutputLen] = c ;
OutputLen++ ;
return( OutputLen > TmpLineLen ) ;
}
/***********************************************************************/
struct InputFile *NewFile( name )
char *name ;
{
long lg ;
struct InputFile *f ;
f = (struct InputFile *)myalloc( sizeof(struct InputFile) , 1 ) ;
if (! strcmp( name , "-" ))
{
f->if_Desc = 0 ;
f->if_Name = "stdin" ;
BSET( f->if_Flag , IFF_STDIN ) ;
}
else
{
f->if_Name = (char *)myalloc( strlen(name)+1 ) ;
strcpy( f->if_Name , name ) ;
f->if_Desc = open( name , O_RDONLY ) ;
}
if ( f->if_Desc == -1 ) Fatal( ERR_OPEN ) ;
/* charge le fichier en memoire */
if ( Flg & F_LOADED )
{
lg = lseek( f->if_Desc , 0 , 2 ) ;
if ( lg < 1 ) Fatal( ERR_EMPTY ) ;
if ( lg == -1 ) Fatal( ERR_SEEK ) ;
if ( lseek( f->if_Desc , 0 , 0 ) == -1 ) Fatal( ERR_SEEK ) ;
f->if_Buf = (unsigned char *)myalloc( lg , 0 ) ;
f->if_BufLen = lg ;
if ( read( f->if_Desc , f->if_Buf , lg ) != lg ) Fatal( ERR_READ ) ;
close( f->if_Desc ) ;
BSET( f->if_Flag , IFF_LOADED ) ;
}
else f->if_Buf = (unsigned char *)myalloc( LGMAXBUF , 0 ) ;
f->if_Line = 1 ;
return( f ) ;
}
/**************************************************************************/
void CloseFile( f )
struct InputFile *f ;
{
if ( (f != NULL) &&
(f != (struct InputFile *)-1) &&
(f->if_Desc > 0) )
{
if ( f->if_Buf ) free( f->if_Buf ) ;
if ( f->if_Flag & (IFF_STDIN|IFF_LOADED) ) return ;
close( f->if_Desc ) ;
free( f->if_Name ) ;
f->if_Desc = -1 ;
}
}