source: trunk/libtransmission/bencode.h @ 8112

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

(trunk libT) add tr_bencGetBool() and tr_bencGetDouble()

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