Sat, 22 Nov 2025 16:44:42 +0100
add simple string template function
|
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> |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
33 | #include <ctype.h> |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
34 | |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
35 | #include <cx/buffer.h> |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
36 | |
|
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 | StringTemplate* string_template_compile(const CxAllocator *a, cxstring tpl) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
40 | StringTemplateSegment *end = NULL; // segment list end |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
41 | int var = FALSE; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
42 | int error = FALSE; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
43 | |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
44 | CxBuffer buf; // tmp buffer |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
45 | if(cxBufferInit(&buf, NULL, 128, NULL, CX_BUFFER_AUTO_EXTEND|CX_BUFFER_FREE_CONTENTS)) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
46 | return NULL; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
47 | } |
|
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 | StringTemplate *t = cxMalloc(a, sizeof(StringTemplate)); |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
50 | if(!t) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
51 | cxBufferDestroy(&buf); |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
52 | return NULL; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
53 | } |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
54 | t->a = a ? a : cxDefaultAllocator; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
55 | t->segments = NULL; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
56 | |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
57 | StringTemplateSegment *seg = NULL; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
58 | |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
59 | for(size_t i=0;i<tpl.length;i++) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
60 | char c = tpl.ptr[i]; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
61 | int add_char = FALSE; // add current char to the buffer |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
62 | int finish_seg = FALSE; // copy buffer to segment string and start new segment |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
63 | |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
64 | if(!seg) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
65 | // start new segment |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
66 | seg = cxMalloc(a, sizeof(StringTemplateSegment)); |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
67 | if(seg) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
68 | 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
|
69 | seg->str = (cxmutstr){NULL, 0}; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
70 | seg->num = 0; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
71 | seg->next = NULL; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
72 | // add segment to segment list |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
73 | if(end) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
74 | end->next = seg; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
75 | } else { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
76 | t->segments = seg; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
77 | } |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
78 | end = seg; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
79 | } else { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
80 | error = TRUE; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
81 | break; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
82 | } |
|
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 | if(var) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
86 | // current segment is a var |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
87 | if(c == '}') { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
88 | var = FALSE; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
89 | finish_seg = TRUE; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
90 | } else if(c == '{') { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
91 | // noop |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
92 | } else if(!isalnum(c)) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
93 | var = FALSE; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
94 | finish_seg = TRUE; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
95 | i--; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
96 | } else { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
97 | add_char = TRUE; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
98 | } |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
99 | } else { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
100 | if(c == '$') { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
101 | if(i+1<tpl.length && tpl.ptr[i+1] == '$') { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
102 | // $$ -> $ |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
103 | i++; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
104 | add_char = TRUE; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
105 | } else { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
106 | var = TRUE; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
107 | if(buf.pos == 0) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
108 | // reuse current segment |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
109 | seg->type = STRING_SEGMENT_VAR_PLACEHOLDER; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
110 | } else { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
111 | // create new segment |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
112 | finish_seg = TRUE; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
113 | } |
|
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 | } else { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
116 | add_char = TRUE; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
117 | } |
|
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 | if(add_char) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
121 | if(cxBufferPut(&buf, c) != c) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
122 | error = TRUE; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
123 | break; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
124 | } |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
125 | } else if(finish_seg) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
126 | // copy buffer content |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
127 | 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
|
128 | if(!seg_str.ptr) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
129 | error = TRUE; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
130 | break; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
131 | } |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
132 | seg->str = seg_str; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
133 | if(seg->type == STRING_SEGMENT_VAR_PLACEHOLDER) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
134 | // is the var segment an integer reference? |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
135 | if(!cx_strtoi(seg_str, &seg->num, 10)) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
136 | seg->type = STRING_SEGMENT_NUM_PLACEHOLDER; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
137 | } |
|
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 | buf.pos = 0; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
140 | seg = NULL; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
141 | } |
|
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 | // finish last segment |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
145 | if(seg) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
146 | 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
|
147 | if(!seg_str.ptr) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
148 | error = TRUE; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
149 | } else { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
150 | seg->str = seg_str; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
151 | if(seg->type == STRING_SEGMENT_VAR_PLACEHOLDER) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
152 | if(!cx_strtoi(seg_str, &seg->num, 10)) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
153 | seg->type = STRING_SEGMENT_NUM_PLACEHOLDER; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
154 | } |
|
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 | cxBufferDestroy(&buf); |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
160 | if(error) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
161 | string_template_free(t); |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
162 | return NULL; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
163 | } |
|
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 | return t; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
166 | } |
|
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 | void string_template_free(StringTemplate *tpl) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
169 | StringTemplateSegment *seg = tpl->segments; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
170 | while(seg) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
171 | StringTemplateSegment *next = seg->next; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
172 | cxFree(tpl->a, seg->str.ptr); |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
173 | cxFree(tpl->a, seg); |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
174 | seg = next; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
175 | } |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
176 | cxFree(tpl->a, tpl); |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
177 | } |
|
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 | 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
|
180 | if(!tpl) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
181 | return -1; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
182 | } |
|
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 | // write each segment to the stream |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
185 | StringTemplateSegment *seg = tpl->segments; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
186 | ssize_t w = 0; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
187 | while(seg) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
188 | if(seg->type == STRING_SEGMENT_STR) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
189 | // just write the segment string |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
190 | if(seg->str.length > 0) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
191 | 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
|
192 | if(r != seg->str.length) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
193 | return -1; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
194 | } |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
195 | w += r; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
196 | } |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
197 | } else if(varfunc) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
198 | // convert var segment to value |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
199 | WSBool free_str = FALSE; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
200 | cxmutstr str = varfunc(a, seg, userdata, &free_str); |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
201 | if(str.length > 0) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
202 | 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
|
203 | if(r != str.length) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
204 | return -1; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
205 | } |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
206 | w += r; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
207 | } |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
208 | if(free_str) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
209 | cxFree(a, str.ptr); |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
210 | } |
|
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 | seg = seg->next; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
213 | } |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
214 | return w; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
215 | } |
|
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 | 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
|
218 | CxBuffer buf; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
219 | cxBufferInit(&buf, NULL, 1024, a, CX_BUFFER_AUTO_EXTEND|CX_BUFFER_FREE_CONTENTS); |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
220 | |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
221 | 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
|
222 | if(w < 0 || cxBufferTerminate(&buf)) { |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
223 | cxBufferDestroy(&buf); |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
224 | return (cxmutstr){ NULL, 0 }; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
225 | } |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
226 | return (cxmutstr){ buf.space, buf.size }; |
|
9728d3a2ac97
add simple string template function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
227 | } |