home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d5xx / d583 / aroff.lha / ARoff / Sources / ajuste.c < prev    next >
C/C++ Source or Header  |  1992-01-04  |  3KB  |  165 lines

  1. /*
  2.  * Ajustement des lignes
  3.  * (c)1991 par Denis GOUNELLE
  4.  */
  5.  
  6. #include "aroff.h"
  7. #include "pile.h"
  8.  
  9. extern unsigned char OutputBuf[] ;
  10. extern long OutputLen, TmpLineLen, AdjustMode, Flg, TmpCenter ;
  11.  
  12. static unsigned char tmp[LGMAXBUF+1] ;
  13.  
  14. /***********************************************************************/
  15.  
  16. long adjust_b()
  17.  
  18. {
  19.   long nbr, inc ;
  20.   register unsigned char *p ;
  21.   register long k, l, j, NbInt ;
  22.  
  23.   if ( Flg & F_BREAKED ) return( 0 ) ;
  24.  
  25.   /* calcule le nombre d'intervalles et la taille de la ligne */
  26.  
  27.   j = NbInt = 0 ;
  28.   p = OutputBuf ;
  29.   for ( k = 0 ; k < OutputLen ; k++ )
  30.   {
  31.     if ( isspace( *p ) )
  32.     {
  33.       if ( j ) NbInt++ ;
  34.       j = 0 ;
  35.     }
  36.     else j = 1 ;
  37.     p++ ;
  38.   }
  39.  
  40.   /* calcule le nombre d'espaces a inserer */
  41.  
  42.   if (! NbInt) return( 0 ) ;
  43.  
  44.   k   = TmpLineLen - OutputLen ;
  45.   nbr = k / NbInt ;
  46.   inc = NbInt - (k % NbInt) ;
  47.  
  48.   /* effectue l'insertion */
  49.  
  50.   p = tmp ;
  51.   j = l = 0 ;
  52.   for ( k = 0 ; k < OutputLen ; k++ )
  53.   {
  54.     if ( isspace( OutputBuf[k] ) )
  55.     {
  56.       if ( j )
  57.       {
  58.     for ( j = 0 ; j < nbr ; j++ , p++ ) *p = ' ' ;
  59.     l++ ;
  60.     if ( l == inc ) nbr++ ;
  61.       }
  62.       j = 0 ;
  63.     }
  64.     else j = 1 ;
  65.  
  66.     *p = OutputBuf[k] ;
  67.     p++ ;
  68.   }
  69.  
  70.   *p = '\0' ;
  71.   return( 1 ) ;
  72. }
  73.  
  74. /***********************************************************************/
  75.  
  76. long adjust_c()
  77.  
  78. {
  79.   register long k, l ;
  80.   register unsigned char *p ;
  81.  
  82.   p = OutputBuf ;
  83.   for ( k = 0 ; k < OutputLen ; k++ , p++ ) if (! isspace( *p )) break ;
  84.   l = (TmpLineLen - OutputLen + k) >> 1 ;
  85.  
  86.   for ( p = tmp ; l > 0 ; l-- , p++ ) *p = ' ' ;
  87.   for ( ; k < OutputLen ; k++ , p++ ) *p = OutputBuf[k] ;
  88.   *p = '\0' ;
  89.   return( 1 ) ;
  90. }
  91.  
  92. /***********************************************************************/
  93.  
  94. long adjust_r()
  95.  
  96. {
  97.   register long k ;
  98.   register unsigned char *p ;
  99.  
  100.   k = TmpLineLen - OutputLen ;
  101.   for ( p = tmp ; k > 0 ; k-- , p++ ) *p = ' ' ;
  102.   for ( k = 0 ; k < OutputLen ; k++ , p++ ) *p = OutputBuf[k] ;
  103.   *p = '\0' ;
  104.   return( 1 ) ;
  105. }
  106.  
  107. /***********************************************************************/
  108.  
  109. void AdjustLine()
  110. {
  111.   register long c, l ;
  112.  
  113. /* verifie qu'on ne coupe pas un mot */
  114.  
  115.   if ( OutputLen >= TmpLineLen )
  116.   {
  117.     SauveContexte( 1 ) ;
  118.     c = GetChar() ;
  119.     if ( c == EOF ) return ;
  120.  
  121.     l = OutputLen-1 ;
  122.     while ( (! isspace( c )) && (! isspace( OutputBuf[l] )) )
  123.     {
  124.       RestoreContexte( 0 ) ;
  125.       l = OutputLen-1 ;
  126.       SauveContexte( 1 ) ;
  127.       c = GetChar() ;
  128.     }
  129.     RestoreContexte( 1 ) ;
  130.   }
  131.  
  132. /* enleve les espaces en fin de ligne */
  133.  
  134.   l = OutputLen - 1 ;
  135.   while ( (l > 0) && isspace( OutputBuf[l] ) )
  136.   {
  137.     OutputLen-- ;
  138.     l-- ;
  139.   }
  140.  
  141.   if (! OutputLen ) return ;
  142.  
  143. /* cadre/centre/justifie */
  144.  
  145.   *tmp = '\0' ;
  146.  
  147.   l = ( TmpCenter ) ? AM_CENTER : AdjustMode ;
  148.   switch ( l )
  149.   {
  150.     case AM_BOTH   : c = adjust_b() ; break ;
  151.     case AM_LEFT   : c = 0        ; break ;
  152.     case AM_RIGHT  : c = adjust_r() ; break ;
  153.     case AM_CENTER : c = adjust_c() ; break ;
  154.   }
  155.  
  156.   if ( c )
  157.   {
  158.     l = strlen( tmp ) ;
  159.     strncpy( OutputBuf , tmp , l ) ;
  160.     OutputLen = l ;
  161.   }
  162.  
  163. }
  164.  
  165.