source: trunk/libtransmission/utils.h @ 2149

Last change on this file since 2149 was 2149, checked in by livings124, 15 years ago

Merge file selection and torrent creation into the main branch.

The new code for these features is under a new license.

  • Property svn:keywords set to Date Rev Author Id
File size: 7.2 KB
Line 
1/******************************************************************************
2 * $Id: utils.h 2149 2007-06-18 03:40:41Z livings124 $
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_UTILS_H
26#define TR_UTILS_H 1
27
28void tr_msgInit( void );
29
30#define tr_err( a... ) tr_msg( TR_MSG_ERR, ## a )
31#define tr_inf( a... ) tr_msg( TR_MSG_INF, ## a )
32#define tr_dbg( a... ) tr_msg( TR_MSG_DBG, ## a )
33void tr_msg  ( int level, char * msg, ... ) PRINTF( 2, 3 );
34
35int  tr_rand ( int );
36
37void * tr_memmem( const void *, size_t, const void *, size_t );
38
39/***********************************************************************
40 * tr_mkdir
41 ***********************************************************************
42 * Create a directory and any needed parent directories.
43 * Note that the string passed in must be writable!
44 **********************************************************************/
45int tr_mkdir( char * path );
46
47/***********************************************************************
48 * tr_strcasecmp
49 ***********************************************************************
50 * A case-insensitive strncmp()
51 **********************************************************************/
52#define tr_strcasecmp( ff, ss ) ( tr_strncasecmp( (ff), (ss), ULONG_MAX ) )
53int tr_strncasecmp( const char * first, const char * second, size_t len );
54
55/***********************************************************************
56 * tr_sprintf
57 ***********************************************************************
58 * Appends to the end of a buffer using printf formatting,
59 * growing the buffer if needed
60 **********************************************************************/
61int tr_sprintf( char ** buf, int * used, int * max,
62                const char * format, ... ) PRINTF( 4, 5 );
63/* gee, it sure would be nice if BeOS had va_copy() */
64int tr_vsprintf( char **, int *, int *, const char *, va_list, va_list );
65/* this concatenates some binary data onto the end of a buffer */
66int tr_concat( char ** buf, int * used, int * max,
67               const char * data, int len );
68
69/***********************************************************************
70 * tr_dupstr
71 ***********************************************************************
72 * Creates a nul-terminated string
73 **********************************************************************/
74char * tr_dupstr( const char * base, int len );
75
76int    tr_ioErrorFromErrno( void );
77
78char * tr_errorString( int code );
79
80/***********************************************************************
81 * tr_date
82 ***********************************************************************
83 * Returns the current date in milliseconds
84 **********************************************************************/
85static inline uint64_t tr_date()
86{
87    struct timeval tv;
88    gettimeofday( &tv, NULL );
89    return (uint64_t) tv.tv_sec * 1000 + ( tv.tv_usec / 1000 );
90}
91
92/***********************************************************************
93 * tr_wait
94 ***********************************************************************
95 * Wait 'delay' milliseconds
96 **********************************************************************/
97static inline void tr_wait( uint64_t delay )
98{
99#ifdef SYS_BEOS
100    snooze( 1000 * delay );
101#else
102    usleep( 1000 * delay );
103#endif
104}
105
106
107#define tr_blockPiece(a) _tr_blockPiece(tor,a)
108static inline int _tr_blockPiece( const tr_torrent_t * tor, int block )
109{
110    const tr_info_t * inf = &tor->info;
111    return block / ( inf->pieceSize / tor->blockSize );
112}
113
114#define tr_blockSize(a) _tr_blockSize(tor,a)
115static inline int _tr_blockSize( const tr_torrent_t * tor, int block )
116{
117    const tr_info_t * inf = &tor->info;
118    int dummy;
119
120    if( block != tor->blockCount - 1 ||
121        !( dummy = inf->totalSize % tor->blockSize ) )
122    {
123        return tor->blockSize;
124    }
125
126    return dummy;
127}
128
129#define tr_blockPosInPiece(a) _tr_blockPosInPiece(tor,a)
130static inline int _tr_blockPosInPiece( const tr_torrent_t * tor, int block )
131{
132    const tr_info_t * inf = &tor->info;
133    return tor->blockSize *
134        ( block % ( inf->pieceSize / tor->blockSize ) );
135}
136
137#define tr_pieceCountBlocks(a) _tr_pieceCountBlocks(tor,a)
138static inline int _tr_pieceCountBlocks( const tr_torrent_t * tor, int piece )
139{
140    const tr_info_t * inf = &tor->info;
141    if( piece < inf->pieceCount - 1 ||
142        !( tor->blockCount % ( inf->pieceSize / tor->blockSize ) ) )
143    {
144        return inf->pieceSize / tor->blockSize;
145    }
146    return tor->blockCount % ( inf->pieceSize / tor->blockSize );
147}
148
149#define tr_pieceStartBlock(a) _tr_pieceStartBlock(tor,a)
150static inline int _tr_pieceStartBlock( const tr_torrent_t * tor, int piece )
151{
152    const tr_info_t * inf = &tor->info;
153    return piece * ( inf->pieceSize / tor->blockSize );
154}
155
156#define tr_pieceSize(a) _tr_pieceSize(tor,a)
157static inline int _tr_pieceSize( const tr_torrent_t * tor, int piece )
158{
159    const tr_info_t * inf = &tor->info;
160    if( piece < inf->pieceCount - 1 ||
161        !( inf->totalSize % inf->pieceSize ) )
162    {
163        return inf->pieceSize;
164    }
165    return inf->totalSize % inf->pieceSize;
166}
167
168#define tr_block(a,b) _tr_block(tor,a,b)
169static inline int _tr_block( const tr_torrent_t * tor, int index, int begin )
170{
171    const tr_info_t * inf = &tor->info;
172    return index * ( inf->pieceSize / tor->blockSize ) +
173        begin / tor->blockSize;
174}
175
176/***
177****
178***/
179
180char* tr_strdup( const char * pch );
181
182void* tr_malloc( size_t );
183
184void  tr_free( void* );
185
186/***
187****
188***/
189
190struct tr_bitfield_s
191{
192    uint8_t * bits;
193    size_t len;
194};
195
196tr_bitfield_t* tr_bitfieldNew( size_t bitcount );
197tr_bitfield_t* tr_bitfieldDup( const tr_bitfield_t* );
198void tr_bitfieldFree( tr_bitfield_t*);
199
200void tr_bitfieldClear( tr_bitfield_t* );
201void tr_bitfieldAdd( tr_bitfield_t*, size_t bit );
202void tr_bitfieldRem( tr_bitfield_t*, size_t bit );
203void tr_bitfieldAddRange( tr_bitfield_t *, size_t first, size_t last );
204void tr_bitfieldRemRange ( tr_bitfield_t*, size_t first, size_t last );
205
206int    tr_bitfieldIsEmpty( const tr_bitfield_t* );
207int    tr_bitfieldHas( const tr_bitfield_t *, size_t bit );
208size_t tr_bitfieldCountTrueBits( const tr_bitfield_t* );
209
210tr_bitfield_t* tr_bitfieldNegate( tr_bitfield_t* );
211tr_bitfield_t* tr_bitfieldAnd( tr_bitfield_t*, const tr_bitfield_t* );
212
213
214
215#endif
Note: See TracBrowser for help on using the repository browser.