a whole bunch of internal cleanups
[gnupg.git] / include / iobuf.h
index a3c64a4..61c7653 100644 (file)
@@ -39,18 +39,14 @@ typedef struct iobuf_struct *IOBUF;
 struct iobuf_struct {
     int usage;          /* 1 input , 2 output, 3 temp */
     unsigned long nlimit;
-    unsigned long nbytes;
+    unsigned long nbytes; /* used together with nlimit */
+    unsigned long ntotal; /* total bytes read (position of stream) */
     struct {
        size_t size;   /* allocated size */
        size_t start;  /* number of invalid bytes at the begin of the buffer */
        size_t len;    /* currently filled to this size */
        byte *buf;
     } d;
-    struct {
-       size_t size;
-       size_t len;
-       char *buf;
-    } recorder;
     int filter_eof;
     int (*filter)( void *opaque, int control,
                   IOBUF chain, byte *buf, size_t *len);
@@ -58,6 +54,14 @@ struct iobuf_struct {
     IOBUF chain;       /* next iobuf used for i/o if any (passed to filter) */
     int no, subno;
     const char *desc;
+    void *opaque;      /* can be used to hold any information   */
+                      /* this value is copied to all instances */
+    struct {
+       size_t size;   /* allocated size */
+       size_t start;  /* number of invalid bytes at the begin of the buffer */
+       size_t len;    /* currently filled to this size */
+       byte *buf;
+    } unget;
 };
 
 int iobuf_debug_mode;
@@ -66,6 +70,8 @@ IOBUF iobuf_alloc(int usage, size_t bufsize);
 IOBUF iobuf_temp(void);
 IOBUF iobuf_open( const char *fname );
 IOBUF iobuf_create( const char *fname );
+IOBUF iobuf_append( const char *fname );
+IOBUF iobuf_openrw( const char *fname );
 int   iobuf_close( IOBUF iobuf );
 int   iobuf_cancel( IOBUF iobuf );
 
@@ -78,21 +84,25 @@ void iobuf_clear_eof(IOBUF a);
 
 void iobuf_set_limit( IOBUF a, unsigned long nlimit );
 
+ulong iobuf_tell( IOBUF a );
+int   iobuf_seek( IOBUF a, ulong newpos );
+
 int  iobuf_readbyte(IOBUF a);
+int  iobuf_read(IOBUF a, byte *buf, unsigned buflen );
+int  iobuf_peek(IOBUF a, byte *buf, unsigned buflen );
 int  iobuf_writebyte(IOBUF a, unsigned c);
 int  iobuf_write(IOBUF a, byte *buf, unsigned buflen );
 int  iobuf_writestr(IOBUF a, const char *buf );
 
 int  iobuf_write_temp( IOBUF a, IOBUF temp );
 size_t iobuf_temp_to_buffer( IOBUF a, byte *buffer, size_t buflen );
-
-void iobuf_start_recorder( IOBUF a );
-void iobuf_push_recorder( IOBUF a, int c );
-char *iobuf_stop_recorder( IOBUF a, size_t *n );
+void iobuf_unget_and_close_temp( IOBUF a, IOBUF temp );
 
 u32 iobuf_get_filelength( IOBUF a );
+const char *iobuf_get_fname( IOBUF a );
 
 void iobuf_set_block_mode( IOBUF a, size_t n );
+void iobuf_set_partial_block_mode( IOBUF a, size_t len );
 int  iobuf_in_block_mode( IOBUF a );
 
 /* get a byte form the iobuf; must check for eof prior to this function
@@ -101,11 +111,14 @@ int  iobuf_in_block_mode( IOBUF a );
  * returned value to be in the range 0 ..255.
  */
 #define iobuf_get(a)  \
-     ( ((a)->recorder.buf || (a)->nlimit \
-        || (a)->d.start >= (a)->d.len )?  \
+     ( ((a)->nlimit || (a)->d.start >= (a)->d.len )?  \
        iobuf_readbyte((a)) : ( (a)->nbytes++, (a)->d.buf[(a)->d.start++] ) )
 #define iobuf_get_noeof(a)    (iobuf_get((a))&0xff)
 
+/* use this if you have ungetted stuff */
+#define iobuf_get2(a)  \
+     ( ( (a)->unget.buf || (a)->nlimit || (a)->d.start >= (a)->d.len )?  \
+       iobuf_readbyte((a)) : ( (a)->nbytes++, (a)->d.buf[(a)->d.start++] ) )
 
 /* write a byte to the iobuf and return true on write error
  * This macro does only write the low order byte