# SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2024-03-01 16:56+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: TH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "fopencookie" msgstr "" #. type: TH #: archlinux fedora-40 fedora-rawhide mageia-cauldron #, no-wrap msgid "2023-12-29" msgstr "" #. type: TH #: archlinux fedora-40 fedora-rawhide mageia-cauldron #, no-wrap msgid "Linux man-pages 6.06" msgstr "" #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "NAME" msgstr "" #. type: Plain text #: archlinux fedora-40 fedora-rawhide mageia-cauldron msgid "fopencookie - open a custom stream" msgstr "" #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "LIBRARY" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "Standard C library (I, I<-lc>)" msgstr "" #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "SYNOPSIS" msgstr "" #. type: Plain text #: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron #: opensuse-tumbleweed #, no-wrap msgid "" "B<#define _GNU_SOURCE> /* See feature_test_macros(7) */\n" "B<#define _FILE_OFFSET_BITS 64>\n" "B<#include Estdio.hE>\n" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "" "BIB<, const char *restrict >IB<,>\n" "B< cookie_io_functions_t >IB<);>\n" msgstr "" #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "DESCRIPTION" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The B() function allows the programmer to create a custom " "implementation for a standard I/O stream. This implementation can store the " "stream's data at a location of its own choosing; for example, " "B() is used to implement B(3), which provides a " "stream interface to data that is stored in a buffer in memory." msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "In order to create a custom stream the programmer must:" msgstr "" #. type: IP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "\\[bu]" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Implement four \"hook\" functions that are used internally by the standard I/" "O library when performing I/O on the stream." msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Define a \"cookie\" data type, a structure that provides bookkeeping " "information (e.g., where to store data) used by the aforementioned hook " "functions. The standard I/O package knows nothing about the contents of " "this cookie (thus it is typed as I when passed to " "B()), but automatically supplies the cookie as the first " "argument when calling the hook functions." msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Call B() to open a new stream and associate the cookie and " "hook functions with that stream." msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The B() function serves a purpose similar to B(3): it " "opens a new stream and returns a pointer to a I object that is used to " "operate on that stream." msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The I argument is a pointer to the caller's cookie structure that is " "to be associated with the new stream. This pointer is supplied as the first " "argument when the standard I/O library invokes any of the hook functions " "described below." msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The I argument serves the same purpose as for B(3). The " "following modes are supported: I, I, I, I, I, and I. " "See B(3) for details." msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The I argument is a structure that contains four fields pointing " "to the programmer-defined hook functions that are used to implement this " "stream. The structure is defined as follows" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "" "typedef struct {\n" " cookie_read_function_t *read;\n" " cookie_write_function_t *write;\n" " cookie_seek_function_t *seek;\n" " cookie_close_function_t *close;\n" "} cookie_io_functions_t;\n" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "The four fields are as follows:" msgstr "" #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "I" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "This function implements read operations for the stream. When called, it " "receives three arguments:" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "ssize_t read(void *cookie, char *buf, size_t size);\n" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The I and I arguments are, respectively, a buffer into which " "input data can be placed and the size of that buffer. As its function " "result, the I function should return the number of bytes copied into " "I, 0 on end of file, or -1 on error. The I function should " "update the stream offset appropriately." msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "If I<*read> is a null pointer, then reads from the custom stream always " "return end of file." msgstr "" #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "I" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "This function implements write operations for the stream. When called, it " "receives three arguments:" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "ssize_t write(void *cookie, const char *buf, size_t size);\n" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The I and I arguments are, respectively, a buffer of data to be " "output to the stream and the size of that buffer. As its function result, " "the I function should return the number of bytes copied from I, " "or 0 on error. (The function must not return a negative value.) The " "I function should update the stream offset appropriately." msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "If I<*write> is a null pointer, then output to the stream is discarded." msgstr "" #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "I" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "This function implements seek operations on the stream. When called, it " "receives three arguments:" msgstr "" #. type: Plain text #: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron #: opensuse-tumbleweed #, no-wrap msgid "int seek(void *cookie, off_t *offset, int whence);\n" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The I<*offset> argument specifies the new file offset depending on which of " "the following three values is supplied in I:" msgstr "" #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The stream offset should be set I<*offset> bytes from the start of the " "stream." msgstr "" #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "I<*offset> should be added to the current stream offset." msgstr "" #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The stream offset should be set to the size of the stream plus I<*offset>." msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Before returning, the I function should update I<*offset> to indicate " "the new stream offset." msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "As its function result, the I function should return 0 on success, and " "-1 on error." msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "If I<*seek> is a null pointer, then it is not possible to perform seek " "operations on the stream." msgstr "" #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "I" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "This function closes the stream. The hook function can do things such as " "freeing buffers allocated for the stream. When called, it receives one " "argument:" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "int close(void *cookie);\n" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The I argument is the cookie that the programmer supplied when " "calling B()." msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "As its function result, the I function should return 0 on success, " "and B on error." msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "If I<*close> is NULL, then no special action is performed when the stream is " "closed." msgstr "" #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "RETURN VALUE" msgstr "" #. .SH ERRORS #. It's not clear if errno ever gets set... #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "On success B() returns a pointer to the new stream. On error, " "NULL is returned." msgstr "" #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "ATTRIBUTES" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "For an explanation of the terms used in this section, see B(7)." msgstr "" #. type: tbl table #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "Interface" msgstr "" #. type: tbl table #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "Attribute" msgstr "" #. type: tbl table #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "Value" msgstr "" #. type: tbl table #: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron #: opensuse-tumbleweed #, no-wrap msgid ".na\n" msgstr "" #. type: tbl table #: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron #: opensuse-tumbleweed #, no-wrap msgid ".nh\n" msgstr "" #. type: tbl table #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B()" msgstr "" #. type: tbl table #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "Thread safety" msgstr "" #. type: tbl table #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "MT-Safe" msgstr "" #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "STANDARDS" msgstr "" #. type: Plain text #: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron #: opensuse-leap-15-6 opensuse-tumbleweed msgid "GNU." msgstr "" #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "EXAMPLES" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The program below implements a custom stream whose functionality is similar " "(but not identical) to that available via B(3). It implements a " "stream whose data is stored in a memory buffer. The program writes its " "command-line arguments to the stream, and then seeks through the stream " "reading two out of every five characters and writing them to standard " "output. The following shell session demonstrates the use of the program:" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "" "$B< ./a.out \\[aq]hello world\\[aq]>\n" "/he/\n" "/ w/\n" "/d/\n" "Reached end of file\n" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Note that a more general version of the program below could be improved to " "more robustly handle various error situations (e.g., opening a stream with a " "cookie that already has an open stream; closing a stream that has already " "been closed)." msgstr "" #. type: SS #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "Program source" msgstr "" #. type: Plain text #: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron #: opensuse-tumbleweed #, no-wrap msgid "" "#define _GNU_SOURCE\n" "#include Estdio.hE\n" "#include Estdlib.hE\n" "#include Estring.hE\n" "#include Esys/types.hE\n" "#include Eunistd.hE\n" "\\&\n" "#define INIT_BUF_SIZE 4\n" "\\&\n" "struct memfile_cookie {\n" " char *buf; /* Dynamically sized buffer for data */\n" " size_t allocated; /* Size of buf */\n" " size_t endpos; /* Number of characters in buf */\n" " off_t offset; /* Current file offset in buf */\n" "};\n" "\\&\n" "ssize_t\n" "memfile_write(void *c, const char *buf, size_t size)\n" "{\n" " char *new_buff;\n" " struct memfile_cookie *cookie = c;\n" "\\&\n" " /* Buffer too small? Keep doubling size until big enough. */\n" "\\&\n" " while (size + cookie-Eoffset E cookie-Eallocated) {\n" " new_buff = realloc(cookie-Ebuf, cookie-Eallocated * 2);\n" " if (new_buff == NULL)\n" " return -1;\n" " cookie-Eallocated *= 2;\n" " cookie-Ebuf = new_buff;\n" " }\n" "\\&\n" " memcpy(cookie-Ebuf + cookie-Eoffset, buf, size);\n" "\\&\n" " cookie-Eoffset += size;\n" " if (cookie-Eoffset E cookie-Eendpos)\n" " cookie-Eendpos = cookie-Eoffset;\n" "\\&\n" " return size;\n" "}\n" "\\&\n" "ssize_t\n" "memfile_read(void *c, char *buf, size_t size)\n" "{\n" " ssize_t xbytes;\n" " struct memfile_cookie *cookie = c;\n" "\\&\n" " /* Fetch minimum of bytes requested and bytes available. */\n" "\\&\n" " xbytes = size;\n" " if (cookie-Eoffset + size E cookie-Eendpos)\n" " xbytes = cookie-Eendpos - cookie-Eoffset;\n" " if (xbytes E 0) /* offset may be past endpos */\n" " xbytes = 0;\n" "\\&\n" " memcpy(buf, cookie-Ebuf + cookie-Eoffset, xbytes);\n" "\\&\n" " cookie-Eoffset += xbytes;\n" " return xbytes;\n" "}\n" "\\&\n" "int\n" "memfile_seek(void *c, off_t *offset, int whence)\n" "{\n" " off_t new_offset;\n" " struct memfile_cookie *cookie = c;\n" "\\&\n" " if (whence == SEEK_SET)\n" " new_offset = *offset;\n" " else if (whence == SEEK_END)\n" " new_offset = cookie-Eendpos + *offset;\n" " else if (whence == SEEK_CUR)\n" " new_offset = cookie-Eoffset + *offset;\n" " else\n" " return -1;\n" "\\&\n" " if (new_offset E 0)\n" " return -1;\n" "\\&\n" " cookie-Eoffset = new_offset;\n" " *offset = new_offset;\n" " return 0;\n" "}\n" "\\&\n" "int\n" "memfile_close(void *c)\n" "{\n" " struct memfile_cookie *cookie = c;\n" "\\&\n" " free(cookie-Ebuf);\n" " cookie-Eallocated = 0;\n" " cookie-Ebuf = NULL;\n" "\\&\n" " return 0;\n" "}\n" "\\&\n" "int\n" "main(int argc, char *argv[])\n" "{\n" " cookie_io_functions_t memfile_func = {\n" " .read = memfile_read,\n" " .write = memfile_write,\n" " .seek = memfile_seek,\n" " .close = memfile_close\n" " };\n" " FILE *stream;\n" " struct memfile_cookie mycookie;\n" " size_t nread;\n" " char buf[1000];\n" "\\&\n" " /* Set up the cookie before calling fopencookie(). */\n" "\\&\n" " mycookie.buf = malloc(INIT_BUF_SIZE);\n" " if (mycookie.buf == NULL) {\n" " perror(\"malloc\");\n" " exit(EXIT_FAILURE);\n" " }\n" "\\&\n" " mycookie.allocated = INIT_BUF_SIZE;\n" " mycookie.offset = 0;\n" " mycookie.endpos = 0;\n" "\\&\n" " stream = fopencookie(&mycookie, \"w+\", memfile_func);\n" " if (stream == NULL) {\n" " perror(\"fopencookie\");\n" " exit(EXIT_FAILURE);\n" " }\n" "\\&\n" " /* Write command-line arguments to our file. */\n" "\\&\n" " for (size_t j = 1; j E argc; j++)\n" " if (fputs(argv[j], stream) == EOF) {\n" " perror(\"fputs\");\n" " exit(EXIT_FAILURE);\n" " }\n" "\\&\n" " /* Read two bytes out of every five, until EOF. */\n" "\\&\n" " for (long p = 0; ; p += 5) {\n" " if (fseek(stream, p, SEEK_SET) == -1) {\n" " perror(\"fseek\");\n" " exit(EXIT_FAILURE);\n" " }\n" " nread = fread(buf, 1, 2, stream);\n" " if (nread == 0) {\n" " if (ferror(stream) != 0) {\n" " fprintf(stderr, \"fread failed\\en\");\n" " exit(EXIT_FAILURE);\n" " }\n" " printf(\"Reached end of file\\en\");\n" " break;\n" " }\n" "\\&\n" " printf(\"/%.*s/\\en\", (int) nread, buf);\n" " }\n" "\\&\n" " free(mycookie.buf);\n" "\\&\n" " exit(EXIT_SUCCESS);\n" "}\n" msgstr "" #. SRC END #. type: SH #: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron #: opensuse-tumbleweed #, no-wrap msgid "NOTES" msgstr "" #. type: Plain text #: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron #: opensuse-tumbleweed msgid "" "B<_FILE_OFFSET_BITS> should be defined to be 64 in code that uses non-null " "I or that takes the address of B, if the code is intended " "to be portable to traditional 32-bit x86 and ARM platforms where B's " "width defaults to 32 bits." msgstr "" #. #-#-#-#-# archlinux: fopencookie.3.pot (PACKAGE VERSION) #-#-#-#-# #. type: SH #. #-#-#-#-# debian-bookworm: fopencookie.3.pot (PACKAGE VERSION) #-#-#-#-# #. SRC END #. type: SH #. #-#-#-#-# debian-unstable: fopencookie.3.pot (PACKAGE VERSION) #-#-#-#-# #. type: SH #. #-#-#-#-# fedora-40: fopencookie.3.pot (PACKAGE VERSION) #-#-#-#-# #. type: SH #. #-#-#-#-# fedora-rawhide: fopencookie.3.pot (PACKAGE VERSION) #-#-#-#-# #. type: SH #. #-#-#-#-# mageia-cauldron: fopencookie.3.pot (PACKAGE VERSION) #-#-#-#-# #. type: SH #. #-#-#-#-# opensuse-leap-15-6: fopencookie.3.pot (PACKAGE VERSION) #-#-#-#-# #. SRC END #. type: SH #. #-#-#-#-# opensuse-tumbleweed: fopencookie.3.pot (PACKAGE VERSION) #-#-#-#-# #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "SEE ALSO" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "B(3), B(3), B(3), B(3)" msgstr "" #. type: TH #: debian-bookworm #, no-wrap msgid "2023-02-05" msgstr "" #. type: TH #: debian-bookworm #, no-wrap msgid "Linux man-pages 6.03" msgstr "" #. type: Plain text #: debian-bookworm debian-unstable opensuse-leap-15-6 opensuse-tumbleweed msgid "fopencookie - opening a custom stream" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" "B<#define _GNU_SOURCE> /* See feature_test_macros(7) */\n" "B<#include Estdio.hE>\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "int seek(void *cookie, off64_t *offset, int whence);\n" msgstr "" #. type: Plain text #: debian-bookworm msgid "This function is a nonstandard GNU extension." msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" "#define _GNU_SOURCE\n" "#include Estdio.hE\n" "#include Estdlib.hE\n" "#include Estring.hE\n" "#include Esys/types.hE\n" "#include Eunistd.hE\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "#define INIT_BUF_SIZE 4\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" "struct memfile_cookie {\n" " char *buf; /* Dynamically sized buffer for data */\n" " size_t allocated; /* Size of buf */\n" " size_t endpos; /* Number of characters in buf */\n" " off_t offset; /* Current file offset in buf */\n" "};\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" "ssize_t\n" "memfile_write(void *c, const char *buf, size_t size)\n" "{\n" " char *new_buff;\n" " struct memfile_cookie *cookie = c;\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid " /* Buffer too small? Keep doubling size until big enough. */\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " while (size + cookie-Eoffset E cookie-Eallocated) {\n" " new_buff = realloc(cookie-Ebuf, cookie-Eallocated * 2);\n" " if (new_buff == NULL)\n" " return -1;\n" " cookie-Eallocated *= 2;\n" " cookie-Ebuf = new_buff;\n" " }\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid " memcpy(cookie-Ebuf + cookie-Eoffset, buf, size);\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " cookie-Eoffset += size;\n" " if (cookie-Eoffset E cookie-Eendpos)\n" " cookie-Eendpos = cookie-Eoffset;\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " return size;\n" "}\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" "ssize_t\n" "memfile_read(void *c, char *buf, size_t size)\n" "{\n" " ssize_t xbytes;\n" " struct memfile_cookie *cookie = c;\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid " /* Fetch minimum of bytes requested and bytes available. */\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " xbytes = size;\n" " if (cookie-Eoffset + size E cookie-Eendpos)\n" " xbytes = cookie-Eendpos - cookie-Eoffset;\n" " if (xbytes E 0) /* offset may be past endpos */\n" " xbytes = 0;\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid " memcpy(buf, cookie-Ebuf + cookie-Eoffset, xbytes);\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " cookie-Eoffset += xbytes;\n" " return xbytes;\n" "}\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" "int\n" "memfile_seek(void *c, off64_t *offset, int whence)\n" "{\n" " off64_t new_offset;\n" " struct memfile_cookie *cookie = c;\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " if (whence == SEEK_SET)\n" " new_offset = *offset;\n" " else if (whence == SEEK_END)\n" " new_offset = cookie-Eendpos + *offset;\n" " else if (whence == SEEK_CUR)\n" " new_offset = cookie-Eoffset + *offset;\n" " else\n" " return -1;\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " if (new_offset E 0)\n" " return -1;\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " cookie-Eoffset = new_offset;\n" " *offset = new_offset;\n" " return 0;\n" "}\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" "int\n" "memfile_close(void *c)\n" "{\n" " struct memfile_cookie *cookie = c;\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " free(cookie-Ebuf);\n" " cookie-Eallocated = 0;\n" " cookie-Ebuf = NULL;\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " return 0;\n" "}\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" "int\n" "main(int argc, char *argv[])\n" "{\n" " cookie_io_functions_t memfile_func = {\n" " .read = memfile_read,\n" " .write = memfile_write,\n" " .seek = memfile_seek,\n" " .close = memfile_close\n" " };\n" " FILE *stream;\n" " struct memfile_cookie mycookie;\n" " size_t nread;\n" " char buf[1000];\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid " /* Set up the cookie before calling fopencookie(). */\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " mycookie.buf = malloc(INIT_BUF_SIZE);\n" " if (mycookie.buf == NULL) {\n" " perror(\"malloc\");\n" " exit(EXIT_FAILURE);\n" " }\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " mycookie.allocated = INIT_BUF_SIZE;\n" " mycookie.offset = 0;\n" " mycookie.endpos = 0;\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " stream = fopencookie(&mycookie, \"w+\", memfile_func);\n" " if (stream == NULL) {\n" " perror(\"fopencookie\");\n" " exit(EXIT_FAILURE);\n" " }\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid " /* Write command-line arguments to our file. */\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " for (size_t j = 1; j E argc; j++)\n" " if (fputs(argv[j], stream) == EOF) {\n" " perror(\"fputs\");\n" " exit(EXIT_FAILURE);\n" " }\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid " /* Read two bytes out of every five, until EOF. */\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " for (long p = 0; ; p += 5) {\n" " if (fseek(stream, p, SEEK_SET) == -1) {\n" " perror(\"fseek\");\n" " exit(EXIT_FAILURE);\n" " }\n" " nread = fread(buf, 1, 2, stream);\n" " if (nread == 0) {\n" " if (ferror(stream) != 0) {\n" " fprintf(stderr, \"fread failed\\en\");\n" " exit(EXIT_FAILURE);\n" " }\n" " printf(\"Reached end of file\\en\");\n" " break;\n" " }\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " printf(\"/%.*s/\\en\", (int) nread, buf);\n" " }\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid " free(mycookie.buf);\n" msgstr "" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " exit(EXIT_SUCCESS);\n" "}\n" msgstr "" #. type: TH #: debian-unstable opensuse-tumbleweed #, no-wrap msgid "2023-07-20" msgstr "" #. type: TH #: debian-unstable opensuse-tumbleweed #, no-wrap msgid "Linux man-pages 6.05.01" msgstr "" #. type: TH #: opensuse-leap-15-6 #, no-wrap msgid "2023-03-30" msgstr "" #. type: TH #: opensuse-leap-15-6 #, no-wrap msgid "Linux man-pages 6.04" msgstr ""