From: lrr@princeton.edu (Lawrence R. Rogers)
Subject: Unaligned access on DECStation under Ultrix 4.2A
Organization: GNUs Not Usenet
Distribution: gnu
Date: Tue, 18 Aug 1992 04:39:07 GMT

% gcc -v
Reading specs from /usr/princeton/lib/gnu/gcc-lib/decstation-ultrix4.2/2.2.1/specs
gcc version 2.2.1

configure run with decstation-ultrix4.2 as the argument.
No modifications to the source.  Everything installed in
/usr/princeton/lib instead of the standard locations.  Works fine on
other architectures (sun3, sun4) also installed in the same locations.



I get the following compiling the public domain ksh under ultrix:

gcc -g -O -g -O -D_BSD -I../std/h  -c expr.c
pid 11630 (cc1) was killed on an unaligned access, at pc 0x46e32c
gcc: Internal compiler error: program cc1 got fatal signal 10

Here is the output of gcc -E -D_BSD -I../std/h  -c expr.c

# 1 "expr.c"
 




static char *RCSid = "$Id: expr.c,v 1.2 1992/04/25 08:33:28 sjg Exp $";


# 1 "stdh.h" 1
 





































# 1 "/usr/princeton/lib/gnu/gcc-lib/decstation-ultrix4.2/2.2.1/include/stdio.h" 1 3
 
 


























 



























































# 1 "/usr/princeton/lib/gnu/gcc-lib/decstation-ultrix4.2/2.2.1/include/ansi_compat.h" 1 3
 



 





















 

















# 116 "/usr/princeton/lib/gnu/gcc-lib/decstation-ultrix4.2/2.2.1/include/ansi_compat.h" 3

# 89 "/usr/princeton/lib/gnu/gcc-lib/decstation-ultrix4.2/2.2.1/include/stdio.h" 2 3



typedef unsigned int	size_t;		 









			 




extern	struct	_iobuf {
	int	_cnt;
	char	*_ptr;
	char	*_base;
	int	_bufsiz;
	short	_flag;
	short	_file;
} _iob[3 ];
typedef	struct _iobuf	FILE;

typedef	long	fpos_t;

















 








 



extern int 	getc( FILE *__stream );
extern int	getchar( void );
extern int	putc( int __c, FILE *__stream);
extern int	putchar( int __c);
extern int	feof( FILE *__stream );
extern int	ferror( FILE *__stream );
extern int	fileno( FILE *__stream );
extern int	_filbuf( FILE *p);
extern int	_flsbuf( unsigned char x , FILE *p);
















typedef char *va_list;

 



extern void	clearerr( FILE *__stream); 
extern int	fclose( FILE *__stream );
extern FILE *	fdopen( int __filedes, char *__type );
extern int	fflush( FILE *__stream );
extern int	fgetc( FILE *__stream );
extern int	fgetpos( FILE *__stream, fpos_t *__pos );
extern char *	fgets( char *__s, int __n, FILE *__stream );
extern FILE *	fopen( const char *__filename, const char *__type );
extern int	fprintf( FILE *__stream, const char *__format, ... );
extern int	fputc( int __c, FILE *__stream );
extern int	fputs( const char *__s, FILE *__stream );
extern size_t	fread( void *__ptr, size_t __size,
			size_t __nitems, FILE *__stream ); 
extern FILE *	freopen( const char *__filename, const char *__type,
			FILE *__stream );
extern int	fscanf( FILE *__stream, const char *__format, ... );
extern int	fseek( FILE *__stream, long __offset, int __ptrname );
extern int	fsetpos( FILE *__stream, const fpos_t *__pos );
extern long	ftell( FILE *__stream );
extern size_t	fwrite( const void *__ptr, size_t __size,
			size_t __nitems, FILE *__stream );
extern char *	gets( char *__s );	
extern void	perror( const char *__s );
extern FILE  *	popen(const char *__command, const char *__type );
extern int	printf( const char *__format, ... );	
extern int	puts( const char *__s );	
extern int	remove( const char *__filename );
extern int	rename( const char *__from, const char *__to );
extern void	rewind( FILE *__stream );
extern int	scanf( const char *__format, ... );	
extern void	setbuf( FILE *__stream, char *__buf );
extern int	setvbuf( FILE *__stream, char *__buf,
			int __type, size_t __size );
extern int	sscanf( const char *__s, const char *__format, ... );
extern FILE *	tmpfile( void );	
extern char *	tmpnam( char *__s );
extern int	ungetc( int __c, FILE *__stream );
extern int	vfprintf( FILE *__stream, const char *__format, va_list __ap );
extern int	vprintf( const char *__format, va_list __ap );
extern int	vsprintf( char *__s, const char *__format, va_list __ap);


