delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp-workers/2000/12/21/15:20:15

From: "Juan Manuel Guerrero" <ST001906 AT HRZ1 DOT HRZ DOT TU-Darmstadt DOT De>
Organization: Darmstadt University of Technology
To: djgpp-workers AT delorie DOT com
Date: Thu, 21 Dec 2000 21:19:27 +0200
MIME-Version: 1.0
Subject: Re: Patch #4 for dtou and utod
In-reply-to: <39A514185@HRZ1.hrz.tu-darmstadt.de>
X-mailer: Pegasus Mail for Windows (v2.54DE)
Message-ID: <3E4527A3F@HRZ1.hrz.tu-darmstadt.de>
Reply-To: djgpp-workers AT delorie DOT com
Errors-To: nobody AT delorie DOT com
X-Mailing-List: djgpp-workers AT delorie DOT com
X-Unsubscribes-To: listserv AT delorie DOT com

Patch 1/2 for version ***using*** getopt().

diff -acprNC5 djgpp.orig/src/utils/dtou.c djgpp/src/utils/dtou.c
*** djgpp.orig/src/utils/dtou.c	Mon Nov 27 13:44:58 2000
--- djgpp/src/utils/dtou.c	Thu Dec 21 20:24:38 2000
***************
*** 9,64 ****
  #include <string.h>
  #include <unistd.h>
  #include <utime.h>
  
  #ifndef O_BINARY
! #define O_BINARY 0
  #endif
  
  #if defined(MSDOS) || defined(_Windows)
! #define IS_DIR_SEPARATOR(path) ((path) == '/' || (path) == '\\' || (path) == ':')
  #else
! #define IS_DIR_SEPARATOR(path) ((path) == '/')
  #endif
  
  #define IS_LAST_CR_IN_BUF  (i == l - 1)
  #define IS_LAST_CR_IN_FILE (position + i + 1 == st.st_size)
  #define SET_FLAG(flag)         \
  do {                           \
    if ((flag) == 0) (flag) = 1; \
  } while (0)
  #define BUF_SIZE      16384
  
! /* Control characters. */    
  #define LF            0x0A
  #define CR            0x0D
  #define CntlZ         0x1A
  
  /* Exit codes. */
  #define NO_ERROR      0x00
  #define IO_ERROR      0x01  /* Some I/O error occurred. */
  
  
  static char *
! BaseName (char * name)
  {
!   char * bn, *w;
    for (bn = w = name; *w; w++)
      if (IS_DIR_SEPARATOR (*w))
!       bn = w+1;
    return bn;
  }
  
- 
  static int
