src/server/util/strreplace.c

Tue, 03 Feb 2026 19:09:53 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Tue, 03 Feb 2026 19:09:53 +0100
changeset 661
a4e1ba59b733
parent 660
f00d03835dd9
permissions
-rw-r--r--

use bool instead of WSBool in strreplace

634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2025 Olaf Wintermann. All rights reserved.
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include "strreplace.h"
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #include <string.h>
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 #include <stdlib.h>
661
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
33 #include <unistd.h>
634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34 #include <ctype.h>
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 #include <cx/buffer.h>
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 StringTemplate* string_template_compile(const CxAllocator *a, cxstring tpl) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 StringTemplateSegment *end = NULL; // segment list end
661
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
42 int var = false;
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
43 int error = false;
634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 CxBuffer buf; // tmp buffer
660
f00d03835dd9 update ucx to version 4.0
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 634
diff changeset
46 if(cxBufferInit(&buf, NULL, NULL, 128, CX_BUFFER_AUTO_EXTEND|CX_BUFFER_FREE_CONTENTS)) {
634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 return NULL;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 StringTemplate *t = cxMalloc(a, sizeof(StringTemplate));
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 if(!t) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 cxBufferDestroy(&buf);
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 return NULL;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 t->a = a ? a : cxDefaultAllocator;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56 t->segments = NULL;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58 StringTemplateSegment *seg = NULL;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60 for(size_t i=0;i<tpl.length;i++) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61 char c = tpl.ptr[i];
661
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
62 int add_char = false; // add current char to the buffer
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
63 int finish_seg = false; // copy buffer to segment string and start new segment
634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 if(!seg) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66 // start new segment
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67 seg = cxMalloc(a, sizeof(StringTemplateSegment));
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68 if(seg) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69 seg->type = var ? STRING_SEGMENT_VAR_PLACEHOLDER : STRING_SEGMENT_STR;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 seg->str = (cxmutstr){NULL, 0};
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 seg->num = 0;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72 seg->next = NULL;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 // add segment to segment list
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 if(end) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 end->next = seg;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 } else {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 t->segments = seg;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 end = seg;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 } else {
661
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
81 error = true;
634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 break;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86 if(var) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87 // current segment is a var
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
88 if(c == '}') {
661
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
89 var = false;
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
90 finish_seg = true;
634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 } else if(c == '{') {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 // noop
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93 } else if(!isalnum(c)) {
661
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
94 var = false;
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
95 finish_seg = true;
634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96 i--;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97 } else {
661
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
98 add_char = true;
634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 } else {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 if(c == '$') {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 if(i+1<tpl.length && tpl.ptr[i+1] == '$') {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 // $$ -> $
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 i++;
661
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
105 add_char = true;
634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 } else {
661
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
107 var = true;
634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108 if(buf.pos == 0) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109 // reuse current segment
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110 seg->type = STRING_SEGMENT_VAR_PLACEHOLDER;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 } else {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112 // create new segment
661
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
113 finish_seg = true;
634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
115 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
116 } else {
661
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
117 add_char = true;
634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
118 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
119 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
120
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
121 if(add_char) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
122 if(cxBufferPut(&buf, c) != c) {
661
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
123 error = true;
634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124 break;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
125 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
126 } else if(finish_seg) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
127 // copy buffer content
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
128 cxmutstr seg_str = cx_strdup_a(a, cx_strn(buf.space, buf.pos));
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129 if(!seg_str.ptr) {
661
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
130 error = true;
634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
131 break;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
132 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
133 seg->str = seg_str;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
134 if(seg->type == STRING_SEGMENT_VAR_PLACEHOLDER) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
135 // is the var segment an integer reference?
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
136 if(!cx_strtoi(seg_str, &seg->num, 10)) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
137 seg->type = STRING_SEGMENT_NUM_PLACEHOLDER;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
138 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
139 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
140 buf.pos = 0;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
141 seg = NULL;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
142 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
143 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
144
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
145 // finish last segment
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
146 if(seg) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
147 cxmutstr seg_str = cx_strdup_a(a, cx_strn(buf.space, buf.pos));
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
148 if(!seg_str.ptr) {
661
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
149 error = true;
634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
150 } else {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
151 seg->str = seg_str;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
152 if(seg->type == STRING_SEGMENT_VAR_PLACEHOLDER) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
153 if(!cx_strtoi(seg_str, &seg->num, 10)) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
154 seg->type = STRING_SEGMENT_NUM_PLACEHOLDER;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
155 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
156 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
157 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
158 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
159
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
160 cxBufferDestroy(&buf);
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
161 if(error) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
162 string_template_free(t);
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
163 return NULL;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
164 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
165
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
166 return t;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
167 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
168
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
169 void string_template_free(StringTemplate *tpl) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
170 StringTemplateSegment *seg = tpl->segments;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
171 while(seg) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
172 StringTemplateSegment *next = seg->next;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
173 cxFree(tpl->a, seg->str.ptr);
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
174 cxFree(tpl->a, seg);
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
175 seg = next;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
176 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
177 cxFree(tpl->a, tpl);
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
178 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
179
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
180 ssize_t string_template_write_to(StringTemplate *tpl, const CxAllocator *a, strtpl_var_func varfunc, void *userdata, void *stream, cx_write_func writef) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
181 if(!tpl) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
182 return -1;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
183 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
184
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
185 // write each segment to the stream
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
186 StringTemplateSegment *seg = tpl->segments;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
187 ssize_t w = 0;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
188 while(seg) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
189 if(seg->type == STRING_SEGMENT_STR) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
190 // just write the segment string
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
191 if(seg->str.length > 0) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
192 size_t r = writef(seg->str.ptr, 1, seg->str.length, stream);
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
193 if(r != seg->str.length) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
194 return -1;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
195 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
196 w += r;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
197 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
198 } else if(varfunc) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
199 // convert var segment to value
661
a4e1ba59b733 use bool instead of WSBool in strreplace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 660
diff changeset
200 bool free_str = false;
634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
201 cxmutstr str = varfunc(a, seg, userdata, &free_str);
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
202 if(str.length > 0) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
203 size_t r = writef(str.ptr, 1, str.length, stream);
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
204 if(r != str.length) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
205 return -1;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
206 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
207 w += r;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
208 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
209 if(free_str) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
210 cxFree(a, str.ptr);
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
211 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
212 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
213 seg = seg->next;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
214 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
215 return w;
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
216 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
217
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
218 cxmutstr string_template_build_string(StringTemplate *tpl, const CxAllocator *a, strtpl_var_func varfunc, void *userdata) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
219 CxBuffer buf;
660
f00d03835dd9 update ucx to version 4.0
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 634
diff changeset
220 cxBufferInit(&buf, a, NULL, 1024, CX_BUFFER_AUTO_EXTEND|CX_BUFFER_FREE_CONTENTS);
634
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
221
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
222 ssize_t w = string_template_write_to(tpl, a, varfunc, userdata, &buf, (cx_write_func)cxBufferWrite);
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
223 if(w < 0 || cxBufferTerminate(&buf)) {
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
224 cxBufferDestroy(&buf);
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
225 return (cxmutstr){ NULL, 0 };
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
226 }
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
227 return (cxmutstr){ buf.space, buf.size };
9728d3a2ac97 add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
228 }

mercurial