diff options
| author | 2022-09-28 10:27:01 +0200 | |
|---|---|---|
| committer | 2022-09-28 10:27:01 +0200 | |
| commit | 5afb60f173dd1a266d023bb6568ca127ab6ea4b1 (patch) | |
| tree | 16095ca920cbe31893e2f0fe92a86db6448c302f | |
| parent | New function html_top_controls(). (diff) | |
| download | penes-snac2-5afb60f173dd1a266d023bb6568ca127ab6ea4b1.tar.gz penes-snac2-5afb60f173dd1a266d023bb6568ca127ab6ea4b1.tar.xz penes-snac2-5afb60f173dd1a266d023bb6568ca127ab6ea4b1.zip | |
Got xs_set.h from xs.
Diffstat (limited to '')
| -rw-r--r-- | Makefile | 7 | ||||
| -rw-r--r-- | html.c | 1 | ||||
| -rw-r--r-- | snac.c | 1 | ||||
| -rw-r--r-- | xs_set.h | 95 |
4 files changed, 101 insertions, 3 deletions
| @@ -15,13 +15,14 @@ dep: | |||
| 15 | $(CC) -I/usr/local/include -MM *.c > makefile.depend | 15 | $(CC) -I/usr/local/include -MM *.c > makefile.depend |
| 16 | 16 | ||
| 17 | activitypub.o: activitypub.c xs.h xs_encdec.h xs_json.h xs_curl.h \ | 17 | activitypub.o: activitypub.c xs.h xs_encdec.h xs_json.h xs_curl.h \ |
| 18 | xs_mime.h xs_openssl.h snac.h | 18 | xs_mime.h xs_openssl.h xs_regex.h snac.h |
| 19 | data.o: data.c xs.h xs_io.h xs_json.h xs_openssl.h snac.h | 19 | data.o: data.c xs.h xs_io.h xs_json.h xs_openssl.h snac.h |
| 20 | html.o: html.c xs.h xs_io.h xs_json.h xs_regex.h snac.h | 20 | html.o: html.c xs.h xs_io.h xs_encdec.h xs_json.h xs_regex.h xs_set.h \ |
| 21 | snac.h | ||
| 21 | http.o: http.c xs.h xs_io.h xs_encdec.h xs_openssl.h xs_curl.h snac.h | 22 | http.o: http.c xs.h xs_io.h xs_encdec.h xs_openssl.h xs_curl.h snac.h |
| 22 | httpd.o: httpd.c xs.h xs_io.h xs_encdec.h xs_json.h xs_socket.h \ | 23 | httpd.o: httpd.c xs.h xs_io.h xs_encdec.h xs_json.h xs_socket.h \ |
| 23 | xs_httpd.h snac.h | 24 | xs_httpd.h snac.h |
| 24 | main.o: main.c xs.h xs_io.h xs_encdec.h xs_json.h snac.h | 25 | main.o: main.c xs.h xs_io.h xs_encdec.h xs_json.h snac.h |
| 25 | snac.o: snac.c xs.h xs_io.h xs_encdec.h xs_json.h xs_curl.h xs_openssl.h \ | 26 | snac.o: snac.c xs.h xs_io.h xs_encdec.h xs_json.h xs_curl.h xs_openssl.h \ |
| 26 | xs_socket.h xs_httpd.h xs_mime.h xs_regex.h snac.h | 27 | xs_socket.h xs_httpd.h xs_mime.h xs_regex.h xs_set.h snac.h |
| 27 | webfinger.o: webfinger.c xs.h xs_encdec.h xs_json.h xs_curl.h snac.h | 28 | webfinger.o: webfinger.c xs.h xs_encdec.h xs_json.h xs_curl.h snac.h |
| @@ -6,6 +6,7 @@ | |||
| 6 | #include "xs_encdec.h" | 6 | #include "xs_encdec.h" |
| 7 | #include "xs_json.h" | 7 | #include "xs_json.h" |
| 8 | #include "xs_regex.h" | 8 | #include "xs_regex.h" |
| 9 | #include "xs_set.h" | ||
| 9 | 10 | ||
| 10 | #include "snac.h" | 11 | #include "snac.h" |
| 11 | 12 | ||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include "xs_httpd.h" | 13 | #include "xs_httpd.h" |
| 14 | #include "xs_mime.h" | 14 | #include "xs_mime.h" |
| 15 | #include "xs_regex.h" | 15 | #include "xs_regex.h" |
| 16 | #include "xs_set.h" | ||
| 16 | 17 | ||
| 17 | #include "snac.h" | 18 | #include "snac.h" |
| 18 | 19 | ||
diff --git a/xs_set.h b/xs_set.h new file mode 100644 index 0000000..c983ce6 --- /dev/null +++ b/xs_set.h | |||
| @@ -0,0 +1,95 @@ | |||
| 1 | /* copyright (c) 2022 grunfink - MIT license */ | ||
| 2 | |||
| 3 | #ifndef _XS_SET_H | ||
| 4 | |||
| 5 | #define _XS_SET_H | ||
| 6 | |||
| 7 | typedef struct _xs_set { | ||
| 8 | int elems; /* number of hash entries */ | ||
| 9 | int used; /* number of used hash entries */ | ||
| 10 | d_char *list; /* list of stored data */ | ||
| 11 | int hash[0]; /* hashed offsets */ | ||
| 12 | } xs_set; | ||
| 13 | |||
| 14 | xs_set *xs_set_new(int elems); | ||
| 15 | void xs_set_free(xs_set *s); | ||
| 16 | int xs_set_add(xs_set *s, char *data); | ||
| 17 | |||
| 18 | |||
| 19 | #ifdef XS_IMPLEMENTATION | ||
| 20 | |||
| 21 | xs_set *xs_set_new(int elems) | ||
| 22 | /* creates a new set with a maximum of size hashed data */ | ||
| 23 | { | ||
| 24 | int sz = sizeof(struct _xs_set) + sizeof(int) * elems; | ||
| 25 | xs_set *s = calloc(sz, 1); | ||
| 26 | |||
| 27 | /* initialize */ | ||
| 28 | s->elems = elems; | ||
| 29 | s->list = xs_list_new(); | ||
| 30 | |||
| 31 | return s; | ||
| 32 | } | ||
| 33 | |||
| 34 | |||
| 35 | void xs_set_free(xs_set *s) | ||
| 36 | /* frees a set */ | ||
| 37 | { | ||
| 38 | free(s->list); | ||
| 39 | free(s); | ||
| 40 | } | ||
| 41 | |||
| 42 | |||
| 43 | unsigned int _xs_set_hash(char *data, int size) | ||
| 44 | { | ||
| 45 | unsigned int hash = 0x666; | ||
| 46 | int n; | ||
| 47 | |||
| 48 | for (n = 0; n < size; n++) { | ||
| 49 | hash ^= data[n]; | ||
| 50 | hash *= 111111111; | ||
| 51 | } | ||
| 52 | |||
| 53 | return hash ^ hash >> 16; | ||
| 54 | } | ||
| 55 | |||
| 56 | |||
| 57 | int xs_set_add(xs_set *s, char *data) | ||
| 58 | /* adds the data to the set */ | ||
| 59 | /* returns: 1 if added, 0 if already there, -1 if it's full */ | ||
| 60 | { | ||
| 61 | unsigned int hash, i; | ||
| 62 | int sz = xs_size(data); | ||
| 63 | |||
| 64 | hash = _xs_set_hash(data, sz); | ||
| 65 | |||
| 66 | while (s->hash[(i = hash % s->elems)]) { | ||
| 67 | /* get the pointer to the stored data */ | ||
| 68 | char *p = &s->list[s->hash[i]]; | ||
| 69 | |||
| 70 | /* already here? */ | ||
| 71 | if (memcmp(p, data, sz) == 0) | ||
| 72 | return 0; | ||
| 73 | |||
| 74 | /* try next value */ | ||
| 75 | hash++; | ||
| 76 | } | ||
| 77 | |||
| 78 | /* is it full? fail */ | ||
| 79 | if (s->used == s->elems / 2) | ||
| 80 | return -1; | ||
| 81 | |||
| 82 | /* store the position */ | ||
| 83 | s->hash[i] = xs_size(s->list); | ||
| 84 | |||
| 85 | /* add the data */ | ||
| 86 | s->list = xs_list_append_m(s->list, data, sz); | ||
| 87 | |||
| 88 | s->used++; | ||
| 89 | |||
| 90 | return 1; | ||
| 91 | } | ||
| 92 | |||
| 93 | #endif /* XS_IMPLEMENTATION */ | ||
| 94 | |||
| 95 | #endif /* XS_SET_H */ \ No newline at end of file | ||