diff -c ../Makefile ./Makefile
*** ../Makefile	Thu Jun 28 00:44:07 1990
--- ./Makefile	Mon Jul 16 13:57:26 1990
***************
*** 39,49 ****
  # AUXDIR, manual pages will be installed in MANDIR with extension MANEXT.
  # Raw, unformatted troff source will be installed if INSTALLMAN=man, nroff
  # preformatted versions will be installed if INSTALLMAN=cat.
! DESTDIR =
  BINDIR = /usr/local
  LIBDIR = /usr/local/lib
  AUXDIR = /usr/local/lib
  MANDIR = /usr/man/manl
  MANEXT = l
  INSTALLMAN = man
  
--- 39,50 ----
  # AUXDIR, manual pages will be installed in MANDIR with extension MANEXT.
  # Raw, unformatted troff source will be installed if INSTALLMAN=man, nroff
  # preformatted versions will be installed if INSTALLMAN=cat.
! DESTDIR = /projects/m751stereo/code/c/swl26
  BINDIR = /usr/local
  LIBDIR = /usr/local/lib
  AUXDIR = /usr/local/lib
  MANDIR = /usr/man/manl
+ INCLUDEDIR = .
  MANEXT = l
  INSTALLMAN = man
  
***************
*** 52,58 ****
  
  SKELETON_FILE = $(DESTDIR)$(AUXDIR)/flex.skel
  SKELFLAGS = -DDEFAULT_SKELETON_FILE=\"$(SKELETON_FILE)\"
! CFLAGS = -O
  LDFLAGS = -s
  
  COMPRESSION =
--- 53,59 ----
  
  SKELETON_FILE = $(DESTDIR)$(AUXDIR)/flex.skel
  SKELFLAGS = -DDEFAULT_SKELETON_FILE=\"$(SKELETON_FILE)\"
! CFLAGS = -O -DUSG -I$(INCLUDEDIR)
  LDFLAGS = -s
  
  COMPRESSION =
diff -c ../ccl.c ./ccl.c
*** ../ccl.c	Thu Jun 28 00:44:07 1990
--- ./ccl.c	Mon Jul 16 13:57:27 1990
***************
*** 28,37 ****
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/ccl.c,v 2.5 90/06/27 23:48:13 vern Exp $ (LBL)";
  #endif
  
! #include "flexdef.h"
  
  /* ccladd - add a single character to a ccl
   *
--- 28,37 ----
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: ccl.c,v 2.5 90/06/27 23:48:13 vern Exp $ (LBL)";
  #endif
  
! #include <flexdef.h>
  
  /* ccladd - add a single character to a ccl
   *
diff -c ../dfa.c ./dfa.c
*** ../dfa.c	Thu Jun 28 00:44:08 1990
--- ./dfa.c	Mon Jul 16 13:57:28 1990
***************
*** 28,37 ****
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/dfa.c,v 2.7 90/06/27 23:48:15 vern Exp $ (LBL)";
  #endif
  
! #include "flexdef.h"
  
  
  /* declare functions that have forward references */
--- 28,38 ----
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: dfa.c,v 2.7 90/06/27 23:48:15 vern Exp $ (LBL)";
  #endif
  
! #include <flexdef.h>
! #include <ctype.h>
  
  
  /* declare functions that have forward references */
***************
*** 682,688 ****
  	    register int j;
  
  	    for ( i = 'A', j = 'a'; i <= 'Z'; ++i, ++j )
! 		state[i] = state[j];
  	    }
  
  	if ( ds > num_start_states )
--- 683,692 ----
  	    register int j;
  
  	    for ( i = 'A', j = 'a'; i <= 'Z'; ++i, ++j )
! 		{
! 		if (isupper(i) )
! 		   state[i] = state[j];
! 		}
  	    }
  
  	if ( ds > num_start_states )
***************
*** 958,964 ****
  		    }
  	    }
  
! 	else if ( sym >= 'A' && sym <= 'Z' && caseins )
  	    flexfatal( "consistency check failed in symfollowset" );
  
  	else if ( sym == SYM_EPSILON )
--- 962,968 ----
  		    }
  	    }
  
! 	else if ( isupper ( sym ) && caseins )
  	    flexfatal( "consistency check failed in symfollowset" );
  
  	else if ( sym == SYM_EPSILON )