extern char *	tempnam( const char *__dir, const char *__pfx);
extern int	putw( int __w, FILE *__stream );
extern int	getw(FILE *__stream);
extern int	pclose( FILE *__stream );


# 299 "/usr/princeton/lib/gnu/gcc-lib/decstation-ultrix4.2/2.2.1/include/stdio.h" 3



 
extern int	sprintf( char *__s, const char *__format, ... );



















# 39 "stdh.h" 2

 



# 1 "../std/h/stddef.h" 1 3
 

 












 
# 28 "../std/h/stddef.h" 3















extern	int errno;		 



# 44 "stdh.h" 2

# 1 "../std/h/stdlib.h" 1 3
 

 




# 1 "../std/h/stddef.h" 1 3
 

 









# 45 "../std/h/stddef.h" 3


# 8 "../std/h/stdlib.h" 2 3


double	atof (const char *s) ;
int	atoi (const char *s) ;
long	atol (const char *s) ;
double	strtod (const char *s, char **) ;
long	strtol (const char *s, char **, int base) ;
unsigned long	strtoul (const char *s, char **, int base) ;
int	rand (void) ;
void	srand (unsigned int seed) ;
void   *malloc (size_t size) ;
void   *realloc (void *ptr, size_t size) ;
void   *calloc (size_t n, size_t size) ;
void	free (void *ptr) ;
void	abort (void) ;
int	atexit (void (*func)(void)) ;
void	exit (int status) ;
char   *getenv (const char *name) ;
int	system (const char *cmd) ;
void   *bsearch (const void *key, const void *base, size_t n, size_t size,
		       int (*compar)(const void *, const void *)) ;
void   *qsort (const void *base, size_t n, size_t size,
		     int (*compar)(const void *, const void *)) ;




# 45 "stdh.h" 2

# 1 "../std/h/string.h" 1 3
 
 




# 1 "../std/h/stddef.h" 1 3
 

 









# 45 "../std/h/stddef.h" 3


# 7 "../std/h/string.h" 2 3







void   *memmove (void *s1, const void *s2, size_t) ;
void   *memchr (const void *s, int c, size_t) ;
void   *memset (void *s, int c, size_t) ;
char   *strcpy (char *s1, const char *s2) ;
char   *strncpy (char *s1, const char *s2, size_t) ;
char   *strcat (char *s1, const char *s2) ;
char   *strncat (char *s1, const char *s2, size_t) ;
int	strcmp (const char *s1, const char *s2) ;
int	strncmp (const char *s1, const char *s2, size_t) ;
char   *strchr (const char *s1, int c) ;
char   *strrchr (const char *s1, int c) ;
size_t	strspn (const char *s1, const char *s2) ;
size_t	strcspn (const char *s1, const char *s2) ;
char   *strpbrk (const char *s1, const char *s2) ;
char   *strstr (const char *s1, const char *s2) ;
char   *strtok (char *s1, const char *s2) ;
char   *strerror (int errno) ;



# 46 "stdh.h" 2

# 1 "../std/h/sys/types.h" 1 3
 
 

# 1 "../std/h/stddef.h" 1 3
 

 









# 45 "../std/h/stddef.h" 3


# 4 "../std/h/sys/types.h" 2 3

# 1 "../std/h/time.h" 1 3
 
 




# 1 "../std/h/stddef.h" 1 3
 

 









# 45 "../std/h/stddef.h" 3


# 7 "../std/h/time.h" 2 3




typedef long time_t;

typedef long clock_t;		 














struct tm {
	int	tm_sec, tm_min, tm_hour;
	int	tm_mday, tm_mon, tm_year, tm_wday, tm_yday;
	int	tm_isdst;
	long	tm_gmtoff;	 
	char   *tm_zone;	 
};

clock_t	clock (void) ;
time_t	time (time_t *tp) ;

time_t	mktime (struct tm *tmp) ;
char   *asctime (const struct tm *tmp) ;
char   *ctime (const time_t *tp) ;
struct tm *gmtime (const time_t *tp) ;
struct tm *localtime (const time_t *tp) ;
size_t	strftime (char *buf, size_t len, const char *fmt, const struct tm *tmp) ;



# 5 "../std/h/sys/types.h" 2 3


 



# 1 "/./usr/include/sys/types.h" 1
 

 



























 















































# 1 "/usr/princeton/lib/gnu/gcc-lib/decstation-ultrix4.2/2.2.1/include/ansi_compat.h" 1 3
 



 





















 

















# 116 "/usr/princeton/lib/gnu/gcc-lib/decstation-ultrix4.2/2.2.1/include/ansi_compat.h" 3

