# regression tests for the iffe command

TEST 01 'command line basics'

	EXEC	-r -v - hdr stdio
		OUTPUT - $'/* : : generated by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _hdr_stdio	1	/* #include <stdio.h> ok */
#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is stdio.h a header ... yes'

	EXEC	-r -v -s bsh - hdr stdio

	EXEC	-r -v - hdr stdio,limits
		OUTPUT - $'/* : : generated by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _hdr_stdio	1	/* #include <stdio.h> ok */
#define _hdr_limits	1	/* #include <limits.h> ok */
#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is stdio.h a header ... yes
iffe: test: is limits.h a header ... yes'

	EXEC	-r -v -s bsh - hdr stdio,limits

	EXEC	-r -v - hdr,lib no_foo_bar,no_bar_foo stdio.h
		OUTPUT - $'/* : : generated by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _hdr_stdio	1	/* #include <stdio.h> ok */
#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is stdio.h a header ... yes
iffe: test: is no_foo_bar.h a header ... no
iffe: test: is no_bar_foo.h a header ... no
iffe: test: is no_foo_bar a library function ... no
iffe: test: is no_bar_foo a library function ... no'

	EXEC	-r -v -s bsh - hdr,lib no_foo_bar,no_bar_foo stdio.h

	EXEC	-r -v - hdr no_foo_bar,no_bar_foo stdio.h : lib no_foo_bar,no_bar_foo stdio.h

	EXEC	-r -v -s bsh - hdr no_foo_bar,no_bar_foo stdio.h : lib no_foo_bar,no_bar_foo stdio.h

TEST 02 'file input basics'

	EXEC	-r -v - t1.iffe
		INPUT t1.iffe $'hdr stdio'
		OUTPUT - $'/* : : generated from t1.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _hdr_stdio	1	/* #include <stdio.h> ok */
#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is stdio.h a header ... yes'

	EXEC	-r -v -s bsh - t1.iffe

	EXEC	-r -v - t2.iffe
		INPUT t2.iffe $'hdr stdio,limits'
		OUTPUT - $'/* : : generated from t2.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _hdr_stdio	1	/* #include <stdio.h> ok */
#define _hdr_limits	1	/* #include <limits.h> ok */
#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is stdio.h a header ... yes
iffe: test: is limits.h a header ... yes'

	EXEC	-r -v -s bsh - t2.iffe

	EXEC	-r -v - t3.iffe
		INPUT t3.iffe $'hdr,lib no_foo_bar,no_bar_foo stdio.h'
		OUTPUT - $'/* : : generated from t3.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _hdr_stdio	1	/* #include <stdio.h> ok */
#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is stdio.h a header ... yes
iffe: test: is no_foo_bar.h a header ... no
iffe: test: is no_bar_foo.h a header ... no
iffe: test: is no_foo_bar a library function ... no
iffe: test: is no_bar_foo a library function ... no'

	EXEC	-r -v -s bsh - t3.iffe

	EXEC	-r -v - t3.iffe
		INPUT t3.iffe $'hdr no_foo_bar,no_bar_foo stdio.h
lib no_foo_bar,no_bar_foo stdio.h'

	EXEC	-r -v -s bsh - t3.iffe

TEST 03 'nested if'

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff ifelse
if hdr stdio
	if lib open {
		HIT 1
	}
	elif lib close {
		HIT 2
	}
	else {
		HIT 3
	}
	endif
