1
/* $NetBSD: show.c,v 1.26 2003/11/14 10:46:13 dsl Exp $ */
4
* Copyright (c) 1991, 1993
5
* The Regents of the University of California. All rights reserved.
7
* This code is derived from software contributed to Berkeley by
10
* Redistribution and use in source and binary forms, with or without
11
* modification, are permitted provided that the following conditions
13
* 1. Redistributions of source code must retain the above copyright
14
* notice, this list of conditions and the following disclaimer.
15
* 2. Redistributions in binary form must reproduce the above copyright
16
* notice, this list of conditions and the following disclaimer in the
17
* documentation and/or other materials provided with the distribution.
18
* 3. Neither the name of the University nor the names of its contributors
19
* may be used to endorse or promote products derived from this software
20
* without specific prior written permission.
22
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36
#include <sys/cdefs.h>
43
static char sccsid[] = "@(#)show.c 8.3 (Berkeley) 5/4/95";
45
__RCSID("$NetBSD: show.c,v 1.26 2003/11/14 10:46:13 dsl Exp $");
62
static void shtree(union node *, int, char *, FILE*);
63
static void shcmd(union node *, FILE *);
64
static void sharg(union node *, FILE *);
65
static void indent(int, char *, FILE *);
66
static void trstring(char *);
70
showtree(union node *n)
72
trputs("showtree called\n");
73
shtree(n, 1, NULL, stdout);
78
shtree(union node *n, int ind, char *pfx, FILE *fp)
97
shtree(n->nbinary.ch1, ind, NULL, fp);
100
shtree(n->nbinary.ch2, ind, NULL, fp);
108
for (lp = n->npipe.cmdlist ; lp ; lp = lp->next) {
113
if (n->npipe.backgnd)
119
fprintf(fp, "<node type %d>", n->type);
129
shcmd(union node *cmd, FILE *fp)
137
for (np = cmd->ncmd.args ; np ; np = np->narg.next) {
143
for (np = cmd->ncmd.redirect ; np ; np = np->nfile.next) {
146
switch (np->nfile.type) {
147
case NTO: s = ">"; dftfd = 1; break;
148
case NCLOBBER: s = ">|"; dftfd = 1; break;
149
case NAPPEND: s = ">>"; dftfd = 1; break;
150
case NTOFD: s = ">&"; dftfd = 1; break;
151
case NFROM: s = "<"; dftfd = 0; break;
152
case NFROMFD: s = "<&"; dftfd = 0; break;
153
case NFROMTO: s = "<>"; dftfd = 0; break;
154
default: s = "*error*"; dftfd = 0; break;
156
if (np->nfile.fd != dftfd)
157
fprintf(fp, "%d", np->nfile.fd);
159
if (np->nfile.type == NTOFD || np->nfile.type == NFROMFD) {
160
fprintf(fp, "%d", np->ndup.dupfd);
162
sharg(np->nfile.fname, fp);
171
sharg(union node *arg, FILE *fp)
174
struct nodelist *bqlist;
177
if (arg->type != NARG) {
178
printf("<node type %d>\n", arg->type);
181
bqlist = arg->narg.backquote;
182
for (p = arg->narg.text ; *p ; p++) {
191
if (subtype == VSLENGTH)
200
switch (subtype & VSTYPE) {
233
printf("<subtype %d>", subtype);
240
case CTLBACKQ|CTLQUOTE:
243
shtree(bqlist->n, -1, NULL, fp);
255
indent(int amount, char *pfx, FILE *fp)
259
for (i = 0 ; i < amount ; i++) {
260
if (pfx && i == amount - 1)
288
trace(const char *fmt, ...)
296
(void) vfprintf(tracefile, fmt, va);
302
tracev(const char *fmt, va_list va)
307
(void) vfprintf(tracefile, fmt, va);
314
trputs(const char *s)
330
putc('"', tracefile);
331
for (p = s ; *p ; p++) {
333
case '\n': c = 'n'; goto backslash;
334
case '\t': c = 't'; goto backslash;
335
case '\r': c = 'r'; goto backslash;
336
case '"': c = '"'; goto backslash;
337
case '\\': c = '\\'; goto backslash;
338
case CTLESC: c = 'e'; goto backslash;
339
case CTLVAR: c = 'v'; goto backslash;
340
case CTLVAR+CTLQUOTE: c = 'V'; goto backslash;
341
case CTLBACKQ: c = 'q'; goto backslash;
342
case CTLBACKQ+CTLQUOTE: c = 'Q'; goto backslash;
343
backslash: putc('\\', tracefile);
347
if (*p >= ' ' && *p <= '~')
350
putc('\\', tracefile);
351
putc(*p >> 6 & 03, tracefile);
352
putc(*p >> 3 & 07, tracefile);
353
putc(*p & 07, tracefile);
358
putc('"', tracefile);
372
putc(' ', tracefile);
374
putc('\n', tracefile);
392
/* leave open because libedit might be using it */
398
if ((p = getenv("HOME")) == NULL) {
408
p = getenv("KLIBC_ASH_DEBUGTRACE");
409
scopy(p ? p : "/tmp/trace", s);
410
#endif /* not_this_way */
412
if (!(!fclose(tracefile) && (tracefile = fopen(s, "a")))) {
413
fprintf(stderr, "Can't re-open %s\n", s);
418
if ((tracefile = fopen(s, "a")) == NULL) {
419
fprintf(stderr, "Can't open %s\n", s);
425
if ((flags = fcntl(fileno(tracefile), F_GETFL, 0)) >= 0)
426
fcntl(fileno(tracefile), F_SETFL, flags | O_APPEND);
428
fputs("\nTracing started.\n", tracefile);