# 79 "/./usr/include/sys/types.h" 2




 



 


 


 


typedef	unsigned char	u_char;
typedef	unsigned short	u_short;
typedef	unsigned int	u_int;
typedef	unsigned int	uint;		 
typedef	unsigned long	u_long;
typedef	unsigned short	ushort;		 

typedef	volatile char		v_char;
typedef	volatile short		v_short;
typedef	volatile long		v_long;
typedef	volatile unsigned char	vu_char;
typedef	volatile unsigned short	vu_short;
typedef	volatile unsigned long	vu_long;

typedef

	signed

		char	s_char;









typedef	struct	_physadr { int r[1]; } *physadr;
 



typedef	struct	label_t	{
	int	val[12];
} label_t;


typedef	struct	_quad { long val[2]; } quad;
typedef	long	daddr_t;
typedef	char *	caddr_t;
typedef u_long	gno_t;
typedef short	cnt_t;			 
typedef	long	swblk_t;
typedef long	paddr_t;		 
typedef	long	audit_ID_t;


typedef	short	dev_t;
typedef short	gid_t;			 
typedef	unsigned long	ino_t;
typedef unsigned short	mode_t;		 
typedef short	nlink_t;		 
typedef	int	off_t;


typedef int	pid_t;			 

typedef short	uid_t;			 


typedef int	_time_t ;









typedef int	_clock_t ;			 

typedef long	key_t;			 




 











 









 

typedef long	fd_mask;






typedef	struct fd_set {
	fd_mask	fds_bits[(((4096	 )+(( (sizeof(fd_mask) * 8		)	)-1))/( (sizeof(fd_mask) * 8		)	)) ];
} fd_set;








# 11 "../std/h/sys/types.h" 2 3





# 47 "stdh.h" 2

# 80 "stdh.h"

  





# 9 "expr.c" 2

# 1 "/usr/include/errno.h" 1 3
 

 


























 























 




































 



 



 

	 













	 













	 



 




 




 



 




 


 



 




 
















 


extern int errno;

# 10 "expr.c" 2

# 1 "/usr/include/setjmp.h" 1 3
 
# 1 "/usr/princeton/lib/gnu/gcc-lib/decstation-ultrix4.2/2.2.1/include/ansi_compat.h" 1 3
 



 





















 

















# 116 "/usr/princeton/lib/gnu/gcc-lib/decstation-ultrix4.2/2.2.1/include/ansi_compat.h" 3

# 2 "/usr/include/setjmp.h" 2 3



# 47 "/usr/include/setjmp.h" 3


 





















































































 






 








 






 




typedef	int	jmp_buf[(34+1+48) ];

typedef int sigjmp_buf[(34+1+48) ];








 




extern void	longjmp( jmp_buf __env, int __val );
extern int	setjmp( jmp_buf __env );
extern int	sigsetjmp(sigjmp_buf __env, int __savemask);
extern void 	siglongjmp(const sigjmp_buf __env, int __val);











# 11 "expr.c" 2

# 1 "sh.h" 1
 



 

# 1 "config.h" 1
 








 








# 1 "/usr/include/signal.h" 1 3
 

 


























 











































# 1 "/usr/princeton/lib/gnu/gcc-lib/decstation-ultrix4.2/2.2.1/include/ansi_compat.h" 1 3
 



 





















 

















# 116 "/usr/princeton/lib/gnu/gcc-lib/decstation-ultrix4.2/2.2.1/include/ansi_compat.h" 3

# 74 "/usr/include/signal.h" 2 3


















					 
 



















 







































 







 


















 

typedef long	sig_atomic_t;
typedef int sigset_t;	 


 


struct	sigvec {
	void	 (*sv_handler)();	 
	sigset_t sv_mask;		 
	int	sv_flags;		 
};


 



struct	sigaction {
	void	 (*sa_handler)();	 
	sigset_t sa_mask;		 
	int	 sa_flags;		 
};














 







 


struct	sigstack {
	char	*ss_sp;			 
	int	ss_onstack;		 
};

 















struct	sigcontext {

	 




	int	sc_onstack;		 
	int	sc_mask;		 






	int	sc_pc;			 
	 


	int	sc_regs[32];	 
	int	sc_mdlo;	 
	int	sc_mdhi;	 
	 


	int	sc_ownedfp;	 
	int	sc_fpregs[32];	 
	int	sc_fpc_csr;	 
	int	sc_fpc_eir;	 
	 



	 


	int	sc_cause;	 
	int	sc_badvaddr;	 
	int	sc_badpaddr;	 

};























 