Only in .: diffs
Only in .: diffs.new
diff -c ../ecs.c ./ecs.c
*** ../ecs.c	Thu Jun 28 00:44:08 1990
--- ./ecs.c	Mon Jul 16 13:57:28 1990
***************
*** 28,37 ****
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/ecs.c,v 2.5 90/06/27 23:48:17 vern Exp $ (LBL)";
  #endif
  
! #include "flexdef.h"
  
  /* ccl2ecl - convert character classes to set of equivalence classes
   *
--- 28,37 ----
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: ecs.c,v 2.5 90/06/27 23:48:17 vern Exp $ (LBL)";
  #endif
  
! #include <flexdef.h>
  
  /* ccl2ecl - convert character classes to set of equivalence classes
   *
diff -c ../flex.skel ./flex.skel
*** ../flex.skel	Thu Jun 28 00:44:27 1990
--- ./flex.skel	Mon Jul 16 13:57:29 1990
***************
*** 1,7 ****
  /* A lexical scanner generated by flex */
  
  /* scanner skeleton version:
!  * $Header: /usr/fsys/odin/a/vern/flex/RCS/flex.skel,v 2.13 90/05/26 17:24:13 vern Exp $
   */
  
  #define FLEX_SCANNER
--- 1,7 ----
  /* A lexical scanner generated by flex */
  
  /* scanner skeleton version:
!  * $Header: flex.skel,v 2.13 90/05/26 17:24:13 vern Exp $
   */
  
  #define FLEX_SCANNER
diff -c ../flexdef.h ./flexdef.h
*** ../flexdef.h	Thu Jun 28 00:44:27 1990
--- ./flexdef.h	Mon Jul 16 13:57:30 1990
***************
*** 26,32 ****
   * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   */
  
! /* @(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/flexdef.h,v 2.7 90/06/27 23:48:19 vern Exp $ (LBL) */
  
  #ifndef FILE
  #include <stdio.h>
--- 26,32 ----
   * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   */
  
! /* @(#) $Header: flexdef.h,v 2.7 90/06/27 23:48:19 vern Exp $ (LBL) */
  
  #ifndef FILE
  #include <stdio.h>
***************
*** 45,51 ****
  
  /* size of input alphabet - should be size of ASCII set */
  #ifndef DEFAULT_CSIZE
! #define DEFAULT_CSIZE 128
  #endif
  
  #ifndef PROTO
--- 45,51 ----
  
  /* size of input alphabet - should be size of ASCII set */
  #ifndef DEFAULT_CSIZE
! #define DEFAULT_CSIZE 256
  #endif
  
  #ifndef PROTO
***************
*** 90,96 ****
--- 90,98 ----
  #define SHORT_FILE_NAMES
  #endif
  
+ #ifndef OSVS
  char *malloc(), *realloc();
+ #endif
  
  
  /* maximum line length we'll have to deal with */
***************
*** 116,125 ****
  #define true 1
  #define false 0
  
- 
  #ifndef DEFAULT_SKELETON_FILE
  #define DEFAULT_SKELETON_FILE "flex.skel"
! #endif
  
  /* special chk[] values marking the slots taking by end-of-buffer and action
   * numbers
--- 118,132 ----
  #define true 1
  #define false 0
  
  #ifndef DEFAULT_SKELETON_FILE
+ #ifdef OSVS
+ #define DEFAULT_SKELETON_FILE "ctri01"
+ #define SYSUT1	"sysut1" 
+ #define SYSUT2	"sysut2" 
+ #else
  #define DEFAULT_SKELETON_FILE "flex.skel"
! #endif /* OSVS */
! #endif /* DEFAULT_SKELETON_FILE */
  
  /* special chk[] values marking the slots taking by end-of-buffer and action
   * numbers
***************
*** 226,233 ****
  #define INITIAL_MAX_SCS 40	/* maximum number of start conditions */
  #define MAX_SCS_INCREMENT 40	/* amount to bump by if it's not enough */
  
! #define ONE_STACK_SIZE 500	/* stack of states with only one out-transition */
! #define SAME_TRANS -1	/* transition is the same as "default" entry for state */
  
  /* the following percentages are used to tune table compression:
  
--- 233,240 ----
  #define INITIAL_MAX_SCS 40	/* maximum number of start conditions */
  #define MAX_SCS_INCREMENT 40	/* amount to bump by if it's not enough */
  
