summaryrefslogtreecommitdiffstats
path: root/man3/fopencookie.3
diff options
context:
space:
mode:
Diffstat (limited to 'man3/fopencookie.3')
-rw-r--r--man3/fopencookie.364
1 files changed, 32 insertions, 32 deletions
diff --git a/man3/fopencookie.3 b/man3/fopencookie.3
index 36616af12..409a3c81a 100644
--- a/man3/fopencookie.3
+++ b/man3/fopencookie.3
@@ -295,24 +295,24 @@ closing a stream that has already been closed).
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
-
+\&
#define INIT_BUF_SIZE 4
-
+\&
struct memfile_cookie {
char *buf; /* Dynamically sized buffer for data */
size_t allocated; /* Size of buf */
size_t endpos; /* Number of characters in buf */
off_t offset; /* Current file offset in buf */
};
-
+\&
ssize_t
memfile_write(void *c, const char *buf, size_t size)
{
char *new_buff;
struct memfile_cookie *cookie = c;
-
+\&
/* Buffer too small? Keep doubling size until big enough. */
-
+\&
while (size + cookie\->offset > cookie\->allocated) {
new_buff = realloc(cookie\->buf, cookie\->allocated * 2);
if (new_buff == NULL)
@@ -320,42 +320,42 @@ memfile_write(void *c, const char *buf, size_t size)
cookie\->allocated *= 2;
cookie\->buf = new_buff;
}
-
+\&
memcpy(cookie\->buf + cookie\->offset, buf, size);
-
+\&
cookie\->offset += size;
if (cookie\->offset > cookie\->endpos)
cookie\->endpos = cookie\->offset;
-
+\&
return size;
}
-
+\&
ssize_t
memfile_read(void *c, char *buf, size_t size)
{
ssize_t xbytes;
struct memfile_cookie *cookie = c;
-
+\&
/* Fetch minimum of bytes requested and bytes available. */
-
+\&
xbytes = size;
if (cookie\->offset + size > cookie\->endpos)
xbytes = cookie\->endpos \- cookie\->offset;
if (xbytes < 0) /* offset may be past endpos */
xbytes = 0;
-
+\&
memcpy(buf, cookie\->buf + cookie\->offset, xbytes);
-
+\&
cookie\->offset += xbytes;
return xbytes;
}
-
+\&
int
memfile_seek(void *c, off64_t *offset, int whence)
{
off64_t new_offset;
struct memfile_cookie *cookie = c;
-
+\&
if (whence == SEEK_SET)
new_offset = *offset;
else if (whence == SEEK_END)
@@ -364,27 +364,27 @@ memfile_seek(void *c, off64_t *offset, int whence)
new_offset = cookie\->offset + *offset;
else
return \-1;
-
+\&
if (new_offset < 0)
return \-1;
-
+\&
cookie\->offset = new_offset;
*offset = new_offset;
return 0;
}
-
+\&
int
memfile_close(void *c)
{
struct memfile_cookie *cookie = c;
-
+\&
free(cookie\->buf);
cookie\->allocated = 0;
cookie\->buf = NULL;
-
+\&
return 0;
}
-
+\&
int
main(int argc, char *argv[])
{
@@ -398,35 +398,35 @@ main(int argc, char *argv[])
struct memfile_cookie mycookie;
size_t nread;
char buf[1000];
-
+\&
/* Set up the cookie before calling fopencookie(). */
-
+\&
mycookie.buf = malloc(INIT_BUF_SIZE);
if (mycookie.buf == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
-
+\&
mycookie.allocated = INIT_BUF_SIZE;
mycookie.offset = 0;
mycookie.endpos = 0;
-
+\&
stream = fopencookie(&mycookie, "w+", memfile_func);
if (stream == NULL) {
perror("fopencookie");
exit(EXIT_FAILURE);
}
-
+\&
/* Write command\-line arguments to our file. */
-
+\&
for (size_t j = 1; j < argc; j++)
if (fputs(argv[j], stream) == EOF) {
perror("fputs");
exit(EXIT_FAILURE);
}
-
+\&
/* Read two bytes out of every five, until EOF. */
-
+\&
for (long p = 0; ; p += 5) {
if (fseek(stream, p, SEEK_SET) == \-1) {
perror("fseek");
@@ -441,12 +441,12 @@ main(int argc, char *argv[])
printf("Reached end of file\en");
break;
}
-
+\&
printf("/%.*s/\en", (int) nread, buf);
}
-
+\&
free(mycookie.buf);
-
+\&
exit(EXIT_SUCCESS);
}
.EE