#ifdef _WIN32
#include <windows.h>
#include <io.h>
#endif
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "tools/re2c/substr.h"
#include "tools/re2c/globals.h"
#include "tools/re2c/dfa.h"
#include "tools/re2c/parse.h"

#ifdef _WIN32
/* tmpfile() replacment for Windows.
 *
 * On Windows tmpfile() creates the file in the root directory. This
 * may fail due to unsufficient privileges.
 */
static FILE *
win32_tmpfile (void)
{
    DWORD path_len;
    WCHAR path_name[MAX_PATH + 1];
    WCHAR file_name[MAX_PATH + 1];
    HANDLE handle;
    int fd;
    FILE *fp;

    path_len = GetTempPathW (MAX_PATH, path_name);
    if (path_len <= 0 || path_len >= MAX_PATH)
	return NULL;

    if (GetTempFileNameW (path_name, L"ps_", 0, file_name) == 0)
	return NULL;

    handle = CreateFileW (file_name,
			 GENERIC_READ | GENERIC_WRITE,
			 0,
			 NULL,
			 CREATE_ALWAYS,
			 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE,
			 NULL);
    if (handle == INVALID_HANDLE_VALUE) {
	DeleteFileW (file_name);
	return NULL;
    }

    fd = _open_osfhandle((intptr_t) handle, 0);
    if (fd < 0) {
	CloseHandle (handle);
	return NULL;
    }

    fp = fdopen(fd, "w+b");
    if (fp == NULL) {
	_close(fd);
	return NULL;
    }

    return fp;
}
#endif

static void useLabel(size_t value) {
    while (value >= vUsedLabelAlloc) {
	vUsedLabels = realloc(vUsedLabels, vUsedLabelAlloc * 2);
	if (!vUsedLabels) {
	    fputs("Out of memory.\n", stderr);
	    exit(EXIT_FAILURE);
	}
	memset(vUsedLabels + vUsedLabelAlloc, 0, vUsedLabelAlloc);
	vUsedLabelAlloc *= 2;
    }
    vUsedLabels[value] = 1;
}

/* there must be at least one span in list;  all spans must cover
 * same range
 */

void Go_compact(Go *g){
    /* arrange so that adjacent spans have different targets */
    unsigned int i = 0, j;
    for(j = 1; j < g->nSpans; ++j){
	if(g->span[j].to != g->span[i].to){
	    ++i; g->span[i].to = g->span[j].to;
	}
	g->span[i].ub = g->span[j].ub;
    }
    g->nSpans = i + 1;
}

void Go_unmap(Go *g, Go *base, State *x){
    Span *s = g->span, *b = base->span, *e = &b[base->nSpans];
    unsigned int lb = 0;
    s->ub = 0;
    s->to = NULL;
    for(; b != e; ++b){
	if(b->to == x){
	    if((s->ub - lb) > 1)
		s->ub = b->ub;
	} else {
	    if(b->to != s->to){
		if(s->ub){
		    lb = s->ub; ++s;
		}
		s->to = b->to;
	    }
	    s->ub = b->ub;
	}
    }
    s->ub = e[-1].ub; ++s;
    g->nSpans = s - g->span;
}

static void doGen(Go *g, State *s, unsigned char *bm, unsigned char m){
    Span *b = g->span, *e = &b[g->nSpans];
    unsigned int lb = 0;
    for(; b < e; ++b){
	if(b->to == s)
	    for(; lb < b->ub; ++lb) bm[lb] |= m;
	lb = b->ub;
    }
}
#if 0
static void prt(FILE *o, Go *g, State *s){
    Span *b = g->span, *e = &b[g->nSpans];
    unsigned int lb = 0;
    for(; b < e; ++b){
	if(b->to == s)
	    printSpan(o, lb, b->ub);
	lb = b->ub;
    }
}
#endif
static int matches(Go *g1, State *s1, Go *g2, State *s2){
    Span *b1 = g1->span, *e1 = &b1[g1->nSpans];
    unsigned int lb1 = 0;
    Span *b2 = g2->span, *e2 = &b2[g2->nSpans];
    unsigned int lb2 = 0;
    for(;;){
	for(; b1 < e1 && b1->to != s1; ++b1) lb1 = b1->ub;
	for(; b2 < e2 && b2->to != s2; ++b2) lb2 = b2->ub;
	if(b1 == e1) return b2 == e2;
	if(b2 == e2) return 0;
	if(lb1 != lb2 || b1->ub != b2->ub) return 0;
	++b1; ++b2;
    }
}

