Sun, 22 Dec 2024 22:10:04 +0100
don't trust that size_t always has word width
it should be the case on all platforms supported by UCX, but it's not strictly defined in POSIX that it must be the case
576
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1 | /* |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
3 | * |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
4 | * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved. |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
5 | * |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
8 | * |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
11 | * |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
15 | * |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
27 | */ |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
28 | |
ba0c4ff6698e
first proposal for the string header
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
29 | #include "cx/string.h" |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
30 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
31 | #include <string.h> |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
32 | #include <stdarg.h> |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
33 | #include <ctype.h> |
1041
508dc8b32a17
fix missing errno.h include
Mike Becker <universe@uap-core.de>
parents:
1040
diff
changeset
|
34 | #include <errno.h> |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
35 | |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
36 | #ifndef _WIN32 |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
37 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
38 | #include <strings.h> // for strncasecmp() |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
39 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
40 | #endif // _WIN32 |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
41 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
42 | cxmutstr cx_mutstr(char *cstring) { |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
43 | return (cxmutstr) {cstring, strlen(cstring)}; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
44 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
45 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
46 | cxmutstr cx_mutstrn( |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
47 | char *cstring, |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
48 | size_t length |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
49 | ) { |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
50 | return (cxmutstr) {cstring, length}; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
51 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
52 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
53 | cxstring cx_str(const char *cstring) { |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
54 | return (cxstring) {cstring, strlen(cstring)}; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
55 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
56 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
57 | cxstring cx_strn( |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
58 | const char *cstring, |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
59 | size_t length |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
60 | ) { |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
61 | return (cxstring) {cstring, length}; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
62 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
63 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
64 | cxstring cx_strcast(cxmutstr str) { |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
65 | return (cxstring) {str.ptr, str.length}; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
66 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
67 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
68 | void cx_strfree(cxmutstr *str) { |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
962
diff
changeset
|
69 | if (str == NULL) return; |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
70 | free(str->ptr); |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
71 | str->ptr = NULL; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
72 | str->length = 0; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
73 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
74 | |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
75 | void cx_strfree_a( |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
76 | const CxAllocator *alloc, |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
77 | cxmutstr *str |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
78 | ) { |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
962
diff
changeset
|
79 | if (str == NULL) return; |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
80 | cxFree(alloc, str->ptr); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
81 | str->ptr = NULL; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
82 | str->length = 0; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
83 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
84 | |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
85 | size_t cx_strlen( |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
86 | size_t count, |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
87 | ... |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
88 | ) { |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
89 | if (count == 0) return 0; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
90 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
91 | va_list ap; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
92 | va_start(ap, count); |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
93 | size_t size = 0; |
962
cd418898af5c
remove cx_for_n() macro - fixes #467
Mike Becker <universe@uap-core.de>
parents:
926
diff
changeset
|
94 | for (size_t i = 0; i < count; i++) { |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
95 | cxstring str = va_arg(ap, cxstring); |
1040
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
96 | if (size > SIZE_MAX - str.length) errno = EOVERFLOW; |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
97 | size += str.length; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
98 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
99 | va_end(ap); |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
100 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
101 | return size; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
102 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
103 | |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
104 | cxmutstr cx_strcat_ma( |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
105 | const CxAllocator *alloc, |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
106 | cxmutstr str, |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
107 | size_t count, |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
108 | ... |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
109 | ) { |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
110 | if (count == 0) return str; |
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
111 | |
1001
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
112 | cxstring strings_stack[8]; |
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
113 | cxstring *strings; |
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
114 | if (count > 8) { |
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
115 | strings = calloc(count, sizeof(cxstring)); |
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
116 | if (strings == NULL) { |
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
117 | return (cxmutstr) {NULL, 0}; |
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
118 | } |
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
119 | } else { |
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
120 | strings = strings_stack; |
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
121 | } |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
122 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
123 | va_list ap; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
124 | va_start(ap, count); |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
125 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
126 | // get all args and overall length |
1040
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
127 | bool overflow = false; |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
128 | size_t slen = str.length; |
962
cd418898af5c
remove cx_for_n() macro - fixes #467
Mike Becker <universe@uap-core.de>
parents:
926
diff
changeset
|
129 | for (size_t i = 0; i < count; i++) { |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
130 | cxstring s = va_arg (ap, cxstring); |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
131 | strings[i] = s; |
1040
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
132 | if (slen > SIZE_MAX - str.length) overflow = true; |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
133 | slen += s.length; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
134 | } |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
135 | va_end(ap); |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
136 | |
1040
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
137 | // abort in case of overflow |
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
138 | if (overflow) { |
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
139 | errno = EOVERFLOW; |
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
140 | if (strings != strings_stack) { |
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
141 | free(strings); |
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
142 | } |
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
143 | return (cxmutstr) { NULL, 0 }; |
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
144 | } |
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
145 | |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
146 | // reallocate or create new string |
1001
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
147 | char *newstr; |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
148 | if (str.ptr == NULL) { |
1001
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
149 | newstr = cxMalloc(alloc, slen + 1); |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
150 | } else { |
1001
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
151 | newstr = cxRealloc(alloc, str.ptr, slen + 1); |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
152 | } |
1001
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
153 | if (newstr == NULL) { |
1040
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
154 | if (strings != strings_stack) { |
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
155 | free(strings); |
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
156 | } |
1001
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
157 | return (cxmutstr) {NULL, 0}; |
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
158 | } |
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
159 | str.ptr = newstr; |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
160 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
161 | // concatenate strings |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
162 | size_t pos = str.length; |
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
163 | str.length = slen; |
962
cd418898af5c
remove cx_for_n() macro - fixes #467
Mike Becker <universe@uap-core.de>
parents:
926
diff
changeset
|
164 | for (size_t i = 0; i < count; i++) { |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
165 | cxstring s = strings[i]; |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
166 | memcpy(str.ptr + pos, s.ptr, s.length); |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
167 | pos += s.length; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
168 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
169 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
170 | // terminate string |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
171 | str.ptr[str.length] = '\0'; |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
172 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
173 | // free temporary array |
1001
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
174 | if (strings != strings_stack) { |
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
175 | free(strings); |
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
176 | } |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
177 | |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
178 | return str; |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
179 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
180 | |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
181 | cxstring cx_strsubs( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
182 | cxstring string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
183 | size_t start |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
184 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
185 | return cx_strsubsl(string, start, string.length - start); |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
186 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
187 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
188 | cxmutstr cx_strsubs_m( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
189 | cxmutstr string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
190 | size_t start |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
191 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
192 | return cx_strsubsl_m(string, start, string.length - start); |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
193 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
194 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
195 | cxstring cx_strsubsl( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
196 | cxstring string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
197 | size_t start, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
198 | size_t length |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
199 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
200 | if (start > string.length) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
201 | return (cxstring) {NULL, 0}; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
202 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
203 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
204 | size_t rem_len = string.length - start; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
205 | if (length > rem_len) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
206 | length = rem_len; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
207 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
208 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
209 | return (cxstring) {string.ptr + start, length}; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
210 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
211 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
212 | cxmutstr cx_strsubsl_m( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
213 | cxmutstr string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
214 | size_t start, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
215 | size_t length |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
216 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
217 | cxstring result = cx_strsubsl(cx_strcast(string), start, length); |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
218 | return (cxmutstr) {(char *) result.ptr, result.length}; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
219 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
220 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
221 | cxstring cx_strchr( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
222 | cxstring string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
223 | int chr |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
224 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
225 | chr = 0xFF & chr; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
226 | // TODO: improve by comparing multiple bytes at once |
962
cd418898af5c
remove cx_for_n() macro - fixes #467
Mike Becker <universe@uap-core.de>
parents:
926
diff
changeset
|
227 | for (size_t i = 0; i < string.length; i++) { |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
228 | if (string.ptr[i] == chr) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
229 | return cx_strsubs(string, i); |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
230 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
231 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
232 | return (cxstring) {NULL, 0}; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
233 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
234 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
235 | cxmutstr cx_strchr_m( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
236 | cxmutstr string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
237 | int chr |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
238 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
239 | cxstring result = cx_strchr(cx_strcast(string), chr); |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
240 | return (cxmutstr) {(char *) result.ptr, result.length}; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
241 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
242 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
243 | cxstring cx_strrchr( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
244 | cxstring string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
245 | int chr |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
246 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
247 | chr = 0xFF & chr; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
248 | size_t i = string.length; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
249 | while (i > 0) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
250 | i--; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
251 | // TODO: improve by comparing multiple bytes at once |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
252 | if (string.ptr[i] == chr) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
253 | return cx_strsubs(string, i); |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
254 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
255 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
256 | return (cxstring) {NULL, 0}; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
257 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
258 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
259 | cxmutstr cx_strrchr_m( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
260 | cxmutstr string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
261 | int chr |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
262 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
263 | cxstring result = cx_strrchr(cx_strcast(string), chr); |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
264 | return (cxmutstr) {(char *) result.ptr, result.length}; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
265 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
266 | |
643
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
628
diff
changeset
|
267 | #ifndef CX_STRSTR_SBO_SIZE |
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
628
diff
changeset
|
268 | #define CX_STRSTR_SBO_SIZE 512 |
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
628
diff
changeset
|
269 | #endif |
926
8fdd8d78c14b
fix several survivors of east-const and some missing consts
Mike Becker <universe@uap-core.de>
parents:
890
diff
changeset
|
270 | const unsigned cx_strstr_sbo_size = CX_STRSTR_SBO_SIZE; |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
271 | |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
272 | cxstring cx_strstr( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
273 | cxstring haystack, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
274 | cxstring needle |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
275 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
276 | if (needle.length == 0) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
277 | return haystack; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
278 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
279 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
280 | // optimize for single-char needles |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
281 | if (needle.length == 1) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
282 | return cx_strchr(haystack, *needle.ptr); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
283 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
284 | |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
285 | /* |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
286 | * IMPORTANT: |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
287 | * Our prefix table contains the prefix length PLUS ONE |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
288 | * this is our decision, because we want to use the full range of size_t. |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
289 | * The original algorithm needs a (-1) at one single place, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
290 | * and we want to avoid that. |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
291 | */ |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
292 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
293 | // local prefix table |
643
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
628
diff
changeset
|
294 | size_t s_prefix_table[CX_STRSTR_SBO_SIZE]; |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
295 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
296 | // check needle length and use appropriate prefix table |
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
297 | // if the pattern exceeds static prefix table, allocate on the heap |
643
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
628
diff
changeset
|
298 | bool useheap = needle.length >= CX_STRSTR_SBO_SIZE; |
591
7df0bcaecffa
fix over-optimization of strstr
Mike Becker <universe@uap-core.de>
parents:
590
diff
changeset
|
299 | register size_t *ptable = useheap ? calloc(needle.length + 1, |
7df0bcaecffa
fix over-optimization of strstr
Mike Becker <universe@uap-core.de>
parents:
590
diff
changeset
|
300 | sizeof(size_t)) : s_prefix_table; |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
301 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
302 | // keep counter in registers |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
303 | register size_t i, j; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
304 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
305 | // fill prefix table |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
306 | i = 0; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
307 | j = 0; |
591
7df0bcaecffa
fix over-optimization of strstr
Mike Becker <universe@uap-core.de>
parents:
590
diff
changeset
|
308 | ptable[i] = j; |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
309 | while (i < needle.length) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
310 | while (j >= 1 && needle.ptr[j - 1] != needle.ptr[i]) { |
591
7df0bcaecffa
fix over-optimization of strstr
Mike Becker <universe@uap-core.de>
parents:
590
diff
changeset
|
311 | j = ptable[j - 1]; |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
312 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
313 | i++; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
314 | j++; |
591
7df0bcaecffa
fix over-optimization of strstr
Mike Becker <universe@uap-core.de>
parents:
590
diff
changeset
|
315 | ptable[i] = j; |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
316 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
317 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
318 | // search |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
319 | cxstring result = {NULL, 0}; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
320 | i = 0; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
321 | j = 1; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
322 | while (i < haystack.length) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
323 | while (j >= 1 && haystack.ptr[i] != needle.ptr[j - 1]) { |
591
7df0bcaecffa
fix over-optimization of strstr
Mike Becker <universe@uap-core.de>
parents:
590
diff
changeset
|
324 | j = ptable[j - 1]; |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
325 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
326 | i++; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
327 | j++; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
328 | if (j - 1 == needle.length) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
329 | size_t start = i - needle.length; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
330 | result.ptr = haystack.ptr + start; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
331 | result.length = haystack.length - start; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
332 | break; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
333 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
334 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
335 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
336 | // if prefix table was allocated on the heap, free it |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
337 | if (ptable != s_prefix_table) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
338 | free(ptable); |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
339 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
340 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
341 | return result; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
342 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
343 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
344 | cxmutstr cx_strstr_m( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
345 | cxmutstr haystack, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
346 | cxstring needle |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
347 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
348 | cxstring result = cx_strstr(cx_strcast(haystack), needle); |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
349 | return (cxmutstr) {(char *) result.ptr, result.length}; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
350 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
351 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
352 | size_t cx_strsplit( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
353 | cxstring string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
354 | cxstring delim, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
355 | size_t limit, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
356 | cxstring *output |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
357 | ) { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
358 | // special case: output limit is zero |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
359 | if (limit == 0) return 0; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
360 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
361 | // special case: delimiter is empty |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
362 | if (delim.length == 0) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
363 | output[0] = string; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
364 | return 1; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
365 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
366 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
367 | // special cases: delimiter is at least as large as the string |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
368 | if (delim.length >= string.length) { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
369 | // exact match |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
370 | if (cx_strcmp(string, delim) == 0) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
371 | output[0] = cx_strn(string.ptr, 0); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
372 | output[1] = cx_strn(string.ptr + string.length, 0); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
373 | return 2; |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
374 | } else { |
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
375 | // no match possible |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
376 | output[0] = string; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
377 | return 1; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
378 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
379 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
380 | |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
381 | size_t n = 0; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
382 | cxstring curpos = string; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
383 | while (1) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
384 | ++n; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
385 | cxstring match = cx_strstr(curpos, delim); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
386 | if (match.length > 0) { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
387 | // is the limit reached? |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
388 | if (n < limit) { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
389 | // copy the current string to the array |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
390 | cxstring item = cx_strn(curpos.ptr, match.ptr - curpos.ptr); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
391 | output[n - 1] = item; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
392 | size_t processed = item.length + delim.length; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
393 | curpos.ptr += processed; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
394 | curpos.length -= processed; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
395 | } else { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
396 | // limit reached, copy the _full_ remaining string |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
397 | output[n - 1] = curpos; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
398 | break; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
399 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
400 | } else { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
401 | // no more matches, copy last string |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
402 | output[n - 1] = curpos; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
403 | break; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
404 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
405 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
406 | |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
407 | return n; |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
408 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
409 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
410 | size_t cx_strsplit_a( |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
411 | const CxAllocator *allocator, |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
412 | cxstring string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
413 | cxstring delim, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
414 | size_t limit, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
415 | cxstring **output |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
416 | ) { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
417 | // find out how many splits we're going to make and allocate memory |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
418 | size_t n = 0; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
419 | cxstring curpos = string; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
420 | while (1) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
421 | ++n; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
422 | cxstring match = cx_strstr(curpos, delim); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
423 | if (match.length > 0) { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
424 | // is the limit reached? |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
425 | if (n < limit) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
426 | size_t processed = match.ptr - curpos.ptr + delim.length; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
427 | curpos.ptr += processed; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
428 | curpos.length -= processed; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
429 | } else { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
430 | // limit reached |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
431 | break; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
432 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
433 | } else { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
434 | // no more matches |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
435 | break; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
436 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
437 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
438 | *output = cxCalloc(allocator, n, sizeof(cxstring)); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
439 | return cx_strsplit(string, delim, n, *output); |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
440 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
441 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
442 | size_t cx_strsplit_m( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
443 | cxmutstr string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
444 | cxstring delim, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
445 | size_t limit, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
446 | cxmutstr *output |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
447 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
448 | return cx_strsplit(cx_strcast(string), |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
449 | delim, limit, (cxstring *) output); |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
450 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
451 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
452 | size_t cx_strsplit_ma( |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
453 | const CxAllocator *allocator, |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
454 | cxmutstr string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
455 | cxstring delim, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
456 | size_t limit, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
457 | cxmutstr **output |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
458 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
459 | return cx_strsplit_a(allocator, cx_strcast(string), |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
460 | delim, limit, (cxstring **) output); |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
461 | } |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
462 | |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
463 | int cx_strcmp( |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
464 | cxstring s1, |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
465 | cxstring s2 |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
466 | ) { |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
467 | if (s1.length == s2.length) { |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
468 | return memcmp(s1.ptr, s2.ptr, s1.length); |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
469 | } else if (s1.length > s2.length) { |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
470 | return 1; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
471 | } else { |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
472 | return -1; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
473 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
474 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
475 | |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
476 | int cx_strcasecmp( |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
477 | cxstring s1, |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
478 | cxstring s2 |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
479 | ) { |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
480 | if (s1.length == s2.length) { |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
481 | #ifdef _WIN32 |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
482 | return _strnicmp(s1.ptr, s2.ptr, s1.length); |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
483 | #else |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
484 | return strncasecmp(s1.ptr, s2.ptr, s1.length); |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
485 | #endif |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
486 | } else if (s1.length > s2.length) { |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
487 | return 1; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
488 | } else { |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
489 | return -1; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
490 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
491 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
492 | |
657
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
493 | int cx_strcmp_p( |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
494 | const void *s1, |
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
495 | const void *s2 |
657
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
496 | ) { |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
497 | const cxstring *left = s1; |
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
498 | const cxstring *right = s2; |
657
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
499 | return cx_strcmp(*left, *right); |
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
500 | } |
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
501 | |
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
502 | int cx_strcasecmp_p( |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
503 | const void *s1, |
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
504 | const void *s2 |
657
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
505 | ) { |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
506 | const cxstring *left = s1; |
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
507 | const cxstring *right = s2; |
657
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
508 | return cx_strcasecmp(*left, *right); |
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
509 | } |
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
510 | |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
511 | cxmutstr cx_strdup_a( |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
512 | const CxAllocator *allocator, |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
513 | cxstring string |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
514 | ) { |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
515 | cxmutstr result = { |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
516 | cxMalloc(allocator, string.length + 1), |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
517 | string.length |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
518 | }; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
519 | if (result.ptr == NULL) { |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
520 | result.length = 0; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
521 | return result; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
522 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
523 | memcpy(result.ptr, string.ptr, string.length); |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
524 | result.ptr[string.length] = '\0'; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
525 | return result; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
526 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
527 | |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
528 | cxstring cx_strtrim(cxstring string) { |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
529 | cxstring result = string; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
530 | // TODO: optimize by comparing multiple bytes at once |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
531 | while (result.length > 0 && isspace(*result.ptr)) { |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
532 | result.ptr++; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
533 | result.length--; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
534 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
535 | while (result.length > 0 && isspace(result.ptr[result.length - 1])) { |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
536 | result.length--; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
537 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
538 | return result; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
539 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
540 | |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
541 | cxmutstr cx_strtrim_m(cxmutstr string) { |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
542 | cxstring result = cx_strtrim(cx_strcast(string)); |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
543 | return (cxmutstr) {(char *) result.ptr, result.length}; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
544 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
545 | |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
546 | bool cx_strprefix( |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
547 | cxstring string, |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
548 | cxstring prefix |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
549 | ) { |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
550 | if (string.length < prefix.length) return false; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
551 | return memcmp(string.ptr, prefix.ptr, prefix.length) == 0; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
552 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
553 | |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
554 | bool cx_strsuffix( |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
555 | cxstring string, |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
556 | cxstring suffix |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
557 | ) { |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
558 | if (string.length < suffix.length) return false; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
559 | return memcmp(string.ptr + string.length - suffix.length, |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
560 | suffix.ptr, suffix.length) == 0; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
561 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
562 | |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
563 | bool cx_strcaseprefix( |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
564 | cxstring string, |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
565 | cxstring prefix |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
566 | ) { |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
567 | if (string.length < prefix.length) return false; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
568 | #ifdef _WIN32 |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
569 | return _strnicmp(string.ptr, prefix.ptr, prefix.length) == 0; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
570 | #else |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
571 | return strncasecmp(string.ptr, prefix.ptr, prefix.length) == 0; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
572 | #endif |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
573 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
574 | |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
575 | bool cx_strcasesuffix( |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
576 | cxstring string, |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
577 | cxstring suffix |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
578 | ) { |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
579 | if (string.length < suffix.length) return false; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
580 | #ifdef _WIN32 |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
581 | return _strnicmp(string.ptr+string.length-suffix.length, |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
582 | suffix.ptr, suffix.length) == 0; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
583 | #else |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
584 | return strncasecmp(string.ptr + string.length - suffix.length, |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
585 | suffix.ptr, suffix.length) == 0; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
586 | #endif |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
587 | } |
582
96fa7fa6af4f
implement strupper and strlower
Mike Becker <universe@uap-core.de>
parents:
581
diff
changeset
|
588 | |
96fa7fa6af4f
implement strupper and strlower
Mike Becker <universe@uap-core.de>
parents:
581
diff
changeset
|
589 | void cx_strlower(cxmutstr string) { |
962
cd418898af5c
remove cx_for_n() macro - fixes #467
Mike Becker <universe@uap-core.de>
parents:
926
diff
changeset
|
590 | for (size_t i = 0; i < string.length; i++) { |
593
ea9b41b5ebbc
explicitly cast int to char
Mike Becker <universe@uap-core.de>
parents:
591
diff
changeset
|
591 | string.ptr[i] = (char) tolower(string.ptr[i]); |
582
96fa7fa6af4f
implement strupper and strlower
Mike Becker <universe@uap-core.de>
parents:
581
diff
changeset
|
592 | } |
96fa7fa6af4f
implement strupper and strlower
Mike Becker <universe@uap-core.de>
parents:
581
diff
changeset
|
593 | } |
96fa7fa6af4f
implement strupper and strlower
Mike Becker <universe@uap-core.de>
parents:
581
diff
changeset
|
594 | |
96fa7fa6af4f
implement strupper and strlower
Mike Becker <universe@uap-core.de>
parents:
581
diff
changeset
|
595 | void cx_strupper(cxmutstr string) { |
962
cd418898af5c
remove cx_for_n() macro - fixes #467
Mike Becker <universe@uap-core.de>
parents:
926
diff
changeset
|
596 | for (size_t i = 0; i < string.length; i++) { |
593
ea9b41b5ebbc
explicitly cast int to char
Mike Becker <universe@uap-core.de>
parents:
591
diff
changeset
|
597 | string.ptr[i] = (char) toupper(string.ptr[i]); |
582
96fa7fa6af4f
implement strupper and strlower
Mike Becker <universe@uap-core.de>
parents:
581
diff
changeset
|
598 | } |
96fa7fa6af4f
implement strupper and strlower
Mike Becker <universe@uap-core.de>
parents:
581
diff
changeset
|
599 | } |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
600 | |
643
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
628
diff
changeset
|
601 | #ifndef CX_STRREPLACE_INDEX_BUFFER_SIZE |
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
628
diff
changeset
|
602 | #define CX_STRREPLACE_INDEX_BUFFER_SIZE 64 |
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
628
diff
changeset
|
603 | #endif |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
604 | |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
605 | struct cx_strreplace_ibuf { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
606 | size_t *buf; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
607 | struct cx_strreplace_ibuf *next; |
590
02a56701a5cb
fix missing zero-termination in strreplace
Mike Becker <universe@uap-core.de>
parents:
583
diff
changeset
|
608 | unsigned int len; |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
609 | }; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
610 | |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
611 | static void cx_strrepl_free_ibuf(struct cx_strreplace_ibuf *buf) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
612 | while (buf) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
613 | struct cx_strreplace_ibuf *next = buf->next; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
614 | free(buf->buf); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
615 | free(buf); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
616 | buf = next; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
617 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
618 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
619 | |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
620 | cxmutstr cx_strreplacen_a( |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
621 | const CxAllocator *allocator, |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
622 | cxstring str, |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
623 | cxstring pattern, |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
624 | cxstring replacement, |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
625 | size_t replmax |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
626 | ) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
627 | |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
628 | if (pattern.length == 0 || pattern.length > str.length || replmax == 0) |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
629 | return cx_strdup_a(allocator, str); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
630 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
631 | // Compute expected buffer length |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
632 | size_t ibufmax = str.length / pattern.length; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
633 | size_t ibuflen = replmax < ibufmax ? replmax : ibufmax; |
643
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
628
diff
changeset
|
634 | if (ibuflen > CX_STRREPLACE_INDEX_BUFFER_SIZE) { |
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
628
diff
changeset
|
635 | ibuflen = CX_STRREPLACE_INDEX_BUFFER_SIZE; |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
636 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
637 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
638 | // Allocate first index buffer |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
639 | struct cx_strreplace_ibuf *firstbuf, *curbuf; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
640 | firstbuf = curbuf = calloc(1, sizeof(struct cx_strreplace_ibuf)); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
641 | if (!firstbuf) return cx_mutstrn(NULL, 0); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
642 | firstbuf->buf = calloc(ibuflen, sizeof(size_t)); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
643 | if (!firstbuf->buf) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
644 | free(firstbuf); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
645 | return cx_mutstrn(NULL, 0); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
646 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
647 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
648 | // Search occurrences |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
649 | cxstring searchstr = str; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
650 | size_t found = 0; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
651 | do { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
652 | cxstring match = cx_strstr(searchstr, pattern); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
653 | if (match.length > 0) { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
654 | // Allocate next buffer in chain, if required |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
655 | if (curbuf->len == ibuflen) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
656 | struct cx_strreplace_ibuf *nextbuf = |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
657 | calloc(1, sizeof(struct cx_strreplace_ibuf)); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
658 | if (!nextbuf) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
659 | cx_strrepl_free_ibuf(firstbuf); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
660 | return cx_mutstrn(NULL, 0); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
661 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
662 | nextbuf->buf = calloc(ibuflen, sizeof(size_t)); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
663 | if (!nextbuf->buf) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
664 | free(nextbuf); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
665 | cx_strrepl_free_ibuf(firstbuf); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
666 | return cx_mutstrn(NULL, 0); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
667 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
668 | curbuf->next = nextbuf; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
669 | curbuf = nextbuf; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
670 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
671 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
672 | // Record match index |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
673 | found++; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
674 | size_t idx = match.ptr - str.ptr; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
675 | curbuf->buf[curbuf->len++] = idx; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
676 | searchstr.ptr = match.ptr + pattern.length; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
677 | searchstr.length = str.length - idx - pattern.length; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
678 | } else { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
679 | break; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
680 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
681 | } while (searchstr.length > 0 && found < replmax); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
682 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
683 | // Allocate result string |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
684 | cxmutstr result; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
685 | { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
686 | ssize_t adjlen = (ssize_t) replacement.length - (ssize_t) pattern.length; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
687 | size_t rcount = 0; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
688 | curbuf = firstbuf; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
689 | do { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
690 | rcount += curbuf->len; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
691 | curbuf = curbuf->next; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
692 | } while (curbuf); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
693 | result.length = str.length + rcount * adjlen; |
590
02a56701a5cb
fix missing zero-termination in strreplace
Mike Becker <universe@uap-core.de>
parents:
583
diff
changeset
|
694 | result.ptr = cxMalloc(allocator, result.length + 1); |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
695 | if (!result.ptr) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
696 | cx_strrepl_free_ibuf(firstbuf); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
697 | return cx_mutstrn(NULL, 0); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
698 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
699 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
700 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
701 | // Build result string |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
702 | curbuf = firstbuf; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
703 | size_t srcidx = 0; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
704 | char *destptr = result.ptr; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
705 | do { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
706 | for (size_t i = 0; i < curbuf->len; i++) { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
707 | // Copy source part up to next match |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
708 | size_t idx = curbuf->buf[i]; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
709 | size_t srclen = idx - srcidx; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
710 | if (srclen > 0) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
711 | memcpy(destptr, str.ptr + srcidx, srclen); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
712 | destptr += srclen; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
713 | srcidx += srclen; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
714 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
715 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
716 | // Copy the replacement and skip the source pattern |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
717 | srcidx += pattern.length; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
718 | memcpy(destptr, replacement.ptr, replacement.length); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
719 | destptr += replacement.length; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
720 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
721 | curbuf = curbuf->next; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
722 | } while (curbuf); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
723 | memcpy(destptr, str.ptr + srcidx, str.length - srcidx); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
724 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
725 | // Result is guaranteed to be zero-terminated |
590
02a56701a5cb
fix missing zero-termination in strreplace
Mike Becker <universe@uap-core.de>
parents:
583
diff
changeset
|
726 | result.ptr[result.length] = '\0'; |
02a56701a5cb
fix missing zero-termination in strreplace
Mike Becker <universe@uap-core.de>
parents:
583
diff
changeset
|
727 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
728 | // Free index buffer |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
729 | cx_strrepl_free_ibuf(firstbuf); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
730 | |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
731 | return result; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
732 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
733 | |
645
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
734 | CxStrtokCtx cx_strtok( |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
735 | cxstring str, |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
736 | cxstring delim, |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
737 | size_t limit |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
738 | ) { |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
739 | CxStrtokCtx ctx; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
740 | ctx.str = str; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
741 | ctx.delim = delim; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
742 | ctx.limit = limit; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
743 | ctx.pos = 0; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
744 | ctx.next_pos = 0; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
745 | ctx.delim_pos = 0; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
746 | ctx.found = 0; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
747 | ctx.delim_more = NULL; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
748 | ctx.delim_more_count = 0; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
749 | return ctx; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
750 | } |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
751 | |
645
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
752 | CxStrtokCtx cx_strtok_m( |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
753 | cxmutstr str, |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
754 | cxstring delim, |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
755 | size_t limit |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
756 | ) { |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
757 | return cx_strtok(cx_strcast(str), delim, limit); |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
758 | } |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
759 | |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
760 | bool cx_strtok_next( |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
761 | CxStrtokCtx *ctx, |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
762 | cxstring *token |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
763 | ) { |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
764 | // abortion criteria |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
765 | if (ctx->found >= ctx->limit || ctx->delim_pos >= ctx->str.length) { |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
766 | return false; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
767 | } |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
768 | |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
769 | // determine the search start |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
770 | cxstring haystack = cx_strsubs(ctx->str, ctx->next_pos); |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
771 | |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
772 | // search the next delimiter |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
773 | cxstring delim = cx_strstr(haystack, ctx->delim); |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
774 | |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
775 | // if found, make delim capture exactly the delimiter |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
776 | if (delim.length > 0) { |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
777 | delim.length = ctx->delim.length; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
778 | } |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
779 | |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
780 | // if more delimiters are specified, check them now |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
781 | if (ctx->delim_more_count > 0) { |
962
cd418898af5c
remove cx_for_n() macro - fixes #467
Mike Becker <universe@uap-core.de>
parents:
926
diff
changeset
|
782 | for (size_t i = 0; i < ctx->delim_more_count; i++) { |
645
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
783 | cxstring d = cx_strstr(haystack, ctx->delim_more[i]); |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
784 | if (d.length > 0 && (delim.length == 0 || d.ptr < delim.ptr)) { |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
785 | delim.ptr = d.ptr; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
786 | delim.length = ctx->delim_more[i].length; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
787 | } |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
788 | } |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
789 | } |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
790 | |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
791 | // store the token information and adjust the context |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
792 | ctx->found++; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
793 | ctx->pos = ctx->next_pos; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
794 | token->ptr = &ctx->str.ptr[ctx->pos]; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
795 | ctx->delim_pos = delim.length == 0 ? |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
796 | ctx->str.length : (size_t) (delim.ptr - ctx->str.ptr); |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
797 | token->length = ctx->delim_pos - ctx->pos; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
798 | ctx->next_pos = ctx->delim_pos + delim.length; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
799 | |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
800 | return true; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
801 | } |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
802 | |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
803 | bool cx_strtok_next_m( |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
804 | CxStrtokCtx *ctx, |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
805 | cxmutstr *token |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
806 | ) { |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
807 | return cx_strtok_next(ctx, (cxstring *) token); |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
808 | } |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
809 | |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
810 | void cx_strtok_delim( |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
811 | CxStrtokCtx *ctx, |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
812 | const cxstring *delim, |
645
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
813 | size_t count |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
814 | ) { |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
815 | ctx->delim_more = delim; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
816 | ctx->delim_more_count = count; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
817 | } |