commit 8cf7559

default  ·  2024-05-23 08:01:37 +0000 UTC
parent 63e0ca5
Added more const.
20 files changed,  +171, -150
M data.c
M html.c
M http.c
M main.c
M xs.h
+20, -19
  1@@ -163,7 +163,7 @@ const char *get_atto(const xs_dict *msg)
  2     if (xs_type(actor) == XSTYPE_LIST) {
  3         const xs_list *p = actor;
  4         int c = 0;
  5-        xs_dict *v;
  6+        const xs_dict *v;
  7         actor = NULL;
  8 
  9         while (actor == NULL && xs_list_next(p, &v, &c)) {
 10@@ -192,7 +192,7 @@ xs_list *get_attachments(const xs_dict *msg)
 11     /* try first the attachments list */
 12     if (!xs_is_null(p = xs_dict_get(msg, "attachment"))) {
 13         xs *attach = NULL;
 14-        xs_val *v;
 15+        const xs_val *v;
 16 
 17         /* ensure it's a list */
 18         if (xs_type(p) == XSTYPE_DICT) {
 19@@ -257,7 +257,7 @@ xs_list *get_attachments(const xs_dict *msg)
 20         const char *href = NULL;
 21         const char *type = NULL;
 22         int c = 0;
 23-        xs_val *v;
 24+        const xs_val *v;
 25 
 26         while (href == NULL && xs_list_next(p, &v, &c)) {
 27             if (xs_type(v) == XSTYPE_DICT) {
 28@@ -271,7 +271,7 @@ xs_list *get_attachments(const xs_dict *msg)
 29                         strcmp(mtype, "application/x-mpegURL") == 0 &&
 30                         xs_type(tag) == XSTYPE_LIST) {
 31                         /* now iterate the tag list, looking for a video URL */
 32-                        xs_dict *d;
 33+                        const xs_dict *d;
 34                         int c = 0;
 35 
 36                         while (href == NULL && xs_list_next(tag, &d, &c)) {
 37@@ -482,7 +482,7 @@ xs_list *recipient_list(snac *snac, const xs_dict *msg, int expand_public)
 38     const xs_list *lists[] = { to, cc, NULL };
 39     for (n = 0; lists[n]; n++) {
 40         xs_list *l = (xs_list *)lists[n];
 41-        char *v;
 42+        const char *v;
 43         xs *tl = NULL;
 44 
 45         /* if it's a string, create a list with only one element */
 46@@ -497,7 +497,7 @@ xs_list *recipient_list(snac *snac, const xs_dict *msg, int expand_public)
 47             if (expand_public && strcmp(v, public_address) == 0) {
 48                 /* iterate the followers and add them */
 49                 xs *fwers = follower_list(snac);
 50-                char *actor;
 51+                const char *actor;
 52 
 53                 char *p = fwers;
 54                 while (xs_list_iter(&p, &actor))
 55@@ -628,7 +628,7 @@ int is_msg_for_me(snac *snac, const xs_dict *c_msg)
 56     const xs_dict *msg = xs_dict_get(c_msg, "object");
 57     xs *rcpts = recipient_list(snac, msg, 0);
 58     xs_list *p = rcpts;
 59-    xs_str *v;
 60+    const xs_str *v;
 61 
 62     xs *actor_followers = NULL;
 63 
 64@@ -693,7 +693,7 @@ xs_str *process_tags(snac *snac, const char *content, xs_list **tag)
 65     xs_list *tl = *tag;
 66     xs *split;
 67     xs_list *p;
 68-    xs_val *v;
 69+    const xs_val *v;
 70     int n = 0;
 71 
 72     /* create a default server for incomplete mentions */
 73@@ -1205,8 +1205,8 @@ xs_dict *msg_actor(snac *snac)
 74     const xs_dict *metadata = xs_dict_get(snac->config, "metadata");
 75     if (xs_type(metadata) == XSTYPE_DICT) {
 76         xs *attach = xs_list_new();
 77-        xs_str *k;
 78-        xs_str *v;
 79+        const xs_str *k;
 80+        const xs_str *v;
 81 
 82         int c = 0;
 83         while (xs_dict_next(metadata, &k, &v, &c)) {
 84@@ -1351,7 +1351,7 @@ xs_dict *msg_note(snac *snac, const xs_str *content, const xs_val *rcpts,
 85     xs *atls = xs_list_new();
 86     xs_dict *msg = msg_base(snac, "Note", id, NULL, "@now", NULL);
 87     xs_list *p;
 88-    xs_val *v;
 89+    const xs_val *v;
 90 
 91     if (rcpts == NULL)
 92         to = xs_list_new();
 93@@ -1528,7 +1528,7 @@ xs_dict *msg_question(snac *user, const char *content, xs_list *attach,
 94 
 95     xs *o = xs_list_new();
 96     xs_list *p = (xs_list *)opts;
 97-    xs_str *v;
 98+    const xs_str *v;
 99     xs *replies = xs_json_loads("{\"type\":\"Collection\",\"totalItems\":0}");
100 
101     xs_set_init(&seen);
102@@ -1576,7 +1576,7 @@ int update_question(snac *user, const char *id)
103     xs *lopts = xs_list_new();
104     const xs_list *opts;
105     xs_list *p;
106-    xs_val *v;
107+    const xs_val *v;
108 
109     /* get the object */
110     if (!valid_status(object_get(id, &msg)))
111@@ -2190,7 +2190,7 @@ void process_user_queue_item(snac *snac, xs_dict *q_item)
112         xs *rcpts    = recipient_list(snac, msg, 1);
113         xs_set inboxes;
114         xs_list *p;
115-        xs_str *actor;
116+        const xs_str *actor;
117 
118         xs_set_init(&inboxes);
119 
120@@ -2212,7 +2212,7 @@ void process_user_queue_item(snac *snac, xs_dict *q_item)
121         if (is_msg_public(msg)) {
122             if (xs_type(xs_dict_get(srv_config, "disable_inbox_collection")) != XSTYPE_TRUE) {
123                 xs *shibx = inbox_list();
124-                xs_str *inbox;
125+                const xs_str *inbox;
126 
127                 p = shibx;
128                 while (xs_list_iter(&p, &inbox)) {
129@@ -2304,7 +2304,7 @@ int process_user_queue(snac *snac)
130     xs *list = user_queue(snac);
131 
132     xs_list *p = list;
133-    xs_str *fn;
134+    const xs_str *fn;
135 
136     while (xs_list_iter(&p, &fn)) {
137         xs *q_item = dequeue(fn);
138@@ -2511,7 +2511,7 @@ void process_queue_item(xs_dict *q_item)
139 
140             xs *users = user_list();
141             xs_list *p = users;
142-            char *v;
143+            const char *v;
144             int cnt = 0;
145 
146             while (xs_list_iter(&p, &v)) {
147@@ -2554,7 +2554,7 @@ int process_queue(void)
148     xs *list = queue();
149 
150     xs_list *p = list;
151-    xs_str *fn;
152+    const xs_str *fn;
153 
154     while (xs_list_iter(&p, &fn)) {
155         xs *q_item = dequeue(fn);
156@@ -2616,7 +2616,8 @@ int activitypub_get_handler(const xs_dict *req, const char *q_path,
157         xs *elems = timeline_simple_list(&snac, "public", 0, 20);
158         xs *list = xs_list_new();
159         msg = msg_collection(&snac, id);
160-        char *p, *v;
161+        char *p;
162+        const char *v;
163 
164         p = elems;
165         while (xs_list_iter(&p, &v)) {
M data.c
+31, -27
  1@@ -193,7 +193,7 @@ int user_open(snac *user, const char *uid)
  2             xs *lcuid = xs_tolower_i(xs_dup(uid));
  3             xs *ulist = user_list();
  4             xs_list *p = ulist;
  5-            xs_str *v;
  6+            const xs_str *v;
  7 
  8             while (xs_list_iter(&p, &v)) {
  9                 xs *v2 = xs_tolower_i(xs_dup(v));
 10@@ -289,7 +289,7 @@ int user_open_by_md5(snac *snac, const char *md5)
 11 {
 12     xs *ulist  = user_list();
 13     xs_list *p = ulist;
 14-    xs_str *v;
 15+    const xs_str *v;
 16 
 17     while (xs_list_iter(&p, &v)) {
 18         user_open(snac, v);
 19@@ -772,7 +772,8 @@ int object_del_by_md5(const char *md5)
 20         xs *spec  = xs_dup(fn);
 21         spec      = xs_replace_i(spec, ".json", "*.idx");
 22         xs *files = xs_glob(spec, 0, 0);
 23-        char *p, *v;
 24+        char *p;
 25+        const char *v;
 26 
 27         p = files;
 28         while (xs_list_iter(&p, &v)) {
 29@@ -1033,7 +1034,8 @@ xs_list *follower_list(snac *snac)
 30 {
 31     xs *list       = object_user_cache_list(snac, "followers", XS_ALL, 0);
 32     xs_list *fwers = xs_list_new();
 33-    char *p, *v;
 34+    char *p;
 35+    const char *v;
 36 
 37     /* resolve the list of md5 to be a list of actors */
 38     p = list;
 39@@ -1196,7 +1198,7 @@ xs_list *timeline_top_level(snac *snac, const xs_list *list)
 40 /* returns the top level md5 entries from this index */
 41 {
 42     xs_set seen;
 43-    xs_str *v;
 44+    const xs_str *v;
 45 
 46     xs_set_init(&seen);
 47 
 48@@ -1367,7 +1369,7 @@ xs_list *following_list(snac *snac)
 49     xs *spec = xs_fmt("%s/following/" "*.json", snac->basedir);
 50     xs *glist = xs_glob(spec, 0, 0);
 51     xs_list *p;
 52-    xs_str *v;
 53+    const xs_str *v;
 54     xs_list *list = xs_list_new();
 55 
 56     /* iterate the list of files */
 57@@ -1537,7 +1539,8 @@ void hide(snac *snac, const char *id)
 58 
 59         /* hide all the children */
 60         xs *chld = object_children(id);
 61-        char *p, *v;
 62+        char *p;
 63+        const char *v;
 64 
 65         p = chld;
 66         while (xs_list_iter(&p, &v)) {
 67@@ -1694,7 +1697,7 @@ void tag_index(const char *id, const xs_dict *obj)
 68 
 69         mkdirx(g_tag_dir);
 70 
 71-        xs_dict *v;
 72+        const xs_dict *v;
 73         int ct = 0;
 74         while (xs_list_next(tags, &v, &ct)) {
 75             const char *type = xs_dict_get(v, "type");
 76@@ -1758,7 +1761,7 @@ xs_val *list_maint(snac *user, const char *list, int op)
 77             xs *spec = xs_fmt("%s/list/" "*.id", user->basedir);
 78             xs *ls   = xs_glob(spec, 0, 0);
 79             int c = 0;
 80-            char *v;
 81+            const char *v;
 82 
 83             l = xs_list_new();
 84 
 85@@ -1784,7 +1787,7 @@ xs_val *list_maint(snac *user, const char *list, int op)
 86         {
 87             xs *lol = list_maint(user, NULL, 0);
 88             int c = 0;
 89-            xs_list *v;
 90+            const xs_list *v;
 91             int add = 1;
 92 
 93             /* check if this list name already exists */
 94@@ -1925,7 +1928,7 @@ void list_distribute(snac *user, const char *who, const xs_dict *post)
 95         xs *spec  = xs_fmt("%s/list/" "*.lst", user->basedir);
 96         xs *ls    = xs_glob(spec, 0, 0);
 97         int c = 0;
 98-        char *v;
 99+        const char *v;
100 
101         while (xs_list_next(ls, &v, &c)) {
102             /* is the actor in this list? */
103@@ -2183,7 +2186,7 @@ xs_list *inbox_list(void)
104     xs *spec     = xs_fmt("%s/inbox/" "*", srv_basedir);
105     xs *files    = xs_glob(spec, 0, 0);
106     xs_list *p   = files;
107-    xs_val *v;
108+    const xs_val *v;
109 
110     while (xs_list_iter(&p, &v)) {
111         FILE *f;
112@@ -2329,8 +2332,8 @@ xs_list *content_search(snac *user, const char *regex,
113 
114     /* iterate all timelines simultaneously */
115     xs_list *tls[3] = {0};
116-    char *md5s[3]   = {0};
117-    int c[3]        = {0};
118+    const char *md5s[3] = {0};
119+    int c[3] = {0};
120 
121     tls[0] = timeline_simple_list(user, "public", 0, XS_ALL);   /* public */
122     tls[1] = timeline_instance_list(0, XS_ALL); /* instance */
123@@ -2368,7 +2371,7 @@ xs_list *content_search(snac *user, const char *regex,
124         if (newest == -1)
125             break;
126 
127-        char *md5 = md5s[newest];
128+        const char *md5 = md5s[newest];
129 
130         /* advance the chosen timeline */
131         if (!xs_list_next(tls[newest], &md5s[newest], &c[newest]))
132@@ -2534,7 +2537,7 @@ xs_list *notify_list(snac *snac, int skip, int show)
133             xs *spec = xs_fmt("%s/notify/" "*.json", snac->basedir);
134             xs *lst  = xs_glob(spec, 1, 0);
135             xs_list *p = lst;
136-            char *v;
137+            const char *v;
138 
139             while (xs_list_iter(&p, &v)) {
140                 char *p = strrchr(v, '.');
141@@ -2562,7 +2565,7 @@ int notify_new_num(snac *snac)
142     int cnt = 0;
143 
144     xs_list *p = lst;
145-    xs_str *v;
146+    const xs_str *v;
147 
148     while (xs_list_iter(&p, &v)) {
149         xs *id = xs_strip_i(xs_dup(v));
150@@ -2584,7 +2587,7 @@ void notify_clear(snac *snac)
151     xs *spec   = xs_fmt("%s/notify/" "*", snac->basedir);
152     xs *lst    = xs_glob(spec, 0, 0);
153     xs_list *p = lst;
154-    xs_str *v;
155+    const xs_str *v;
156 
157     while (xs_list_iter(&p, &v))
158         unlink(v);
159@@ -2842,7 +2845,7 @@ int was_question_voted(snac *user, const char *id)
160     xs *children = object_children(id);
161     int voted = 0;
162     xs_list *p;
163-    xs_str *md5;
164+    const xs_str *md5;
165 
166     p = children;
167     while (xs_list_iter(&p, &md5)) {
168@@ -2869,7 +2872,7 @@ xs_list *user_queue(snac *snac)
169     xs_list *list = xs_list_new();
170     time_t t      = time(NULL);
171     xs_list *p;
172-    xs_val *v;
173+    const xs_val *v;
174 
175     xs *fns = xs_glob(spec, 0, 0);
176 
177@@ -2898,7 +2901,7 @@ xs_list *queue(void)
178     xs_list *list = xs_list_new();
179     time_t t      = time(NULL);
180     xs_list *p;
181-    xs_val *v;
182+    const xs_val *v;
183 
184     xs *fns = xs_glob(spec, 0, 0);
185 
186@@ -2974,7 +2977,7 @@ static void _purge_dir(const char *dir, int days)
187         xs *spec  = xs_fmt("%s/" "*", dir);
188         xs *list  = xs_glob(spec, 0, 0);
189         xs_list *p;
190-        xs_str *v;
191+        const xs_str *v;
192 
193         p = list;
194         while (xs_list_iter(&p, &v))
195@@ -3000,7 +3003,7 @@ void purge_server(void)
196     xs *spec = xs_fmt("%s/object/??", srv_basedir);
197     xs *dirs = xs_glob(spec, 0, 0);
198     xs_list *p;
199-    xs_str *v;
200+    const xs_str *v;
201     int cnt = 0;
202     int icnt = 0;
203 
204@@ -3009,7 +3012,7 @@ void purge_server(void)
205     p = dirs;
206     while (xs_list_iter(&p, &v)) {
207         xs_list *p2;
208-        xs_str *v2;
209+        const xs_str *v2;
210 
211         {
212             xs *spec2 = xs_fmt("%s/" "*.json", v);
213@@ -3088,7 +3091,7 @@ void purge_server(void)
214         xs *spec2 = xs_fmt("%s/" "*.idx", v);
215         xs *files = xs_glob(spec2, 0, 0);
216         xs_list *p2;
217-        xs_str *v2;
218+        const xs_str *v2;
219 
220         p2 = files;
221         while (xs_list_iter(&p2, &v2)) {
222@@ -3152,7 +3155,7 @@ void purge_user(snac *snac)
223         xs *spec = xs_fmt("%s/list/" "*.idx", snac->basedir);
224         xs *lol  = xs_glob(spec, 0, 0);
225         int c = 0;
226-        char *v;
227+        const char *v;
228 
229         while (xs_list_next(lol, &v, &c)) {
230             int gc = index_gc(v);
231@@ -3170,7 +3173,8 @@ void purge_all(void)
232 {
233     snac snac;
234     xs *list = user_list();
235-    char *p, *uid;
236+    char *p;
237+    const char *uid;
238 
239     p = list;
240     while (xs_list_iter(&p, &uid)) {
+7, -4
 1@@ -82,7 +82,8 @@ static xs_str *format_line(const char *line, xs_list **attach)
 2 /* formats a line */
 3 {
 4     xs_str *s = xs_str_new(NULL);
 5-    char *p, *v;
 6+    char *p;
 7+    const char *v;
 8 
 9     /* split by markup */
10     xs *sm = xs_regex_split(line,
11@@ -155,7 +156,8 @@ xs_str *not_really_markdown(const char *content, xs_list **attach, xs_list **tag
12     int in_pre = 0;
13     int in_blq = 0;
14     xs *list;
15-    char *p, *v;
16+    char *p;
17+    const char *v;
18 
19     /* work by lines */
20     list = xs_split(content, "\n");
21@@ -234,7 +236,7 @@ xs_str *not_really_markdown(const char *content, xs_list **attach, xs_list **tag
22         /* traditional emoticons */
23         xs *d = emojis();
24         int c = 0;
25-        char *k, *v;
26+        const char *k, *v;
27 
28         while (xs_dict_next(d, &k, &v, &c)) {
29             const char *t = NULL;
30@@ -280,7 +282,8 @@ xs_str *sanitize(const char *content)
31     xs_str *s = xs_str_new(NULL);
32     xs *sl;
33     int n = 0;
34-    char *p, *v;
35+    char *p;
36+    const char *v;
37 
38     sl = xs_regex_split(content, "</?[^>]+>");
39 
M html.c
+18, -18
  1@@ -57,7 +57,7 @@ xs_str *replace_shortnames(xs_str *s, const xs_list *tag, int ems)
  2 
  3         xs *style = xs_fmt("height: %dem; width: %dem; vertical-align: middle;", ems, ems);
  4 
  5-        char *v;
  6+        const char *v;
  7         int c = 0;
  8 
  9         while (xs_list_next(tag_list, &v, &c)) {
 10@@ -461,7 +461,7 @@ static xs_html *html_base_head(void)
 11     xs *f;
 12     f = xs_fmt("%s/favicon.ico", srv_baseurl);
 13     const xs_list *p = xs_dict_get(srv_config, "cssurls");
 14-    char *v;
 15+    const char *v;
 16     int c = 0;
 17 
 18     while (xs_list_next(p, &v, &c)) {
 19@@ -801,8 +801,8 @@ static xs_html *html_user_body(snac *user, int read_only)
 20 
 21         const xs_dict *metadata = xs_dict_get(user->config, "metadata");
 22         if (xs_type(metadata) == XSTYPE_DICT) {
 23-            xs_str *k;
 24-            xs_str *v;
 25+            const xs_str *k;
 26+            const xs_str *v;
 27 
 28             xs_dict *val_links = user->links;
 29             if (xs_is_null(val_links))
 30@@ -974,8 +974,8 @@ xs_html *html_top_controls(snac *snac)
 31 
 32     xs *metadata = xs_str_new(NULL);
 33     const xs_dict *md = xs_dict_get(snac->config, "metadata");
 34-    xs_str *k;
 35-    xs_str *v;
 36+    const xs_str *k;
 37+    const xs_str *v;
 38 
 39     int c = 0;
 40     while (xs_dict_next(md, &k, &v, &c)) {
 41@@ -1161,7 +1161,7 @@ xs_str *build_mentions(snac *snac, const xs_dict *msg)
 42 {
 43     xs_str *s = xs_str_new(NULL);
 44     const char *list = xs_dict_get(msg, "tag");
 45-    char *v;
 46+    const char *v;
 47     int c = 0;
 48 
 49     while (xs_list_next(list, &v, &c)) {
 50@@ -1372,7 +1372,7 @@ xs_html *html_entry_controls(snac *snac, const char *actor,
 51 
 52 
 53 xs_html *html_entry(snac *user, xs_dict *msg, int read_only,
 54-                   int level, char *md5, int hide_children)
 55+                   int level, const char *md5, int hide_children)
 56 {
 57     const char *id    = xs_dict_get(msg, "id");
 58     const char *type  = xs_dict_get(msg, "type");
 59@@ -1670,7 +1670,7 @@ xs_html *html_entry(snac *user, xs_dict *msg, int read_only,
 60         const xs_list *oo = xs_dict_get(msg, "oneOf");
 61         const xs_list *ao = xs_dict_get(msg, "anyOf");
 62         const xs_list *p;
 63-        xs_dict *v;
 64+        const xs_dict *v;
 65         int closed = 0;
 66         const char *f_closed = NULL;
 67 
 68@@ -1827,7 +1827,7 @@ xs_html *html_entry(snac *user, xs_dict *msg, int read_only,
 69             content_attachments);
 70 
 71         int c = 0;
 72-        xs_dict *a;
 73+        const xs_dict *a;
 74         while (xs_list_next(attach, &a, &c)) {
 75             const char *type = xs_dict_get(a, "type");
 76             const char *href = xs_dict_get(a, "href");
 77@@ -1945,7 +1945,7 @@ xs_html *html_entry(snac *user, xs_dict *msg, int read_only,
 78             }
 79 
 80             xs_list *p = children;
 81-            char *cmd5;
 82+            const char *cmd5;
 83             int cnt = 0;
 84             int o_cnt = 0;
 85 
 86@@ -2021,7 +2021,7 @@ xs_str *html_timeline(snac *user, const xs_list *list, int read_only,
 87 /* returns the HTML for the timeline */
 88 {
 89     xs_list *p = (xs_list *)list;
 90-    char *v;
 91+    const char *v;
 92     double t = ftime();
 93 
 94     xs *desc = NULL;
 95@@ -2130,7 +2130,7 @@ xs_str *html_timeline(snac *user, const xs_list *list, int read_only,
 96 
 97             xs *list = history_list(user);
 98             xs_list *p = list;
 99-            char *v;
100+            const char *v;
101 
102             while (xs_list_iter(&p, &v)) {
103                 xs *fn  = xs_replace(v, ".html", "");
104@@ -2203,7 +2203,7 @@ xs_html *html_people_list(snac *snac, xs_list *list, char *header, char *t)
105                     xs_html_text("..."))));
106 
107     xs_list *p = list;
108-    char *actor_id;
109+    const char *actor_id;
110 
111     while (xs_list_iter(&p, &actor_id)) {
112         xs *md5 = xs_md5_hex(actor_id, strlen(actor_id));
113@@ -2363,7 +2363,7 @@ xs_str *html_notifications(snac *user, int skip, int show)
114     xs_html *noti_seen = NULL;
115 
116     xs_list *p = n_list;
117-    xs_str *v;
118+    const xs_str *v;
119     while (xs_list_iter(&p, &v)) {
120         xs *noti = notify_get(user, v);
121 
122@@ -3232,7 +3232,7 @@ int html_post_handler(const xs_dict *req, const char *q_path,
123             xs_dict *md = xs_dict_new();
124             xs *l = xs_split(v, "\n");
125             xs_list *p = l;
126-            xs_str *kp;
127+            const xs_str *kp;
128 
129             while (xs_list_iter(&p, &kp)) {
130                 xs *kpl = xs_split_n(kp, "=", 1);
131@@ -3333,7 +3333,7 @@ int html_post_handler(const xs_dict *req, const char *q_path,
132         }
133 
134         xs_list *p = ls;
135-        xs_str *v;
136+        const xs_str *v;
137 
138         while (xs_list_iter(&p, &v)) {
139             xs *msg = msg_note(&snac, "", actor, irt, NULL, 1);
140@@ -3405,7 +3405,7 @@ xs_str *timeline_to_rss(snac *user, const xs_list *timeline, char *title, char *
141     xs_html_add(rss, channel);
142 
143     int c = 0;
144-    char *v;
145+    const char *v;
146 
147     while (xs_list_next(timeline, &v, &c)) {
148         xs *msg = NULL;
M http.c
+3, -3
 1@@ -26,7 +26,7 @@ xs_dict *http_signed_request_raw(const char *keyid, const char *seckey,
 2     xs *hdrs = NULL;
 3     const char *host;
 4     const char *target;
 5-    char *k, *v;
 6+    const char *k, *v;
 7     xs_dict *response;
 8 
 9     date = xs_str_utctime(0, "%a, %d %b %Y %H:%M:%S GMT");
10@@ -144,7 +144,7 @@ int check_signature(const xs_dict *req, xs_str **err)
11         /* extract the values */
12         xs *l = xs_split(sig_hdr, ",");
13         int c = 0;
14-        xs_val *v;
15+        const xs_val *v;
16 
17         while (xs_list_next(l, &v, &c)) {
18             xs *kv = xs_split_n(v, "=", 1);
19@@ -205,7 +205,7 @@ int check_signature(const xs_dict *req, xs_str **err)
20     {
21         xs *l = xs_split(headers, " ");
22         xs_list *p;
23-        xs_val *v;
24+        const xs_val *v;
25 
26         p = l;
27         while (xs_list_iter(&p, &v)) {
+5, -4
 1@@ -75,7 +75,7 @@ xs_str *nodeinfo_2_0(void)
 2     int n_posts  = 0;
 3     xs *users = user_list();
 4     xs_list *p = users;
 5-    char *v;
 6+    const char *v;
 7     double now = (double)time(NULL);
 8 
 9     while (xs_list_iter(&p, &v)) {
10@@ -128,7 +128,7 @@ static xs_str *greeting_html(void)
11             const char *host = xs_dict_get(srv_config, "host");
12             xs *list = user_list();
13             xs_list *p = list;
14-            xs_str *uid;
15+            const xs_str *uid;
16 
17             xs_html *ul = xs_html_tag("ul",
18                 xs_html_attr("class", "snac-user-list"));
19@@ -413,7 +413,7 @@ void httpd_connection(FILE *f)
20     /* if there are any additional headers, add them */
21     const xs_dict *more_headers = xs_dict_get(srv_config, "http_headers");
22     if (xs_type(more_headers) == XSTYPE_DICT) {
23-        char *k, *v;
24+        const char *k, *v;
25         int c = 0;
26         while (xs_dict_next(more_headers, &k, &v, &c))
27             headers = xs_dict_set(headers, k, v);
28@@ -590,7 +590,8 @@ static void *background_thread(void *arg)
29 
30         {
31             xs *list = user_list();
32-            char *p, *uid;
33+            char *p;
34+            const char *uid;
35 
36             /* process queues for all users */
37             p = list;
M main.c
+1, -1
1@@ -382,7 +382,7 @@ int main(int argc, char *argv[])
2         xs *r = content_search(&snac, url, 1, 0, XS_ALL, 10, &to);
3 
4         int c = 0;
5-        char *v;
6+        const char *v;
7 
8         /* print results as standalone links */
9         while (xs_list_next(r, &v, &c)) {
+25, -25
  1@@ -599,7 +599,7 @@ xs_dict *mastoapi_account(const xs_dict *actor)
  2     const xs_list *p;
  3     if (!xs_is_null(p = xs_dict_get(actor, "tag"))) {
  4         xs *eml = xs_list_new();
  5-        xs_dict *v;
  6+        const xs_dict *v;
  7         int c = 0;
  8 
  9         while (xs_list_next(p, &v, &c)) {
 10@@ -637,7 +637,7 @@ xs_dict *mastoapi_account(const xs_dict *actor)
 11 
 12     xs *fields = xs_list_new();
 13     p = xs_dict_get(actor, "attachment");
 14-    xs_dict *v;
 15+    const xs_dict *v;
 16 
 17     /* dict of validated links */
 18     xs_dict *val_links = NULL;
 19@@ -713,7 +713,7 @@ xs_dict *mastoapi_poll(snac *snac, const xs_dict *msg)
 20     xs_dict *poll = xs_dict_new();
 21     xs *mid       = mastoapi_id(msg);
 22     const xs_list *opts = NULL;
 23-    xs_val *v;
 24+    const xs_val *v;
 25     int num_votes = 0;
 26     xs *options = xs_list_new();
 27 
 28@@ -849,7 +849,7 @@ xs_dict *mastoapi_status(snac *snac, const xs_dict *msg)
 29 
 30     {
 31         xs_list *p = attach;
 32-        xs_dict *v;
 33+        const xs_dict *v;
 34 
 35         xs *matt = xs_list_new();
 36 
 37@@ -898,7 +898,7 @@ xs_dict *mastoapi_status(snac *snac, const xs_dict *msg)
 38             tag_list = xs_list_new();
 39 
 40         tag = tag_list;
 41-        xs_dict *v;
 42+        const xs_dict *v;
 43 
 44         int c = 0;
 45         while (xs_list_next(tag, &v, &c)) {
 46@@ -1210,8 +1210,8 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
 47             const xs_dict *metadata = xs_dict_get(snac1.config, "metadata");
 48             if (xs_type(metadata) == XSTYPE_DICT) {
 49                 xs *fields = xs_list_new();
 50-                xs_str *k;
 51-                xs_str *v;
 52+                const xs_str *k;
 53+                const xs_str *v;
 54 
 55                 xs_dict *val_links = snac1.links;
 56                 if (xs_is_null(val_links))
 57@@ -1334,7 +1334,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
 58                     xs *wers = follower_list(&snac1);
 59                     xs *ulst = user_list();
 60                     xs_list *p;
 61-                    xs_str *v;
 62+                    const xs_str *v;
 63                     xs_set seen;
 64 
 65                     xs_set_init(&seen);
 66@@ -1410,7 +1410,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
 67                     /* the public list of posts of a user */
 68                     xs *timeline = timeline_simple_list(&snac2, "public", 0, 256);
 69                     xs_list *p   = timeline;
 70-                    xs_str *v;
 71+                    const xs_str *v;
 72 
 73                     out = xs_list_new();
 74 
 75@@ -1475,7 +1475,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
 76 
 77             xs *out      = xs_list_new();
 78             xs_list *p   = timeline;
 79-            xs_str *v;
 80+            const xs_str *v;
 81 
 82             while (xs_list_iter(&p, &v) && cnt < limit) {
 83                 xs *msg = NULL;
 84@@ -1579,7 +1579,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
 85         xs *timeline = timeline_instance_list(0, limit);
 86         xs *out      = xs_list_new();
 87         xs_list *p   = timeline;
 88-        xs_str *md5;
 89+        const xs_str *md5;
 90 
 91         snac *user = NULL;
 92         if (logged_in)
 93@@ -1633,7 +1633,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
 94         xs *timeline = tag_search(tag, 0, limit);
 95         xs *out      = xs_list_new();
 96         xs_list *p   = timeline;
 97-        xs_str *md5;
 98+        const xs_str *md5;
 99 
100         while (xs_list_iter(&p, &md5) && cnt < limit) {
101             xs *msg = NULL;
102@@ -1673,7 +1673,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
103             xs *timeline = list_timeline(&snac1, list, 0, 2048);
104             xs *out      = xs_list_new();
105             int c = 0;
106-            char *md5;
107+            const char *md5;
108 
109             while (xs_list_next(timeline, &md5, &c)) {
110                 xs *msg = NULL;
111@@ -1747,7 +1747,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
112             xs *l      = notify_list(&snac1, 0, 64);
113             xs *out    = xs_list_new();
114             xs_list *p = l;
115-            xs_dict *v;
116+            const xs_dict *v;
117             const xs_list *excl = xs_dict_get(args, "exclude_types[]");
118 
119             while (xs_list_iter(&p, &v)) {
120@@ -1858,7 +1858,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
121             xs *lol = list_maint(&snac1, NULL, 0);
122             xs *l   = xs_list_new();
123             int c = 0;
124-            xs_list *li;
125+            const xs_list *li;
126 
127             while (xs_list_next(lol, &li, &c)) {
128                 xs *d = xs_dict_new();
129@@ -1890,7 +1890,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
130                         xs *actors = list_content(&snac1, p, NULL, 0);
131                         xs *out = xs_list_new();
132                         int c = 0;
133-                        char *v;
134+                        const char *v;
135 
136                         while (xs_list_next(actors, &v, &c)) {
137                             xs *actor = NULL;
138@@ -1911,7 +1911,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
139                     xs *out = xs_list_new();
140                     xs *lol = list_maint(&snac1, NULL, 0);
141                     int c = 0;
142-                    xs_list *v;
143+                    const xs_list *v;
144 
145                     while (xs_list_next(lol, &v, &c)) {
146                         const char *id = xs_list_get(v, 0);
147@@ -2105,7 +2105,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
148                         xs *anc = xs_list_new();
149                         xs *des = xs_list_new();
150                         xs_list *p;
151-                        xs_str *v;
152+                        const xs_str *v;
153                         char pid[64];
154 
155                         /* build the [grand]parent list, moving up */
156@@ -2159,7 +2159,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
157                             l = object_likes(xs_dict_get(msg, "id"));
158 
159                         xs_list *p = l;
160-                        xs_str *v;
161+                        const xs_str *v;
162 
163                         while (xs_list_iter(&p, &v)) {
164                             xs *actor2 = NULL;
165@@ -2267,7 +2267,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
166                         int cnt = 40;
167                         xs *tl = content_search(&snac1, q, 1, 0, cnt, 0, &to);
168                         int c = 0;
169-                        char *v;
170+                        const char *v;
171 
172                         while (xs_list_next(tl, &v, &c) && --cnt) {
173                             xs *post = NULL;
174@@ -2433,7 +2433,7 @@ int mastoapi_post_handler(const xs_dict *req, const char *q_path,
175                 }
176 
177                 xs_list *p = mi;
178-                xs_str *v;
179+                const xs_str *v;
180 
181                 while (xs_list_iter(&p, &v)) {
182                     xs *l    = xs_list_new();
183@@ -2783,7 +2783,7 @@ int mastoapi_post_handler(const xs_dict *req, const char *q_path,
184                             choices = xs_dict_get(args, "choices");
185 
186                         if (xs_type(choices) == XSTYPE_LIST) {
187-                            xs_str *v;
188+                            const xs_str *v;
189 
190                             int c = 0;
191                             while (xs_list_next(choices, &v, &c)) {
192@@ -2855,7 +2855,7 @@ int mastoapi_post_handler(const xs_dict *req, const char *q_path,
193                 if (strcmp(op, "accounts") == 0) {
194                     const xs_list *accts = xs_dict_get(args, "account_ids[]");
195                     int c = 0;
196-                    char *v;
197+                    const char *v;
198 
199                     while (xs_list_next(accts, &v, &c)) {
200                         list_content(&snac, id, v, 1);
201@@ -2934,7 +2934,7 @@ int mastoapi_delete_handler(const xs_dict *req, const char *q_path,
202                     p = xs_list_get(l, -2);
203                     const xs_list *accts = xs_dict_get(args, "account_ids[]");
204                     int c = 0;
205-                    char *v;
206+                    const char *v;
207 
208                     while (xs_list_next(accts, &v, &c)) {
209                         list_content(&snac, p, v, 2);
210@@ -3083,7 +3083,7 @@ void mastoapi_purge(void)
211     xs *spec   = xs_fmt("%s/app/" "*.json", srv_basedir);
212     xs *files  = xs_glob(spec, 1, 0);
213     xs_list *p = files;
214-    xs_str *v;
215+    const xs_str *v;
216 
217     time_t mt = time(NULL) - 3600;
218 
+24, -13
  1@@ -43,7 +43,8 @@ int snac_upgrade(xs_str **error)
  2         else
  3         if (f < 2.2) {
  4             xs *users = user_list();
  5-            char *p, *v;
  6+            char *p;
  7+            const char *v;
  8 
  9             p = users;
 10             while (xs_list_iter(&p, &v)) {
 11@@ -52,7 +53,8 @@ int snac_upgrade(xs_str **error)
 12                 if (user_open(&snac, v)) {
 13                     xs *spec = xs_fmt("%s/actors/" "*.json", snac.basedir);
 14                     xs *list = xs_glob(spec, 0, 0);
 15-                    char *g, *fn;
 16+                    char *g;
 17+                    const char *fn;
 18 
 19                     g = list;
 20                     while (xs_list_iter(&g, &fn)) {
 21@@ -77,14 +79,16 @@ int snac_upgrade(xs_str **error)
 22         else
 23         if (f < 2.3) {
 24             xs *users = user_list();
 25-            char *p, *v;
 26+            char *p;
 27+            const char *v;
 28 
 29             p = users;
 30             while (xs_list_iter(&p, &v)) {
 31                 snac snac;
 32 
 33                 if (user_open(&snac, v)) {
 34-                    char *p, *v;
 35+                    char *p;
 36+                    const char *v;
 37                     xs *dir = xs_fmt("%s/hidden", snac.basedir);
 38 
 39                     /* create the hidden directory */
 40@@ -109,7 +113,8 @@ int snac_upgrade(xs_str **error)
 41         else
 42         if (f < 2.4) {
 43             xs *users = user_list();
 44-            char *p, *v;
 45+            char *p;
 46+            const char *v;
 47 
 48             p = users;
 49             while (xs_list_iter(&p, &v)) {
 50@@ -132,7 +137,8 @@ int snac_upgrade(xs_str **error)
 51         if (f < 2.5) {
 52             /* upgrade followers */
 53             xs *users = user_list();
 54-            char *p, *v;
 55+            char *p;
 56+            const char *v;
 57 
 58             p = users;
 59             while (xs_list_iter(&p, &v)) {
 60@@ -141,7 +147,8 @@ int snac_upgrade(xs_str **error)
 61                 if (user_open(&snac, v)) {
 62                     xs *spec = xs_fmt("%s/followers/" "*.json", snac.basedir);
 63                     xs *dir  = xs_glob(spec, 0, 0);
 64-                    char *p, *v;
 65+                    char *p;
 66+                    const char *v;
 67 
 68                     p = dir;
 69                     while (xs_list_iter(&p, &v)) {
 70@@ -175,7 +182,8 @@ int snac_upgrade(xs_str **error)
 71         if (f < 2.6) {
 72             /* upgrade local/ to public/ */
 73             xs *users = user_list();
 74-            char *p, *v;
 75+            char *p;
 76+            const char *v;
 77 
 78             p = users;
 79             while (xs_list_iter(&p, &v)) {
 80@@ -184,7 +192,8 @@ int snac_upgrade(xs_str **error)
 81                 if (user_open(&snac, v)) {
 82                     xs *spec = xs_fmt("%s/local/" "*.json", snac.basedir);
 83                     xs *dir  = xs_glob(spec, 0, 0);
 84-                    char *p, *v;
 85+                    char *p;
 86+                    const char *v;
 87 
 88                     p = dir;
 89                     while (xs_list_iter(&p, &v)) {
 90@@ -206,7 +215,7 @@ int snac_upgrade(xs_str **error)
 91                             /* if it's from us, add to public */
 92                             if (xs_startswith(id, snac.actor)) {
 93                                 const xs_list *p;
 94-                                char *v;
 95+                                const char *v;
 96                                 int c;
 97 
 98                                 object_user_cache_add(&snac, id, "public");
 99@@ -241,7 +250,8 @@ int snac_upgrade(xs_str **error)
100         if (f < 2.7) {
101             /* upgrade timeline/ to private/ */
102             xs *users = user_list();
103-            char *p, *v;
104+            char *p;
105+            const char *v;
106 
107             p = users;
108             while (xs_list_iter(&p, &v)) {
109@@ -250,7 +260,8 @@ int snac_upgrade(xs_str **error)
110                 if (user_open(&snac, v)) {
111                     xs *spec = xs_fmt("%s/timeline/" "*.json", snac.basedir);
112                     xs *dir  = xs_glob(spec, 0, 0);
113-                    char *p, *v;
114+                    char *p;
115+                    const char *v;
116 
117                     p = dir;
118                     while (xs_list_iter(&p, &v)) {
119@@ -271,7 +282,7 @@ int snac_upgrade(xs_str **error)
120 
121                             {
122                                 const xs_list *p;
123-                                char *v;
124+                                const char *v;
125                                 int c = 0;
126 
127                                 object_user_cache_add(&snac, id, "private");
+5, -5
 1@@ -358,7 +358,7 @@ void rm_rf(const char *dir)
 2     xs *d = xs_str_cat(xs_dup(dir), "/" "*");
 3     xs *l = xs_glob(d, 0, 0);
 4     xs_list *p = l;
 5-    xs_str *v;
 6+    const xs_str *v;
 7 
 8     if (dbglevel >= 1)
 9         printf("Deleting directory %s\n", dir);
10@@ -393,7 +393,7 @@ int deluser(snac *user)
11     int ret = 0;
12     xs *fwers = following_list(user);
13     xs_list *p = fwers;
14-    xs_str *v;
15+    const xs_str *v;
16 
17     while (xs_list_iter(&p, &v)) {
18         xs *object = NULL;
19@@ -419,7 +419,7 @@ void verify_links(snac *user)
20 /* verifies a user's links */
21 {
22     const xs_dict *p = xs_dict_get(user->config, "metadata");
23-    char *k, *v;
24+    const char *k, *v;
25     int changed = 0;
26 
27     xs *headers = xs_dict_new();
28@@ -449,7 +449,7 @@ void verify_links(snac *user)
29         xs *ls = xs_regex_select(payload, "< *(a|link) +[^>]+>");
30 
31         xs_list *lp = ls;
32-        char *ll;
33+        const char *ll;
34         int vfied = 0;
35 
36         while (!vfied && xs_list_iter(&lp, &ll)) {
37@@ -463,7 +463,7 @@ void verify_links(snac *user)
38             xs *href = NULL;
39             int is_rel_me = 0;
40             xs_list *pr = r;
41-            char *ar;
42+            const char *ar;
43 
44             while (xs_list_iter(&pr, &ar)) {
45                 xs *nq = xs_dup(ar);
+1, -1
1@@ -96,7 +96,7 @@ int webfinger_request_signed(snac *snac, const char *qs, char **actor, char **us
2         if (actor != NULL) {
3             const xs_list *list = xs_dict_get(obj, "links");
4             int c = 0;
5-            char *v;
6+            const char *v;
7 
8             while (xs_list_next(list, &v, &c)) {
9                 if (xs_type(v) == XSTYPE_DICT) {
M xs.h
+17, -17
  1@@ -94,8 +94,8 @@ xs_list *xs_list_new(void);
  2 xs_list *xs_list_append_m(xs_list *list, const char *mem, int dsz);
  3 xs_list *_xs_list_append(xs_list *list, const xs_val *vals[]);
  4 #define xs_list_append(list, ...) _xs_list_append(list, (const xs_val *[]){ __VA_ARGS__, NULL })
  5-int xs_list_iter(xs_list **list, xs_val **value);
  6-int xs_list_next(const xs_list *list, xs_val **value, int *ctxt);
  7+int xs_list_iter(xs_list **list, const xs_val **value);
  8+int xs_list_next(const xs_list *list, const xs_val **value, int *ctxt);
  9 int xs_list_len(const xs_list *list);
 10 const xs_val *xs_list_get(const xs_list *list, int num);
 11 xs_list *xs_list_del(xs_list *list, int num);
 12@@ -118,7 +118,7 @@ xs_keyval *xs_keyval_make(xs_keyval *keyval, const xs_str *key, const xs_val *va
 13 xs_dict *xs_dict_new(void);
 14 xs_dict *xs_dict_append(xs_dict *dict, const xs_str *key, const xs_val *value);
 15 xs_dict *xs_dict_prepend(xs_dict *dict, const xs_str *key, const xs_val *value);
 16-int xs_dict_next(const xs_dict *dict, xs_str **key, xs_val **value, int *ctxt);
 17+int xs_dict_next(const xs_dict *dict, const xs_str **key, const xs_val **value, int *ctxt);
 18 const xs_val *xs_dict_get_def(const xs_dict *dict, const xs_str *key, const xs_val *def);
 19 #define xs_dict_get(dict, key) xs_dict_get_def(dict, key, NULL)
 20 xs_dict *xs_dict_del(xs_dict *dict, const xs_str *key);
 21@@ -726,7 +726,7 @@ xs_list *_xs_list_append(xs_list *list, const xs_val *vals[])
 22 }
 23 
 24 
 25-int xs_list_iter(xs_list **list, xs_val **value)
 26+int xs_list_iter(xs_list **list, const xs_val **value)
 27 /* iterates a list value */
 28 {
 29     int goon = 1;
 30@@ -757,7 +757,7 @@ int xs_list_iter(xs_list **list, xs_val **value)
 31 }
 32 
 33 
 34-int xs_list_next(const xs_list *list, xs_val **value, int *ctxt)
 35+int xs_list_next(const xs_list *list, const xs_val **value, int *ctxt)
 36 /* iterates a list, with context */
 37 {
 38     if (xs_type(list) != XSTYPE_LIST)
 39@@ -765,7 +765,7 @@ int xs_list_next(const xs_list *list, xs_val **value, int *ctxt)
 40 
 41     int goon = 1;
 42 
 43-    char *p = (char *)list;
 44+    const char *p = list;
 45 
 46     /* skip the start of the list */
 47     if (*ctxt == 0)
 48@@ -800,7 +800,7 @@ int xs_list_len(const xs_list *list)
 49 
 50     int c = 0;
 51     xs_list *p = (xs_list *)list;
 52-    xs_val *v;
 53+    const xs_val *v;
 54 
 55     while (xs_list_iter(&p, &v))
 56         c++;
 57@@ -819,7 +819,7 @@ const xs_val *xs_list_get(const xs_list *list, int num)
 58 
 59     int c = 0;
 60     xs_list *p = (xs_list *)list;
 61-    xs_val *v;
 62+    const xs_val *v;
 63 
 64     while (xs_list_iter(&p, &v)) {
 65         if (c == num)
 66@@ -881,7 +881,7 @@ xs_list *xs_list_dequeue(xs_list *list, xs_val **data, int last)
 67     XS_ASSERT_TYPE(list, XSTYPE_LIST);
 68 
 69     xs_list *p = list;
 70-    xs_val *v  = NULL;
 71+    const xs_val *v = NULL;
 72 
 73     if (!last) {
 74         /* get the first */
 75@@ -910,7 +910,7 @@ int xs_list_in(const xs_list *list, const xs_val *val)
 76 
 77     int n = 0;
 78     xs_list *p = (xs_list *)list;
 79-    xs_val *v;
 80+    const xs_val *v;
 81     int sz = xs_size(val);
 82 
 83     while (xs_list_iter(&p, &v)) {
 84@@ -931,7 +931,7 @@ xs_str *xs_join(const xs_list *list, const char *sep)
 85 
 86     xs_str *s = NULL;
 87     xs_list *p = (xs_list *)list;
 88-    xs_val *v;
 89+    const xs_val *v;
 90     int c = 0;
 91     int offset = 0;
 92     int ssz = strlen(sep);
 93@@ -1087,7 +1087,7 @@ xs_dict *xs_dict_prepend(xs_dict *dict, const xs_str *key, const xs_val *value)
 94 }
 95 
 96 
 97-int xs_dict_next(const xs_dict *dict, xs_str **key, xs_val **value, int *ctxt)
 98+int xs_dict_next(const xs_dict *dict, const xs_str **key, const xs_val **value, int *ctxt)
 99 /* iterates a dict, with context */
100 {
101     if (xs_type(dict) != XSTYPE_DICT)
102@@ -1131,8 +1131,8 @@ const xs_val *xs_dict_get_def(const xs_dict *dict, const xs_str *key, const xs_v
103     XS_ASSERT_TYPE(dict, XSTYPE_DICT);
104     XS_ASSERT_TYPE(key, XSTYPE_STRING);
105 
106-    xs_str *k;
107-    xs_val *v;
108+    const xs_str *k;
109+    const xs_val *v;
110     int c = 0;
111 
112     while (xs_dict_next(dict, &k, &v, &c)) {
113@@ -1150,14 +1150,14 @@ xs_dict *xs_dict_del(xs_dict *dict, const xs_str *key)
114     XS_ASSERT_TYPE(dict, XSTYPE_DICT);
115     XS_ASSERT_TYPE(key, XSTYPE_STRING);
116 
117-    xs_str *k;
118-    xs_val *v;
119+    const xs_str *k;
120+    const xs_val *v;
121     int c = 0;
122 
123     while (xs_dict_next(dict, &k, &v, &c)) {
124         if (strcmp(k, key) == 0) {
125             /* the address of the item is just behind the key */
126-            char *i = k - 1;
127+            char *i = (char *)k - 1;
128 
129             dict = xs_collapse(dict, i - dict, xs_size(i));
130             break;
+2, -2
 1@@ -93,8 +93,8 @@ xs_dict *xs_http_request(const char *method, const char *url,
 2     xs_dict *response;
 3     CURL *curl;
 4     struct curl_slist *list = NULL;
 5-    xs_str *k;
 6-    xs_val *v;
 7+    const xs_str *k;
 8+    const xs_val *v;
 9     long lstatus = 0;
10     struct _payload_data pd;
11 
+2, -2
 1@@ -293,8 +293,8 @@ void xs_fcgi_response(FILE *f, int status, xs_dict *headers, xs_str *body, int b
 2     struct fcgi_record_header hdr = {0};
 3     struct fcgi_end_request ereq = {0};
 4     xs *out = xs_str_new(NULL);
 5-    xs_str *k;
 6-    xs_str *v;
 7+    const xs_str *k;
 8+    const xs_str *v;
 9 
10     /* no previous id? it's an error */
11     if (fcgi_id == -1)
+2, -2
 1@@ -99,8 +99,8 @@ void xs_httpd_response(FILE *f, int status, xs_dict *headers, xs_str *body, int
 2 /* sends an httpd response */
 3 {
 4     xs *proto;
 5-    xs_str *k;
 6-    xs_val *v;
 7+    const xs_str *k;
 8+    const xs_val *v;
 9 
10     proto = xs_fmt("HTTP/1.1 %d %s", status, status / 100 == 2 ? "OK" : "ERROR");
11     fprintf(f, "%s\r\n", proto);
+2, -2
 1@@ -76,7 +76,7 @@ static void _xs_json_dump(const xs_val *data, int level, int indent, FILE *f)
 2 {
 3     int c = 0;
 4     int ct = 0;
 5-    xs_val *v;
 6+    const xs_val *v;
 7 
 8     switch (xs_type(data)) {
 9     case XSTYPE_NULL:
10@@ -116,7 +116,7 @@ static void _xs_json_dump(const xs_val *data, int level, int indent, FILE *f)
11     case XSTYPE_DICT:
12         fputc('{', f);
13 
14-        xs_str *k;
15+        const xs_str *k;
16 
17         while (xs_dict_next(data, &k, &v, &ct)) {
18             if (c != 0)
+2, -2
 1@@ -64,7 +64,7 @@ xs_list *xs_regex_select_n(const char *str, const char *rx, int count)
 2 {
 3     xs_list *list = xs_list_new();
 4     xs *split = NULL;
 5-    xs_val *v;
 6+    const xs_val *v;
 7     int n = 0;
 8     int c = 0;
 9 
10@@ -89,7 +89,7 @@ xs_list *xs_regex_replace_in(xs_str *str, const char *rx, const char *rep, int c
11 {
12     xs_str *s = xs_str_new(NULL);
13     xs *split = xs_regex_split_n(str, rx, count);
14-    xs_val *v;
15+    const xs_val *v;
16     int n = 0;
17     int c = 0;
18     int pholder = !!strchr(rep, '&');
+2, -1
 1@@ -85,7 +85,8 @@ int xs_set_add(xs_set *s, const xs_val *data)
 2 {
 3     /* is it 'full'? */
 4     if (s->used >= s->elems / 2) {
 5-        char *p, *v;
 6+        char *p;
 7+        const xs_val *v;
 8 
 9         /* expand! */
10         s->elems *= 2;
+1, -1
1@@ -52,7 +52,7 @@ xs_dict *xs_url_vars(const char *str)
2         xs *args = xs_split(str, "&");
3 
4         xs_list *l;
5-        xs_val *v;
6+        const xs_val *v;
7 
8         l = args;
9         while (xs_list_iter(&l, &v)) {
+1, -1
1@@ -1 +1 @@
2-/* 34850dcdec50b669a2c0bbe9f16f6d9c4b16eafd 2024-05-21T14:06:02+02:00 */
3+/* 65265483c102909393287bfb173d1a7ae9c3be00 2024-05-23T09:57:20+02:00 */