typedef struct BitMap {
    Go			*go;
    State		*on;
    struct BitMap	*next;
    unsigned int	i;
    unsigned char	m;
} BitMap;

static BitMap *BitMap_find_go(Go*, State*);
static BitMap *BitMap_find(State*);
static void BitMap_gen(FILE *, unsigned int, unsigned int);
/* static void BitMap_stats(void);*/
static BitMap *BitMap_new(Go*, State*);

static BitMap *BitMap_first = NULL;

BitMap *
BitMap_new(Go *g, State *x)
{
    BitMap *b = malloc(sizeof(BitMap));
    b->go = g;
    b->on = x;
    b->next = BitMap_first;
    BitMap_first = b;
    return b;
}

BitMap *
BitMap_find_go(Go *g, State *x){
    BitMap *b;
    for(b = BitMap_first; b; b = b->next){
	if(matches(b->go, b->on, g, x))
	    return b;
    }
    return BitMap_new(g, x);
}

BitMap *
BitMap_find(State *x){
    BitMap *b;
    for(b = BitMap_first; b; b = b->next){
	if(b->on == x)
	    return b;
    }
    return NULL;
}

void BitMap_gen(FILE *o, unsigned int lb, unsigned int ub){
    BitMap *b = BitMap_first;
    if(b){
	unsigned int n = ub - lb;
	unsigned int i;
	unsigned char *bm = malloc(sizeof(unsigned char)*n);
	fputs("\tstatic unsigned char yybm[] = {", o);
	for(i = 0; b; i += n){
	    unsigned char m;
	    unsigned int j;
	    memset(bm, 0, n);
	    for(m = 0x80; b && m; b = b->next, m >>= 1){
		b->i = i; b->m = m;
		doGen(b->go, b->on, bm-lb, m);
	    }
	    for(j = 0; j < n; ++j){
		if(j%8 == 0) {fputs("\n\t", o); oline++;}
		fprintf(o, "%3u, ", (unsigned int) bm[j]);
	    }
	}
	fputs("\n\t};\n", o); oline+=2;
        free(bm);
    }
}

#if 0
void BitMap_stats(void){
    unsigned int n = 0;
    BitMap *b;
    for(b = BitMap_first; b; b = b->next){
	prt(stderr, b->go, b->on); fputs("\n", stderr);
	++n;
    }
    fprintf(stderr, "%u bitmaps\n", n);
    BitMap_first = NULL;
}
#endif

static void genGoTo(FILE *o, State *from, State *to, int *readCh,
		    const char *indent)
{
#if 0
    if (*readCh && from->label + 1 != to->label)
    {
	fputs("%syych = *YYCURSOR;\n", indent, o); oline++;
	*readCh = 0;
    }
#endif
    fprintf(o, "%sgoto yy%u;\n", indent, to->label); oline++;
    useLabel(to->label);
}

static void genIf(FILE *o, const char *cmp, unsigned int v, int *readCh)
{
#if 0
    if (*readCh)
    {
	fputs("\tif((yych = *YYCURSOR) ", o);
	*readCh = 0;
    } else {
#endif
	fputs("\tif(yych ", o);
#if 0
    }
#endif
    fprintf(o, "%s '", cmp);
    prtCh(o, v);
    fputs("')", o);
}

static void indent(FILE *o, unsigned int i){
    while(i-- > 0)
	fputc('\t', o);
}

static void need(FILE *o, unsigned int n, int *readCh)
{
    unsigned int fillIndex;
    int hasFillIndex = (0<=vFillIndexes);
    if (hasFillIndex) {
	fillIndex = vFillIndexes++;
	fprintf(o, "\tYYSETSTATE(%u);\n", fillIndex);
	++oline;
    }

    if(n == 1) {
	fputs("\tif(YYLIMIT == YYCURSOR) YYFILL(1);\n", o); oline++;
    } else {
	fprintf(o, "\tif((YYLIMIT - YYCURSOR) < %u) YYFILL(%u);\n", n, n);
	oline++;
    }

    if (hasFillIndex) {
	fprintf(o, "yyFillLabel%u:\n", fillIndex);
	++oline;
    }

    fputs("\tyych = *YYCURSOR;\n", o); oline++;
    *readCh = 0;
}

