aboutsummaryrefslogtreecommitdiffstats
path: root/src/badlib.h
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2024-06-21 11:40:31 +0200
committerBad Diode <bd@badd10de.dev>2024-06-21 11:40:31 +0200
commit4646adb64119d9bd761447024a2f35cc0c9c2115 (patch)
tree116dfd0f2ad27933639188e6d29eec42305124d7 /src/badlib.h
parentc10fe9d48d40e3fa2a20ee61b79518dfbaeb4db9 (diff)
downloadbdl-4646adb64119d9bd761447024a2f35cc0c9c2115.tar.gz
bdl-4646adb64119d9bd761447024a2f35cc0c9c2115.zip
Add a basic symbol checker
Diffstat (limited to 'src/badlib.h')
-rw-r--r--src/badlib.h218
1 files changed, 108 insertions, 110 deletions
diff --git a/src/badlib.h b/src/badlib.h
index ada309a..e6f0df6 100644
--- a/src/badlib.h
+++ b/src/badlib.h
@@ -818,117 +818,116 @@ queue_pop(Queue *l) {
818 818
819// Specialiced commonly used hash sets/maps as macro definitions. There is no 819// Specialiced commonly used hash sets/maps as macro definitions. There is no
820// delete on these ones but are trivial to implement! 820// delete on these ones but are trivial to implement!
821#define SETDEF(STRUCTNAME, FUNCNAME, KEYTYPE, HASHFUNC, EQFUNC) \ 821#define SETDEF(STRUCTNAME, FUNCNAME, KEYTYPE, HASHFUNC, EQFUNC) \
822 typedef struct STRUCTNAME { \ 822 typedef struct STRUCTNAME { \
823 struct STRUCTNAME *child[4]; \ 823 struct STRUCTNAME *child[4]; \
824 KEYTYPE key; \ 824 KEYTYPE key; \
825 } STRUCTNAME; \ 825 } STRUCTNAME; \
826 STRUCTNAME *\ 826 STRUCTNAME *FUNCNAME##_lookup(STRUCTNAME **m, KEYTYPE key) { \
827 FUNCNAME##_lookup(STRUCTNAME **m, KEYTYPE key) {\ 827 u64 h = HASHFUNC(key); \
828 u64 h = HASHFUNC(key);\ 828 while (*m) { \
829 while (*m) {\ 829 if (EQFUNC(key, (*m)->key)) { \
830 if (EQFUNC(key, (*m)->key)) {\ 830 return *m; \
831 return *m;\ 831 } \
832 }\ 832 h = (h << 2) | (h >> 62); \
833 h = (h << 2) | (h >> 62);\ 833 m = &(*m)->child[h & 0x3]; \
834 m = &(*m)->child[h & 0x3];\ 834 } \
835 }\ 835 return NULL; \
836 return NULL;\ 836 } \
837 }\ 837 STRUCTNAME *FUNCNAME##_insert(STRUCTNAME **m, KEYTYPE key, Arena *a) { \
838 STRUCTNAME *\ 838 u64 h = HASHFUNC(key); \
839 FUNCNAME##_insert(STRUCTNAME **m, KEYTYPE key, Arena *a) {\ 839 while (*m) { \
840 u64 h = HASHFUNC(key);\ 840 if (EQFUNC(key, (*m)->key)) { \
841 while (*m) {\ 841 return *m; \
842 if (EQFUNC(key, (*m)->key)) {\ 842 } \
843 return *m;\ 843 h = (h << 2) | (h >> 62); \
844 }\ 844 m = &(*m)->child[h & 0x3]; \
845 h = (h << 2) | (h >> 62);\ 845 } \
846 m = &(*m)->child[h & 0x3];\ 846 *m = arena_calloc(sizeof(STRUCTNAME), a); \
847 }\ 847 (*m)->key = key; \
848 *m = arena_calloc(sizeof(STRUCTNAME), a);\ 848 return *m; \
849 (*m)->key = key;\ 849 } \
850 return *m;\ 850 typedef Queue STRUCTNAME##Iter; \
851 }\ 851 STRUCTNAME##Iter FUNCNAME##_iterator(STRUCTNAME *map, Arena *a) { \
852 typedef Queue STRUCTNAME##Iter;\ 852 STRUCTNAME##Iter it = {0}; \
853 STRUCTNAME##Iter\ 853 queue_push(&it, map, a); \
854 FUNCNAME##_iterator(STRUCTNAME *map, Arena *a) {\ 854 return it; \
855 STRUCTNAME##Iter it = {0};\ 855 } \
856 queue_push(&it, map, a);\ 856 STRUCTNAME *FUNCNAME##_next(STRUCTNAME##Iter *it, Arena *a) { \
857 return it;\ 857 assert(it); \
858 }\ 858 assert(a); \
859 STRUCTNAME *\ 859 while (it->head) { \
860 FUNCNAME##_next(STRUCTNAME##Iter *it, Arena *a) {\ 860 STRUCTNAME *item = (STRUCTNAME *)queue_pop(it); \
861 assert(it);\ 861 if (!item) { \
862 assert(a);\ 862 return NULL; \
863 while (it->head) {\ 863 } \
864 STRUCTNAME *item = (STRUCTNAME *)queue_pop(it);\ 864 for (sz i = 0; i < 4; i++) { \
865 for (sz i = 0; i < 4; i++) {\ 865 STRUCTNAME *child = item->child[i]; \
866 STRUCTNAME *child = item->child[i];\ 866 if (child) { \
867 if (child) {\ 867 queue_push(it, child, a); \
868 queue_push(it, child, a);\ 868 } \
869 }\ 869 } \
870 }\ 870 return item; \
871 return item;\ 871 } \
872 }\ 872 return NULL; \
873 return NULL;\
874 } 873 }
875 874
876#define MAPDEF(STRUCTNAME, FUNCNAME, KEYTYPE, VALTYPE, HASHFUNC, EQFUNC) \ 875#define MAPDEF(STRUCTNAME, FUNCNAME, KEYTYPE, VALTYPE, HASHFUNC, EQFUNC) \
877 typedef struct STRUCTNAME { \ 876 typedef struct STRUCTNAME { \
878 struct STRUCTNAME *child[4]; \ 877 struct STRUCTNAME *child[4]; \
879 KEYTYPE key; \ 878 KEYTYPE key; \
880 VALTYPE val; \ 879 VALTYPE val; \
881 } STRUCTNAME;\ 880 } STRUCTNAME; \
882 STRUCTNAME *\ 881 STRUCTNAME *FUNCNAME##_insert(STRUCTNAME **m, KEYTYPE key, VALTYPE val, \
883 FUNCNAME##_insert(STRUCTNAME **m, KEYTYPE key, VALTYPE val, Arena *a) {\ 882 Arena *a) { \
884 u64 h = HASHFUNC(key);\ 883 u64 h = HASHFUNC(key); \
885 while (*m) {\ 884 while (*m) { \
886 if (EQFUNC(key, (*m)->key)) {\ 885 if (EQFUNC(key, (*m)->key)) { \
887 (*m)->val = val;\ 886 (*m)->val = val; \
888 return *m;\ 887 return *m; \
889 }\ 888 } \
890 h = (h << 2) | (h >> 62);\ 889 h = (h << 2) | (h >> 62); \
891 m = &(*m)->child[h & 0x3];\ 890 m = &(*m)->child[h & 0x3]; \
892 }\ 891 } \
893 *m = arena_calloc(sizeof(STRUCTNAME), a);\ 892 *m = arena_calloc(sizeof(STRUCTNAME), a); \
894 (*m)->key = key;\ 893 (*m)->key = key; \
895 (*m)->val = val;\ 894 (*m)->val = val; \
896 return *m;\ 895 return *m; \
897 }\ 896 } \
898 STRUCTNAME *\ 897 STRUCTNAME *FUNCNAME##_lookup(STRUCTNAME **m, KEYTYPE key) { \
899 FUNCNAME##_lookup(STRUCTNAME **m, KEYTYPE key) {\ 898 u64 h = HASHFUNC(key); \
900 u64 h = HASHFUNC(key);\ 899 while (*m) { \
901 while (*m) {\ 900 if (EQFUNC(key, (*m)->key)) { \
902 if (EQFUNC(key, (*m)->key)) {\ 901 return *m; \
903 return *m;\ 902 } \
904 }\ 903 h = (h << 2) | (h >> 62); \
905 h = (h << 2) | (h >> 62);\ 904 m = &(*m)->child[h & 0x3]; \
906 m = &(*m)->child[h & 0x3];\ 905 } \
907 }\ 906 return NULL; \
908 return NULL;\ 907 } \
909 }\ 908 typedef Queue STRUCTNAME##Iter; \
910 typedef Queue STRUCTNAME##Iter;\ 909 STRUCTNAME##Iter FUNCNAME##_iterator(STRUCTNAME *map, Arena *a) { \
911 STRUCTNAME##Iter\ 910 STRUCTNAME##Iter it = {0}; \
912 FUNCNAME##_iterator(STRUCTNAME *map, Arena *a) {\ 911 queue_push(&it, map, a); \
913 STRUCTNAME##Iter it = {0};\ 912 return it; \
914 queue_push(&it, map, a);\ 913 } \
915 return it;\ 914 STRUCTNAME *FUNCNAME##_next(STRUCTNAME##Iter *it, Arena *a) { \
916 }\ 915 assert(it); \
917 STRUCTNAME *\ 916 assert(a); \
918 FUNCNAME##_next(STRUCTNAME##Iter *it, Arena *a) {\ 917 while (it->head) { \
919 assert(it);\ 918 STRUCTNAME *item = (STRUCTNAME *)queue_pop(it); \
920 assert(a);\ 919 if (!item) { \
921 while (it->head) {\ 920 return NULL; \
922 STRUCTNAME *item = (STRUCTNAME *)queue_pop(it);\ 921 } \
923 for (sz i = 0; i < 4; i++) {\ 922 for (sz i = 0; i < 4; i++) { \
924 STRUCTNAME *child = item->child[i];\ 923 STRUCTNAME *child = item->child[i]; \
925 if (child) {\ 924 if (child) { \
926 queue_push(it, child, a);\ 925 queue_push(it, child, a); \
927 }\ 926 } \
928 }\ 927 } \
929 return item;\ 928 return item; \
930 }\ 929 } \
931 return NULL;\ 930 return NULL; \
932 } 931 }
933 932
934u64 933u64
@@ -951,7 +950,6 @@ _int_hash(sz a) {
951 return a * UINT64_C(11400714819323198485); 950 return a * UINT64_C(11400714819323198485);
952} 951}
953 952
954
955// Commonly used map/set types. 953// Commonly used map/set types.
956SETDEF(StrSet, strset, Str, str_hash, str_eq) 954SETDEF(StrSet, strset, Str, str_hash, str_eq)
957MAPDEF(StrIntMap, strintmap, Str, sz, str_hash, str_eq) 955MAPDEF(StrIntMap, strintmap, Str, sz, str_hash, str_eq)