[sub.sources.os9] v02i001: Diffs for 8 bit less under OSK

fkk@stasys.sta.sub.org (Frank Kaefer) (11/11/90)

Posting-number: Volume 2, Issue 1
Submitted-by: ud@nitmar.ddt.sub.org (Ulrich Dessauer)
Archive-name: less8bit.diff

[	hier sind die Diffs fuer den Less der TOP 2 Release, um ihn
auf 8 Bit "aufzubohren". Damit ist es moeglich Files mit Umlauten
und anderen 8 Bit Zeichen mittels Less anzuschauen.  - ud ]

[	these are the diffs for less (from the TOP release 2) to
add the capability to display 8 bit characters. - fkk ]

-----------------------------------------------------------------------cut here
diff -c /dd/X/LESS/ch.c ./ch.c
*** /dd/X/LESS/ch.c	Thu Dec  1 12:40:00 1988
--- ./ch.c	Wed May 23 13:50:00 1990
***************
*** 178,184 ****
--- 178,188 ----
  		p = &bp->data[bp->datasize];
  		while (--n >= 0)
  		{
+ #ifndef	OSK
  			*--p &= 0177;
+ #else	OSK
+ 			--p;
+ #endif	OSK
  			if (*p == EOI)
  				*p = '@';
  		}
Only in .: ch.r
Only in .: command.r
Only in .: decode.r
Only in .: help.r
diff -c /dd/X/LESS/input.c ./input.c
*** /dd/X/LESS/input.c	Fri May 20 15:10:00 1988
--- ./input.c	Wed May 23 16:05:00 1990
***************
*** 12,18 ****
--- 12,22 ----
  
  extern int squeeze;
  extern int sigs;
+ #ifndef	LANG
  extern char *line;
+ #else	LANG
+ extern ltype *line;
+ #endif	LANG
  
  /*
   * Get the next line.
***************
*** 66,72 ****
--- 70,80 ----
  	}
  	(void) pappend('\0');
  
+ #ifndef	LANG
  	if (squeeze && *line == '\0')
+ #else	LANG
+ 	if (squeeze && *line == 0)
+ #endif	LANG
  	{
  		/*
  		 * This line is blank.
Only in .: input.r
diff -c /dd/X/LESS/less.h ./less.h
*** /dd/X/LESS/less.h	Sat May 21 11:15:00 1988
--- ./less.h	Wed May 23 15:52:00 1990
***************
*** 59,68 ****
--- 59,76 ----
  #define	BS_CONTROL	2	/* \b treated as control char; prints as ^H */
  
  /* Special chars used to tell put_line() to do something special */
+ #ifndef	LANG
  #define	UL_CHAR		(unsigned) 0201	/* Enter underline mode */
  #define	UE_CHAR		(unsigned) 0202	/* Exit underline mode */
  #define	BO_CHAR		(unsigned) 0203	/* Enter boldface mode */
  #define	BE_CHAR		(unsigned) 0204	/* Exit boldface mode */
+ #else	LANG
+ typedef unsigned short ltype;
+ #define	UL_CHAR		(ltype) 0601
+ #define	UE_CHAR		(ltype) 0602
+ #define	BO_CHAR		(ltype) 0603
+ #define	BE_CHAR		(ltype) 0604
+ #endif	LANG
  
  #define	CONTROL(c)		((c)&037)
  #define	SIGNAL(sig,func)	signal(sig,func)
diff -c /dd/X/LESS/line.c ./line.c
*** /dd/X/LESS/line.c	Thu Dec  1 12:38:00 1988
--- ./line.c	Thu May 24 13:34:00 1990
***************
*** 7,14 ****
--- 7,19 ----
  
  #include "less.h"
  
+ #ifndef	LANG
  static char linebuf[1024];	/* Buffer which holds the current output line */
  static char *curr;		/* Pointer into linebuf */
+ #else	LANG
+ static ltype linebuf[1024];
+ static ltype *curr;
+ #endif	LANG
  static int column;		/* Printable length, accounting for
  				   backspaces, etc. */
  /*
***************
*** 47,54 ****
--- 52,63 ----
  #define	LN_BO_X		5	/* In boldface, got char, need \b */
  #define	LN_BO_XB	6	/* In boldface, got char & \b, need same char */
  
