Merge pull request #141 from mrdudz/testsuite

Testsuite
This commit is contained in:
Oliver Schmidt 2014-11-27 19:24:59 +01:00
commit fed3179d3b
77 changed files with 782 additions and 17 deletions

1
.gitignore vendored
View file

@ -8,5 +8,6 @@
/mou/ /mou/
/ser/ /ser/
/targetutil/ /targetutil/
/testwrk/
/tgi/ /tgi/
/wrk/ /wrk/

1
test/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
*.o

52
test/Makefile Normal file
View file

@ -0,0 +1,52 @@
# toplevel makefile for the regression tests
MAKE := make --no-print-dir
ifneq ($(shell echo),)
CMD_EXE = 1
endif
ifdef CMD_EXE
RM := del /f
EXE := .exe
MKDIR = mkdir
RMDIR = rmdir
else
RM := rm -f
EXE :=
MKDIR = mkdir -p
RMDIR = rmdir
endif
WORKDIR := ../testwrk
.PHONY: dotests clean
all: dotests
$(WORKDIR):
@$(MKDIR) $(WORKDIR)
$(WORKDIR)/bdiff$(EXE): $(WORKDIR)
@$(CC) -o $(WORKDIR)/bdiff$(EXE) bdiff.c
dotests: $(WORKDIR)/bdiff$(EXE)
@$(MAKE) -C val clean all
@$(MAKE) -C ref clean all
@$(MAKE) -C err clean all
@$(MAKE) -C misc clean all
continue: $(WORKDIR)/bdiff$(EXE)
@$(MAKE) -C val all
@$(MAKE) -C ref all
@$(MAKE) -C err all
@$(MAKE) -C misc all
clean:
@$(MAKE) -C val clean
@$(MAKE) -C ref clean
@$(MAKE) -C err clean
@$(MAKE) -C misc clean
@$(RM) $(WORKDIR)/bdiff$(EXE)
@$(RMDIR) $(WORKDIR)

28
test/bdiff.c Normal file
View file

@ -0,0 +1,28 @@
// minimal tool to compare two binaries
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *f1, *f2;
if (argc < 3) {
return EXIT_FAILURE;
}
f1 = fopen(argv[1], "rb");
f2 = fopen(argv[2], "rb");
if ((f1 == NULL) || (f2 == NULL)) {
return EXIT_FAILURE;
}
for(;;) {
if (feof(f1) && feof(f2)) {
return EXIT_SUCCESS;
} else if (feof(f1) || feof(f2)) {
return EXIT_FAILURE;
}
if (fgetc(f1) != fgetc(f2)) {
return EXIT_FAILURE;
}
}
}

52
test/err/Makefile Normal file
View file

@ -0,0 +1,52 @@
# makefile for the tests that MUST NOT compile
ifneq ($(shell echo),)
CMD_EXE = 1
endif
CC65FLAGS = -t sim6502
CL65 := $(if $(wildcard ../../bin/cl65*),../../bin/cl65,cl65)
ifdef CMD_EXE
RM := del /f
else
RM := rm -f
endif
WORKDIR := ./../../testwrk
.PHONY: all clean
SOURCES := $(wildcard *.c)
TESTS := $(SOURCES:%.c=$(WORKDIR)/%.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.o.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.os.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.osi.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.osir.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oi.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oir.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.or.prg)
all: $(TESTS)
$(WORKDIR)/%.prg: %.c
! $(CL65) $(CC65FLAGS) $< -o $@
$(WORKDIR)/%.o.prg: %.c
! $(CL65) -O $(CC65FLAGS) $< -o $@
$(WORKDIR)/%.os.prg: %.c
! $(CL65) -Os $(CC65FLAGS) $< -o $@
$(WORKDIR)/%.osi.prg: %.c
! $(CL65) -Osi $(CC65FLAGS) $< -o $@
$(WORKDIR)/%.osir.prg: %.c
! $(CL65) -Osir $(CC65FLAGS) $< -o $@
$(WORKDIR)/%.oi.prg: %.c
! $(CL65) -Oi $(CC65FLAGS) $< -o $@
$(WORKDIR)/%.oir.prg: %.c
! $(CL65) -Oir $(CC65FLAGS) $< -o $@
$(WORKDIR)/%.or.prg: %.c
! $(CL65) -Or $(CC65FLAGS) $< -o $@
clean:
@$(RM) $(TESTS)
@$(RM) $(SOURCES:%.c=$(WORKDIR)/%.o)

67
test/misc/Makefile Normal file
View file

