(Message inbox:25) Date: Tue, 29 Aug 89 18:57:48 pst From: few@quad1.quad.com (Frank Whaley) Subject: Re: flex 2.1 for Turbo C To: vern@cs.cornell.edu > Sorry it's taken me so long to get back to you - I've been out of touch > for about the last month. I didn't expect to hear from you soon -- hope your journey was nice. > I'd like to have your 'adjustments' for Turbo C, so if you still have > them lying conveniently around, please mail them to me. Thanks. After a little more fiddling, the changes are relatively small. Probably the largest problem is that Turbo C does not yet claim to adhere to the draft standard, so even though they support many "modern" constructs, they still are not __STDC__. Thus the diffs from flex.skl (note the name): 62c62 < #if defined(__STDC__) || defined(__TURBOC__) --- > #ifdef __STDC__ 104c104 < #if !(defined(__STDC__) || defined(__TURBOC__)) --- > #ifndef __STDC__ 134c134 < #if defined(__STDC__) || defined(__TURBOC__) --- > #ifdef __STDC__ 390c390 < #if defined(__STDC__) || defined(__TURBOC__) --- > #ifdef __STDC__ 482c482 < #if defined(__STDC__) || defined(__TURBOC__) --- > #ifdef __STDC__ and initscan.c: 63c63 < #if defined(__STDC__) || defined(__TURBOC__) --- > #ifdef __STDC__ 105c105 < #if !(defined(__STDC__) || defined(__TURBOC__)) --- > #ifndef __STDC__ 677c677 < #if defined(__STDC__) || defined(__TURBOC__) --- > #ifdef __STDC__ 1658c1658 < #if defined(__STDC__) || defined(__TURBOC__) --- > #ifdef __STDC__ 1750c1750 < #if defined(__STDC__) || defined(__TURBOC__) --- > #ifdef __STDC__ are pretty simple. BTW, simply adding -D__STDC__=1 to CFLAGS works, but __STDC__ is used in many Turbo C header files, and can confuse things. It would also mean that all flex-generated code must be compiled with that flag. flexdef.h also had one small problem: 44,46c44 < #ifndef MS_DOS < char *memset(); /* should be declared in string.h */ < #endif --- > char *memset(); as the Turbo C definiton of memset() is: void *memset(void *s, int c, size_t n); The 128-byte command line limit of MS-DOS prevents us from using tcc to link the objects together, so I provide a tlink script, flex.lnk: ----- \turboc\lib\c0l+ ccl+ dfa+ ecs+ gen+ main+ misc+ nfa+ parse+ scan+ sym+ tblcmp+ yylex flex.exe \turboc\lib\cl ----- The blank line is required. The makefile needed a lot of hacking, so here it is in its entirety. I don't think it is completely finished, but I'll be happy to work on it more if you'd like. Some of the changes are specific to my environment (my yacc outputs ytab.c and ytab.h) and most MS-DOS people won't have cp, mv and rm. Some people like separate makefiles for different systems, but we like one makefile with obscene parameterization. I should note that all of my experiments with FLEX_FLAGS=-{c,f,F,e} have failed, mostly due to scan.c becoming too large to be a single module. Damn toy operating system. ----- # make file for "flex" tool # @(#) $Header: Makefile,v 2.3 89/06/20 17:27:12 vern Exp $ (LBL) # Porting considerations: # # For BSD machines: # CFLAGS = # LDFLAGS = -s # LINK = $(CC) $(CFLAGS) -o flex $(LDFLAGS) $(FLEXOBJS) # SKELETON_DIR = . # SKELETON_FILE = flex.skel # SKELFLAGS = -DDEFAULT_SKELETON_FILE=\"$(SKELETON_DIR)/$(SKELETON_FILE)\" # O = o # YTAB = y.tab # FLEX = ./flex # # For System V Unix or Vax/VMS machines, merely add: # CFLAGS = -DSYS_V # # For MS-DOS, Turbo C: CC = tcc CFLAGS = -DSYS_V -DMS_DOS -O -G -Z -ml -v LINK = tlink @flex.lnk/c/x/v SKELETON_DIR = . SKELETON_FILE = flex.skl SKELFLAGS = -DDEFAULT_SKELETON_FILE="$(SKELETON_DIR)/$(SKELETON_FILE)" O = obj EXE = .exe YTAB = ytab FLEX = flex # # the first time around use "make first_flex" # FLEX_FLAGS = FLEXOBJS = \ ccl.$O \ dfa.$O \ ecs.$O \ gen.$O \ main.$O \ misc.$O \ nfa.$O \ parse.$O \ scan.$O \ sym.$O \ tblcmp.$O \ yylex.$O FLEX_C_SOURCES = \ ccl.c \ dfa.c \ ecs.c \ gen.c \ main.c \ misc.c \ nfa.c \ parse.c \ scan.c \ sym.c \ tblcmp.c \ yylex.c flex$(EXE): $(FLEXOBJS) $(LINK) first_flex: cp initscan.c scan.c $(MAKE) flex$(EXE) parse.h parse.c: parse.y $(YACC) -d parse.y @mv $(YTAB).c parse.c @mv $(YTAB).h parse.h scan.c: scan.l $(FLEX) -ist $(FLEX_FLAGS) scan.l >scan.c scan.$O: scan.c parse.h main.$O: main.c $(CC) $(CFLAGS) -c $(SKELFLAGS) main.c flex.man: flex.1 nroff -man flex.1 >flex.man lint: $(FLEX_C_SOURCES) lint $(FLEX_C_SOURCES) > flex.lint distrib: mv scan.c initscan.c chmod 444 initscan.c $(MAKE) clean clean: rm -f core errs flex *.$O parse.c *.lint parse.h flex.man tags tags: ctags $(FLEX_C_SOURCES) vms: flex.man $(MAKE) distrib test: $(FLEX) -ist $(FLEX_FLAGS) scan.l | diff scan.c - ----- BTW, thanks for a great tool. Frank Whaley Senior Development Engineer Quadratron Systems Incorporated few@quad1.quad.com uunet!ccicpg!quad1!few (Message inbox:8) Date: Thu, 31 Aug 89 14:57:36 pst From: few@quad1.quad.com (Frank Whaley) Subject: Re: flex 2.1 for Turbo C To: vern@cs.cornell.edu > Thanks for the diffs and Makefile. I'll endeavor to integrate them > into the next release. One terribly important thing I forgot -- Turbo C (and most MS-DOS C compilers) provide only a 4K default stack. Not having thoroughly tested flex, I can't say that this is enough. The makefile I provided to you builds a version without stack checking code. I would suggest adding "-N" to CFLAGS, which will include some simple stack overflow checking code. You may wish to include the following lines to main.c: #ifdef __TURBOC__ unsigned _stklen = 16384; /* some reasonably large number */ #endif In addition, the flags in the makefile build a version with symbols for Turbo Debugger (like -g). You may wan't to leave these flags off (remove "-v" from CFLAGS and "/v" from LINK) or you may wish to provide an "install" target like so: BINDIR = {/usr/local/bin | c:\bin} STRIP = {strip | tdstrip} install: flex$(EXE) $(CP) flex$(EXE) $(BINDIR) $(STRIP) $(BINDIR)/flex$(EXE) Regards, few few@quad1.quad.com uunet!ccicpg!quad1!few