#!/bin/sh
###########################################################################
##                                                                       ##
##                  Language Technologies Institute                      ##
##                     Carnegie Mellon University                        ##
##                       Copyright (c) 2001-2008                         ##
##                         All Rights Reserved.                          ##
##                                                                       ##
##  Permission is hereby granted, free of charge, to use and distribute  ##
##  this software and its documentation without restriction, including   ##
##  without limitation the rights to use, copy, modify, merge, publish,  ##
##  distribute, sublicense, and/or sell copies of this work, and to      ##
##  permit persons to whom this work is furnished to do so, subject to   ##
##  the following conditions:                                            ##
##   1. The code must retain the above copyright notice, this list of    ##
##      conditions and the following disclaimer.                         ##
##   2. Any modifications must be clearly marked as such.                ##
##   3. Original authors' names are not deleted.                         ##
##   4. The authors' names are not used to endorse or promote products   ##
##      derived from this software without specific prior written        ##
##      permission.                                                      ##
##                                                                       ##
##  CARNEGIE MELLON UNIVERSITY AND THE CONTRIBUTORS TO THIS WORK         ##
##  DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING      ##
##  ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT   ##
##  SHALL CARNEGIE MELLON UNIVERSITY NOR THE CONTRIBUTORS BE LIABLE      ##
##  FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES    ##
##  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN   ##
##  AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,          ##
##  ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF       ##
##  THIS SOFTWARE.                                                       ##
##                                                                       ##
###########################################################################
##                                                                       ##
##  Convert an EST WFST into C code (with awk and sed!)                  ##
##                                                                       ##
###########################################################################


sed '1,/EST_Header_End/d' $1 |
awk 'BEGIN {
     mmm["a"] = 97;
     mmm["b"] = 98;
     mmm["c"] = 99;
     mmm["d"] = 100;
     mmm["e"] = 101;
     mmm["f"] = 102;
     mmm["g"] = 103;
     mmm["h"] = 104;
     mmm["i"] = 105;
     mmm["j"] = 106;
     mmm["k"] = 107;
     mmm["l"] = 108;
     mmm["m"] = 109;
     mmm["n"] = 110;
     mmm["o"] = 111;
     mmm["p"] = 112;
     mmm["q"] = 113;
     mmm["r"] = 114;
     mmm["s"] = 115;
     mmm["t"] = 116;
     mmm["u"] = 117;
     mmm["v"] = 118;
     mmm["w"] = 119;
     mmm["x"] = 120;
     mmm["y"] = 121;
     mmm["z"] = 122;
     mmm["#"] = 35;
     mmm["V"] = 86;
     mmm["N"] = 78;
     state = "0";
     name="'`basename $1 .wfst`'";
     }
     function symstate(sym,state)
     {
        m = sprintf("((fsm_%s_state_%d * 128) + %d)",name,state,mmm[sym]);
        return m;
     }
     {if (NF == 3)
     {
        state = substr($1,3);
        if (state != "0")
        {
           printf("#define fsm_%s_trans_%d 0\n",name,trans);
           trans++;
        }
        printf("#define fsm_%s_state_%d %d\n",name,state,trans);
     }
     else if (NF == 4)
     {
        printf("#define fsm_%s_trans_%d %s\n",name,trans,symstate($2,$3));
        trans++;
     }
     }
     END {printf("#define fsm_%s_trans_%d 0\n",name,trans);
          trans++;
          printf("static short fsm_%s_trans[%d] = {\n",name,trans);
          for (i=0; i<trans-1; i++)
          {
              printf("   fsm_%s_trans_%d,\n",name,i);
          }
          printf("   fsm_%s_trans_%d\n",name,i);
          printf("};\n");
          printf("static cst_fsm fsm_%s = {\n",name);
          printf("   128, /* vocab size */\n");
          printf("   %d,  /* num_transitions */\n",trans);
          printf("   fsm_%s_trans\n",name);
          printf("};\n");
         }'


          
          
