diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2003-08-28 21:54:06 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2003-08-28 21:54:06 +0000 |
commit | cb24761827f2e55a8f3297a6ddd78a0d52f8908a (patch) | |
tree | df7798e9fbae72d1011a9ac98a403bbec39bb6ad /auth | |
parent | b637f9c86863130e5d2dc22777c1ada65ab37f9c (diff) | |
download | mailutils-cb24761827f2e55a8f3297a6ddd78a0d52f8908a.tar.gz mailutils-cb24761827f2e55a8f3297a6ddd78a0d52f8908a.tar.bz2 |
(_auth_lb_writelines): New function.
Diffstat (limited to 'auth')
-rw-r--r-- | auth/lbuf.c | 41 | ||||
-rw-r--r-- | auth/lbuf.h | 39 |
2 files changed, 71 insertions, 9 deletions
diff --git a/auth/lbuf.c b/auth/lbuf.c index 2f2322833..3d41b9851 100644 --- a/auth/lbuf.c +++ b/auth/lbuf.c @@ -110,7 +110,46 @@ _auth_lb_readline (struct _line_buffer *s, const char *ptr, size_t size) size = p - s->buffer + 1; return _auth_lb_read (s, ptr, size); } - + +int +_auth_lb_writelines (struct _line_buffer *s, const char *iptr, size_t isize, + off_t offset, + int (*wr) (void *data, char *start, char *end), + void *data, + size_t *nbytes) +{ + if (s->level > 2) + { + char *start, *end; + + for (start = s->buffer, end = strchr (start, '\n'); + end && end < s->buffer + s->level; + start = end + 1, end = strchr (start, '\n')) + if (end[-1] == '\r') + { + int rc = wr (data, start, end); + if (rc) + return rc; + } + + if (start > s->buffer) + { + if (start < s->buffer + s->level) + { + int rest = s->buffer + s->level - start + 1; + memmove (s->buffer, start, rest); + s->level = rest; + } + else + s->level = 0; + } + } + + if (nbytes) + *nbytes = isize; + return 0; +} + int _auth_lb_level (struct _line_buffer *s) { diff --git a/auth/lbuf.h b/auth/lbuf.h index 03db01e97..1ef36ad6e 100644 --- a/auth/lbuf.h +++ b/auth/lbuf.h @@ -1,13 +1,36 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 2003 Free Software Foundation, Inc. + + This 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 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 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + struct _line_buffer; -int _auth_lb_create (struct _line_buffer **s); -void _auth_lb_destroy (struct _line_buffer **s); -void _auth_lb_drop (struct _line_buffer *s); +int _auth_lb_create __P((struct _line_buffer **s)); +void _auth_lb_destroy __P((struct _line_buffer **s)); +void _auth_lb_drop __P((struct _line_buffer *s)); -int _auth_lb_grow (struct _line_buffer *s, const char *ptr, size_t size); -int _auth_lb_read (struct _line_buffer *s, const char *ptr, size_t size); -int _auth_lb_readline (struct _line_buffer *s, const char *ptr, size_t size); -int _auth_lb_level (struct _line_buffer *s); -char *_auth_lb_data (struct _line_buffer *s); +int _auth_lb_grow __P((struct _line_buffer *s, const char *ptr, size_t size)); +int _auth_lb_read __P((struct _line_buffer *s, const char *ptr, size_t size)); +int _auth_lb_readline __P((struct _line_buffer *s, const char *ptr, + size_t size)); +int _auth_lb_writelines __P((struct _line_buffer *s, const char *iptr, + size_t isize, off_t offset, + int (*wr) __PMT ((void *data, char *start, + char *end)), + void *data, size_t *nbytes)); +int _auth_lb_level __P((struct _line_buffer *s)); +char *_auth_lb_data __P((struct _line_buffer *s)); |