]> mj.ucw.cz Git - libucw.git/blobdiff - lib/fastbuf.h
Merged obj2buck.h and buck2obj.h to object.h, the number of includes
[libucw.git] / lib / fastbuf.h
index 266ea220e2ae14ba8c4bb7cf252a08bac5228c02..45ce06916f0c388831a57d3293104a810a684c61 100644 (file)
@@ -1,7 +1,8 @@
 /*
  *     Sherlock Library -- Fast Buffered I/O
  *
 /*
  *     Sherlock Library -- Fast Buffered I/O
  *
- *     (c) 1997--2002 Martin Mares <mj@ucw.cz>
+ *     (c) 1997--2004 Martin Mares <mj@ucw.cz>
+ *     (c) 2004 Robert Spalek <robert@ucw.cz>
  *
  *     This software may be freely distributed and used according to the terms
  *     of the GNU Lesser General Public License.
  *
  *     This software may be freely distributed and used according to the terms
  *     of the GNU Lesser General Public License.
@@ -15,7 +16,6 @@
 #endif
 
 #include <string.h>
 #endif
 
 #include <string.h>
-#include <stdarg.h>
 
 #include "lib/unaligned.h"
 
 
 #include "lib/unaligned.h"
 
  *     as after the data you've read.
  *    - The spout/refill hooks can change not only bptr and bstop, but also
  *     the location of the buffer; fb-mem.c takes advantage of it.
  *     as after the data you've read.
  *    - The spout/refill hooks can change not only bptr and bstop, but also
  *     the location of the buffer; fb-mem.c takes advantage of it.
+ *    - In some cases, the user of the bdirect interface can be allowed to modify
+ *     the data in the buffer to avoid unnecessary copying. If the back-end
+ *     allows such modifications, it can set can_overwrite_buffer accordingly:
+ *             *  0 if no modification is allowed,
+ *             *  1 if the user can modify the buffer on the condition that
+ *                  the modifications will be undone before calling the next
+ *                  fastbuf operation
+ *             *  2 if the user is allowed to overwrite the data in the buffer
+ *                  if bdirect_read_commit_modified() is called afterwards.
+ *                  In this case, the back-end must be prepared for trimming
+ *                  of the buffer which is done by the commit function.
  */
 
 struct fastbuf {
  */
 
 struct fastbuf {
@@ -64,14 +75,15 @@ struct fastbuf {
   void (*seek)(struct fastbuf *, sh_off_t, int);  /* Slow path for bseek(), buffer already flushed */
   void (*close)(struct fastbuf *);     /* Close the stream */
   int (*config)(struct fastbuf *, uns, int);   /* Configure the stream */
   void (*seek)(struct fastbuf *, sh_off_t, int);  /* Slow path for bseek(), buffer already flushed */
   void (*close)(struct fastbuf *);     /* Close the stream */
   int (*config)(struct fastbuf *, uns, int);   /* Configure the stream */
+  int can_overwrite_buffer;            /* Can the buffer be altered? (see discussion above) 0=never, 1=temporarily, 2=permanently */
 };
 
 /* FastIO on standard files (specify buffer size 0 to enable mmaping) */
 
 };
 
 /* FastIO on standard files (specify buffer size 0 to enable mmaping) */
 
-struct fastbuf *bopen(byte *name, uns mode, uns buffer);
-struct fastbuf *bopen_tmp(uns buffer);
-struct fastbuf *bfdopen(int fd, uns buffer);
-struct fastbuf *bfdopen_shared(int fd, uns buffer);
+struct fastbuf *bopen(byte *name, uns mode, uns buflen);
+struct fastbuf *bopen_tmp(uns buflen);
+struct fastbuf *bfdopen(int fd, uns buflen);
+struct fastbuf *bfdopen_shared(int fd, uns buflen);
 
 /* FastIO on in-memory streams */
 
 
 /* FastIO on in-memory streams */
 
@@ -108,6 +120,8 @@ void bclose(struct fastbuf *f);
 void bflush(struct fastbuf *f);
 void bseek(struct fastbuf *f, sh_off_t pos, int whence);
 void bsetpos(struct fastbuf *f, sh_off_t pos);
 void bflush(struct fastbuf *f);
 void bseek(struct fastbuf *f, sh_off_t pos, int whence);
 void bsetpos(struct fastbuf *f, sh_off_t pos);
+void brewind(struct fastbuf *f);
+void bskip(struct fastbuf *f, uns len);
 
 static inline sh_off_t btell(struct fastbuf *f)
 {
 
 static inline sh_off_t btell(struct fastbuf *f)
 {
@@ -346,6 +360,13 @@ bdirect_read_commit(struct fastbuf *f, byte *pos)
   f->bptr = pos;
 }
 
   f->bptr = pos;
 }
 
+static inline void
+bdirect_read_commit_modified(struct fastbuf *f, byte *pos)
+{
+  f->bptr = pos;
+  f->buffer = pos;     /* Avoid seeking backwards in the buffer */
+}
+
 static inline uns
 bdirect_write_prepare(struct fastbuf *f, byte **buf)
 {
 static inline uns
 bdirect_write_prepare(struct fastbuf *f, byte **buf)
 {