home *** CD-ROM | disk | FTP | other *** search
-
- # include "y3.h"
-
- /*
- * yapack.3c
- *
- * Modified to make debug code conditionally compile.
- * 28-Aug-81
- * Bob Denny
- */
- apack( p, n )
- int * p;
- {
- /* pack state i from temp1 into amem */
- int off;
- register * pp,
- * qq,
- * rr;
- int * q,
- * r;
-
- /* we don't need to worry about checking because we
- we will only look entries known to be there... */
-
- /* eliminate leading and trailing 0's */
-
- q = p + n;
- for ( pp = p, off = 0; *pp == 0 && pp <= q; ++pp, --off ) /* VOID */
- ;
- if ( pp > q )
- return ( 0 ); /* no actions */
- p = pp;
-
- /* now, find a place for the elements from p to q, inclusive */
-
- r = &amem[ ACTSIZE - 1 ];
- for ( rr = amem; rr <= r; ++rr, ++off )
- {
- /* try rr */
- for ( qq = rr, pp = p; pp <= q; ++pp, ++qq )
- {
- if ( *pp != 0 )
- {
- if ( *pp != *qq && *qq != 0 )
- goto nextk;
- }
- }
-
- /* we have found an acceptable k */
-
- # ifdef debug
- if ( foutput != NULL )
- fprintf( foutput, "off = %d, k = %d\n", off, rr - amem );
- # endif
- for ( qq = rr, pp = p; pp <= q; ++pp, ++qq )
- {
- if ( *pp )
- {
- if ( qq > r )
- error( "action table overflow" );
- if ( qq > memp )
- memp = qq;
- *qq = *pp;
- }
- }
- # ifdef debug
- if ( foutput != NULL )
- {
- for ( pp = amem; pp <= memp; pp += 10 )
- {
- fprintf( foutput, "\t" );
- for ( qq = pp; qq <= pp + 9; ++qq )
- fprintf( foutput, "%d ", *qq );
- fprintf( foutput, "\n" );
- }
- }
- # endif
- return ( off );
-
- nextk : ;
- }
- error( "no space in action table" );
- /* NOTREACHED */
- }
-