X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Ffastbuf.h;h=cd08fa8a9b88839800729f81cde5141850d2cbd8;hb=995458e48d482bd5fa349882fba5cb4d6350076d;hp=77345c2aaa438370def244669fbb7dab2821b589;hpb=b3f16cf83f9594d2c4e88d1c3ffa5458b1a9f245;p=libucw.git diff --git a/lib/fastbuf.h b/lib/fastbuf.h index 77345c2a..cd08fa8a 100644 --- a/lib/fastbuf.h +++ b/lib/fastbuf.h @@ -43,6 +43,7 @@ struct fastbuf { sh_off_t pos; /* Position of buffer start in the file */ sh_off_t fdpos; /* Current position in the non-buffered file */ int fd; /* File descriptor, -1 if not a real file */ + int is_temp_file; /* Is a temporary file, delete on close */ void *lldata; /* Data private to access functions below */ void *llpos; /* ... continued ... */ int (*refill)(struct fastbuf *); /* Get a buffer with new data */ @@ -267,7 +268,7 @@ static inline void bput5(struct fastbuf *f, u64 l) bput5_slow(f, l); } -uns bread_slow(struct fastbuf *f, void *b, uns l); +uns bread_slow(struct fastbuf *f, void *b, uns l, uns check); static inline uns bread(struct fastbuf *f, void *b, uns l) { if (f->bptr + l <= f->bstop) @@ -277,7 +278,19 @@ static inline uns bread(struct fastbuf *f, void *b, uns l) return l; } else - return bread_slow(f, b, l); + return bread_slow(f, b, l, 0); +} + +static inline uns breadb(struct fastbuf *f, void *b, uns l) +{ + if (f->bptr + l <= f->bstop) + { + memcpy(b, f->bptr, l); + f->bptr += l; + return l; + } + else + return bread_slow(f, b, l, 1); } void bwrite_slow(struct fastbuf *f, void *b, uns l); @@ -293,6 +306,7 @@ static inline void bwrite(struct fastbuf *f, void *b, uns l) } byte *bgets(struct fastbuf *f, byte *b, uns l); /* Non-std */ +byte *bgets0(struct fastbuf *f, byte *b, uns l); static inline void bputs(struct fastbuf *f, byte *b) @@ -300,6 +314,12 @@ bputs(struct fastbuf *f, byte *b) bwrite(f, b, strlen(b)); } +static inline void +bputs0(struct fastbuf *f, byte *b) +{ + bwrite(f, b, strlen(b)+1); +} + static inline void bputsn(struct fastbuf *f, byte *b) { @@ -307,6 +327,12 @@ bputsn(struct fastbuf *f, byte *b) bputc(f, '\n'); } +/* Direct I/O on buffers */ + +int bdirect_read(struct fastbuf *f, byte **buf); +int bdirect_write_prepare(struct fastbuf *f, byte **buf); +void bdirect_write_commit(struct fastbuf *f, byte *pos); + /* Depending on compile-time configuration, we select the right function for reading/writing of file offsets */ #ifdef SHERLOCK_CONFIG_LARGE_DB @@ -314,11 +340,15 @@ bputsn(struct fastbuf *f, byte *b) #define bputo(f,l) bput5(f,l) #define bgetp(f) bgetq(f) #define bputp(f,l) bputq(f,l) +#define FASTBUF_BYTES_PER_O 5 +#define FASTBUF_BYTES_PER_P 8 #else #define bgeto(f) bgetl(f) #define bputo(f,l) bputl(f,l) #define bgetp(f) bgetl(f) #define bputp(f,l) bputl(f,l) +#define FASTBUF_BYTES_PER_O 4 +#define FASTBUF_BYTES_PER_P 4 #endif #endif