(linenum→info "unix/slp.c:2238")

glibc/2.7/libio/iogetwline.c

    1: /* Copyright (C) 1993,1997-2000,2002,2005 Free Software Foundation, Inc.
    2:    This file is part of the GNU C Library.
    3: 
    4:    The GNU C Library is free software; you can redistribute it and/or
    5:    modify it under the terms of the GNU Lesser General Public
    6:    License as published by the Free Software Foundation; either
    7:    version 2.1 of the License, or (at your option) any later version.
    8: 
    9:    The GNU C Library is distributed in the hope that it will be useful,
   10:    but WITHOUT ANY WARRANTY; without even the implied warranty of
   11:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   12:    Lesser General Public License for more details.
   13: 
   14:    You should have received a copy of the GNU Lesser General Public
   15:    License along with the GNU C Library; if not, write to the Free
   16:    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   17:    02111-1307 USA.
   18: 
   19:    As a special exception, if you link the code in this file with
   20:    files compiled with a GNU compiler to produce an executable,
   21:    that does not cause the resulting executable to be covered by
   22:    the GNU Lesser General Public License.  This exception does not
   23:    however invalidate any other reasons why the executable file
   24:    might be covered by the GNU Lesser General Public License.
   25:    This exception applies to code released by its copyright holders
   26:    in files containing the exception.  */
   27: 
   28: #include "libioP.h"
   29: #include <string.h>
   30: #include <wchar.h>
   31: 
   32: #ifdef _LIBC
   33: # define wmemcpy __wmemcpy
   34: #endif
   35: 
   36: #if defined _LIBC || !_G_HAVE_IO_GETLINE_INFO
   37: 
   38: _IO_size_t
   39: _IO_getwline (fp, buf, n, delim, extract_delim)
   40:      _IO_FILE *fp;
   41:      wchar_t *buf;
   42:      _IO_size_t n;
   43:      wint_t delim;
   44:      int extract_delim;
   45: {
   46:   return _IO_getwline_info (fp, buf, n, delim, extract_delim, (wint_t *) 0);
   47: }
   48: 
   49: /* Algorithm based on that used by Berkeley pre-4.4 fgets implementation.
   50: 
   51:    Read chars into buf (of size n), until delim is seen.
   52:    Return number of chars read (at most n).
   53:    Does not put a terminating '\0' in buf.
   54:    If extract_delim < 0, leave delimiter unread.
   55:    If extract_delim > 0, insert delim in output. */
   56: 
   57: _IO_size_t
   58: _IO_getwline_info (fp, buf, n, delim, extract_delim, eof)
   59:      _IO_FILE *fp;
   60:      wchar_t *buf;
   61:      _IO_size_t n;
   62:      wint_t delim;
   63:      int extract_delim;
   64:      wint_t *eof;
   65: {
   66:   wchar_t *ptr = buf;
   67:   if (eof != NULL)
   68:     *eof = 0;
   69:   if (__builtin_expect (fp->_mode, 1) == 0)
   70:     _IO_fwide (fp, 1);
   71:   while (n != 0)
   72:     {
   73:       _IO_ssize_t len = (fp->_wide_data->_IO_read_end
   74:                          - fp->_wide_data->_IO_read_ptr);
   75:       if (len <= 0)
   76:         {
   77:           wint_t wc = __wuflow (fp);
   78:           if (wc == WEOF)
   79:             {
   80:               if (eof)
   81:                 *eof = wc;
   82:               break;
   83:             }
   84:           if (wc == delim)
   85:             {
   86:               if (extract_delim > 0)
   87:                 *ptr++ = wc;
   88:               else if (extract_delim < 0)
   89:                 INTUSE(_IO_sputbackc) (fp, wc);
   90:               if (extract_delim > 0)
   91:                 ++len;
   92:               return ptr - buf;
   93:             }
   94:           *ptr++ = wc;
   95:           n--;
   96:         }
   97:       else
   98:         {
   99:           wchar_t *t;
  100:           if ((_IO_size_t) len >= n)
  101:             len = n;
  102:           t = wmemchr ((void *) fp->_wide_data->_IO_read_ptr, delim, len);
  103:           if (t != NULL)
  104:             {
  105:               _IO_size_t old_len = ptr - buf;
  106:               len = t - fp->_wide_data->_IO_read_ptr;
  107:               if (extract_delim >= 0)
  108:                 {
  109:                   ++t;
  110:                   if (extract_delim > 0)
  111:                     ++len;
  112:                 }
  113:               wmemcpy ((void *) ptr, (void *) fp->_wide_data->_IO_read_ptr,
  114:                        len);
  115:               fp->_wide_data->_IO_read_ptr = t;
  116:               return old_len + len;
  117:             }
  118:           wmemcpy ((void *) ptr, (void *) fp->_wide_data->_IO_read_ptr, len);
  119:           fp->_wide_data->_IO_read_ptr += len;
  120:           ptr += len;
  121:           n -= len;
  122:         }
  123:     }
  124:   return ptr - buf;
  125: }
  126: 
  127: #endif /* Defined _LIBC || !_G_HAVE_IO_GETLINE_INFO */
Syntax (Markdown)