extern void	(*signal(int __sig, void(*__func)(int)))(int);
int	raise( int __sig );
int 	kill( pid_t __pid, int __sig );
int 	sigemptyset( sigset_t *__set );
int 	sigfillset( sigset_t *__set );
int 	sigaddset( sigset_t *__set, int __signo );
int	sigdelset( sigset_t *__set, int __signo );
int	sigismember( const sigset_t *__set, int __signo );
int 	sigaction( int __sig, const struct sigaction *__act,
		struct sigaction *__oact );
int 	sigprocmask( int __how, const sigset_t *__set, sigset_t *__oset );
int	sigpending( sigset_t *__set );
int	sigsuspend( const sigset_t *__sigmask );











 









# 19 "config.h" 2



 











 




 
 
 





 

 
 


# 7 "sh.h" 2


 








 






















typedef int bool_t;









 








extern 	int	kshpid;		 
extern 	int	exstat;		 
extern 	int	async;		 
extern 	volatile int sigchld_caught;	 


 



typedef struct Area {
	struct Block *free;	 
} Area;

extern	Area	aperm;		 



 


extern 	struct	env {
	int	type;			 
	Area	area;			 
	struct	block *loc;		 
	short  *savefd;			 
	struct	env *oenv;		 
	jmp_buf	jbuf;			 
	int	interactive;		 
	struct temp *temps;		 
} e;








 

 























extern 	char flag [32 ];
int	option (const char *name)	;
char   *getoptions (void)	;
void	printoptions (void)	;

extern	char	null [];	 

 


char * substitute (char const *, int)	;
char   *search();
struct tbl *findcom();
char   *strsave (char *, Area *)	;
char   *ulton (unsigned long n, int base)	;
int	xstrcmp();
void	qsortp (void **base, size_t n, int (*compare)(void *, void *))	;
long	evaluate (const char *expr)	;
void	resetopts();
void	histsave();
void	histlist();

void	j_init (void)	;
void	j_exit (void)	;
void	j_notify (void)	;
void	j_kill (int job, int sig)	;

void	j_change (void)	;
int	j_resume (int job, int bg)	;


 


void	leave();	 

 


typedef	void (*handler_t)();	 

 
struct	temp {
	struct	temp * next;
	char   *name;
};
struct temp *maketemp (Area *ap)	;

 




extern	FILE *	shf [10		];	 

void	fopenshf();
void	flushshf();








int	shellf (const char *fmt, ...)	;  
int	errorf (const char *fmt, ...)	;  

 


extern	int ttyfd;		 

int	savefd (int fd)	;	 
void	restfd (int fd, int ofd)	;
void	openpipe (int [2])	;
void	closepipe (int [2])	;

 


typedef struct trap {
	int	signal;		 
	char   *name;		 
	char   *mess;		 
	char   *trap;		 
	int	volatile set;	 
	int	ourtrap;	 
	int	sig_dfl;	 
} Trap;


















extern  struct sigaction Sigact, Sigact_dfl, Sigact_ign, Sigact_trap;


extern 	int volatile trap;	 
extern	Trap	sigtraps[32  ];
Trap    *gettrap (char *)	;  
void	trapsig (int sig)	;  

 









extern	char ctypes [];









# 1 "table.h" 1
 

 



struct table {
	Area   *areap;		 
	int	size, free;	 
	struct	tbl **tbls;	 
};

struct tbl {			 
	int	flag;		 
	int	type;		 
	union {
		char *s;	 
		long i;		 
		int (*f) (char**)	;  
		struct op *t;	 
	} val;			 
	char	name[4];	 
};

 












 







void tinit (struct table *, Area *)	;  
unsigned int hash();		 
struct tbl *tsearch();		 
struct tbl *tenter();		 
void tdelete();			 
void twalk();			 
struct tbl *tnext();		 
struct tbl **tsort();		 

 


struct block {
	Area	area;		 
	int	argc;		 
	char **	argv;		 
	struct	table vars;	 
	struct	table funs;	 

	char *	error;		 
	char *	exit;		 



	struct	block *next;	 
};

extern 	struct block globals;	 
extern 	struct table commands;	 
extern 	struct table builtins;	 
extern 	struct table lexicals;	 
extern 	struct table homedirs;	 

struct builtin {
	char   *name;
	int  (*func)();
};

 

extern const struct builtin shbuiltins [], kshbuiltins [];

 









extern 	Area   *lastarea;	 
extern 	char   *path;		 
extern 	char   *prompt;		 

void	newblock();
void	popblock();
struct tbl *global( );
struct tbl *local( );
struct tbl *typeset( );
struct tbl *setvar( );
struct tbl *strint( );
long	intval( );
void	setint( );
char   *strval( );
void	setstr( );
void	unset( );
int	import( );
char  **makenv();
int	isassign( );