+ #ifndef	LANG
  public char *line;		/* Pointer to the current line.
  				   Usually points to linebuf. */
+ #else	LANG
+ public ltype *line;
+ #endif	LANG
  
  extern int bs_mode;
  extern int tabstop;
***************
*** 80,85 ****
--- 89,99 ----
  pappend(c)
  	int c;
  {
+ #ifdef	LANG
+ 	while (c < 0)
+ 		c += 256;
+ #endif	LANG
+ 
  	if (c == '\0')
  	{
  		/*
***************
*** 108,118 ****
--- 122,140 ----
  			break;
  		}
  		ln_state = LN_NORMAL;
+ #ifndef	LANG
  		*curr = '\0';
+ #else	LANG
+ 		*curr = 0;
+ #endif	LANG
  		return (0);
  	}
  
+ #ifndef	LANG
  	if (curr > linebuf + sizeof(linebuf) - 12)
+ #else	LANG
+ 	if (curr > linebuf + sizeof(linebuf) - (12 * sizeof (ltype)))
+ #endif	LANG
  		/*
  		 * Almost out of room in the line buffer.
  		 * Don't take any chances.
***************
*** 130,141 ****
--- 152,175 ----
  		switch (ln_state)
  		{
  		case LN_NORMAL:
+ #ifndef	LANG
  			if (curr <= linebuf + 1 || curr[-1] != '\b')
+ #else	LANG
+ 			if (curr <= linebuf + sizeof (ltype) || curr[-1] != '\b')
+ #endif	LANG
  				break;
  
+ #ifndef	LANG
  			if (c == curr[-2])
+ #else	LANG
+ 			if ((ltype) c == curr[-2])
+ #endif	LANG
  				goto enter_boldface;
+ #ifndef	LANG
  			if (c == '_' || curr[-2] == '_')
+ #else	LANG
+ 			if ((ltype) c == (ltype) '_' || curr[-2] == (ltype) '_')
+ #endif	LANG
  				goto enter_underline;
  			curr -= 2;
  			break;
***************
*** 152,159 ****
--- 186,198 ----
  				 */
  				return (1);
  
+ #ifndef	LANG
  			if (bo_width > 0 && 
  			    curr > linebuf + 2 && curr[-3] == ' ')
+ #else	LANG
+ 			if (bo_width > 0 && 
+ 			    curr > linebuf + (sizeof (ltype) * 2) && curr[-3] == ' ')
+ #endif	LANG
  			{
  				/*
  				 * Special case for magic cookie terminals:
***************
*** 183,190 ****
--- 222,234 ----
  				 */
  				return (1);
  
+ #ifndef	LANG
  			if (ul_width > 0 && 
  			    curr > linebuf + 2 && curr[-3] == ' ')
+ #else	LANG
+ 			if (ul_width > 0 && 
+ 			    curr > linebuf + (sizeof (ltype) * 2) && curr[-3] == ' ')
+ #endif	LANG
  			{
  				/*
  				 * Special case for magic cookie terminals:
***************
*** 200,205 ****
--- 244,250 ----
  				column += ul_width;
  				curr++;
  			}
+ 			
  			goto ln_ul_xb_case;
  			/*NOTREACHED*/
  		case LN_UL_XB:
***************
*** 231,237 ****
--- 276,286 ----
  			/*
  			 * Termination of a sequnce "X\bX".
  			 */
+ #ifndef	LANG
  			if (c != curr[-2] && (c == '_' || curr[-2] == '_'))
+ #else	LANG
+ 			if ((ltype) c != curr[-2] && ((ltype) c == (ltype) '_' || curr[-2] == (ltype) '_'))
+ #endif	LANG
  			{
  				/*
  				 * We seem to have run on from
***************
*** 286,292 ****
--- 335,345 ----
  				curr[0] = curr[-1];
  				curr[-1] = UE_CHAR;
  				column += ue_width;
+ #ifndef	LANG
  				if (ue_width > 0 && curr[0] == ' ')
+ #else	LANG
+ 				if (ue_width > 0 && curr[0] == (ltype) ' ')
+ #endif	LANG
  					/*
  					 * Another special case for magic
  					 * cookie terminals: if the next
***************
*** 312,318 ****
--- 365,375 ----
  				curr[0] = curr[-1];
  				curr[-1] = BE_CHAR;
  				column += be_width;
+ #ifndef	LANG
  				if (be_width > 0 && curr[0] == ' ')
+ #else	LANG
+ 				if (be_width > 0 && curr[0] == (ltype) ' ')
+ #endif	LANG
  					/*
  					 * Another special case for magic
  					 * cookie terminals: if the next
***************
*** 337,343 ****
--- 394,404 ----
  		{
  			NEW_COLUMN(column+1);
  		} while ((column % tabstop) != 0);
+ #ifndef	LANG
  		*curr++ = '\t';
+ #else	LANG
+ 		*curr++ = (ltype) '\t';
+ #endif	LANG
  		return (0);
  	}
  
***************
*** 349,355 ****
--- 410,420 ----
  			 * Treat backspace as a control char: output "^H".
  			 */
  			NEW_COLUMN(column+2);
+ #ifndef	LANG
  			*curr++ = ('H' | 0200);
+ #else	LANG
+ 			*curr++ = (ltype) ('H' | 0400);
+ #endif	LANG
  		} else
  		{
  			/*
***************
*** 356,362 ****
--- 421,431 ----
  			 * Output a real backspace.
  			 */
  			column--;
+ #ifndef	LANG
  			*curr++ = '\b';
+ #else	LANG
+ 			*curr++ = (ltype) '\b';
+ #endif	LANG
  		}
  		return (0);
  	} 
***************
*** 374,380 ****
--- 443,453 ----
  		 *    8 bit (e.g. international) character set. }}
  		 */
  		NEW_COLUMN(column+2);
+ #ifndef	LANG
  		*curr++ = (carat_char(c) | 0200);
+ #else	LANG
+ 		*curr++ = (ltype) (carat_char(c) | 0400);
+ #endif	LANG
  		return (0);
  	}
  
