/* * Ajustement des lignes * (c)1991 par Denis GOUNELLE */ #include "aroff.h" #include "pile.h" extern unsigned char OutputBuf[] ; extern long OutputLen, TmpLineLen, AdjustMode, Flg, TmpCenter ; static unsigned char tmp[LGMAXBUF+1] ; /***********************************************************************/ long adjust_b() { long nbr, inc ; register unsigned char *p ; register long k, l, j, NbInt ; if ( Flg & F_BREAKED ) return( 0 ) ; /* calcule le nombre d'intervalles et la taille de la ligne */ j = NbInt = 0 ; p = OutputBuf ; for ( k = 0 ; k < OutputLen ; k++ ) { if ( isspace( *p ) ) { if ( j ) NbInt++ ; j = 0 ; } else j = 1 ; p++ ; } /* calcule le nombre d'espaces a inserer */ if (! NbInt) return( 0 ) ; k = TmpLineLen - OutputLen ; nbr = k / NbInt ; inc = NbInt - (k % NbInt) ; /* effectue l'insertion */ p = tmp ; j = l = 0 ; for ( k = 0 ; k < OutputLen ; k++ ) { if ( isspace( OutputBuf[k] ) ) { if ( j ) { for ( j = 0 ; j < nbr ; j++ , p++ ) *p = ' ' ; l++ ; if ( l == inc ) nbr++ ; } j = 0 ; } else j = 1 ; *p = OutputBuf[k] ; p++ ; } *p = '\0' ; return( 1 ) ; } /***********************************************************************/ long adjust_c() { register long k, l ; register unsigned char *p ; p = OutputBuf ; for ( k = 0 ; k < OutputLen ; k++ , p++ ) if (! isspace( *p )) break ; l = (TmpLineLen - OutputLen + k) >> 1 ; for ( p = tmp ; l > 0 ; l-- , p++ ) *p = ' ' ; for ( ; k < OutputLen ; k++ , p++ ) *p = OutputBuf[k] ; *p = '\0' ; return( 1 ) ; } /***********************************************************************/ long adjust_r() { register long k ; register unsigned char *p ; k = TmpLineLen - OutputLen ; for ( p = tmp ; k > 0 ; k-- , p++ ) *p = ' ' ; for ( k = 0 ; k < OutputLen ; k++ , p++ ) *p = OutputBuf[k] ; *p = '\0' ; return( 1 ) ; } /***********************************************************************/ void AdjustLine() { register long c, l ; /* verifie qu'on ne coupe pas un mot */ if ( OutputLen >= TmpLineLen ) { SauveContexte( 1 ) ; c = GetChar() ; if ( c == EOF ) return ; l = OutputLen-1 ; while ( (! isspace( c )) && (! isspace( OutputBuf[l] )) ) { RestoreContexte( 0 ) ; l = OutputLen-1 ; SauveContexte( 1 ) ; c = GetChar() ; } RestoreContexte( 1 ) ; } /* enleve les espaces en fin de ligne */ l = OutputLen - 1 ; while ( (l > 0) && isspace( OutputBuf[l] ) ) { OutputLen-- ; l-- ; } if (! OutputLen ) return ; /* cadre/centre/justifie */ *tmp = '\0' ; l = ( TmpCenter ) ? AM_CENTER : AdjustMode ; switch ( l ) { case AM_BOTH : c = adjust_b() ; break ; case AM_LEFT : c = 0 ; break ; case AM_RIGHT : c = adjust_r() ; break ; case AM_CENTER : c = adjust_c() ; break ; } if ( c ) { l = strlen( tmp ) ; strncpy( OutputBuf , tmp , l ) ; OutputLen = l ; } }