]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: client-connection-http - Change implementation of camel-case encoding
authorStephan Bosch <stephan.bosch@dovecot.fi>
Mon, 16 Oct 2017 23:34:38 +0000 (01:34 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Sat, 18 Nov 2023 18:58:04 +0000 (18:58 +0000)
Makes it return a c-string, rather than modifying a string_t buffer.

src/doveadm/client-connection-http.c

index a812582d6a3d61d3f0d7d76e3bdf7b7560a92ebf..5bd914643eaa9713943fd24ff69385d74778b565 100644 (file)
@@ -770,20 +770,33 @@ doveadm_http_server_read_request_v1(struct client_request_http *req)
        doveadm_http_server_send_response(req);
 }
 
-static void doveadm_http_server_camelcase_value(string_t *value)
+static const char *
+doveadm_http_server_camelcase_value(string_t *tmp, const char *value)
 {
-       size_t i, k;
-       char *ptr = str_c_modifiable(value);
-
-       for (i = 0, k = 0; i < strlen(ptr);) {
-               if (ptr[i] == ' ' || ptr[i] == '-') {
-                       i++;
-                       ptr[k++] = i_toupper(ptr[i++]);
+       const char *p, *poffset;
+
+       str_truncate(tmp, 0);
+
+       poffset = p = value;
+       while (*p != '\0') {
+               if (*p == ' ' || *p == '-') {
+                       if (p > poffset)
+                               str_append_data(tmp, poffset, p - poffset);
+                       do {
+                               p++;
+                       } while (*p == ' ' || *p == '-');
+                       if (*p == '\0')
+                               break;
+                       str_append_c(tmp, i_toupper(*p));
+                       p++;
+                       poffset = p;
                } else {
-                       ptr[k++] = ptr[i++];
+                       p++;
                }
        }
-       str_truncate(value, k);
+       if (p > poffset)
+               str_append_data(tmp, poffset, p - poffset);
+       return str_c(tmp);
 }
 
 static void doveadm_http_server_send_api_v1(struct client_request_http *req)
@@ -792,10 +805,11 @@ static void doveadm_http_server_send_api_v1(struct client_request_http *req)
        const struct doveadm_cmd_ver2 *cmd;
        const struct doveadm_cmd_param *par;
        unsigned int i, k;
-       string_t *tmp;
+       string_t *tmp, *cctmp;
        bool sent, first_cmd = TRUE;
 
        tmp = str_new(req->pool, 8);
+       cctmp = t_str_new(64);
 
        o_stream_nsend_str(output,"[\n");
        for (i = 0; i < array_count(&doveadm_cmds_ver2); i++) {
@@ -807,8 +821,8 @@ static void doveadm_http_server_send_api_v1(struct client_request_http *req)
                else
                        o_stream_nsend_str(output, ",\n");
                o_stream_nsend_str(output, "\t{\"command\":\"");
-               json_append_escaped(tmp, cmd->name);
-               doveadm_http_server_camelcase_value(tmp);
+               json_append_escaped(tmp,
+                       doveadm_http_server_camelcase_value(cctmp, cmd->name));
                o_stream_nsend_str(output, str_c(tmp));
                o_stream_nsend_str(output, "\", \"parameters\":[");
 
@@ -824,8 +838,9 @@ static void doveadm_http_server_send_api_v1(struct client_request_http *req)
                                o_stream_nsend_str(output, "\n");
                        sent = TRUE;
                        o_stream_nsend_str(output, "\t\t{\"name\":\"");
-                       json_append_escaped(tmp, par->name);
-                       doveadm_http_server_camelcase_value(tmp);
+                       json_append_escaped(tmp,
+                               doveadm_http_server_camelcase_value(cctmp,
+                                                                   par->name));
                        o_stream_nsend_str(output, str_c(tmp));
                        o_stream_nsend_str(output, "\",\"type\":\"");
                        switch(par->type) {