Author: pfg
Date: Tue Apr  7 01:17:49 2015
New Revision: 281182
URL: https://svnweb.freebsd.org/changeset/base/281182

Log:
  Remove custom getdelim(3) and fix a small memory leak.
  
  Originally from Andre Smagin.
  
  Obtained from:        OpenBSD
  MFC after:    1 week

Modified:
  head/usr.bin/sort/file.c
  head/usr.bin/sort/file.h
  head/usr.bin/sort/sort.c

Modified: head/usr.bin/sort/file.c
==============================================================================
--- head/usr.bin/sort/file.c    Tue Apr  7 01:17:29 2015        (r281181)
+++ head/usr.bin/sort/file.c    Tue Apr  7 01:17:49 2015        (r281182)
@@ -188,42 +188,6 @@ file_is_tmp(const char* fn)
 }
 
 /*
- * Read zero-terminated line from a file
- */
-char *
-read_file0_line(struct file0_reader *f0r)
-{
-       size_t pos = 0;
-       int c;
-
-       if ((f0r->f == NULL) || feof(f0r->f))
-               return (NULL);
-
-       if (f0r->current_line && f0r->current_sz > 0)
-               f0r->current_line[0] = 0;
-
-       while (!feof(f0r->f)) {
-               c = fgetc(f0r->f);
-               if (feof(f0r->f) || (c == -1))
-                       break;
-               if ((pos + 1) >= f0r->current_sz) {
-                       size_t newsz = (f0r->current_sz + 2) * 2;
-                       f0r->current_line = sort_realloc(f0r->current_line,
-                           newsz);
-                       f0r->current_sz = newsz;
-               }
-               f0r->current_line[pos] = (char)c;
-               if (c == 0)
-                       break;
-               else
-                       f0r->current_line[pos + 1] = 0;
-               ++pos;
-       }
-
-       return f0r->current_line;
-}
-
-/*
  * Generate new temporary file name
  */
 char *

Modified: head/usr.bin/sort/file.h
==============================================================================
--- head/usr.bin/sort/file.h    Tue Apr  7 01:17:29 2015        (r281181)
+++ head/usr.bin/sort/file.h    Tue Apr  7 01:17:49 2015        (r281182)
@@ -70,16 +70,6 @@ struct file_list
        bool                     tmp;
 };
 
-/*
- * Structure for zero-separated file reading (for input files list)
- */
-struct file0_reader
-{
-       char                    *current_line;
-       FILE                    *f;
-       size_t                   current_sz;
-};
-
 /* memory */
 
 /**/
@@ -110,8 +100,6 @@ struct file_reader *file_reader_init(con
 struct bwstring *file_reader_readline(struct file_reader *fr);
 void file_reader_free(struct file_reader *fr);
 
-char *read_file0_line(struct file0_reader *f0r);
-
 void init_tmp_files(void);
 void clear_tmp_files(void);
 char *new_tmp_file_name(void);

Modified: head/usr.bin/sort/sort.c
==============================================================================
--- head/usr.bin/sort/sort.c    Tue Apr  7 01:17:29 2015        (r281181)
+++ head/usr.bin/sort/sort.c    Tue Apr  7 01:17:49 2015        (r281182)
@@ -229,34 +229,38 @@ usage(bool opt_err)
 static void
 read_fns_from_file0(const char *fn)
 {
-       if (fn) {
-               struct file0_reader f0r;
-               FILE *f;
+       FILE *f;
+       char *line = NULL;
+       size_t linesize = 0;
+       ssize_t linelen;
 
-               f = fopen(fn, "r");
-               if (f == NULL)
-                       err(2, NULL);
-
-               memset(&f0r, 0, sizeof(f0r));
-               f0r.f = f;
-
-               while (!feof(f)) {
-                       char *line = read_file0_line(&f0r);
+       if (fn == NULL)
+               return;
 
-                       if (line && *line) {
-                               if (argc_from_file0 == (size_t)-1)
-                                       argc_from_file0 = 0;
-                               ++argc_from_file0;
-                               argv_from_file0 = sort_realloc(argv_from_file0,
-                                   argc_from_file0 * sizeof(char *));
-                               if (argv_from_file0 == NULL)
-                                       err(2, NULL);
-                               argv_from_file0[argc_from_file0 - 1] =
-                                   sort_strdup(line);
-                       }
+       f = fopen(fn, "r");
+       if (f == NULL)
+               err(2, "%s", fn);
+
+       while ((linelen = getdelim(&line, &linesize, '\0', f)) != -1) {
+               if (*line != '\0') {
+                       if (argc_from_file0 == (size_t) - 1)
+                               argc_from_file0 = 0;
+                       ++argc_from_file0;
+                       argv_from_file0 = sort_realloc(argv_from_file0,
+                           argc_from_file0 * sizeof(char *));
+                       if (argv_from_file0 == NULL)
+                               err(2, NULL);
+                       argv_from_file0[argc_from_file0 - 1] = line;
+               } else {
+                       free(line);
                }
-               closefile(f, fn);
+               line = NULL;
+               linesize = 0;
        }
+       if (ferror(f))
+               err(2, "%s: getdelim", fn);
+
+       closefile(f, fn);
 }
 
 /*
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to