X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=ucw%2Fdoc%2Ffastbuf.txt;h=13590a5dd431101a97ae3baec0b3947f6f8915c2;hb=ae2b00416589dfe798fc40f0575f62a0c664798f;hp=df803a084622f735088dac2d07bdf568eb74ffc1;hpb=91972e1a8200da60d621b5341fc2e672a6d9f77b;p=libucw.git diff --git a/ucw/doc/fastbuf.txt b/ucw/doc/fastbuf.txt index df803a08..13590a5d 100644 --- a/ucw/doc/fastbuf.txt +++ b/ucw/doc/fastbuf.txt @@ -1,12 +1,84 @@ Fastbufs ======== -Fastbufs are stream and file abstractions. They work with normal -files, network sockets, memory buffers or just any file descriptor. It -should be easy to implement other types by providing functions to -refill and read the buffer. +A *fastbuf* is a stream (or file) abstraction optimized for both speed +and flexibility. -Apart from abstraction, they are very fast. +Fastbufs can represent many different kinds of objects: regular files, network +sockets, file descriptors in general, or various memory buffers. These objects +are handled by different fastbuf *back-ends.* + +Once you have a fastbuf, you can access it by fuctions similar to those of +`stdio.h`, or you can use a variety of fastbuf *front-ends* providing various +formatted operations. + +Please keep in mind that fastbufs do not allow arbitrary mixing of reads and +writes on the same stream. If you need to mix them, you have to call @bflush() +inbetween and remember that the file position reported by @btell() points after +the flushed buffer, which is not necessarily the same as after the data you've +really read. + +Fastbufs can also participate in the libucw resource management system. +You can tie a fastbuf to a resource in the current resource pool by @fb_tie(). +When the pool gets cleaned up, the fastbuf is automatically closed. If you call +@bclose() explicitly, the resource is removed, too. + +.Back-ends: +- <> +- <> +- <> +- <> +- <> +- <> +- <> +- <> +- <> + +.Front-ends: +- <> + +.Other reading: +- <> +- <> +- <> + +ucw/fastbuf.h +------------- -The main iclude file is +ucw/fastbuf.h+: + !!ucw/fastbuf.h + +ucw/fb-socket.h +--------------- + +Fastbufs on network sockets with timeouts. + +!!ucw/fb-socket.h + +ucw/ff-unicode.h +---------------- + +Reading and writing of unicode characters. + +Invalid codes are replaced by `UNI_REPLACEMENT` when reading. + +!!ucw/ff-unicode.h + +ucw/ff-binary.h +--------------- + +!!ucw/ff-binary.h + +Exceptions [[fbexc]] +-------------------- + +All standard back-ends and front-ends raise exceptions on errors. All such +exceptions live in the `ucw.fb` subtree. The following exceptions are defined: + +`ucw.fb.eof`:: Unexpected end of file (e.g., when the @FB_DIE_ON_EOF flag is set) +`ucw.fb.mmap`:: Memory mapping failed (e.g., the `mmap` syscall has failed) +`ucw.fb.open`:: Opening failed (file does not exist and similar problems) +`ucw.fb.read`:: Read error (e.g., the `read` syscall has failed or the stream is write-only) +`ucw.fb.seek`:: Seek error (e.g., file not seekable, or a seek behind EOF) +`ucw.fb.tmp`:: Creation of temporary file failed +`ucw.fb.toolong`:: Object (typically a line) is too long +`ucw.fb.write`:: Write error (e.g., the `write` syscall has failed or the stream is read-only)