@ -0,0 +1,67 @@
# makefile for the remaining tests that need special care in one way or another
ifneq ($(shell echo),)
CMD_EXE = 1
endif
CC65FLAGS = -t sim6502
SIM65FLAGS = -x 200000000
CL65 := $(if $(wildcard ../../bin/cl65*),../../bin/cl65,cl65)
SIM65 := $(if $(wildcard ../../bin/sim65*),../../bin/sim65,sim65)
ifdef CMD_EXE
RM := del /f
else
RM := rm -f
endif
WORKDIR := ./../../testwrk
DIFF := $(WORKDIR)/bdiff
.PHONY: all clean
SOURCES := $(wildcard *.c)
TESTS := $(SOURCES:%.c=$(WORKDIR)/%.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.o.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.os.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.osi.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.osir.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oi.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oir.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.or.prg)
# FIXME: actually use/build differently optimized programs here
all: $(TESTS)
# should compile, but then hangs in an endless loop
$(WORKDIR)/endless%prg: endless.c
$(CL65) $(CC65FLAGS) $< -o $@
! $(SIM65) $(SIM65FLAGS) $@
# these need reference data that cant be generated by a host compiled program
# in a useful way
$(WORKDIR)/limits%prg: limits.c
$(CL65) $(CC65FLAGS) $< -o $@
$(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/limits.out
$(DIFF) $(WORKDIR)/limits.out limits.ref
# the rest are tests that fail currently for one reason or another
$(WORKDIR)/fields%prg: fields.c
@echo "FIXME: " $@ "will currently fail"
$(CL65) $(CC65FLAGS) $< -o $@
-$(SIM65) $(SIM65FLAGS) $@
$(WORKDIR)/sitest%prg: sitest.c
@echo "FIXME: " $@ "will currently fail"
-$(CL65) $(CC65FLAGS) $< -o $@
-$(SIM65) $(SIM65FLAGS) $@
clean:
@$(RM) $(TESTS)
@$(RM) $(SOURCES:%.c=$(WORKDIR)/%.o)
@$(RM) $(SOURCES:%.c=$(WORKDIR)/%.out)

22
test/misc/common.h Normal file
View file

@ -0,0 +1,22 @@
#include <stdio.h>
#include <stdlib.h>
#define NO_OLD_FUNC_DECL
#define NO_TYPELESS_INT
#define NO_TYPELESS_INT_PTR
#define MAIN_RETURNS_INT
#define NO_IMPLICIT_FUNC_PROTOTYPES
#define NO_FLOATS
#define NO_WCHAR
#define NO_EMPTY_FUNC_ARGS
#define NO_SLOPPY_STRUCT_INIT
#define NO_FUNCS_TAKE_STRUCTS
#define NO_FUNCS_RETURN_STRUCTS
#define CAST_STRUCT_PTR
#define NO_TYPELESS_STRUCT_PTR
#define NO_IMPLICIT_FUNCPTR_CONV
#define SIZEOF_INT_16BIT
#define SIZEOF_LONG_32BIT
#define UNSIGNED_CHARS
#define UNSIGNED_BITFIELDS

13
test/misc/endless.c Normal file
View file

@ -0,0 +1,13 @@
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("entering endless loop\n");
for(;;) {
;
}
printf("error: should not come here\n");
return EXIT_FAILURE;
}

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
#ifdef NO_BITFIELDS #ifdef NO_BITFIELDS
main() main()

24
test/misc/limits.ref Normal file
View file

@ -0,0 +1,24 @@
CHAR_MAX: 0x000000ff=255
UCHAR_MAX: 0x000000ff=255
SCHAR_MAX: 0x0000007f=127
SHRT_MAX: 0x00007fff=32767
USHRT_MAX: 0x0000ffff=-1
SSHRT_MAX: 0x00007fff=32767
INT_MAX: 0x00007fff=32767
UINT_MAX: 0x0000ffff=-1
SINT_MAX: 0x00007fff=32767
LONG_MAX: 0x7fffffff=2147483647
ULONG_MAX: 0xffffffff=-1
SLONG_MAX: 0x7fffffff=2147483647
CHAR_MIN: 0x00000000=0
UCHAR_MIN: 0x00000000=0
SCHAR_MIN: 0x0000ff80=-128
SHRT_MIN: 0x00008000=-32768
USHRT_MIN: 0x00000000=0
SSHRT_MIN: 0x00008000=-32768
INT_MIN: 0x00008000=-32768
UINT_MIN: 0x00000000=0
SINT_MIN: 0x00008000=-32768
LONG_MIN: 0x80000000=-2147483648
ULONG_MIN: 0x00000000=0
SLONG_MIN: 0x80000000=-2147483648

25
test/readme.txt Normal file
View file