! dtou(char *fname, int make_backup, int repair_mode, int strip_mode, int verbose, int vverbose, int preserve_timestamp)
  {
    int i, k, sf, df, l, l2 = 0, is_CR = 0, is_nCR = 0, is_CR_sequence = 0;
    int CntlZ_flag = 0, CR_flag = 0, nCR_flag = 0, LF_flag = 0, exit_status = NO_ERROR;
    int buf_counter, nbufs, LF_counter, must_rewind, position, offset, whence;
    char buf[BUF_SIZE];
!   char bfname[FILENAME_MAX], tfname[FILENAME_MAX], *bn;
    struct stat st;
    struct utimbuf tim1;
  
    sf = open (fname, O_RDONLY|O_BINARY);
    if (sf < 1)
--- 9,64 ----
  #include <string.h>
  #include <unistd.h>
  #include <utime.h>
  
  #ifndef O_BINARY
! # define O_BINARY 0
  #endif
  
  #if defined(MSDOS) || defined(_Windows)
! # define IS_DIR_SEPARATOR(path) ((path) == '/' || (path) == '\\' || (path) == ':')
  #else
! # define IS_DIR_SEPARATOR(path) ((path) == '/')
  #endif
  
  #define IS_LAST_CR_IN_BUF  (i == l - 1)
  #define IS_LAST_CR_IN_FILE (position + i + 1 == st.st_size)
  #define SET_FLAG(flag)         \
  do {                           \
    if ((flag) == 0) (flag) = 1; \
  } while (0)
  #define BUF_SIZE      16384
  
! /* Control characters. */
  #define LF            0x0A
  #define CR            0x0D
  #define CntlZ         0x1A
  
  /* Exit codes. */
  #define NO_ERROR      0x00
  #define IO_ERROR      0x01  /* Some I/O error occurred. */
  
  
  static char *
! BaseName (char *name)
  {
!   char *bn, *w;
    for (bn = w = name; *w; w++)
      if (IS_DIR_SEPARATOR (*w))
!       bn = w + 1;
    return bn;
  }
  
  static int
! dtou (char *fname, int make_backup, int repair_mode, int strip_mode, int verbosity, int preserve_timestamp)
  {
    int i, k, sf, df, l, l2 = 0, is_CR = 0, is_nCR = 0, is_CR_sequence = 0;
    int CntlZ_flag = 0, CR_flag = 0, nCR_flag = 0, LF_flag = 0, exit_status = NO_ERROR;
+   int bytes_in = 0, bytes_out = 0;
    int buf_counter, nbufs, LF_counter, must_rewind, position, offset, whence;
    char buf[BUF_SIZE];
!   char backup_fname[FILENAME_MAX], temp_fname[FILENAME_MAX], *bn;
    struct stat st;
    struct utimbuf tim1;
  
    sf = open (fname, O_RDONLY|O_BINARY);
    if (sf < 1)
*************** dtou(char *fname, int make_backup, int r
*** 70,100 ****
    fstat (sf,&st);
    tim1.actime = st.st_atime;
    tim1.modtime = st.st_mtime;
    nbufs = st.st_size / BUF_SIZE;
  
!   strcpy (tfname, fname);
!   bn=BaseName(tfname);
!   *bn=0;
!   strcat (tfname,"dtou.tm$");
    if (make_backup)
    {
!     strcpy (bfname, fname);
!     if (pathconf ((fname), _PC_NAME_MAX) <= 12)
!       for (i = strlen (bfname); i > -1; i--)
!         if (bfname[i] == '.')
          {
!           bfname[i] = '\0';
            break;
          }
!     strcat (bfname,".d2u");
    }
!   
!   df = open (tfname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644);
    if (df < 1)
    {
!     perror (tfname);
      close (sf);
      return IO_ERROR;
    }
  
    buf_counter = LF_counter = must_rewind = position = 0;
--- 70,100 ----
    fstat (sf,&st);
    tim1.actime = st.st_atime;
    tim1.modtime = st.st_mtime;
    nbufs = st.st_size / BUF_SIZE;
  
!   strcpy (temp_fname, fname);
!   bn = BaseName (temp_fname);
!   *bn = 0;
!   strcat (temp_fname,"dtou.tm$");
    if (make_backup)
    {
!     strcpy (backup_fname, fname);
!     if (pathconf ((backup_fname), _PC_NAME_MAX) <= 12)
!       for (i = strlen (backup_fname); i > -1; i--)
!         if (backup_fname[i] == '.')
          {
!           backup_fname[i] = '\0';
            break;
          }
!     strcat (backup_fname, ".d2u");
    }
! 
!   df = open (temp_fname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644);
    if (df < 1)
    {
!     perror (temp_fname);
      close (sf);
      return IO_ERROR;
    }
  
    buf_counter = LF_counter = must_rewind = position = 0;
*************** dtou(char *fname, int make_backup, int r
*** 107,118 ****
    {
      offset = -1;
      whence = SEEK_CUR;
    }
    while ((l = read (sf, buf, BUF_SIZE)) > 0)
!   { 
!     for (i = k = 0; i < l; i++) 
      {
        if (strip_mode)
        {
          if (buf[i] == LF)
          {
--- 107,119 ----
    {
      offset = -1;
      whence = SEEK_CUR;
    }
    while ((l = read (sf, buf, BUF_SIZE)) > 0)
!   {
!     bytes_in += l;
!     for (i = k = 0; i < l; i++)
      {
        if (strip_mode)
        {
          if (buf[i] == LF)
          {
*************** dtou(char *fname, int make_backup, int r
*** 186,307 ****
        position = lseek (sf, offset, whence);
        must_rewind = 0;
      }
  
      l2 = (k > 0 ? write (df, buf, k) : 0);
      if (l2 < 0 || CntlZ_flag) break;
      if (l2 != k) { exit_status = IO_ERROR; break; }
    }
  
    if (l < 0) perror (fname);
!   if (l2 < 0) perror (tfname);
    if (exit_status != NO_ERROR)
      fprintf (stderr,"Cannot process file %s\n",fname);
  
    close (sf);
    close (df);
  
    if (l >= 0 && l2 >= 0 && exit_status == NO_ERROR)
    {
!     int file_has_changed = CR_flag || nCR_flag || CntlZ_flag || LF_flag;
  
!     if (verbose)
        printf ("File: %s successfully processed.\n",fname);
!     if (vverbose)
        printf ("File: %s\n",fname);
  
!     if (CR_flag && vverbose) 
        printf ("At least one CR/LF to LF transformation occurred.\n");
!     if (nCR_flag && vverbose) 
        printf ("Warning: At least one CR sequence stripped from a LF.\n");
!     if (CntlZ_flag && vverbose) 
        printf ("Warning: At least one Cntl-Z has been found. File truncated at line %i.\n", LF_counter);
!     if (LF_flag && vverbose) 
        printf ("Warning: At least one LF without a preceeding CR has been found.\n");
  
!     if (vverbose && !file_has_changed)
        printf ("File unchanged.\n");
  
      if (make_backup && file_has_changed)
!       rename (fname, bfname);
      else
        remove (fname);
!     rename (tfname, fname);
      chown (fname, st.st_uid, st.st_gid);
      chmod (fname, st.st_mode);
      if (preserve_timestamp || !file_has_changed)
        utime (fname, &tim1);
    }
    else
    {
!     remove (tfname);
!     if (verbose || vverbose)
        printf ("File: %s. An I/O error occurred\n",fname);
    }
  
    return exit_status;
  }
  
  static void
! usage(char *progname)
  {
!   printf ("Usage: %s [-b] [-h] [-r] [-s] [-t] [-v] [-vv] files...\n\n", progname);
    printf ("Options are:\n");
    printf ("            -b:  A backup of the original file is made using `.d2u' as backup\n");
    printf ("                 extension, if the file has been modified.\n");
!   printf ("            -h:  Display this help and exit.\n");
    printf ("            -r:  Transform MSDOS-style EOF (CRLF) into UNIX-style EOL (LF).\n");
    printf ("                 Cntl-Z are ignored and will not truncate the file and\n");
    printf ("                 CR sequences in front of LF will be left unchanged.\n");
    printf ("            -s:  Transform MSDOS-style EOF (CRLF) into UNIX-style EOL (LF)\n");
    printf ("                 and strip a CR sequence of arbitrary length from the file,\n");
    printf ("                 if and only if the sequence is followed by LF. CR sequences\n");
    printf ("                 that are not followed by LF are always left unchanged.\n");
    printf ("            -t:  The timestamp of the modified file will not be preserved.\n");
    printf ("            -v:  Show if file processing has been successful or not.\n");
!   printf ("           -vv:  Show the kind of modifications that have been done to the file.\n");
    printf ("The program is backward compatible with previous program versions if no options\n");
    printf ("are given at all. In this case, an occurrence of Cntl-Z will truncate the file,\n");
    printf ("MSDOS-style EOL (CRLF) are transformed into UNIX-style EOL (LF) and CR sequence\n");
    printf ("stripping will not happen at all. Also the timestamp will not be alterated and\n");
!   printf ("no backup of the original file will be done.%s",
! #if defined(__MSDOS__) || defined(_WIN32)
! 	  ""
! #else
! 	  "\n"
! #endif
! 	  );
  }
  
  int
! main(int argc, char **argv)
  {
!   int exit_status = NO_ERROR, i, make_backup, repair_mode;
!   int strip_mode, verbose, vverbose, preserve_timestamp;
!   char* progname = BaseName(argv[0]);
  
    if (argc < 2)
    {
      usage (progname);
!     exit(NO_ERROR);
    }
  
!   /* Default for backward compatibility. */ 
!   make_backup = repair_mode = strip_mode = verbose = vverbose = 0;
    preserve_timestamp = 1;
  
!   i = 1;
!   while ((argc > i) && (argv[i][0] == '-') && argv[i][1])
    {
!     switch (argv[i][1])
      {
        case 'b':
          make_backup = 1;
          break;
        case 'h':
          usage (progname);
!         exit(NO_ERROR);
          break;
        case 'r':
          repair_mode = 1;
          strip_mode = 0;
          break;
--- 187,307 ----
        position = lseek (sf, offset, whence);
        must_rewind = 0;
      }
  
      l2 = (k > 0 ? write (df, buf, k) : 0);
+     bytes_out += k;
      if (l2 < 0 || CntlZ_flag) break;
      if (l2 != k) { exit_status = IO_ERROR; break; }
    }
  
    if (l < 0) perror (fname);
!   if (l2 < 0) perror (temp_fname);
    if (exit_status != NO_ERROR)
      fprintf (stderr,"Cannot process file %s\n",fname);
  
    close (sf);
    close (df);
  
    if (l >= 0 && l2 >= 0 && exit_status == NO_ERROR)
    {
!     int file_has_changed = (bytes_in != bytes_out) || CntlZ_flag;
  
!     if (verbosity == 1)
        printf ("File: %s successfully processed.\n",fname);
!     if (verbosity == 2)
        printf ("File: %s\n",fname);
  
!     if (CR_flag && (verbosity == 2))
        printf ("At least one CR/LF to LF transformation occurred.\n");
!     if (nCR_flag && (verbosity == 2))
        printf ("Warning: At least one CR sequence stripped from a LF.\n");
!     if (CntlZ_flag && (verbosity == 2))
        printf ("Warning: At least one Cntl-Z has been found. File truncated at line %i.\n", LF_counter);
!     if (LF_flag && (verbosity == 2))
        printf ("Warning: At least one LF without a preceeding CR has been found.\n");
  
!     if ((verbosity == 2) && !file_has_changed)
        printf ("File unchanged.\n");
  
      if (make_backup && file_has_changed)
!     {
!       remove (backup_fname);
!       rename (fname, backup_fname);
!     }
      else
        remove (fname);
!     rename (temp_fname, fname);
      chown (fname, st.st_uid, st.st_gid);
      chmod (fname, st.st_mode);
      if (preserve_timestamp || !file_has_changed)
        utime (fname, &tim1);
    }
    else
    {
!     remove (temp_fname);
!     if (verbosity)
        printf ("File: %s. An I/O error occurred\n",fname);
    }
  
    return exit_status;
  }
  
  static void
! usage (char *progname)
  {
!   printf ("Usage: %s [options] files...\n\n", progname);
    printf ("Options are:\n");
    printf ("            -b:  A backup of the original file is made using `.d2u' as backup\n");
    printf ("                 extension, if the file has been modified.\n");
!   printf ("      -h or -?:  Display this help and exit.\n");
    printf ("            -r:  Transform MSDOS-style EOF (CRLF) into UNIX-style EOL (LF).\n");
    printf ("                 Cntl-Z are ignored and will not truncate the file and\n");
    printf ("                 CR sequences in front of LF will be left unchanged.\n");
    printf ("            -s:  Transform MSDOS-style EOF (CRLF) into UNIX-style EOL (LF)\n");
    printf ("                 and strip a CR sequence of arbitrary length from the file,\n");
    printf ("                 if and only if the sequence is followed by LF. CR sequences\n");
    printf ("                 that are not followed by LF are always left unchanged.\n");
    printf ("            -t:  The timestamp of the modified file will not be preserved.\n");
    printf ("            -v:  Show if file processing has been successful or not.\n");
!   printf ("  -v -v or -vv:  Show the kind of modifications that have been done to the file.\n");
    printf ("The program is backward compatible with previous program versions if no options\n");
    printf ("are given at all. In this case, an occurrence of Cntl-Z will truncate the file,\n");
    printf ("MSDOS-style EOL (CRLF) are transformed into UNIX-style EOL (LF) and CR sequence\n");
    printf ("stripping will not happen at all. Also the timestamp will not be alterated and\n");
!   printf ("no backup file of the original file will be created.\n");
  }
  
  int
! main (int argc, char **argv)
  {
!   int exit_status = NO_ERROR, make_backup, repair_mode;
!   int strip_mode, verbosity, preserve_timestamp;
!   int option;
!   char *progname = BaseName (argv[0]);
  
    if (argc < 2)
    {
      usage (progname);
!     exit (NO_ERROR);
    }
  
!   /* Default for backward compatibility. */
!   make_backup = repair_mode = strip_mode = verbosity = 0;
    preserve_timestamp = 1;
  
!   opterr = 0;
!   while ((option = getopt (argc, argv, "?bhrstv")) != -1)
    {
!     switch (option)
      {
        case 'b':
          make_backup = 1;
          break;
        case 'h':
          usage (progname);
!         exit (NO_ERROR);
          break;
        case 'r':
          repair_mode = 1;
          strip_mode = 0;
          break;
*************** main(int argc, char **argv)
*** 311,339 ****
          break;
        case 't':
          preserve_timestamp = 0;
          break;
        case 'v':
!         if (argv[i][2] == 'v')
          {
!           vverbose = 1;
!           verbose = 0;
          }
          else
          {
!           verbose = 1;
!           vverbose = 0;
          }
          break;
-       default:
-         fprintf (stderr, "%s: invalid option -- %s\n", progname, &argv[i][1]);
-         fprintf (stderr, "Try `%s -h' for more information.\n", progname);
-         exit (IO_ERROR);
-         break;
      }
-     i++;
    }
  
!   for (; i < argc; i++)
!     exit_status += dtou (argv[i], make_backup, repair_mode, strip_mode, verbose, vverbose, preserve_timestamp);
    return exit_status;
  }
--- 311,339 ----
          break;
        case 't':
          preserve_timestamp = 0;
          break;
        case 'v':
!         verbosity++;
!         if (verbosity > 2)
!           verbosity = 2;
!         break;
!       case '?':
!         if (optopt == '?')
          {
!           usage (progname);
!           exit(NO_ERROR);
          }
          else
          {
!           fprintf (stderr, "%s: invalid option -- %c.\n", progname, optopt);
!           fprintf (stderr, "Try `%s -h' for more information.\n", progname);
!           exit (IO_ERROR);
          }
          break;
      }
    }
  
!   for (; optind < argc; optind++)
!     exit_status += dtou (argv[optind], make_backup, repair_mode, strip_mode, verbosity, preserve_timestamp);
    return exit_status;
  }

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019