summaryrefslogtreecommitdiff
path: root/web/funnelAC/fwACsrc/dump.c
diff options
context:
space:
mode:
Diffstat (limited to 'web/funnelAC/fwACsrc/dump.c')
-rw-r--r--web/funnelAC/fwACsrc/dump.c900
1 files changed, 900 insertions, 0 deletions
diff --git a/web/funnelAC/fwACsrc/dump.c b/web/funnelAC/fwACsrc/dump.c
new file mode 100644
index 0000000000..9a1687cb80
--- /dev/null
+++ b/web/funnelAC/fwACsrc/dump.c
@@ -0,0 +1,900 @@
+/*##############################################################################
+
+FUNNNELWEB COPYRIGHT
+====================
+FunnelWeb is a literate-programming macro preprocessor.
+
+Copyright (C) 1992 Ross N. Williams.
+
+ Ross N. Williams
+ ross@spam.adelaide.edu.au
+ 16 Lerwick Avenue, Hazelwood Park 5066, Australia.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of Version 2 of the GNU General Public License as
+published by the Free Software Foundation.
+
+This program is distributed WITHOUT ANY WARRANTY; without even the implied
+warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See Version 2 of the GNU General Public License for more details.
+
+You should have received a copy of Version 2 of the GNU General Public
+License along with this program. If not, you can FTP the license from
+prep.ai.mit.edu/pub/gnu/COPYING-2 or write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Section 2a of the license requires that all changes to this file be
+recorded prominently in this file. Please record all changes here.
+
+Programmers:
+ RNW Ross N. Williams ross@spam.adelaide.edu.au
+ ABC Anthony B. Coates coates@physics.uq.edu.au
+
+Changes:
+ 07-May-1992 RNW Program prepared for release under GNU GPL V2.
+ 31-Aug-1993 ABC Added support for EL_SPEC
+ 10-May-1994 ABC Added DYN_NAMES option to allow macro and
+ section names to be allocated dynamically
+ instead of statically.
+ 06-Aug-1995 ABC Modified the macro definition dump to dump
+ information on the automatic line directive
+ macro, if appropriate.
+
+##############################################################################*/
+
+
+/******************************************************************************/
+/* DUMP.C */
+/******************************************************************************/
+
+#include <ctype.h>
+#include "style.h"
+
+#include "as.h"
+#include "clock.h"
+#include "data.h"
+#include "dump.h"
+#include "misc.h"
+
+/******************************************************************************/
+
+#define DUMP_WIDTH (80)
+
+/******************************************************************************/
+
+/* The following advance declarations are required because of recursion. */
+LOCAL void dm_ex P_((p_wf_t,p_ells_t));
+
+/******************************************************************************/
+
+LOCAL void centerln P_((p_wf_t,uword,int,char *));
+LOCAL void centerln(p_wf,width,ch,s)
+/* Writes string s in a line surrounded by character ch to specified width. */
+/* Example: centerln(*,20,'-',"sloth") would write: "------ sloth -------" */
+p_wf_t p_wf;
+uword width;
+int ch;
+char *s;
+{
+ uword sidebar,i;
+ char linet2[100];
+ /* Warning: linet2 can't be too big, or it will blow the Mac's limited */
+ /* stack space. Perhaps it should be put in the heap with a static pointer. */
+
+ as_cold(width>=5,"centerln: Width is too small.");
+ as_cold(width<=80,"centerln: Width is too large.");
+ as_cold(strlen(s) <= width-4,"centerln: Width is too narrow for string.");
+
+ /* Construct a sidebar string. */
+ sidebar=(width-strlen(s)-2)/2;
+ for (i=0;i<sidebar;i++) linet2[i]=ch;
+ linet2[sidebar]=EOS;
+
+ /* Now construct the result string. */
+ strcpy(linet1,linet2);
+ strcat(linet1," ");
+ strcat(linet1,s);
+ strcat(linet1," ");
+ strcat(linet1,linet2);
+
+ /* If the sidebar division removed a character, and the line is long enough */
+ /* for the user not to notice the imbalance, tack a character on the end. */
+ if (width>40 && strlen(linet1)==width-1)
+ {
+ uword len=strlen(linet1);
+ linet1[len]=ch;
+ linet1[len+1]=EOS;
+ }
+
+ /* Write the result string to the specified stream. */
+ wf_wl(p_wf,linet1);
+}
+
+/******************************************************************************/
+
+LOCAL char * fontname P_((ubyte));
+LOCAL char * fontname(font)
+/* Given a font number, returns a pointer to a static string containing the */
+/* name of the font. */
+ubyte font;
+{
+ switch (font)
+ {
+ case FT_NORM: return "Normal";
+ case FT_TITL: return "Title";
+ case FT_STIT: return "Small Title";
+ default : as_bomb("fontname: Font switch defaulted.");
+ }
+ /* Keep GCC warnings happy. */
+ as_bomb("fontname: Dropped out of switch.");
+ return "Failure";
+}
+
+/******************************************************************************/
+
+LOCAL char * alignname P_((ubyte));
+LOCAL char * alignname(align)
+/* Given an alignment number, returns a pointer to a static string containing */
+/* the name of the alignment. */
+ubyte align;
+{
+ switch (align)
+ {
+ case LR_LEFT: return "Left";
+ case LR_RIGH: return "Right";
+ case LR_CENT: return "Centre";
+ default : as_bomb("alignname: Alignment switch defaulted.");
+ }
+ /* Keep GCC warnings happy. */
+ as_bomb("alignnamename: Dropped out of switch.");
+ return "Failure";
+}
+
+/******************************************************************************/
+
+EXPORT void dm_mem(p_wf,p_mem,length)
+p_wf_t p_wf;
+char *p_mem;
+ulong length;
+{
+ ubyte_ *p_base = (ubyte_ *) p_mem;
+ long len = length;
+
+ wf_wl(p_wf,"");
+ wf_wl(p_wf,"MEMORY DUMP OF MAPPED FILE");
+ wf_wl(p_wf,"==========================");
+ wf_wl(p_wf,"");
+ wf_wr(p_wf,"+-------------------------------------------------+------------------+\n");
+ wf_wr(p_wf,"| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | 0123456789ABCDEF |\n");
+ wf_wr(p_wf,"+-------------------------------------------------+------------------+\n");
+
+ while (len>0)
+ {/* Write a single line of 16 bytes per iteration. */
+ uword j;
+ wf_wr(p_wf,"| ");
+ for (j=0;j<16;j++)
+ if (j>=len)
+ wf_wr(p_wf," ");
+ else
+ {
+ char s[10];
+ sprintf(s,"%02X ",(unsigned int) p_base[j]);
+ wf_wr(p_wf,s);
+ }
+ wf_wr(p_wf,"| ");
+ for (j=0;j<16;j++)
+ if (j>=len)
+ wf_chr(p_wf,' ');
+ else
+ {
+ char ch=p_base[j];
+ /* DON'T use library function "isprint" - it is too loose. */
+ /* e.g. The vax "isprint" accepts top bit characters. */
+ if (!isascprn(ch)) ch='.';
+ wf_chr(p_wf,ch);
+ }
+ wf_wr(p_wf," |\n");
+ p_base+=16;
+ len-=16;
+ } /* End while */
+
+ wf_wr(p_wf,"+-------------------------------------------------+------------------+\n");
+ wf_wl(p_wf,"");
+}
+
+/******************************************************************************/
+
+LOCAL void dm_byte P_((p_wf_t,ubyte));
+LOCAL void dm_byte(p_wf,b)
+/* Dumps a text representation of the given byte to the specified stream. */
+p_wf_t p_wf;
+ubyte b;
+{
+ char t[10];
+ /* DON'T use library function "isprint" - it is too loose. */
+ /* e.g. The vax "isprint" accepts top bit characters. */
+ if (isascprn(b))
+ sprintf(t,"%c",(char) b);
+ else
+ sprintf(t,"<%03u>",(unsigned) b);
+ wf_wr(p_wf,t);
+}
+
+/******************************************************************************/
+
+EXPORT void dm_lnls(p_wf)
+p_wf_t p_wf;
+{
+ wf_wl(p_wf,"");
+ centerln(p_wf,DUMP_WIDTH,'=',"Start of LINE LIST DUMP");
+ wf_wl(p_wf,"");
+ /*12345678901234567890123456789012345678901234567890123456789012345678901234567890*/
+ wf_wl(p_wf,"Globl Local| Text");
+ wf_wl(p_wf,"-----------+--------------------------------------------------------------------");
+ ls_fir(line_list);
+ while (TRUE)
+ {
+ ln_t *p_line;
+ char *p;
+ ls_nxt(line_list,PPV &p_line);
+ if (p_line==NULL) break;
+ sprintf(linet1,"%05lu %05lu| ",
+ (ulong) p_line->ln_global,
+ (ulong) p_line->ln_local);
+ wf_wr(p_wf,linet1);
+ for (p=p_line->ln_body.sc_first; p<=p_line->ln_body.sc_last; p++)
+ dm_byte(p_wf,*((ubyte_ *)p));
+ wf_wl(p_wf,"");
+ }
+ wf_wl(p_wf,"-----------+--------------------------------------------------------------------");
+ wf_wl(p_wf,"Globl Local| Text");
+ wf_wl(p_wf,"");
+ centerln(p_wf,DUMP_WIDTH,'=',"End of LINE LIST DUMP");
+ wf_wl(p_wf,"");
+}
+
+/******************************************************************************/
+
+LOCAL void dm_sc P_((p_wf_t,p_sc_t));
+LOCAL void dm_sc(p_wf,p_sc)
+/* Dumps the specified scrap to the specified stream. */
+p_wf_t p_wf;
+p_sc_t p_sc;
+{
+ char *p;
+
+ as_cold(p_sc->sc_first !=NULL,"dm_sc: NULL ptr1.");
+ as_cold(p_sc->sc_last !=NULL,"dm_sc: NULL ptr2.");
+
+ if (p_sc->sc_white)
+ wf_wr(p_wf,"Text scrap[White]=");
+ else
+ wf_wr(p_wf,"Text scrap[Grey]=");
+ wf_wr(p_wf,"\"");
+ for (p=p_sc->sc_first; p<=p_sc->sc_last; p++)
+ {
+ dm_byte(p_wf,*((ubyte_ *) p));
+ if (*p=='\n')
+ wf_wl(p_wf,"");
+ }
+ wf_wl(p_wf,"\"");
+}
+
+/******************************************************************************/
+
+LOCAL void dm_scls P_((p_wf_t,p_scls_t));
+LOCAL void dm_scls(p_wf,p_scls)
+/* Dumps the specified scrap list to the specified stream. */
+p_wf_t p_wf;
+p_scls_t p_scls;
+{
+ wf_wl(p_wf,"");
+ centerln(p_wf,30,'-',"Start of Text Scrap List");
+ ls_fir(p_scls);
+ while (TRUE)
+ {
+ p_sc_t p_sc;
+ ls_nxt(p_scls,PPV &p_sc);
+ if (p_sc==NULL) break;
+ dm_sc(p_wf,p_sc);
+ }
+ centerln(p_wf,30,'-',"End of Text Scrap List");
+ wf_wl(p_wf,"");
+}
+
+/******************************************************************************/
+
+EXPORT void dm_tkls(p_wf)
+p_wf_t p_wf;
+{
+ tk_t *token;
+ char *m;
+ ubyte font;
+ ubyte align;
+
+ wf_wl(p_wf,"");
+ centerln(p_wf,DUMP_WIDTH,'=',"Start of TOKEN LIST DUMP");
+ wf_wl(p_wf,"");
+ sprintf(linet1,"Summary: There are %lu tokens in the token list.",
+ (ulong) ls_len(token_list));
+ wf_wl(p_wf,linet1);
+ wf_wl(p_wf,"");
+ wf_wl(p_wf,"Line[Column]: Token Description");
+ wf_wl(p_wf,"-------------------------------");
+ wf_wl(p_wf,"");
+
+ ls_fir(token_list);
+ ls_nxt(token_list,PPV &token);
+ while (token != NULL)
+ {
+ sprintf(linet1,"%04lu[%02lu]: ",
+ (ulong) token->tk_ps.ps_line,
+ (ulong) token->tk_ps.ps_column);
+ wf_wr(p_wf,linet1);
+ switch (token->tk_kind)
+ {
+ case TK_TEXT: m="Text." ; break;
+ case TK_MDEF: m="@$ Macro defn." ; break;
+ case TK_FDEF: m="@F File defn." ; break;
+ case TK_ONAM: m="@< Open name." ; break;
+ case TK_CNAM: m="@> Close name." ; break;
+ case TK_ODEF: m="@{ Open defn." ; break;
+ case TK_CDEF: m="@} Close defn." ; break;
+ case TK_OPAR: m="@( Open param." ; break;
+ case TK_CPAR: m="@} Close param." ; break;
+ case TK_COMA: m="@, Comma." ; break;
+ case TK_QUOT: m="@\" Quote." ; break;
+ case TK_PARM: m="@n Parameter." ; break;
+ case TK_ZERO: m="@Z Zero calls." ; break;
+ case TK_MANY: m="@M Many calls." ; break;
+ case TK_NAME: m="@# Name." ; break;
+ case TK_EMPH: m="@/ Emphasise." ; break;
+ case TK_NPAG: m="@t.. Newpage." ; break;
+ case TK_TOCS: m="@t.. TOC." ; break;
+ case TK_SKIP: m="@t.. Vertical skip."; break;
+ case TK_TITL: m="@t.. Title." ; break;
+ case TK_EOF : m="End Of File." ; break;
+ case TK_NSEC:
+ switch (token->tk_gen)
+ {
+ case 0: m="@* New section (Level 0)."; break;
+ case 1: m="@A New section (Level 1)."; break;
+ case 2: m="@B New section (Level 2)."; break;
+ case 3: m="@C New section (Level 3)."; break;
+ case 4: m="@D New section (Level 4)."; break;
+ case 5: m="@E New section (Level 5)."; break;
+ default: as_bomb("dmtkls: Level case defaulted.");
+ }
+ break;
+ default: as_bomb("dmtkls: Token case defaulted.");
+ }
+ wf_wr(p_wf,m);
+ wf_wr(p_wf," ");
+ switch (token->tk_kind)
+ {
+ case TK_PARM:
+ sprintf(linet1,"Parameterno=%u.",(unsigned) token->tk_gen);
+ wf_wl(p_wf,linet1);
+ break;
+ case TK_NAME:
+ wf_wr(p_wf,"Character='");
+ dm_byte(p_wf,token->tk_gen);
+ wf_wl(p_wf,"'.");
+ break;
+ case TK_TEXT:
+ dm_sc(p_wf,&token->tk_sc);
+ break;
+ case TK_SKIP:
+ sprintf(linet1,"Vertical space skipped=%lumm.",
+ (ulong) token->tk_gen);
+ wf_wl(p_wf,linet1);
+ break;
+ case TK_TITL:
+ font = token->tk_gen / LRFT_PACK;
+ align = token->tk_gen % LRFT_PACK;
+ wf_wr(p_wf,"Font="); wf_wr(p_wf,fontname(font));
+ wf_wr(p_wf,", Alignment="); wf_wr(p_wf,alignname(align));
+ wf_wl(p_wf,". Title text follows:");
+ dm_sc(p_wf,&token->tk_sc);
+ break;
+ default: wf_wl(p_wf,""); break;
+ }
+ ls_nxt(token_list,PPV &token);
+ } /* End of while loop. */
+
+ centerln(p_wf,DUMP_WIDTH,'=',"End of TOKEN LIST DUMP");
+ wf_wl(p_wf,"");
+}
+
+/******************************************************************************/
+
+LOCAL void dm_eltx P_((p_wf_t,p_el_t));
+LOCAL void dm_eltx (p_wf,p_el)
+/* Dumps the specified text element to the specified stream. */
+p_wf_t p_wf;
+p_el_t p_el;
+{
+ p_sc_t p_sc;
+
+ wf_wl(p_wf,"");
+ centerln(p_wf,30,'-',"Start Text Element");
+
+ ls_fir(p_el->el_text);
+ ls_nxt(p_el->el_text,PPV &p_sc);
+ while (p_sc != NULL)
+ {
+ dm_sc(p_wf,p_sc);
+ ls_nxt(p_el->el_text,PPV &p_sc);
+ }
+ centerln(p_wf,30,'-',"End Text Element");
+ wf_wl(p_wf,"");
+}
+
+/******************************************************************************/
+
+LOCAL void dm_elin P_((p_wf_t,p_el_t));
+LOCAL void dm_elin(p_wf,p_el)
+/* Dumps the specified invocation element to the specified stream. */
+p_wf_t p_wf;
+p_el_t p_el;
+{
+ ulong parno;
+ p_ells_t *pp_ex;
+ p_ells_t p_ex;
+ p_elll_t p_elll = p_el->el_parls;
+
+ wf_wl(p_wf,"");
+ centerln(p_wf,30,'-',"Begin Invocation Element");
+
+/* ABC { */
+ sprintf(
+ linet1,
+ "Invocation of macro @<%s@>",
+ /* ABC { */
+#if DYN_NAMES
+ p_el->el_p_mac->ma_name
+#else /* !DYN_NAMES */
+ &p_el->el_p_mac->ma_name[0]
+#endif /* DYN_NAMES */
+ /* } ABC */
+ );
+/* } ABC */
+ wf_wl(p_wf,linet1);
+
+ if (ls_len(p_elll)==0)
+ wf_wl(p_wf,"No actual parameters.");
+ else
+ {
+ sprintf(linet1,"This invocation has %lu actual parameters.",
+ (ulong) ls_len(p_elll));
+ wf_wl(p_wf,linet1);
+ wf_wl(p_wf,
+ "Actual parameter list follows as a sequence of expressions:");
+ wf_wl(p_wf,"(Text crud before and after parameter has been omitted).");
+ parno=1;
+ ls_fir(p_elll);
+ while (TRUE)
+ {
+ ls_nxt(p_elll,PPV &pp_ex);
+ if (pp_ex==NULL) break;
+ p_ex = *pp_ex;
+ sprintf(linet1,"Expression for parameter number %lu:",(ulong) parno);
+ wf_wl(p_wf,linet1);
+ dm_ex(p_wf,p_ex);
+ parno++;
+ }
+ }
+
+ centerln(p_wf,30,'-',"End Invocation Element");
+ wf_wl(p_wf,"");
+}
+
+/******************************************************************************/
+
+LOCAL void dm_elpr P_((p_wf_t,p_el_t));
+LOCAL void dm_elpr(p_wf,p_el)
+/* Dumps the specified parameter element to the specified stream. */
+p_wf_t p_wf;
+p_el_t p_el;
+{
+ wf_wl(p_wf,"");
+ centerln(p_wf,30,'-',"Start Parameter Element");
+ sprintf(linet1,"Parameter number=%lu.",(ulong) p_el->el_parno);
+ wf_wl(p_wf,linet1);
+ /* ABC { */
+ sprintf(
+ linet1,
+ "Parameter is of macro \"%s\".",
+ /* ABC { */
+#if DYN_NAMES
+ p_el->el_which->ma_name
+#else /* !DYN_NAMES */
+ &p_el->el_which->ma_name[0]
+#endif /* DYN_NAMES */
+ /* } ABC */
+ );
+ /* } ABC */
+ wf_wl(p_wf,linet1);
+ centerln(p_wf,30,'-',"End Parameter Element");
+ wf_wl(p_wf,"");
+}
+
+/* ABC { */
+/******************************************************************************/
+
+LOCAL void dm_elsp P_((p_wf_t,p_el_t));
+LOCAL void dm_elsp (p_wf,p_el)
+/* Dumps the specified special function result to the specified stream. */
+p_wf_t p_wf;
+p_el_t p_el;
+{
+ wf_wl(p_wf,"");
+ centerln(p_wf,30,'-',"Start Special Function");
+
+ centerln(p_wf,30,'-',"End Special Function");
+ wf_wl(p_wf,"");
+}
+
+/* } ABC */
+
+/******************************************************************************/
+
+LOCAL void dm_ex(p_wf,p_ex)
+/* Dumps the specified expression to the specified stream. */
+p_wf_t p_wf;
+p_ells_t p_ex;
+{
+ p_el_t p_el;
+
+ wf_wl(p_wf,"");
+ centerln(p_wf,30,'-',"Start of Expression");
+ ls_fir(p_ex);
+ ls_nxt(p_ex,PPV &p_el);
+ while (p_el != NULL)
+ {
+ switch (p_el->el_kind)
+ {
+ case EL_TEXT: dm_eltx(p_wf,p_el); break;
+ case EL_INVC: dm_elin(p_wf,p_el); break;
+ case EL_PARM: dm_elpr(p_wf,p_el); break;
+ /* ABC { */
+ case EL_SPEC: dm_elsp(p_wf,p_el); break;
+ /* } ABC */
+ default : as_bomb("dm_ex: Case defaulted.");
+ }
+ ls_nxt(p_ex,PPV &p_el);
+ }
+ centerln(p_wf,30,'-',"End of Expression");
+ wf_wl(p_wf,"");
+}
+
+/******************************************************************************/
+
+LOCAL void dm_macro P_((p_wf_t,p_ma_t));
+LOCAL void dm_macro(p_wf,p_ma)
+/* Dump all the information on the specified macro. */
+p_wf_t p_wf;
+p_ma_t p_ma;
+{
+ wf_wl(p_wf,"");
+ centerln(p_wf,DUMP_WIDTH-20,'-',"Start of Macro Dump");
+
+ /* A macro can't exist in the macro table without a name. */
+ sprintf(linet1,"Macro Name : \"%s\"",p_ma->ma_name); wf_wl(p_wf,linet1);
+
+ /* Is the macro defined? */
+ if (!p_ma->ma_defn.md_isdef) wf_wl(p_wf,"Defined? : No.");
+ else wf_wl(p_wf,"Defined? : Yes.");
+
+ /* Defined macros carry lots more information. */
+ if (p_ma->ma_defn.md_isdef)
+ {
+ /* Number of parameters the macro has. */
+ sprintf(linet1,"Parameters : %lu",(ulong) p_ma->ma_defn.md_npar);
+ wf_wl(p_wf,linet1);
+
+ /* Is the macro additive? */
+ if (p_ma->ma_defn.md_isadd) wf_wl(p_wf,"Additive? : Yes.");
+ else wf_wl(p_wf,"Additive? : No.");
+
+ /* Is the macro allowed to be called zero times? */
+ if (p_ma->ma_defn.md_iszer) wf_wl(p_wf,"Zero Calls? : Yes.");
+ else wf_wl(p_wf,"Zero Calls? : No.");
+
+ /* Is the macro allowed to be called many times? */
+ if (p_ma->ma_defn.md_isman) wf_wl(p_wf,"Many Calls? : Yes.");
+ else wf_wl(p_wf,"Many Calls? : No.");
+
+ /* Is the macro connected to an product file? */
+ if (p_ma->ma_defn.md_isfil) wf_wl(p_wf,"Output File?: Yes.");
+ else wf_wl(p_wf,"Output File?: No.");
+
+/* ABC { */
+ /* Is there an automatic line directive macro? */
+ if (p_ma->ma_defn.md_aldm != NULL) {
+ wf_wl(p_wf,"Automatic Line Directive Macro?: Yes.");
+ wf_wr(p_wf," macro name: ");
+ if (p_ma->ma_defn.md_aldm->lnmac == NULL)
+ wf_wr(p_wf, "NULL");
+ else
+ wf_wr(p_wf, p_ma->ma_defn.md_aldm->lnmac);
+ wf_wr(p_wf,", source type: ");
+ if (p_ma->ma_defn.md_aldm->typnam == NULL)
+ wf_wl(p_wf, "NULL");
+ else
+ wf_wl(p_wf, p_ma->ma_defn.md_aldm->typnam);
+ } else {
+ wf_wl(p_wf,"Automatic Line Directive Macro?: No.");
+ } /* end if */
+/* } ABC */
+
+ /* Dump a list of all the calls to the macro. */
+ {
+ p_mc_t p_mc;
+ ulong mcnum;
+ wf_wl(p_wf,"Call list :");
+ ls_fir(p_ma->ma_calls);
+ ls_nxt(p_ma->ma_calls,PPV &p_mc);
+ mcnum=1;
+ while (p_mc != NULL)
+ {
+ sprintf(linet1,
+ " Call %lu: Parameters=%lu, Sequence num=%lu, Position(L,C)=(%lu,%lu).",
+ (ulong) mcnum,
+ (ulong) p_mc->mc_npar,
+ (ulong) p_mc->mc_seq,
+ (ulong) p_mc->mc_ps.ps_line,
+ (ulong) p_mc->mc_ps.ps_column);
+ wf_wl(p_wf,linet1);
+ ls_nxt(p_ma->ma_calls,PPV &p_mc);
+ mcnum++;
+ }
+ }
+
+ /* Dump a list of the body parts of the macro. */
+ {
+ p_bp_t p_bp;
+ ulong bpnum;
+ ulong bptot = ls_len(p_ma->ma_defn.md_body);
+ wf_wl(p_wf,"Macro body :");
+ wf_wl(p_wf,"");
+ wf_wl(p_wf,"--Start of List of Body Parts--");
+ sprintf(linet1,"This macro has %lu body part",(ulong) bptot);
+ if (bptot!=1) strcat(linet1,"s");
+ strcat(linet1,".");
+ wf_wl(p_wf,linet1);
+ bpnum=1;
+ ls_fir(p_ma->ma_defn.md_body);
+ ls_nxt(p_ma->ma_defn.md_body,PPV &p_bp);
+ while (p_bp != NULL)
+ {
+ sprintf(linet1,
+ "Body part %lu: Seqnum=%lu, Pos(L,C)=(%lu,%lu), Expression follows:",
+ (ulong) bpnum,
+ (ulong) p_bp->bp_seq,
+ (ulong) p_bp->bp_ps.ps_line,
+ (ulong) p_bp->bp_ps.ps_column);
+ wf_wl(p_wf,linet1);
+ dm_ex(p_wf,p_bp->bp_ex);
+ ls_nxt(p_ma->ma_defn.md_body,PPV &p_bp);
+ bpnum++;
+ }
+ wf_wl(p_wf,"---End of List of Body Parts---");
+ wf_wl(p_wf,"");
+ }
+
+ } /* End of IF defined. */
+
+ centerln(p_wf,DUMP_WIDTH-20,'-',"End of Macro Dump");
+ wf_wl(p_wf,"");
+}
+
+/******************************************************************************/
+
+EXPORT void dm_matb P_((p_wf_t));
+EXPORT void dm_matb(p_wf)
+p_wf_t p_wf;
+{
+ wf_wl(p_wf,"");
+ centerln(p_wf,DUMP_WIDTH,'=',"Start of MACRO TABLE DUMP");
+ wf_wl(p_wf,"");
+ tb_fir(macro_table);
+ while (TRUE)
+ {
+ name_t name;
+ p_ma_t p_ma;
+ if (!tb_rea(macro_table,PV &name[0],PV &p_ma)) break;
+ dm_macro(p_wf,p_ma);
+ wf_wl(p_wf,"");
+ }
+ wf_wl(p_wf,"");
+ centerln(p_wf,DUMP_WIDTH,'=',"End of MACRO TABLE DUMP");
+ wf_wl(p_wf,"");
+}
+
+/******************************************************************************/
+
+LOCAL void dm_ty P_((p_wf_t,p_ty_t));
+LOCAL void dm_ty(p_wf,p_ty)
+p_wf_t p_wf;
+p_ty_t p_ty;
+{
+ char linet2[200];
+ char linet3[200];
+
+ switch (p_ty->ty_kind)
+ {
+ case TY_NSEC:
+ sn_str(&p_ty->ty_sn,linet2);
+ strcpy(linet3,"<No name>");
+ /* ABC { */
+#if DYN_NAMES
+ if (p_ty->ty_isnam) strcpy(linet3,p_ty->ty_name);
+#else /* !DYN_NAMES */
+ if (p_ty->ty_isnam) strcpy(linet3,&p_ty->ty_name[0]);
+#endif /* DYN_NAMES */
+ /* } ABC */
+ sprintf(linet1," Section \"%s\", Section name=\"%s\".",linet2,linet3);
+ wf_wl(p_wf,"");
+ wf_wl(p_wf,linet1);
+ break;
+ case TY_OLIT: wf_wl(p_wf," Open literal." ); break;
+ case TY_CLIT: wf_wl(p_wf," Close literal." ); break;
+ case TY_OEMP: wf_wl(p_wf," Open emphasise." ); break;
+ case TY_CEMP: wf_wl(p_wf," Close emphasise." ); break;
+ case TY_NPAG: wf_wl(p_wf," New page." ); break;
+ case TY_TOCS: wf_wl(p_wf," Table of contents."); break;
+ case TY_SKIP:
+ sprintf(linet1," Vertical skip by %lu mm.",(ulong) p_ty->ty_mm);
+ wf_wl(p_wf,linet1);
+ break;
+ case TY_TITL:
+ wf_wr(p_wf,"Font="); wf_wr(p_wf,fontname(p_ty->ty_font));
+ wf_wr(p_wf,", Alignment="); wf_wr(p_wf,alignname(p_ty->ty_align));
+ wf_wl(p_wf,". Title text follows:");
+ dm_sc(p_wf,&p_ty->ty_sc);
+ break;
+ default: as_bomb("dm_ty: Typesetter directive switch defaulted.");
+ }
+}
+
+/******************************************************************************/
+
+EXPORT void dm_dcls(p_wf)
+/* Dumps a text representation of the document list to the given stream. */
+p_wf_t p_wf;
+{
+ wf_wl(p_wf,"");
+ centerln(p_wf,DUMP_WIDTH,'=',"Start of DOCUMENT LIST DUMP");
+ wf_wl(p_wf,"");
+
+ ls_fir(document_list);
+ while (TRUE)
+ {
+ p_dc_t p_dc;
+ ls_nxt(document_list,PPV &p_dc);
+ if (p_dc == NULL) break;
+ wf_wl(p_wf,"");
+ sprintf(linet1,"Pos(L,C)=(%lu,%lu). ",
+ p_dc->dc_ps.ps_line,
+ p_dc->dc_ps.ps_column);
+ switch (p_dc->dc_kind)
+ {
+ case DC_TEXT:
+ wf_wr(p_wf,"TEXT COMPONENT: "); wf_wl(p_wf,linet1);
+ dm_scls(p_wf,p_dc->dc_text);
+ break;
+
+ case DC_TYPE:
+ wf_wr(p_wf,"TYPESETTER DIRECTIVE COMPONENT: ");
+ dm_ty(p_wf,&p_dc->dc_ty);
+ break;
+
+ case DC_MACR:
+ wf_wr(p_wf,"MACRO DEFINITION COMPONENT: "); wf_wl(p_wf,linet1);
+ /* ABC { */
+ sprintf(linet1,"Part %lu of macro @<%s@>.",
+ p_dc->dc_part,
+#if DYN_NAMES
+ p_dc->dc_p_ma->ma_name
+#else /* !DYN_NAMES */
+ &p_dc->dc_p_ma->ma_name[0]
+#endif /* DYN_NAMES */
+ );
+ /* } ABC */
+ wf_wl(p_wf,linet1);
+ break;
+
+ default: as_bomb("dm_scls: Case defaulted.");
+ }
+ }
+
+ wf_wl(p_wf,"");
+ centerln(p_wf,DUMP_WIDTH,'=',"End of DOCUMENT LIST DUMP");
+ wf_wl(p_wf,"");
+}
+
+/******************************************************************************/
+
+LOCAL void tm_for P_((p_wf_t,char *,p_ck_t,p_ck_t));
+LOCAL void tm_for(p_wf,s,p_val,p_tot)
+/* This rather ragged function simplifies the formatting in dm_times. */
+p_wf_t p_wf;
+char *s;
+p_ck_t p_val;
+p_ck_t p_tot;
+{
+ sprintf(linet1,"|%s| %3d%% | %8.2f | %8.2f | %3d%% |",
+ s,
+ (int) ((100.0*ck_cpu(p_val))/ck_cpu(p_tot)),
+ (float) ck_cpu(p_val),
+ (float) ck_real(p_val),
+ (int) ((100.0*ck_real(p_val))/ck_real(p_tot))
+ );
+ wf_wl(p_wf,linet1);
+}
+
+/******************************************************************************/
+
+EXPORT void dm_times(p_wf,
+ p_mapp,p_scan,p_pars,p_anal,
+ p_dump,p_lstr,p_tang,p_weav,p_totl)
+p_wf_t p_wf;
+p_ck_t p_mapp;
+p_ck_t p_scan;
+p_ck_t p_pars;
+p_ck_t p_anal;
+p_ck_t p_dump;
+p_ck_t p_lstr;
+p_ck_t p_tang;
+p_ck_t p_weav;
+p_ck_t p_totl;
+{
+ float cputot;
+ float realtot;
+ float cpuerr;
+ float realerr;
+
+ cputot = ck_cpu(p_mapp) + ck_cpu(p_scan) + ck_cpu(p_pars) +
+ ck_cpu(p_anal) + ck_cpu(p_dump) + ck_cpu(p_lstr) +
+ ck_cpu(p_tang) + ck_cpu(p_weav);
+
+ realtot = ck_real(p_mapp) + ck_real(p_scan) + ck_real(p_pars) +
+ ck_real(p_anal) + ck_real(p_dump) + ck_real(p_lstr) +
+ ck_real(p_tang) + ck_real(p_weav);
+
+ cpuerr = ck_cpu (p_totl)-cputot;
+ realerr = ck_real(p_totl)-realtot;
+
+ wf_wl(p_wf,"");
+ wf_wl(p_wf,"Summary of time used by each subsystem of Funnelweb (seconds).");
+ wf_wl(p_wf,"");
+ wf_wl(p_wf, "+------------+------+----------+----------+------+");
+ wf_wl(p_wf, "| Subsystem | CPU% | CPU Time | RealTime | RT% |");
+ wf_wl(p_wf, "+------------+------+----------+----------+------+");
+ tm_for(p_wf," Mapper ",p_mapp,p_totl);
+ tm_for(p_wf," Scanner ",p_scan,p_totl);
+ tm_for(p_wf," Parser ",p_pars,p_totl);
+ tm_for(p_wf," Analyser ",p_anal,p_totl);
+ tm_for(p_wf," Dumper ",p_dump,p_totl);
+ tm_for(p_wf," Lister ",p_lstr,p_totl);
+ tm_for(p_wf," Tangler ",p_tang,p_totl);
+ tm_for(p_wf," Weaver ",p_weav,p_totl);
+ sprintf(linet1,"|%s| %3d%% | %8.2f | %8.2f | %3d%% |",
+ " Clock Err ",
+ (int) ((100.0*cpuerr )/ck_cpu (p_totl)),
+ (float) cpuerr,
+ (float) realerr,
+ (int) ((100.0*realerr)/ck_real(p_totl))
+ );
+ wf_wl(p_wf,linet1);
+
+ wf_wl(p_wf, "+------------+------+----------+----------+------+");
+ tm_for(p_wf," Total ",p_totl,p_totl);
+ wf_wl(p_wf, "+------------+------+----------+----------+------+");
+ wf_wl(p_wf,"");
+}
+
+/******************************************************************************/
+/* End of DUMP.C */
+/******************************************************************************/