***************
*** 382,388 ****
--- 455,465 ----
  	 * Ordinary character.  Just put it in the buffer.
  	 */
  	NEW_COLUMN(column+1);
+ #ifndef	LANG
  	*curr++ = c;
+ #else	LANG
+ 	*curr++ = (ltype) c;
+ #endif	LANG
  	return (0);
  }
  
***************
*** 395,401 ****
--- 472,482 ----
  forw_raw_line(curr_pos)
  	POSITION curr_pos;
  {
+ #ifndef	LANG
  	register char *p;
+ #else	LANG
+ 	register ltype *p;
+ #endif	LANG
  	register int c;
  	POSITION new_pos;
  
***************
*** 423,432 ****
--- 504,523 ----
  			new_pos = ch_tell() - 1;
  			break;
  		}
+ #ifndef	LANG
  		*p++ = c;
+ #else	LANG
+ 		while (c < 0)
+ 			c += 256;
+ 		*p++ = (ltype) c;
+ #endif	LANG
  		c = ch_forw_get();
  	}
+ #ifndef	LANG
  	*p = '\0';
+ #else	LANG
+ 	*p = 0;
+ #endif	LANG
  	line = linebuf;
  	return (new_pos);
  }
***************
*** 439,445 ****
--- 530,540 ----
  back_raw_line(curr_pos)
  	POSITION curr_pos;
  {
+ #ifndef	LANG
  	register char *p;
+ #else	LANG
+ 	register ltype *p;
+ #endif	LANG
  	register int c;
  	POSITION new_pos;
  
***************
*** 448,454 ****
--- 543,553 ----
  		return (NULL_POSITION);
  
  	p = &linebuf[sizeof(linebuf)];
+ #ifndef	LANG
  	*--p = '\0';
+ #else	LANG
+ 	*--p = 0;
+ #endif	LANG
  
  	for (;;)
  	{
***************
*** 481,487 ****
--- 580,592 ----
  			new_pos = ch_tell() + 1;
  			break;
  		}
+ #ifndef	LANG
  		*--p = c;
+ #else	LANG
+ 		while (c < 0)
+ 			c += 256;
+ 		*--p = (ltype) c;
+ #endif	LANG
  	}
  	line = p;
  	return (new_pos);
