source: trunk/libtransmission/bencode.h @ 7404

Last change on this file since 7404 was 7404, checked in by charles, 12 years ago

updated email address

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