! #define ONE_STACK_SIZE 500  /*stack of states with only one out-transition*/
! #define SAME_TRANS -1 /*transition is the same as "default" entry for state */
  
  /* the following percentages are used to tune table compression:
  
diff -c ../gen.c ./gen.c
*** ../gen.c	Thu Jun 28 00:44:28 1990
--- ./gen.c	Mon Jul 16 13:57:32 1990
***************
*** 28,37 ****
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/gen.c,v 2.9 90/06/27 23:48:22 vern Exp $ (LBL)";
  #endif
  
! #include "flexdef.h"
  
  
  /* declare functions that have forward references */
--- 28,37 ----
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: gen.c,v 2.9 90/06/27 23:48:22 vern Exp $ (LBL)";
  #endif
  
! #include <flexdef.h>
  
  
  /* declare functions that have forward references */
***************
*** 292,298 ****
  
  	indent_puts( "{" );
  
! 	indent_puts( "if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] )" );
  	indent_up();
  	indent_puts( "{" );
  	indent_puts( "yy_act = yy_acclist[yy_lp];" );
--- 292,298 ----
  
  	indent_puts( "{" );
  
! 	indent_puts("if( yy_lp && yy_lp < yy_accept[yy_current_state + 1] )");
  	indent_up();
  	indent_puts( "{" );
  	indent_puts( "yy_act = yy_acclist[yy_lp];" );
diff -c ../initscan.c ./initscan.c
*** ../initscan.c	Thu Jun 28 00:44:51 1990
--- ./initscan.c	Mon Jul 16 13:57:33 1990
***************
*** 1,7 ****
  /* A lexical scanner generated by flex */
  
  /* scanner skeleton version:
!  * $Header: /usr/fsys/odin/a/vern/flex/RCS/flex.skel,v 2.13 90/05/26 17:24:13 vern Exp $
   */
  
  #define FLEX_SCANNER
--- 1,7 ----
  /* A lexical scanner generated by flex */
  
  /* scanner skeleton version:
!  * $Header: flex.skel,v 2.13 90/05/26 17:24:13 vern Exp $
   */
  
  #define FLEX_SCANNER
***************
*** 193,199 ****
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/scan.l,v 2.9 90/06/27 23:48:34 vern Exp $ (LBL)";
  #endif
  
  #undef yywrap
--- 193,199 ----
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: scan.l,v 2.9 90/06/27 23:48:34 vern Exp $ (LBL)";
  #endif
  
  #undef yywrap
diff -c ../libmain.c ./libmain.c
*** ../libmain.c	Thu Jun 28 00:44:28 1990
--- ./libmain.c	Mon Jul 16 13:57:34 1990
***************
*** 1,6 ****
  /* libmain - flex run-time support library "main" function */
  
! /* $Header: /usr/fsys/odin/a/vern/flex/RCS/libmain.c,v 1.2 90/05/26 16:50:08 vern Exp $ */
  
  extern int yylex();
  
--- 1,6 ----
  /* libmain - flex run-time support library "main" function */
  
! /* $Header: libmain.c,v 1.2 90/05/26 16:50:08 vern Exp $ */
  
  extern int yylex();
  
diff -c ../main.c ./main.c
*** ../main.c	Thu Jun 28 00:44:29 1990
--- ./main.c	Mon Jul 16 13:57:34 1990
***************
*** 34,44 ****
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/main.c,v 2.9 90/06/27 23:48:24 vern Exp $ (LBL)";
  #endif
  
  
! #include "flexdef.h"
  
  static char flex_version[] = "2.3";
  
--- 34,44 ----
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: main.c,v 2.9 90/06/27 23:48:24 vern Exp $ (LBL)";
  #endif
  
  
! #include <flexdef.h>
  
  static char flex_version[] = "2.3";
  
***************
*** 97,106 ****
  char *program_name;
  
  #ifndef SHORT_FILE_NAMES
  static char *outfile = "lex.yy.c";
! #else
  static char *outfile = "lexyy.c";
! #endif
  static int outfile_created = 0;
  static int use_stdout;
  static char *skelname = NULL;