Only in .: line.r
Only in .: linenum.r
diff -c /dd/X/LESS/main.c ./main.c
*** /dd/X/LESS/main.c	Fri May 20 18:03:00 1988
--- ./main.c	Wed May 23 14:54:00 1990
***************
*** 232,244 ****
  	/*
  	 * {{ We could use access() here. }}
  	 */
! #ifdef OSK
! 	exists = open(namelogfile, 1);
! #else
  	exists = open(namelogfile, 0);
- #endif
  	close(exists);
  	exists = (exists >= 0);
  
  	if (exists && !force_logfile)
  	{
--- 232,244 ----
  	/*
  	 * {{ We could use access() here. }}
  	 */
! #ifndef	OSK
  	exists = open(namelogfile, 0);
  	close(exists);
  	exists = (exists >= 0);
+ #else	OSK
+ 	exists = (access (namelogfile, 0) != -1);
+ #endif	OSK
  
  	if (exists && !force_logfile)
  	{
Only in .: main.r
diff -c /dd/X/LESS/makefile ./makefile
*** /dd/X/LESS/makefile	Thu Dec  1 12:38:00 1988
--- ./makefile	Wed May 23 14:42:00 1990
***************
*** 1,3 ****
--- 1,4 ----
+ G=	-g
  # Makefile for "less"
  # Generated $DATE by $0.
  #
***************
*** 16,27 ****
  #	make clean	# Removes "less" and the .r files.
  #	make clobber	# Pretty much the same as make "clean".
  
! SHELL = sh
  
  # LIBS is the list of libraries needed.
! LIBS = -l=/h0/lib/termlib.l
  
! LDLIBS = -l=/h0/lib/os9lib.l
  
  # INSTALL_LESS is a list of the public versions of less.
  # INSTALL_KEY is a list of the public versions of lesskey.
--- 17,28 ----
  #	make clean	# Removes "less" and the .r files.
  #	make clobber	# Pretty much the same as make "clean".
  
! SHELL = shell
  
  # LIBS is the list of libraries needed.
! LIBS = -l=/dd/lib/termlib.l
  
! LDLIBS = -l=/dd/lib/os9lib.l
  
  # INSTALL_LESS is a list of the public versions of less.
  # INSTALL_KEY is a list of the public versions of lesskey.
***************
*** 39,49 ****
  
  # OPTIM is passed to the compiler and the loader.
  # It is normally "-O" but may be, for example, "-g".
! OPTIM = -ix -qt=/dd
  
! CFLAGS = $(OPTIM)
  
! LDFLAGS = -M=5 -G -BG
  
  ##########################################################################
  # Files
--- 40,50 ----
  
  # OPTIM is passed to the compiler and the loader.
  # It is normally "-O" but may be, for example, "-g".
! OPTIM = -qt=/dd $G
  
! CFLAGS = $(OPTIM) -DLANG
  
! LDFLAGS = -M=9 $G -BG
  
  ##########################################################################
  # Files
***************
*** 62,79 ****
  # Rules for building stuff
  ##########################################################################
  
! all: less lesskey
  install: install_less install_help install_key install_lman install_kman
  
  less: $(OBJ)
! 	$(CC) $(LDFLAGS) $(OPTIM) -fd=less $(OBJ) $(LIBS) $(LDLIBS)
  
  lesskey: lesskey.r
! 	$(CC) $(LDFLAGS) $(OPTIM) -fd=lesskey lesskey.r $(LDLIBS)
  
  # help.r depends on makefile for the definition of HELPFILE
  help.r: makefile
! 	$(CC) $(CFLAGS) -r -DHELPFILE=\"$(HELPFILE)\" help.c
  
  install_less: less
  	for f in $(INSTALL_LESS); do  rm -f $$f; cp less $$f;  done
--- 63,81 ----
  # Rules for building stuff
  ##########################################################################
  
! #all: less lesskey
! all: less
  install: install_less install_help install_key install_lman install_kman
  
  less: $(OBJ)
! 	$(CC) $(LDFLAGS) $(OPTIM) -f=/h0/CMDS/$@ $(OBJ) $(LIBS) $(LDLIBS)
  
  lesskey: lesskey.r
! 	$(CC) $(LDFLAGS) $(OPTIM) -f=/h0/ETC/CMDS/lesskey lesskey.r $(LDLIBS)
  
  # help.r depends on makefile for the definition of HELPFILE
  help.r: makefile
! 	$(CC) $(CFLAGS) -r '-DHELPFILE="$(HELPFILE)"' help.c
  
  install_less: less
  	for f in $(INSTALL_LESS); do  rm -f $$f; cp less $$f;  done
Only in .: option.r
Only in .: os.r
diff -c /dd/X/LESS/output.c ./output.c
*** /dd/X/LESS/output.c	Thu Dec  1 12:38:00 1988
--- ./output.c	Thu May 24 13:34:00 1990
***************
*** 15,21 ****
--- 15,25 ----
  extern int twiddle;
  extern int screen_trashed;
  extern int any_display;
+ #ifndef	LANG
  extern char *line;
+ #else	LANG
+ extern ltype *line;
+ #endif	LANG
  extern char *first_cmd;
  
  /*
***************
*** 24,30 ****
--- 28,38 ----
  	public void
  put_line()
  {
+ #ifndef	LANG
  	register char *p;
+ #else	LANG
+ 	register ltype *p;
+ #endif	LANG
  	register int c;
  	register int column;
  	extern int auto_wrap, ignaw;
***************
*** 39,50 ****
--- 47,79 ----
  	}
  
  	if (line == NULL)
+ #ifndef	LANG
  		line = (twiddle) ? "~" : "";
+ #else	LANG
+ 	if (line == NULL) {
+ 		static ltype emptybuf[3];
  
+ 		line = emptybuf;
+ 		if (twiddle) {
+ 			line[0] = (ltype) '~';
+ 			line[1] = 0;
+ 		} else
+ 			line[0] = 0;
+ 	}
+ #endif	LANG
+ 
  	column = 0;
+ #ifndef	LANG
  	for (p = line;  *p != '\0';  p++)
+ #else	LANG
+ 	for (p = line;  *p != 0;  p++)
+ #endif	LANG
  	{
+ #ifndef	LANG
  		switch (c = *p & 0377)
+ #else	LANG
+ 		switch (c = *p & 0777)
+ #endif	LANG
  		{
  		case UL_CHAR:
  			ul_enter();
***************
*** 74,80 ****
--- 103,113 ----
  			column--;
  			break;
  		default:
+ #ifndef	LANG
  			if (c & 0200)
+ #else	LANG
+ 			if (c & 0400)
+ #endif	LANG
  			{
  				/*
  				 * Control characters arrive here as the
Only in .: output.r
Only in .: position.r
diff -c /dd/X/LESS/prim.c ./prim.c
*** /dd/X/LESS/prim.c	Fri May 20 15:24:00 1988
--- ./prim.c	Fri May 25 16:19:00 1990
***************
*** 20,26 ****
--- 20,30 ----
  extern int caseless;
  extern int linenums;
  extern int plusoption;
+ #ifndef	LANG
  extern char *line;
+ #else	LANG
+ extern ltype *line;
+ #endif	LANG
  extern char *first_cmd;
  #if TAGS
  extern int tagoption;
***************
*** 628,635 ****
--- 632,645 ----
  	int wantmatch;
  {
  	POSITION pos, linepos;
+ #ifndef	LANG
  	register char *p;
  	register char *q;
+ #else	LANG
+ 	register ltype *p;
+ 	register char *q;
+ 	char llinebuf[1024];
+ #endif	LANG
  	int linenum;
  	int linematch;
  #if RECOMP
***************
*** 657,665 ****
--- 667,681 ----
  		 * For a caseless search, convert any uppercase
  		 * in the pattern to lowercase.
  		 */
+ #ifndef	LANG
  		for (p = pattern;  *p != '\0';  p++)
  			if (*p >= 'A' && *p <= 'Z')
  				*p += 'a' - 'A';
+ #else	LANG
+ 		for (q = pattern;  *q != '\0';  q++)
+ 			if (*q >= 'A' && *q <= 'Z')
+ 				*q += 'a' - 'A';
+ #endif	LANG
  	}
  #if RECOMP
  
***************
*** 835,840 ****
--- 851,857 ----
  			 * This allows us to match text which is 
  			 * underlined or overstruck.
  			 */
+ #ifndef	LANG
  			for (p = q = line;  *p != '\0';  p++, q++)
  			{
  				if (*p >= 'A' && *p <= 'Z')
***************
*** 847,853 ****
--- 864,894 ----
  					/* Otherwise, just copy. */
  					*q = *p;
  			}
+ #else	LANG
+ 			q = llinebuf;
+ 			for (p = line;  *p != 0;  p++, q++)
+ 			{
+ 				if ((char) *p >= 'A' && (char) *p <= 'Z')
+ 					*q = (char) *p + 'a' - 'A';
+ 				else if (q > llinebuf && (char) *p == '\b')
+ 					q -= 2;
+ 				else
+ 					*q = (char) *p;
+ 			}
+ 			*q = '\0';
+ #endif	LANG
+ 		}
+ #ifdef	LANG
+ 		else {
+ 			q = llinebuf;
+ 			for (p = line;  *p != 0;  p++, q++)
+ 				if (q > llinebuf && (char) *p == '\b')
+ 					q -= 2;
+ 				else
+ 					*q = (char) *p;
+ 			*q = '\0';
  		}
