1
2
/*
* Simple C functions to supplement the C library
ths
authored
18 years ago
3
*
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
* Copyright ( c ) 2006 Fabrice Bellard
*
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this software and associated documentation files ( the "Software" ), to deal
* in the Software without restriction , including without limitation the rights
* to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
* copies of the Software , and to permit persons to whom the Software is
* furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED "AS IS" , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE .
*/
24
# include "qemu-common.h"
25
# include "host-utils.h"
26
# include < assert . h >
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
void pstrcpy ( char * buf , int buf_size , const char * str )
{
int c ;
char * q = buf ;
if ( buf_size <= 0 )
return ;
for (;;) {
c = * str ++ ;
if ( c == 0 || q >= buf + buf_size - 1 )
break ;
* q ++ = c ;
}
* q = '\0' ;
}
/* strcat and truncate. */
char * pstrcat ( char * buf , int buf_size , const char * s )
{
int len ;
len = strlen ( buf );
ths
authored
18 years ago
50
if ( len < buf_size )
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
pstrcpy ( buf + len , buf_size - len , s );
return buf ;
}
int strstart ( const char * str , const char * val , const char ** ptr )
{
const char * p , * q ;
p = str ;
q = val ;
while ( * q != '\0' ) {
if ( * p != * q )
return 0 ;
p ++ ;
q ++ ;
}
if ( ptr )
* ptr = p ;
return 1 ;
}
int stristart ( const char * str , const char * val , const char ** ptr )
{
const char * p , * q ;
p = str ;
q = val ;
while ( * q != '\0' ) {
77
if ( qemu_toupper ( * p ) != qemu_toupper ( * q ))
78
79
80
81
82
83
84
85
return 0 ;
p ++ ;
q ++ ;
}
if ( ptr )
* ptr = p ;
return 1 ;
}
86
87
88
89
90
91
92
93
94
95
96
97
98
99
time_t mktimegm ( struct tm * tm )
{
time_t t ;
int y = tm -> tm_year + 1900 , m = tm -> tm_mon + 1 , d = tm -> tm_mday ;
if ( m < 3 ) {
m += 12 ;
y -- ;
}
t = 86400 * ( d + ( 153 * m - 457 ) / 5 + 365 * y + y / 4 - y / 100 +
y / 400 - 719469 );
t += 3600 * tm -> tm_hour + 60 * tm -> tm_min + tm -> tm_sec ;
return t ;
}
100
101
int qemu_fls ( int i )
102
{
103
return 32 - clz32 ( i );
104
}
105
106
107
108
109
110
111
112
/* io vectors */
void qemu_iovec_init ( QEMUIOVector * qiov , int alloc_hint )
{
qiov -> iov = qemu_malloc ( alloc_hint * sizeof ( struct iovec ));
qiov -> niov = 0 ;
qiov -> nalloc = alloc_hint ;
113
qiov -> size = 0 ;
114
115
}
116
117
118
119
120
121
122
123
124
125
126
127
void qemu_iovec_init_external ( QEMUIOVector * qiov , struct iovec * iov , int niov )
{
int i ;
qiov -> iov = iov ;
qiov -> niov = niov ;
qiov -> nalloc = - 1 ;
qiov -> size = 0 ;
for ( i = 0 ; i < niov ; i ++ )
qiov -> size += iov [ i ]. iov_len ;
}
128
129
void qemu_iovec_add ( QEMUIOVector * qiov , void * base , size_t len )
{
130
131
assert ( qiov -> nalloc != - 1 );
132
133
134
135
136
137
if ( qiov -> niov == qiov -> nalloc ) {
qiov -> nalloc = 2 * qiov -> nalloc + 1 ;
qiov -> iov = qemu_realloc ( qiov -> iov , qiov -> nalloc * sizeof ( struct iovec ));
}
qiov -> iov [ qiov -> niov ]. iov_base = base ;
qiov -> iov [ qiov -> niov ]. iov_len = len ;
138
qiov -> size += len ;
139
140
141
142
143
++ qiov -> niov ;
}
void qemu_iovec_destroy ( QEMUIOVector * qiov )
{
144
145
assert ( qiov -> nalloc != - 1 );
146
147
148
qemu_free ( qiov -> iov );
}
149
150
void qemu_iovec_reset ( QEMUIOVector * qiov )
{
151
152
assert ( qiov -> nalloc != - 1 );
153
154
155
156
qiov -> niov = 0 ;
qiov -> size = 0 ;
}
157
158
159
160
161
162
163
164
165
166
167
void qemu_iovec_to_buffer ( QEMUIOVector * qiov , void * buf )
{
uint8_t * p = ( uint8_t * ) buf ;
int i ;
for ( i = 0 ; i < qiov -> niov ; ++ i ) {
memcpy ( p , qiov -> iov [ i ]. iov_base , qiov -> iov [ i ]. iov_len );
p += qiov -> iov [ i ]. iov_len ;
}
}
168
void qemu_iovec_from_buffer ( QEMUIOVector * qiov , const void * buf , size_t count )
169
170
{
const uint8_t * p = ( const uint8_t * ) buf ;
171
size_t copy ;
172
173
int i ;
174
175
176
177
178
179
180
for ( i = 0 ; i < qiov -> niov && count ; ++ i ) {
copy = count ;
if ( copy > qiov -> iov [ i ]. iov_len )
copy = qiov -> iov [ i ]. iov_len ;
memcpy ( qiov -> iov [ i ]. iov_base , p , copy );
p += copy ;
count -= copy ;
181
182
}
}