void
Action_emit(Action *a, FILE *o, int *readCh)
{
    int first = 1;
    unsigned int i;
    unsigned int back;

    switch (a->type) {
	case MATCHACT:
	    if(a->state->link){
		fputs("\t++YYCURSOR;\n", o);
		need(o, a->state->depth, readCh);
#if 0
	    } else if (!Action_readAhead(a)) {
		/* do not read next char if match */
		fputs("\t++YYCURSOR;\n", o);
		*readCh = 1;
#endif
	    } else {
		fputs("\tyych = *++YYCURSOR;\n", o);
		*readCh = 0;
	    }
	    oline++;
	    break;
	case ENTERACT:
	    if(a->state->link){
		fputs("\t++YYCURSOR;\n", o);
		fprintf(o, "yy%u:\n", a->d.label); oline+=2;
		need(o, a->state->depth, readCh);
	    } else {
		/* we shouldn't need 'rule-following' protection here */
		fputs("\tyych = *++YYCURSOR;\n", o);
		fprintf(o, "yy%u:\n", a->d.label); oline+=2;
		*readCh = 0;
	    }
	    break;
	case SAVEMATCHACT:
	    if (bUsedYYAccept) {
		fprintf(o, "\tyyaccept = %u;\n", a->d.selector);
		oline++;
	    }
	    if(a->state->link){
		fputs("\tYYMARKER = ++YYCURSOR;\n", o); oline++;
		need(o, a->state->depth, readCh);
	    } else {
		fputs("\tyych = *(YYMARKER = ++YYCURSOR);\n", o); oline++;
		*readCh = 0;
	    }
	    break;
	case MOVEACT:
	    break;
	case ACCEPTACT:
	    for(i = 0; i < a->d.Accept.nRules; ++i)
		if(a->d.Accept.saves[i] != ~0u){
		    if(first){
			first = 0;
			bUsedYYAccept = 1;
			fputs("\tYYCURSOR = YYMARKER;\n", o);
			fputs("\tswitch(yyaccept){\n", o); oline+=2;
		    }
		    fprintf(o, "\tcase %u:", a->d.Accept.saves[i]);
		    genGoTo(o, a->state, a->d.Accept.rules[i], readCh, "\t");
		}
	    if(!first) {
		fputs("\t}\n", o); oline++;
	    }
	    break;
	case RULEACT:
	    back = RegExp_fixedLength(a->d.rule->d.RuleOp.ctx);
	    if(back != ~0u && back > 0u)
		fprintf(o, "\tYYCURSOR -= %u;", back);
	    fprintf(o, "\n"); oline++;
	    line_source(o, a->d.rule->d.RuleOp.code->line);
	    SubStr_out(&a->d.rule->d.RuleOp.code->text, o);
	    fprintf(o, "\n"); oline++;
	    if (!iFlag)
		fprintf(o, "#line %u \"%s\"\n", oline++, outputFileName);
	    break;
    }
}

Action *
Action_new_Accept(State *x, unsigned int n, unsigned int *s, State **r)
{
    Action *a = malloc(sizeof(Action));
    a->type = ACCEPTACT;
    a->state = x;
    a->d.Accept.nRules = n;
    a->d.Accept.saves = s;
    a->d.Accept.rules = r;
    x->action = a;
    return a;
}

