diff src/vbuf.h @ 43:f6db1f060a95

start on outlook 2003 64 bit format
author carl
date Sun, 06 Jan 2008 14:47:06 -0800
parents
children b12f4e50e2e8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/vbuf.h	Sun Jan 06 14:47:06 2008 -0800
@@ -0,0 +1,142 @@
+/* {{{ vbuf.h - variable length buffer functions
+ *
+ * Functions that try to make dealing with buffers easier.
+ *
+ * vbuf
+ *
+ * vstr
+ * - should always contain a valid string
+ *
+ * }}} */
+
+#ifndef VBUF_H
+#define VBUF_H
+#define SZ_MAX     4096
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+/***************************************************/
+
+// {{{ Tokenizer const TOK_EMPTY, TOK_ELEMENT, DELIM
+#define DELIM '\\'
+
+#define TOK_EMPTY	0
+#define TOK_DELIM	1
+#define TOK_PARENT	2
+#define TOK_CURRENT	3
+#define TOK_ELEMENT	4
+
+#define TOK_ERROR	10
+#define TOK_BUF_SMALL	11
+// }}}
+
+
+// Variable-length buffers 
+struct varbuf { // {{{
+	size_t dlen; 	//length of data stored in buffer
+	size_t blen; 	//length of buffer
+	char *buf; 	//buffer
+	char *b;	//start of stored data
+}; // }}}
+
+
+// The exact same thing as a varbuf but should always contain at least '\0' 
+struct varstr { // {{{
+	size_t dlen; 	//length of data stored in buffer
+	size_t blen; 	//length of buffer
+	char *buf; 	//buffer
+	char *b;	//start of stored data
+}; // }}}
+
+
+typedef struct varbuf vbuf;
+typedef struct varstr vstr;
+
+#define VBUF_STATIC(x,y) static vbuf *x = NULL; if(!x) x = vballoc(y);
+#define VSTR_STATIC(x,y) static vstr *x = NULL; if(!x) x = vsalloc(y);
+
+// vbuf functions
+struct varbuf *vballoc( size_t len );
+void vbfree(      vbuf *vb );
+void vbclear(     vbuf *vb ); //ditch the data, keep the buffer
+void vbresize(    vbuf *vb, size_t len );
+int  vbavail(     vbuf *vb );
+void vbdump(      vbuf *vb );
+void vbgrow(      vbuf *vb, size_t len ); // grow buffer by len bytes, data are preserved
+void vbset(       vbuf *vb, void *data, size_t len );
+void vbskipws(    vbuf *vb ); 
+void vbappend(    vbuf *vb, void *data, size_t length );
+void vbskip(      vbuf *vb, size_t skip ); 
+void vboverwrite( vbuf *vbdest, vbuf *vbsrc );
+
+// vstr functions
+vstr *vsalloc( size_t len );
+char *vsb(      vstr *vs );
+size_t vslen(     vstr *vs ); //strlen
+void vsfree(      vstr *vs );
+void vsset(       vstr *vs, char *s ); // Store string s in vb
+void vsnset(      vstr *vs, char *s, size_t n ); // Store string s in vb
+void vsgrow(      vstr *vs, size_t len ); // grow buffer by len bytes, data are preserved
+size_t vsavail(   vstr *vs );
+void vscat(       vstr *vs, char *str );
+void vsncat(      vstr *vs, char *str, size_t len );
+void vsnprepend(  vstr *vs, char *str, size_t len ) ;
+void vsskip(      vstr *vs, size_t len );
+int  vscmp(       vstr *vs, char *str );
+void vsskipws(    vstr *vs );
+void vs_printf(   vstr *vs, char *fmt, ... );
+void vs_printfa(  vstr *vs, char *fmt, ... );
+void vshexdump(   vstr *vs, char *b, size_t start, size_t stop, int ascii );
+int  vscatprintf( vstr *vs, char *fmt, ... );
+void vsvprintf(   vstr *vs, char *fmt, va_list ap );
+void vstrunc(     vstr *vs, int off ); // Drop chars [off..dlen]
+int  vslast(      vstr *vs ); // returns the last character stored in a vstr string
+void vscharcat(   vstr *vs, int ch );
+int  vsutf16(     vstr *vs, vbuf *in ); //in: in=zero-terminated utf16; out: vs=utf8; returns: 0 on success, else on fail
+
+int vs_parse_escaped_string( vstr *vs, char *str, size_t len );
+
+
+/*
+ * Windows unicode output trash - this stuff sucks
+ * TODO: most of this should not be here
+ */
+
+void unicode_init();
+void unicode_close();
+int utf16_write( FILE* stream, const void *buf, size_t count );
+int utf16_fprintf( FILE* stream, const char *fmt, ... );
+int utf16to8( char *inbuf_o, char *outbuf_o, int length );
+int utf8to16( char *inbuf_o, int iblen, char *outbuf_o, int oblen);
+int vb_utf8to16T( vbuf *bout, char *cin, int inlen );
+int vb_utf16to8( vbuf *dest, char *buf, int len );
+int iso8859_1to8( char *inbuf_o, char *outbuf_o, int length );
+int utf8toascii( const char *inbuf_o, char *outbuf_o, int length );
+
+/* dump ascii hex in windoze format */
+void winhex(FILE* stream, unsigned char *hbuf, int start, int stop, int loff);
+void winhex8(FILE *stream, unsigned char *hbuf, int start, int stop, int loff );
+
+void vbwinhex8(vbuf *vb, unsigned char *hbuf, int start, int stop, int loff );
+
+/* general search routine, find something in something else */
+int find_in_buf(char *buf, char *what, int sz, int len, int start);
+
+/* Get INTEGER from memory. This is probably low-endian specific? */
+int get_int( char *array );
+
+int find_nl( vstr *vs ); // find newline of type type in b
+int skip_nl( char *s ); // returns the width of the newline at s[0]
+//int vb_readline( struct varbuf *vb, int *ctype, FILE *in ); // read *AT LEAST* one full line of data from in
+int vb_skipline( struct varbuf *vb ); // in: vb->b == "stuff\nmore_stuff"; out: vb->b == "more_stuff"
+/* Get a string of HEX bytes (space separated),
+ * or if first char is ' get an ASCII string instead.  */
+int gethexorstr(char **c, char *wb);
+char *esc_index( char *s, int c ); // just like index(3), but works on strings with escape sequences
+char *esc_rindex( char *s, int c ); // just like rindex(3), but works on strings with escape sequences
+
+char *tok_esc_char( char *s, int *is_esc, int *c );
+int vb_path_token( vbuf *tok, char **path ); // returns things like TOK_EMPTY, TOK_ERROR, complete list at top
+
+int gettoken( char *tok, int len, char **path, char delim ); // Path tokenizer: increments path, dumps token in tok
+#endif