@ -0,0 +1,25 @@
This directory contains test code for automatic regression testing of the CC65
compiler.
/val - the bulk of tests are contained here, individual tests should exit with
an exit code of EXIT_SUCCESS when they pass, or EXIT_FAILURE on error
/ref - these tests produce output that must be compared with reference output
/err - contains tests that MUST NOT compile
/misc - a few tests that need special care of some sort
to run the tests use "make" in this (top) directory, the makefile should exit
with no error.
when a test failed you can use "make continue" to run further tests
--------------------------------------------------------------------------------
TODO:
- reduce usage of "common.h" to a minimum
- convert more tests from using reference output to returning an exit code

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include <stdio.h>
int up[15], down[15], rows[8], x[8]; int up[15], down[15], rows[8], x[8];
void queens(int c); void queens(int c);
void print(void); void print(void);

92
test/ref/Makefile Normal file
View file

@ -0,0 +1,92 @@
# makefile for the regression tests that generate output which has to be
# compared with reference output
ifneq ($(shell echo),)
CMD_EXE = 1
endif
CC65FLAGS = -t sim6502
SIM65FLAGS = -x 200000000
CL65 := $(if $(wildcard ../../bin/cl65*),../../bin/cl65,cl65)
SIM65 := $(if $(wildcard ../../bin/sim65*),../../bin/sim65,sim65)
ifdef CMD_EXE
RM := del /f
else
RM := rm -f
endif
WORKDIR := ./../../testwrk
DIFF := $(WORKDIR)/bdiff
CFLAGS := -O2 -Wall -W -Wextra -fwrapv -fno-strict-overflow
.PHONY: all clean
REFS := $(patsubst %.c,$(WORKDIR)/%.ref,$(wildcard *.c))
SOURCES := $(wildcard *.c)
TESTS := $(SOURCES:%.c=$(WORKDIR)/%.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.o.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.os.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.osi.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.osir.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oi.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oir.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.or.prg)
all: $(REFS) $(TESTS)
$(WORKDIR)/%.ref: %.c
$(CC) $(CFLAGS) $< -o $(WORKDIR)/$*.host
$(WORKDIR)/$*.host > $@
$(WORKDIR)/%.prg: %.c $(WORKDIR)/%.ref
$(CL65) $(CC65FLAGS) $< -o $@
$(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/$*.out
$(DIFF) $(WORKDIR)/$*.out $(WORKDIR)/$*.ref
$(WORKDIR)/%.o.prg: %.c $(WORKDIR)/%.ref
$(CL65) -O $(CC65FLAGS) $< -o $@
$(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/$*.out
$(DIFF) $(WORKDIR)/$*.out $(WORKDIR)/$*.ref
$(WORKDIR)/%.os.prg: %.c $(WORKDIR)/%.ref
$(CL65) -Os $(CC65FLAGS) $< -o $@
$(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/$*.out
$(DIFF) $(WORKDIR)/$*.out $(WORKDIR)/$*.ref
$(WORKDIR)/%.osi.prg: %.c $(WORKDIR)/%.ref
$(CL65) -Osi $(CC65FLAGS) $< -o $@
$(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/$*.out
$(DIFF) $(WORKDIR)/$*.out $(WORKDIR)/$*.ref
$(WORKDIR)/%.osir.prg: %.c $(WORKDIR)/%.ref
$(CL65) -Osir $(CC65FLAGS) $< -o $@
$(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/$*.out
$(DIFF) $(WORKDIR)/$*.out $(WORKDIR)/$*.ref
$(WORKDIR)/%.oi.prg: %.c $(WORKDIR)/%.ref
$(CL65) -Oi $(CC65FLAGS) $< -o $@
$(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/$*.out
$(DIFF) $(WORKDIR)/$*.out $(WORKDIR)/$*.ref
$(WORKDIR)/%.oir.prg: %.c $(WORKDIR)/%.ref
$(CL65) -Oir $(CC65FLAGS) $< -o $@
$(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/$*.out
$(DIFF) $(WORKDIR)/$*.out $(WORKDIR)/$*.ref
$(WORKDIR)/%.or.prg: %.c $(WORKDIR)/%.ref
$(CL65) -Or $(CC65FLAGS) $< -o $@
$(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/$*.out
$(DIFF) $(WORKDIR)/$*.out $(WORKDIR)/$*.ref
clean:
@$(RM) $(TESTS)
@$(RM) $(SOURCES:%.c=$(WORKDIR)/%.o)
@$(RM) $(SOURCES:%.c=$(WORKDIR)/%.out)
@$(RM) $(SOURCES:%.c=$(WORKDIR)/%.ref)
@$(RM) $(SOURCES:%.c=$(WORKDIR)/%.host)

View file

@ -5,6 +5,8 @@
!!AUTHOR!! !!AUTHOR!!
*/ */
#include <stdio.h>
long a; /* must be static life */ long a; /* must be static life */
long b; /* must be static life */ long b; /* must be static life */

View file

@ -13,6 +13,8 @@ optimizations. If I remove the struct inside f() it compiles fine ?!?
Best, Oliver Best, Oliver
*/ */
#include <stdio.h>
void f(void){struct{int i;}d;} void f(void){struct{int i;}d;}
struct{void(*p)(void);}s={f}; struct{void(*p)(void);}s={f};

View file

@ -5,6 +5,8 @@
!!AUTHOR!! !!AUTHOR!!
*/ */
#include <stdio.h>
/* /*
cc65 doesn't compile this, if i use the "-O"-option. cc65 doesn't compile this, if i use the "-O"-option.
but it works with "while(!0)"; instead of "for(;;);" but it works with "while(!0)"; instead of "for(;;);"

View file

@ -5,6 +5,8 @@
!!AUTHOR!! !!AUTHOR!!
*/ */
#include <stdio.h>
/* /*
there is a bug in the preprocessor (i think) ... the following works there is a bug in the preprocessor (i think) ... the following works
(compiles) correctly: (compiles) correctly:

View file

@ -5,6 +5,8 @@
!!AUTHOR!! !!AUTHOR!!
*/ */
#include "common.h"
struct Record { struct Record {
struct Record *PtrComp; struct Record *PtrComp;
int x; int x;

View file

@ -5,6 +5,8 @@
!!AUTHOR!! Oliver Schmidt !!AUTHOR!! Oliver Schmidt
*/ */
#include <stdio.h>
/* /*
After spending a "little" time I finally succeeded in isolating an After spending a "little" time I finally succeeded in isolating an
(maybe THE) optimizer bug causing Contiki to fail. (maybe THE) optimizer bug causing Contiki to fail.

View file

@ -18,6 +18,8 @@
*/ */
#include <stdio.h>
int foo=0,bar=2; int foo=0,bar=2;
int main(void) int main(void)

View file

@ -5,6 +5,8 @@
!!AUTHOR!! Johan Kotlinski !!AUTHOR!! Johan Kotlinski
*/ */
#include <stdio.h>
/* /*
This produces the compiler error "test.c(9): Error: Assignment to const" This produces the compiler error "test.c(9): Error: Assignment to const"
Shouldn't be an error, should it? baz is const, bar isn't. Shouldn't be an error, should it? baz is const, bar isn't.

View file

@ -5,6 +5,8 @@
!!AUTHOR!! Johan Kotlinski !!AUTHOR!! Johan Kotlinski
*/ */
#include <stdio.h>
/* /*
...gives "test.c(2): Error: Variable `foo' has unknown size" using -Cl. ...gives "test.c(2): Error: Variable `foo' has unknown size" using -Cl.
Is it really unknown? Is it really unknown?

View file

@ -8,6 +8,8 @@
test2 and test3 will result in an endless loop (SVN version: 4974M) test2 and test3 will result in an endless loop (SVN version: 4974M)
*/ */
#include <stdio.h>
#define OPENTEST() #define OPENTEST()
#define CLOSETEST() #define CLOSETEST()

View file

@ -8,11 +8,16 @@
cf - print character frequencies cf - print character frequencies
*/ */
#include "common.h"
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
FILE *in;
#define INFILE "cf.in" #define INFILE "cf.in"
#define GETCHAR() fgetc(in)
#ifndef NO_FLOATS #ifndef NO_FLOATS
float f[0x100]; float f[0x100];
@ -35,6 +40,11 @@ char *argv[];
signed cutoff; signed cutoff;
#endif #endif
in = fopen(INFILE, "rb");
if (in == NULL) {
return EXIT_FAILURE;
}
if (argc <= 1) if (argc <= 1)
#ifndef NO_FLOATS #ifndef NO_FLOATS
cutoff = 0.0; cutoff = 0.0;
@ -176,6 +186,6 @@ char *argv[];
#endif #endif
} }
} }
fclose(in);
return 0; return 0;
} }

19
test/ref/cf.in Executable file
View file

@ -0,0 +1,19 @@
start cf.input >
The sky above the port was the color of television, tuned
to a dead channel.
"It's not like I'm using," Case heard someone say, as he
shouldered his way through the crowd around the door of the
Chat. "It's like my body's developed this massive drug deficiency."
It was a Sprawl voice and a Sprawl joke. The Chatsubo
was a bar for professional expatriates; you could drink there
for a week and never hear two words in Japanese.
Ratz was tending bar, his prosthetic arm jerking monotonously
as he filled a tray of glasses with draft Kirin. He saw
Case and smiled, his teeth a web work of East European steel
and brown decay. Case found a place at the bar, between the
unlikely tan on one of Lonny Zone's whores and the crisp naval
uniform of a tall African whose cheekbones were ridged with
Joe boys," Ratz said, shoving a draft across the bar with his
good hand. "Maybe some business with you, Case?"
Case shrugged. The girl to his right giggled and nudged
< end cf.input

View file

@ -4,6 +4,7 @@
!!LICENCE!! Public Domain !!LICENCE!! Public Domain
*/ */
#include "common.h"
#include <limits.h> #include <limits.h>
#include <ctype.h> #include <ctype.h>

22
test/ref/common.h Normal file
View file

@ -0,0 +1,22 @@
#include <stdio.h>
#include <stdlib.h>
#define NO_OLD_FUNC_DECL
#define NO_TYPELESS_INT
#define NO_TYPELESS_INT_PTR
#define MAIN_RETURNS_INT
#define NO_IMPLICIT_FUNC_PROTOTYPES
#define NO_FLOATS
#define NO_WCHAR
#define NO_EMPTY_FUNC_ARGS
#define NO_SLOPPY_STRUCT_INIT
#define NO_FUNCS_TAKE_STRUCTS
#define NO_FUNCS_RETURN_STRUCTS
#define CAST_STRUCT_PTR
#define NO_TYPELESS_STRUCT_PTR
#define NO_IMPLICIT_FUNCPTR_CONV
#define SIZEOF_INT_16BIT
#define SIZEOF_LONG_32BIT
#define UNSIGNED_CHARS
#define UNSIGNED_BITFIELDS

View file

@ -4,6 +4,9 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
#include <stdio.h>
signed char c; signed char c;
signed short s; signed short s;
signed int i; signed int i;

View file

@ -4,12 +4,13 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
/* todo: add back conditional stuff here ! */ /* todo: add back conditional stuff here ! */
typedef struct { int codes[3]; char name[6]; } Word; typedef struct { int codes[3]; char name[6]; } Word;
#ifdef NO_IMPLICIT_FUNC_PROTOTYPES #ifdef NO_IMPLICIT_FUNC_PROTOTYPES
#ifdef NO_OLD_FUNC_DECL #ifdef NO_OLD_FUNC_DECL
f(); f();
void g(Word *p); void g(Word *p);
@ -42,8 +43,8 @@ Word words[] = {
/*int x[][5] = { 1, 2, 3, 4, 0, { 5, 6 }, { 7 } };*/ /*int x[][5] = { 1, 2, 3, 4, 0, { 5, 6 }, { 7 } };*/
int x[][5] = { {1, 2, 3, 4, 0 }, { 5, 6 }, { 7 } }; int x[][5] = { {1, 2, 3, 4, 0 }, { 5, 6 }, { 7 } };
int *y[] = { x[0], x[1], x[2], 0 }; int *y[] = { x[0], x[1], x[2], 0 };
main() main()
{ {
int i, j; int i, j;

View file

@ -5,6 +5,8 @@
!!AUTHOR!! Groepaz/Hitmen !!AUTHOR!! Groepaz/Hitmen
*/ */
#include <stdio.h>
int main(void) int main(void)
{ {
#if 1 #if 1

View file

@ -4,6 +4,8 @@
!!LICENCE!! GPL (?), read COPYING.GPL !!LICENCE!! GPL (?), read COPYING.GPL
*/ */
#include "common.h"
/* /*
* Sample OTCC C example. You can uncomment the first line and install * Sample OTCC C example. You can uncomment the first line and install
* otcc in /usr/local/bin to make otcc scripts ! * otcc in /usr/local/bin to make otcc scripts !

View file

@ -4,11 +4,14 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
#ifdef NO_FLOATS #ifdef NO_FLOATS
main() main()
{ {
printf("NO_FLOATS\n\r"); printf("NO_FLOATS\n\r");
return 0;
} }
#else #else

View file

@ -4,6 +4,7 @@
!!LICENCE!! public domain !!LICENCE!! public domain
*/ */
#include "common.h"
#include <stdio.h> #include <stdio.h>
/* /*
@ -101,11 +102,11 @@ static void test30(void)
cc65 seems to have problems here aswell ;/ cc65 seems to have problems here aswell ;/
*/ */
int main(void) { int main(void) {
test1(); test1();
test2(); test2();
test30(); test30();
test31(); test31();
/* test32(); */ /* test32(); */
return 0; return 0;
} }

View file

@ -4,6 +4,7 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
#include <stdio.h> #include <stdio.h>
int main(void) int main(void)

View file

@ -4,6 +4,7 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
#include <stdarg.h> #include <stdarg.h>
#ifndef NO_FUNCS_TAKE_STRUCTS #ifndef NO_FUNCS_TAKE_STRUCTS

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
typedef struct point { int x,y; } point; typedef struct point { int x,y; } point;
typedef struct rect { point pt1, pt2; } rect; typedef struct rect { point pt1, pt2; } rect;

View file

@ -4,6 +4,7 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
#include <limits.h> #include <limits.h>
#ifdef NO_IMPLICIT_FUNC_PROTOTYPES #ifdef NO_IMPLICIT_FUNC_PROTOTYPES

View file

@ -11,6 +11,9 @@
#define MAXWORDS 250 #define MAXWORDS 250
FILE *in;
#define getchar() fgetc(in)
struct node struct node
{ {
int count; /* frequency count */ int count; /* frequency count */
@ -122,11 +125,17 @@ int main(void)
struct node *root; struct node *root;
char word[20]; char word[20];
in = fopen("wf1.in","rb");
if (in == NULL) {
return EXIT_FAILURE;
}
root = 0; root = 0;
next = 0; next = 0;
while (getword(word)) while (getword(word))
lookup(word, &root)->count++; lookup(word, &root)->count++;
tprint(root); tprint(root);
fclose(in);
return 0; return 0;
} }

17
test/ref/wf1.in Normal file
View file

@ -0,0 +1,17 @@
The sky above the port was the color of television, tuned
to a dead channel.
"It's not like I'm using," Case heard someone say, as he
shouldered his way through the crowd around the door of the
Chat. "It's like my body's developed this massive drug deficiency."
It was a Sprawl voice and a Sprawl joke. The Chatsubo
was a bar for professional expatriates; you could drink there
for a week and never hear two words in Japanese.
Ratz was tending bar, his prosthetic arm jerking monotonously
as he filled a tray of glasses with draft Kirin. He saw
Case and smiled, his teeth a web work of East European steel
and brown decay. Case found a place at the bar, between the
unlikely tan on one of Lonny Zone's whores and the crisp naval
uniform of a tall African whose cheekbones were ridged with
Joe boys," Ratz said, shoving a draft across the bar with his
good hand. "Maybe some business with you, Case?"
Case shrugged. The girl to his right giggled and nudged

View file

@ -6,6 +6,8 @@
/*#define STANDALONE*/ /*#define STANDALONE*/
#include "common.h"
#ifndef YACCDBG #ifndef YACCDBG
#include <stdio.h> #include <stdio.h>
@ -19,6 +21,9 @@
#endif #endif
FILE *infile, *outfile;
#define getchar() fgetc(infile)
/* hack the original tables to work with both petscii and ascii */ /* hack the original tables to work with both petscii and ascii */
#define CHARSETHACK #define CHARSETHACK
@ -61,7 +66,6 @@ int yymorfg;
extern char *yysptr, yysbuf[]; extern char *yysptr, yysbuf[];
int yytchar; int yytchar;
/*FILE *yyin ={stdin}, *yyout ={stdout};*/
#define yyin infile #define yyin infile
#define yyout outfile #define yyout outfile
@ -665,7 +669,13 @@ yyunput(c)
main() main()
{ {
printf("main start\n"); printf("main start\n");
infile = fopen("yacc.in","rb");
if (infile == NULL) {
return EXIT_FAILURE;
}
outfile = stdout;
yyparse(); yyparse();
fclose(infile);
printf("main end\n"); printf("main end\n");
return 0; return 0;
} }

3
test/ref/yacc.in Executable file
View file

@ -0,0 +1,3 @@
x=(e+1)*3/(3+7)

View file

@ -5,6 +5,8 @@
!!AUTHOR!! Groepaz/Hitmen !!AUTHOR!! Groepaz/Hitmen
*/ */
#include <stdio.h>
# define YYTYPE char # define YYTYPE char
struct yywork struct yywork
{ {

70
test/val/Makefile Normal file
View file

@ -0,0 +1,70 @@
# makefile for the regression tests that return an error code on failure
ifneq ($(shell echo),)
CMD_EXE = 1
endif
CC65FLAGS = -t sim6502
SIM65FLAGS = -x 200000000
CL65 := $(if $(wildcard ../../bin/cl65*),../../bin/cl65,cl65)
SIM65 := $(if $(wildcard ../../bin/sim65*),../../bin/sim65,sim65)
ifdef CMD_EXE
RM := del /f
else
RM := rm -f
endif
WORKDIR := ./../../testwrk
.PHONY: all clean
SOURCES := $(wildcard *.c)
TESTS := $(SOURCES:%.c=$(WORKDIR)/%.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.o.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.os.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.osi.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.osir.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oi.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oir.prg)
TESTS += $(SOURCES:%.c=$(WORKDIR)/%.or.prg)
all: $(TESTS)
$(WORKDIR)/%.prg: %.c
$(CL65) $(CC65FLAGS) $< -o $@
$(SIM65) $(SIM65FLAGS) $@
$(WORKDIR)/%.o.prg: %.c
$(CL65) -O $(CC65FLAGS) $< -o $@
$(SIM65) $(SIM65FLAGS) $@
$(WORKDIR)/%.os.prg: %.c
$(CL65) -Os $(CC65FLAGS) $< -o $@
$(SIM65) $(SIM65FLAGS) $@
$(WORKDIR)/%.osi.prg: %.c
$(CL65) -Osi $(CC65FLAGS) $< -o $@
$(SIM65) $(SIM65FLAGS) $@
$(WORKDIR)/%.osir.prg: %.c
$(CL65) -Osir $(CC65FLAGS) $< -o $@
$(SIM65) $(SIM65FLAGS) $@
$(WORKDIR)/%.oi.prg: %.c
$(CL65) -Oi $(CC65FLAGS) $< -o $@
$(SIM65) $(SIM65FLAGS) $@
$(WORKDIR)/%.oir.prg: %.c
$(CL65) -Oir $(CC65FLAGS) $< -o $@
$(SIM65) $(SIM65FLAGS) $@
$(WORKDIR)/%.or.prg: %.c
$(CL65) -Or $(CC65FLAGS) $< -o $@
$(SIM65) $(SIM65FLAGS) $@
clean:
@$(RM) $(TESTS)
@$(RM) $(SOURCES:%.c=$(WORKDIR)/%.o)

Binary file not shown.

Binary file not shown.

View file

@ -4,6 +4,8 @@
!!LICENCE!! GPL, read COPYING.GPL !!LICENCE!! GPL, read COPYING.GPL
*/ */
#include "common.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <limits.h> #include <limits.h>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -5,6 +5,7 @@
!!AUTHOR!! Johan Kotlinski !!AUTHOR!! Johan Kotlinski
*/ */
#include <stdio.h>
#include <assert.h> #include <assert.h>
struct { struct {

22
test/val/common.h Normal file
View file

@ -0,0 +1,22 @@
#include <stdio.h>
#include <stdlib.h>
#define NO_OLD_FUNC_DECL
#define NO_TYPELESS_INT
#define NO_TYPELESS_INT_PTR
#define MAIN_RETURNS_INT
#define NO_IMPLICIT_FUNC_PROTOTYPES
#define NO_FLOATS
#define NO_WCHAR
#define NO_EMPTY_FUNC_ARGS
#define NO_SLOPPY_STRUCT_INIT
#define NO_FUNCS_TAKE_STRUCTS
#define NO_FUNCS_RETURN_STRUCTS
#define CAST_STRUCT_PTR
#define NO_TYPELESS_STRUCT_PTR
#define NO_IMPLICIT_FUNCPTR_CONV
#define SIZEOF_INT_16BIT
#define SIZEOF_LONG_32BIT
#define UNSIGNED_CHARS
#define UNSIGNED_BITFIELDS

View file

@ -17,9 +17,6 @@ unsigned char success = 0;
unsigned char failures = 0; unsigned char failures = 0;
unsigned char dummy = 0; unsigned char dummy = 0;
#ifdef SUPPORT_BIT_TYPES
bit bit0 = 0;
#endif
int int0 = 0; int int0 = 0;
int int1 = 0; int int1 = 0;
char char0 = 0; char char0 = 0;
@ -291,19 +288,16 @@ void c_minus1(void)
printf("(long0 != -1)\n"); printf("(long0 != -1)\n");
if(long0 != -1) if(long0 != -1)
{ {
LOG_ERROR(1);
failures++; failures++;
} }
printf("(long0 > 0)\n"); printf("(long0 > 0)\n");
if(long0 > 0) if(long0 > 0)
{ {
LOG_ERROR(1);
failures++; failures++;
} }
printf("(long1 < 0)\n"); printf("(long1 < 0)\n");
if(long1 < 0) if(long1 < 0)
{ {
LOG_ERROR(1);
failures++; failures++;
} }
/* /*

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
#ifndef CQ26_INCLUDED #ifndef CQ26_INCLUDED
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */
@ -41,7 +43,124 @@ struct defs {
int crc; /* Cumulative return code */ int crc; /* Cumulative return code */
char rfs[8]; /* Return from section */ char rfs[8]; /* Return from section */
/*#include "cq26.c"*/ /* hardware check */ #define CQ26_INCLUDED
/*
section s26, which pokes around at the hardware
trying to figure out the characteristics of the machine that
it is running on, saves information that is subsequently
used by sections s626, s72, and s757. If this program is
to be broken up into smallish pieces, say for running on
a microcomputer, take care to see that s26 is called before
calling any of the latter three sections.
*/
/*
2.6 Hardware Characteristics
*/
#ifndef NO_OLD_FUNC_DECL
s26(pd0)
struct defs *pd0;
{
#else
s26(struct defs *pd0) {
#endif
static char qs26[8] = "s26 ";
char *ps, *pt;
char c0, c1;
#ifndef NO_FLOATS
float temp, one, delta;
double tempd, oned;
#endif
static char s[] = "%3d bits in %ss.\n";
static char s2[] = "%e is the least number that can be added to 1. (%s).\n";
ps = qs26;
pt = pd0->rfs;
while(*pt++ = *ps++);
/* Here, we shake the machinery a little to see what falls
out. First, we find out how many bits are in a char. */
pd0->cbits = 0;
c0 = 0;
c1 = 1;
while(c0 != c1) {
c1 = c1<<1;
pd0->cbits = pd0->cbits+1;
}
/* That information lets us determine the size of everything else. */
pd0->ibits = pd0->cbits * sizeof(int);
pd0->sbits = pd0->cbits * sizeof(short);
pd0->lbits = pd0->cbits * sizeof(long);
pd0->ubits = pd0->cbits * sizeof(unsigned);
#ifndef NO_FLOATS
pd0->fbits = pd0->cbits * sizeof(float);
pd0->dbits = pd0->cbits * sizeof(double);
#endif
/* We have now almost reconstructed the table in section 2.6, the
exception being the range of the floating point hardware.
Now there are just so many ways to conjure up a floating point
representation system that it's damned near impossible to guess
what's going on by writing a program to interpret bit patterns.
Further, the information isn't all that useful, if we consider
the fact that machines that won't handle numbers between 10**30
and 10**-30 are very hard to find, and that people playing with
numbers outside that range have a lot more to worry about than
just the capacity of the characteristic.
A much more useful measure is the precision, which can be ex-
pressed in terms of the smallest number that can be added to
1. without loss of significance. We calculate that here, for
float and double. */
#ifndef NO_FLOATS
one = 1.;
delta = 1.;
temp = 0.;
while(temp != one) {
temp = one+delta;
delta = delta/2.;
}
pd0->fprec = delta * 4.;
oned = 1.;
delta = 1.;
tempd = 0.;
while(tempd != oned) {
tempd = oned+delta;
delta = delta/2.;
}
pd0->dprec = delta * 4.;
#endif
/* Now, if anyone's interested, we publish the results. */
#ifndef CQ26_INCLUDED
if(pd0->flgm != 0) {
printf(s,pd0->cbits,"char");
printf(s,pd0->ibits,"int");
printf(s,pd0->sbits,"short");
printf(s,pd0->lbits,"long");
printf(s,pd0->ubits,"unsigned");
printf(s,pd0->fbits,"float");
printf(s,pd0->dbits,"double");
#ifndef NO_FLOATS
printf(s2,pd0->fprec,"float");
printf(s2,pd0->dprec,"double");
#else
printf("NO_FLOATS\n");
#endif
}
#endif
/* Since we are only exploring and perhaps reporting, but not
testing any features, we cannot return an error code. */
return 0;
}
int extvar; int extvar;
@ -125,10 +244,13 @@ implementation */
target = ~0U; target = ~0U;
mask = 1; mask = 1;
printf("sizeof target: %08x pd0->cbits: %08x\n", sizeof target, pd0->cbits);
printf("mask: %08x target: %08x\n", mask, target);
for(j=0; j<(sizeof target)*pd0->cbits; j++){ for(j=0; j<(sizeof target)*pd0->cbits; j++){
mask = mask&target; mask = mask&target;
target = target>>1; target = target>>1;
printf("mask: %08x target: %08x\n", mask, target);
} }
if(mask != 1 || target != 0){ if(mask != 1 || target != 0){
@ -200,11 +322,12 @@ setev(){
int section(int j,void* pd0){ int section(int j,void* pd0){
#endif #endif
switch(j){ switch(j){
case 0: return s4(pd0); case 0: return s26(pd0);
case 1: return s4(pd0);
} }
} }
#define cq_sections 1 #define cq_sections 2
/* /*
C REFERENCE MANUAL (main) C REFERENCE MANUAL (main)

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
/*include "cq26.c"*/ /* hardware check */ /*include "cq26.c"*/ /* hardware check */
struct defs { struct defs {

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */

View file

@ -4,6 +4,8 @@
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC !!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/ */
#include "common.h"
struct defs { struct defs {
int cbits; /* No. of bits per char */ int cbits; /* No. of bits per char */
int ibits; /* int */ int ibits; /* int */