+ #endif	LANG
  
  		/*
  		 * Test the next line to see if we have a match.
***************
*** 854,859 ****
--- 895,901 ----
  		 * This is done in a variety of ways, depending
  		 * on what pattern matching functions are available.
  		 */
+ #ifndef	LANG
  #if REGCMP
  		linematch = (regex(cpattern, line) != NULL);
  #else
***************
*** 863,868 ****
--- 905,921 ----
  		linematch = match(pattern, line);
  #endif
  #endif
+ #else	LANG
+ #if REGCMP
+ 		linematch = (regex(cpattern, llinebuf) != NULL);
+ #else
+ #if RECOMP
+ 		linematch = (re_exec(llinebuf) == 1);
+ #else
+ 		linematch = match(pattern, llinebuf);
+ #endif
+ #endif
+ #endif	LANG
  		/*
  		 * We are successful if wantmatch and linematch are
  		 * both true (want a match and got it),
Only in .: prim.r
Only in .: prompt.r
Only in .: screen.r
Only in .: signal.r
Only in .: tags
diff -c /dd/X/LESS/tags.c ./tags.c
*** /dd/X/LESS/tags.c	Fri May 20 15:10:00 1988
--- ./tags.c	Thu May 24 13:09:00 1990
***************
*** 12,18 ****
--- 12,22 ----
  
  extern int linenums;
  extern int sigs;
+ #ifndef	LANG
  extern char *line;
+ #else	LANG
+ extern ltype *line;
+ #endif	LANG
  
  /*
   * Find a tag in the "tags" file.
***************
*** 161,168 ****
--- 165,187 ----
  		/*
  		 * Test the line to see if we have a match.
  		 */
+ #ifndef	LANG
  		if (strcmp(tagpattern, line) == 0)
  			break;
+ #else	LANG
+ 		{
+ 			register ltype *p;
+ 			register char *q;
+ 			char llinebuf[1024];
+ 
+ 			q = llinebuf;
+ 			for (p = line; *p != 0; ++p, ++q)
+ 				*q = (char) *p;
+ 			*q = '\0';
+ 			if (strcmp(tagpattern, llinebuf) == 0)
+ 				break;
+ 		}
+ #endif	LANG
  	}
  
  	jump_loc(linepos);
Only in .: tags.r
Only in .: ttyin.r
Only in .: version.r
-----------------------------------------------------------------------cut here
-- 
| Frank Kaefer | fkk@stasys.sta.sub.org | Starnberg, Germany |
| Compuserve: 72427,2101   | Internet: fkk@Germany.Sun.COM   |
| unido!sunde!fkaefer      |    postmaster@Germany.Sun.COM   |
|          THE POWER OF SUN (Scott McNealy)                  |