| |
| /* |
| * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are |
| * met: redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer; |
| * redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution; |
| * neither the name of the copyright holders nor the names of its |
| * contributors may be used to endorse or promote products derived from |
| * this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| /* |
| * $Id$ |
| * |
| */ |
| |
| #include "mem/slicc/generator/mif_gen.hh" |
| #include "mem/slicc/symbols/State.hh" |
| #include "mem/slicc/symbols/Event.hh" |
| #include "mem/slicc/symbols/Action.hh" |
| #include "mem/slicc/symbols/Transition.hh" |
| |
| // -- Helper functions |
| string formatShorthand(const string shorthand); |
| string formatCellRuling(const string shorthand); |
| |
| void printStateTableMIF(const StateMachine& sm, ostream& out) |
| { |
| const string mif_prolog1 = |
| "<MIFFile 5.50> # Generated by Multifacet MIF Mungers Inc\n\ |
| <Tbls\n\ |
| <Tbl\n\ |
| <TblID 1>\n\ |
| <TblTag `Format A'>\n\ |
| <TblFormat\n\ |
| \n\ |
| <TblAlignment Center>\n\ |
| \n\ |
| # <TblXColumnNum 0>\n\ |
| <TblXColumnRuling `Medium'>\n\ |
| \n\ |
| <TblLRuling `Medium'>\n\ |
| <TblRRuling `Medium'>\n\ |
| <TblTRuling `Medium'>\n\ |
| <TblBRuling `Medium'>\n\ |
| \n\ |
| <TblColumn\n\ |
| <TblColumnNum 0>\n\ |
| <TblColumnWidth 0.51\">\n\ |
| <TblColumnH\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnH\n\ |
| <TblColumnBody\n\ |
| <PgfTag `CellBody'>\n\ |
| > # end of TblColumnBody\n\ |
| <TblColumnF\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnF\n\ |
| > # end of TblColumn\n\ |
| <TblColumn\n\ |
| <TblColumnNum 1>\n\ |
| <TblColumnWidth 0.51\">\n\ |
| <TblColumnH\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnH\n\ |
| <TblColumnBody\n\ |
| <PgfTag `CellBody'>\n\ |
| > # end of TblColumnBody\n\ |
| <TblColumnF\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnF\n\ |
| > # end of TblColumn\n\ |
| > # end of TblFormat\n\ |
| \n\ |
| <TblNumColumns 2>\n\ |
| <TblColumnWidth 0.51\">\n\ |
| <TblColumnWidth 6.00\">\n\ |
| <TblTitle\n\ |
| <TblTitleContent\n\ |
| <Para\n\ |
| <PgfTag `TableTitle'>\n\ |
| <Pgf\n\ |
| <PgfAlignment Center>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| > # end of Pgf\n\ |
| <PgfNumString `TABLE 1. '>\n\ |
| <ParaLine\n\ |
| <Marker\n\ |
| <MType 9>\n\ |
| <MTypeName `Cross-Ref'>\n\ |
| <MCurrPage `1'>\n\ |
| > # end of Marker\n\ |
| <String `"; |
| |
| const string mif_prolog2 = |
| "'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of TblTitleContent\n\ |
| > # end of TblTitle\n\ |
| \n\ |
| <TblH\n\ |
| <Row\n\ |
| <RowMaxHeight 14.0\">\n\ |
| <RowHeight 0.44444\">\n\ |
| <Cell\n\ |
| <CellLRuling `Medium'>\n\ |
| <CellBRuling `Medium'>\n\ |
| <CellRRuling `Medium'>\n\ |
| <CellTRuling `Medium'>\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellHeading'>\n\ |
| <Pgf\n\ |
| <PgfAlignment Center>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| >\n\ |
| <ParaLine\n\ |
| <String `State'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| <Cell\n\ |
| <CellLRuling `Medium'>\n\ |
| <CellBRuling `Medium'>\n\ |
| <CellRRuling `Medium'>\n\ |
| <CellTRuling `Medium'>\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellHeading'>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| <ParaLine\n\ |
| <String `Description'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| > # end of Row\n\ |
| > # end of TblH\n\ |
| \n\ |
| <TblBody\n\ |
| "; |
| |
| const string row_before_state = |
| " <Row\n\ |
| <RowMaxHeight 14.0\">\n\ |
| <RowHeight 0.22222\">\n\ |
| <Cell\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellBody'>\n\ |
| <Pgf\n\ |
| <PgfAlignment Center>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| >\n\ |
| <ParaLine\n\ |
| <String `"; |
| |
| const string row_between_state_desc = |
| "'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| <Cell\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellBody'>\n\ |
| <ParaLine\n\ |
| <String `"; |
| |
| const string row_after_desc = |
| "'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| > # end of Row\n\ |
| "; |
| |
| const string mif_epilog = |
| " > # end of TblBody\n\ |
| > # end of Tbl\n\ |
| > # end of Tbls\n\ |
| \n\ |
| <Para\n\ |
| <ParaLine\n\ |
| <ATbl 1>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| \n\ |
| # End of MIFFile\n\ |
| "; |
| |
| out << mif_prolog1; |
| out << formatShorthand( sm.getShorthand() ); |
| out << " states"; |
| out << mif_prolog2; |
| |
| for( int i = 0; i < sm.numStates(); i++ ) |
| { |
| out << row_before_state; |
| out << formatShorthand( sm.getState( i ).getShorthand() ); |
| out << row_between_state_desc; |
| out << sm.getState( i ).getDescription(); |
| out << row_after_desc; |
| } |
| |
| out << mif_epilog; |
| } |
| |
| |
| void printEventTableMIF(const StateMachine& sm, ostream& out) |
| { |
| const string mif_prolog1 = |
| "<MIFFile 5.50> # Generated by Multifacet MIF Mungers Inc\n\ |
| <Tbls\n\ |
| <Tbl\n\ |
| <TblID 1>\n\ |
| <TblTag `Format A'>\n\ |
| <TblFormat\n\ |
| \n\ |
| <TblAlignment Center>\n\ |
| \n\ |
| # <TblXColumnNum 0>\n\ |
| <TblXColumnRuling `Medium'>\n\ |
| \n\ |
| <TblLRuling `Medium'>\n\ |
| <TblRRuling `Medium'>\n\ |
| <TblTRuling `Medium'>\n\ |
| <TblBRuling `Medium'>\n\ |
| \n\ |
| <TblColumn\n\ |
| <TblColumnNum 0>\n\ |
| <TblColumnWidth 0.51\">\n\ |
| <TblColumnH\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnH\n\ |
| <TblColumnBody\n\ |
| <PgfTag `CellBody'>\n\ |
| > # end of TblColumnBody\n\ |
| <TblColumnF\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnF\n\ |
| > # end of TblColumn\n\ |
| <TblColumn\n\ |
| <TblColumnNum 1>\n\ |
| <TblColumnWidth 0.51\">\n\ |
| <TblColumnH\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnH\n\ |
| <TblColumnBody\n\ |
| <PgfTag `CellBody'>\n\ |
| > # end of TblColumnBody\n\ |
| <TblColumnF\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnF\n\ |
| > # end of TblColumn\n\ |
| > # end of TblFormat\n\ |
| \n\ |
| <TblNumColumns 2>\n\ |
| <TblColumnWidth 0.51\">\n\ |
| <TblColumnWidth 6.00\">\n\ |
| <TblTitle\n\ |
| <TblTitleContent\n\ |
| <Para\n\ |
| <PgfTag `TableTitle'>\n\ |
| <Pgf\n\ |
| <PgfAlignment Center>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| > # end of Pgf\n\ |
| <PgfNumString `TABLE 1. '>\n\ |
| <ParaLine\n\ |
| <Marker\n\ |
| <MType 9>\n\ |
| <MTypeName `Cross-Ref'>\n\ |
| <MCurrPage `1'>\n\ |
| > # end of Marker\n\ |
| <String `"; |
| const string mif_prolog2 = |
| "'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of TblTitleContent\n\ |
| > # end of TblTitle\n\ |
| \n\ |
| <TblH\n\ |
| <Row\n\ |
| <RowMaxHeight 14.0\">\n\ |
| <RowHeight 0.44444\">\n\ |
| <Cell\n\ |
| <CellLRuling `Medium'>\n\ |
| <CellBRuling `Medium'>\n\ |
| <CellRRuling `Medium'>\n\ |
| <CellTRuling `Medium'>\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellHeading'>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| <Pgf\n\ |
| <PgfAlignment Center>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| >\n\ |
| <ParaLine\n\ |
| <String `Event'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| <Cell\n\ |
| <CellLRuling `Medium'>\n\ |
| <CellBRuling `Medium'>\n\ |
| <CellRRuling `Medium'>\n\ |
| <CellTRuling `Medium'>\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellHeading'>\n\ |
| <ParaLine\n\ |
| <String `Description'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| > # end of Row\n\ |
| > # end of TblH\n\ |
| \n\ |
| <TblBody\n\ |
| "; |
| |
| const string row_before_event = |
| " <Row\n\ |
| <RowMaxHeight 14.0\">\n\ |
| <RowHeight 0.22222\">\n\ |
| <Cell\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellBody'>\n\ |
| <Pgf\n\ |
| <PgfAlignment Center>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| >\n\ |
| <ParaLine\n\ |
| <String `"; |
| |
| const string row_between_event_desc = |
| "'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| <Cell\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellBody'>\n\ |
| <ParaLine\n\ |
| <String `"; |
| |
| const string row_after_desc = |
| "'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| > # end of Row\n\ |
| "; |
| |
| const string mif_epilog = |
| " > # end of TblBody\n\ |
| > # end of Tbl\n\ |
| > # end of Tbls\n\ |
| \n\ |
| <Para\n\ |
| <ParaLine\n\ |
| <ATbl 1>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| \n\ |
| # End of MIFFile\n\ |
| "; |
| |
| out << mif_prolog1; |
| out << formatShorthand( sm.getShorthand() ); |
| out << " events"; |
| out << mif_prolog2; |
| |
| for( int i = 0; i < sm.numEvents(); i++ ) |
| { |
| out << row_before_event; |
| out << formatShorthand( sm.getEvent( i ).getShorthand() ); |
| out << row_between_event_desc; |
| out << sm.getEvent( i ).getDescription(); |
| out << row_after_desc; |
| } |
| |
| out << mif_epilog; |
| } |
| |
| |
| void printActionTableMIF(const StateMachine& sm, ostream& out) |
| { |
| const string mif_prolog1 = |
| "<MIFFile 5.50> # Generated by Multifacet MIF Mungers Inc\n\ |
| <Tbls\n\ |
| <Tbl\n\ |
| <TblID 1>\n\ |
| <TblTag `Format A'>\n\ |
| <TblFormat\n\ |
| \n\ |
| <TblAlignment Center>\n\ |
| \n\ |
| # <TblXColumnNum 0>\n\ |
| <TblXColumnRuling `Medium'>\n\ |
| \n\ |
| <TblLRuling `Medium'>\n\ |
| <TblRRuling `Medium'>\n\ |
| <TblTRuling `Medium'>\n\ |
| <TblBRuling `Medium'>\n\ |
| \n\ |
| <TblColumn\n\ |
| <TblColumnNum 0>\n\ |
| <TblColumnWidth 0.51\">\n\ |
| <TblColumnH\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnH\n\ |
| <TblColumnBody\n\ |
| <PgfTag `CellBody'>\n\ |
| > # end of TblColumnBody\n\ |
| <TblColumnF\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnF\n\ |
| > # end of TblColumn\n\ |
| <TblColumn\n\ |
| <TblColumnNum 1>\n\ |
| <TblColumnWidth 0.51\">\n\ |
| <TblColumnH\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnH\n\ |
| <TblColumnBody\n\ |
| <PgfTag `CellBody'>\n\ |
| > # end of TblColumnBody\n\ |
| <TblColumnF\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnF\n\ |
| > # end of TblColumn\n\ |
| > # end of TblFormat\n\ |
| \n\ |
| <TblNumColumns 2>\n\ |
| <TblColumnWidth 0.51\">\n\ |
| <TblColumnWidth 6.00\">\n\ |
| <TblTitle\n\ |
| <TblTitleContent\n\ |
| <Para\n\ |
| <PgfTag `TableTitle'>\n\ |
| <Pgf\n\ |
| <PgfAlignment Center>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| > # end of Pgf\n\ |
| <PgfNumString `TABLE 1. '>\n\ |
| <ParaLine\n\ |
| <Marker\n\ |
| <MType 9>\n\ |
| <MTypeName `Cross-Ref'>\n\ |
| <MCurrPage `1'>\n\ |
| > # end of Marker\n\ |
| <String `"; |
| const string mif_prolog2 = |
| "'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of TblTitleContent\n\ |
| > # end of TblTitle\n\ |
| \n\ |
| <TblH\n\ |
| <Row\n\ |
| <RowMaxHeight 14.0\">\n\ |
| <RowHeight 0.44444\">\n\ |
| <Cell\n\ |
| <CellLRuling `Medium'>\n\ |
| <CellBRuling `Medium'>\n\ |
| <CellRRuling `Medium'>\n\ |
| <CellTRuling `Medium'>\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellHeading'>\n\ |
| <Pgf\n\ |
| <PgfAlignment Center>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| >\n\ |
| <ParaLine\n\ |
| <String `Action'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| <Cell\n\ |
| <CellLRuling `Medium'>\n\ |
| <CellBRuling `Medium'>\n\ |
| <CellRRuling `Medium'>\n\ |
| <CellTRuling `Medium'>\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellHeading'>\n\ |
| <ParaLine\n\ |
| <String `Description'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| > # end of Row\n\ |
| > # end of TblH\n\ |
| \n\ |
| <TblBody\n\ |
| "; |
| |
| const string row_before_action = |
| " <Row\n\ |
| <RowMaxHeight 14.0\">\n\ |
| <RowHeight 0.22222\">\n\ |
| <Cell\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellBody'>\n\ |
| <Pgf\n\ |
| <PgfAlignment Center>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| >\n\ |
| <ParaLine\n\ |
| <String `"; |
| |
| const string row_between_action_desc = |
| "'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| <Cell\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellBody'>\n\ |
| <ParaLine\n\ |
| <String `"; |
| |
| const string row_after_desc = |
| "'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| > # end of Row\n\ |
| "; |
| |
| const string mif_epilog = |
| " > # end of TblBody\n\ |
| > # end of Tbl\n\ |
| > # end of Tbls\n\ |
| \n\ |
| <Para\n\ |
| <ParaLine\n\ |
| <ATbl 1>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| \n\ |
| # End of MIFFile\n\ |
| "; |
| |
| out << mif_prolog1; |
| out << formatShorthand( sm.getShorthand() ); |
| out << " actions"; |
| out << mif_prolog2; |
| |
| for( int i = 0; i < sm.numActions(); i++ ) |
| { |
| out << row_before_action; |
| out << formatShorthand( sm.getAction( i ).getShorthand() ); |
| out << row_between_action_desc; |
| out << sm.getAction( i ).getDescription(); |
| out << row_after_desc; |
| } |
| |
| out << mif_epilog; |
| } |
| |
| |
| void printTransitionTableMIF(const StateMachine& sm, ostream& out) |
| { |
| const string mif_prolog = |
| "<MIFFile 5.50> # Generated by Multifacet MIF Mungers Inc\n\ |
| <Tbls\n\ |
| <Tbl\n\ |
| <TblID 1>\n\ |
| <TblTag `Format A'>\n\ |
| <TblFormat\n\ |
| \n\ |
| <TblAlignment Center>\n\ |
| \n\ |
| # <TblXColumnNum 0>\n\ |
| <TblXColumnRuling `Medium'>\n\ |
| \n\ |
| <TblLRuling `Medium'>\n\ |
| <TblRRuling `Medium'>\n\ |
| <TblTRuling `Medium'>\n\ |
| <TblBRuling `Medium'>\n\ |
| \n\ |
| "; |
| |
| const string tbl_fmt_before_col_num = |
| " <TblColumn\n\ |
| <TblColumnNum "; |
| |
| const string tbl_fmt_after_col_num = |
| ">\n\ |
| <TblColumnWidth 0.51\">\n\ |
| <TblColumnH\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnH\n\ |
| <TblColumnBody\n\ |
| <PgfTag `CellBody'>\n\ |
| > # end of TblColumnBody\n\ |
| <TblColumnF\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnF\n\ |
| > # end of TblColumn\n\ |
| "; |
| |
| const string tbl_fmt_before_num_cols = |
| " > # end of TblFormat\n\ |
| \n\ |
| <TblNumColumns "; |
| |
| const string tbl_fmt_each_col_width_begin = |
| ">\n\ |
| <TblColumnWidth "; |
| |
| const string tbl_fmt_each_col_width_end = "\""; |
| |
| const string tbl_before_first_header1 = |
| ">\n\ |
| <TblTitle\n\ |
| <TblTitleContent\n\ |
| <Para\n\ |
| <PgfTag `TableTitle'>\n\ |
| <Pgf\n\ |
| <PgfAlignment Center>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| > # end of Pgf\n\ |
| <PgfNumString `TABLE 1. '>\n\ |
| <ParaLine\n\ |
| <Marker\n\ |
| <MType 9>\n\ |
| <MTypeName `Cross-Ref'>\n\ |
| <MCurrPage `1'>\n\ |
| > # end of Marker\n\ |
| <String `"; |
| |
| const string tbl_before_first_header2 = |
| "'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of TblTitleContent\n\ |
| > # end of TblTitle\n\ |
| \n\ |
| <TblH\n\ |
| <Row\n\ |
| <RowMaxHeight 14.0\">\n\ |
| <RowHeight 0.44444\">"; |
| |
| const string tbl_before_each_header = |
| " <Cell\n\ |
| <CellLRuling `Medium'>\n\ |
| <CellBRuling `Medium'>\n\ |
| <CellRRuling `Medium'>\n\ |
| <CellTRuling `Medium'>\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellHeading'>\n\ |
| <Pgf\n\ |
| <PgfAlignment Center>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| >\n\ |
| <ParaLine\n\ |
| <String `"; |
| |
| const string tbl_before_each_rot_header = |
| " <Cell\n\ |
| <CellLRuling `Medium'>\n\ |
| <CellBRuling `Medium'>\n\ |
| <CellRRuling `Medium'>\n\ |
| <CellTRuling `Medium'>\n\ |
| <CellAngle 270>\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellHeading'>\n\ |
| <ParaLine\n\ |
| <String `"; |
| |
| const string tbl_after_each_header = |
| "'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| "; |
| |
| const string before_first_row = |
| " > # end of Row\n\ |
| > # end of TblH\n\ |
| \n\ |
| <TblBody\n\ |
| "; |
| |
| const string row_before_first_cell = |
| " <Row\n\ |
| <RowMaxHeight 14.0\">\n\ |
| <RowHeight 0.22222\">"; |
| |
| const string row_cell_before_ruling = |
| " <Cell\n\ |
| "; |
| |
| const string row_cell_before_contents = |
| " <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellBody'>\n\ |
| <Pgf\n\ |
| <PgfAlignment Center>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| >\n\ |
| <ParaLine\n\ |
| <String `"; |
| |
| const string row_cell_after_contents = |
| "'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| "; |
| |
| const string row_empty_cell = |
| " <CellFill 5>\n\ |
| <CellColor `Cyan'>\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellBody'>\n\ |
| <ParaLine\n\ |
| <String `'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| "; |
| |
| const string row_after_last_cell = |
| " > # end of Row\n\ |
| "; |
| |
| |
| const string mif_epilog = |
| " > # end of TblBody\n\ |
| > # end of Tbl\n\ |
| > # end of Tbls\n\ |
| \n\ |
| <Para\n\ |
| <ParaLine\n\ |
| <ATbl 1>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| \n\ |
| # End of MIFFile\n\ |
| "; |
| |
| int i, j, num_rows, num_cols; |
| string row_ruling; |
| string col_ruling; |
| |
| num_rows = sm.numStates(); |
| num_cols = sm.numEvents() + 1; |
| |
| // -- Prolog |
| out << mif_prolog; |
| |
| // -- Table format (for each column) |
| for( i = 0; i < num_cols; i++ ) |
| { |
| out << tbl_fmt_before_col_num; |
| out << i; |
| out << tbl_fmt_after_col_num; |
| } |
| |
| // -- Spell out width of each column |
| |
| // -- FIXME: make following constants into parameters |
| const float total_table_width = 7.5; // -- Total page width = 7.5" (portrait mode) |
| const float min_col_width = 0.35; // -- Min col width (for legibility) |
| const float max_col_width = 0.75; // -- Max col width (for aesthetics) |
| float column_width; |
| |
| // -- Calculate column width and clamp it within a range |
| column_width = total_table_width / num_cols; |
| column_width = ((column_width < min_col_width) |
| ? min_col_width |
| : ((column_width > max_col_width) |
| ? max_col_width |
| : column_width)); |
| |
| out << tbl_fmt_before_num_cols; |
| out << num_cols; |
| for( i = 0; i < num_cols; i++ ) |
| { |
| out << tbl_fmt_each_col_width_begin << column_width << tbl_fmt_each_col_width_end; |
| } |
| |
| // -- Column headers |
| out << tbl_before_first_header1; |
| out << formatShorthand( sm.getShorthand() ); |
| out << " transitions"; |
| out << tbl_before_first_header2; |
| |
| out << tbl_before_each_header; |
| out << "State"; |
| out << tbl_after_each_header; |
| |
| for( i = 0; i < sm.numEvents(); i++ ) |
| { |
| out << tbl_before_each_rot_header; |
| out << formatShorthand( sm.getEvent(i).getShorthand() ); |
| out << tbl_after_each_header; |
| } |
| out << before_first_row; |
| |
| |
| // -- Body of table |
| for( i = 0; i < num_rows; i++ ) |
| { |
| // -- Each row |
| out << row_before_first_cell; |
| |
| // -- Figure out ruling |
| if (sm.getState(i).existPair("format")) { |
| row_ruling = formatCellRuling( sm.getState(i).lookupPair("format")); |
| } else { |
| row_ruling = ""; |
| } |
| |
| // -- First column = state |
| out << row_cell_before_ruling; |
| out << row_ruling; |
| out << row_cell_before_contents; |
| out << formatShorthand( sm.getState(i).getShorthand() ); |
| out << row_cell_after_contents; |
| |
| // -- One column for each event |
| for( j = 0; j < sm.numEvents(); j++ ) |
| { |
| const Transition* trans_ptr = sm.getTransPtr( i, j ); |
| |
| // -- Figure out ruling |
| if (sm.getEvent(j).existPair("format")) { |
| col_ruling = formatCellRuling(sm.getEvent(j).lookupPair("format")); |
| } else { |
| col_ruling = ""; |
| } |
| |
| out << row_cell_before_ruling; |
| out << row_ruling; |
| out << col_ruling; |
| |
| if( trans_ptr != NULL ) |
| { |
| string actions; |
| string nextState; |
| |
| // -- Get the actions |
| actions = formatShorthand( trans_ptr->getActionShorthands() ); |
| |
| // -- Get the next state |
| // FIXME: should compare index, not the string |
| if (trans_ptr->getNextStateShorthand() != |
| sm.getState(i).getShorthand() ) |
| { |
| nextState = formatShorthand( trans_ptr->getNextStateShorthand() ); |
| } else |
| { |
| nextState = ""; |
| } |
| |
| // -- Print out "actions/next-state" |
| out << row_cell_before_contents; |
| out << actions; |
| if ((nextState.length() != 0) && (actions.length() != 0)) { |
| out << "/"; |
| } |
| out << nextState; |
| out << row_cell_after_contents; |
| } |
| else |
| { |
| out << row_empty_cell; |
| } |
| |
| } |
| |
| out << row_after_last_cell; |
| } |
| |
| // -- Epilog |
| out << mif_epilog; |
| |
| } |
| /* |
| void printTBETableMIF(const StateMachine& sm, const Vector<Field>& fields, ostream& out) |
| { |
| const string mif_prolog1 = |
| "<MIFFile 5.50> # Generated by Multifacet MIF Mungers Inc\n\ |
| <Tbls\n\ |
| <Tbl\n\ |
| <TblID 1>\n\ |
| <TblTag `Format A'>\n\ |
| <TblFormat\n\ |
| \n\ |
| <TblAlignment Center>\n\ |
| \n\ |
| # # <TblXColumnNum 0>\n\ |
| <TblXColumnRuling `Medium'>\n\ |
| \n\ |
| <TblLRuling `Medium'>\n\ |
| <TblRRuling `Medium'>\n\ |
| <TblTRuling `Medium'>\n\ |
| <TblBRuling `Medium'>\n\ |
| \n\ |
| <TblColumn\n\ |
| <TblColumnNum 0>\n\ |
| <TblColumnWidth 0.51\">\n\ |
| <TblColumnH\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnH\n\ |
| <TblColumnBody\n\ |
| <PgfTag `CellBody'>\n\ |
| > # end of TblColumnBody\n\ |
| <TblColumnF\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnF\n\ |
| > # end of TblColumn\n\ |
| <TblColumn\n\ |
| <TblColumnNum 1>\n\ |
| <TblColumnWidth 0.51\">\n\ |
| <TblColumnH\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnH\n\ |
| <TblColumnBody\n\ |
| <PgfTag `CellBody'>\n\ |
| > # end of TblColumnBody\n\ |
| <TblColumnF\n\ |
| <PgfTag `CellHeading'>\n\ |
| > # end of TblColumnF\n\ |
| > # end of TblColumn\n\ |
| > # end of TblFormat\n\ |
| \n\ |
| <TblNumColumns 2>\n\ |
| <TblColumnWidth 0.51\">\n\ |
| <TblColumnWidth 6.00\">\n\ |
| <TblTitle\n\ |
| <TblTitleContent\n\ |
| <Para\n\ |
| <PgfTag `TableTitle'>\n\ |
| <Pgf\n\ |
| <PgfAlignment Center>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| > # end of Pgf\n\ |
| <PgfNumString `TABLE 1. '>\n\ |
| <ParaLine\n\ |
| <Marker\n\ |
| <MType 9>\n\ |
| <MTypeName `Cross-Ref'>\n\ |
| <MCurrPage `1'>\n\ |
| > # end of Marker\n\ |
| <String `"; |
| |
| const string mif_prolog2 = |
| "'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of TblTitleContent\n\ |
| > # end of TblTitle\n\ |
| \n\ |
| <TblH\n\ |
| <Row\n\ |
| <RowMaxHeight 14.0\">\n\ |
| <RowHeight 0.44444\">\n\ |
| <Cell\n\ |
| <CellLRuling `Medium'>\n\ |
| <CellBRuling `Medium'>\n\ |
| <CellRRuling `Medium'>\n\ |
| <CellTRuling `Medium'>\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellHeading'>\n\ |
| <Pgf\n\ |
| <PgfAlignment Center>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| >\n\ |
| <ParaLine\n\ |
| <String `Field'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| <Cell\n\ |
| <CellLRuling `Medium'>\n\ |
| <CellBRuling `Medium'>\n\ |
| <CellRRuling `Medium'>\n\ |
| <CellTRuling `Medium'>\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellHeading'>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| <ParaLine\n\ |
| <String `Description'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| > # end of Row\n\ |
| > # end of TblH\n\ |
| \n\ |
| <TblBody\n\ |
| "; |
| |
| const string row_before_state = |
| " <Row\n\ |
| <RowMaxHeight 14.0\">\n\ |
| <RowHeight 0.22222\">\n\ |
| <Cell\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellBody'>\n\ |
| <Pgf\n\ |
| <PgfAlignment Center>\n\ |
| <PgfFont \n\ |
| <FTag `'>\n\ |
| <FFamily `Times'>\n\ |
| <FVar `Regular'>\n\ |
| <FWeight `Regular'>\n\ |
| <FAngle `Regular'>\n\ |
| <FPostScriptName `Times-Roman'>\n\ |
| <FEncoding `FrameRoman'>\n\ |
| <FSize 11.0 pt>\n\ |
| <FUnderlining FNoUnderlining>\n\ |
| <FOverline No>\n\ |
| <FStrike No>\n\ |
| <FChangeBar No>\n\ |
| <FOutline No>\n\ |
| <FShadow No>\n\ |
| <FPairKern Yes>\n\ |
| <FTsume No>\n\ |
| <FCase FAsTyped>\n\ |
| <FPosition FNormal>\n\ |
| <FDX 0.0%>\n\ |
| <FDY 0.0%>\n\ |
| <FDW 0.0%>\n\ |
| <FStretch 100.0%>\n\ |
| <FLanguage USEnglish>\n\ |
| <FLocked No>\n\ |
| <FSeparation 0>\n\ |
| <FColor `Black'>\n\ |
| > # end of PgfFont\n\ |
| >\n\ |
| <ParaLine\n\ |
| <String `"; |
| |
| const string row_between_state_desc = |
| "'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| <Cell\n\ |
| <CellContent\n\ |
| <Para\n\ |
| <PgfTag `CellBody'>\n\ |
| <ParaLine\n\ |
| <String `"; |
| |
| const string row_after_desc = |
| "'>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| > # end of CellContent\n\ |
| > # end of Cell\n\ |
| > # end of Row\n\ |
| "; |
| |
| const string mif_epilog = |
| " > # end of TblBody\n\ |
| > # end of Tbl\n\ |
| > # end of Tbls\n\ |
| \n\ |
| <Para\n\ |
| <ParaLine\n\ |
| <ATbl 1>\n\ |
| > # end of ParaLine\n\ |
| > # end of Para\n\ |
| \n\ |
| # End of MIFFile\n\ |
| "; |
| |
| out << mif_prolog1; |
| out << sm.getShorthand(); |
| out << " TBE"; |
| out << mif_prolog2; |
| |
| for( int i = 0; i < fields.size(); i++ ) { |
| out << row_before_state; |
| out << formatShorthand(fields[i].getShorthand()); |
| out << row_between_state_desc; |
| out << fields[i].getDescription(); |
| out << row_after_desc; |
| } |
| |
| out << mif_epilog; |
| } |
| */ |
| // -- |
| // -- Helper function to do some shorthand formatting (kludge before we |
| // -- get the tuple attributes into the state machine language. |
| // -- Current convention: |
| // -- - each `_' indicates a toggle between normal mode and superscript |
| // -- - each escaped (using `\') character indicates a letter formatted |
| // -- using the Symbol character set. \a = alpha, \b = beta, \c = chi etc. |
| // -- See the FrameMaker character sets manual in the Online Manuals. |
| // -- - a `!' indicates extra stuff at the end which can be ignored (used |
| // -- for determining cell ruling and so on) |
| // -- |
| string formatShorthand(const string shorthand) |
| { |
| string munged_shorthand = ""; |
| bool mode_is_normal = true; |
| const string mif_superscript = "'> <Font <FPosition FSuperscript> <FLocked No> > <String `"; |
| const string mif_normal = "'> <Font <FPosition FNormal> <FLocked No> > <String `"; |
| const string mif_symbol = "'> <Font <FFamily `Symbol'> <FPostScriptName `Symbol'> <FEncoding `FrameRoman'> <FLocked No> > <String `"; |
| const string mif_times = "'> <Font <FFamily `Times'> <FPostScriptName `Times-Roman'> <FEncoding `FrameRoman'> <FLocked No> > <String `"; |
| |
| |
| // -- Walk over the string, processing superscript directives |
| for( unsigned int i = 0; i < shorthand.length(); i++ ) |
| { |
| if( shorthand[i] == '!' ) |
| { |
| // -- Reached logical end of shorthand name |
| break; |
| } |
| else if( shorthand[i] == '^' ) |
| { |
| // -- Process super/subscript formatting |
| |
| mode_is_normal = !mode_is_normal; |
| if( mode_is_normal ) |
| { |
| // -- Back to normal mode |
| munged_shorthand += mif_normal; |
| } |
| else |
| { |
| // -- Going to superscript mode |
| munged_shorthand += mif_superscript; |
| } |
| |
| } |
| else if( shorthand[i] == '\\' ) |
| { |
| // -- Process Symbol character set |
| if( (i + 1) < shorthand.length() ) |
| { |
| i++; // -- Proceed to next char. Yes I know that changing the loop var is ugly! |
| munged_shorthand += mif_symbol; |
| munged_shorthand += shorthand[i]; |
| munged_shorthand += mif_times; |
| } |
| else |
| { |
| // -- FIXME: Add line number info later |
| cerr << "Encountered a `\\` without anything following it!" << endl; |
| exit( -1 ); |
| } |
| |
| } |
| else |
| { |
| // -- Pass on un-munged |
| munged_shorthand += shorthand[i]; |
| } |
| |
| } // -- end for all characters in shorthand |
| |
| // -- Do any other munging |
| |
| // -- Return the formatted shorthand name |
| return munged_shorthand; |
| } |
| |
| |
| // -- |
| // -- Helper function to figure out where to put rules in the table (kludge before we |
| // -- get the tuple attributes into the shorthand machine language. |
| // -- Current convention: |
| // -- - a `!' in the shorthand indicates the beginning of ruling information |
| // -- - `b' => bottom of this row is ruled |
| // -- - `r' => right of this column is ruled |
| // -- |
| string formatCellRuling( const string shorthand) |
| { |
| for( unsigned int i = 0; i < shorthand.length(); i++ ) |
| { |
| if( shorthand[i] == '!' ) |
| { |
| // -- OK, found beginning of ruling information |
| for( unsigned int j = i+1; j < shorthand.length(); j++ ) |
| { |
| if( shorthand[j] == 'b') |
| { |
| // -- Rule the bottom |
| return "<CellBRuling `Medium'>\n"; |
| } |
| else if( shorthand[j] == 'r') |
| { |
| // -- Rule the bottom |
| return "<CellRRuling `Medium'>\n"; |
| } |
| |
| } |
| |
| // -- No ruling directives recognized, return default ruling |
| return ""; |
| } |
| |
| } |
| |
| // -- No ruling information found, return default ruling |
| return ""; |
| } |