void okcolors ( Nfa nfa ) { ColorDesc cd ; ColorDesc scd ; Arc a ; short sco ; for ( short co = 0 ; co < colorDescs . size ( ) ; co ++ ) { cd = colorDescs . get ( co ) ; if ( cd == null ) { continue ; // not in use at all, so can't have a subcolor. } sco = cd . sub ; if ( sco == Constants . NOSUB ) { /* has no subcolor, no further action */ } else if ( sco == co ) { /* is subcolor, let parent deal with it */ } else if ( cd . getNChars ( ) == 0 ) { /* parent empty, its arcs change color to subcolor */ cd . sub = Constants . NOSUB ; scd = colorDescs . get ( sco ) ; assert scd . getNChars ( ) > 0 ; assert scd . sub == sco ; scd . sub = Constants . NOSUB ; while ( ( a = cd . arcs ) != null ) { assert a . co == co ; cd . arcs = a . colorchain ; a . setColor ( sco ) ; a . colorchain = scd . arcs ; scd . arcs = a ; } freecolor ( co ) ; } else { /* parent's arcs must gain parallel subcolor arcs */ cd . sub = Constants . NOSUB ; scd = colorDescs . get ( sco ) ; assert scd . getNChars ( ) > 0 ; assert scd . sub == sco ; scd . sub = Constants . NOSUB ; for ( a = cd . arcs ; a != null ; a = a . colorchain ) { assert a . co == co ; nfa . newarc ( a . type , sco , a . from , a . to ) ; } } } }
okcolors - promote subcolors to full colors