mode.h revision d6b882a974afe4a3ab38793d5de10bae2e078d39
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
#ifndef _MODE_H
#define _MODE_H
/*
* UNIX shell
*/
#include <unistd.h>
#ifdef pdp11
typedef char BOOL;
#else
typedef short BOOL;
#endif
#define BYTESPERWORD (sizeof (char *))
#define ALIGNSIZ (sizeof (double))
#define NIL ((char *)0)
/*
* the following nonsense is required
* because casts turn an Lvalue
* into an Rvalue so two cheats
* are necessary, one for each context.
*/
#define Rcheat(a) ((int)(a))
/* address puns for storage allocation */
typedef union
{
struct forknod *_forkptr;
struct comnod *_comptr;
struct fndnod *_fndptr;
struct parnod *_parptr;
struct ifnod *_ifptr;
struct whnod *_whptr;
struct fornod *_forptr;
struct lstnod *_lstptr;
struct blk *_blkptr;
struct namnod *_namptr;
char *_bytptr;
} address;
/* heap storage */
struct blk
{
struct blk *word;
char pad[ALIGNSIZ - sizeof (struct blk *)];
};
/*
* largefile converson hack note.
* the shell uses the *fnxt and *fend pointers when
* parsing a script. However, it was also using the
* difference between them when doing lseeks. Because
* that doesn't work in the largefile world, I have
* added a parallel set of offset counters that need to
* be updated whenever the "buffer" offsets the shell
* uses get changed. Most of this code is in word.c.
* If you change it, have fun...
*/
#define BUFFERSIZE 128
struct fileblk
{
int fdes;
unsigned flin;
BOOL feof;
unsigned char fsiz;
unsigned char *fnxt;
unsigned char *fend;
off_t nxtoff; /* file offset */
off_t endoff; /* file offset */
unsigned char **feval;
struct fileblk *fstak;
unsigned char fbuf[BUFFERSIZE];
};
struct tempblk
{
int fdes;
struct tempblk *fstak;
};
/* for files not used with file descriptors */
struct filehdr
{
int fdes;
unsigned flin;
BOOL feof;
unsigned char fsiz;
unsigned char *fnxt;
unsigned char *fend;
off_t nxtoff; /* file offset */
off_t endoff; /* file offset */
unsigned char **feval;
struct fileblk *fstak;
unsigned char _fbuf[1];
};
struct sysnod
{
char *sysnam;
int sysval;
};
/* this node is a proforma for those that follow */
struct trenod
{
int tretyp;
struct ionod *treio;
};
/* dummy for access only */
struct argnod
{
struct argnod *argnxt;
unsigned char argval[1];
};
struct dolnod
{
struct dolnod *dolnxt;
int doluse;
unsigned char **dolarg;
};
struct forknod
{
int forktyp;
struct ionod *forkio;
struct trenod *forktre;
};
struct comnod
{
int comtyp;
struct ionod *comio;
struct argnod *comarg;
struct argnod *comset;
};
struct fndnod
{
int fndtyp;
unsigned char *fndnam;
struct trenod *fndval;
int fndref;
};
struct ifnod
{
int iftyp;
struct trenod *iftre;
struct trenod *thtre;
struct trenod *eltre;
};
struct whnod
{
int whtyp;
struct trenod *whtre;
struct trenod *dotre;
};
struct fornod
{
int fortyp;
struct trenod *fortre;
unsigned char *fornam;
struct comnod *forlst;
};
struct swnod
{
int swtyp;
unsigned char *swarg;
struct regnod *swlst;
};
struct regnod
{
struct argnod *regptr;
struct trenod *regcom;
struct regnod *regnxt;
};
struct parnod
{
int partyp;
struct trenod *partre;
};
struct lstnod
{
int lsttyp;
struct trenod *lstlef;
struct trenod *lstrit;
};
struct ionod
{
int iofile;
char *ioname;
char *iolink;
struct ionod *ionxt;
struct ionod *iolst;
};
struct fdsave
{
int org_fd;
int dup_fd;
};
#define fndptr(x) ((struct fndnod *)x)
#define comptr(x) ((struct comnod *)x)
#define forkptr(x) ((struct forknod *)x)
#define parptr(x) ((struct parnod *)x)
#define lstptr(x) ((struct lstnod *)x)
#define forptr(x) ((struct fornod *)x)
#define whptr(x) ((struct whnod *)x)
#define ifptr(x) ((struct ifnod *)x)
#define swptr(x) ((struct swnod *)x)
#endif /* _MODE_H */