static void doLinear(FILE *o, unsigned int i, Span *s, unsigned int n,
		     State *from, State *next, int *readCh){
    for(;;){
	State *bg = s[0].to;
	while(n >= 3 && s[2].to == bg && (s[1].ub - s[0].ub) == 1){
	    if(s[1].to == next && n == 3){
		indent(o, i);
		genIf(o, "!=", s[0].ub, readCh);
		genGoTo(o, from, bg, readCh, "\t");
		indent(o, i);
		genGoTo(o, from, next, readCh, "\t");
		return;
	    } else {
		indent(o, i);
		genIf(o, "==", s[0].ub, readCh);
		genGoTo(o, from, s[1].to, readCh, "\t");
	    }
	    n -= 2; s += 2;
	}
	if(n == 1){
	    indent(o, i);
	    genGoTo(o, from, s[0].to, readCh, "\t");
	    return;
	} else if(n == 2 && bg == next){
	    indent(o, i);
	    genIf(o, ">=", s[0].ub, readCh);
	    genGoTo(o, from, s[1].to, readCh, "\t");
	    indent(o, i);
	    genGoTo(o, from, next, readCh, "\t");
	    return;
	} else {
	    indent(o, i);
	    genIf(o, "<=", s[0].ub - 1, readCh);
	    genGoTo(o, from, bg, readCh, "\t");
	    n -= 1; s += 1;
	}
    }
    indent(o, i);
    genGoTo(o, from, next, readCh, "\t");
}

void
Go_genLinear(Go *g, FILE *o, State *from, State *next, int *readCh){
    doLinear(o, 0, g->span, g->nSpans, from, next, readCh);
}

static void genCases(FILE *o, unsigned int lb, Span *s){
    if(lb < s->ub){
	for(;;){
	    fputs("\tcase '", o); prtCh(o, lb); fputs("':", o);
	    if(++lb == s->ub)
		break;
	    fputs("\n", o); oline++;
	}
    }
}

void
Go_genSwitch(Go *g, FILE *o, State *from, State *next, int *readCh){
    if(g->nSpans <= 2){
	Go_genLinear(g, o, from, next, readCh);
    } else {
	State *def = g->span[g->nSpans-1].to;
	Span **sP = malloc(sizeof(Span*)*(g->nSpans-1)), **r, **s, **t;
	unsigned int i;

	t = &sP[0];
	for(i = 0; i < g->nSpans; ++i)
	    if(g->span[i].to != def)
		*(t++) = &g->span[i];

	    if (dFlag)
		fputs("\tYYDEBUG(-1, yych);\n", o);

#if 0
	if (*readCh) {
	    fputs("\tswitch((yych = *YYCURSOR)) {\n", o);
	    *readCh = 0;
	} else
#endif
	    fputs("\tswitch(yych){\n", o);
	oline++;
	while(t != &sP[0]){
	    State *to;
	    r = s = &sP[0];
	    if(*s == &g->span[0])
		genCases(o, 0, *s);
	    else
		genCases(o, (*s)[-1].ub, *s);
	    to = (*s)->to;
	    while(++s < t){
		if((*s)->to == to)
		    genCases(o, (*s)[-1].ub, *s);
		else
		    *(r++) = *s;
	    }
	    genGoTo(o, from, to, readCh, "\t");
	    t = r;
	}
	fputs("\tdefault:", o);
	genGoTo(o, from, def, readCh, "\t");
	fputs("\t}\n", o); oline++;

	free(sP);
    }
}

static void doBinary(FILE *o, unsigned int i, Span *s, unsigned int n,
		     State *from, State *next, int *readCh){
    if(n <= 4){
	doLinear(o, i, s, n, from, next, readCh);
    } else {
	unsigned int h = n/2;
	indent(o, i);
	genIf(o, "<=", s[h-1].ub - 1, readCh);
	fputs("{\n", o); oline++;
	doBinary(o, i+1, &s[0], h, from, next, readCh);
	indent(o, i); fputs("\t} else {\n", o); oline++;
	doBinary(o, i+1, &s[h], n - h, from, next, readCh);
	indent(o, i); fputs("\t}\n", o); oline++;
    }
}

void
Go_genBinary(Go *g, FILE *o, State *from, State *next, int *readCh){
    doBinary(o, 0, g->span, g->nSpans, from, next, readCh);
}

void
Go_genBase(Go *g, FILE *o, State *from, State *next, int *readCh){
    if(g->nSpans == 0)
	return;
    if(!sFlag){
	Go_genSwitch(g, o, from, next, readCh);
	return;
    }
    if(g->nSpans > 8){
	Span *bot = &g->span[0], *top = &g->span[g->nSpans-1];
	unsigned int util;
	if(bot[0].to == top[0].to){
	    util = (top[-1].ub - bot[0].ub)/(g->nSpans - 2);
	} else {
	    if(bot[0].ub > (top[0].ub - top[-1].ub)){
		util = (top[0].ub - bot[0].ub)/(g->nSpans - 1);
	    } else {
		util = top[-1].ub/(g->nSpans - 1);
	    }
	}
	if(util <= 2){
	    Go_genSwitch(g, o, from, next, readCh);
	    return;
	}
    }
    if(g->nSpans > 5){
	Go_genBinary(g, o, from, next, readCh);
    } else {
	Go_genLinear(g, o, from, next, readCh);
    }
}

