@@ -1330,14 +1330,16 @@ compact(struct nfa * nfa,
1330
1330
for (s = nfa -> states ; s != NULL ; s = s -> next )
1331
1331
{
1332
1332
nstates ++ ;
1333
- narcs += 1 + s -> nouts + 1 ;
1334
- /* 1 as a fake for flags, nouts for arcs, 1 as endmarker */
1333
+ narcs += s -> nouts + 1 ; /* need one extra for endmarker */
1335
1334
}
1336
1335
1336
+ cnfa -> stflags = (char * ) MALLOC (nstates * sizeof (char ));
1337
1337
cnfa -> states = (struct carc * * ) MALLOC (nstates * sizeof (struct carc * ));
1338
1338
cnfa -> arcs = (struct carc * ) MALLOC (narcs * sizeof (struct carc ));
1339
- if (cnfa -> states == NULL || cnfa -> arcs == NULL )
1339
+ if (cnfa -> stflags == NULL || cnfa -> states == NULL || cnfa -> arcs == NULL )
1340
1340
{
1341
+ if (cnfa -> stflags != NULL )
1342
+ FREE (cnfa -> stflags );
1341
1343
if (cnfa -> states != NULL )
1342
1344
FREE (cnfa -> states );
1343
1345
if (cnfa -> arcs != NULL )
@@ -1359,9 +1361,8 @@ compact(struct nfa * nfa,
1359
1361
for (s = nfa -> states ; s != NULL ; s = s -> next )
1360
1362
{
1361
1363
assert ((size_t ) s -> no < nstates );
1364
+ cnfa -> stflags [s -> no ] = 0 ;
1362
1365
cnfa -> states [s -> no ] = ca ;
1363
- ca -> co = 0 ; /* clear and skip flags "arc" */
1364
- ca ++ ;
1365
1366
first = ca ;
1366
1367
for (a = s -> outs ; a != NULL ; a = a -> outchain )
1367
1368
switch (a -> type )
@@ -1392,8 +1393,8 @@ compact(struct nfa * nfa,
1392
1393
1393
1394
/* mark no-progress states */
1394
1395
for (a = nfa -> pre -> outs ; a != NULL ; a = a -> outchain )
1395
- cnfa -> states [a -> to -> no ]-> co = 1 ;
1396
- cnfa -> states [nfa -> pre -> no ]-> co = 1 ;
1396
+ cnfa -> stflags [a -> to -> no ] = CNFA_NOPROGRESS ;
1397
+ cnfa -> stflags [nfa -> pre -> no ] = CNFA_NOPROGRESS ;
1397
1398
}
1398
1399
1399
1400
/*
@@ -1433,6 +1434,7 @@ freecnfa(struct cnfa * cnfa)
1433
1434
{
1434
1435
assert (cnfa -> nstates != 0 ); /* not empty already */
1435
1436
cnfa -> nstates = 0 ;
1437
+ FREE (cnfa -> stflags );
1436
1438
FREE (cnfa -> states );
1437
1439
FREE (cnfa -> arcs );
1438
1440
}
@@ -1617,7 +1619,7 @@ dumpcnfa(struct cnfa * cnfa,
1617
1619
fprintf (f , ", haslacons" );
1618
1620
fprintf (f , "\n" );
1619
1621
for (st = 0 ; st < cnfa -> nstates ; st ++ )
1620
- dumpcstate (st , cnfa -> states [ st ], cnfa , f );
1622
+ dumpcstate (st , cnfa , f );
1621
1623
fflush (f );
1622
1624
}
1623
1625
#endif
@@ -1629,22 +1631,20 @@ dumpcnfa(struct cnfa * cnfa,
1629
1631
*/
1630
1632
static void
1631
1633
dumpcstate (int st ,
1632
- struct carc * ca ,
1633
1634
struct cnfa * cnfa ,
1634
1635
FILE * f )
1635
1636
{
1636
- int i ;
1637
+ struct carc * ca ;
1637
1638
int pos ;
1638
1639
1639
- fprintf (f , "%d%s" , st , (ca [ 0 ]. co ) ? ":" : "." );
1640
+ fprintf (f , "%d%s" , st , (cnfa -> stflags [ st ] & CNFA_NOPROGRESS ) ? ":" : "." );
1640
1641
pos = 1 ;
1641
- for (i = 1 ; ca [ i ]. co != COLORLESS ; i ++ )
1642
+ for (ca = cnfa -> states [ st ] ; ca -> co != COLORLESS ; ca ++ )
1642
1643
{
1643
- if (ca [ i ]. co < cnfa -> ncolors )
1644
- fprintf (f , "\t[%ld]->%d" , (long ) ca [ i ]. co , ca [ i ]. to );
1644
+ if (ca -> co < cnfa -> ncolors )
1645
+ fprintf (f , "\t[%ld]->%d" , (long ) ca -> co , ca -> to );
1645
1646
else
1646
- fprintf (f , "\t:%ld:->%d" , (long ) ca [i ].co - cnfa -> ncolors ,
1647
- ca [i ].to );
1647
+ fprintf (f , "\t:%ld:->%d" , (long ) (ca -> co - cnfa -> ncolors ), ca -> to );
1648
1648
if (pos == 5 )
1649
1649
{
1650
1650
fprintf (f , "\n" );
@@ -1653,7 +1653,7 @@ dumpcstate(int st,
1653
1653
else
1654
1654
pos ++ ;
1655
1655
}
1656
- if (i == 1 || pos != 1 )
1656
+ if (ca == cnfa -> states [ st ] || pos != 1 )
1657
1657
fprintf (f , "\n" );
1658
1658
fflush (f );
1659
1659
}
0 commit comments