]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/CCode/Source/Pccts/dlg/output.c
More moves for Tool Packages
[mirror_edk2.git] / Tools / CCode / Source / Pccts / dlg / output.c
diff --git a/Tools/CCode/Source/Pccts/dlg/output.c b/Tools/CCode/Source/Pccts/dlg/output.c
new file mode 100644 (file)
index 0000000..2e56a6d
--- /dev/null
@@ -0,0 +1,850 @@
+/* output.c, output generator for dlg\r
+ *\r
+ * Output Notes:\r
+ *\r
+ * DfaStates == number of dfa nodes in automaton (just a #define)\r
+ * DfaState == type large enough to index every node in automaton\r
+ *         <256 unsigned char, <65536 unsigned short, etc.\r
+ *\r
+ * Thus, the elements in each of the automaton states (st%d) are type DfaState\r
+ * and are size appropriately, since they must be able to index the next\r
+ * automaton state.\r
+ *\r
+ * dfa[] == a linear array that points to all the automaton states (st%d)\r
+ *         (dfa_base[] should be the same, but isn't right now)\r
+ *\r
+ * accepts[] == Taking a closer look at this one, it probably shouldn't be type\r
+ *         DfaState because there is no real requirement that the number of\r
+ *         accepts states is less than the number of dfa state.  However, if\r
+ *         the number of accept states was more than the number of DFA states\r
+ *         then the lexical specification would be really ambiguous.\r
+ *\r
+ *         Another note. Is that is should be possible to fold accepts[] and\r
+ *         actions[] together.  If this is done, I would suggest get rid of\r
+ *         accept[] and make actions[] have an entry for each state (st%d) in\r
+ *         the automaton.\r
+ *\r
+ * dfa_base[] == starting location for each lexical mode.  This should be\r
+ *         Dfastate type (but isn't right now), since it points to the states\r
+ *         in the automaton.\r
+ *\r
+ * dfa_class_no[] == indicates the number of columns each lexical mode has.\r
+ *\r
+ * b_class_no[] == pointer to the start of the translation array used to\r
+ *         convert from input character to character class.  This could cause\r
+ *         problems if there are more than 256 classes\r
+ *\r
+ * shift%d[] == the actual translation arrays that convert the input character\r
+ *         into the character class.  These will have to change if there are\r
+ *         more than 256 character classes.\r
+ *\r
+ * SOFTWARE RIGHTS\r
+ *\r
+ * We reserve no LEGAL rights to the Purdue Compiler Construction Tool\r
+ * Set (PCCTS) -- PCCTS is in the public domain.  An individual or\r
+ * company may do whatever they wish with source code distributed with\r
+ * PCCTS or the code generated by PCCTS, including the incorporation of\r
+ * PCCTS, or its output, into commerical software.\r
+ *\r
+ * We encourage users to develop software with PCCTS.  However, we do ask\r
+ * that credit is given to us for developing PCCTS.  By "credit",\r
+ * we mean that if you incorporate our source code into one of your\r
+ * programs (commercial product, research project, or otherwise) that you\r
+ * acknowledge this fact somewhere in the documentation, research report,\r
+ * etc...  If you like PCCTS and have developed a nice tool with the\r
+ * output, please mention that you developed it using PCCTS.  In\r
+ * addition, we ask that this header remain intact in our source code.\r
+ * As long as these guidelines are kept, we expect to continue enhancing\r
+ * this system and expect to make other tools available as they are\r
+ * completed.\r
+ *\r
+ * DLG 1.33\r
+ * Will Cohen\r
+ * With mods by Terence Parr; AHPCRC, University of Minnesota\r
+ * 1989-2001\r
+ */\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include "dlg.h"\r
+#ifdef MEMCHK\r
+#include "trax.h"\r
+#else\r
+#ifdef __STDC__\r
+#include <stdlib.h>\r
+#else\r
+#include <malloc.h>\r
+#endif /* __STDC__ */\r
+#endif\r
+\r
+static char *mode_name[MAX_MODES];\r
+static int mode_number[MAX_MODES];\r
+static int cur_mode=0;\r
+\r
+int operation_no = 0; /* used to mark nodes so that infinite loops avoided */\r
+int dfa_basep[MAX_MODES];      /* start of each group of states */\r
+int dfa_class_nop[MAX_MODES];  /* number of elements in each group of states*/\r
+\r
+int gen_ansi = FALSE;          /* allows ansi code to be generated */\r
+\r
+FILE *input_stream;    /* where to read description from */\r
+FILE *output_stream;   /* where to put the output        */\r
+FILE *mode_stream;     /* where to put the mode.h stuff */\r
+FILE *class_stream;    /* where to put the scan.h stuff (if gen_cpp) */\r
+\r
+/* NOTE: This section is MACHINE DEPENDENT */\r
+#define DIF_SIZE 4\r
+#if defined(PC) && !defined(PC32)\r
+unsigned long typesize[DIF_SIZE]  = { 0x7f, 0x7fff, 0x7ffful, 0x7ffffffful }; /* MR20 */\r
+char t0[] = "unsigned char";\r
+char t1[] = "unsigned short";\r
+char t2[] = "unsigned int";\r
+char t3[] = "unsigned long";\r
+char *typevar[DIF_SIZE] = { t0, t1, t2, t3};\r
+#else\r
+unsigned long typesize[DIF_SIZE]  = { 0x7f, 0x7fff, 0x7ffffffful, 0x7ffffffful }; /* MR20 */\r
+char t0[] = "unsigned char";\r
+char t1[] = "unsigned short";\r
+char t2[] = "unsigned int";\r
+char t3[] = "unsigned long";\r
+char *typevar[DIF_SIZE] = { t0, t1, t2, t3};\r
+#endif\r
+\r
+/* Added by TJP August 1994 */\r
+/* Take in MyLexer and return MyLexer_h */\r
+\r
+static char *\r
+#ifdef __USE_PROTOS\r
+gate_symbol(char *name)\r
+#else\r
+gate_symbol(name)\r
+char *name;\r
+#endif\r
+{\r
+       static char buf[100];\r
+       sprintf(buf, "%s_h", name);\r
+       return buf;\r
+}\r
+\r
+/* Added by TJP August 1994 */\r
+static char *\r
+#ifdef __USE_PROTOS\r
+mystrdup(char *s)\r
+#else\r
+mystrdup(s)\r
+char *s;\r
+#endif\r
+{\r
+       char *p = (char *)malloc(strlen(s)+1);\r
+       strcpy(p, s);\r
+       return p;\r
+}\r
+\r
+#ifdef __USE_PROTOS\r
+void p_class_hdr(void)\r
+#else\r
+void p_class_hdr()                                             \r
+#endif\r
+{\r
+       if ( class_stream == NULL ) return;\r
+       fprintf(class_stream, "#ifndef %s\n", gate_symbol(ClassName("")));\r
+       fprintf(class_stream, "#define %s\n", gate_symbol(ClassName("")));\r
+       fprintf(class_stream, "/*\n");\r
+       fprintf(class_stream, " * D L G L e x e r  C l a s s  D e f i n i t i o n\n");\r
+       fprintf(class_stream, " *\n");\r
+       fprintf(class_stream, " * Generated from:");\r
+       fprintf(class_stream, " %s", file_str[0]);\r
+       fprintf(class_stream, "\n");\r
+       fprintf(class_stream, " *\n");\r
+       fprintf(class_stream, " * 1989-2001 by  Will Cohen, Terence Parr, and Hank Dietz\n");\r
+       fprintf(class_stream, " * Purdue University Electrical Engineering\n");\r
+       fprintf(class_stream, " * DLG Version %s\n", version);\r
+       fprintf(class_stream, " */\n\n");\r
+       fprintf(class_stream, "\n");\r
+       fprintf(class_stream, "#include \"%s\"\n", DLEXERBASE_H);\r
+}\r
+\r
+/* MR1                                                                 */\r
+/* MR1 16-Apr-97  Split printing of class header up into several parts  */\r
+/* MR1             so that #lexprefix <<...>>and #lexmember <<...>>    */\r
+/* MR1             can be inserted in the appropriate spots            */\r
+/* MR1                                                                 */\r
+\r
+#ifdef __USE_PROTOS\r
+void p_class_def1(void)\r
+#else\r
+void p_class_def1()\r
+#endif\r
+{\r
+       if ( class_stream == NULL ) return;\r
+       fprintf(class_stream, "\nclass %s : public DLGLexerBase {\n", ClassName(""));\r
+       fprintf(class_stream, "public:\n");\r
+}\r
+\r
+#ifdef __USE_PROTOS\r
+void p_class_def2(void)\r
+#else\r
+void p_class_def2()\r
+#endif\r
+{\r
+       int i, m;\r
+       if ( class_stream == NULL ) return;\r
+       fprintf(class_stream, "public:\n");\r
+       fprintf(class_stream, "\tstatic const int MAX_MODE;\n");\r
+       fprintf(class_stream, "\tstatic const int DfaStates;\n");\r
+       for (i=0; i<cur_mode; i++) {\r
+               fprintf(class_stream, "\tstatic const int %s;\n", mode_name[i]);\r
+       }\r
+\r
+       fprintf(class_stream, "\ttypedef %s DfaState;\n\n", minsize(dfa_allocated));\r
+       fprintf(class_stream, "\t%s(DLGInputStream *in,\n",ClassName(""));\r
+       fprintf(class_stream, "\t\tunsigned bufsize=2000)\n");\r
+       fprintf(class_stream, "\t\t: DLGLexerBase(in, bufsize, %d)\n", interactive);\r
+       fprintf(class_stream, "\t{\n");\r
+       fprintf(class_stream, "\t;\n");\r
+       fprintf(class_stream, "\t}\n");\r
+       fprintf(class_stream, "\tvoid     mode(int);\n");\r
+       fprintf(class_stream, "\tANTLRTokenType nextTokenType(void);\n");\r
+       fprintf(class_stream, "\tvoid     advance(void);\n");\r
+       fprintf(class_stream, "protected:\n");\r
+       for (i=1; i<=action_no; ++i) {\r
+               fprintf(class_stream, "\tANTLRTokenType act%d();\n", i);\r
+       }\r
+\r
+       for(m=0; m<(mode_counter-1); ++m){\r
+               for(i=dfa_basep[m]; i<dfa_basep[m+1]; ++i)\r
+                       fprintf(class_stream, "\tstatic DfaState st%d[%d];\n", i-1, dfa_class_nop[m]+1);\r
+       }\r
+       for(i=dfa_basep[m]; i<=dfa_allocated; ++i)\r
+               fprintf(class_stream, "\tstatic DfaState st%d[%d];\n", i-1, dfa_class_nop[m]+1);\r
+\r
+       fprintf(class_stream, "\tstatic DfaState *dfa[%d];\n", dfa_allocated);\r
+       fprintf(class_stream, "\tstatic DfaState dfa_base[];\n");\r
+/*     fprintf(class_stream, "\tstatic int dfa_base_no[];\n"); */\r
+       fprintf(class_stream, "\tstatic unsigned char *b_class_no[];\n");\r
+       fprintf(class_stream, "\tstatic DfaState accepts[%d];\n",dfa_allocated+1);\r
+       fprintf(class_stream, "\tstatic DLGChar alternatives[%d];\n",dfa_allocated+1);\r
+       /* WARNING: should be ANTLRTokenType for action table, but g++ 2.5.6 is hosed */\r
+       fprintf(class_stream, "\tstatic ANTLRTokenType (%s::*actions[%d])();\n", ClassName(""), action_no+1);\r
+       for(m=0; m<mode_counter; ++m) {\r
+               fprintf(class_stream, "\tstatic unsigned char shift%d[%d];\n",\r
+                       m, CHAR_RANGE);\r
+       }\r
+       if (comp_level)\r
+               fprintf(class_stream, "\tint ZZSHIFT(int c) { return b_class_no[automaton][1+c]; }\n");\r
+       else\r
+               fprintf(class_stream, "\tint ZZSHIFT(int c) { return 1+c; }\n");\r
+\r
+/* MR1                                                                   */\r
+/* MR1 11-APr-97   Kludge to allow inclusion of user-defined code in     */\r
+/* MR1                  DLGLexer class header                            */\r
+/* MR1            Deprecated in favor of 133MR1 addition #lexmember <<>> */\r
+/* MR1                                                                   */\r
+/* MR1 */      fprintf(class_stream,"//\n");\r
+/* MR1 */      fprintf(class_stream,\r
+/* MR1 */         "// 133MR1 Deprecated feature to allow inclusion of ");\r
+/* MR1 */      fprintf(class_stream,\r
+/* MR1 */         "user-defined code in DLG class header\n");\r
+/* MR1 */      fprintf(class_stream,"//\n");\r
+/* MR1 */\r
+/* MR1 */      fprintf(class_stream,"#ifdef DLGLexerIncludeFile\n");\r
+/* MR1 */      fprintf(class_stream,"#include DLGLexerIncludeFile\n");\r
+/* MR1 */      fprintf(class_stream,"#endif\n");\r
+\r
+       fprintf(class_stream, "};\n");\r
+\r
+       fprintf(class_stream, "typedef ANTLRTokenType (%s::*Ptr%sMemberFunc)();\n",\r
+                       ClassName(""), ClassName(""));\r
+\r
+       fprintf(class_stream, "#endif\n");\r
+}\r
+\r
+/* generate required header on output */\r
+\r
+#ifdef __USE_PROTOS\r
+void p_head(void)\r
+#else\r
+void p_head()\r
+#endif\r
+{\r
+       fprintf(OUT, "/*\n");\r
+       fprintf(OUT, " * D L G tables\n");\r
+       fprintf(OUT, " *\n");\r
+       fprintf(OUT, " * Generated from:");\r
+       fprintf(OUT, " %s", file_str[0]);\r
+       fprintf(OUT, "\n");\r
+       fprintf(OUT, " *\n");\r
+       fprintf(OUT, " * 1989-2001 by  Will Cohen, Terence Parr, and Hank Dietz\n");\r
+       fprintf(OUT, " * Purdue University Electrical Engineering\n");\r
+       fprintf(OUT, " * DLG Version %s\n", version);\r
+       fprintf(OUT, " */\n\n");\r
+       if ( gen_cpp)  fprintf(OUT, "#include \"pcctscfg.h\"\n");\r
+       if ( gen_cpp ) fprintf(OUT, "#include \"pccts_stdio.h\"\n");\r
+       if ( !gen_cpp ) fprintf(OUT, "#include \"%s\"\n\n", mode_file);\r
+       fprintf(OUT,"\n");\r
+}\r
+\r
+#ifdef __USE_PROTOS\r
+void p_includes(void)\r
+#else\r
+void p_includes()\r
+#endif\r
+{\r
+       fprintf(OUT, "#include \"%s\"\n", APARSER_H);\r
+       fprintf(OUT, "#include \"%s\"\n", DLEXERBASE_H);\r
+       fprintf(OUT, "#include \"%s\"\n", ClassName(".h"));\r
+}\r
+\r
+/* generate code to tie up any loose ends */\r
+\r
+#ifdef __USE_PROTOS\r
+void p_tail(void)                              /* MR1 */\r
+#else\r
+void p_tail()                                          /* MR1 */\r
+#endif\r
+{\r
+       if ( gen_cpp ) {\r
+               if ( strcmp(ClassName(""), DEFAULT_CLASSNAME)!=0 )\r
+                       fprintf(OUT, "#define DLGLexer %s\n", ClassName(""));\r
+               fprintf(OUT, "#include \"%s\"\n", DLEXER_H);  /* MR23 Rename DLexer.cpp to DLexer.h */\r
+               return;\r
+       }\r
+       fprintf(OUT, "\n");\r
+       fprintf(OUT, "\n");\r
+       if (comp_level)\r
+               fprintf(OUT, "#define ZZSHIFT(c) (b_class_no[zzauto][1+c])\n");\r
+       else\r
+               fprintf(OUT, "#define ZZSHIFT(c) (1+c)\n");\r
+       if ( !gen_cpp ) fprintf(OUT, "#define MAX_MODE %d\n",mode_counter);\r
+       fprintf(OUT, "#include \"dlgauto.h\"\n");\r
+}\r
+\r
+\r
+/* output the table of DFA for general use */\r
+\r
+#ifdef __USE_PROTOS\r
+void p_tables()\r
+#else\r
+void p_tables()\r
+#endif\r
+{\r
+       if ( !gen_cpp ) {\r
+               fprintf(OUT, "#define DfaStates\t%d\n", dfa_allocated);\r
+               fprintf(OUT, "typedef %s DfaState;\n\n", minsize(dfa_allocated));\r
+       }\r
+\r
+       if ( gen_cpp ) {\r
+               int i;\r
+               fprintf(OUT, "\n");\r
+               fprintf(OUT, "const int %s::MAX_MODE=%d;\n",\r
+                               ClassName(""),\r
+                               mode_counter);\r
+               fprintf(OUT, "const int %s::DfaStates=%d;\n",\r
+                               ClassName(""),\r
+                               dfa_allocated);\r
+               for (i=0; i<cur_mode; i++) {\r
+                       fprintf(OUT, "const int %s::%s=%d;\n",\r
+                                       ClassName(""), mode_name[i], mode_number[i]);\r
+               }\r
+               fprintf(OUT, "\n");\r
+       }\r
+\r
+       p_node_table();\r
+       p_dfa_table();\r
+       p_accept_table();\r
+       p_action_table();\r
+       p_base_table();\r
+       p_class_table();\r
+       if (comp_level)\r
+               p_bshift_table();\r
+       if (interactive || gen_cpp )\r
+               p_alternative_table();\r
+}\r
+\r
+\r
+/* figures out the smallest variable type that will hold the transitions\r
+ */\r
+\r
+#ifdef __USE_PROTOS\r
+char *minsize(int elements)\r
+#else\r
+char *minsize(elements)\r
+int elements;\r
+#endif\r
+{\r
+       int i = 0;\r
+\r
+       while ((unsigned long) elements > typesize[i]) /* MR20 */\r
+               ++i;\r
+       return typevar[i];\r
+}\r
+\r
+\r
+#ifdef __USE_PROTOS\r
+void p_node_table(void)\r
+#else\r
+void p_node_table()\r
+#endif\r
+{\r
+       register int    i;\r
+       register int    m = 0;\r
+\r
+       for(m=0; m<(mode_counter-1); ++m){\r
+               for(i=dfa_basep[m]; i<dfa_basep[m+1]; ++i)\r
+                       p_single_node(i,dfa_class_nop[m]);\r
+       }\r
+       for(i=dfa_basep[m]; i<=dfa_allocated; ++i)\r
+               p_single_node(i,dfa_class_nop[m]);\r
+}\r
+\r
+\r
+#ifdef __USE_PROTOS\r
+void p_single_node(int i,int classes)\r
+#else\r
+void p_single_node(i,classes)\r
+int i,classes;\r
+#endif\r
+{\r
+       register int    j;\r
+       register int    trans, items_on_line;\r
+\r
+#if 1\r
+       /* extra state (classes+1) for invalid characters */\r
+       fprintf(OUT, "%sDfaState %sst%d[%d] = {\n  ",\r
+               gen_cpp?ClassName("::"):"static ",\r
+               gen_cpp?ClassName("::"):"",(i-1), (classes+1));\r
+#else\r
+       fprintf(OUT, "static DfaState st%d[%d] = {\n  ", (i-1), classes);\r
+#endif\r
+       items_on_line = MAX_ON_LINE;\r
+       for(j=0; j<classes; ++j){\r
+               DAWDLE;\r
+               trans = DFA(i)->trans[j];\r
+               if (trans == NIL_INDEX)\r
+                       trans = dfa_allocated+1;\r
+               /* all of DFA moved down one in array */\r
+               fprintf(OUT, "%d", trans-1);\r
+               fprintf(OUT, ", ");\r
+               if (!(--items_on_line)){\r
+                       fprintf(OUT, "\n  ");\r
+                       items_on_line = MAX_ON_LINE;\r
+               }\r
+       }\r
+#if 1\r
+       /* put in jump to error state */\r
+       fprintf(OUT, "%d\n};\n\n", dfa_allocated);\r
+#else\r
+       fprintf(OUT, "\n};\n\n");\r
+#endif\r
+}\r
+\r
+\r
+#ifdef __USE_PROTOS\r
+void p_dfa_table(void)\r
+#else\r
+void p_dfa_table()\r
+#endif\r
+{\r
+       register int    i;\r
+\r
+       fprintf(OUT, "\n%sDfaState *%sdfa[%d] = {\n",\r
+               gen_cpp?ClassName("::"):"",gen_cpp?ClassName("::"):"", dfa_allocated);\r
+       for (i=0; i<(dfa_allocated-1); ++i){\r
+               fprintf(OUT, "\tst%d,\n", i);\r
+       }\r
+       fprintf(OUT, "\tst%d\n", i);\r
+       fprintf(OUT, "};\n\n");\r
+}\r
+\r
+\r
+#ifdef __USE_PROTOS\r
+void p_accept_table(void)\r
+#else\r
+void p_accept_table()\r
+#endif\r
+{\r
+       register int    i = 1;\r
+       register int    items_on_line = 0;\r
+       int             true_interactive = TRUE;\r
+\r
+       /* make sure element for one past (zzerraction) -WEC 12/16/92 */\r
+       fprintf(OUT,"\n%sDfaState %saccepts[%d] = {\n  ",\r
+                       gen_cpp?ClassName("::"):"",\r
+                       gen_cpp?ClassName("::"):"",\r
+                       dfa_allocated+1);\r
+       /* don't do anything if no dfa nodes */\r
+       if (i>dfa_allocated) goto skip_accepts;\r
+       for (;;) {\r
+               int accept=0;   /* MR14a - Manuel Kessler (mlkessle@cip.physik.uni-wuerzburg.de) */\r
+               set accept_set;\r
+               set nfa_states;\r
+               unsigned int *t, *nfa_i;\r
+               unsigned int *q, *regular_expr;\r
+\r
+               accept_set = empty;\r
+               nfa_states = DFA(i)->nfa_states;\r
+               t = nfa_i = set_pdq(nfa_states);\r
+               /* NOTE: picks lowest accept because accepts monotonic  */\r
+               /*      with respect to nfa node numbers and set_pdq    */\r
+               /*      returns in that order                           */\r
+               while((*nfa_i != nil) && (!(accept = NFA(*nfa_i)->accept))){\r
+                       nfa_i++;\r
+               }\r
+\r
+               /* figure out if more than one accept state there */\r
+               if (warn_ambig ){\r
+                       set_orel(accept, &accept_set);\r
+                       while(*nfa_i != nil){\r
+                               set_orel(NFA(*nfa_i)->accept, &accept_set);\r
+                               nfa_i++;\r
+                       }\r
+                       /* remove error action from consideration */\r
+                       set_rm(0, accept_set);\r
+\r
+                       if( set_deg(accept_set)>1){\r
+                               fprintf(stderr, "dlg warning: ambiguous regular expression ");\r
+                               q = regular_expr = set_pdq(accept_set);\r
+                               while(*regular_expr != nil){\r
+                                       fprintf(stderr," %d ", *regular_expr);\r
+                                       ++regular_expr;\r
+                               }\r
+                               fprintf(stderr, "\n");\r
+                               free(q);\r
+                       }\r
+               }\r
+\r
+               if ((DFA(i)->alternatives) && (accept != 0)){\r
+                       true_interactive = FALSE;\r
+               }\r
+               fprintf(OUT, "%d, ", accept);\r
+\r
+               /* free up memory before we "break" below -ATG 4/6/95 */\r
+               free(t);\r
+               set_free(accept_set);\r
+\r
+               if ((++i)>dfa_allocated)\r
+                       break;\r
+               if ((++items_on_line)>=MAX_ON_LINE){\r
+                       fprintf(OUT,"\n  ");\r
+                       items_on_line = 0;\r
+               }\r
+/*\r
+               free(t);\r
+               set_free(accept_set);\r
+*/\r
+       }\r
+       /* make sure element for one past (zzerraction) -WEC 12/16/92 */\r
+skip_accepts:\r
+       fprintf(OUT, "0\n};\n\n");\r
+}\r
+\r
+\r
+#ifdef __USE_PROTOS\r
+void p_action_table(void)\r
+#else\r
+void p_action_table()\r
+#endif\r
+{\r
+       register int    i;\r
+       char* theClassName = ClassName("");\r
+\r
+       if ( gen_cpp )\r
+               fprintf(OUT, "Ptr%sMemberFunc %s::actions[%d] = {\n", theClassName,\r
+                                       theClassName, action_no+1);\r
+       else\r
+               fprintf(OUT, "void (*actions[%d])() = {\n", action_no+1);\r
+       if ( gen_cpp )\r
+/*             fprintf(OUT, "\t(Ptr%sMemberFunc)&%s::erraction,\n", theClassName, theClassName);*/\r
+               fprintf(OUT, "\t&%s::erraction,\n", theClassName);\r
+       else\r
+               fprintf(OUT, "\tzzerraction,\n");\r
+       for (i=1; i<action_no; ++i) {\r
+               if ( gen_cpp )\r
+/*                     fprintf(OUT,"\t(Ptr%sMemberFunc)&%s::act%d,\n", theClassName, theClassName, i);*/\r
+                       fprintf(OUT,"\t&%s::act%d,\n", theClassName, i);\r
+               else\r
+                       fprintf(OUT,"\tact%d,\n", i);\r
+               DAWDLE;\r
+       }\r
+       if ( gen_cpp )\r
+/*             fprintf(OUT,"\t(Ptr%sMemberFunc)&%s::act%d\n", theClassName, theClassName, i);*/\r
+               fprintf(OUT,"\t&%s::act%d\n", theClassName, i);\r
+       else\r
+               fprintf(OUT,"\tact%d\n", i);\r
+       fprintf(OUT, "};\n\n");\r
+}\r
+\r
+\r
+#ifdef __USE_PROTOS\r
+void p_shift_table(int m)                                  /* MR1 */\r
+#else\r
+void p_shift_table(m)                                          /* MR1 */\r
+int m;\r
+#endif\r
+{\r
+       register int    i = 0, j;\r
+       register int    items_on_line = 0;\r
+\r
+       fprintf(OUT, "%s unsigned char %sshift%d[%d] = {\n  ",\r
+               gen_cpp?"":"static",\r
+               gen_cpp?ClassName("::"):"", m, CHAR_RANGE);\r
+       for (;;) {\r
+               /* find which partition character i is in */\r
+               for (j=0; j<dfa_class_nop[mode_counter]; ++j){\r
+                       if (set_el(i,class_sets[j]))\r
+                               break;\r
+                       }\r
+               fprintf(OUT,"%d",j);\r
+               if ((++i)>=CHAR_RANGE)\r
+                       break;\r
+               fprintf(OUT,", ");\r
+               if ((++items_on_line)>=MAX_ON_LINE){\r
+                       fprintf(OUT,"\n  ");\r
+                       items_on_line = 0;\r
+                       }\r
+               }\r
+       fprintf(OUT, "\n};\n\n");\r
+}\r
+\r
+\r
+#ifdef __USE_PROTOS\r
+void p_base_table(void)\r
+#else\r
+void p_base_table()\r
+#endif\r
+{\r
+       register int m;\r
+\r
+       fprintf(OUT, "%sDfaState %sdfa_base[] = {\n",\r
+                       gen_cpp?ClassName("::"):"static ",\r
+                       gen_cpp?ClassName("::"):"");\r
+       for(m=0; m<(mode_counter-1); ++m)\r
+               fprintf(OUT, "\t%d,\n", dfa_basep[m]-1);\r
+       fprintf(OUT, "\t%d\n};\n\n", dfa_basep[m]-1);\r
+}\r
+\r
+\r
+#ifdef __USE_PROTOS\r
+void p_class_table(void)                               /* MR1 */\r
+#else\r
+void p_class_table()                                           /* MR1 */\r
+#endif\r
+{\r
+#if 0\r
+       register int m;\r
+\r
+       fprintf(OUT,"%s int %sdfa_class_no[] = {\n",\r
+                       gen_cpp?"":"static",\r
+                       gen_cpp?ClassName("::"):"");\r
+       for(m=0; m<(mode_counter-1); ++m)\r
+               fprintf(OUT,"\t%d,\n", dfa_class_nop[m]);\r
+       fprintf(OUT,"\t%d\n};\n\n", dfa_class_nop[m]);\r
+#endif\r
+}\r
+\r
+\r
+#ifdef __USE_PROTOS\r
+void p_bshift_table(void)                                      /* MR1 */\r
+#else\r
+void p_bshift_table()                                          /* MR1 */\r
+#endif\r
+{\r
+       register int m;\r
+\r
+       fprintf(OUT,"%s unsigned char *%sb_class_no[] = {\n",\r
+               gen_cpp?"":"static",\r
+               gen_cpp?ClassName("::"):"");\r
+       for(m=0; m<(mode_counter-1); ++m)\r
+               fprintf(OUT, "\tshift%d,\n", m);\r
+       fprintf(OUT, "\tshift%d\n};\n\n", m);\r
+}\r
+\r
+\r
+#ifdef __USE_PROTOS\r
+void p_alternative_table(void)                         /* MR1 */\r
+#else\r
+void p_alternative_table()                                     /* MR1 */\r
+#endif\r
+{\r
+       register int i;\r
+\r
+       if ( !gen_cpp ) fprintf(OUT, "#define ZZINTERACTIVE\n\n");\r
+       if ( gen_cpp )\r
+               fprintf(OUT, "DLGChar %salternatives[%d] = {\n",  /* mr23 vhs %sDfaStates+1 */\r
+                               ClassName("::"),\r
+                               dfa_allocated+1); /* vhs ClassName("::")); */\r
+       else\r
+               fprintf(OUT, "static %s zzalternatives[DfaStates+1] = {\n",\r
+                               minsize(dfa_allocated));\r
+\r
+       for(i=1; i<=dfa_allocated; ++i)\r
+               fprintf(OUT, "\t%d,\n", DFA(i)->alternatives);\r
+       fprintf(OUT, "/* must have 0 for zzalternatives[DfaStates] */\n");\r
+       fprintf(OUT, "\t0\n};\n\n");\r
+}\r
+\r
+\r
+#ifdef __USE_PROTOS\r
+void p_mode_def(char *s,int m)                 /* MR1 */\r
+#else\r
+void p_mode_def(s,m)                                   /* MR1 */\r
+char *s;\r
+int m;\r
+#endif\r
+{\r
+       if ( gen_cpp )\r
+       {\r
+               mode_name[cur_mode] = mystrdup(s);\r
+               mode_number[cur_mode] = m;\r
+               cur_mode++;\r
+       }\r
+       else\r
+               fprintf(mode_stream, "#define %s %d\n", s, m);\r
+}\r
+\r
+#ifdef __USE_PROTOS\r
+char * ClassName(char *suffix)\r
+#else\r
+char * ClassName(suffix)\r
+char *suffix;\r
+#endif\r
+{\r
+       static char buf[200];\r
+       extern char *class_name;\r
+\r
+       sprintf(buf, "%s%s", class_name, suffix);\r
+       return buf;\r
+}\r
+\r
+#ifdef DEBUG\r
+\r
+/* print out a particular nfa node that is pointed to by p */\r
+\r
+#ifdef __USE_PROTOS\r
+void p_nfa_node(nfa_node *p)\r
+#else\r
+void p_nfa_node(p)\r
+nfa_node *p;\r
+#endif\r
+{\r
+        register nfa_node *t;\r
+\r
+       if (p != NIL_INDEX){\r
+               printf("NFA state : %d\naccept state : %d\n",\r
+                       NFA_NO(p),p->accept);\r
+               if (p->trans[0] != NIL_INDEX){\r
+                       printf("trans[0] => %d on ", NFA_NO(p->trans[0]));\r
+                       p_set(p->label);\r
+                       printf("\n");\r
+                       }\r
+               else\r
+                       printf("trans[0] => nil\n");\r
+               if (p->trans[1] != NIL_INDEX)\r
+                       printf("trans[1] => %d on epsilon\n",\r
+                               NFA_NO(p->trans[1]));\r
+               else\r
+                       printf("trans[1] => nil\n");\r
+               printf("\n");\r
+               }\r
+}\r
+#endif\r
+\r
+#ifdef  DEBUG\r
+\r
+/* code to print out special structures when using a debugger */\r
+\r
+#ifdef __USE_PROTOS\r
+void p_nfa(p)\r
+#else\r
+void p_nfa(nfa_node *p)\r
+nfa_node *p;   /* state number also index into array */\r
+#endif\r
+{\r
+/* each node has a marker on it so it only gets printed once */\r
+\r
+       operation_no++; /* get new number */\r
+       s_p_nfa(p);\r
+}\r
+\r
+#ifdef __USE_PROTOS\r
+void s_p_nfa(nfa_node *p)\r
+#else\r
+void s_p_nfa(p)\r
+nfa_node *p;   /* state number also index into array */\r
+#endif\r
+{\r
+       if ((p != NIL_INDEX) && (p->nfa_set != operation_no)){\r
+               /* so it is only printed once */\r
+               p->nfa_set = operation_no;\r
+               p_nfa_node(p);\r
+               s_p_nfa(p->trans[0]);\r
+               s_p_nfa(p->trans[1]);\r
+               }\r
+}\r
+\r
+#ifdef __USE_PROTOS\r
+void p_dfa_node(dfa_node *p)\r
+#else\r
+void p_dfa_node(p)\r
+dfa_node *p;\r
+#endif\r
+{\r
+       int i;\r
+\r
+       if (p != NIL_INDEX){\r
+               printf("DFA state :%d\n",NFA_NO(p));\r
+               if (p->done)\r
+                       printf("done\n");\r
+               else\r
+                       printf("undone\n");\r
+               printf("from nfa states : ");\r
+               p_set(p->nfa_states);\r
+               printf("\n");\r
+               /* NOTE: trans arcs stored as ints rather than pointer*/\r
+               for (i=0; i<class_no; i++){\r
+                       printf("%d ",p->trans[i]);\r
+                       }\r
+               printf("\n\n");\r
+               }\r
+}\r
+\r
+#ifdef __USE_PROTOS\r
+void p_dfa(void)\r
+#else\r
+void p_dfa()\r
+#endif\r
+{\r
+/* prints out all the dfa nodes actually allocated */\r
+\r
+       int i;\r
+\r
+       for (i = 1; i<=dfa_allocated; i++)\r
+               p_dfa_node(NFA(i));\r
+}\r
+\r
+\r
+/* print out numbers in the set label */\r
+\r
+#ifdef __USE_PROTOS\r
+void p_set(set label)\r
+#else\r
+void p_set(label)\r
+set label;\r
+#endif\r
+{\r
+       unsigned *t, *e;\r
+\r
+       if (set_nil(label)){\r
+               printf("epsilon\n");\r
+       }else{\r
+               t = e = set_pdq(label);\r
+               while(*e != nil){\r
+                       printf("%d ", (*e+MIN_CHAR));\r
+                       e++;\r
+               }\r
+               printf("\n");\r
+               free(t);\r
+       }\r
+       \r
+}\r
+#endif\r