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

  1. /*
  2.  * Routines de gestions de piles
  3.  * (c)1991 par Denis GOUNELLE
  4.  *
  5.  * long Push( type , val )
  6.  *    empile la valeur "val" avec "type" comme type
  7.  *    retourne 0 si ok, -1 sinon
  8.  *
  9.  * long Pop( type , indic )
  10.  *    depile la derniere valeur de type "type" et retourne cette valeur
  11.  *    si indic = 1, provoque une erreur si pas de valeur a depiler,
  12.  *      sinon retourne -1 
  13.  *
  14.  * void FlushStack( type )
  15.  *    vide toutes les valeurs de type  indique
  16.  */
  17.  
  18. #include "aroff.h"
  19. #include "pile.h"
  20.  
  21. static long sp = 0 ;
  22. extern long *Pile, TaillePile ;
  23.  
  24. /***********************************************************************/
  25.  
  26. void FlushStack( type )
  27. long type ;
  28.  
  29. {
  30.   register long k, l ;
  31.  
  32.   for ( k = l = 0 ; k < sp ; k += 2 )
  33.   {
  34.     if ( Pile[k] == type )
  35.     {
  36.       if ( type == TE_CONTEXT ) free( Pile[k+1] ) ;
  37.       continue ;
  38.     }
  39.  
  40.     if ( Pile[k] != TE_VIDE )
  41.     {
  42.       Pile[l] = Pile[k]   ; l++ ;
  43.       Pile[l] = Pile[k+1] ; l++ ;
  44.     }
  45.   }
  46.  
  47.   sp = l ;
  48. }
  49.  
  50. /***********************************************************************/
  51.  
  52. long Push( type , val )
  53. long type, val ;
  54.  
  55. {
  56.   if ( sp >= TaillePile ) FlushStack( TE_VIDE ) ;
  57.   if ( sp >= TaillePile ) Fatal( ERR_PILEP ) ;
  58.  
  59.   Pile[sp] = type ; sp++ ;
  60.   Pile[sp] = val  ; sp++ ;
  61.   return( 0 ) ;
  62. }
  63.  
  64. /***********************************************************************/
  65.  
  66. long Pop( type , indic )
  67. long type, indic ;
  68.  
  69. {
  70.   register long k, l ;
  71.  
  72.   l = sp - 2 ;
  73.  
  74.   for ( k = l ; k >= 0 ; k -= 2 )
  75.     if ( Pile[k] == type )
  76.     {
  77.       if ( k == l ) sp = l ;
  78.       else Pile[k] = TE_VIDE ;
  79.       return( Pile[k+1] ) ;
  80.     }
  81.  
  82.   if ( indic ) Fatal( ERR_PILEV ) ;
  83.   return( -1 ) ;
  84. }
  85.  
  86.