annotate src/vbuf.h @ 57:de3753c3160a

add archive directory with history of alioth versions that have been merged here
author Carl Byington <carl@five-ten-sg.com>
date Sat, 02 Feb 2008 12:54:07 -0800
parents f6db1f060a95
children b12f4e50e2e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
1 /* {{{ vbuf.h - variable length buffer functions
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
2 *
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
3 * Functions that try to make dealing with buffers easier.
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
4 *
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
5 * vbuf
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
6 *
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
7 * vstr
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
8 * - should always contain a valid string
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
9 *
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
10 * }}} */
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
11
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
12 #ifndef VBUF_H
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
13 #define VBUF_H
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
14 #define SZ_MAX 4096
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
15 #include <stdlib.h>
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
16 #include <stdio.h>
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
17 #include <stdarg.h>
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
18 /***************************************************/
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
19
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
20 // {{{ Tokenizer const TOK_EMPTY, TOK_ELEMENT, DELIM
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
21 #define DELIM '\\'
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
22
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
23 #define TOK_EMPTY 0
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
24 #define TOK_DELIM 1
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
25 #define TOK_PARENT 2
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
26 #define TOK_CURRENT 3
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
27 #define TOK_ELEMENT 4
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
28
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
29 #define TOK_ERROR 10
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
30 #define TOK_BUF_SMALL 11
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
31 // }}}
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
32
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
33
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
34 // Variable-length buffers
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
35 struct varbuf { // {{{
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
36 size_t dlen; //length of data stored in buffer
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
37 size_t blen; //length of buffer
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
38 char *buf; //buffer
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
39 char *b; //start of stored data
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
40 }; // }}}
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
41
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
42
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
43 // The exact same thing as a varbuf but should always contain at least '\0'
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
44 struct varstr { // {{{
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
45 size_t dlen; //length of data stored in buffer
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
46 size_t blen; //length of buffer
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
47 char *buf; //buffer
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
48 char *b; //start of stored data
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
49 }; // }}}
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
50
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
51
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
52 typedef struct varbuf vbuf;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
53 typedef struct varstr vstr;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
54
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
55 #define VBUF_STATIC(x,y) static vbuf *x = NULL; if(!x) x = vballoc(y);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
56 #define VSTR_STATIC(x,y) static vstr *x = NULL; if(!x) x = vsalloc(y);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
57
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
58 // vbuf functions
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
59 struct varbuf *vballoc( size_t len );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
60 void vbfree( vbuf *vb );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
61 void vbclear( vbuf *vb ); //ditch the data, keep the buffer
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
62 void vbresize( vbuf *vb, size_t len );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
63 int vbavail( vbuf *vb );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
64 void vbdump( vbuf *vb );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
65 void vbgrow( vbuf *vb, size_t len ); // grow buffer by len bytes, data are preserved
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
66 void vbset( vbuf *vb, void *data, size_t len );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
67 void vbskipws( vbuf *vb );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
68 void vbappend( vbuf *vb, void *data, size_t length );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
69 void vbskip( vbuf *vb, size_t skip );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
70 void vboverwrite( vbuf *vbdest, vbuf *vbsrc );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
71
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
72 // vstr functions
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
73 vstr *vsalloc( size_t len );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
74 char *vsb( vstr *vs );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
75 size_t vslen( vstr *vs ); //strlen
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
76 void vsfree( vstr *vs );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
77 void vsset( vstr *vs, char *s ); // Store string s in vb
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
78 void vsnset( vstr *vs, char *s, size_t n ); // Store string s in vb
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
79 void vsgrow( vstr *vs, size_t len ); // grow buffer by len bytes, data are preserved
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
80 size_t vsavail( vstr *vs );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
81 void vscat( vstr *vs, char *str );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
82 void vsncat( vstr *vs, char *str, size_t len );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
83 void vsnprepend( vstr *vs, char *str, size_t len ) ;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
84 void vsskip( vstr *vs, size_t len );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
85 int vscmp( vstr *vs, char *str );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
86 void vsskipws( vstr *vs );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
87 void vs_printf( vstr *vs, char *fmt, ... );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
88 void vs_printfa( vstr *vs, char *fmt, ... );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
89 void vshexdump( vstr *vs, char *b, size_t start, size_t stop, int ascii );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
90 int vscatprintf( vstr *vs, char *fmt, ... );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
91 void vsvprintf( vstr *vs, char *fmt, va_list ap );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
92 void vstrunc( vstr *vs, int off ); // Drop chars [off..dlen]
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
93 int vslast( vstr *vs ); // returns the last character stored in a vstr string
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
94 void vscharcat( vstr *vs, int ch );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
95 int vsutf16( vstr *vs, vbuf *in ); //in: in=zero-terminated utf16; out: vs=utf8; returns: 0 on success, else on fail
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
96
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
97 int vs_parse_escaped_string( vstr *vs, char *str, size_t len );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
98
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
99
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
100 /*
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
101 * Windows unicode output trash - this stuff sucks
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
102 * TODO: most of this should not be here
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
103 */
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
104
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
105 void unicode_init();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
106 void unicode_close();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
107 int utf16_write( FILE* stream, const void *buf, size_t count );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
108 int utf16_fprintf( FILE* stream, const char *fmt, ... );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
109 int utf16to8( char *inbuf_o, char *outbuf_o, int length );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
110 int utf8to16( char *inbuf_o, int iblen, char *outbuf_o, int oblen);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
111 int vb_utf8to16T( vbuf *bout, char *cin, int inlen );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
112 int vb_utf16to8( vbuf *dest, char *buf, int len );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
113 int iso8859_1to8( char *inbuf_o, char *outbuf_o, int length );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
114 int utf8toascii( const char *inbuf_o, char *outbuf_o, int length );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
115
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
116 /* dump ascii hex in windoze format */
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
117 void winhex(FILE* stream, unsigned char *hbuf, int start, int stop, int loff);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
118 void winhex8(FILE *stream, unsigned char *hbuf, int start, int stop, int loff );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
119
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
120 void vbwinhex8(vbuf *vb, unsigned char *hbuf, int start, int stop, int loff );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
121
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
122 /* general search routine, find something in something else */
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
123 int find_in_buf(char *buf, char *what, int sz, int len, int start);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
124
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
125 /* Get INTEGER from memory. This is probably low-endian specific? */
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
126 int get_int( char *array );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
127
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
128 int find_nl( vstr *vs ); // find newline of type type in b
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
129 int skip_nl( char *s ); // returns the width of the newline at s[0]
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
130 //int vb_readline( struct varbuf *vb, int *ctype, FILE *in ); // read *AT LEAST* one full line of data from in
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
131 int vb_skipline( struct varbuf *vb ); // in: vb->b == "stuff\nmore_stuff"; out: vb->b == "more_stuff"
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
132 /* Get a string of HEX bytes (space separated),
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
133 * or if first char is ' get an ASCII string instead. */
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
134 int gethexorstr(char **c, char *wb);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
135 char *esc_index( char *s, int c ); // just like index(3), but works on strings with escape sequences
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
136 char *esc_rindex( char *s, int c ); // just like rindex(3), but works on strings with escape sequences
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
137
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
138 char *tok_esc_char( char *s, int *is_esc, int *c );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
139 int vb_path_token( vbuf *tok, char **path ); // returns things like TOK_EMPTY, TOK_ERROR, complete list at top
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
140
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
141 int gettoken( char *tok, int len, char **path, char delim ); // Path tokenizer: increments path, dumps token in tok
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents:
diff changeset
142 #endif