Fri, 23 May 2025 12:44:24 +0200
make test-compile depend on both static and shared
the shared lib is not needed for the tests,
but when run with coverage, gcov will be confused
when outdated line information is available from
a previous shared build
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 | #include "cx/string.h" |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
29 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
30 | #include <string.h> |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
31 | #include <stdarg.h> |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
32 | #include <assert.h> |
1041
508dc8b32a17
fix missing errno.h include
Mike Becker <universe@uap-core.de>
parents:
1040
diff
changeset
|
33 | #include <errno.h> |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
34 | #include <limits.h> |
1063
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
35 | #include <float.h> |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
36 | |
1073
13c8a92625d4
fix for ultrafail fix #546
Mike Becker <universe@uap-core.de>
parents:
1071
diff
changeset
|
37 | #ifdef _WIN32 |
13c8a92625d4
fix for ultrafail fix #546
Mike Becker <universe@uap-core.de>
parents:
1071
diff
changeset
|
38 | #define cx_strcasecmp_impl _strnicmp |
13c8a92625d4
fix for ultrafail fix #546
Mike Becker <universe@uap-core.de>
parents:
1071
diff
changeset
|
39 | #else |
13c8a92625d4
fix for ultrafail fix #546
Mike Becker <universe@uap-core.de>
parents:
1071
diff
changeset
|
40 | #include <strings.h> |
13c8a92625d4
fix for ultrafail fix #546
Mike Becker <universe@uap-core.de>
parents:
1071
diff
changeset
|
41 | #define cx_strcasecmp_impl strncasecmp |
13c8a92625d4
fix for ultrafail fix #546
Mike Becker <universe@uap-core.de>
parents:
1071
diff
changeset
|
42 | #endif |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
43 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
44 | cxmutstr cx_mutstr(char *cstring) { |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
45 | return (cxmutstr) {cstring, strlen(cstring)}; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
46 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
47 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
48 | cxmutstr cx_mutstrn( |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
49 | char *cstring, |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
50 | size_t 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 | return (cxmutstr) {cstring, length}; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
53 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
54 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
55 | cxstring cx_str(const char *cstring) { |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
56 | return (cxstring) {cstring, strlen(cstring)}; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
57 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
58 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
59 | cxstring cx_strn( |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
60 | const char *cstring, |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
61 | size_t 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 | return (cxstring) {cstring, length}; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
64 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
65 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
66 | void cx_strfree(cxmutstr *str) { |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
962
diff
changeset
|
67 | if (str == NULL) return; |
1319
aa1f580f8f59
add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents:
1318
diff
changeset
|
68 | cxFreeDefault(str->ptr); |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
69 | str->ptr = NULL; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
70 | str->length = 0; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
71 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
72 | |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
73 | 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
|
74 | const CxAllocator *alloc, |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
75 | cxmutstr *str |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
76 | ) { |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
962
diff
changeset
|
77 | if (str == NULL) return; |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
78 | cxFree(alloc, str->ptr); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
79 | str->ptr = NULL; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
80 | str->length = 0; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
81 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
82 | |
1304
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1300
diff
changeset
|
83 | int cx_strcpy_a( |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1300
diff
changeset
|
84 | const CxAllocator *alloc, |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1300
diff
changeset
|
85 | cxmutstr *dest, |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1300
diff
changeset
|
86 | cxstring src |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1300
diff
changeset
|
87 | ) { |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1300
diff
changeset
|
88 | if (cxReallocate(alloc, &dest->ptr, src.length + 1)) { |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1300
diff
changeset
|
89 | return 1; |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1300
diff
changeset
|
90 | } |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1300
diff
changeset
|
91 | |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1300
diff
changeset
|
92 | memcpy(dest->ptr, src.ptr, src.length); |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1300
diff
changeset
|
93 | dest->length = src.length; |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1300
diff
changeset
|
94 | dest->ptr[dest->length] = '\0'; |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1300
diff
changeset
|
95 | |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1300
diff
changeset
|
96 | return 0; |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1300
diff
changeset
|
97 | } |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1300
diff
changeset
|
98 | |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
99 | size_t cx_strlen( |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
100 | size_t count, |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
101 | ... |
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 | if (count == 0) return 0; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
104 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
105 | va_list ap; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
106 | va_start(ap, count); |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
107 | size_t size = 0; |
962
cd418898af5c
remove cx_for_n() macro - fixes #467
Mike Becker <universe@uap-core.de>
parents:
926
diff
changeset
|
108 | for (size_t i = 0; i < count; i++) { |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
109 | 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
|
110 | if (size > SIZE_MAX - str.length) errno = EOVERFLOW; |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
111 | size += str.length; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
112 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
113 | va_end(ap); |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
114 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
115 | return size; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
116 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
117 | |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
118 | 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
|
119 | 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
|
120 | cxmutstr str, |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
121 | size_t count, |
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 | ) { |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
124 | if (count == 0) return str; |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
125 | va_list ap; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
126 | va_start(ap, count); |
1296
2a2403c63439
fixes unnecessary allocations in cx_strcat() family of functions
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
127 | va_list ap2; |
2a2403c63439
fixes unnecessary allocations in cx_strcat() family of functions
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
128 | va_copy(ap2, ap); |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
129 | |
1296
2a2403c63439
fixes unnecessary allocations in cx_strcat() family of functions
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
130 | // compute 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
|
131 | 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
|
132 | size_t slen = str.length; |
962
cd418898af5c
remove cx_for_n() macro - fixes #467
Mike Becker <universe@uap-core.de>
parents:
926
diff
changeset
|
133 | for (size_t i = 0; i < count; i++) { |
1296
2a2403c63439
fixes unnecessary allocations in cx_strcat() family of functions
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
134 | cxstring s = 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
|
135 | if (slen > SIZE_MAX - str.length) overflow = true; |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
136 | slen += s.length; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
137 | } |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
138 | va_end(ap); |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
139 | |
1040
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
140 | // 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
|
141 | if (overflow) { |
1296
2a2403c63439
fixes unnecessary allocations in cx_strcat() family of functions
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
142 | va_end(ap2); |
1040
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
143 | 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
|
144 | 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
|
145 | } |
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents:
1001
diff
changeset
|
146 | |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
147 | // 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
|
148 | 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
|
149 | 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
|
150 | 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
|
151 | } else { |
1001
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
152 | 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
|
153 | } |
1001
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
154 | if (newstr == NULL) { |
1296
2a2403c63439
fixes unnecessary allocations in cx_strcat() family of functions
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
155 | va_end(ap2); |
1001
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
156 | return (cxmutstr) {NULL, 0}; |
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
157 | } |
5c9ec5a0a4ef
change cx_strcat variants to allow handling of ENOMEM
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
158 | str.ptr = newstr; |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
159 | |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
160 | // 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
|
161 | 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
|
162 | str.length = slen; |
962
cd418898af5c
remove cx_for_n() macro - fixes #467
Mike Becker <universe@uap-core.de>
parents:
926
diff
changeset
|
163 | for (size_t i = 0; i < count; i++) { |
1296
2a2403c63439
fixes unnecessary allocations in cx_strcat() family of functions
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
164 | cxstring s = va_arg(ap2, cxstring); |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
165 | memcpy(str.ptr + pos, s.ptr, s.length); |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
166 | pos += s.length; |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
167 | } |
1296
2a2403c63439
fixes unnecessary allocations in cx_strcat() family of functions
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
168 | va_end(ap2); |
579
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 | |
697
ebdce4bf262b
add cx_strcat_m() and cx_strcat_ma() for in-place concatenation
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
173 | return str; |
579
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
174 | } |
bbc46dcd5255
start implementing string functions
Mike Becker <universe@uap-core.de>
parents:
576
diff
changeset
|
175 | |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
176 | cxstring cx_strsubs( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
177 | cxstring string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
178 | size_t start |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
179 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
180 | return cx_strsubsl(string, start, string.length - start); |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
181 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
182 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
183 | cxmutstr cx_strsubs_m( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
184 | cxmutstr string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
185 | size_t 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 | 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
|
188 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
189 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
190 | cxstring cx_strsubsl( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
191 | cxstring string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
192 | size_t start, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
193 | size_t length |
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 | if (start > string.length) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
196 | return (cxstring) {NULL, 0}; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
197 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
198 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
199 | size_t rem_len = string.length - start; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
200 | if (length > rem_len) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
201 | length = rem_len; |
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 | return (cxstring) {string.ptr + start, length}; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
205 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
206 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
207 | cxmutstr cx_strsubsl_m( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
208 | cxmutstr string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
209 | size_t start, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
210 | size_t length |
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 | 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
|
213 | return (cxmutstr) {(char *) result.ptr, result.length}; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
214 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
215 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
216 | cxstring cx_strchr( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
217 | cxstring string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
218 | int chr |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
219 | ) { |
1161 | 220 | char *ret = memchr(string.ptr, 0xFF & chr, string.length); |
221 | if (ret == NULL) return (cxstring) {NULL, 0}; | |
222 | return (cxstring) {ret, string.length - (ret - string.ptr)}; | |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
223 | } |
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 | cxmutstr cx_strchr_m( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
226 | cxmutstr string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
227 | int chr |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
228 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
229 | cxstring result = cx_strchr(cx_strcast(string), chr); |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
230 | return (cxmutstr) {(char *) result.ptr, result.length}; |
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 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
233 | cxstring cx_strrchr( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
234 | cxstring string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
235 | int chr |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
236 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
237 | chr = 0xFF & chr; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
238 | size_t i = string.length; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
239 | while (i > 0) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
240 | i--; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
241 | // TODO: improve by comparing multiple bytes at once |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
242 | if (string.ptr[i] == chr) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
243 | return cx_strsubs(string, i); |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
244 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
245 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
246 | return (cxstring) {NULL, 0}; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
247 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
248 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
249 | cxmutstr cx_strrchr_m( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
250 | cxmutstr string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
251 | int chr |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
252 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
253 | cxstring result = cx_strrchr(cx_strcast(string), chr); |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
254 | return (cxmutstr) {(char *) result.ptr, result.length}; |
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 | |
643
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
628
diff
changeset
|
257 | #ifndef CX_STRSTR_SBO_SIZE |
1136
d9ff0f091f28
reduce default SBO memory for strstr - relates to #575
Mike Becker <universe@uap-core.de>
parents:
1134
diff
changeset
|
258 | #define CX_STRSTR_SBO_SIZE 128 |
643
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
628
diff
changeset
|
259 | #endif |
926
8fdd8d78c14b
fix several survivors of east-const and some missing consts
Mike Becker <universe@uap-core.de>
parents:
890
diff
changeset
|
260 | 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
|
261 | |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
262 | cxstring cx_strstr( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
263 | cxstring haystack, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
264 | cxstring needle |
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 | if (needle.length == 0) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
267 | return haystack; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
268 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
269 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
270 | // optimize for single-char needles |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
271 | if (needle.length == 1) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
272 | return cx_strchr(haystack, *needle.ptr); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
273 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
274 | |
580
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 | * IMPORTANT: |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
277 | * 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
|
278 | * 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
|
279 | * 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
|
280 | * and we want to avoid that. |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
281 | */ |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
282 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
283 | // local prefix table |
643
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
628
diff
changeset
|
284 | 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
|
285 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
286 | // 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
|
287 | // if the pattern exceeds static prefix table, allocate on the heap |
1125
6090c455b8df
avoid unnecessary comparison
Mike Becker <universe@uap-core.de>
parents:
1074
diff
changeset
|
288 | const bool useheap = needle.length >= CX_STRSTR_SBO_SIZE; |
1318
12fa1d37fe48
allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents:
1304
diff
changeset
|
289 | register size_t *ptable = useheap |
1319
aa1f580f8f59
add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents:
1318
diff
changeset
|
290 | ? cxCallocDefault(needle.length + 1, sizeof(size_t)) |
1318
12fa1d37fe48
allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents:
1304
diff
changeset
|
291 | : s_prefix_table; |
580
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 | // keep counter in registers |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
294 | register size_t i, j; |
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 | // fill prefix table |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
297 | i = 0; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
298 | j = 0; |
591
7df0bcaecffa
fix over-optimization of strstr
Mike Becker <universe@uap-core.de>
parents:
590
diff
changeset
|
299 | ptable[i] = j; |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
300 | while (i < needle.length) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
301 | 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
|
302 | j = ptable[j - 1]; |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
303 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
304 | i++; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
305 | j++; |
591
7df0bcaecffa
fix over-optimization of strstr
Mike Becker <universe@uap-core.de>
parents:
590
diff
changeset
|
306 | ptable[i] = j; |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
307 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
308 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
309 | // search |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
310 | cxstring result = {NULL, 0}; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
311 | i = 0; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
312 | j = 1; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
313 | while (i < haystack.length) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
314 | 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
|
315 | j = ptable[j - 1]; |
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 | i++; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
318 | j++; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
319 | if (j - 1 == needle.length) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
320 | size_t start = i - needle.length; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
321 | result.ptr = haystack.ptr + start; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
322 | result.length = haystack.length - start; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
323 | break; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
324 | } |
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 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
327 | // if prefix table was allocated on the heap, free it |
1125
6090c455b8df
avoid unnecessary comparison
Mike Becker <universe@uap-core.de>
parents:
1074
diff
changeset
|
328 | if (useheap) { |
1319
aa1f580f8f59
add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents:
1318
diff
changeset
|
329 | cxFreeDefault(ptable); |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
330 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
331 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
332 | return result; |
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 | cxmutstr cx_strstr_m( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
336 | cxmutstr haystack, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
337 | cxstring needle |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
338 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
339 | cxstring result = cx_strstr(cx_strcast(haystack), needle); |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
340 | return (cxmutstr) {(char *) result.ptr, result.length}; |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
341 | } |
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 | size_t cx_strsplit( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
344 | cxstring string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
345 | cxstring delim, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
346 | size_t limit, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
347 | cxstring *output |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
348 | ) { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
349 | // 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
|
350 | if (limit == 0) return 0; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
351 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
352 | // special case: delimiter is empty |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
353 | if (delim.length == 0) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
354 | output[0] = string; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
355 | return 1; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
356 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
357 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
358 | // 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
|
359 | if (delim.length >= string.length) { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
360 | // exact match |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
361 | if (cx_strcmp(string, delim) == 0) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
362 | 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
|
363 | 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
|
364 | return 2; |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
365 | } else { |
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
366 | // no match possible |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
367 | output[0] = string; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
368 | return 1; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
369 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
370 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
371 | |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
372 | size_t n = 0; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
373 | cxstring curpos = string; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
374 | while (1) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
375 | ++n; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
376 | cxstring match = cx_strstr(curpos, delim); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
377 | if (match.length > 0) { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
378 | // is the limit reached? |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
379 | if (n < limit) { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
380 | // 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
|
381 | 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
|
382 | output[n - 1] = item; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
383 | 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
|
384 | curpos.ptr += processed; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
385 | curpos.length -= processed; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
386 | } else { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
387 | // 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
|
388 | output[n - 1] = curpos; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
389 | break; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
390 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
391 | } else { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
392 | // 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
|
393 | output[n - 1] = curpos; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
394 | break; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
395 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
396 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
397 | |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
398 | return n; |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
399 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
400 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
401 | 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
|
402 | const CxAllocator *allocator, |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
403 | cxstring string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
404 | cxstring delim, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
405 | size_t limit, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
406 | cxstring **output |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
407 | ) { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
408 | // 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
|
409 | size_t n = 0; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
410 | cxstring curpos = string; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
411 | while (1) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
412 | ++n; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
413 | cxstring match = cx_strstr(curpos, delim); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
414 | if (match.length > 0) { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
415 | // is the limit reached? |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
416 | if (n < limit) { |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
417 | 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
|
418 | curpos.ptr += processed; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
419 | curpos.length -= processed; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
420 | } else { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
421 | // limit reached |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
422 | break; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
423 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
424 | } else { |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
593
diff
changeset
|
425 | // no more matches |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
426 | break; |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
427 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
428 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
429 | *output = cxCalloc(allocator, n, sizeof(cxstring)); |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
430 | return cx_strsplit(string, delim, n, *output); |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
431 | } |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
432 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
433 | size_t cx_strsplit_m( |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
434 | cxmutstr string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
435 | cxstring delim, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
436 | size_t limit, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
437 | cxmutstr *output |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
438 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
439 | return cx_strsplit(cx_strcast(string), |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
440 | delim, limit, (cxstring *) output); |
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 | |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
443 | 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
|
444 | const CxAllocator *allocator, |
580
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
445 | cxmutstr string, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
446 | cxstring delim, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
447 | size_t limit, |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
448 | cxmutstr **output |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
449 | ) { |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
450 | return cx_strsplit_a(allocator, cx_strcast(string), |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
451 | delim, limit, (cxstring **) output); |
aac47db8da0b
more implementations of string functions
Mike Becker <universe@uap-core.de>
parents:
579
diff
changeset
|
452 | } |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
453 | |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
454 | int cx_strcmp( |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
455 | cxstring s1, |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
456 | cxstring s2 |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
457 | ) { |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
458 | if (s1.length == s2.length) { |
1073
13c8a92625d4
fix for ultrafail fix #546
Mike Becker <universe@uap-core.de>
parents:
1071
diff
changeset
|
459 | return strncmp(s1.ptr, s2.ptr, s1.length); |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
460 | } else if (s1.length > s2.length) { |
1073
13c8a92625d4
fix for ultrafail fix #546
Mike Becker <universe@uap-core.de>
parents:
1071
diff
changeset
|
461 | int r = strncmp(s1.ptr, s2.ptr, s2.length); |
13c8a92625d4
fix for ultrafail fix #546
Mike Becker <universe@uap-core.de>
parents:
1071
diff
changeset
|
462 | if (r != 0) return r; |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
463 | return 1; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
464 | } else { |
1073
13c8a92625d4
fix for ultrafail fix #546
Mike Becker <universe@uap-core.de>
parents:
1071
diff
changeset
|
465 | int r = strncmp(s1.ptr, s2.ptr, s1.length); |
13c8a92625d4
fix for ultrafail fix #546
Mike Becker <universe@uap-core.de>
parents:
1071
diff
changeset
|
466 | if (r != 0) return r; |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
467 | return -1; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
468 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
469 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
470 | |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
471 | int cx_strcasecmp( |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
472 | cxstring s1, |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
473 | cxstring s2 |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
474 | ) { |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
475 | if (s1.length == s2.length) { |
1073
13c8a92625d4
fix for ultrafail fix #546
Mike Becker <universe@uap-core.de>
parents:
1071
diff
changeset
|
476 | return cx_strcasecmp_impl(s1.ptr, s2.ptr, s1.length); |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
477 | } else if (s1.length > s2.length) { |
1073
13c8a92625d4
fix for ultrafail fix #546
Mike Becker <universe@uap-core.de>
parents:
1071
diff
changeset
|
478 | int r = cx_strcasecmp_impl(s1.ptr, s2.ptr, s2.length); |
13c8a92625d4
fix for ultrafail fix #546
Mike Becker <universe@uap-core.de>
parents:
1071
diff
changeset
|
479 | if (r != 0) return r; |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
480 | return 1; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
481 | } else { |
1073
13c8a92625d4
fix for ultrafail fix #546
Mike Becker <universe@uap-core.de>
parents:
1071
diff
changeset
|
482 | int r = cx_strcasecmp_impl(s1.ptr, s2.ptr, s1.length); |
13c8a92625d4
fix for ultrafail fix #546
Mike Becker <universe@uap-core.de>
parents:
1071
diff
changeset
|
483 | if (r != 0) return r; |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
484 | return -1; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
485 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
486 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
487 | |
657
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
488 | 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
|
489 | const void *s1, |
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
490 | const void *s2 |
657
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
491 | ) { |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
492 | const cxstring *left = s1; |
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
493 | const cxstring *right = s2; |
657
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
494 | return cx_strcmp(*left, *right); |
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
495 | } |
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
496 | |
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
497 | 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
|
498 | const void *s1, |
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
499 | const void *s2 |
657
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
500 | ) { |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
501 | const cxstring *left = s1; |
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
502 | const cxstring *right = s2; |
657
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
503 | return cx_strcasecmp(*left, *right); |
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
504 | } |
3eeadf666d6b
add CxListComparator compatible string compare functions
Mike Becker <universe@uap-core.de>
parents:
645
diff
changeset
|
505 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
506 | 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
|
507 | const CxAllocator *allocator, |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
508 | cxstring string |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
509 | ) { |
581
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
510 | cxmutstr result = { |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
511 | cxMalloc(allocator, string.length + 1), |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
512 | string.length |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
513 | }; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
514 | if (result.ptr == NULL) { |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
515 | result.length = 0; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
516 | return result; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
517 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
518 | memcpy(result.ptr, string.ptr, string.length); |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
519 | result.ptr[string.length] = '\0'; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
520 | return result; |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
521 | } |
c067394737ca
implement more string functions
Mike Becker <universe@uap-core.de>
parents:
580
diff
changeset
|
522 | |
1132
b7fea9b2874c
remove uses of ctype.h - temporarily fixes #577
Mike Becker <universe@uap-core.de>
parents:
1127
diff
changeset
|
523 | static bool str_isspace(char c) { |
b7fea9b2874c
remove uses of ctype.h - temporarily fixes #577
Mike Becker <universe@uap-core.de>
parents:
1127
diff
changeset
|
524 | // TODO: remove once UCX has public API for this |
b7fea9b2874c
remove uses of ctype.h - temporarily fixes #577
Mike Becker <universe@uap-core.de>
parents:
1127
diff
changeset
|
525 | return c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == '\v' || c == '\f'; |
b7fea9b2874c
remove uses of ctype.h - temporarily fixes #577
Mike Becker <universe@uap-core.de>
parents:
1127
diff
changeset
|
526 | } |
b7fea9b2874c
remove uses of ctype.h - temporarily fixes #577
Mike Becker <universe@uap-core.de>
parents:
1127
diff
changeset
|
527 | |
581
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 |
1132
b7fea9b2874c
remove uses of ctype.h - temporarily fixes #577
Mike Becker <universe@uap-core.de>
parents:
1127
diff
changeset
|
531 | while (result.length > 0 && str_isspace(*result.ptr)) { |
581
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 | } |
1132
b7fea9b2874c
remove uses of ctype.h - temporarily fixes #577
Mike Becker <universe@uap-core.de>
parents:
1127
diff
changeset
|
535 | while (result.length > 0 && str_isspace(result.ptr[result.length - 1])) { |
581
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 | |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
589 | 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
|
590 | const CxAllocator *allocator, |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
591 | cxstring str, |
1221
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
Mike Becker <universe@uap-core.de>
parents:
1176
diff
changeset
|
592 | cxstring search, |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
593 | cxstring replacement, |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
594 | size_t replmax |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
595 | ) { |
1300
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
596 | // special cases |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
597 | if (search.length == 0 || search.length > str.length || replmax == 0) { |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
598 | return cx_strdup_a(allocator, str); |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
599 | } |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
600 | |
1300
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
601 | size_t in_len = str.length; |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
602 | size_t search_len = search.length; |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
603 | size_t repl_len = replacement.length; |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
604 | |
1300
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
605 | // first run, count the occurrences |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
606 | // and remember where the first is |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
607 | size_t occurrences = 1; |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
608 | cxstring first = cx_strstr(str, search); |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
609 | if (first.length == 0) { |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
610 | // special case, no replacements |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
611 | return cx_strdup_a(allocator, str); |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
612 | } |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
613 | cxstring tmp = cx_strsubs(first, search_len); |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
614 | while (occurrences < replmax && |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
615 | (tmp = cx_strstr(tmp, search)).length > 0) { |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
616 | occurrences++; |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
617 | tmp = cx_strsubs(tmp, search_len); |
583
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 | |
1300
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
620 | // calculate necessary memory |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
621 | signed long long diff_len = (signed long long) repl_len - search_len; |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
622 | size_t out_len = in_len + diff_len * occurrences; |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
623 | cxmutstr out = { |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
624 | cxMalloc(allocator, out_len + 1), |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
625 | out_len |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
626 | }; |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
627 | if (out.ptr == NULL) return out; |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
628 | |
1300
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
629 | // second run: perform the replacements |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
630 | // but start where we found the first occurrence |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
631 | const char *inp = str.ptr; |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
632 | tmp = first; |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
633 | char *outp = out.ptr; |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
634 | while (occurrences-- > 0 && (tmp = cx_strstr(tmp, search)).length > 0) { |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
635 | size_t copylen = tmp.ptr - inp; |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
636 | memcpy(outp, inp, copylen); |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
637 | outp += copylen; |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
638 | memcpy(outp, replacement.ptr, repl_len); |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
639 | outp += repl_len; |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
640 | inp += copylen + search_len; |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
641 | tmp = cx_strsubs(tmp, search_len); |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
642 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
643 | |
1300
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
644 | // add the remaining string |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
645 | size_t copylen = in_len - (inp - str.ptr); |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
646 | memcpy(outp, inp, copylen); |
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
647 | out.ptr[out_len] = '\0'; |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
648 | |
1300
fcb149ee60ff
improve cx_strreplacen() - resolves #623
Mike Becker <universe@uap-core.de>
parents:
1296
diff
changeset
|
649 | return out; |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
650 | } |
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
651 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
652 | CxStrtokCtx cx_strtok_( |
645
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
653 | cxstring str, |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
654 | cxstring delim, |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
655 | size_t limit |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
656 | ) { |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
657 | CxStrtokCtx ctx; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
658 | ctx.str = str; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
659 | ctx.delim = delim; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
660 | ctx.limit = limit; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
661 | ctx.pos = 0; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
662 | ctx.next_pos = 0; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
663 | ctx.delim_pos = 0; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
664 | ctx.found = 0; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
665 | ctx.delim_more = NULL; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
666 | ctx.delim_more_count = 0; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
667 | return ctx; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
668 | } |
583
0f3c9662f9b5
add tests and missing implementations for strings
Mike Becker <universe@uap-core.de>
parents:
582
diff
changeset
|
669 | |
645
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
670 | bool cx_strtok_next( |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
671 | CxStrtokCtx *ctx, |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
672 | cxstring *token |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
673 | ) { |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
674 | // abortion criteria |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
675 | 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
|
676 | return false; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
677 | } |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
678 | |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
679 | // determine the search start |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
680 | 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
|
681 | |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
682 | // search the next delimiter |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
683 | cxstring delim = cx_strstr(haystack, ctx->delim); |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
684 | |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
685 | // if found, make delim capture exactly the delimiter |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
686 | if (delim.length > 0) { |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
687 | delim.length = ctx->delim.length; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
688 | } |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
689 | |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
690 | // if more delimiters are specified, check them now |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
691 | 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
|
692 | 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
|
693 | 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
|
694 | 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
|
695 | delim.ptr = d.ptr; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
696 | delim.length = ctx->delim_more[i].length; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
697 | } |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
698 | } |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
699 | } |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
700 | |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
701 | // store the token information and adjust the context |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
702 | ctx->found++; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
703 | ctx->pos = ctx->next_pos; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
704 | token->ptr = &ctx->str.ptr[ctx->pos]; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
705 | ctx->delim_pos = delim.length == 0 ? |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
706 | 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
|
707 | token->length = ctx->delim_pos - ctx->pos; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
708 | ctx->next_pos = ctx->delim_pos + delim.length; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
709 | |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
710 | return true; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
711 | } |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
712 | |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
713 | bool cx_strtok_next_m( |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
714 | CxStrtokCtx *ctx, |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
715 | cxmutstr *token |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
716 | ) { |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
717 | return cx_strtok_next(ctx, (cxstring *) token); |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
718 | } |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
719 | |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
720 | void cx_strtok_delim( |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
721 | CxStrtokCtx *ctx, |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
806
diff
changeset
|
722 | const cxstring *delim, |
645
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
723 | size_t count |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
724 | ) { |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
725 | ctx->delim_more = delim; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
726 | ctx->delim_more_count = count; |
ec50abb285ad
add strtok API - fixes #220
Mike Becker <universe@uap-core.de>
parents:
643
diff
changeset
|
727 | } |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
728 | |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
729 | #define cx_strtoX_signed_impl(rtype, rmin, rmax) \ |
1052
e997862a57d8
add temporary implementations for string to number and first test cases
Mike Becker <universe@uap-core.de>
parents:
1050
diff
changeset
|
730 | long long result; \ |
e997862a57d8
add temporary implementations for string to number and first test cases
Mike Becker <universe@uap-core.de>
parents:
1050
diff
changeset
|
731 | if (cx_strtoll_lc(str, &result, base, groupsep)) { \ |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
732 | return -1; \ |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
733 | } \ |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
734 | if (result < rmin || result > rmax) { \ |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
735 | errno = ERANGE; \ |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
736 | return -1; \ |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
737 | } \ |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
738 | *output = (rtype) result; \ |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
739 | return 0 |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
740 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
741 | int cx_strtos_lc_(cxstring str, short *output, int base, const char *groupsep) { |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
742 | cx_strtoX_signed_impl(short, SHRT_MIN, SHRT_MAX); |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
743 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
744 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
745 | int cx_strtoi_lc_(cxstring str, int *output, int base, const char *groupsep) { |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
746 | cx_strtoX_signed_impl(int, INT_MIN, INT_MAX); |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
747 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
748 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
749 | int cx_strtol_lc_(cxstring str, long *output, int base, const char *groupsep) { |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
750 | cx_strtoX_signed_impl(long, LONG_MIN, LONG_MAX); |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
751 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
752 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
753 | int cx_strtoll_lc_(cxstring str, long long *output, int base, const char *groupsep) { |
1061
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
754 | // strategy: parse as unsigned, check range, negate if required |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
755 | bool neg = false; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
756 | size_t start_unsigned = 0; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
757 | |
1155
b77d56a27e9c
do not trim strings before conversion to number
Mike Becker <universe@uap-core.de>
parents:
1137
diff
changeset
|
758 | // emptiness check |
1061
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
759 | if (str.length == 0) { |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
760 | errno = EINVAL; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
761 | return -1; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
762 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
763 | |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
764 | // test if we have a negative sign character |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
765 | if (str.ptr[start_unsigned] == '-') { |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
766 | neg = true; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
767 | start_unsigned++; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
768 | // must not be followed by positive sign character |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
769 | if (str.length == 1 || str.ptr[start_unsigned] == '+') { |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
770 | errno = EINVAL; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
771 | return -1; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
772 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
773 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
774 | |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
775 | // now parse the number with strtoull |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
776 | unsigned long long v; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
777 | cxstring ustr = start_unsigned == 0 ? str |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
778 | : cx_strn(str.ptr + start_unsigned, str.length - start_unsigned); |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
779 | int ret = cx_strtoull_lc(ustr, &v, base, groupsep); |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
780 | if (ret != 0) return ret; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
781 | if (neg) { |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
782 | if (v - 1 > LLONG_MAX) { |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
783 | errno = ERANGE; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
784 | return -1; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
785 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
786 | *output = -(long long) v; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
787 | return 0; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
788 | } else { |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
789 | if (v > LLONG_MAX) { |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
790 | errno = ERANGE; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
791 | return -1; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
792 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
793 | *output = (long long) v; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
794 | return 0; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
795 | } |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
796 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
797 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
798 | int cx_strtoi8_lc_(cxstring str, int8_t *output, int base, const char *groupsep) { |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
799 | cx_strtoX_signed_impl(int8_t, INT8_MIN, INT8_MAX); |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
800 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
801 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
802 | int cx_strtoi16_lc_(cxstring str, int16_t *output, int base, const char *groupsep) { |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
803 | cx_strtoX_signed_impl(int16_t, INT16_MIN, INT16_MAX); |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
804 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
805 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
806 | int cx_strtoi32_lc_(cxstring str, int32_t *output, int base, const char *groupsep) { |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
807 | cx_strtoX_signed_impl(int32_t, INT32_MIN, INT32_MAX); |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
808 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
809 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
810 | int cx_strtoi64_lc_(cxstring str, int64_t *output, int base, const char *groupsep) { |
1052
e997862a57d8
add temporary implementations for string to number and first test cases
Mike Becker <universe@uap-core.de>
parents:
1050
diff
changeset
|
811 | assert(sizeof(long long) == sizeof(int64_t)); // should be true on all platforms |
e997862a57d8
add temporary implementations for string to number and first test cases
Mike Becker <universe@uap-core.de>
parents:
1050
diff
changeset
|
812 | return cx_strtoll_lc(str, (long long*) output, base, groupsep); |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
813 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
814 | |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
815 | #define cx_strtoX_unsigned_impl(rtype, rmax) \ |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
816 | uint64_t result; \ |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
817 | if (cx_strtou64_lc(str, &result, base, groupsep)) { \ |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
818 | return -1; \ |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
819 | } \ |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
820 | if (result > rmax) { \ |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
821 | errno = ERANGE; \ |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
822 | return -1; \ |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
823 | } \ |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
824 | *output = (rtype) result; \ |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
825 | return 0 |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
826 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
827 | int cx_strtous_lc_(cxstring str, unsigned short *output, int base, const char *groupsep) { |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
828 | cx_strtoX_unsigned_impl(unsigned short, USHRT_MAX); |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
829 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
830 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
831 | int cx_strtou_lc_(cxstring str, unsigned int *output, int base, const char *groupsep) { |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
832 | cx_strtoX_unsigned_impl(unsigned int, UINT_MAX); |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
833 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
834 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
835 | int cx_strtoul_lc_(cxstring str, unsigned long *output, int base, const char *groupsep) { |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
836 | cx_strtoX_unsigned_impl(unsigned long, ULONG_MAX); |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
837 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
838 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
839 | int cx_strtoull_lc_(cxstring str, unsigned long long *output, int base, const char *groupsep) { |
1061
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
840 | // some sanity checks |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
841 | if (str.length == 0) { |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
842 | errno = EINVAL; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
843 | return -1; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
844 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
845 | if (!(base == 2 || base == 8 || base == 10 || base == 16)) { |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
846 | errno = EINVAL; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
847 | return -1; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
848 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
849 | if (groupsep == NULL) groupsep = ""; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
850 | |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
851 | // find the actual start of the number |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
852 | if (str.ptr[0] == '+') { |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
853 | str.ptr++; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
854 | str.length--; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
855 | if (str.length == 0) { |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
856 | errno = EINVAL; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
857 | return -1; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
858 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
859 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
860 | size_t start = 0; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
861 | |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
862 | // if base is 2 or 16, some leading stuff may appear |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
863 | if (base == 2) { |
1063
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
864 | if ((str.ptr[0] | 32) == 'b') { |
1061
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
865 | start = 1; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
866 | } else if (str.ptr[0] == '0' && str.length > 1) { |
1063
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
867 | if ((str.ptr[1] | 32) == 'b') { |
1061
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
868 | start = 2; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
869 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
870 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
871 | } else if (base == 16) { |
1063
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
872 | if ((str.ptr[0] | 32) == 'x' || str.ptr[0] == '#') { |
1061
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
873 | start = 1; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
874 | } else if (str.ptr[0] == '0' && str.length > 1) { |
1063
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
875 | if ((str.ptr[1] | 32) == 'x') { |
1061
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
876 | start = 2; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
877 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
878 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
879 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
880 | |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
881 | // check if there are digits left |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
882 | if (start >= str.length) { |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
883 | errno = EINVAL; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
884 | return -1; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
885 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
886 | |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
887 | // now parse the number |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
888 | unsigned long long result = 0; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
889 | for (size_t i = start; i < str.length; i++) { |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
890 | // ignore group separators |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
891 | if (strchr(groupsep, str.ptr[i])) continue; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
892 | |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
893 | // determine the digit value of the character |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
894 | unsigned char c = str.ptr[i]; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
895 | if (c >= 'a') c = 10 + (c - 'a'); |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
896 | else if (c >= 'A') c = 10 + (c - 'A'); |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
897 | else if (c >= '0') c = c - '0'; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
898 | else c = 255; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
899 | if (c >= base) { |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
900 | errno = EINVAL; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
901 | return -1; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
902 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
903 | |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
904 | // now combine the digit with what we already have |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
905 | unsigned long right = (result & 0xff) * base + c; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
906 | unsigned long long left = (result >> 8) * base + (right >> 8); |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
907 | if (left > (ULLONG_MAX >> 8)) { |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
908 | errno = ERANGE; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
909 | return -1; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
910 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
911 | result = (left << 8) + (right & 0xff); |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
912 | } |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
913 | |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
914 | *output = result; |
c7d23892eab5
implement string to integer conversions
Mike Becker <universe@uap-core.de>
parents:
1052
diff
changeset
|
915 | return 0; |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
916 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
917 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
918 | int cx_strtou8_lc_(cxstring str, uint8_t *output, int base, const char *groupsep) { |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
919 | cx_strtoX_unsigned_impl(uint8_t, UINT8_MAX); |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
920 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
921 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
922 | int cx_strtou16_lc_(cxstring str, uint16_t *output, int base, const char *groupsep) { |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
923 | cx_strtoX_unsigned_impl(uint16_t, UINT16_MAX); |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
924 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
925 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
926 | int cx_strtou32_lc_(cxstring str, uint32_t *output, int base, const char *groupsep) { |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
927 | cx_strtoX_unsigned_impl(uint32_t, UINT32_MAX); |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
928 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
929 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
930 | int cx_strtou64_lc_(cxstring str, uint64_t *output, int base, const char *groupsep) { |
1052
e997862a57d8
add temporary implementations for string to number and first test cases
Mike Becker <universe@uap-core.de>
parents:
1050
diff
changeset
|
931 | assert(sizeof(unsigned long long) == sizeof(uint64_t)); // should be true on all platforms |
e997862a57d8
add temporary implementations for string to number and first test cases
Mike Becker <universe@uap-core.de>
parents:
1050
diff
changeset
|
932 | return cx_strtoull_lc(str, (unsigned long long*) output, base, groupsep); |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
933 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
934 | |
1162
e3bb67b72d33
remove dependency to ssize_t - fixes #552
Mike Becker <universe@uap-core.de>
parents:
1161
diff
changeset
|
935 | int cx_strtoz_lc_(cxstring str, size_t *output, int base, const char *groupsep) { |
1052
e997862a57d8
add temporary implementations for string to number and first test cases
Mike Becker <universe@uap-core.de>
parents:
1050
diff
changeset
|
936 | #if SIZE_MAX == UINT32_MAX |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
937 | return cx_strtou32_lc_(str, (uint32_t*) output, base, groupsep); |
1052
e997862a57d8
add temporary implementations for string to number and first test cases
Mike Becker <universe@uap-core.de>
parents:
1050
diff
changeset
|
938 | #elif SIZE_MAX == UINT64_MAX |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
939 | return cx_strtoull_lc_(str, (unsigned long long *) output, base, groupsep); |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
940 | #else |
1052
e997862a57d8
add temporary implementations for string to number and first test cases
Mike Becker <universe@uap-core.de>
parents:
1050
diff
changeset
|
941 | #error "unsupported size_t size" |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
942 | #endif |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
943 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
944 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
945 | int cx_strtof_lc_(cxstring str, float *output, char decsep, const char *groupsep) { |
1063
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
946 | // use string to double and add a range check |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
947 | double d; |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
948 | int ret = cx_strtod_lc_(str, &d, decsep, groupsep); |
1063
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
949 | if (ret != 0) return ret; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
950 | // note: FLT_MIN is the smallest POSITIVE number that can be represented |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
951 | double test = d < 0 ? -d : d; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
952 | if (test < FLT_MIN || test > FLT_MAX) { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
953 | errno = ERANGE; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
954 | return -1; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
955 | } |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
956 | *output = (float) d; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
957 | return 0; |
1048
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
958 | } |
12f38affefd5
implement all string to number conversions that are just wrappers
Mike Becker <universe@uap-core.de>
parents:
1041
diff
changeset
|
959 | |
1132
b7fea9b2874c
remove uses of ctype.h - temporarily fixes #577
Mike Becker <universe@uap-core.de>
parents:
1127
diff
changeset
|
960 | static bool str_isdigit(char c) { |
b7fea9b2874c
remove uses of ctype.h - temporarily fixes #577
Mike Becker <universe@uap-core.de>
parents:
1127
diff
changeset
|
961 | // TODO: remove once UCX has public API for this |
b7fea9b2874c
remove uses of ctype.h - temporarily fixes #577
Mike Becker <universe@uap-core.de>
parents:
1127
diff
changeset
|
962 | return c >= '0' && c <= '9'; |
b7fea9b2874c
remove uses of ctype.h - temporarily fixes #577
Mike Becker <universe@uap-core.de>
parents:
1127
diff
changeset
|
963 | } |
b7fea9b2874c
remove uses of ctype.h - temporarily fixes #577
Mike Becker <universe@uap-core.de>
parents:
1127
diff
changeset
|
964 | |
1134
60edcd57d54c
fix that some IDEs cannot resolve documentation
Mike Becker <universe@uap-core.de>
parents:
1132
diff
changeset
|
965 | int cx_strtod_lc_(cxstring str, double *output, char decsep, const char *groupsep) { |
1063
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
966 | // TODO: overflow check |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
967 | // TODO: increase precision |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
968 | |
1155
b77d56a27e9c
do not trim strings before conversion to number
Mike Becker <universe@uap-core.de>
parents:
1137
diff
changeset
|
969 | // emptiness check |
1063
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
970 | if (str.length == 0) { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
971 | errno = EINVAL; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
972 | return -1; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
973 | } |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
974 | |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
975 | double result = 0.; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
976 | int sign = 1; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
977 | |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
978 | // check if there is a sign |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
979 | if (str.ptr[0] == '-') { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
980 | sign = -1; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
981 | str.ptr++; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
982 | str.length--; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
983 | } else if (str.ptr[0] == '+') { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
984 | str.ptr++; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
985 | str.length--; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
986 | } |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
987 | |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
988 | // there must be at least one char to parse |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
989 | if (str.length == 0) { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
990 | errno = EINVAL; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
991 | return -1; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
992 | } |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
993 | |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
994 | // parse all digits until we find the decsep |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
995 | size_t pos = 0; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
996 | do { |
1132
b7fea9b2874c
remove uses of ctype.h - temporarily fixes #577
Mike Becker <universe@uap-core.de>
parents:
1127
diff
changeset
|
997 | if (str_isdigit(str.ptr[pos])) { |
1063
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
998 | result = result * 10 + (str.ptr[pos] - '0'); |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
999 | } else if (strchr(groupsep, str.ptr[pos]) == NULL) { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1000 | break; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1001 | } |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1002 | } while (++pos < str.length); |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1003 | |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1004 | // already done? |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1005 | if (pos == str.length) { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1006 | *output = result * sign; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1007 | return 0; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1008 | } |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1009 | |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1010 | // is the next char the decsep? |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1011 | if (str.ptr[pos] == decsep) { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1012 | pos++; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1013 | // it may end with the decsep, if it did not start with it |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1014 | if (pos == str.length) { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1015 | if (str.length == 1) { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1016 | errno = EINVAL; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1017 | return -1; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1018 | } else { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1019 | *output = result * sign; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1020 | return 0; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1021 | } |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1022 | } |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1023 | // parse everything until exponent or end |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1024 | double factor = 1.; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1025 | do { |
1132
b7fea9b2874c
remove uses of ctype.h - temporarily fixes #577
Mike Becker <universe@uap-core.de>
parents:
1127
diff
changeset
|
1026 | if (str_isdigit(str.ptr[pos])) { |
1063
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1027 | factor *= 0.1; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1028 | result = result + factor * (str.ptr[pos] - '0'); |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1029 | } else if (strchr(groupsep, str.ptr[pos]) == NULL) { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1030 | break; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1031 | } |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1032 | } while (++pos < str.length); |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1033 | } |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1034 | |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1035 | // no exponent? |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1036 | if (pos == str.length) { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1037 | *output = result * sign; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1038 | return 0; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1039 | } |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1040 | |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1041 | // now the next separator MUST be the exponent separator |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1042 | // and at least one char must follow |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1043 | if ((str.ptr[pos] | 32) != 'e' || str.length <= pos + 1) { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1044 | errno = EINVAL; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1045 | return -1; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1046 | } |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1047 | pos++; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1048 | |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1049 | // check if we have a sign for the exponent |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1050 | double factor = 10.; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1051 | if (str.ptr[pos] == '-') { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1052 | factor = .1; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1053 | pos++; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1054 | } else if (str.ptr[pos] == '+') { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1055 | pos++; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1056 | } |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1057 | |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1058 | // at least one digit must follow |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1059 | if (pos == str.length) { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1060 | errno = EINVAL; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1061 | return -1; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1062 | } |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1063 | |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1064 | // parse the exponent |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1065 | unsigned int exp = 0; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1066 | do { |
1132
b7fea9b2874c
remove uses of ctype.h - temporarily fixes #577
Mike Becker <universe@uap-core.de>
parents:
1127
diff
changeset
|
1067 | if (str_isdigit(str.ptr[pos])) { |
1063
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1068 | exp = 10 * exp + (str.ptr[pos] - '0'); |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1069 | } else if (strchr(groupsep, str.ptr[pos]) == NULL) { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1070 | errno = EINVAL; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1071 | return -1; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1072 | } |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1073 | } while (++pos < str.length); |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1074 | |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1075 | // apply the exponent by fast exponentiation |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1076 | do { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1077 | if (exp & 1) { |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1078 | result *= factor; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1079 | } |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1080 | factor *= factor; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1081 | } while ((exp >>= 1) > 0); |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1082 | |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1083 | // store the result and exit |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1084 | *output = result * sign; |
e453e717876e
implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents:
1061
diff
changeset
|
1085 | return 0; |
1074 | 1086 | } |