]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - libio/iogetline.c
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / libio / iogetline.c
index 328e20e6ea6815684fa27baf3e920f8b0085314b..ad1e64b1848ecb87c5ec9b3f60a51e82ecf84f8b 100644 (file)
@@ -1,43 +1,39 @@
-/* Copyright (C) 1993, 1997, 1998 Free Software Foundation, Inc.
-   This file is part of the GNU IO Library.
+/* Copyright (C) 1993-2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 2, or (at
-   your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
 
-   This library is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this library; see the file COPYING.  If not, write to
-   the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
-   MA 02111-1307, USA.
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.
 
-   As a special exception, if you link this library with files
-   compiled with a GNU compiler to produce an executable, this does
-   not cause the resulting executable to be covered by the GNU General
-   Public License.  This exception does not however invalidate any
-   other reasons why the executable file might be covered by the GNU
-   General Public License.  */
+   As a special exception, if you link the code in this file with
+   files compiled with a GNU compiler to produce an executable,
+   that does not cause the resulting executable to be covered by
+   the GNU Lesser General Public License.  This exception does not
+   however invalidate any other reasons why the executable file
+   might be covered by the GNU Lesser General Public License.
+   This exception applies to code released by its copyright holders
+   in files containing the exception.  */
 
 #include "libioP.h"
 #include <string.h>
 
-#if defined _LIBC || !_G_HAVE_IO_GETLINE_INFO
-
-_IO_size_t
-_IO_getline (fp, buf, n, delim, extract_delim)
-     _IO_FILE *fp;
-     char *buf;
-     _IO_size_t n;
-     int delim;
-     int extract_delim;
+size_t
+_IO_getline (FILE *fp, char *buf, size_t n, int delim,
+            int extract_delim)
 {
   return _IO_getline_info (fp, buf, n, delim, extract_delim, (int *) 0);
 }
+libc_hidden_def (_IO_getline)
 
 /* Algorithm based on that used by Berkeley pre-4.4 fgets implementation.
 
@@ -47,27 +43,25 @@ _IO_getline (fp, buf, n, delim, extract_delim)
    If extract_delim < 0, leave delimiter unread.
    If extract_delim > 0, insert delim in output. */
 
-_IO_size_t
-_IO_getline_info (fp, buf, n, delim, extract_delim, eof)
-     _IO_FILE *fp;
-     char *buf;
-     _IO_size_t n;
-     int delim;
-     int extract_delim;
-     int *eof;
+size_t
+_IO_getline_info (FILE *fp, char *buf, size_t n, int delim,
+                 int extract_delim, int *eof)
 {
   char *ptr = buf;
   if (eof != NULL)
     *eof = 0;
-  do
+  if (__builtin_expect (fp->_mode, -1) == 0)
+    _IO_fwide (fp, -1);
+  while (n != 0)
     {
-      _IO_ssize_t len = fp->_IO_read_end - fp->_IO_read_ptr;
+      ssize_t len = fp->_IO_read_end - fp->_IO_read_ptr;
       if (len <= 0)
        {
          int c = __uflow (fp);
          if (c == EOF)
            {
-             if (eof) *eof = c;
+             if (eof)
+               *eof = c;
              break;
            }
          if (c == delim)
@@ -76,40 +70,39 @@ _IO_getline_info (fp, buf, n, delim, extract_delim, eof)
                *ptr++ = c;
              else if (extract_delim < 0)
                _IO_sputbackc (fp, c);
-             return ptr - buf;
              if (extract_delim > 0)
                ++len;
+             return ptr - buf;
            }
          *ptr++ = c;
          n--;
        }
-       else
-         {
-           char *t;
-           if ((_IO_size_t) len >= n)
-             len = n;
-           t = (char *) memchr ((void *) fp->_IO_read_ptr, delim, len);
-           if (t != NULL)
-             {
-               _IO_size_t old_len = ptr-buf;
-               len = t - fp->_IO_read_ptr;
-               if (extract_delim >= 0)
-                 {
-                   ++t;
-                   if (extract_delim > 0)
-                     ++len;
-                 }
-               memcpy ((void *) ptr, (void *) fp->_IO_read_ptr, len);
-               fp->_IO_read_ptr = t;
-               return old_len + len;
-             }
-           memcpy ((void *) ptr, (void *) fp->_IO_read_ptr, len);
-           fp->_IO_read_ptr += len;
-           ptr += len;
-           n -= len;
-         }
-    } while (n != 0);
+      else
+       {
+         char *t;
+         if ((size_t) len >= n)
+           len = n;
+         t = (char *) memchr ((void *) fp->_IO_read_ptr, delim, len);
+         if (t != NULL)
+           {
+             size_t old_len = ptr-buf;
+             len = t - fp->_IO_read_ptr;
+             if (extract_delim >= 0)
+               {
+                 ++t;
+                 if (extract_delim > 0)
+                   ++len;
+               }
+             memcpy ((void *) ptr, (void *) fp->_IO_read_ptr, len);
+             fp->_IO_read_ptr = t;
+             return old_len + len;
+           }
+         memcpy ((void *) ptr, (void *) fp->_IO_read_ptr, len);
+         fp->_IO_read_ptr += len;
+         ptr += len;
+         n -= len;
+       }
+    }
   return ptr - buf;
 }
-
-#endif /* Defined _LIBC || !_G_HAVE_IO_GETLINE_INFO */
+libc_hidden_def (_IO_getline_info)