void
Go_genGoto(Go *g, FILE *o, State *from, State *next, int *readCh){
    unsigned int i;
    if(bFlag){
	for(i = 0; i < g->nSpans; ++i){
	    State *to = g->span[i].to;
	    if(to && to->isBase){
		BitMap *b = BitMap_find(to);
		if(b && matches(b->go, b->on, g, to)){
		    Go go;
		    go.span = malloc(sizeof(Span)*g->nSpans);
		    Go_unmap(&go, g, to);
		    fprintf(o, "\tif(yybm[%u+", b->i);
#if 0
		    if (*readCh)
			fputs("(yych = *YYCURSOR)", o);
		    else
#endif
			fputs("yych", o);
		    fprintf(o, "] & %u) {\n", (unsigned int) b->m); oline++;
		    genGoTo(o, from, to, readCh, "\t\t");
		    fputs("\t}\n", o); oline++;
		    Go_genBase(&go, o, from, next, readCh);
		    free(go.span);
		    return;
		}
	    }
	}
    }
    Go_genBase(g, o, from, next, readCh);
}

void State_emit(State *s, FILE *o, int *readCh){
    if (vUsedLabels[s->label])
	fprintf(o, "yy%u:", s->label);
    if (dFlag)
	fprintf(o, "\n\tYYDEBUG(%u, *YYCURSOR);\n", s->label);
    Action_emit(s->action, o, readCh);
}

static unsigned int merge(Span *x0, State *fg, State *bg){
    Span *x = x0, *f = fg->go.span, *b = bg->go.span;
    unsigned int nf = fg->go.nSpans, nb = bg->go.nSpans;
    State *prev = NULL, *to;
    /* NB: we assume both spans are for same range */
    for(;;){
	if(f->ub == b->ub){
	    to = f->to == b->to? bg : f->to;
	    if(to == prev){
		--x;
	    } else {
		x->to = prev = to;
	    }
	    x->ub = f->ub;
	    ++x; ++f; --nf; ++b; --nb;
	    if(nf == 0 && nb == 0)
		return x - x0;
	}
	while(f->ub < b->ub){
	    to = f->to == b->to? bg : f->to;
	    if(to == prev){
		--x;
	    } else {
		x->to = prev = to;
	    }
	    x->ub = f->ub;
	    ++x; ++f; --nf;
	}
	while(b->ub < f->ub){
	    to = b->to == f->to? bg : f->to;
	    if(to == prev){
		--x;
	    } else {
		x->to = prev = to;
	    }
	    x->ub = b->ub;
	    ++x; ++b; --nb;
	}
    }
}

const unsigned int cInfinity = ~0;

typedef struct SCC {
    State	**top, **stk;
} SCC;

static void SCC_init(SCC*, unsigned int);
static SCC *SCC_new(unsigned int);
static void SCC_destroy(SCC*);
static void SCC_delete(SCC*);
static void SCC_traverse(SCC*, State*);

static void
SCC_init(SCC *s, unsigned int size)
{
    s->top = s->stk = malloc(sizeof(State*)*size);
}

static SCC *
SCC_new(unsigned int size){
    SCC *s = malloc(sizeof(SCC));
    s->top = s->stk = malloc(sizeof(State*)*size);
    return s;
}

static void
SCC_destroy(SCC *s){
    free(s->stk);
}

static void
SCC_delete(SCC *s){
    free(s->stk);
    free(s);
}

static void SCC_traverse(SCC *s, State *x){
    unsigned int k, i;

    *s->top = x;
    k = ++s->top - s->stk;
    x->depth = k;
    for(i = 0; i < x->go.nSpans; ++i){
	State *y = x->go.span[i].to;
	if(y){
	    if(y->depth == 0)
		SCC_traverse(s, y);
	    if(y->depth < x->depth)
		x->depth = y->depth;
	}
    }
    if(x->depth == k)
	do {
	    (*--s->top)->depth = cInfinity;
	    (*s->top)->link = x;
	} while(*s->top != x);
}