--- 97,110 ----
  char *program_name;
  
  #ifndef SHORT_FILE_NAMES
+ #ifdef OSVS
+ static char *outfile = "ctro01";
+ #else	/* not OSVS */
  static char *outfile = "lex.yy.c";
! #endif  /* not OSVS */
! #else  /* SHORT_FILE_NAMES */
  static char *outfile = "lexyy.c";
! #endif  /* SHORT_FILE_NAMES */
  static int outfile_created = 0;
  static int use_stdout;
  static char *skelname = NULL;
***************
*** 209,216 ****
--- 213,222 ----
  	else if ( fclose( temp_action_file ) )
  	    flexfatal( "error occurred when closing temporary action file" );
  
+ #ifndef OSVS
  	else if ( unlink( action_file_name ) )
  	    flexfatal( "error occurred when deleting temporary action file" );
+ #endif
  	}
  
      if ( status != 0 && outfile_created )
***************
*** 221,228 ****
--- 227,236 ----
  	else if ( fclose( stdout ) )
  	    flexfatal( "error occurred when closing output file" );
  
+ #ifndef OSVS
  	else if ( unlink( outfile ) )
  	    flexfatal( "error occurred when deleting output file" );
+ #endif
  	}
  
      if ( backtrack_report && backtrack_file )
