# $1 should be the awk interpretter to use
if [ "$1" = "" ]
then
	echo "Error - expecting to be given the awk interpretter to use"
	exit 2
fi

awkfname=$1

$awkfname '
BEGIN  {
	cnt=0
	print "const int *token_groups[]={" > "mk_sstates_1.h";
}


/^state/ {
	if (state!="") {
		val=""
		for (a in arr) {
			if (substr(a,1,1)=="$") continue;
			if (val) val=val "," a 
			else val=a
		}

		if (val=="") val="-1"
		if (arr_vals[val]!="") this_val=arr_vals[val]
		else {
			this_val=cnt;
			arr_vals[val]=cnt++;
		}
		print "    token_group_" this_val "," > "mk_sstates_1.h"
	}
	state=$2
        for (a in arr) {
                delete arr[a]
        }

}

(state=="") {next}

/\. / {
	for (a=1;a<=NF;a++) {

		if ($a==".") {
			rest=""
			a++;
			x=substr($a,1,1)

			if (x>="A"&&x<="Z") {
				x=$a
				
				if (x=="error") continue;
				arr[x]=1
			}

			if (x=="[") {
				for (b=a;b<=NF;b++) {
					if (b==a) {
						x=substr($b,2)
					} else {
						x=$b
					}
					gsub(",","",x)
					gsub("]","",x)
					if (x=="error") continue;
					arr[x]=1
				}
				
			}
		}
	}
}

END {
   print "   0};" > "mk_sstates_1.h"
   print " "

   for (a in arr_vals) {
      if (printed[arr_vals[a]]!="") continue; printed[arr_vals[a]]="YES"
      #print "const int *token_group_" arr_vals[a] ";" > "rules/generated/mk_sstates.h"
      if (a=="") a="-1"
      print "const int token_group_" arr_vals[a] "[]={" a ",-1};"
      print " "
   }
   print "#include \"mk_sstates_1.h\""
   
        print "static int SQLPARSE_allow_token_state(int yystate,int yytoken) {"
        print "int a;"
        print "int c;"
        print "const int *token_group;";
        print "  if (yytoken<0) return 1;"
        print "  token_group=token_groups[yystate];";
        print "  a=0;"
        print "  c=token_group[a];"
        print "  while (c>=0) {"
        print "    if (c==yytoken) return 1;"
        print "    c=token_group[++a];";
        print "  }"


        #print "  for (a=0;token_group[a]>=0;a++) {";
        #print "   if (token_groups[yystate][a]==yytoken) return 1;"
        #print "  }"
        print "  return 0;"
        print "}"

   

}' < y.output > mk_sstates.c