Subject: ANNOUNCE: color ls patches for fileutils 3.8
From: [email-masked] (H. Peter Anvin N9ITP)
Date: Wed, 2 Jun 1993 15:19:17 GMT
Newsgroups: comp.os.linux.announce,gnu.utils.bug

I just saw a port of my fileutils-3.4 color-ls patch to fileutils-3.5
posted here.  I and Dennis Flaherty have worked on the color-ls
patches between us, to try to get a version that we could submit to
the GNU people.  Here is my current patch (I don't know what Dennis is
up to -- I haven't heard from him in weeks??), it is for GNU
fileutils-3.8.

GNU fileutils-3.8 is available for alpha.gnu.ai.mit.edu (the one on
prep.ai.mit.edu is still 3.6), and compiles out of the box with the
exception that on one of my two Linux systems "configure" fails
miserably in figuring out my system configuration.  Some Makefile
editing takes care of that (but it still puzzles me).

These patches use -o for color, -f is used for UNIX compatibility and
-e is used for --full-time (which was -f in 3.5).

The patch includes a patch to the man page.

diff -c --recursive old/fileutils-3.8/man/ls.1 fileutils-3.8/man/ls.1
*** old/fileutils-3.8/man/ls.1	Fri May 21 17:28:58 1993
--- fileutils-3.8/man/ls.1	Wed Jun  2 09:30:54 1993
***************
*** 3,17 ****
  ls, dir, vdir \- list contents of directories
  .SH SYNOPSIS
  .B ls
! [\-abcdfgiklmnpqrstuxABCFGLNQRSUX1] [\-w cols] [\-T cols] [\-I pattern]
! [\-\-all] [\-\-escape] [\-\-directory] [\-\-inode] [\-\-kilobytes]
! [\-\-numeric-uid-gid] [--no-group] [\-\-hide-control-chars] [\-\-reverse]
  [\-\-size] [\-\-width=cols] [\-\-tabsize=cols] [\-\-almost-all]
! [\-\-ignore-backups] [\-\-classify] [\-\-file-type] [\-\-full-time]
! [\-\-ignore=pattern] [\-\-dereference] [\-\-literal] [\-\-quote-name]
! [\-\-recursive] [\-\-sort={none,time,size,extension}]
  [\-\-format={long,verbose,commas,across,vertical,single-column}]
! [\-\-time={atime,access,use,ctime,status}] [\-\-help] [\-\-version] [path...]
  .SH DESCRIPTION
  This manual page
  documents the GNU version of
--- 3,20 ----
  ls, dir, vdir \- list contents of directories
  .SH SYNOPSIS
  .B ls
! [\-abcdefgiklmnopqrstuxABCFGLNQRSUX178] [\-w\ cols] [\-T\ cols] [\-I\ pattern]
! [\-\-directory] [\-\-all] [\-\-escape] [\-\-inode] [\-\-kilobytes]
! [\-\-no-group] [\-\-numeric-uid-gid] [\-\-hide-control-chars] [\-\-reverse]
  [\-\-size] [\-\-width=cols] [\-\-tabsize=cols] [\-\-almost-all]
! [\-\-ignore-backups] [\-\-classify] [\-\-ignore=pattern]
! [\-\-full-time] [\-\-literal] [\-\-dereference] [\-\-quote-name]
! [\-\-file-type] [\-\-recursive] [\-\-sort={none,time,size,extension}]
  [\-\-format={long,verbose,commas,across,vertical,single-column}]
! [\-\-time={atime,access,use,ctime,status}]
! [\-\-color] [\-\-colour] [\-\-7bit] [\-\-8bit]
! [\-\-help] [\-\-version]
! [path...]
  .SH DESCRIPTION
  This manual page
  documents the GNU version of
***************
*** 49,54 ****
--- 52,61 ----
  .I "\-d, \-\-directory"
  List directories like other files, rather than listing their contents.
  .TP
+ .I "\-e, \-\-full-time"
+ List times in full, rather than using the standard abbreviation
+ heuristics.
+ .TP
  .I "\-f"
  Do not sort directory contents; list them in whatever order they are
  stored on the disk.
***************
*** 62,71 ****
  and
  .I \-t.
  .TP
- .I "\-\-full-time"
- List times in full, rather than using the standard abbreviation
- heuristics.
- .TP
  .I \-g
  Ignored; for Unix compatibility.
  .TP
--- 69,74 ----
***************
*** 74,80 ****
  .TP
  .I "\-k, \-\-kilobytes"
  If file sizes are being listed, print them in kilobytes.  This
! overrides the environment variable POSIXLY_CORRECT.
  .TP
  .I "\-l, \-\-format=long, \-\-format=verbose"
  In addition to the name of each file, print the file type,
--- 77,84 ----
  .TP
  .I "\-k, \-\-kilobytes"
  If file sizes are being listed, print them in kilobytes.  This
! overrides the environment variable 
! .BR POSIXLY_CORRECT .
  .TP
  .I "\-l, \-\-format=long, \-\-format=verbose"
  In addition to the name of each file, print the file type,
***************
*** 91,96 ****
--- 95,104 ----
  .I "\-n, \-\-numeric-uid-gid"
  List the numeric UID and GID instead of the names.
  .TP
+ .I "\-o, \-\-color, \-\-colour"
+ Colorize the names of files using ISO 6429 (ANSI) color control
+ sequences, depending on the type of file.  See `COLOR PRINTING' below.
+ .TP
  .I \-p
  Append a character to each file name indicating the file type.
  .TP
***************
*** 102,108 ****
  .TP
  .I "\-s, \-\-size"
  Print the size of each file in 1K blocks to the left of the file name.
! If the environment variable POSIXLY_CORRECT is set, 512-byte blocks
  are used instead.
  .TP
  .I "\-t, \-\-sort=time"
--- 110,118 ----
  .TP
  .I "\-s, \-\-size"
  Print the size of each file in 1K blocks to the left of the file name.
! If the environment variable 
! .B POSIXLY_CORRECT
! is set, 512-byte blocks
  are used instead.
  .TP
  .I "\-t, \-\-sort=time"
***************
*** 179,184 ****
--- 189,203 ----
  .I "\-1, \-\-format=single-column"
  List one file per line.
  .TP
+ .I "\-7, \-\-7bit"
+ Treat all character outside the ASCII (ISO 646) set (0x20-0x7E) as
+ nonprintable control characters.
+ .TP
+ .I "\-8, \-\-8bit"
+ Treat all characters from the 8-bit ISO 8859 character sets
+ (0x20-0x7E, 0xA1-0xFF) as printable.  This includes ASCII as a subset.
+ This is the default unless overridden at compile time.
+ .TP
  .I "\-w, \-\-width cols"
  Assume the screen is
  .I cols
***************
*** 204,209 ****
--- 223,278 ----
  .TP
  .I "\-\-version"
  Print version information on standard error then exit.
+ .SS COLOR PRINTING
+ When using the
+ .I \-o
+ option, this version of
+ .B ls
+ will colorize the file names printed according to the type of file.
+ .PP
+ You can override the default colors by defining the environment
+ variable 
+ .B LS_COLORS
+ (or 
+ .BR LS_COLOURS );
+ this should be a comma-separated
+ list of codes that will be inserted into a color escape sequence (type
+ `m').  The sequences are, in order: plaintext, normal file, directory,
+ symbolic link, FIFO, socket, block device, character device, and
+ executable file.  The first sequence (plaintext) is the one applied to
+ the end of each file name in order to restore normal text output.
+ This is usually, but not always, a zero (0).
+ .PP
+ A single color sequence is composed of numerical commands separated by
+ semicolons.  The most common commands are:
+ .nf
+  0 to restore default color
+  1 for brighter colors 
+  4 for underlined text
+  5 for flashing text
+ 30 for black foreground
+ 31 for red foreground
+ 32 for green foreground
+ 33 for yellow (or brown) foreground
+ 34 for blue foreground
+ 35 for purple foreground
+ 36 for cyan foreground
+ 37 for white (or gray) foreground
+ 40 for black background
+ 41 for red background
+ 42 for green background
+ 43 for yellow (or brown) background
+ 44 for blue background
+ 45 for purple background
+ 46 for cyan background
+ 47 for white (or gray) background
+ .fi
+ .PP
+ Not all commands work on all systems or display devices.
+ .PP
+ The default value for 
+ .B LS_COLORS 
+ is `0,0,32,36,31,33,44;37,44;37,35'.
  .SH BUGS
  On BSD systems, the
  .I \-s
***************
*** 214,216 ****
--- 283,287 ----
  HP-UX
  .B ls
  program.
+ .PP
+ Colorization and character set selection should be more system independent.

diff -c --recursive old/fileutils-3.8/src/ls.c fileutils-3.8/src/ls.c
*** old/fileutils-3.8/src/ls.c	Tue May 25 23:26:55 1993
--- fileutils-3.8/src/ls.c	Wed Jun  2 10:00:49 1993
***************
*** 32,37 ****
--- 32,78 ----
  
  /* Written by Richard Stallman and David MacKenzie. */
  
+ /* Colour and 8-bit support by Dennis Flaherty <[email-masked]>
+    and Peter Anvin <[email-masked]> based on original patches by Greg Lee
+    <[email-masked]>.
+ 
+    Comments about desirable extensions to the colour support greatly
+    appreciated.  We are trying to settle on something we can send to the
+    FSF before fileutils-3.6.
+ 
+    HISTORY:
+ 
+     Mar 1992: Greg Lee <[email-masked]>
+         Original color-ls patch.  Displayed the ansi color escape
+         sequences unless '-f' option was used, or if long format was
+         specified.  Posted to comp.os.linux.
+     Apr 1992: Dennis Flaherty <[email-masked]>
+         Expanded color-ls patch to display color anytime a filename was
+         displayed, including long format and targets of links in long
+         format.  Changed color scheme, added colors for block and
+         character devices.  Posted to c.o.l. and sent to H.J. Lu.
+     Dec 1992: Peter Anvin <[email-masked]>
+     	Implemented flexible macros that could be #defined to set color
+     	scheme, used Flaherty's color scheme as default.  Macro for
+     	setting default behavior of color display, '-f' toggles.  Added
+     	option for 8-bit ISO filenames.  Added long-name options.
+     May 1993: Dennis Flaherty <[email-masked]>
+     	Incorporated Anvin's and Flaherty's changes into new
+     	fileutils-3.5.  Fixed "target of link in long format" coloring
+     	again.  Due to conflict with new '-f' or '--full-time' option,
+     	color-ls option changed to '-o'.  Always defaults to no color,
+     	always supports 8-bit ISO filenames.  Added LS_COLOR environment
+ 	variable to customize colour settings.
+    May 1993: Peter Anvin <[email-masked]>
+         Restored command line option '-7' or '-8' to select 7-bit or
+ 	8-bit mode.  Added compile-time option to make 7 bits the
+ 	default.  Made the format of LS_COLOR more general. Added
+ 	'-e' short option for '--full-time' since GNU decided to go
+ 	with UNIX compatibility for the '-f' option.  Updated man pages. 
+     Jun 1993: Peter Anvin <[email-masked]>
+         Patch against new fileutils-3.8.  Posted to comp.os.linux.announce.
+ */
+ 
  #ifdef _AIX
   #pragma alloca
  #endif
***************
*** 108,113 ****
--- 149,155 ----
  static void print_many_per_line ();
  static void print_name_with_quoting ();
  static void print_type_indicator ();
+ static void print_color_indicator ();
  static void print_with_commas ();
  static void queue_directory ();
  static void sort_files ();
***************
*** 216,222 ****
  
  static enum time_type time_type;
  
! /* print the full time, otherwise the standard unix heuristics. */
  
  int full_time;
  
--- 258,264 ----
  
  static enum time_type time_type;
  
! /* print the full time, otherwise the standard unix heuristics. -e */
  
  int full_time;
  
***************
*** 274,279 ****
--- 316,347 ----
  
  static enum indicator_style indicator_style;
  
+ /* Nonzero means use colors for types if we are using the -o option.  An
+    empty string "" means ignore this category. */
+ 
+ int print_with_color;
+ 
+ #define COLORWRAPPER "\33[%sm"	/* How to print in color */
+ #define MAXCOLORLEN  16		/* Max # of characters in a color sequence */
+ 
+ enum { C_NORMAL, C_FILE, C_DIR, C_LINK, C_FIFO, C_SOCK, 
+        C_BLK, C_CHR, C_EXEC };
+ 
+ #define LASTCOLOR C_EXEC
+ 
+ char indicator_color[][MAXCOLORLEN] = 
+ {	/* default, default, green, cyan, red, yellow, white-on-blue,
+ 	   white-on-blue, purple */
+ 	"0", "0", "32", "36", "31", "33", "44;37", "44;37", "35" };
+ 
+ /* Nonzero means print using ISO 8859 characters.  The default is specified
+    here as well.  -8 enables, -7 disables.  */
+ 
+ int print_iso8859;
+ #ifndef DEFAULT_ISO8859
+ #define DEFAULT_ISO8859  1
+ #endif
+ 
  /* Nonzero means mention the inode number of each file.  -i  */
  
  static int print_inode;
***************
*** 369,375 ****
    {"all", no_argument, 0, 'a'},
    {"escape", no_argument, 0, 'b'},
    {"directory", no_argument, 0, 'd'},
!   {"full-time", no_argument, &full_time, 1},
    {"inode", no_argument, 0, 'i'},
    {"kilobytes", no_argument, 0, 'k'},
    {"numeric-uid-gid", no_argument, 0, 'n'},
--- 437,443 ----
    {"all", no_argument, 0, 'a'},
    {"escape", no_argument, 0, 'b'},
    {"directory", no_argument, 0, 'd'},
!   {"full-time", no_argument, 0, 'e'},
    {"inode", no_argument, 0, 'i'},
    {"kilobytes", no_argument, 0, 'k'},
    {"numeric-uid-gid", no_argument, 0, 'n'},
***************
*** 393,398 ****
--- 461,470 ----
    {"time", required_argument, 0, 11},
    {"help", no_argument, &flag_help, 1},
    {"version", no_argument, &flag_version, 1},
+   {"color", no_argument, 0, 'o'},
+   {"colour", no_argument, 0, 'o'},
+   {"7bit", no_argument, 0, '7'},
+   {"8bit", no_argument, 0, '8'},
    {0, 0, 0, 0}
  };
  
***************
*** 458,464 ****
    format_needs_stat = sort_type == sort_time || sort_type == sort_size
      || format == long_format
      || trace_links || trace_dirs || indicator_style != none
!     || print_block_size || print_inode;
  
    nfiles = 100;
    files = (struct file *) xmalloc (sizeof (struct file) * nfiles);
--- 530,536 ----
    format_needs_stat = sort_type == sort_time || sort_type == sort_size
      || format == long_format
      || trace_links || trace_dirs || indicator_style != none
!     || print_block_size || print_inode || print_with_color;
  
    nfiles = 100;
    files = (struct file *) xmalloc (sizeof (struct file) * nfiles);
***************
*** 575,580 ****
--- 647,654 ----
    really_all_files = 0;
    ignore_patterns = 0;
    quote_as_string = 0;
+   print_with_color = 0;
+   print_iso8859 = DEFAULT_ISO8859;  
  
    p = getenv ("COLUMNS");
    line_length = p ? atoi (p) : 80;
***************
*** 591,597 ****
    p = getenv ("TABSIZE");
    tabsize = p ? atoi (p) : 8;
  
!   while ((c = getopt_long (argc, argv, "abcdfgiklmnpqrstuw:xABCFGI:LNQRST:UX1",
  			   long_options, (int *) 0)) != EOF)
      {
        switch (c)
--- 665,671 ----
    p = getenv ("TABSIZE");
    tabsize = p ? atoi (p) : 8;
  
!   while ((c = getopt_long (argc, argv, "abcdefgiklmnopqrstuw:xABCFGI:LNQRST:UX178",
  			   long_options, (int *) 0)) != EOF)
      {
        switch (c)
***************
*** 617,622 ****
--- 691,700 ----
  	  immediate_dirs = 1;
  	  break;
  
+ 	case 'e':
+ 	  full_time = 1;
+ 	  break;
+ 
  	case 'f':
  	  /* Same as enabling -a -U and disabling -l -s.  */
  	  all_files = 1;
***************
*** 652,657 ****
--- 730,739 ----
  	  numeric_users = 1;
  	  break;
  	  
+ 	case 'o':
+ 	  print_with_color = 1;
+ 	  break;
+ 	  
  	case 'p':
  	  indicator_style = not_programs;
  	  break;
***************
*** 753,758 ****
--- 835,848 ----
  	  format = one_per_line;
  	  break;
  
+ 	case '7':
+ 	  print_iso8859 = 0;
+ 	  break;
+ 
+ 	case '8':
+ 	  print_iso8859 = 1;
+ 	  break;
+ 
  	case 10:		/* +sort */
  	  i = argmatch (optarg, sort_args);
  	  if (i < 0)
***************
*** 788,793 ****
--- 878,906 ----
  	}
      }
  
+   if ( print_with_color )
+     {
+       if ( (p = getenv("LS_COLORS")) || (p = getenv("LS_COLOURS")) )
+ 	{
+ 	  register char *q;
+ 
+ 	  q = xmalloc(strlen(p)+1); /* Can't modify a getenv() string */
+ 	  strcpy(q,p);
+ 
+ 	  p = strtok(q, ",");
+ 
+ 	  for ( i = C_NORMAL ; i <= LASTCOLOR && p ; i++ )
+ 	    {
+ 	      if ( strlen(p) < MAXCOLORLEN )
+ 		strcpy(indicator_color[i],p);
+ 
+ 	      p = strtok(NULL, ",");
+ 	    }
+ 
+ 	  free(q);
+ 	}
+      } 
+ 
    return optind;
  }
  
***************
*** 1003,1009 ****
  	     they won't be traced and when no indicator is needed. */
  	  if (linkpath
  	      && ((explicit_arg && format != long_format)
! 		   || indicator_style != none)
  	      && stat (linkpath, &linkstats) == 0)
  	    {
  	      /* Symbolic links to directories that are mentioned on the
--- 1116,1122 ----
  	     they won't be traced and when no indicator is needed. */
  	  if (linkpath
  	      && ((explicit_arg && format != long_format)
! 		   || indicator_style != none || print_with_color)
  	      && stat (linkpath, &linkstats) == 0)
  	    {
  	      /* Symbolic links to directories that are mentioned on the
***************
*** 1476,1482 ****
--- 1589,1599 ----
  
    printf ("%s ", full_time ? timebuf : timebuf + 4);
  
+   if (print_with_color)
+     print_color_indicator (f->stat.st_mode);
    print_name_with_quoting (f->name);
+   if (print_with_color)
+     printf (COLORWRAPPER, indicator_color[C_NORMAL]);
  
    if (f->filetype == symbolic_link)
      {
***************
*** 1483,1489 ****
--- 1600,1610 ----
        if (f->linkname)
  	{
  	  fputs (" -> ", stdout);
+ 	  if (print_with_color)
+ 	    print_color_indicator (f->linkmode);
  	  print_name_with_quoting (f->linkname);
+ 	  if (print_with_color)
+ 	    printf (COLORWRAPPER, indicator_color[C_NORMAL]);
  	  if (indicator_style != none)
  	    print_type_indicator (f->linkmode);
  	}
***************
*** 1540,1546 ****
  	      break;
  
  	    default:
! 	      if (c > 040 && c < 0177)
  		putchar (c);
  	      else
  		printf ("\\%03o", (unsigned int) c);
--- 1661,1668 ----
  	      break;
  
  	    default:
! 	      if ( (c >= 0x20 && c <= 0x7E) ||
! 		   (print_iso8859 && c >= 0xA1 && c <= 0xFF) )
  		putchar (c);
  	      else
  		printf ("\\%03o", (unsigned int) c);
***************
*** 1548,1554 ****
  	}
        else
  	{
! 	  if (c >= 040 && c < 0177)
  	    putchar (c);
  	  else if (!qmark_funny_chars)
  	    putchar (c);
--- 1670,1677 ----
  	}
        else
  	{
! 	  if ( (c >= 0x20 && c <= 0x7E) ||
! 	       (print_iso8859 && c >= 0xA1 && c <= 0xFF) )
  	    putchar (c);
  	  else if (!qmark_funny_chars)
  	    putchar (c);
***************
*** 1576,1582 ****
--- 1699,1709 ----
      printf ("%*u ", block_size_size,
  	    convert_blocks (ST_NBLOCKS (f->stat), kilobyte_blocks));
  
+   if (print_with_color)
+     print_color_indicator (f->stat.st_mode);
    print_name_with_quoting (f->name);
+   if (print_with_color)
+     printf (COLORWRAPPER, indicator_color[C_NORMAL]);
  
    if (indicator_style != none)
      print_type_indicator (f->stat.st_mode);
***************
*** 1609,1620 ****
      putchar ('*');
  }
  
  static int
  length_of_file_name_and_frills (f)
       struct file *f;
  {
    register char *p = f->name;
!   register char c;
    register int len = 0;
  
    if (print_inode)
--- 1736,1790 ----
      putchar ('*');
  }
  
+ static void
+ print_color_indicator (mode)
+      unsigned int mode;
+ {
+   int i;
+   int shi;			/* Bits to shift mode */
+   int type = C_FILE;
+   
+   if (S_ISDIR (mode) && *indicator_color[C_DIR])
+     type = C_DIR;
+   
+ #ifdef S_ISLNK
+   else if (S_ISLNK (mode) && *indicator_color[C_LINK])
+     type = C_LINK;
+ #endif
+ 
+ #ifdef S_ISFIFO
+   else if (S_ISFIFO (mode) && *indicator_color[C_FIFO])
+     type = C_FIFO;
+ #endif
+ 
+ #ifdef S_ISSOCK
+   else if (S_ISSOCK (mode) && *indicator_color[C_SOCK])
+     type = C_SOCK;
+ #endif
+ 
+ #ifdef S_ISBLK
+   else if (S_ISBLK (mode) && *indicator_color[C_BLK])
+     type = C_BLK;
+ #endif
+ 
+ #ifdef S_ISCHR
+   else if (S_ISCHR (mode) && *indicator_color[C_CHR])
+     type = C_CHR;
+ #endif
+ 
+   if ( type == C_FILE && (mode & (S_IEXEC|S_IEXEC>>3|S_IEXEC>>6)) )
+     type = C_EXEC;
+ 
+   if (*indicator_color[type])
+     printf (COLORWRAPPER, indicator_color[type]);
+ }
+ 
  static int
  length_of_file_name_and_frills (f)
       struct file *f;
  {
    register char *p = f->name;
!   register unsigned char c;
    register int len = 0;
  
    if (print_inode)
***************
*** 1650,1656 ****
  	      break;
  
  	    default:
! 	      if (c >= 040 && c < 0177)
  		len += 1;
  	      else
  		len += 4;
--- 1820,1827 ----
  	      break;
  
  	    default:
! 	      if ( (c >= 0x20 && c <= 0x7E) ||
! 		   (print_iso8859 && c >= 0xA1 && c <= 0xFF) )
  		len += 1;
  	      else
  		len += 4;
***************
*** 1871,1886 ****
  usage ()
  {
    fprintf (stderr, "\
! Usage: %s [-abcdgiklmnpqrstuxABCFGLNQRSUX1] [-w cols] [-T cols] [-I pattern]\n\
!        [--all] [--escape] [--directory] [--inode] [--kilobytes] [--literal]\n\
!        [--numeric-uid-gid] [--hide-control-chars] [--reverse] [--size]\n\
!        [--width=cols] [--tabsize=cols] [--almost-all] [--ignore-backups]\n",
  	   program_name);
    fprintf (stderr, "\
         [--classify] [--file-type] [--ignore=pattern] [--dereference]\n\
         [--quote-name] [--recursive] [--sort={none,time,size,extension}]\n\
         [--format={long,verbose,commas,across,vertical,single-column}]\n\
!        [--time={atime,access,use,ctime,status}] [--no-group]\n\
!        [--help] [--version] [path...]\n");
    exit (1);
  }
--- 2042,2058 ----
  usage ()
  {
    fprintf (stderr, "\
! Usage: %s [-abcdfgiklmnopqrstuxABCFGLNQRSUX178] [-w cols] [-T cols]\n\
!        [-I pattern] [--all] [--escape] [--directory] [--inode] [--kilobytes]\n\
!        [--literal] [--numeric-uid-gid] [--hide-control-chars] [--reverse]\n\
!        [--size] [--width=cols] [--tabsize=cols] [--almost-all] [--no-group]\n",
  	   program_name);
    fprintf (stderr, "\
         [--classify] [--file-type] [--ignore=pattern] [--dereference]\n\
         [--quote-name] [--recursive] [--sort={none,time,size,extension}]\n\
         [--format={long,verbose,commas,across,vertical,single-column}]\n\
!        [--time={atime,access,use,ctime,status}] [--ignore-backups]\n\
!        [--full-time] [--colo[u]r] [--help] [--version] [--%cbit] [path...]\n",
! 	   DEFAULT_ISO8859 ? '7' : '8');
    exit (1);
  }
Only in fileutils-3.8/src: ls.c~

-- 
INTERNET:  [email-masked]    FINGER:    [email-masked]
BITNET:    HPA@NUACC      IBM MAIL:  36073 at IBMX400
HAM RADIO: N9ITP, SM4TKN  NeXTMAIL:  [email-masked]
Most inappropriatly named startup command, winner:  Microsoft Windows