***************
*** 574,583 ****
      if ( backtrack_report )
  	{
  #ifndef SHORT_FILE_NAMES
  	backtrack_file = fopen( "lex.backtrack", "w" );
! #else
  	backtrack_file = fopen( "lex.bck", "w" );
! #endif
  
  	if ( backtrack_file == NULL )
  	    flexerror( "could not create lex.backtrack" );
--- 582,595 ----
      if ( backtrack_report )
  	{
  #ifndef SHORT_FILE_NAMES
+ #ifdef OSVS
+ 	backtrack_file = fopen( SYSUT2, "w");
+ #else   /* not OSVS */
  	backtrack_file = fopen( "lex.backtrack", "w" );
! #endif	/* OSVS */
! #else   /* SHORT_FILE_NAMES  */
  	backtrack_file = fopen( "lex.bck", "w" );
! #endif  /* SHORT_FILE_NAMES */
  
  	if ( backtrack_file == NULL )
  	    flexerror( "could not create lex.backtrack" );
***************
*** 597,604 ****
  	lerrsf( "can't open skeleton file %s", skelname );
  
  #ifdef SYS_V
      action_file_name = tmpnam( NULL );
! #endif
  
      if ( action_file_name == NULL )
  	{
--- 609,620 ----
  	lerrsf( "can't open skeleton file %s", skelname );
  
  #ifdef SYS_V
+ #ifndef OSVS
      action_file_name = tmpnam( NULL );
! #else	/* OSVS */
!     action_file_name = SYSUT1;
! #endif	/* OSVS */
! #endif	/* SYS_V */
  
      if ( action_file_name == NULL )
  	{
***************
*** 609,615 ****
--- 625,636 ----
  #else
  	(void) strcpy( temp_action_file_name, "flexXXXXXX.tmp" );
  #endif
+ #ifndef OSVS
  	(void) mktemp( temp_action_file_name );
+ #else	/* OSVS */
+ 	/* should never be executed in OSVS as IF should always be false  */
+ 	(void) strcpy( temp_action_file_name, SYSUT1 ) ;
+ #endif  /* OSVS */
  
  	action_file_name = temp_action_file_name;
  	}
diff -c ../misc.c ./misc.c
*** ../misc.c	Thu Jun 28 00:44:40 1990
--- ./misc.c	Mon Jul 16 13:57:35 1990
***************
*** 28,38 ****
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/misc.c,v 2.7 90/06/27 23:48:27 vern Exp $ (LBL)";
  #endif
  
  #include <ctype.h>
! #include "flexdef.h"
  
  
  /* ANSI C does not guarantee that isascii() is defined */
--- 28,38 ----
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: misc.c,v 2.7 90/06/27 23:48:27 vern Exp $ (LBL)";
  #endif
  
  #include <ctype.h>
! #include <flexdef.h>
  
  
  /* ANSI C does not guarantee that isascii() is defined */
***************
*** 107,113 ****
--- 107,117 ----
      {
      while ( *str )
  	{
+ #ifdef OSVS
+ 	if ( ! islower( *str ) )
+ #else
  	if ( ! isascii( *str ) || ! islower( *str ) )
+ #endif
  	    return ( 0 );
  	++str;
  	}
***************
*** 130,136 ****
--- 134,144 ----
      {
      while ( *str )
  	{
+ #ifdef OSVS
+ 	if ( ! isupper( (char) *str ) )
+ #else
  	if ( ! isascii( *str ) || ! isupper( (char) *str ) )
+ #endif
  	    return ( 0 );
  	++str;
  	}
***************
*** 182,188 ****
--- 190,200 ----
  register int c;
  
      {
+ #ifdef OSVS
+     return ( isupper( c ) ? (Char) tolower( c ) : (Char) c );
+ #else
      return ( (isascii( c ) && isupper( c )) ? tolower( c ) : c );
+ #endif
      }
  
  
***************
*** 204,210 ****
      for ( c = str; *c; ++c )
  	;
  
!     copy = malloc( (unsigned) ((c - str + 1) * sizeof( char )) );
  
      if ( copy == NULL )
  	flexfatal( "dynamic memory failure in copy_string()" );
--- 216,222 ----
      for ( c = str; *c; ++c )
  	;
  
!     copy = (char *) malloc( (unsigned) ((c - str + 1) * sizeof( char )) );
  
      if ( copy == NULL )
  	flexfatal( "dynamic memory failure in copy_string()" );
***************
*** 392,403 ****
--- 404,421 ----
  
  #ifndef MS_DOS
  #ifndef VMS
+ #ifndef OSVS
  #include <sys/types.h>
+ #endif  /* OSVS */
  #else
  #include <types.h>
  #endif
  #endif
  
+ #ifdef OSVS
+ #include <time.h>
+ #endif /* OSVS */
+ 
  #ifdef MS_DOS
  #include <time.h>
  typedef long time_t;
***************
*** 615,621 ****
--- 633,643 ----
  	    if ( array[1] == 'x' )
  		++sptr;
  
+ #ifdef OSVS
+ 	    while ( isdigit( array[sptr] ) )
+ #else
  	    while ( isascii( array[sptr] ) && isdigit( array[sptr] ) )
+ #endif
  		/* don't increment inside loop control because if
  		 * isdigit() is a macro it will expand it to two
  		 * increments ...
Only in ..: new
diff -c ../nfa.c ./nfa.c
*** ../nfa.c	Thu Jun 28 00:44:40 1990
--- ./nfa.c	Mon Jul 16 13:57:36 1990
***************
*** 28,37 ****
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/nfa.c,v 2.6 90/06/27 23:48:29 vern Exp $ (LBL)";
  #endif
  
! #include "flexdef.h"
  
  
  /* declare functions that have forward references */
--- 28,37 ----
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: nfa.c,v 2.6 90/06/27 23:48:29 vern Exp $ (LBL)";
  #endif
  
! #include <flexdef.h>
  
  
  /* declare functions that have forward references */
***************
*** 110,116 ****
      {
      int sym, tsp1, tsp2, anum, ns;
  
!     fprintf( stderr, "\n\n********** beginning dump of nfa with start state %d\n",
  	     state1 );
  
      /* we probably should loop starting at firstst[state1] and going to
--- 110,116 ----
      {
      int sym, tsp1, tsp2, anum, ns;
  
!     fprintf(stderr,"\n\n********* beginning dump of nfa with start state %d\n",
  	     state1 );
  
      /* we probably should loop starting at firstst[state1] and going to
diff -c ../parse.y ./parse.y
*** ../parse.y	Thu Jun 28 00:44:40 1990
--- ./parse.y	Mon Jul 16 13:57:36 1990
***************
*** 32,45 ****
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/parse.y,v 2.7 90/06/27 23:48:31 vern Exp $ (LBL)";
  #endif
  
! #include "flexdef.h"
  
  int pat, scnum, eps, headcnt, trailcnt, anyccl, lastchar, i, actvp, rulelen;
  int trlcontxt, xcluflg, cclsorted, varlength, variable_trail_rule;
  Char clower();
  
  static int madeany = false;  /* whether we've made the '.' character class */
  int previous_continued_action;	/* whether the previous rule's action was '|' */
--- 32,47 ----
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: parse.y,v 2.7 90/06/27 23:48:31 vern Exp $ (LBL)";
  #endif
  
! #include <flexdef.h>
  
  int pat, scnum, eps, headcnt, trailcnt, anyccl, lastchar, i, actvp, rulelen;
  int trlcontxt, xcluflg, cclsorted, varlength, variable_trail_rule;
  Char clower();
+ void build_eof_action();
+ void yyerror();
  
  static int madeany = false;  /* whether we've made the '.' character class */
  int previous_continued_action;	/* whether the previous rule's action was '|' */
diff -c ../scan.l ./scan.l
*** ../scan.l	Thu Jun 28 00:44:41 1990
--- ./scan.l	Mon Jul 16 13:57:37 1990
***************
*** 30,42 ****
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/scan.l,v 2.9 90/06/27 23:48:34 vern Exp $ (LBL)";
  #endif
  
  #undef yywrap
  
! #include "flexdef.h"
! #include "parse.h"
  
  #define ACTION_ECHO fprintf( temp_action_file, "%s", yytext )
  #define MARK_END_OF_PROLOG fprintf( temp_action_file, "%%%% end of prolog\n" );
--- 30,42 ----
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: scan.l,v 2.9 90/06/27 23:48:34 vern Exp $ (LBL)";
  #endif
  
  #undef yywrap
  
! #include <flexdef.h>
! #include <parse.h>
  
  #define ACTION_ECHO fprintf( temp_action_file, "%s", yytext )
  #define MARK_END_OF_PROLOG fprintf( temp_action_file, "%%%% end of prolog\n" );
diff -c ../sym.c ./sym.c
*** ../sym.c	Thu Jun 28 00:44:41 1990
--- ./sym.c	Mon Jul 16 13:57:37 1990
***************
*** 28,37 ****
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/sym.c,v 2.4 90/06/27 23:48:36 vern Exp $ (LBL)";
  #endif
  
! #include "flexdef.h"
  
  
  /* declare functions that have forward references */
--- 28,37 ----
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: sym.c,v 2.4 90/06/27 23:48:36 vern Exp $ (LBL)";
  #endif
  
! #include <flexdef.h>
  
  
  /* declare functions that have forward references */
diff -c ../tblcmp.c ./tblcmp.c
*** ../tblcmp.c	Thu Jun 28 00:44:41 1990
--- ./tblcmp.c	Mon Jul 16 13:57:38 1990
***************
*** 28,37 ****
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/tblcmp.c,v 2.5 90/06/27 23:48:38 vern Exp $ (LBL)";
  #endif
  
! #include "flexdef.h"
  
  
  /* declarations for functions that have forward references */
--- 28,37 ----
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: tblcmp.c,v 2.5 90/06/27 23:48:38 vern Exp $ (LBL)";
  #endif
  
! #include <flexdef.h>
  
  
  /* declarations for functions that have forward references */
diff -c ../yylex.c ./yylex.c
*** ../yylex.c	Thu Jun 28 00:44:41 1990
--- ./yylex.c	Mon Jul 16 13:57:38 1990
***************
*** 28,39 ****
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/yylex.c,v 2.5 90/06/27 23:48:40 vern Exp $ (LBL)";
  #endif
  
  #include <ctype.h>
! #include "flexdef.h"
! #include "parse.h"
  
  
  /* ANSI C does not guarantee that isascii() is defined */
--- 28,39 ----
  
  #ifndef lint
  static char rcsid[] =
!     "@(#) $Header: yylex.c,v 2.5 90/06/27 23:48:40 vern Exp $ (LBL)";
  #endif
  
  #include <ctype.h>
! #include <flexdef.h>
! #include <parse.h>
  
  
  /* ANSI C does not guarantee that isascii() is defined */
***************
*** 180,186 ****
--- 180,190 ----
  			break;
  
  		    default:
+ #ifdef OSVS
+ 			if ( ! isprint( yylval ) )
+ #else
  			if ( ! isascii( yylval ) || ! isprint( yylval ) )
+ #endif
  			    fprintf( stderr, "\\%.3o", yylval );
  			else
  			    (void) putc( yylval, stderr );
