18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* nfa - NFA construction routines */
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*-
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (c) 1990 The Regents of the University of California.
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * All rights reserved.
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This code is derived from software contributed to Berkeley by
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Vern Paxson.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The United States Government has rights in this work pursuant
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * to contract no. DE-AC03-76SF00098 between the United States
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Department of Energy and the University of California.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms with or without
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification are permitted provided that: (1) source distributions retain
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * this entire copyright notice and comment, and (2) distributions including
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * binaries display the following acknowledgement:  ``This product includes
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * software developed by the University of California, Berkeley and its
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * contributors'' in the documentation or other materials provided with the
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * distribution and in all advertising materials mentioning features or use
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * of this software.  Neither the name of the University nor the names of
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived from
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * this software without specific prior written permission.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* $Header: /home/daffy/u0/vern/flex/RCS/nfa.c,v 2.17 95/03/04 16:11:42 vern Exp $ */
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "flexdef.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* declare functions that have forward references */
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint dupmachine PROTO((int));
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid mkxtion PROTO((int, int));
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* add_accept - add an accepting state to a machine
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * accepting_number becomes mach's accepting number.
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid add_accept( mach, accepting_number )
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mach, accepting_number;
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	/* Hang the accepting number off an epsilon state.  if it is associated
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * with a state that has a non-epsilon out-transition, then the state
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * will accept BEFORE it makes that transition, i.e., one character
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * too soon.
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 */
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( transchar[finalst[mach]] == SYM_EPSILON )
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		accptnum[finalst[mach]] = accepting_number;
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		int astate = mkstate( SYM_EPSILON );
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		accptnum[astate] = accepting_number;
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		(void) link_machines( mach, astate );
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* copysingl - make a given number of copies of a singleton machine
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *   newsng = copysingl( singl, num );
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     newsng - a new singleton composed of num copies of singl
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     singl  - a singleton machine
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     num    - the number of copies of singl to be present in newsng
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint copysingl( singl, num )
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint singl, num;
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	int copy, i;
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	copy = mkstate( SYM_EPSILON );
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	for ( i = 1; i <= num; ++i )
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		copy = link_machines( copy, dupmachine( singl ) );
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return copy;
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* dumpnfa - debugging routine to write out an nfa */
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid dumpnfa( state1 )
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint state1;
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	int sym, tsp1, tsp2, anum, ns;
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	fprintf( stderr,
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	_( "\n\n********** beginning dump of nfa with start state %d\n" ),
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		state1 );
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	/* We probably should loop starting at firstst[state1] and going to
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * lastst[state1], but they're not maintained properly when we "or"
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * all of the rules together.  So we use our knowledge that the machine
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * starts at state 1 and ends at lastnfa.
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 */
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	/* for ( ns = firstst[state1]; ns <= lastst[state1]; ++ns ) */
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	for ( ns = 1; ns <= lastnfa; ++ns )
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		fprintf( stderr, _( "state # %4d\t" ), ns );
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		sym = transchar[ns];
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		tsp1 = trans1[ns];
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		tsp2 = trans2[ns];
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		anum = accptnum[ns];
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		fprintf( stderr, "%3d:  %4d, %4d", sym, tsp1, tsp2 );
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if ( anum != NIL )
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			fprintf( stderr, "  [%d]", anum );
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		fprintf( stderr, "\n" );
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	fprintf( stderr, _( "********** end of dump\n" ) );
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* dupmachine - make a duplicate of a given machine
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *   copy = dupmachine( mach );
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     copy - holds duplicate of mach
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     mach - machine to be duplicated
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * note that the copy of mach is NOT an exact duplicate; rather, all the
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * transition states values are adjusted so that the copy is self-contained,
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * as the original should have been.
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * also note that the original MUST be contiguous, with its low and high
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * states accessible by the arrays firstst and lastst
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint dupmachine( mach )
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mach;
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	int i, init, state_offset;
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	int state = 0;
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	int last = lastst[mach];
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	for ( i = firstst[mach]; i <= last; ++i )
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		state = mkstate( transchar[i] );
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if ( trans1[i] != NO_TRANSITION )
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			{
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			mkxtion( finalst[state], trans1[i] + state - i );
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			if ( transchar[i] == SYM_EPSILON &&
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			     trans2[i] != NO_TRANSITION )
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				mkxtion( finalst[state],
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					trans2[i] + state - i );
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		accptnum[state] = accptnum[i];
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( state == 0 )
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		flexfatal( _( "empty machine in dupmachine()" ) );
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	state_offset = state - i + 1;
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	init = mach + state_offset;
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	firstst[init] = firstst[mach] + state_offset;
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	finalst[init] = finalst[mach] + state_offset;
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	lastst[init] = lastst[mach] + state_offset;
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return init;
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* finish_rule - finish up the processing for a rule
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * An accepting number is added to the given machine.  If variable_trail_rule
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * is true then the rule has trailing context and both the head and trail
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are variable size.  Otherwise if headcnt or trailcnt is non-zero then
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the machine recognizes a pattern with trailing context and headcnt is
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the number of characters in the matched part of the pattern, or zero
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * if the matched part has variable length.  trailcnt is the number of
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * trailing context characters in the pattern, or zero if the trailing
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * context has variable length.
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid finish_rule( mach, variable_trail_rule, headcnt, trailcnt )
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mach, variable_trail_rule, headcnt, trailcnt;
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	char action_text[MAXLINE];
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	add_accept( mach, num_rules );
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	/* We did this in new_rule(), but it often gets the wrong
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * number because we do it before we start parsing the current rule.
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 */
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	rule_linenum[num_rules] = linenum;
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	/* If this is a continued action, then the line-number has already
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * been updated, giving us the wrong number.
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 */
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( continued_action )
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		--rule_linenum[num_rules];
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	sprintf( action_text, "case %d:\n", num_rules );
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	add_action( action_text );
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( variable_trail_rule )
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		rule_type[num_rules] = RULE_VARIABLE;
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if ( performance_report > 0 )
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			fprintf( stderr,
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			_( "Variable trailing context rule at line %d\n" ),
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				rule_linenum[num_rules] );
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		variable_trailing_context_rules = true;
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		rule_type[num_rules] = RULE_NORMAL;
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if ( headcnt > 0 || trailcnt > 0 )
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			{
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			/* Do trailing context magic to not match the trailing
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			 * characters.
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			 */
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			char *scanner_cp = "yy_c_buf_p = yy_cp";
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			char *scanner_bp = "yy_bp";
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			add_action(
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	"*yy_cp = yy_hold_char; /* undo effects of setting up yytext */\n" );
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			if ( headcnt > 0 )
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				{
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				sprintf( action_text, "%s = %s + %d;\n",
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				scanner_cp, scanner_bp, headcnt );
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				add_action( action_text );
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				}
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			else
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				{
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				sprintf( action_text, "%s -= %d;\n",
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					scanner_cp, trailcnt );
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				add_action( action_text );
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				}
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			add_action(
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			"YY_DO_BEFORE_ACTION; /* set up yytext again */\n" );
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	/* Okay, in the action code at this point yytext and yyleng have
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * their proper final values for this rule, so here's the point
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * to do any user action.  But don't do it for continued actions,
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * as that'll result in multiple YY_RULE_SETUP's.
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 */
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( ! continued_action )
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		add_action( "YY_RULE_SETUP\n" );
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	line_directive_out( (FILE *) 0, 1 );
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* link_machines - connect two machines together
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *   new = link_machines( first, last );
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     new    - a machine constructed by connecting first to last
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     first  - the machine whose successor is to be last
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     last   - the machine whose predecessor is to be first
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * note: this routine concatenates the machine first with the machine
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  last to produce a machine new which will pattern-match first first
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  and then last, and will fail if either of the sub-patterns fails.
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  FIRST is set to new by the operation.  last is unmolested.
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint link_machines( first, last )
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint first, last;
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( first == NIL )
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return last;
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else if ( last == NIL )
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return first;
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		mkxtion( finalst[first], last );
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		finalst[first] = finalst[last];
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		lastst[first] = MAX( lastst[first], lastst[last] );
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		firstst[first] = MIN( firstst[first], firstst[last] );
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return first;
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mark_beginning_as_normal - mark each "beginning" state in a machine
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *                            as being a "normal" (i.e., not trailing context-
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *                            associated) states
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The "beginning" states are the epsilon closure of the first state
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid mark_beginning_as_normal( mach )
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectregister int mach;
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	switch ( state_type[mach] )
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		case STATE_NORMAL:
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			/* Oh, we've already visited here. */
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			return;
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		case STATE_TRAILING_CONTEXT:
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			state_type[mach] = STATE_NORMAL;
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			if ( transchar[mach] == SYM_EPSILON )
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				{
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				if ( trans1[mach] != NO_TRANSITION )
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					mark_beginning_as_normal(
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						trans1[mach] );
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				if ( trans2[mach] != NO_TRANSITION )
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					mark_beginning_as_normal(
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						trans2[mach] );
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				}
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			break;
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		default:
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			flexerror(
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			_( "bad state type in mark_beginning_as_normal()" ) );
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			break;
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mkbranch - make a machine that branches to two machines
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *   branch = mkbranch( first, second );
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     branch - a machine which matches either first's pattern or second's
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     first, second - machines whose patterns are to be or'ed (the | operator)
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Note that first and second are NEITHER destroyed by the operation.  Also,
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the resulting machine CANNOT be used with any other "mk" operation except
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * more mkbranch's.  Compare with mkor()
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mkbranch( first, second )
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint first, second;
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	int eps;
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( first == NO_TRANSITION )
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return second;
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else if ( second == NO_TRANSITION )
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return first;
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	eps = mkstate( SYM_EPSILON );
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	mkxtion( eps, first );
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	mkxtion( eps, second );
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return eps;
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mkclos - convert a machine into a closure
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *   new = mkclos( state );
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * new - a new state which matches the closure of "state"
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mkclos( state )
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint state;
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return mkopt( mkposcl( state ) );
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mkopt - make a machine optional
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *   new = mkopt( mach );
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     new  - a machine which optionally matches whatever mach matched
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     mach - the machine to make optional
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notes:
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     1. mach must be the last machine created
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     2. mach is destroyed by the call
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mkopt( mach )
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mach;
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	int eps;
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( ! SUPER_FREE_EPSILON(finalst[mach]) )
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		eps = mkstate( SYM_EPSILON );
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		mach = link_machines( mach, eps );
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	/* Can't skimp on the following if FREE_EPSILON(mach) is true because
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * some state interior to "mach" might point back to the beginning
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * for a closure.
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 */
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	eps = mkstate( SYM_EPSILON );
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	mach = link_machines( eps, mach );
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	mkxtion( mach, finalst[mach] );
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return mach;
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mkor - make a machine that matches either one of two machines
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *   new = mkor( first, second );
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     new - a machine which matches either first's pattern or second's
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     first, second - machines whose patterns are to be or'ed (the | operator)
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * note that first and second are both destroyed by the operation
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the code is rather convoluted because an attempt is made to minimize
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the number of epsilon states needed
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mkor( first, second )
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint first, second;
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	int eps, orend;
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( first == NIL )
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return second;
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else if ( second == NIL )
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return first;
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		/* See comment in mkopt() about why we can't use the first
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		 * state of "first" or "second" if they satisfy "FREE_EPSILON".
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		 */
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		eps = mkstate( SYM_EPSILON );
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		first = link_machines( eps, first );
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		mkxtion( first, second );
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if ( SUPER_FREE_EPSILON(finalst[first]) &&
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		     accptnum[finalst[first]] == NIL )
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			{
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			orend = finalst[first];
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			mkxtion( finalst[second], orend );
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		else if ( SUPER_FREE_EPSILON(finalst[second]) &&
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			  accptnum[finalst[second]] == NIL )
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			{
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			orend = finalst[second];
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			mkxtion( finalst[first], orend );
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		else
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			{
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			eps = mkstate( SYM_EPSILON );
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			first = link_machines( first, eps );
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			orend = finalst[first];
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			mkxtion( finalst[second], orend );
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	finalst[first] = orend;
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return first;
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mkposcl - convert a machine into a positive closure
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *   new = mkposcl( state );
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    new - a machine matching the positive closure of "state"
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mkposcl( state )
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint state;
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	int eps;
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( SUPER_FREE_EPSILON(finalst[state]) )
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		mkxtion( finalst[state], state );
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return state;
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		eps = mkstate( SYM_EPSILON );
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		mkxtion( eps, state );
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return link_machines( state, eps );
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mkrep - make a replicated machine
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *   new = mkrep( mach, lb, ub );
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    new - a machine that matches whatever "mach" matched from "lb"
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *          number of times to "ub" number of times
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * note
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *   if "ub" is INFINITY then "new" matches "lb" or more occurrences of "mach"
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mkrep( mach, lb, ub )
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mach, lb, ub;
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	int base_mach, tail, copy, i;
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	base_mach = copysingl( mach, lb - 1 );
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( ub == INFINITY )
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		copy = dupmachine( mach );
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		mach = link_machines( mach,
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		link_machines( base_mach, mkclos( copy ) ) );
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		tail = mkstate( SYM_EPSILON );
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		for ( i = lb; i < ub; ++i )
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			{
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			copy = dupmachine( mach );
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			tail = mkopt( link_machines( copy, tail ) );
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		mach = link_machines( mach, link_machines( base_mach, tail ) );
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return mach;
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mkstate - create a state with a transition on a given symbol
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *   state = mkstate( sym );
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     state - a new state matching sym
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     sym   - the symbol the new state is to have an out-transition on
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * note that this routine makes new states in ascending order through the
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * state array (and increments LASTNFA accordingly).  The routine DUPMACHINE
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * relies on machines being made in ascending order and that they are
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTIGUOUS.  Change it and you will have to rewrite DUPMACHINE (kludge
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * that it admittedly is)
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mkstate( sym )
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint sym;
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( ++lastnfa >= current_mns )
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if ( (current_mns += MNS_INCREMENT) >= MAXIMUM_MNS )
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			lerrif(
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		_( "input rules are too complicated (>= %d NFA states)" ),
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				current_mns );
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		++num_reallocs;
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		firstst = reallocate_integer_array( firstst, current_mns );
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		lastst = reallocate_integer_array( lastst, current_mns );
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		finalst = reallocate_integer_array( finalst, current_mns );
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		transchar = reallocate_integer_array( transchar, current_mns );
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		trans1 = reallocate_integer_array( trans1, current_mns );
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		trans2 = reallocate_integer_array( trans2, current_mns );
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		accptnum = reallocate_integer_array( accptnum, current_mns );
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		assoc_rule =
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			reallocate_integer_array( assoc_rule, current_mns );
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		state_type =
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			reallocate_integer_array( state_type, current_mns );
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	firstst[lastnfa] = lastnfa;
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	finalst[lastnfa] = lastnfa;
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	lastst[lastnfa] = lastnfa;
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	transchar[lastnfa] = sym;
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	trans1[lastnfa] = NO_TRANSITION;
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	trans2[lastnfa] = NO_TRANSITION;
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	accptnum[lastnfa] = NIL;
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	assoc_rule[lastnfa] = num_rules;
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	state_type[lastnfa] = current_state_type;
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	/* Fix up equivalence classes base on this transition.  Note that any
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * character which has its own transition gets its own equivalence
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * class.  Thus only characters which are only in character classes
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * have a chance at being in the same equivalence class.  E.g. "a|b"
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * puts 'a' and 'b' into two different equivalence classes.  "[ab]"
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * puts them in the same equivalence class (barring other differences
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 * elsewhere in the input).
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 */
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( sym < 0 )
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		/* We don't have to update the equivalence classes since
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		 * that was already done when the ccl was created for the
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		 * first time.
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		 */
6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else if ( sym == SYM_EPSILON )
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		++numeps;
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		check_char( sym );
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if ( useecs )
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			/* Map NUL's to csize. */
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			mkechar( sym ? sym : csize, nextecm, ecgroup );
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return lastnfa;
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mkxtion - make a transition from one state to another
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *   mkxtion( statefrom, stateto );
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     statefrom - the state from which the transition is to be made
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     stateto   - the state to which the transition is to be made
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid mkxtion( statefrom, stateto )
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint statefrom, stateto;
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( trans1[statefrom] == NO_TRANSITION )
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		trans1[statefrom] = stateto;
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else if ( (transchar[statefrom] != SYM_EPSILON) ||
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		  (trans2[statefrom] != NO_TRANSITION) )
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		flexfatal( _( "found too many transitions in mkxtion()" ) );
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{ /* second out-transition for an epsilon state */
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		++eps2;
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		trans2[statefrom] = stateto;
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* new_rule - initialize for a new rule */
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid new_rule()
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( ++num_rules >= current_max_rules )
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		++num_reallocs;
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		current_max_rules += MAX_RULES_INCREMENT;
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		rule_type = reallocate_integer_array( rule_type,
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project							current_max_rules );
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		rule_linenum = reallocate_integer_array( rule_linenum,
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project							current_max_rules );
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		rule_useful = reallocate_integer_array( rule_useful,
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project							current_max_rules );
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( num_rules > MAX_RULE )
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		lerrif( _( "too many rules (> %d)!" ), MAX_RULE );
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	rule_linenum[num_rules] = linenum;
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	rule_useful[num_rules] = false;
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
710