# 261 "sh.h" 2

# 1 "tree.h" 1
 



 





 


struct op {
	int	type;			 
	char  **args;			 
	char  **vars;			 
	struct ioword	**ioact;	 
	struct op *left, *right; 	 
	char   *str;		 
};

 




















 











 


struct ioword {
	int	unit;	 
	int	flag;	 
	char   *name;	 
};

 











 



 








 







# 116 "tree.h"

# 262 "sh.h" 2

# 1 "lex.h" 1
 



 



typedef struct source Source;
struct source {
	char   *str;		 
	int	type;		 
	union {
		char  **strv;	 
		FILE   *file;	 
		struct tbl *tblp;  
	} u;
	int	line;		 
	char   *file;		 
	int	echo;		 
	Source *next;		 
};

 










Source *pushs (int stype)	; 	 
struct op *compile (Source *s)	;	 

 











extern 	int	multiline;	 

typedef union {
	int	i;
	char   *cp;
	char  **wp;
	struct op *o;
	struct ioword *iop;
} YYSTYPE;

























 









extern 	char	line [256		+1];	 
extern 	Source *source;		 
extern 	YYSTYPE	yylval;		 
extern 	int	yynerrs;
extern 	struct ioword *heres [10		], **herep;
extern 	char	ident [64 +1];

extern	int	yylex (int flags)	;
extern	void	yyerror (const char *msg)	;



extern	char   *history [100		];	 
extern	char  **histptr;	 
extern	int	histpush;	 

extern	char	**histget();
extern  char	**histpos();
extern	int	histnum();
extern	char	*findhist();
extern	int	histN();



extern	void	x_init (void)	;	 
extern	void	x_init_emacs (void)	;
extern	void	x_emacs_keys ();
extern	void	x_bind();

extern	int	x_read (int fd, char *buf, size_t len)	;
extern	int	x_emacs (char *buf, size_t len)	;
extern	int	x_vi (char *buf, size_t len)	;

extern	bool_t	x_mode (bool_t)	;	 
extern	int	x_getc();		 
extern	void	x_flush(), x_putc(), x_puts();  

extern	int	x_cols;		 


# 263 "sh.h" 2

# 1 "proto.h" 1
 












 
Area *	ainit		 (Area *ap)	;
void 	afreeall	 (Area *ap)	;
void *	alloc		 (size_t size, Area *ap)	;
void *	aresize		 (void *ptr, size_t size, Area *ap)	;
void 	afree		 (void *ptr, Area *ap)	;
 
int 	c_hash		 (char **wp)	;
int 	c_cd		 (char **wp)	;
int 	c_print		 (char **wp)	;
int 	c_whence	 (char **wp)	;
int 	c_typeset	 (char **wp)	;
int 	c_alias		 (char **wp)	;
int 	c_unalias	 (char **wp)	;
int 	c_let		 (char **wp)	;
int 	c_jobs		 (char **wp)	;
int 	c_fgbg		 (char **wp)	;
int 	c_kill		 (char **wp)	;
int 	c_bind		 (char **wp)	;
 
int 	c_label		 (char **wp)	;
int 	c_shift		 (char **wp)	;
int 	c_umask		 (char **wp)	;
int 	c_dot		 (char **wp)	;
int 	c_wait		 (char **wp)	;
int 	c_read		 (char **wp)	;
int 	c_eval		 (char **wp)	;
int 	c_trap		 (char **wp)	;
void 	setsig		 (struct trap *p, void (*f)())	;
int 	c_return	 (char **wp)	;
int 	c_brkcont	 (char **wp)	;
int 	c_exit		 (char **wp)	;
int 	c_set		 (char **wp)	;
int 	c_unset		 (char **wp)	;
int 	c_ulimit	 (char **wp)	;
int 	c_times		 (char **wp)	;
int 	timex		 (struct op *t, int f)	;
int 	c_exec		 (char **wp)	;
int 	c_builtin	 (char **wp)	;
 
int 	c_test		 (char **wp)	;
int 	oexpr		 (int n)	;
int 	aexpr		 (int n)	;
int 	nexpr		 (int n)	;
int 	primary		 (int n)	;
int 	filstat		 (char *nm, int mode)	;
int 	t_lex		 (char *s)	;
int 	newerf		 (char *f1, char *f2)	;
int 	olderf		 (char *f1, char *f2)	;
int 	equalf		 (char *f1, char *f2)	;
 
int 	do_ulimit	 (char *a1, char *a2)	;
 