static unsigned int maxDist(State *s){
    unsigned int mm = 0, i;
    for(i = 0; i < s->go.nSpans; ++i){
	State *t = s->go.span[i].to;
	if(t){
	    unsigned int m = 1;
	    if(!t->link) {
		if (t->depth == (unsigned int)-1)
		    t->depth = maxDist(t);
		m += t->depth;
	    }
	    if(m > mm)
		mm = m;
	}
    }
    return mm;
}

static void calcDepth(State *head){
    State *t, *s;
    for(s = head; s; s = s->next){
	if(s->link == s){
	    unsigned int i;
	    for(i = 0; i < s->go.nSpans; ++i){
		t = s->go.span[i].to;
		if(t && t->link == s)
		    goto inSCC;
	    }
	    s->link = NULL;
	} else {
	inSCC:
	    s->depth = maxDist(s);
	}
    }
}
 
void DFA_findSCCs(DFA *d){
    SCC scc;
    State *s;

    SCC_init(&scc, d->nStates);
    for(s = d->head; s; s = s->next){
	s->depth = 0;
	s->link = NULL;
    }

    for(s = d->head; s; s = s->next)
	if(!s->depth)
	    SCC_traverse(&scc, s);

    calcDepth(d->head);

    SCC_destroy(&scc);
}

void DFA_split(DFA *d, State *s){
    State *move = State_new();
    Action_new_Move(move);
    DFA_addState(d, &s->next, move);
    move->link = s->link;
    move->rule = s->rule;
    move->go = s->go;
    s->rule = NULL;
    s->go.nSpans = 1;
    s->go.span = malloc(sizeof(Span));
    s->go.span[0].ub = d->ubChar;
    s->go.span[0].to = move;
}

