-- TexDump.mesa -- Last changed by Doug Wyatt, September 23, 1980 3:40 PM DIRECTORY TexDefs: FROM "TexDefs", TexHashDefs: FROM "TexHashDefs", TexInpDefs: FROM "TexInpDefs", TexIODefs: FROM "TexIODefs", TexMemDefs: FROM "TexMemDefs", TexStringDefs: FROM "TexStringDefs", TexSynDefs: FROM "TexSynDefs", TexTableDefs: FROM "TexTableDefs", TexTokenDefs: FROM "TexTokenDefs"; TexDump: PROGRAM IMPORTS TexHashDefs,TexInpDefs,TexIODefs,TexMemDefs,TexTableDefs,TexStringDefs EXPORTS TexSynDefs = BEGIN OPEN TexTokenDefs,TexIODefs; -- The diagnostic routines dumplist,dumptokens tokstring: STRING_NIL; id: STRING_NIL; DumpInit: PROCEDURE = BEGIN OPEN TexMemDefs; tokstring_AllocString[500]; id_AllocString[TexHashDefs.maxidsize]; END; -- the value returned by DumpList is the index in the string s -- corresponding to the token pointed to by q DumpList: PROCEDURE[s: STRING, p,q: TokenPtr] RETURNS[CARDINAL] = BEGIN OPEN TexIODefs; stream: StreamHandle_TexStringDefs.CreateStringStream[s]; itm: Token; npars: CARDINAL_0; qindex: CARDINAL_0; lengthlimit: CARDINAL=s.length-8; SetStream[stream]; WHILE p#NIL DO ENABLE TexStringDefs.StringFull => CONTINUE; IF p=q THEN qindex_s.length; itm_p.token; WITH x: itm SELECT FROM ctrlseq => BEGIN OPEN TexTableDefs; i: HashIndex_x.index; IF i IN HashIndex THEN BEGIN id.length_0; TexHashDefs.IdName[id, i]; IF (s.length+id.length)>lengthlimit THEN GOTO Etc; Esc; Ws[id]; IF id.length>1 OR ChType[id[0]]=letter THEN Sp; END ELSE Ws["IMPOSSIBLE"L]; END; match => SELECT x.matchcode FROM par => BEGIN Wc['#]; Wc['0+(npars_npars+1)] END; end => Wc[']; -- right arrow ENDCASE; outpar => BEGIN Wc['#]; Wc['0+x.paramnum] END; macprm => Ws["##"L]; parend => BEGIN Esc;Ws["par "L] END; endv => BEGIN Esc;Ws["ENDV"L] END; spacer => Wc[' ]; lbrace,rbrace,mathbr,tabmrk,supmrk,submrk, letter,otherchar => Wc[x.char]; ENDCASE => BEGIN Esc;Ws["BAD"L] END; IF s.length>lengthlimit THEN GOTO Etc; p_p.link; REPEAT Etc => BEGIN Esc;Ws["ETC"L] END ENDLOOP; UseDisplay; stream.destroy[stream]; RETURN[qindex]; END -- of DumpList --; DumpTokens: PUBLIC PROCEDURE[s: STRING, p: TokenPtr] = BEGIN []_DumpList[s, p,NIL] END; DumpContext: PUBLIC PROCEDURE = BEGIN OPEN TexInpDefs,TexIODefs; ptr: [0..instacksize]; t: TokenPtr; UseDisplay; -- output to display instack[inptr]_instate; FOR ptr DECREASING IN [0..inptr] DO WITH instack[ptr] SELECT FROM tokenlist => BEGIN iloc: CARDINAL; WITH recovery SELECT FROM donothing => BEGIN Ps[" "L]; t_l END; endulist => BEGIN Ps[" "L]; t_l END; endvlist => BEGIN Ps[" "L]; t_l END; prune => BEGIN Cr; t_l.link END; destroy => IF loc#NIL THEN BEGIN Ps[" "L]; t_l END ELSE LOOP; -- tokenlist to be flushed, won't be dumped ENDCASE => ERROR; tokstring.length_0; iloc_DumpList[tokstring,t,loc]; ShowLoc[tokstring, iloc]; END; charlist => BEGIN curfile: STRING_filename; IF curfile=NIL THEN Ps["(*) "L] ELSE BEGIN Ps["p."L]; Wn[page]; Ws[",l."L]; Wn[line]; Sp END; ShowLoc[inbuf,ibptr+1]; IF curfile#NIL THEN EXIT; Cr; END; ENDCASE; ENDLOOP; END -- of DumpContext --; ShowLoc: PROCEDURE[s: STRING, loc: CARDINAL] = BEGIN OPEN TexIODefs; del: CARDINAL=32; beg,end,e: CARDINAL; head,tail: BOOLEAN; IF s.length=0 THEN RETURN; head_loc>del; beg_IF head THEN loc-del ELSE 0; tail_s.length>(e_loc+del); end_IF tail THEN e ELSE s.length; IF s[end-1]=CR THEN end_end-1; IF head THEN Ws["..."L]; Wss[s,beg,loc]; -- tab_Loc[]; Wss[s,loc,end]; IF tail THEN Ws["..."L]; -- Cr; Tab[tab]; Wc['^]; Ws[" <=> "L]; Wss[s,loc,end]; IF tail THEN Ws["..."L]; -- *** try this END; DumpInit; END.