int 	x_read		 (int fd, char *buf, size_t len)	;
int 	x_getc		 (void)	;
void 	x_flush		 (void)	;
void 	x_adjust	 (void)	;
void 	x_putc		 (int c)	;
void 	x_puts		 (char *s)	;
void 	x_init		 (void)	;
bool_t 	x_mode		 (bool_t onoff)	;
int 	promptlen	 (char *cp)	;
int 	init_editmode	 (void)	;
 
int 	x_emacs		 (char *buf, size_t len)	;
void 	x_redraw	 (int limit)	;
void 	x_bind		 (char *a1, char *a2, int macro)	;
void 	x_init_emacs	 (void)	;
void 	x_emacs_keys	 (int erase, int kill, int werase, int intr, int quit)	;
char *	x_lastcp	 (void)	;
 
char *	substitute	 (char const *cp, int f)	;
char **	eval		 (char **ap, int f)	;
char *	evalstr		 (char *cp, int f)	;
 
int 	execute		 (struct op *t, volatile int flags)	;
int 	shcomexec	 (char **wp)	;
int 	define		 (char *name, struct op *t)	;
int 	builtin		 (char *name, int (*func)())	;
struct tbl *	findcom	 (char *name, int insert)	;
int 	flushcom	 (int all)	;
char *	search		 (char *name, char *path, int mode)	;
 
void 	evalerr		 (char *err)	;
long 	evaluate	 (const char *expr)	;
 
void 	resetopts	 (void)	;
int 	c_getopts	 (char **wp)	;
 
int 	c_fc	 	 (register char **wp)	;
void 	histbackup	 (void)	;
void 	histsave	 (char *cmd)	;
char **	histget	 	 (char *str)	;
char *	histrpl	 	 (char *s, char *pat, char *rep, int global)	;
void 	hist_init	 (Source *s)	;
void 	hist_finish	 (void)	;
char **	histpos	 	 (void)	;
int 	histN	 	 (void)	;
int 	histnum	 	 (int n)	;
char *	findhist	 (int start, int fwd, char *str)	;
 
int 	errorf		 (const char *fmt, ...)	;
int 	shellf		 (const char *fmt, ...)	;
void 	fopenshf	 (int fd)	;
void 	flushshf	 (int fd)	;
int 	savefd		 (int fd)	;
void 	restfd		 (int fd, int ofd)	;
void 	openpipe	 (int *pv)	;
void 	closepipe	 (int *pv)	;
struct temp *	maketemp (Area *ap)	;
 
void 	j_init		 (void)	;
void 	j_exit		 (void)	;
void 	j_change	 (void)	;
int 	exchild		 (struct op *t, int flags)	;
int 	waitlast	 (void)	;
int 	j_reapchld	 (void)	;
int 	j_reap		 (void)	;
int 	waitfor		 (int job)	;
void 	j_kill		 (int job, int sig)	;
int 	j_resume	 (int job, int bg)	;
void 	j_jobs		 (void)	;
void 	j_notify	 (void)	;
int 	j_lookup	 (char *cp)	;
int 	j_stopped	 (void)	;
 
int 	yylex		 (int cf)	;
int 	gethere		 (void)	;
void 	yyerror		 (const char *msg)	;
Source * pushs		 (int type)	;
int 	pprompt		 (char *cp)	;
 
void 	mcheck		 (void)	;
void 	mbset		 (char *p)	;
void 	mpset		 (char *mptoparse)	;
void 	mprint		 (void)	;
 
int 	main		 (int argc, char **argv, char **envp)	;
int 	include		 (char *name)	;



int 	shell		 (Source *s)	;
void 	leave		 (int rv)	;
int 	error		 (void)	;
int 	unwind		 (void)	;
int 	newenv		 (int type)	;
int 	quitenv		 (void)	;
void 	aerror		 (Area *ap, const char *msg)	;
 
void 	setctypes	 ( char *s, int t)	;
void 	initctypes	 (void)	;
char *	ulton		 (unsigned long n, int base)	;
char *	strsave		 (char *s, Area *ap)	;
int 	option		 (const char *n)	;
char *	getoptions	 (void)	;
void 	printoptions	 (void)	;
int 	getn		 (char *as)	;
char *	strerror	 (int i)	;
int 	gmatch		 (char *s, char *p)	;
void 	qsortp		 (void **base, size_t n, int (*f)())	;
int 	qsort1		 (void **base, void **lim, int (*f)())	;
int 	xstrcmp		 (void *p1, void *p2)	;
void 	cleanpath	 (char *pwd, char *dir, char *clean)	;
 
int 	yyparse		 (void)	;
int 	keywords	 (void)	;
struct op * compile	 (Source *s)	;
 
