diff options
author | Ulrich Drepper <drepper@redhat.com> | 2008-08-14 06:37:17 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2008-08-14 06:37:17 +0000 |
commit | 7b3ba2c4ebbe28d60224d79c7b7aa2a0e28fca78 (patch) | |
tree | 960fcc91a4fa99536323e3caa73f871a4481824d /libio | |
parent | 1bfa05cfaa4177476fd57851d867c5d1a276a34b (diff) | |
download | glibc-7b3ba2c4ebbe28d60224d79c7b7aa2a0e28fca78.tar.gz |
[BZ #6544]
* libio/fmemopen.c: Implement binary mode. In this mode no NUL
byte gets added to writes and seeks from the end use the length of
the buffer and not the currently terminating NUL byte.
Diffstat (limited to 'libio')
-rw-r--r-- | libio/fmemopen.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/libio/fmemopen.c b/libio/fmemopen.c index f3b280092c..b618ce585d 100644 --- a/libio/fmemopen.c +++ b/libio/fmemopen.c @@ -1,7 +1,7 @@ /* Fmemopen implementation. - Copyright (C) 2000, 2002, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2000, 2002, 2005, 2006, 2008 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Hanno Mueller, kontakt@hanno.de, 2000. + Contributed by Hanno Mueller, kontakt@hanno.de, 2000. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -82,6 +82,7 @@ struct fmemopen_cookie_struct { char *buffer; int mybuffer; + int binmode; size_t size; _IO_off64_t pos; size_t maxpos; @@ -120,7 +121,7 @@ fmemopen_write (void *cookie, const char *b, size_t s) c = (fmemopen_cookie_t *) cookie; - addnullc = s == 0 || b[s - 1] != '\0'; + addnullc = c->binmode == 0 && (s == 0 || b[s - 1] != '\0'); if (c->pos + s + addnullc > c->size) { @@ -165,7 +166,7 @@ fmemopen_seek (void *cookie, _IO_off64_t *p, int w) break; case SEEK_END: - np = c->maxpos - *p; + np = (c->binmode ? c->size : c->maxpos) - *p; break; default: @@ -248,6 +249,8 @@ fmemopen (void *buf, size_t len, const char *mode) else c->pos = 0; + c->binmode = mode[0] != '\0' && mode[1] == 'b'; + iof.read = fmemopen_read; iof.write = fmemopen_write; iof.seek = fmemopen_seek; |