#pragma prototyped
#ifndef _SHNODES_H
#define _SHNODES_H 1
#include <ast.h>
#include "argnod.h"
#define FINT (02<<COMBITS)
#define FAMP (04<<COMBITS)
#define FPIN (010<<COMBITS)
#define FPOU (040<<COMBITS)
#define FPCL (0100<<COMBITS)
#define FCOOP (0200<<COMBITS)
#define FSHOWME (0400<<COMBITS)
#define FALTPIPE (02000<<COMBITS)
#define FPOSIX (02<<COMBITS)
#define FLINENO (04<<COMBITS)
#define FOPTGET (010<<COMBITS)
#define TNEGATE (01<<COMBITS)
#define TBINARY (02<<COMBITS)
#define TUNARY (04<<COMBITS)
#define TTEST (010<<COMBITS)
#define TPAREN (TBINARY|TUNARY)
#define TSHIFT (COMBITS+4)
#define TNSPACE (TFUN|COMSCAN)
#define TCOM 0
#define TPAR 1
#define TFIL 2
#define TLST 3
#define TIF 4
#define TWH 5
#define TUN (TWH|COMSCAN)
#define TTST 6
#define TSW 7
#define TAND 8
#define TORF 9
#define TFORK 10
#define TFOR 11
#define TSELECT (TFOR|COMSCAN)
#define TARITH 12
#define TTIME 13
#define TSETIO 14
#define TFUN 15
struct trenod
{
int tretyp;
struct ionod *treio;
};
struct forknod
{
int forktyp;
struct ionod *forkio;
Shnode_t *forktre;
int forkline;
};
struct ifnod
{
int iftyp;
Shnode_t *iftre;
Shnode_t *thtre;
Shnode_t *eltre;
};
struct whnod
{
int whtyp;
Shnode_t *whtre;
Shnode_t *dotre;
struct arithnod *whinc;
};
struct fornod
{
int fortyp;
char *fornam;
Shnode_t *fortre;
struct comnod *forlst;
int forline;
};
struct swnod
{
int swtyp;
struct argnod *swarg;
struct regnod *swlst;
struct ionod *swio;
int swline;
};
struct regnod
{
struct argnod *regptr;
Shnode_t *regcom;
struct regnod *regnxt;
char regflag;
};
struct parnod
{
int partyp;
Shnode_t *partre;
};
struct lstnod
{
int lsttyp;
Shnode_t *lstlef;
Shnode_t *lstrit;
};
struct tstnod
{
struct lstnod tstlst;
int tstline;
};
struct functnod
{
int functtyp;
char *functnam;
Shnode_t *functtre;
int functline;
off_t functloc;
struct slnod *functstak;
struct comnod *functargs;
};
struct arithnod
{
int artyp;
int arline;
struct argnod *arexpr;
void *arcomp;
};
#define IOUFD 0x3f
#define IOPUT 0x40
#define IOAPP 0x80
#define IODOC 0x100
#define IOMOV 0x200
#define IOCLOB 0x400
#define IORDW 0x800
#define IORAW 0x1000
#define IOSTRG 0x2000
#define IOSTRIP 0x4000
#define IOQUOTE 0x8000
#define IOVNM 0x10000
#define IOLSEEK 0x20000
#define IOARITH 0x40000
#define IOREWRITE 0x80000
#define IOCOPY IOCLOB
#define IOPROCSUB IOARITH
union Shnode_u
{
struct argnod arg;
struct ionod io;
struct whnod wh;
struct swnod sw;
struct ifnod if_;
struct dolnod dol;
struct comnod com;
struct trenod tre;
struct forknod fork;
struct fornod for_;
struct regnod reg;
struct parnod par;
struct lstnod lst;
struct tstnod tst;
struct functnod funct;
struct arithnod ar;
};
extern void sh_freeup(Shell_t*);
extern void sh_funstaks(struct slnod*,int);
extern Sfio_t *sh_subshell(Shell_t*,Shnode_t*, int, int);
#if defined(__EXPORT__) && defined(_BLD_DLL) && defined(_BLD_shell)
__EXPORT__
#endif
extern int sh_tdump(Sfio_t*, const Shnode_t*);
extern Shnode_t *sh_trestore(Shell_t*, Sfio_t*);
#endif