unsigned int 	hash	 (char *n)	;
void 	tinit		 (struct table *tp, Area *ap)	;
struct tbl *	tsearch	 (struct table *tp, char *n, unsigned int h)	;
struct tbl *	tenter	 (struct table *tp, char *n, unsigned int h)	;
void 	tdelete		 (struct tbl *p)	;
void 	twalk		 (struct table *tp)	;
struct tbl *	tnext	 (void)	;
struct tbl **	tsort	 (struct table *tp)	;
 
 
Trap *	gettrap		 (char *name)	;
void 	trapsig		 (int i)	;
int 	runtraps	 (void)	;
int 	runtrap		 (Trap *p)	;
int 	cleartraps	 (void)	;
int 	ignoresig	 (int i)	;
int 	restoresigs	 (void)	;
 
void 	ptree		 (struct op *t, FILE *f)	;
int 	pioact		 (FILE *f, struct ioword *iop)	;
int 	fptreef		 (FILE *f, char *fmt, ...)	;
int 	snptreef	 (char *s, int n, char *fmt, ...)	;
struct op *	tcopy	 (struct op *t, Area *ap)	;
char *	wdcopy		 (char *wp, Area *ap)	;
char *	wdscan		 (char *wp, int c)	;
void 	tfree		 (struct op *t, Area *ap)	;
 
void 	newblock	 (void)	;
void 	popblock	 (void)	;
struct tbl *	global	 (char *n)	;
struct tbl *	local	 (char *n)	;
char *	strval		 (struct tbl *vp)	;
long 	intval		 (struct tbl *vp)	;
void 	setstr		 (struct tbl *vq, char *s)	;
struct tbl *	strint	 (struct tbl *vq, struct tbl *vp)	;
void 	setint		 (struct tbl *vq, long n)	;
int 	import		 (char *thing)	;
struct tbl *	typeset	 (char *var, int set, int clr)	;
void 	unset		 (struct tbl *vp)	;
int 	isassign	 (char *s)	;
char **	makenv		 (void)	;
 
 
void 	vi_reset	 (char *buf, int len)	;
int 	vi_hook		 (int ch)	;
int 	save_cbuf	 (void)	;
int 	restore_cbuf	 (void)	;
int 	x_vi		 (char *buf, size_t len)	;
int 	getch		 (void)	;
char **	globstr		 (char *stuff)	;


# 264 "sh.h" 2

  
 



# 1 "trace.h" 1
 
























 

















 




# 57 "trace.h"






 

 

 


# 86 "trace.h"

   







 
 




 





# 270 "sh.h" 2





# 12 "expr.c" 2











static const char *expression;	 
static const char *tokp;	 
static int tok;			 
static struct tbl *val;		 

static struct tbl *asn      (void)	;
static struct tbl *e6       (void)	;
static struct tbl *e5       (void)	;
static struct tbl *e3       (void)	;
static struct tbl *e2       (void)	;
static struct tbl *e0       (void)	;
static void     token       (void)	;
static struct tbl *tempvar  (void)	;
static struct tbl *intvar   (struct tbl *vp)	;

 


void
evalerr(err)
	char *err;
{
	errorf("%s: %s\n", expression, err);
}

long
evaluate(expr)
	const char *expr;
{
	struct tbl *v;

	expression = tokp = expr;
	token();
	v = intvar(asn());
	if (!(tok == 0))
		evalerr("bad expression");
	return v->val.i;
}

static struct tbl *
asn()
{
	register struct tbl *vl, *vr;

	vr = vl = e6();
	if ((tok == '=')) {
		Area * olastarea = lastarea;
		token();
		if ((vl->flag&(1<<(8))			))  
			evalerr("bad assignment");
		vr = intvar(asn());
		lastarea = olastarea;
		setint(vl, vr->val.i);
		if ((vl->flag&(1<<(4))			) && vl->type == 0)  
			vl->type = vr->type;
	}
	return vr;
}

static struct tbl *
e6()
{
	register struct tbl *vl, *vr;

	vl = e5();
	while ((tok == 0x03 ) || (tok == 0x04 )) {
		int op = tok;
		token();
		vl = intvar(vl);
		vr = intvar(e5());
		vl->val.i = vl->val.i == vr->val.i;
		if (op == 0x04 )
			vl->val.i = ! vl->val.i;
	}
	return vl;
}