void DFA_emit(DFA *d, FILE *o){
    static unsigned int label = 0;
    State *s;
    unsigned int i, bitmap_brace = 0;
    unsigned int nRules = 0;
    unsigned int nSaves = 0;
    unsigned int *saves;
    unsigned int nOrgOline;
    State **rules;
    State *accept = NULL;
    Span *span;
    FILE *tmpo;
    int hasFillLabels;
    int maxFillIndexes, orgVFillIndexes;
    unsigned int start_label;

    hasFillLabels = (0<=vFillIndexes);
    if (hasFillLabels && label!=0) {
	fputs("re2c : error : multiple /*!re2c blocks aren't supported when -f is specified\n", stderr);
	exit(1);
    }

    DFA_findSCCs(d);
    d->head->link = d->head;

    maxFill = 1;
    for(s = d->head; s; s = s->next) {
	s->depth = maxDist(s);
	if (maxFill < s->depth)
	    maxFill = s->depth;
	if(s->rule && s->rule->d.RuleOp.accept >= nRules)
		nRules = s->rule->d.RuleOp.accept + 1;
    }

    saves = malloc(sizeof(unsigned int)*nRules);
    memset(saves, ~0, (nRules)*sizeof(unsigned int));

    /* mark backtracking points */
    for(s = d->head; s; s = s->next){
	//RegExp *ignore = NULL;/*RuleOp*/
	if(s->rule){
	    for(i = 0; i < s->go.nSpans; ++i)
		if(s->go.span[i].to && !s->go.span[i].to->rule){
		    free(s->action);
		    if(saves[s->rule->d.RuleOp.accept] == ~0u)
			saves[s->rule->d.RuleOp.accept] = nSaves++;
		    Action_new_Save(s, saves[s->rule->d.RuleOp.accept]);
		    continue;
		}
	    //ignore = s->rule;
	}
    }

    /* insert actions */
    rules = malloc(sizeof(State*)*nRules);
    memset(rules, 0, (nRules)*sizeof(State*));
    for(s = d->head; s; s = s->next){
	State *ow;
	if(!s->rule){
	    ow = accept;
	} else {
	    if(!rules[s->rule->d.RuleOp.accept]){
		State *n = State_new();
		Action_new_Rule(n, s->rule);
		rules[s->rule->d.RuleOp.accept] = n;
		DFA_addState(d, &s->next, n);
	    }
	    ow = rules[s->rule->d.RuleOp.accept];
	}
	for(i = 0; i < s->go.nSpans; ++i)
	    if(!s->go.span[i].to){
		if(!ow){
		    ow = accept = State_new();
		    Action_new_Accept(accept, nRules, saves, rules);
		    DFA_addState(d, &s->next, accept);
		}
		s->go.span[i].to = ow;
	    }
    }

    /* split ``base'' states into two parts */
    for(s = d->head; s; s = s->next){
	s->isBase = 0;
	if(s->link){
	    for(i = 0; i < s->go.nSpans; ++i){
		if(s->go.span[i].to == s){
		    s->isBase = 1;
		    DFA_split(d, s);
		    if(bFlag)
			BitMap_find_go(&s->next->go, s);
		    s = s->next;
		    break;
		}
	    }
	}
    }

    /* find ``base'' state, if possible */
    span = malloc(sizeof(Span)*(d->ubChar - d->lbChar));
    for(s = d->head; s; s = s->next){
	if(!s->link){
	    for(i = 0; i < s->go.nSpans; ++i){
		State *to = s->go.span[i].to;
		if(to && to->isBase){
		    unsigned int nSpans;
		    to = to->go.span[0].to;
		    nSpans = merge(span, s, to);
		    if(nSpans < s->go.nSpans){
			free(s->go.span);
			s->go.nSpans = nSpans;
			s->go.span = malloc(sizeof(Span)*nSpans);
			memcpy(s->go.span, span, nSpans*sizeof(Span));
		    }
		    break;
		}
	    }
	}
    }
    free(span);

    free(d->head->action);

    if(bFlag) {
	fputs("{\n", o);
	oline++;
	bitmap_brace = 1;
	BitMap_gen(o, d->lbChar, d->ubChar);
    }

    bUsedYYAccept = 0;

    start_label = label;

    Action_new_Enter(d->head, label++);

    for(s = d->head; s; s = s->next)
	s->label = label++;

    nOrgOline = oline;
    maxFillIndexes = vFillIndexes;
    orgVFillIndexes = vFillIndexes;
#ifdef _WIN32
    tmpo = win32_tmpfile();
#else
    tmpo = tmpfile();
#endif
    for(s = d->head; s; s = s->next){
	int readCh = 0;
	State_emit(s, tmpo, &readCh);
	Go_genGoto(&s->go, tmpo, s, s->next, &readCh);
    }
    fclose(tmpo);
    maxFillIndexes = vFillIndexes;
    vFillIndexes = orgVFillIndexes;
    oline = nOrgOline;

    fputs("\n", o);
    oline++;
    if (!iFlag)
	fprintf(o, "#line %u \"%s\"\n", oline++, outputFileName);

    if (!hasFillLabels) {
	fputs("{\n\tYYCTYPE yych;\n", o);
	oline += 2;
	if (bUsedYYAccept) {
	    fputs("\tunsigned int yyaccept;\n", o);
	    oline++;
	}
    } else {
	fputs("{\n\n", o);
	oline += 2;
    }

    if (!hasFillLabels) {
	fprintf(o, "\tgoto yy%u;\n", start_label);
	oline++;
	useLabel(label);
    } else {
	int i;
	fputs("\tswitch(YYGETSTATE()) {\n", o);
	fputs("\t\tcase -1: goto yy0;\n", o);

	for (i=0; i<maxFillIndexes; ++i)
	    fprintf(o, "\t\tcase %u: goto yyFillLabel%u;\n", i, i);

	fputs("\t\tdefault: /* abort() */;\n", o);
	fputs("\t}\n", o);
	fputs("yyNext:\n", o);

	oline += maxFillIndexes;
	oline += 5;
    }

    for(s = d->head; s; s = s->next){
	int readCh = 0;
	State_emit(s, o, &readCh);
	Go_genGoto(&s->go, o, s, s->next, &readCh);
    }
    fputs("}\n", o); oline++;
    if (bitmap_brace) {
	fputs("}\n", o);
	oline++;
    }

    BitMap_first = NULL;

    free(saves);
    free(rules);
}
