211 #define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count)) |
211 #define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count)) |
212 #define SDL_stack_free(data) SDL_free(data) |
212 #define SDL_stack_free(data) SDL_free(data) |
213 #endif |
213 #endif |
214 |
214 |
215 #ifdef HAVE_GETENV |
215 #ifdef HAVE_GETENV |
216 #define SDL_getenv getenv |
216 #define SDL_getenv getenv |
217 #else |
217 #else |
218 extern DECLSPEC char * SDLCALL SDL_getenv(const char *name); |
218 extern DECLSPEC char * SDLCALL SDL_getenv(const char *name); |
219 #endif |
219 #endif |
220 |
220 |
221 #ifdef HAVE_PUTENV |
221 #ifdef HAVE_PUTENV |
222 #define SDL_putenv putenv |
222 #define SDL_putenv putenv |
223 #else |
223 #else |
224 extern DECLSPEC int SDLCALL SDL_putenv(const char *variable); |
224 extern DECLSPEC int SDLCALL SDL_putenv(const char *variable); |
225 #endif |
225 #endif |
226 |
226 |
227 #ifdef HAVE_QSORT |
227 #ifdef HAVE_QSORT |
228 #define SDL_qsort qsort |
228 #define SDL_qsort qsort |
229 #else |
229 #else |
230 extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, |
230 extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, |
231 int (*compare)(const void *, const void *)); |
231 int (*compare)(const void *, const void *)); |
232 #endif |
232 #endif |
233 |
233 |
234 #ifdef HAVE_ABS |
234 #ifdef HAVE_ABS |
235 #define SDL_abs abs |
235 #define SDL_abs abs |
236 #else |
236 #else |
237 #define SDL_abs(X) ((X) < 0 ? -(X) : (X)) |
237 #define SDL_abs(X) ((X) < 0 ? -(X) : (X)) |
238 #endif |
238 #endif |
239 |
239 |
240 #define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) |
240 #define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) |
241 #define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) |
241 #define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) |
242 |
242 |
243 #ifdef HAVE_CTYPE_H |
243 #ifdef HAVE_CTYPE_H |
244 #define SDL_isdigit(X) isdigit(X) |
244 #define SDL_isdigit(X) isdigit(X) |
245 #define SDL_isspace(X) isspace(X) |
245 #define SDL_isspace(X) isspace(X) |
246 #define SDL_toupper(X) toupper(X) |
246 #define SDL_toupper(X) toupper(X) |
257 #else |
257 #else |
258 extern DECLSPEC void * SDLCALL SDL_memset(void *dst, int c, size_t len); |
258 extern DECLSPEC void * SDLCALL SDL_memset(void *dst, int c, size_t len); |
259 #endif |
259 #endif |
260 |
260 |
261 #if defined(__GNUC__) && defined(i386) |
261 #if defined(__GNUC__) && defined(i386) |
262 #define SDL_memset4(dst, val, len) \ |
262 #define SDL_memset4(dst, val, len) \ |
263 do { \ |
263 do { \ |
264 int u0, u1, u2; \ |
264 int u0, u1, u2; \ |
265 __asm__ __volatile__ ( \ |
265 __asm__ __volatile__ ( \ |
266 "cld\n\t" \ |
266 "cld\n\t" \ |
267 "rep ; stosl\n\t" \ |
267 "rep ; stosl\n\t" \ |
268 : "=&D" (u0), "=&a" (u1), "=&c" (u2) \ |
268 : "=&D" (u0), "=&a" (u1), "=&c" (u2) \ |
269 : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, len)) \ |
269 : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, len)) \ |
270 : "memory" ); \ |
270 : "memory" ); \ |
271 } while(0) |
271 } while(0) |
272 #endif |
272 #endif |
273 #ifndef SDL_memset4 |
273 #ifndef SDL_memset4 |
274 #define SDL_memset4(dst, val, len) \ |
274 #define SDL_memset4(dst, val, len) \ |
275 do { \ |
275 do { \ |
276 unsigned _count = (len); \ |
276 unsigned _count = (len); \ |
277 unsigned _n = (_count + 3) / 4; \ |
277 unsigned _n = (_count + 3) / 4; \ |
278 Uint32 *_p = SDL_static_cast(Uint32 *, dst); \ |
278 Uint32 *_p = SDL_static_cast(Uint32 *, dst); \ |
279 Uint32 _val = (val); \ |
279 Uint32 _val = (val); \ |
280 if (len == 0) break; \ |
280 if (len == 0) break; \ |
281 switch (_count % 4) { \ |
281 switch (_count % 4) { \ |
282 case 0: do { *_p++ = _val; \ |
282 case 0: do { *_p++ = _val; \ |
283 case 3: *_p++ = _val; \ |
283 case 3: *_p++ = _val; \ |
284 case 2: *_p++ = _val; \ |
284 case 2: *_p++ = _val; \ |
285 case 1: *_p++ = _val; \ |
285 case 1: *_p++ = _val; \ |
286 } while ( --_n ); \ |
286 } while ( --_n ); \ |
287 } \ |
287 } \ |
288 } while(0) |
288 } while(0) |
289 #endif |
289 #endif |
290 |
290 |
291 /* We can count on memcpy existing on Mac OS X and being well-tuned. */ |
291 /* We can count on memcpy existing on Mac OS X and being well-tuned. */ |
292 #if defined(__MACH__) && defined(__APPLE__) |
292 #if defined(__MACH__) && defined(__APPLE__) |
293 #define SDL_memcpy(dst, src, len) memcpy(dst, src, len) |
293 #define SDL_memcpy(dst, src, len) memcpy(dst, src, len) |
294 #elif defined(__GNUC__) && defined(i386) |
294 #elif defined(__GNUC__) && defined(i386) |
295 #define SDL_memcpy(dst, src, len) \ |
295 #define SDL_memcpy(dst, src, len) \ |
296 do { \ |
296 do { \ |
297 int u0, u1, u2; \ |
297 int u0, u1, u2; \ |
298 __asm__ __volatile__ ( \ |
298 __asm__ __volatile__ ( \ |
299 "cld\n\t" \ |
299 "cld\n\t" \ |
300 "rep ; movsl\n\t" \ |
300 "rep ; movsl\n\t" \ |
301 "testb $2,%b4\n\t" \ |
301 "testb $2,%b4\n\t" \ |
302 "je 1f\n\t" \ |
302 "je 1f\n\t" \ |
303 "movsw\n" \ |
303 "movsw\n" \ |
304 "1:\ttestb $1,%b4\n\t" \ |
304 "1:\ttestb $1,%b4\n\t" \ |
305 "je 2f\n\t" \ |
305 "je 2f\n\t" \ |
306 "movsb\n" \ |
306 "movsb\n" \ |
307 "2:" \ |
307 "2:" \ |
308 : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ |
308 : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ |
309 : "0" (SDL_static_cast(unsigned, len)/4), "q" (len), "1" (dst),"2" (src) \ |
309 : "0" (SDL_static_cast(unsigned, len)/4), "q" (len), "1" (dst),"2" (src) \ |
310 : "memory" ); \ |
310 : "memory" ); \ |
311 } while(0) |
311 } while(0) |
312 #endif |
312 #endif |
313 #ifndef SDL_memcpy |
313 #ifndef SDL_memcpy |
314 #ifdef HAVE_MEMCPY |
314 #ifdef HAVE_MEMCPY |
315 #define SDL_memcpy memcpy |
315 #define SDL_memcpy memcpy |
316 #elif defined(HAVE_BCOPY) |
316 #elif defined(HAVE_BCOPY) |
317 #define SDL_memcpy(d, s, n) bcopy((s), (d), (n)) |
317 #define SDL_memcpy(d, s, n) bcopy((s), (d), (n)) |
318 #else |
318 #else |
319 extern DECLSPEC void * SDLCALL SDL_memcpy(void *dst, const void *src, size_t len); |
319 extern DECLSPEC void * SDLCALL SDL_memcpy(void *dst, const void *src, size_t len); |
320 #endif |
320 #endif |
321 #endif |
321 #endif |
322 |
322 |
323 /* We can count on memcpy existing on Mac OS X and being well-tuned. */ |
323 /* We can count on memcpy existing on Mac OS X and being well-tuned. */ |
324 #if defined(__MACH__) && defined(__APPLE__) |
324 #if defined(__MACH__) && defined(__APPLE__) |
325 #define SDL_memcpy4(dst, src, len) memcpy(dst, src, (len)*4) |
325 #define SDL_memcpy4(dst, src, len) memcpy(dst, src, (len)*4) |
326 #elif defined(__GNUC__) && defined(i386) |
326 #elif defined(__GNUC__) && defined(i386) |
327 #define SDL_memcpy4(dst, src, len) \ |
327 #define SDL_memcpy4(dst, src, len) \ |
328 do { \ |
328 do { \ |
329 int ecx, edi, esi; \ |
329 int ecx, edi, esi; \ |
330 __asm__ __volatile__ ( \ |
330 __asm__ __volatile__ ( \ |
331 "cld\n\t" \ |
331 "cld\n\t" \ |
332 "rep ; movsl" \ |
332 "rep ; movsl" \ |
333 : "=&c" (ecx), "=&D" (edi), "=&S" (esi) \ |
333 : "=&c" (ecx), "=&D" (edi), "=&S" (esi) \ |
334 : "0" (SDL_static_cast(unsigned, len)), "1" (dst), "2" (src) \ |
334 : "0" (SDL_static_cast(unsigned, len)), "1" (dst), "2" (src) \ |
335 : "memory" ); \ |
335 : "memory" ); \ |
336 } while(0) |
336 } while(0) |
337 #endif |
337 #endif |
338 #ifndef SDL_memcpy4 |
338 #ifndef SDL_memcpy4 |
339 #define SDL_memcpy4(dst, src, len) SDL_memcpy(dst, src, (len) << 2) |
339 #define SDL_memcpy4(dst, src, len) SDL_memcpy(dst, src, (len) << 2) |
340 #endif |
340 #endif |
341 |
341 |
342 #if defined(__GNUC__) && defined(i386) |
342 #if defined(__GNUC__) && defined(i386) |
343 #define SDL_revcpy(dst, src, len) \ |
343 #define SDL_revcpy(dst, src, len) \ |
344 do { \ |
344 do { \ |
345 int u0, u1, u2; \ |
345 int u0, u1, u2; \ |
346 char *dstp = SDL_static_cast(char *, dst); \ |
346 char *dstp = SDL_static_cast(char *, dst); \ |
347 char *srcp = SDL_static_cast(char *, src); \ |
347 char *srcp = SDL_static_cast(char *, src); \ |
348 int n = (len); \ |
348 int n = (len); \ |
349 if ( n >= 4 ) { \ |
349 if ( n >= 4 ) { \ |
350 __asm__ __volatile__ ( \ |
350 __asm__ __volatile__ ( \ |
351 "std\n\t" \ |
351 "std\n\t" \ |
352 "rep ; movsl\n\t" \ |
352 "rep ; movsl\n\t" \ |
353 "cld\n\t" \ |
353 "cld\n\t" \ |
354 : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ |
354 : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ |
355 : "0" (n >> 2), \ |
355 : "0" (n >> 2), \ |
356 "1" (dstp+(n-4)), "2" (srcp+(n-4)) \ |
356 "1" (dstp+(n-4)), "2" (srcp+(n-4)) \ |
357 : "memory" ); \ |
357 : "memory" ); \ |
358 } \ |
358 } \ |
359 switch (n & 3) { \ |
359 switch (n & 3) { \ |
360 case 3: dstp[2] = srcp[2]; \ |
360 case 3: dstp[2] = srcp[2]; \ |
361 case 2: dstp[1] = srcp[1]; \ |
361 case 2: dstp[1] = srcp[1]; \ |
362 case 1: dstp[0] = srcp[0]; \ |
362 case 1: dstp[0] = srcp[0]; \ |
363 break; \ |
363 break; \ |
364 default: \ |
364 default: \ |
365 break; \ |
365 break; \ |
366 } \ |
366 } \ |
367 } while(0) |
367 } while(0) |
368 #endif |
368 #endif |
369 #ifndef SDL_revcpy |
369 #ifndef SDL_revcpy |
370 extern DECLSPEC void * SDLCALL SDL_revcpy(void *dst, const void *src, size_t len); |
370 extern DECLSPEC void * SDLCALL SDL_revcpy(void *dst, const void *src, size_t len); |
371 #endif |
371 #endif |
372 |
372 |
373 #ifdef HAVE_MEMMOVE |
373 #ifdef HAVE_MEMMOVE |
374 #define SDL_memmove memmove |
374 #define SDL_memmove memmove |
375 #elif defined(HAVE_BCOPY) |
375 #elif defined(HAVE_BCOPY) |
376 #define SDL_memmove(d, s, n) bcopy((s), (d), (n)) |
376 #define SDL_memmove(d, s, n) bcopy((s), (d), (n)) |
377 #else |
377 #else |
378 #define SDL_memmove(dst, src, len) \ |
378 #define SDL_memmove(dst, src, len) \ |
379 do { \ |
379 do { \ |
380 if ( dst < src ) { \ |
380 if ( dst < src ) { \ |
381 SDL_memcpy(dst, src, len); \ |
381 SDL_memcpy(dst, src, len); \ |
382 } else { \ |
382 } else { \ |
383 SDL_revcpy(dst, src, len); \ |
383 SDL_revcpy(dst, src, len); \ |
384 } \ |
384 } \ |
385 } while(0) |
385 } while(0) |
386 #endif |
386 #endif |
387 |
387 |
388 #ifdef HAVE_MEMCMP |
388 #ifdef HAVE_MEMCMP |
389 #define SDL_memcmp memcmp |
389 #define SDL_memcmp memcmp |
605 extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); |
605 extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); |
606 /** This function converts a string between encodings in one pass, returning a |
606 /** This function converts a string between encodings in one pass, returning a |
607 * string that must be freed with SDL_free() or NULL on error. |
607 * string that must be freed with SDL_free() or NULL on error. |
608 */ |
608 */ |
609 extern DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, const char *fromcode, const char *inbuf, size_t inbytesleft); |
609 extern DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, const char *fromcode, const char *inbuf, size_t inbytesleft); |
610 #define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) |
610 #define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) |
611 #define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1) |
611 #define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1) |
612 #define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1) |
612 #define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1) |
613 |
613 |
614 /* Ends C function definitions when using C++ */ |
614 /* Ends C function definitions when using C++ */ |
615 #ifdef __cplusplus |
615 #ifdef __cplusplus |
616 } |
616 } |
617 #endif |
617 #endif |