static struct tbl *
e5()
{
	register struct tbl *vl, *vr;

	vl = e3();
	while ((tok == 0x05 ) || (tok == '<') || (tok == '>') || (tok == 0x06 )) {
		int op = tok;
		token();
		vl = intvar(vl);
		vr = intvar(e3());
		if (op == 0x05 )
			vl->val.i = vl->val.i <= vr->val.i;
		else if		 (op == '<')
			vl->val.i = vl->val.i < vr->val.i;
		else if		 (op == 0x06 )
			vl->val.i = vl->val.i >= vr->val.i;
		else if		 (op == '>')
			vl->val.i = vl->val.i > vr->val.i;
	}
	return vl;
}

static struct tbl *
e3()
{
	register struct tbl *vl, *vr;

	vl = e2();
	while ((tok == '+') || (tok == '-')) {
		int op = tok;
		token();
		vl = intvar(vl);
		vr = intvar(e2());
		if (op == '+')
			vl->val.i += vr->val.i;
		else if		 (op == '-')
			vl->val.i -= vr->val.i;
	}
	return vl;
}

static struct tbl *
e2()
{
	register struct tbl *vl, *vr;

	vl = e0();
	while ((tok == '*') || (tok == '/') || (tok == '%')) {
		int op = tok;
		token();
		vl = intvar(vl);
		vr = intvar(e0());
		if (op != '*' && vr->val.i == 0)
			evalerr("zero divisor");
		if (op == '*')
			vl->val.i *= vr->val.i;
		else if		 (op == '/')
			vl->val.i /= vr->val.i;
		else if		 (op == '%')
			vl->val.i %= vr->val.i;
	}
	return vl;
}

static struct tbl *
e0()
{
	register struct tbl *v;

	if ((tok == '!') || (tok == '-')) {
		int op = tok;
		token();
		v = intvar(e0());
		if (op == '!')
			v->val.i = !v->val.i;
		else if		 (op == '-')
			v->val.i = -v->val.i;
	} else
	if ((tok == '(')) {
		token();
		v = asn();
		if (!(tok == ')'))
			evalerr("missing )");
		token();
	} else
	if ((tok == 0x01 ) || (tok == 0x02 )) {
		v = val;
		token();
	} else
		evalerr("bad expression");
	return v;
}

static void
token()
{
	register char *cp = (char *) tokp;
	register int c, c2;

	 
	do c = *cp++;	while (c != '\0' && (c == ' ' || c == '\t'));
	tokp = cp-1;

	if (!!(ctypes[(unsigned char)(c)]&( 0x01		))  ) {
		for (; !!(ctypes[(unsigned char)(c)]&( 0x01		|0x02		))  ; c = *cp++)
			;
		c = *--cp;
		*cp = 0;
		val = global(tokp);
		*cp = c;
		tok = 0x01 ;
	} else
	if (!!(ctypes[(unsigned char)(c)]&( 0x02		))  ) {
		for (; !!(ctypes[(unsigned char)(c)]&( 0x01		|0x02		))   || c == '#'; c = *cp++)
			;
		c = *--cp;
		*cp = 0;
		val = tempvar();
		setstr(val, tokp);
		val->flag |= (1<<(8))			;
		*cp = c;
		tok = 0x02 ;
	} else {
		c2 = *cp++;
		if (c == '=' && c2 == '=')
			c = 0x03 ;
		else if		 (c == '!' && c2 == '=')
			c = 0x04 ;
		else if		 (c == '<' && c2 == '=')
				c = 0x05 ;
		else if		 (c == '>' && c2 == '=')
				c = 0x06 ;
		else
			cp--;
		tok = c;
	}
	tokp = cp;
}

static struct tbl *
tempvar()
{
	register struct tbl *vp;

	vp = (struct tbl*) alloc(sizeof(struct tbl), &e.area );
	lastarea = &e.area ;
	vp->flag = (1<<(2))			|(1<<(4))			;
	vp->type = 0;
	vp->name[0] = '\0';
	return vp;
}

 
static struct tbl *
intvar(vp)
	register struct tbl *vp;
{
	register struct tbl *vq;

	vq = tempvar();
	vq->type = 10;
	if (strint(vq, vp) == 0 ) {
		if ((vp->flag&(1<<(2))			) && vp->val.s && *(vp->val.s)) {
			evalerr("bad number");
		} else {
			vq->flag |= ((1<<(2))			|(1<<(4))			);
			vq->type = 10;
			vq->val.i = 0;
		}
	}
	return vq;
}




 =====   ======= =======	Larry Rogers
=     =     =       =     	Manager, UNIX Systems
=           =       =     	Princeton University
=           =       =     	87 Prospect Street, Room 201
=           =       =     	Princeton, NJ 08544
=           =       =     	lrr@Princeton.EDU, princeton!lrr
=     =     =       =     	Phone: 609-258-6483/6000
 =====   =======    =     	FAX:   609-258-1069/3943

Newsgroups: gnu.gcc.bug