elif hdr limits {
	HIT 4
}
else {
	HIT 5
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _ifelse_H
#define _ifelse_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _hdr_stdio	1	/* #include <stdio.h> ok */
#define _lib_open	1	/* open() in default lib(s) */
	HIT 1

#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is stdio.h a header ... yes
iffe: test: is open a library function ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff ifelse
if hdr _XXX_stdio
	if lib open {
		HIT 1
	}
	elif lib close {
		HIT 2
	}
	else {
		HIT 3
	}
	endif
elif hdr limits {
	HIT 4
}
else {
	HIT 5
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _ifelse_H
#define _ifelse_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _hdr_limits	1	/* #include <limits.h> ok */
HIT 4

#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is _XXX_stdio.h a header ... no
iffe: test: is limits.h a header ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff ifelse
if hdr _XXX_stdio
	if lib open {
		HIT 1
	}
	elif lib close {
		HIT 2
	}
	else {
		HIT 3
	}
	endif
elif hdr _XXX_limits {
	HIT 4
}
else {
	HIT 5
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _ifelse_H
#define _ifelse_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
HIT 5

#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is _XXX_stdio.h a header ... no
iffe: test: is _XXX_limits.h a header ... no'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff ifelse
if hdr stdio
	if lib _XXX_open {
		HIT 1
	}
	elif lib close {
		HIT 2
	}
	else {
		HIT 3
	}
	endif
elif hdr limits {
	HIT 4
}
else {
	HIT 5
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _ifelse_H
#define _ifelse_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _hdr_stdio	1	/* #include <stdio.h> ok */
#define _lib_close	1	/* close() in default lib(s) */
	HIT 2

#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is stdio.h a header ... yes
iffe: test: is _XXX_open a library function ... no
iffe: test: is close a library function ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff ifelse
if hdr stdio
	if lib _XXX_open {
		HIT 1
	}
	elif lib _XXX_close {
		HIT 2
	}
	else {
		HIT 3
	}
	endif
elif hdr limits {
	HIT 4
}
else {
	HIT 5
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _ifelse_H
#define _ifelse_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _hdr_stdio	1	/* #include <stdio.h> ok */
	HIT 3

#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is stdio.h a header ... yes
iffe: test: is _XXX_open a library function ... no
iffe: test: is _XXX_close a library function ... no'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff ifelse
if mem stat.st_atime sys/types.h sys/stat.h {
	#define ATIME	1
}
elif mem stat.st_ctime sys/types.h sys/stat.h {
	#define CTIME	1
}
elif mem stat.st_mtime sys/types.h sys/stat.h {
	#define MTIME	1
}
else pass{ no_stat_time=1 }end {
	#define NOTIME	1
}
endif
if ( !no_stat_time ) {
	#define YESTIME	1
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _ifelse_H
#define _ifelse_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _sys_stat	1	/* #include <sys/stat.h> ok */
#define _mem_st_atime_stat	1	/* st_atime is a member of struct stat */
#define ATIME	1

#define YESTIME	1

#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is sys/stat.h a header ... yes
iffe: test: is stat a type or typedef ... no
iffe: test: is st_atime a member of struct stat ... yes
iffe: test: is ( !no_stat_time ) true ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff ifelse
if mem foo_stat.st_atime sys/types.h sys/stat.h {
	#define ATIME	1
}
elif mem stat.st_ctime sys/types.h sys/stat.h {
	#define CTIME	1
}
elif mem stat.st_mtime sys/types.h sys/stat.h {
	#define MTIME	1
}
else pass{ no_stat_time=1 }end {
	#define NOTIME	1
}
endif
if ( !no_stat_time ) {
	#define YESTIME	1
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _ifelse_H
#define _ifelse_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _sys_stat	1	/* #include <sys/stat.h> ok */
#define _mem_st_ctime_stat	1	/* st_ctime is a member of struct stat */
#define CTIME	1

#define YESTIME	1

#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is sys/stat.h a header ... yes
iffe: test: is foo_stat a type or typedef ... no
iffe: test: is st_atime a member of struct foo_stat ... no
iffe: test: is stat a type or typedef ... no
iffe: test: is st_ctime a member of struct stat ... yes
iffe: test: is ( !no_stat_time ) true ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff ifelse
if mem foo_stat.st_atime sys/types.h sys/stat.h {
	#define ATIME	1
}
elif mem foo_stat.st_ctime sys/types.h sys/stat.h {
	#define CTIME	1
}
elif mem stat.st_mtime sys/types.h sys/stat.h {
	#define MTIME	1
}
else pass{ no_stat_time=1 }end {
	#define NOTIME	1
}
endif
if ( !no_stat_time ) {
	#define YESTIME	1
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _ifelse_H
#define _ifelse_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _sys_stat	1	/* #include <sys/stat.h> ok */
#define _mem_st_mtime_stat	1	/* st_mtime is a member of struct stat */
#define MTIME	1

#define YESTIME	1

#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is sys/stat.h a header ... yes
iffe: test: is foo_stat a type or typedef ... no
iffe: test: is st_atime a member of struct foo_stat ... no
iffe: test: is st_ctime a member of struct foo_stat ... no
iffe: test: is stat a type or typedef ... no
iffe: test: is st_mtime a member of struct stat ... yes
iffe: test: is ( !no_stat_time ) true ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff ifelse
if mem foo_stat.st_atime sys/types.h sys/stat.h {
	#define ATIME	1
}
elif mem foo_stat.st_ctime sys/types.h sys/stat.h {
	#define CTIME	1
}
elif mem foo_stat.st_mtime sys/types.h sys/stat.h {
	#define MTIME	1
}
else pass{ no_stat_time=1 }end {
	#define NOTIME	1
}
endif
if ( !no_stat_time ) {
	#define YESTIME	1
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _ifelse_H
#define _ifelse_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _sys_stat	1	/* #include <sys/stat.h> ok */
#define NOTIME	1

#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is sys/stat.h a header ... yes
iffe: test: is foo_stat a type or typedef ... no
iffe: test: is st_atime a member of struct foo_stat ... no
iffe: test: is st_ctime a member of struct foo_stat ... no
iffe: test: is st_mtime a member of struct foo_stat ... no
iffe: test: is ( !no_stat_time ) true ... no'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'set	explicit
iff	previous
hdr	stdio
if hdr stdio {
	OK
}
else {
	OK
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _previous_H
#define _previous_H	1
#define _hdr_stdio	1	/* #include <stdio.h> ok */
OK

#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is stdio.h a header ... yes'

	EXEC	-r -v -s bsh - t.iffe

TEST 04 'test variable/macro override'

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
HAVE_STDIO = hdr stdio'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _macro_H
#define _macro_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define HAVE_STDIO	1	/* #include <stdio.h> ok */
#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is stdio.h a header ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
if hdr - stdio {
	#define HIT 1
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _macro_H
#define _macro_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define HIT 1

#endif'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
if - hdr stdio {
	#define HIT 1
}
endif'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
if ? hdr stdio {
	#define HIT 1
}
endif'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
if hdr - stdio {
	#define HIT 1
}
endif'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
if HAVE_STDIO = hdr stdio {
	#define HIT 1
}
endif
if ( HAVE_STDIO ) {
	#define TOO ALSO
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _macro_H
#define _macro_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define HAVE_STDIO	1	/* #include <stdio.h> ok */
#define HIT 1

#define TOO ALSO

#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is stdio.h a header ... yes
iffe: test: is ( HAVE_STDIO ) true ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
if HAVE_STDIO = hdr stdio {
	#define HIT 1
}
endif
exp ALSO HAVE_STDIO'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _macro_H
#define _macro_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define HAVE_STDIO	1	/* #include <stdio.h> ok */
#define HIT 1

#define ALSO	1	/* HAVE_STDIO is true */
#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is stdio.h a header ... yes
iffe: test: is HAVE_STDIO true ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
if HAVE_STDIO = hdr stdio {
	#define HIT 1
}
endif
ALSO = ( HAVE_STDIO )'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _macro_H
#define _macro_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define HAVE_STDIO	1	/* #include <stdio.h> ok */
#define HIT 1

#define ALSO	1	/* ( HAVE_STDIO ) is true */
#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is stdio.h a header ... yes
iffe: test: is ( HAVE_STDIO ) true ... yes'

	EXEC	-r -v -s bsh - t.iffe

TEST 05 'test code option sequence'

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
tst seq - -DA=1 - -DB=1 note{ long int type }end compile{
	#if A == 1 && B == 0
	#define t		long
	#else
	#define t		error
	#endif
	t n = 0;
}end'
		OUTPUT - '/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _macro_H
#define _macro_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _seq	1	/* long int type */
#endif'
		ERROR - 'iffe: test: is sys/types.h a header ... yes
iffe: test: long int type ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
tst seq -DG=1 - -DN=1 - -DN=2 note{ long int type }end compile{
	#if G == 1 && N == 1
	#define t		long
	#else
	#define t		error
	#endif
	t n = 0;
}end'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
tst seq - -DA=1 - -DB=1 note{ long int type }end compile{
	#if A == 0 && B == 1
	#define t		long
	#else
	#define t		error
	#endif
	t n = 0;
}end'
		ERROR - 'iffe: test: is sys/types.h a header ... yes
iffe: test: long int type ... 
iffe: test: long int type ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
tst seq -DG=1 - -DN=1 - -DN=2 note{ long int type }end compile{
	#if G == 1 && N == 2
	#define t		long
	#else
	#define t		error
	#endif
	t n = 0;
}end'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
tst seq - -DA=1 - -DB=1 note{ long int type }end compile{
	#if A == 0 && B == 0
	#define t		long
	#else
	#define t		error
	#endif
	t n = 0;
}end'
		OUTPUT - '/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _macro_H
#define _macro_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#endif'
		ERROR - 'iffe: test: is sys/types.h a header ... yes
iffe: test: long int type ... 
iffe: test: long int type ... no'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
tst seq -DG=1 - -DN=1 - -DN=2 note{ long int type }end compile{
	#if G == 1 && N == 0
	#define t		long
	#else
	#define t		error
	#endif
	t n = 0;
}end'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
if tst - -DA=1 - -DB=1 note{ long int type }end compile{
	#if A == 1 && B == 0
	#define t		long
	#else
	#define t		error
	#endif
	t n = 0;
}end {
	#define seq 1
}
endif'
		OUTPUT - '/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _macro_H
#define _macro_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
/* long int type */
#define seq 1

#endif'
		ERROR - 'iffe: test: is sys/types.h a header ... yes
iffe: test: long int type ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
if tst -DG=1 - -DN=1 - -DN=2 note{ long int type }end compile{
	#if G == 1 && N == 1
	#define t		long
	#else
	#define t		error
	#endif
	t n = 0;
}end {
	#define seq 1
}
endif'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
if tst - -DA=1 - -DB=1 note{ long int type }end compile{
	#if A == 0 && B == 1
	#define t		long
	#else
	#define t		error
	#endif
	t n = 0;
}end {
	#define seq 1
}
endif'
		ERROR - 'iffe: test: is sys/types.h a header ... yes
iffe: test: long int type ... 
iffe: test: long int type ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
if tst -DG=1 - -DN=1 - -DN=2 note{ long int type }end compile{
	#if G == 1 && N == 2
	#define t		long
	#else
	#define t		error
	#endif
	t n = 0;
}end {
	#define seq 1
}
endif'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
if tst - -DA=1 - -DB=1 note{ long int type }end compile{
	#if A == 0 && B == 0
	#define t		long
	#else
	#define t		error
	#endif
	t n = 0;
}end {
	#define seq 1
}
endif'
		OUTPUT - '/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _macro_H
#define _macro_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#endif'
		ERROR - 'iffe: test: is sys/types.h a header ... yes
iffe: test: long int type ... 
iffe: test: long int type ... no'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
if tst -DG=1 - -DN=1 - -DN=2 note{ long int type }end compile{
	#if G == 1 && N == 0
	#define t		long
	#else
	#define t		error
	#endif
	t n = 0;
}end {
	#define seq 1
}
endif'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
if tst - -DN=1 - -DN=2 - -DN=3 note{ long int type }end compile{
	#if N == 1
	#define t		long
	#else
	#define t		error
	#endif
	t n = 0;
}end {
	#define seq 1
}
endif'
		OUTPUT - '/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _macro_H
#define _macro_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
/* long int type */
#define seq 1

#endif'
		ERROR - 'iffe: test: is sys/types.h a header ... yes
iffe: test: long int type ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
if tst - -DN=1 - -DN=2 - -DN=3 note{ long int type }end compile{
	#if N == 2
	#define t		long
	#else
	#define t		error
	#endif
	t n = 0;
}end {
	#define seq 1
}
endif'
		ERROR - 'iffe: test: is sys/types.h a header ... yes
iffe: test: long int type ... 
iffe: test: long int type ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
if tst - -DN=1 - -DN=2 - -DN=3 note{ long int type }end compile{
	#if N == 3
	#define t		long
	#else
	#define t		error
	#endif
	t n = 0;
}end {
	#define seq 1
}
endif'
		ERROR - 'iffe: test: is sys/types.h a header ... yes
iffe: test: long int type ... 
iffe: test: long int type ... 
iffe: test: long int type ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff macro
if tst - -DN=1 - -DN=2 - -DN=3 note{ long int type }end compile{
	#if N == 0
	#define t		long
	#else
	#define t		error
	#endif
	t n = 0;
}end {
	#define seq 1
}
endif'
		OUTPUT - '/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _macro_H
#define _macro_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#endif'
		ERROR - 'iffe: test: is sys/types.h a header ... yes
iffe: test: long int type ... 
iffe: test: long int type ... 
iffe: test: long int type ... no'

	EXEC	-r -v -s bsh - t.iffe

TEST 06 'block side effects'

	EXEC	-r - t.iffe
		INPUT t.iffe $'iff -
tst	output{
	int
	main()
	{
		printf("HIT\\n");
		return 0;
	}
}end'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#define _sys_types	1	/* #include <sys/types.h> ok */
HIT'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'iff
tst	- output{
	int
	main()
	{
		printf("HIT\\n");
		return 0;
	}
}end'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'iff
tst	- output{
	int
	main()
	{
		printf("HIT\\n");
		return 1;
	}
}end'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#define _sys_types	1	/* #include <sys/types.h> ok */'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'iff
tst	- nooutput{
	int
	main()
	{
		printf("HIT\\n");
		return 1;
	}
}end'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#define _sys_types	1	/* #include <sys/types.h> ok */
HIT'

	EXEC	-r -s bsh - t.iffe

TEST 07 'diagnostics'

	EXEC	-r - t.iffe
		INPUT t.iffe $'tst foo'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#endif'
		ERROR - $'iffe: t.iffe:1: tst: unknown feature test'
		EXIT 1

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'if (1)'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */'
		ERROR - $'iffe: t.iffe:1: missing endif'
		EXIT 1

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'if'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */'
		ERROR - $'iffe: t.iffe:1: missing endif'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'endif'
		ERROR - $'iffe: t.iffe:1: endif: no matching if'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'if {
}end'
		ERROR - $'iffe: t.iffe:2: missing }'

	EXEC	-r -s bsh - t.iffe

TEST 08 'negation consternation'

	EXEC	-r - t.iffe
		INPUT t.iffe $'npt fopen,fooon stdio.h'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _hdr_stdlib	1	/* #include <stdlib.h> ok */
#define _hdr_unistd	1	/* #include <unistd.h> ok */
#define _hdr_stdio	1	/* #include <stdio.h> ok */
#define _npt_fooon	1	/* fooon() needs a prototype */
#endif'

	EXEC	-r -u - t.iffe
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _hdr_stdlib	1	/* #include <stdlib.h> ok */
#define _hdr_unistd	1	/* #include <unistd.h> ok */
#define _hdr_stdio	1	/* #include <stdio.h> ok */
#undef	_npt_fopen		/* fopen() does not need a prototype */
#define _npt_fooon	1	/* fooon() needs a prototype */
#endif'

	EXEC	-r -a - t.iffe
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _hdr_stdlib	1	/* #include <stdlib.h> ok */
#define _hdr_unistd	1	/* #include <unistd.h> ok */
#define _hdr_stdio	1	/* #include <stdio.h> ok */
#define _npt_fopen	0	/* fopen() does not need a prototype */
#define _npt_fooon	1	/* fooon() needs a prototype */
#endif'

	EXEC	-r -C - t.iffe
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define HAVE_SYS_TYPES_H	1	/* #include <sys/types.h> ok */
#define HAVE_STDLIB_H	1	/* #include <stdlib.h> ok */
#define HAVE_UNISTD_H	1	/* #include <unistd.h> ok */
#define HAVE_STDIO_H	1	/* #include <stdio.h> ok */
#define HAVE_FOPEN_DECL	1	/* fopen() does not need a prototype */
#undef	HAVE_FOOON_DECL		/* fooon() needs a prototype */
#endif'

	EXEC	-r - t.iffe
		INPUT t.iffe $'NEED_FOPEN = npt fopen stdio.h
HAVE_FOPEN = ! npt fopen stdio.h
NEED_FOOON = npt fooon stdio.h
HAVE_FOOON = ! npt fooon stdio.h'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _hdr_stdlib	1	/* #include <stdlib.h> ok */
#define _hdr_unistd	1	/* #include <unistd.h> ok */
#define _hdr_stdio	1	/* #include <stdio.h> ok */
#define HAVE_FOPEN	1	/* fopen() does not need a prototype */
#define NEED_FOOON	1	/* fooon() needs a prototype */
#endif'

	EXEC	-r -u - t.iffe
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _hdr_stdlib	1	/* #include <stdlib.h> ok */
#define _hdr_unistd	1	/* #include <unistd.h> ok */
#define _hdr_stdio	1	/* #include <stdio.h> ok */
#undef	NEED_FOPEN		/* fopen() does not need a prototype */
#define HAVE_FOPEN	1	/* fopen() does not need a prototype */
#define NEED_FOOON	1	/* fooon() needs a prototype */
#undef	HAVE_FOOON		/* fooon() needs a prototype */
#endif'

	EXEC	-r -C - t.iffe
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define HAVE_SYS_TYPES_H	1	/* #include <sys/types.h> ok */
#define HAVE_STDLIB_H	1	/* #include <stdlib.h> ok */
#define HAVE_UNISTD_H	1	/* #include <unistd.h> ok */
#define HAVE_STDIO_H	1	/* #include <stdio.h> ok */
#undef	NEED_FOPEN		/* fopen() does not need a prototype */
#define HAVE_FOPEN	1	/* fopen() does not need a prototype */
#define NEED_FOOON	1	/* fooon() needs a prototype */
#undef	HAVE_FOOON		/* fooon() needs a prototype */
#endif'

TEST 09 'exp vs. if'

	EXEC	-r - t.iffe
		INPUT t.iffe $'_tst_false = ( 0 )
_tst_true = ( 1 )
exp	_tst_hit !_tst_false {
	ONE
}
exp	_tst_hit !_tst_hit&_tst_true pass{
cat <<!
	TWO $_tst_false $_tst_true
!
}end
exp	_tst_hit !_tst_hit&_tst_true {
	THREE
}'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _tst_true	1	/* ( 1 ) is true */
#define _tst_hit	1	/* !_tst_false is true */
/* !_tst_false */
ONE

#endif'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'_tst_false = ( 0 )
_tst_true = ( 1 )
exp	_tst_hit !_tst_true {
	ONE
}
exp	_tst_hit !_tst_hit&_tst_true pass{
cat <<!
	TWO $_tst_false $_tst_true
!
}end
exp	_tst_hit !_tst_hit&_tst_true {
	THREE
}'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _tst_true	1	/* ( 1 ) is true */
#define _tst_hit	1	/* !_tst_hit&_tst_true is true */
TWO 0 1
#endif'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'_tst_false = ( 0 )
_tst_true = ( 1 )
exp	_tst_hit !_tst_true {
	ONE
}
exp	_tst_hit !_tst_hit&_tst_false pass{
cat <<!
	TWO $_tst_false $_tst_true
!
}end
exp	_tst_hit !_tst_hit&_tst_true {
	THREE
}'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _tst_true	1	/* ( 1 ) is true */
#define _tst_hit	1	/* !_tst_hit&_tst_true is true */
/* !_tst_hit&_tst_true */
THREE

#endif'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'_tst_false = ( 0 )
_tst_true = ( 1 )
exp	_tst_hit !_tst_true {
	ONE
}
exp	_tst_hit !_tst_hit&_tst_false pass{
cat <<!
	TWO $_tst_false $_tst_true
!
}end
exp	_tst_hit !_tst_hit&_tst_false {
	THREE
}'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _tst_true	1	/* ( 1 ) is true */
#endif'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'_tst_false = ( 0 )
_tst_true = ( 1 )
exp	_tst_hit !_tst_false {
	ONE
}
exp	_tst_hit !_tst_hit&&_tst_true pass{
cat <<!
	TWO $_tst_false $_tst_true
!
}end
exp	_tst_hit !_tst_hit&&_tst_true {
	THREE
}'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _tst_true	1	/* ( 1 ) is true */
#define _tst_hit	1	/* !_tst_false is true */
/* !_tst_false */
ONE

#endif'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'_tst_false = ( 0 )
_tst_true = ( 1 )
exp	_tst_hit !_tst_true {
	ONE
}
exp	_tst_hit !_tst_hit&&_tst_true pass{
cat <<!
	TWO $_tst_false $_tst_true
!
}end
exp	_tst_hit !_tst_hit&&_tst_true {
	THREE
}'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _tst_true	1	/* ( 1 ) is true */
#define _tst_hit	1	/* !_tst_hit&&_tst_true is true */
TWO 0 1
#endif'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'_tst_false = ( 0 )
_tst_true = ( 1 )
exp	_tst_hit !_tst_true {
	ONE
}
exp	_tst_hit !_tst_hit&&_tst_false pass{
cat <<!
	TWO $_tst_false $_tst_true
!
}end
exp	_tst_hit !_tst_hit&&_tst_true {
	THREE
}'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _tst_true	1	/* ( 1 ) is true */
#define _tst_hit	1	/* !_tst_hit&&_tst_true is true */
/* !_tst_hit&&_tst_true */
THREE

#endif'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'_tst_false = ( 0 )
_tst_true = ( 1 )
exp	_tst_hit !_tst_true {
	ONE
}
exp	_tst_hit !_tst_hit&&_tst_false pass{
cat <<!
	TWO $_tst_false $_tst_true
!
}end
exp	_tst_hit !_tst_hit&&_tst_false {
	THREE
}'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _tst_true	1	/* ( 1 ) is true */
#endif'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'_tst_false = ( 0 )
_tst_true = ( 1 )
if ( ! _tst_false ) {
	ONE
}
elif ( _tst_true ) pass{
cat <<!
	TWO
!
}end
else {
	THREE
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _tst_true	1	/* ( 1 ) is true */
ONE

#endif'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'_tst_false = ( 0 )
_tst_true = ( 1 )
if ( ! _tst_true ) {
	ONE
}
elif ( _tst_true ) pass{
cat <<!
	TWO
!
}end
else {
	THREE
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _tst_true	1	/* ( 1 ) is true */
TWO
#endif'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'_tst_false = ( 0 )
_tst_true = ( 1 )
if ( ! _tst_true ) {
	ONE
}
elif ( _tst_false ) pass{
cat <<!
	TWO
!
}end
else {
	THREE
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _tst_true	1	/* ( 1 ) is true */
THREE

#endif'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'_tst_false = ( 0 )
_tst_true = ( 1 )
if ( ! _tst_true ) yes{
	typedef struct
	{
		int		dd_fd;		/* file descriptor		*/
	} DIR;
}end
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _tst_true	1	/* ( 1 ) is true */
#endif'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'_tst_false = ( 0 )
_tst_true = ( 1 )
if ( ! _tst_true ) {
	typedef struct
	{
		int		dd_fd;		/* file descriptor		*/
	} DIR;
}
else {
	OK
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _tst_true	1	/* ( 1 ) is true */
OK

#endif'

	EXEC	-r -s bsh - t.iffe

	EXEC	-r - t.iffe
		INPUT t.iffe $'_tst_false = ( 0 )
_tst_true = ( 1 )
if ( ! _tst_true ) {
	typedef struct
	{
		int		dd_fd;		/* file descriptor		*/
	};
}
else {
	OK
}
endif'

	EXEC	-r -s bsh - t.iffe

TEST 10 'exp details'

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'_str = "string"
_hdr = <header>
_aaa = ( 0 )
_zzz = ( 1 )
( _str )
( ! _str )
( _hdr )
( ! _hdr )
( _aaa )
( ! _aaa )
( _zzz )
( ! _zzz )'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _str	"string"
#define _hdr	<header>
#define _zzz	1	/* ( 1 ) is true */
#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is ( 0 ) true ... no
iffe: test: is ( 1 ) true ... yes
iffe: test: is ( _str ) true ... yes
iffe: test: is ( ! _str ) true ... no
iffe: test: is ( _hdr ) true ... yes
iffe: test: is ( ! _hdr ) true ... no
iffe: test: is ( _aaa ) true ... no
iffe: test: is ( ! _aaa ) true ... yes
iffe: test: is ( _zzz ) true ... yes
iffe: test: is ( ! _zzz ) true ... no'

	EXEC	-r -v -s bsh - t.iffe

TEST 11 'set [no]define'

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'set nodefine
mem stat.st_mtime sys/types.h sys/stat.h
set define
mem stat.st_mode sys/types.h sys/stat.h
if ( _mem_st_mtime_stat ) {
	1
}
endif
if ( _mem_st_mode_stat ) {
	2
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _mem_st_mode_stat	1	/* st_mode is a member of struct stat */
1

2

#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is sys/stat.h a header ... yes
iffe: test: is stat a type or typedef ... no
iffe: test: is st_mtime a member of struct stat ... yes
iffe: test: is st_mode a member of struct stat ... yes
iffe: test: is ( _mem_st_mtime_stat ) true ... yes
iffe: test: is ( _mem_st_mode_stat ) true ... yes'

	EXEC	-r -v -s bsh - t.iffe

TEST 12 'non-opaque mem'

	EXEC	-r -v - mem OPAQUE -I. t.h
		INPUT t.h $'typedef struct opaque OPAQUE;'
		OUTPUT - $'/* : : generated by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _hdr_t	1	/* #include <t.h> ok */
#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is t.h a header ... yes
iffe: test: is OPAQUE a type or typedef ... no
iffe: test: is struct OPAQUE a non-opaque struct ... no'

	EXEC	-r -v - mem NONOPAQUE -I. t.h
		INPUT t.h $'struct nonopaque { int pad; };
typedef struct nonopaque NONOPAQUE;'
		OUTPUT - $'/* : : generated by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _hdr_t	1	/* #include <t.h> ok */
#define _mem_NONOPAQUE	1	/* NONOPAQUE is a non-opaque struct */
#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is t.h a header ... yes
iffe: test: is NONOPAQUE a type or typedef ... yes
iffe: test: is NONOPAQUE a non-opaque struct ... yes'

TEST 13 'key states'

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'key	int
key	const =
key	foo
key	bar =
key	aha = huh = int
key	chr = char = int'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _key_int	1	/* int is a reserved keyword */
#define _key_const	1	/* const is a reserved keyword */
#define bar	 	/* default for reserved keyword bar */
#define aha	int	/* default for reserved keyword aha */
#define _key_char	1	/* char is a reserved keyword */
#define chr	char	/* alternate for reserved keyword chr */
#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is int a reserved keyword ... yes
iffe: test: is const a reserved keyword ... yes
iffe: test: is foo a reserved keyword ... no
iffe: test: is bar a reserved keyword ... no
iffe: test: is aha a reserved keyword ... no
iffe: test: is huh a reserved keyword ... no
iffe: test: is chr a reserved keyword ... no
iffe: test: is char a reserved keyword ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-u -r -v - t.iffe
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _key_int	1	/* int is a reserved keyword */
#define _key_const	1	/* const is a reserved keyword */
#undef	_key_foo		/* foo is not a reserved keyword */
#undef	_key_bar		/* bar is not a reserved keyword */
#define bar	 	/* default for reserved keyword bar */
#undef	_key_huh		/* huh is not a reserved keyword */
#define aha	int	/* default for reserved keyword aha */
#define _key_char	1	/* char is a reserved keyword */
#define chr	char	/* alternate for reserved keyword chr */
#endif'

	EXEC	-u -r -v -s bsh - t.iffe

	EXEC	-a -r -v - t.iffe
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define _key_int	1	/* int is a reserved keyword */
#define _key_const	1	/* const is a reserved keyword */
#define _key_foo	0	/* foo is not a reserved keyword */
#define _key_bar	0	/* bar is not a reserved keyword */
#define bar	 	/* default for reserved keyword bar */
#define _key_huh	0	/* huh is not a reserved keyword */
#define aha	int	/* default for reserved keyword aha */
#define _key_char	1	/* char is a reserved keyword */
#define chr	char	/* alternate for reserved keyword chr */
#endif'

	EXEC	-a -r -v -s bsh - t.iffe

	EXEC	-C -r -v - t.iffe
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define HAVE_SYS_TYPES_H	1	/* #include <sys/types.h> ok */
#define HAVE_INT_RESERVED	1	/* int is a reserved keyword */
#define HAVE_CONST_RESERVED	1	/* const is a reserved keyword */
#undef	HAVE_FOO_RESERVED		/* foo is not a reserved keyword */
#undef	HAVE_BAR_RESERVED		/* bar is not a reserved keyword */
#define bar	 	/* default for reserved keyword bar */
#undef	HAVE_HUH_RESERVED		/* huh is not a reserved keyword */
#define aha	int	/* default for reserved keyword aha */
#define HAVE_CHAR_RESERVED	1	/* char is a reserved keyword */
#define chr	char	/* alternate for reserved keyword chr */
#endif'

	EXEC	-C -r -v -s bsh - t.iffe

TEST 14 'inc file'

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'inc t_lib.h
if ( bar_foo ) {
	#define all 1
}
elif ( _foo_bar ) {
	#define some 1
}
endif'
		INPUT t_lib.h '#define bar_foo ALL
#define _foo_bar SOME'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define some 1

#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is ( bar_foo ) true ... no
iffe: test: is ( _foo_bar ) true ... yes'

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'inc t_lib.h .
if ( bar_foo ) {
	#define all 1
}
elif ( _foo_bar ) {
	#define ok 1
}
endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define all 1

#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is ( bar_foo ) true ... yes'

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'inc t_lib.h . ?
if ( bar_foo ) {
	#define all 1
}
elif ( _foo_bar ) {
	#define ok 1
}
endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: t.iffe:1: warning: ?: operands ignored
iffe: test: is ( bar_foo ) true ... yes'

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'inc foo_lib.h'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: t.iffe:1: foo_lib.h: file not found'
		EXIT 1

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'inc'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: t.iffe:1: path expected'

TEST 15 'KnR compatibility'

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'
if ( 1 ) {
		#define all 1
}
endif
if ( 2 ) {
                #define some 1
}
endif
cat{
#define a 1
 #define b 2
  #define c 3
	 #define d 4
}end'
#define _foo_bar SOME'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define some 1

#endif'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#define all 1

#define some 1

#define a 1
#define b 2
#define c 3
#define d 4

#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is ( 1 ) true ... yes
iffe: test: is ( 2 ) true ... yes
iffe: test: cat{ ... }end ... yes'

	EXEC	-r -v -s bsh - t.iffe

	EXEC	-r -v -s osh - t.iffe

TEST 16 '{ define extern include print }'

	EXEC	-r -v - t.iffe
		INPUT t.iffe $'
print	/* test header */
header	stdio.h
define	EOF	-1
define	FoobaR	(a,b)	((a)+(b))
define	FoomaC	-1
extern	fopen	FILE*	(char*, char*)
extern	BarfoO	struct barfoo*	(int)
extern	Tab_lE	struct barfoo*	[10]'
		OUTPUT - $'/* test header */
/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _REGRESS
#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#include <stdio.h>
#define FoobaR(a,b)	((a)+(b))
#define FoomaC	-1
extern struct barfoo*	BarfoO(int);
extern struct barfoo*	Tab_lE[10];
#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is stdio.h a header ... yes
iffe: test: is EOF a macro ... yes
iffe: test: is FoobaR a macro ... no
iffe: test: is FoomaC a macro ... no
iffe: test: is fopen a symbol that needs a prototype ... no
iffe: test: is BarfoO a symbol that needs a prototype ... yes
iffe: test: is Tab_lE a symbol that needs a prototype ... yes'

TEST 17 'features/* => FEATURE/*'

	EXEC	-r -v run features/stdio
		INPUT features/stdio $'set prototyped
header stdio.h'
		OUTPUT FEATURE/stdio $'
/* : : generated by proto : : */
/* : : generated from features/stdio by iffe version 1995-03-19 : : */
                  
#ifndef _REGRESS
#if !defined(__PROTO__)
#  if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus)
#    if defined(__cplusplus)
#      define __LINKAGE__	"C"
#    else
#      define __LINKAGE__
#    endif
#    define __STDARG__
#    define __PROTO__(x)	x
#    define __OTORP__(x)
#    define __PARAM__(n,o)	n
#    if !defined(__STDC__) && !defined(__cplusplus)
#      if !defined(c_plusplus)
#      	define const
#      endif
#      define signed
#      define void		int
#      define volatile
#      define __V_		char
#    else
#      define __V_		void
#    endif
#  else
#    define __PROTO__(x)	()
#    define __OTORP__(x)	x
#    define __PARAM__(n,o)	o
#    define __LINKAGE__
#    define __V_		char
#    define const
#    define signed
#    define void		int
#    define volatile
#  endif
#  define __MANGLE__	__LINKAGE__
#  if defined(__cplusplus) || defined(c_plusplus)
#    define __VARARG__	...
#  else
#    define __VARARG__
#  endif
#  if defined(__STDARG__)
#    define __VA_START__(p,a)	va_start(p,a)
#  else
#    define __VA_START__(p,a)	va_start(p)
#  endif
#  if !defined(__INLINE__)
#    if defined(__cplusplus)
#      define __INLINE__	extern __MANGLE__ inline
#    else
#      if defined(_WIN32) && !defined(__GNUC__)
#      	define __INLINE__	__inline
#      endif
#    endif
#  endif
#endif
#if !defined(__LINKAGE__)
#define __LINKAGE__		/* 2004-08-11 transition */
#endif

#define _REGRESS	1
#define _sys_types	1	/* #include <sys/types.h> ok */
#include <stdio.h>
#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes
iffe: test: is stdio.h a header ... yes'

TEST 18 'api + ver'
	EXEC	-r -v - t.iffe
		INPUT t.iffe $'iff api
ver foo 20100606
ver bar 19840919

api foo 19991231 dis dat tother
api foo 20100601 dat
api foo 20100606 dis
api bar 19991231 moe larry shemp
api bar 20020202 curly
api bar 20030303 shemp
api bar 20040404 joe_b
api bar 20050505 joe_d
'
		OUTPUT - $'/* : : generated from t.iffe by iffe version 1995-03-19 : : */
#ifndef _api_H
#define _api_H	1
#define _sys_types	1	/* #include <sys/types.h> ok */

#define FOO_VERSION	20100606
#define BAR_VERSION	19840919
#define FOOAPI(rel)	( _BLD_foo || !_API_foo || _API_foo >= rel )

#if !defined(_API_foo) && defined(_API_DEFAULT)
#define _API_foo	_API_DEFAULT
#endif

#if FOOAPI(20100601)
#undef	dat
#define dat	dat_20100601
#elif _API_foo >= 19991231
#undef	dat
#define dat	dat_19991231
#endif

#if FOOAPI(20100606)
#undef	dis
#define dis	dis_20100606
#elif _API_foo >= 19991231
#undef	dis
#define dis	dis_19991231
#endif

#if FOOAPI(19991231)
#undef	tother
#define tother	tother_19991231
#endif

#define _API_foo_MAP	"dat_20100601 dat_19991231 dis_20100606 dis_19991231 tother_19991231"
#define BARAPI(rel)	( _BLD_bar || !_API_bar || _API_bar >= rel )

#if !defined(_API_bar) && defined(_API_DEFAULT)
#define _API_bar	_API_DEFAULT
#endif

#if BARAPI(20020202)
#undef	curly
#define curly	curly_20020202
#endif

#if BARAPI(20040404)
#undef	joe_b
#define joe_b	joe_b_20040404
#endif

#if BARAPI(20050505)
#undef	joe_d
#define joe_d	joe_d_20050505
#endif

#if BARAPI(19991231)
#undef	larry
#define larry	larry_19991231
#endif

#if BARAPI(19991231)
#undef	moe
#define moe	moe_19991231
#endif

#if BARAPI(20030303)
#undef	shemp
#define shemp	shemp_20030303
#elif _API_bar >= 19991231
#undef	shemp
#define shemp	shemp_19991231
#endif

#define _API_bar_MAP	"curly_20020202 joe_b_20040404 joe_d_20050505 larry_19991231 moe_19991231 shemp_20030303 shemp_19991231"

#endif'
		ERROR - $'iffe: test: is sys/types.h a header ... yes'
