summaryrefslogtreecommitdiff
path: root/libpsx/src/libc/strings.c
diff options
context:
space:
mode:
authorXavi Del Campo <xavi.dcr@tutanota.com>2020-01-31 10:32:23 +0100
committerXavi Del Campo <xavi.dcr@tutanota.com>2020-01-31 10:32:23 +0100
commit7c24e9a9b02b04dcaf9507acb94091ea70a2c02d (patch)
treec28d0748652ad4b4222309e46e6cfc82c0906220 /libpsx/src/libc/strings.c
parenta2b7b6bb1cc2f4a3258b7b2dbc92399d151f864d (diff)
downloadpsxsdk-7c24e9a9b02b04dcaf9507acb94091ea70a2c02d.tar.gz
Imported pristine psxsdk-20190410 from official repo
Diffstat (limited to 'libpsx/src/libc/strings.c')
-rw-r--r--libpsx/src/libc/strings.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/libpsx/src/libc/strings.c b/libpsx/src/libc/strings.c
new file mode 100644
index 0000000..76a5f9f
--- /dev/null
+++ b/libpsx/src/libc/strings.c
@@ -0,0 +1,41 @@
+#include <stdlib.h>
+#include <strings.h>
+#include <stdint.h>
+
+#define ffs_func(func_name, type) \
+\
+int func_name(type value) \
+{ \
+ int i; \
+ int nbits = sizeof(type) * 8;\
+ \
+ for(i = 0; i < nbits && !(value & ((type)1 << i) ); i++);\
+ \
+ return (i == nbits) ? 0 : (i + 1);\
+}
+
+ffs_func(ffs, int);
+ffs_func(ffsl, long);
+ffs_func(ffsll, long long);
+
+#define popcount_func(func_name, type) \
+\
+unsigned int func_name(type value) \
+{ \
+ int i, bitcnt; \
+ int nbits = sizeof(type) * 8; \
+ \
+ for(i = 0, bitcnt = 0; i < nbits; i++) \
+ {\
+ if( value & ((type)1 << i) )\
+ bitcnt++;\
+ }\
+ \
+ return bitcnt;\
+}
+
+popcount_func(popcount, unsigned int);
+popcount_func(popcountl, unsigned long);
+popcount_func(popcountll, unsigned long long);
+popcount_func(popcount32, uint32_t);
+popcount_func(popcount64, uint64_t);