da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1982-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Labs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * shell parse tree dump
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "defs.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "shnodes.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "path.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "io.h"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#include <ccode.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int p_comlist(const struct dolnod*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int p_arg(const struct argnod*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int p_comarg(const struct comnod*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int p_redirect(const struct ionod*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int p_switch(const struct regnod*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int p_tree(const Shnode_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int p_string(const char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Sfio_t *outfile;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint sh_tdump(Sfio_t *out, const Shnode_t *t)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin outfile = out;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(p_tree(t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * convert to ASCII to write and back again if needed
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int outstring(Sfio_t *out, const char *string, int n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int r;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *cp = (char*)string;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ccmaps(cp, n, CC_NATIVE, CC_ASCII);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin r = sfwrite(out,cp,n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ccmaps(cp, n, CC_ASCII, CC_NATIVE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(r);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * print script corresponding to shell tree <t>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int p_tree(register const Shnode_t *t)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!t)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(sfputl(outfile,-1));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sfputl(outfile,t->tre.tretyp)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch(t->tre.tretyp&COMMSK)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case TTIME:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case TPAR:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(p_tree(t->par.partre));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case TCOM:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(p_comarg((struct comnod*)t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case TSETIO:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case TFORK:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sfputu(outfile,t->fork.forkline)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(p_tree(t->fork.forktre)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(p_redirect(t->fork.forkio));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case TIF:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(p_tree(t->if_.iftre)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(p_tree(t->if_.thtre)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(p_tree(t->if_.eltre));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case TWH:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(t->wh.whinc)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(p_tree((Shnode_t*)(t->wh.whinc))<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sfputl(outfile,-1)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(p_tree(t->wh.whtre)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(p_tree(t->wh.dotre));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case TLST:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case TAND:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case TORF:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case TFIL:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(p_tree(t->lst.lstlef)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(p_tree(t->lst.lstrit));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case TARITH:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sfputu(outfile,t->ar.arline)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(p_arg(t->ar.arexpr));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case TFOR:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sfputu(outfile,t->for_.forline)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(p_tree(t->for_.fortre)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(p_string(t->for_.fornam)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(p_tree((Shnode_t*)t->for_.forlst));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case TSW:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sfputu(outfile,t->sw.swline)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(p_arg(t->sw.swarg)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(p_switch(t->sw.swlst));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case TFUN:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sfputu(outfile,t->funct.functline)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(p_string(t->funct.functnam)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(p_tree(t->funct.functtre)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(p_tree((Shnode_t*)t->funct.functargs));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case TTST:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sfputu(outfile,t->tst.tstline)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((t->tre.tretyp&TPAREN)==TPAREN)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(p_tree(t->lst.lstlef));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(p_arg(&(t->lst.lstlef->arg))<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((t->tre.tretyp&TBINARY))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(p_arg(&(t->lst.lstrit->arg)));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int p_arg(register const struct argnod *arg)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct fornod *fp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(arg)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((n = strlen(arg->argval)) || (arg->argflag&~(ARG_APPEND|ARG_MESSAGE|ARG_QUOTED)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fp=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fp=(struct fornod*)arg->argchn.ap;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = strlen(fp->fornam)+1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputu(outfile,n+1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputc(outfile,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin outstring(outfile,fp->fornam,n-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin outstring(outfile,arg->argval,n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputc(outfile,arg->argflag);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputu(outfile,fp->fortyp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p_tree(fp->fortre);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin arg = arg->argnxt.ap;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(sfputu(outfile,0));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int p_redirect(register const struct ionod *iop)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(iop)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(iop->iovname)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputl(outfile,iop->iofile|IOVNM);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputl(outfile,iop->iofile);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p_string(iop->ioname);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(iop->iodelim)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p_string(iop->iodelim);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputl(outfile,iop->iosize);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfseek(sh.heredocs,iop->iooffset,SEEK_SET);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfmove(sh.heredocs,outfile, iop->iosize,-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputu(outfile,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(iop->iovname)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p_string(iop->iovname);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin iop = iop->ionxt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(sfputl(outfile,-1));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int p_comarg(register const struct comnod *com)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p_redirect(com->comio);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p_arg(com->comset);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!com->comarg)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputl(outfile,-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(com->comtyp&COMSCAN)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p_arg(com->comarg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p_comlist((struct dolnod*)com->comarg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(sfputu(outfile,com->comline));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int p_comlist(const struct dolnod *dol)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *cp, *const*argv;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argv = dol->dolval+ARG_SPARE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(cp = *argv)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argv++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = argv - (dol->dolval+1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputl(outfile,n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argv = dol->dolval+ARG_SPARE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(cp = *argv++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p_string(cp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(sfputu(outfile,0));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int p_switch(register const struct regnod *reg)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(reg)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputl(outfile,reg->regflag);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p_arg(reg->regptr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p_tree(reg->regcom);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg = reg->regnxt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(sfputl(outfile,-1));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int p_string(register const char *string)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register size_t n=strlen(string);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sfputu(outfile,n+1)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(outstring(outfile,string,n));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}