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#ifndef ARG_RAW
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * struct to hold a word argument
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Written by David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <stak.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct ionod
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned iofile;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *ioname;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct ionod *ionxt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct ionod *iolst;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *iodelim;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin off_t iooffset;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin long iosize;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *iovname;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct comnod
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int comtyp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct ionod *comio;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct argnod *comarg;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct argnod *comset;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void *comnamp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void *comnamq;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void *comstate;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int comline;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define COMBITS 4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define COMMSK ((1<<COMBITS)-1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define COMSCAN (01<<COMBITS)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define COMFIXED (02<<COMBITS)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct slnod /* struct for link list of stacks */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct slnod *slnext;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct slnod *slchild;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Stak_t *slptr;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz /* slpad aligns struct functnod = struct slnod + 1 on some architectures */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz struct slnod *slpad;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * This struct is use to hold $* lists and arrays
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct dolnod
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int dolrefcnt; /* reference count */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int dolmax; /* size of dolval array */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int dolnum; /* number of elements */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int dolbot; /* current first element */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct dolnod *dolnxt; /* used when list are chained */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *dolval[1]; /* array of value pointers */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * This struct is used to hold word arguments of variable size during
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * parsing and during expansion. The flags indicate what processing
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * is required on the argument.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct argnod
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin union
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct argnod *ap;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } argnxt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin union
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct argnod *ap;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int len;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } argchn;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned char argflag;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char argval[4];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* The following should evaluate to the offset of argval in argnod */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ARGVAL offsetof(struct argnod,argval[0])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sh_argstr(ap) ((ap)->argflag&ARG_RAW?sh_fmtq((ap)->argval):(ap)->argval)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ARG_SPARE 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* legal argument flags */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ARG_RAW 0x1 /* string needs no processing */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ARG_MAKE 0x2 /* bit set during argument expansion */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ARG_COMSUB 0x2 /* command sub */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ARG_MAC 0x4 /* string needs macro expansion */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ARG_EXP 0x8 /* string needs file expansion */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ARG_ASSIGN 0x10 /* argument is an assignment */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ARG_QUOTED 0x20 /* word contained quote characters */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ARG_MESSAGE 0x40 /* contains international string */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ARG_APPEND 0x80 /* for += assignment */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* The following can be passed as options to sh_macexpand() */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ARG_ARITH 0x100 /* arithmetic expansion */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ARG_OPTIMIZE 0x200 /* try to optimize */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ARG_NOGLOB 0x400 /* no file name expansion */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ARG_LET 0x800 /* processing let command arguments */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define ARG_ARRAYOK 0x1000 /* $x[sub] ==> ${x[sub]} */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern struct dolnod *sh_argcreate(char*[]);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinextern char *sh_argdolminus(void*);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinextern int sh_argopts(int,char*[],void*);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_heading[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_off[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_on[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_sptbnl[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_subst[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_option[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_exec[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_devfdNN[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_devfdstd[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ARG_RAW */