1N/A/***********************************************************************
1N/A* *
1N/A* This software is part of the ast package *
1N/A* Copyright (c) 1986-2010 AT&T Intellectual Property *
1N/A* and is licensed under the *
1N/A* Common Public License, Version 1.0 *
1N/A* by AT&T Intellectual Property *
1N/A* *
1N/A* A copy of the License is available at *
1N/A* http://www.opensource.org/licenses/cpl1.0.txt *
1N/A* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
1N/A* *
1N/A* Information and Software Systems Research *
1N/A* AT&T Research *
1N/A* Florham Park NJ *
1N/A* *
1N/A* Glenn Fowler <gsf@research.att.com> *
1N/A* *
1N/A***********************************************************************/
1N/A#pragma prototyped
1N/A/*
1N/A * Glenn Fowler
1N/A * AT&T Research
1N/A *
1N/A * preprocessor library trace and debug support
1N/A */
1N/A
1N/A#include "pplib.h"
1N/A#include "ppfsm.h"
1N/A
1N/A#include <ctype.h>
1N/A
1N/A/*
1N/A * convert token string to printable form
1N/A */
1N/A
1N/Achar*
1N/Apptokstr(register char* s, register int c)
1N/A{
1N/A register char* t;
1N/A
1N/A static char buf[8];
1N/A
1N/A if (t = s)
1N/A {
1N/A while (*t == ' ' || *t == '\t') t++;
1N/A c = *t ? *t : *s;
1N/A }
1N/A switch (c)
1N/A {
1N/A case 0:
1N/A case 0400:
1N/A return("`EOF'");
1N/A case ' ':
1N/A return("`space'");
1N/A case '\f':
1N/A return("`formfeed'");
1N/A case '\n':
1N/A return("`newline'");
1N/A case '\t':
1N/A return("`tab'");
1N/A case '\v':
1N/A return("`vertical-tab'");
1N/A case T_TOKCAT:
1N/A return("##");
1N/A default:
1N/A if (iscntrl(c) || !isprint(c)) sfsprintf(buf, sizeof(buf), "`%03o'", c);
1N/A else if (s) return(s);
1N/A else sfsprintf(buf, sizeof(buf), "%c", c);
1N/A return(buf);
1N/A }
1N/A}
1N/A
1N/A#if DEBUG & TRACE_debug
1N/A
1N/A#include "ppdebug.h"
1N/A
1N/A/*
1N/A * return input stream name given index
1N/A */
1N/A
1N/Achar*
1N/Appinstr(register struct ppinstk* p)
1N/A{
1N/A register int i;
1N/A
1N/A static char buf[128];
1N/A
1N/A for (i = 0; i < elementsof(ppinmap); i++)
1N/A if (p->type == ppinmap[i].val)
1N/A {
1N/A switch (p->type)
1N/A {
1N/A case IN_MACRO:
1N/A#if MACDEF
1N/A case IN_MULTILINE:
1N/A#endif
1N/A if (p->symbol)
1N/A {
1N/A sfsprintf(buf, sizeof(buf), "%s=%s", ppinmap[i].nam, p->symbol->name);
1N/A return(buf);
1N/A }
1N/A break;
1N/A }
1N/A return(ppinmap[i].nam);
1N/A }
1N/A sfsprintf(buf, sizeof(buf), "UNKNOWN[%d]", p->type);
1N/A return(buf);
1N/A}
1N/A
1N/A/*
1N/A * return string given fsm lex state
1N/A */
1N/A
1N/Achar*
1N/Applexstr(register int lex)
1N/A{
1N/A register int i;
1N/A int splice;
1N/A static char buf[64];
1N/A
1N/A if (lex < 0) lex &= ~lex;
1N/A splice = (lex & SPLICE);
1N/A lex &= 0x7f;
1N/A for (i = 0; i < (elementsof(pplexmap) - 1) && (lex > pplexmap[i].val || lex == pplexmap[i+1].val); i++);
1N/A if (lex != pplexmap[i].val)
1N/A {
1N/A if (pplexmap[i].val < 0) sfsprintf(buf, sizeof(buf), "%s|0x%04x%s", pplexmap[i].nam, lex, splice ? "|SPLICE" : "");
1N/A else sfsprintf(buf, sizeof(buf), "%s+%d", pplexmap[i-1].nam, lex - pplexmap[i-1].val, splice ? "|SPLICE" : "");
1N/A return(buf);
1N/A }
1N/A if (splice)
1N/A {
1N/A sfsprintf(buf, sizeof(buf), "%s|SPLICE", pplexmap[i].nam);
1N/A return(buf);
1N/A }
1N/A return(pplexmap[i].nam);
1N/A}
1N/A
1N/A/*
1N/A * return string given map p of size n and flags
1N/A */
1N/A
1N/Astatic char*
1N/Appflagstr(register struct map* p, int n, register long flags)
1N/A{
1N/A register int i;
1N/A register int k;
1N/A register char* s;
1N/A
1N/A static char buf[128];
1N/A
1N/A s = buf;
1N/A for (i = 0; i < n; i++)
1N/A if (flags & p[i].val)
1N/A {
1N/A k = strlen(p[i].nam);
1N/A if ((elementsof(buf) - 2 - (s - buf)) > k)
1N/A {
1N/A if (s > buf) *s++ = '|';
1N/A strcpy(s, p[i].nam);
1N/A s += k;
1N/A }
1N/A }
1N/A *s = 0;
1N/A return(buf);
1N/A}
1N/A
1N/A/*
1N/A * return string given pp.mode
1N/A */
1N/A
1N/Achar*
1N/Appmodestr(register long mode)
1N/A{
1N/A return(ppflagstr(ppmodemap, elementsof(ppmodemap), mode));
1N/A}
1N/A
1N/A/*
1N/A * return string given pp.option
1N/A */
1N/A
1N/Achar*
1N/Appoptionstr(register long option)
1N/A{
1N/A return(ppflagstr(ppoptionmap, elementsof(ppoptionmap), option));
1N/A}
1N/A
1N/A/*
1N/A * return string given pp.state
1N/A */
1N/A
1N/Achar*
1N/Appstatestr(register long state)
1N/A{
1N/A return(ppflagstr(ppstatemap, elementsof(ppstatemap), state));
1N/A}
1N/A
1N/A#include <sig.h>
1N/A
1N/A/*
1N/A * io stream stack trace
1N/A * sig==0 registers the handler
1N/A */
1N/A
1N/Avoid
1N/Apptrace(int sig)
1N/A{
1N/A register char* s;
1N/A register char* x;
1N/A register struct ppinstk* p;
1N/A static int handling;
1N/A
1N/A if (!sig)
1N/A {
1N/A#ifdef SIGBUS
1N/A signal(SIGBUS, pptrace);
1N/A#endif
1N/A#ifdef SIGSEGV
1N/A signal(SIGSEGV, pptrace);
1N/A#endif
1N/A#ifdef SIGILL
1N/A signal(SIGILL, pptrace);
1N/A#endif
1N/A signal(SIGQUIT, pptrace);
1N/A return;
1N/A }
1N/A s = fmtsignal(sig);
1N/A if (handling)
1N/A {
1N/A sfprintf(sfstderr, "\n%s during io stack trace\n", s);
1N/A signal(handling, SIG_DFL);
1N/A sigunblock(handling);
1N/A kill(getpid(), handling);
1N/A pause();
1N/A error(PANIC, "signal not redelivered");
1N/A }
1N/A handling = sig;
1N/A sfprintf(sfstderr, "\n%s - io stack trace\n", s);
1N/A for (p = pp.in; p->prev; p = p->prev)
1N/A {
1N/A sfprintf(sfstderr, "\n[%s]\n", ppinstr(p));
1N/A if ((s = pp.in->nextchr) && *s)
1N/A {
1N/A if (*s != '\n') sfputc(sfstderr, '\t');
1N/A x = s + 256;
1N/A while (*s && s < x)
1N/A {
1N/A sfputc(sfstderr, *s);
1N/A if (*s++ == '\n' && *s && *s != '\n') sfputc(sfstderr, '\t');
1N/A }
1N/A if (*s) sfprintf(sfstderr, " ...");
1N/A }
1N/A }
1N/A sfprintf(sfstderr, "\n");
1N/A handling = 0;
1N/A signal(sig, SIG_DFL);
1N/A sigunblock(sig);
1N/A kill(getpid(), sig);
1N/A pause();
1N/A error(PANIC, "signal not redelivered");
1N/A}
1N/A
1N/A#endif