source: trunk/libtransmission/bencode.h @ 8155

Last change on this file since 8155 was 8155, checked in by charles, 13 years ago

(trunk) change the bencode type enum to prevent OS-level collision

  • Property svn:keywords set to Date Rev Author Id
File size: 6.1 KB
Line 
1/*
2 * This file Copyright (C) 2008-2009 Charles Kerr <charles@transmissionbt.com>
3 *
4 * This file is licensed by the GPL version 2.  Works owned by the
5 * Transmission project are granted a special exemption to clause 2(b)
6 * so that the bulk of its code can remain under the MIT license.
7 * This exemption does not extend to derived works not owned by
8 * the Transmission project.
9 *
10 * $Id: bencode.h 8155 2009-04-05 18:02:11Z charles $
11 */
12
13#ifndef TR_BENCODE_H
14#define TR_BENCODE_H 1
15
16#ifdef __cplusplus
17extern "C" {
18#endif
19
20#include <inttypes.h> /* for int64_t */
21
22struct evbuffer;
23
24enum
25{
26    TR_TYPE_INT  = 1,
27    TR_TYPE_STR  = 2,
28    TR_TYPE_LIST = 4,
29    TR_TYPE_DICT = 8,
30    TR_TYPE_BOOL = 16,
31    TR_TYPE_REAL = 32
32};
33
34typedef struct tr_benc
35{
36    char    type;
37    union
38    {
39        uint8_t b; /* bool type */
40
41        double d;  /* double type */
42
43        int64_t i; /* int type */
44
45        struct /* string type */
46        {
47            size_t i;
48            char * s;
49        } s;
50
51        struct /* list & dict types */
52        {
53            size_t alloc;
54            size_t count;
55            struct tr_benc * vals;
56        } l;
57    } val;
58} tr_benc;
59
60/***
61****
62***/
63
64int       tr_bencParse( const void *     buf,
65                        const void *     bufend,
66                        tr_benc *        setme_benc,
67                        const uint8_t ** setme_end );
68
69int       tr_bencLoad( const void * buf,
70                       size_t       buflen,
71                       tr_benc *    setme_benc,
72                       char **      setme_end );
73
74int       tr_bencLoadFile( const char * filename,
75                                        tr_benc * );
76
77int       tr_bencLoadJSONFile( const char * filename,
78                                            tr_benc * );
79
80#if 0
81void      tr_bencPrint( const tr_benc * );
82
83#endif
84
85void      tr_bencFree( tr_benc * );
86
87char*     tr_bencSave( const tr_benc * val, int * len );
88
89char*     tr_bencSaveAsJSON( const tr_benc * top, struct evbuffer * out );
90
91char*     tr_bencToJSON( const tr_benc * top );
92
93int       tr_bencSaveFile( const char * filename, const tr_benc * );
94
95int       tr_bencSaveJSONFile( const char * filename, const tr_benc * );
96
97void      tr_bencInitStr( tr_benc *, const void * str, int str_len );
98
99void      tr_bencInitRaw( tr_benc *, const void * raw, size_t raw_len );
100
101void      tr_bencInitInt( tr_benc *, int64_t num );
102
103int       tr_bencInitDict( tr_benc *, size_t reserveCount );
104
105int       tr_bencInitList( tr_benc *, size_t reserveCount );
106
107void      tr_bencInitBool( tr_benc *, int value );
108
109void      tr_bencInitReal( tr_benc *, double value );
110
111/***
112****
113***/
114
115int       tr_bencListReserve( tr_benc *, size_t reserveCount );
116
117tr_benc * tr_bencListAdd( tr_benc * );
118
119tr_benc * tr_bencListAddInt( tr_benc *, int64_t val );
120
121tr_benc * tr_bencListAddStr( tr_benc *, const char * val );
122
123tr_benc * tr_bencListAddList( tr_benc *, size_t reserveCount );
124
125tr_benc * tr_bencListAddDict( tr_benc *, size_t reserveCount );
126
127size_t    tr_bencListSize( const tr_benc * list );
128
129tr_benc * tr_bencListChild( tr_benc * list, size_t n );
130
131/***
132****
133***/
134
135int       tr_bencDictReserve( tr_benc *, size_t reserveCount );
136
137int       tr_bencDictRemove( tr_benc *, const char * key );
138
139tr_benc * tr_bencDictAdd( tr_benc *, const char * key );
140
141tr_benc * tr_bencDictAddReal( tr_benc *, const char * key, double );
142
143tr_benc * tr_bencDictAddInt( tr_benc *, const char * key, int64_t );
144
145tr_benc * tr_bencDictAddBool( tr_benc *, const char * key, tr_bool );
146
147tr_benc * tr_bencDictAddStr( tr_benc *, const char * key, const char * );
148
149tr_benc * tr_bencDictAddList( tr_benc *, const char * key, size_t reserve );
150
151tr_benc * tr_bencDictAddDict( tr_benc *, const char * key, size_t reserve );
152
153tr_benc * tr_bencDictAddRaw( tr_benc *, const char * key,
154                             const void * raw, size_t rawlen );
155
156tr_benc*  tr_bencDictFind( tr_benc *, const char * key );
157
158tr_bool   tr_bencDictFindList( tr_benc *, const char * key, tr_benc ** setme );
159
160tr_bool   tr_bencDictFindDict( tr_benc *, const char * key, tr_benc ** setme );
161
162tr_bool   tr_bencDictFindInt( tr_benc *, const char * key, int64_t * setme );
163
164tr_bool   tr_bencDictFindReal( tr_benc *, const char * key, double * setme );
165
166tr_bool   tr_bencDictFindBool( tr_benc *, const char * key, tr_bool * setme );
167
168tr_bool   tr_bencDictFindStr( tr_benc *, const char * key, const char ** setme );
169
170tr_bool   tr_bencDictFindRaw( tr_benc *, const char * key,
171                              const uint8_t ** setme_raw, size_t * setme_len );
172
173/***
174****
175***/
176
177tr_bool   tr_bencGetInt( const tr_benc * val, int64_t * setme );
178tr_bool   tr_bencGetStr( const tr_benc * val, const char ** setme );
179tr_bool   tr_bencGetBool( const tr_benc * val, tr_bool * setme );
180tr_bool   tr_bencGetReal( const tr_benc * val, double * setme );
181
182static TR_INLINE tr_bool tr_bencIsType  ( const tr_benc * b, int type ) { return ( b != NULL ) && ( b->type == type ); }
183static TR_INLINE tr_bool tr_bencIsInt   ( const tr_benc * b ) { return tr_bencIsType( b, TR_TYPE_INT ); }
184static TR_INLINE tr_bool tr_bencIsDict  ( const tr_benc * b ) { return tr_bencIsType( b, TR_TYPE_DICT ); }
185static TR_INLINE tr_bool tr_bencIsList  ( const tr_benc * b ) { return tr_bencIsType( b, TR_TYPE_LIST ); }
186static TR_INLINE tr_bool tr_bencIsString( const tr_benc * b ) { return tr_bencIsType( b, TR_TYPE_STR ); }
187static TR_INLINE tr_bool tr_bencIsBool  ( const tr_benc * b ) { return tr_bencIsType( b, TR_TYPE_BOOL ); }
188static TR_INLINE tr_bool tr_bencIsReal  ( const tr_benc * b ) { return tr_bencIsType( b, TR_TYPE_REAL ); }
189
190/**
191***  Treat these as private -- they're only made public here
192***  so that the unit tests can find them
193**/
194
195int tr_bencParseInt( const uint8_t *  buf,
196                     const uint8_t *  bufend,
197                     const uint8_t ** setme_end,
198                     int64_t *        setme_val );
199
200int tr_bencParseStr( const uint8_t *  buf,
201                     const uint8_t *  bufend,
202                     const uint8_t ** setme_end,
203                     const uint8_t ** setme_str,
204                     size_t *         setme_strlen );
205
206/**
207***
208**/
209
210void  tr_bencMergeDicts( tr_benc * target, const tr_benc * source );
211
212#ifdef __cplusplus
213}
214#endif
215
216#endif
Note: See TracBrowser for help on using the repository browser.