Add fls() for non-constant values.
[people/andreif/gpxe.git] / src / include / strings.h
1 #ifndef _STRINGS_H
2 #define _STRINGS_H
3
4 #include <limits.h>
5 #include <string.h>
6
7 static inline __attribute__ (( always_inline )) int
8 __constant_flsl ( unsigned long x ) {
9         int r = 0;
10
11 #if ULONG_MAX > 0xffffffff
12         if ( x & 0xffffffff00000000UL ) {
13                 x >>= 32;
14                 r += 32;
15         }
16 #endif
17         if ( x & 0xffff0000UL ) {
18                 x >>= 16;
19                 r += 16;
20         }
21         if ( x & 0xff00 ) {
22                 x >>= 8;
23                 r += 8;
24         }
25         if ( x & 0xf0 ) {
26                 x >>= 4;
27                 r += 4;
28         }
29         if ( x & 0xc ) {
30                 x >>= 2;
31                 r += 2;
32         }
33         if ( x & 0x2 ) {
34                 x >>= 1;
35                 r += 1;
36         }
37         if ( x & 0x1 ) {
38                 r += 1;
39         }
40         return r;
41 }
42
43 /* We don't actually have these functions yet */
44 extern int __flsl ( long x );
45
46 #define flsl( x ) \
47         ( __builtin_constant_p ( x ) ? __constant_flsl ( x ) : __flsl ( x ) )
48
49 #define fls( x ) flsl ( x )
50
51 extern int strcasecmp ( const char *s1, const char *s2 );
52
53 static inline __attribute__ (( always_inline )) void
54 bcopy ( const void *src, void *dest, size_t n ) {
55         memmove ( dest, src, n );
56 }
57
58 static inline __attribute__ (( always_inline )) void
59 bzero ( void *s, size_t n ) {
60         memset ( s, 0, n );
61 }
62
63 #endif /* _STRINGS_H */