ucx/map.c

Sun, 17 Dec 2023 15:33:50 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 17 Dec 2023 15:33:50 +0100
changeset 800
30d484806c2b
parent 750
4d7a2238c5ac
child 816
839fefbdedc7
permissions
-rw-r--r--

fix faulty string to int conversion utilities

Probably it was expected that errno is set to EINVAL when illegal characters are encountered. But this is not standard and does not happen on every system, allowing illegal strings to be parsed as valid integers.

750
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2023 Mike Becker, Olaf Wintermann All rights reserved.
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include "cx/map.h"
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 #include <string.h>
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 // <editor-fold desc="empty map implementation">
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34 static void cx_empty_map_noop(__attribute__((__unused__)) CxMap *map) {
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 // this is a noop, but MUST be implemented
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 }
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 static void *cx_empty_map_get(
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 __attribute__((__unused__)) CxMap const *map,
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 __attribute__((__unused__)) CxHashKey key
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 ) {
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 return NULL;
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 }
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 static bool cx_empty_map_iter_valid(__attribute__((__unused__)) void const *iter) {
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 return false;
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 }
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 static CxIterator cx_empty_map_iterator(
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 struct cx_map_s const *map,
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 __attribute__((__unused__)) enum cx_map_iterator_type type
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 ) {
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 CxIterator iter = {0};
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 iter.src_handle = map;
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 iter.base.valid = cx_empty_map_iter_valid;
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56 return iter;
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57 }
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59 static struct cx_map_class_s cx_empty_map_class = {
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60 cx_empty_map_noop,
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61 cx_empty_map_noop,
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62 NULL,
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 cx_empty_map_get,
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 NULL,
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 cx_empty_map_iterator
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66 };
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68 CxMap cx_empty_map = {
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69 NULL,
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 NULL,
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 0,
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72 0,
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 NULL,
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 NULL,
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 NULL,
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 false,
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 &cx_empty_map_class
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 };
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 CxMap *const cxEmptyMap = &cx_empty_map;
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 // </editor-fold>
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84 CxMutIterator cxMapMutIteratorValues(CxMap *map) {
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85 CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_VALUES);
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86 it.base.mutating = true;
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
88 // we know the iterators share the same memory layout
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 CxMutIterator iter;
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90 memcpy(&iter, &it, sizeof(CxMutIterator));
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 return iter;
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 }
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
94 CxMutIterator cxMapMutIteratorKeys(CxMap *map) {
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95 CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_KEYS);
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96 it.base.mutating = true;
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 // we know the iterators share the same memory layout
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 CxMutIterator iter;
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 memcpy(&iter, &it, sizeof(CxMutIterator));
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 return iter;
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 }
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 CxMutIterator cxMapMutIterator(CxMap *map) {
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105 CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_PAIRS);
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 it.base.mutating = true;
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108 // we know the iterators share the same memory layout
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109 CxMutIterator iter;
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110 memcpy(&iter, &it, sizeof(CxMutIterator));
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 return iter;
4d7a2238c5ac update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112 }

mercurial