home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d5xx
/
d583
/
aroff.lha
/
ARoff
/
Sources
/
cmd.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-01-04
|
16KB
|
732 lines
/*
* Commandes nroff
* (c)1991 par Denis GOUNELLE
*/
#include "aroff.h"
#include "pile.h"
extern unsigned char *TestString(), *TestNum() ;
extern unsigned char Arg[], OutputBuf[], TabChar, *GetArg(), TitleSeq[] ;
extern long ArgLen, OutputLen, AdjustMode, PageNumber, InputMode, LineLen,
Indent, TitleLen, Flg, TmpIndent, PageOffset, PageLen, LineSpacing,
TabLen, TmpCenter, LineNumber, NumInterv, NumSpace, NumIndent,
TmpNoNum, OldInputMode, OutputLine, EmptyToWrite, FindTrp(),
NewPageNumber, CtrlLen ;
extern struct InputFile *CurrentInputFile, *NewFile() ;
extern struct Macro *CurrentMacro ;
extern struct TeteListe TMac ;
extern struct Node *FindVar() ;
static unsigned char tmp[LGMAXSTR+1], TrTab[LGMAXSTR+1] = "" ;
static char *TableEsc[] =
{
"\033[22m" , /* b0 */
"\033[1m" , /* b1 */
"\033[23m" , /* i0 */
"\033[3m" , /* i1 */
"\033[24m" , /* u0 */
"\033[4m" , /* u1 */
"\033[0m" /* n */
} ;
/***********************************************************************/
void do_br()
{
if ( Flg & F_NOBRK ) return ;
if ( OutputLen )
{
if ( AdjustMode != AM_BOTH ) AdjustLine() ;
WriteLine() ;
}
}
/***********************************************************************/
void do_tm()
{
if ( ArgLen > 0 )
{
write( 2 , Arg , ArgLen ) ;
write( 2 , "\n" , 1 ) ;
}
}
/***********************************************************************/
void do_ab()
{
do_tm() ;
Abort( 1 ) ;
}
/***********************************************************************/
void do_ad()
{
long oldmode ;
unsigned char c ;
c = Arg[0] ;
oldmode = AdjustMode ;
switch ( c )
{
case 'c' : AdjustMode = AM_CENTER ; break ;
case 'l' : AdjustMode = AM_LEFT ; break ;
case 'r' : AdjustMode = AM_RIGHT ; break ;
case 'b' : AdjustMode = AM_BOTH ; break ;
case '\0' : AdjustMode = Pop( TE_ADJMOD , 0 ) ;
if ( AdjustMode == -1 ) AdjustMode = AM_BOTH ;
break ;
default : Fatal( ERR_SYNTAX ) ;
}
Push( TE_ADJMOD , oldmode ) ;
}
/***********************************************************************/
void do_am()
{
struct Macro *m ;
if ( InputMode & IM_EXMACRO ) Fatal( ERR_SYNTAX ) ;
if ( ! ArgLen ) return ;
m = (struct Macro *)FindVar( &TMac , Arg ) ;
if ( ! m )
{
SetMac( Arg ) ;
m = CurrentMacro ;
}
m->m_NextL = NULL ;
CurrentMacro = m ;
OldInputMode = InputMode ;
BCLR( InputMode , IM_FILLING ) ;
BSET( InputMode , IM_RDMACRO ) ;
}
/***********************************************************************/
void do_as()
{
register long k ;
register unsigned char *var, *val ;
if ( ! ArgLen ) return ;
/* isole le nom de la chaine */
var = Arg ;
for ( k = 0 ; (Arg[k] != '\0') && (! isspace( Arg[k] )) ; k++ ) ;
if ( Arg[k] == '\0' ) return ;
Arg[k] = '\0' ;
/* recupere la valeur */
for ( k++ ; isspace( Arg[k] ) ; k++ ) ;
if ( Arg[k] == '\0' ) return ;
if ( Arg[k] == '"' ) k++ ;
val = &Arg[k] ;
if ( *val == '\0' ) return ;
/* fabrique la nouvelle valeur */
GetStr( var , tmp ) ;
strcat( tmp , val ) ;
SetStr( var , tmp ) ;
}
/***********************************************************************/
void do_bp()
{
do_br() ;
if ( OutputLine > 1 ) EmptyToWrite += PageLen - OutputLine + 1 ;
if ( isdigit( Arg[0] ) ) NewPageNumber = atoi( Arg ) ;
if (! (Flg & F_SORTIE)) ChangePageNumber( NewPageNumber ) ;
}
/***********************************************************************/
void do_ce()
{
do_br() ;
TmpCenter = ( isdigit( Arg[0] ) ) ? atoi( Arg ) : 1 ;
}
/***********************************************************************/
void do_de()
{
if ( InputMode & IM_EXMACRO ) Fatal( ERR_SYNTAX ) ;
if ( ! ArgLen ) return ;
SetMac( Arg ) ;
OldInputMode = InputMode ;
BCLR( InputMode , IM_FILLING ) ;
BSET( InputMode , IM_RDMACRO ) ;
}
/***********************************************************************/
void do_ds()
{
register long k ;
register unsigned char *var, *val ;
if ( ! ArgLen ) return ;
/* isole le nom de la chaine */
var = Arg ;
for ( k = 0 ; (Arg[k] != '\0') && (! isspace( Arg[k] )) ; k++ ) ;
if ( Arg[k] == '\0' ) return ;
Arg[k] = '\0' ;
/* recupere la valeur */
for ( k++ ; isspace( Arg[k] ) ; k++ ) ;
if ( Arg[k] == '\0' ) return ;
if ( Arg[k] == '"' ) k++ ;
val = &Arg[k] ;
if ( *val == '\0' ) return ;
SetStr( var , val ) ;
}
/***********************************************************************/
void do_el()
{
if (! (Flg & F_WASIF)) Fatal( ERR_IFELSE ) ;
if (! ArgLen) Fatal( ERR_SYNTAX ) ;
if ( Flg & F_WASFALSE )
{
sprintf( tmp , "%s\n" , Arg ) ;
NewString( tmp ) ;
}
}
/***********************************************************************/
void do_ex()
{
Abort( 1 ) ;
}
/***********************************************************************/
void do_fi()
{
do_br() ;
BSET( InputMode , IM_FILLING ) ;
}
/***********************************************************************/
void do_fl( str )
unsigned char *str ;
{
register long k,l ;
register unsigned char *p, *q ;
k = strlen( str ) ;
if ( k < 1 ) Fatal( ERR_WRITE ) ;
for ( q = str ; *q ; q++ )
{
if ( *q == SC_FIXSPC ) *q = ' ' ;
for ( l = 0 ; TrTab[l] ; l += 2 ) /* do translation */
if ( *q == TrTab[l] )
{
*q = TrTab[l+1] ;
break ;
}
}
write( 1 , str , k ) ;
}
/***********************************************************************/
void do_fs()
{
register long k ;
register unsigned char *p, *q ;
if ( ! ArgLen ) return ;
for ( p = Arg ; *p ; p++ )
{
switch ( *p )
{
case 'b' : k = 0 ; break ;
case 'i' : k = 2 ; break ;
case 'u' : k = 4 ; break ;
case 'n' : k = 6 ; break ;
default : Fatal( ERR_SYNTAX ) ; break ;
}
if ( k != 6 )
{
p++ ;
if ( *p == '1' ) k++ ;
else if ( *p != '0' ) Fatal( ERR_SYNTAX ) ;
}
for ( q = TableEsc[k] ; *q ; q++ )
{
CtrlLen++ ;
PutChar( *q ) ;
}
}
BSET( Flg , F_CONTINUE ) ;
}
/***********************************************************************/
void do_if()
{
register unsigned char *p ;
if (! ArgLen) Fatal( ERR_SYNTAX ) ;
p = Arg ;
BSET( Flg , F_WASIF ) ;
BCLR( Flg , (F_IFNOT|F_WASFALSE) ) ;
if ( *p == '!' )
{
BSET( Flg , F_IFNOT ) ;
p++ ;
while ( isspace(*p) ) p++ ;
}
switch ( *p )
{
case 'e' : if ( PageNumber & 1 ) BSET( Flg , F_WASFALSE ) ; p++ ; break ;
case 'o' : if (! (PageNumber & 1)) BSET( Flg , F_WASFALSE ) ; p++ ; break ;
case 'n' : p++ ; break ;
case 't' : BSET( Flg , F_WASFALSE ) ; p++ ; break ;
case '\'' : p = TestString( p ) ; break ;
default : if (! isdigit(*p)) Fatal( ERR_SYNTAX ) ;
p = TestNum( p ) ; break ;
break ;
}
if ( Flg & F_IFNOT )
if ( Flg & F_WASFALSE )
BCLR( Flg , F_WASFALSE ) ;
else
BSET( Flg , F_WASFALSE ) ;
while ( isspace(*p) ) p++ ;
if (! *p) Fatal( ERR_SYNTAX ) ;
sprintf( tmp , "%s\n\\\n" , p ) ;
if (! (Flg & F_WASFALSE)) NewString( tmp ) ;
}
/***********************************************************************/
void do_in()
{
long oldval ;
do_br() ;
oldval = Indent ;
if (! ChangeValue( &Indent )) Indent = Pop( TE_INDENT , 0 ) ;
if ( Indent < 0 ) Indent = DEF_INDENT ;
Push( TE_INDENT , oldval ) ;
}
/***********************************************************************/
void do_ll()
{
long oldval ;
oldval = LineLen ;
if (! ChangeValue( &LineLen )) LineLen = Pop( TE_LINLEN , 0 ) ;
if ( LineLen < 0 ) LineLen = DEF_LINLEN ;
Push( TE_LINLEN , oldval ) ;
}
/***********************************************************************/
void do_ls()
{
long oldval ;
oldval = LineSpacing ;
if (! (LineSpacing = atoi( Arg ))) LineSpacing = Pop( TE_LINSPC , 0 ) ;
if ( LineSpacing < 1 ) LineSpacing = DEF_LINSPC ;
Push( TE_LINSPC , oldval ) ;
}
/***********************************************************************/
void do_lt()
{
long oldval ;
oldval = TitleLen ;
if (! ChangeValue( &TitleLen )) TitleLen = Pop( TE_TITLEN , 0 ) ;
if ( TitleLen < 0 ) TitleLen = DEF_TITLEN ;
Push( TE_TITLEN , oldval ) ;
}
/***********************************************************************/
void do_na()
{
Push( TE_ADJMOD , AdjustMode ) ;
AdjustMode = AM_LEFT ;
}
/***********************************************************************/
void do_ne()
{
register long k, l ;
if ( ! ArgLen ) return ;
k = OutputLine + (( isdigit( Arg[0] ) ) ? atoi( Arg ) : 1) - 1 ;
if ( k > PageLen )
{
_do_it:
*Arg = '\0' ;
ArgLen = 0 ;
do_bp() ;
return ;
}
for ( l = OutputLine ; l <= k ; l++ )
if ( FindTrp( l ) ) goto _do_it ;
}
/***********************************************************************/
void do_nf()
{
do_br() ;
BCLR( InputMode , IM_FILLING ) ;
}
/***********************************************************************/
void do_nm()
{
unsigned char *p ;
if (! ArgLen)
{
BCLR( Flg , F_NUMBER ) ;
return ;
}
BSET( Flg , F_NUMBER ) ;
ChangeValue( &LineNumber ) ;
for ( p = Arg ; (*p != '\0') && (! isspace( *p )) ; p++ ) ;
p = GetArg( p , &NumInterv ) ;
if (! NumInterv) Fatal( ERR_SYNTAX ) ;
p = GetArg( p , &NumSpace ) ;
GetArg( p , &NumIndent ) ;
}
/***********************************************************************/
void do_nn()
{
TmpNoNum = ( isdigit( Arg[0] ) ) ? atoi( Arg ) : 1 ;
}
/***********************************************************************/
void do_nr()
{
register long k, val, inc ;
register unsigned char *var ;
if ( ! ArgLen ) return ;
/* isole le nom du registre */
var = Arg ;
for ( k = 0 ; (Arg[k] != '\0') && (! isspace( Arg[k] )) ; k++ ) ;
if ( Arg[k] == '\0' ) return ;
Arg[k] = '\0' ;
/* recupere la valeur initiale */
for ( k++ ; isspace( Arg[k] ) ; k++ ) ;
val = atoi( &Arg[k] ) ;
/* recupere l'increment */
while ( isdigit( Arg[k] ) ) k++ ;
while ( isspace( Arg[k] ) ) k++ ;
inc = atoi( &Arg[k] ) ;
SetReg( var , val , inc ) ;
}
/***********************************************************************/
void do_pl()
{
if (! ChangeValue( &PageLen )) PageLen = DEF_PAGLEN ;
UpdateTrp() ;
}
/***********************************************************************/
void do_pm()
{
register struct Macro *m ;
register struct MLine *l ;
m = (struct Macro *) (( ArgLen ) ? FindVar( &TMac , Arg ) : NULL) ;
if ( m )
for ( l = (struct MLine *)m->m_Def.tl_Premier ;
l ;
l = (struct MLine *)l->ml_Node.el_Suivant )
{
write( 1 , l->ml_Text , l->ml_Len ) ;
write( 1 , "\n" , 1 ) ;
}
else for ( m = (struct Macro *)TMac.tl_Premier ;
m ;
m = (struct Macro *)m->m_Node.el_Suivant )
{
printf( "Macro %s : \n" , m->m_Name ) ;
fflush( stdout ) ;
for ( l = (struct MLine *)m->m_Def.tl_Premier ;
l ;
l = (struct MLine *)l->ml_Node.el_Suivant )
{
write( 1 , l->ml_Text , l->ml_Len ) ;
write( 1 , "\n" , 1 ) ;
}
}
}
/***********************************************************************/
void do_pn()
{
long oldval ;
oldval = PageNumber ;
if (! ChangeValue( &oldval )) return ;
if ( oldval > 1 ) NewPageNumber = oldval ;
}
/***********************************************************************/
void do_po()
{
long oldval ;
oldval = PageOffset ;
if (! ChangeValue( &PageOffset )) PageOffset = Pop( TE_PAGOFS , 0 ) ;
if ( PageOffset < 0 ) PageOffset = DEF_PAGOFS ;
Push( TE_PAGOFS , oldval ) ;
}
/***********************************************************************/
void do_rm()
{
if ( ArgLen ) RemMac( Arg ) ;
}
/***********************************************************************/
void do_rr()
{
if ( ArgLen ) RemReg( Arg ) ;
}
/***********************************************************************/
void do_rs()
{
if ( ArgLen ) RemStr( Arg ) ;
}
/***********************************************************************/
void do_rt()
{
long lig, k ;
if (! ArgLen) return ;
lig = 0 ;
if (! ChangeValue( &lig )) return ;
RemTrp( lig ) ;
}
/***********************************************************************/
void do_so()
{
if ( ! ArgLen ) Fatal( ERR_SYNTAX ) ;
Push( TE_INFILE , CurrentInputFile ) ;
CurrentInputFile = NewFile( Arg ) ;
if ( CurrentInputFile ) SetStr( "fn" , CurrentInputFile->if_Name ) ;
}
/***********************************************************************/
void do_sp()
{
do_br() ;
EmptyToWrite += ( isdigit( Arg[0] ) ) ? atoi( Arg ) : 1 ;
}
/***********************************************************************/
void do_ta()
{
long oldval ;
oldval = TabLen ;
if (! ChangeValue( &TabLen )) TabLen = oldval ;
}
/***********************************************************************/
void do_tc()
{
TabChar = ( Arg[0] == '\0' ) ? DEF_TABCHR : Arg[0] ;
}
/***********************************************************************/
void do_ti()
{
do_br() ;
TmpIndent = myatoi() ;
BCLR( Flg , F_NOTI ) ;
}
/***********************************************************************/
void do_tl()
{
long i ;
register long k, l ;
unsigned char *centre, *droit ;
register unsigned char delim, *gauche, *p ;
if ( ! ArgLen ) return ;
/* recupere les trois morceaux */
delim = Arg[0] ;
gauche = &Arg[1] ;
while ( (*gauche != delim) && (*gauche != '\0') ) gauche++ ;
if ( *gauche == '\0' ) Fatal( ERR_SYNTAX ) ;
*gauche = '\0' ;
gauche++ ;
centre = gauche ;
while ( (*gauche != delim) && (*gauche != '\0') ) gauche++ ;
if ( *gauche == '\0' ) Fatal( ERR_SYNTAX ) ;
*gauche = '\0' ;
gauche++ ;
droit = gauche ;
while ( (*gauche != delim) && (*gauche != '\0') ) gauche++ ;
if ( *gauche == '\0' ) Fatal( ERR_SYNTAX ) ;
*gauche = '\0' ;
gauche = &Arg[1] ;
/* calcule l'intervalle et pond le resultat */
p = tmp ;
i = TitleLen - strlen( centre ) ;
k = i >> 1 ;
for ( l = 0 ; l < PageOffset ; l++ , p++ ) *p = ' ' ;
if ( k > 0 )
{
strcpy( p , TableEsc[6] ) ; /* repasse en normal */
while ( *p ) p++ ;
for ( l = 0 ; TitleSeq[l] ; l++ )
{
switch( TitleSeq[l] )
{
case 'b' : strcpy( p , TableEsc[1] ) ; break ;
case 'i' : strcpy( p , TableEsc[3] ) ; break ;
case 'u' : strcpy( p , TableEsc[5] ) ; break ;
default : Fatal( ERR_SYNTAX ) ;
}
while ( *p ) p++ ;
}
strcpy( p , gauche ) ;
l = strlen( gauche ) ;
p += l ;
if ( i & 1 ) l-- ;
for ( l = k - l ; l > 0 ; l-- , p++ ) *p = ' ' ;
strcpy( p , centre ) ;
p += strlen( centre ) ;
for ( l = k - strlen( droit ) ; l > 0 ; l-- , p++ ) *p = ' ' ;
strcpy( p , droit ) ;
p += strlen( droit ) ;
}
strcpy( p , TableEsc[6] ) ; /* repasse en normal */
strcat( p , "\n" ) ;
EmptyToWrite += LineSpacing - 1 ;
LigneSuiv( tmp ) ;
}
/***********************************************************************/
void do_tr()
{
if (! ArgLen) return ;
strcpy( TrTab , Arg ) ;
if ( ArgLen & 1 ) strcat( TrTab , " " ) ;
}
/***********************************************************************/
void do_ts()
{
if ( ! ArgLen ) return ;
strcpy( TitleSeq , Arg ) ;
}
/***********************************************************************/
void do_wh()
{
long lig, k ;
unsigned char *p ;
if (! ArgLen) return ;
lig = 0 ;
if (! ChangeValue( &lig )) return ;
for ( p = Arg ; (*p) && (! isspace( *p )) ; p++ ) ;
while ( isspace( *p ) ) p++ ;
k = strlen( p ) ;
if ( (k != 1) && (k != 2) ) Fatal( ERR_SYNTAX ) ;
SetTrp( lig , p ) ;
}