source: trunk/libtransmission/bencode.h @ 3735

Last change on this file since 3735 was 3735, checked in by charles, 15 years ago

remove libtransmission code that duplicates functionality in libevent

  • Property svn:keywords set to Date Rev Author Id
File size: 3.5 KB
Line 
1/******************************************************************************
2 * $Id: bencode.h 3735 2007-11-06 21:14:30Z charles $
3 *
4 * Copyright (c) 2005-2007 Transmission authors and contributors
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *****************************************************************************/
24
25#ifndef TR_BENCODE_H
26#define TR_BENCODE_H 1
27
28#include <inttypes.h> /* for int64_t */
29#include <string.h> /* for memset */
30
31typedef struct benc_val_s
32{
33    char * begin;
34    char * end;
35#define TYPE_INT  1
36#define TYPE_STR  2
37#define TYPE_LIST 4
38#define TYPE_DICT 8
39    char   type;
40    union
41    {
42        int64_t i;
43        struct
44        {
45            int    i;
46            char * s;
47            int    nofree;
48        } s;
49        struct
50        {
51            int                 alloc;
52            int                 count;
53            struct benc_val_s * vals;
54        } l;
55    } val;
56} benc_val_t;
57
58#define tr_bencLoad(b,l,v,e) _tr_bencLoad((char*)(b),(l),(v),(char**)(e))
59int          _tr_bencLoad( char * buf, int len, benc_val_t * val,
60                           char ** end );
61void         tr_bencPrint( benc_val_t * val );
62void         tr_bencFree( benc_val_t * val );
63benc_val_t * tr_bencDictFind( benc_val_t * val, const char * key );
64benc_val_t * tr_bencDictFindFirst( benc_val_t * val, ... );
65
66/* marks a string as 'do not free' and returns it */
67char *       tr_bencStealStr( benc_val_t * val );
68
69/* convenience functions for building benc_val_t structures */
70
71static inline void tr_bencInit( benc_val_t * val, int type )
72{
73    memset( val, 0, sizeof( *val ) );
74    val->type = type;
75}
76
77#define tr_bencInitStr( a, b, c, d ) \
78    _tr_bencInitStr( (a), ( char * )(b), (c), (d) )
79void   _tr_bencInitStr( benc_val_t * val, char * str, int len, int nofree );
80int    tr_bencInitStrDup( benc_val_t * val, const char * str );
81void   tr_bencInitInt( benc_val_t * val, int64_t num );
82int   tr_bencListReserve( benc_val_t * list, int count );
83/* note that for one key-value pair, count should be 1, not 2 */
84int   tr_bencDictReserve( benc_val_t * dict, int count );
85benc_val_t * tr_bencListAdd( benc_val_t * list );
86/* note: key must not be freed or modified while val is in use */
87benc_val_t * tr_bencDictAdd( benc_val_t * dict, const char * key );
88
89char*  tr_bencSave( const benc_val_t * val, int * len );
90
91int    tr_bencIsStr   ( const benc_val_t * val );
92int    tr_bencIsInt   ( const benc_val_t * val );
93int    tr_bencIsList  ( const benc_val_t * val );
94int    tr_bencIsDict  ( const benc_val_t * val );
95
96#endif
Note: See TracBrowser for help on using the repository browser.