Sun, 22 Dec 2024 22:10:04 +0100
don't trust that size_t always has word width
it should be the case on all platforms supported by UCX, but it's not strictly defined in POSIX that it must be the case
923
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1 | /* |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
3 | * |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
4 | * Copyright 2024 Mike Becker, Olaf Wintermann All rights reserved. |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
5 | * |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
8 | * |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
11 | * |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
15 | * |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
45da884269c8
add ucx2.1 style interface for a properties parser
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 |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
27 | */ |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
28 | |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
29 | #include "cx/properties.h" |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
30 | |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
31 | #include <assert.h> |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
32 | |
923
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
33 | const CxPropertiesConfig cx_properties_config_default = { |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
34 | '=', |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
35 | //'\\', |
923
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
36 | '#', |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
37 | '\0', |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
38 | '\0' |
45da884269c8
add ucx2.1 style interface for a properties parser
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
39 | }; |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
40 | |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
41 | void cxPropertiesInit( |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
42 | CxProperties *prop, |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
43 | CxPropertiesConfig config |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
44 | ) { |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
45 | memset(prop, 0, sizeof(CxProperties)); |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
46 | prop->config = config; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
47 | } |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
48 | |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
49 | void cxPropertiesDestroy(CxProperties *prop) { |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
50 | cxBufferDestroy(&prop->input); |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
51 | cxBufferDestroy(&prop->buffer); |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
52 | } |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
53 | |
972
a9a1d07a6840
add support for UCX strings in cxPropertiesFill()
Mike Becker <universe@uap-core.de>
parents:
929
diff
changeset
|
54 | int cxPropertiesFilln( |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
55 | CxProperties *prop, |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
56 | const char *buf, |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
57 | size_t len |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
58 | ) { |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
59 | if (cxBufferEof(&prop->input)) { |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
60 | // destroy a possible previously initialized buffer |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
61 | cxBufferDestroy(&prop->input); |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
62 | cxBufferInit(&prop->input, (void*) buf, len, |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
63 | NULL, CX_BUFFER_COPY_ON_WRITE | CX_BUFFER_AUTO_EXTEND); |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
64 | prop->input.size = len; |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
65 | } else { |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
66 | if (cxBufferAppend(buf, 1, len, &prop->input) < len) return -1; |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
67 | } |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
68 | return 0; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
69 | } |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
70 | |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
71 | void cxPropertiesUseStack( |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
72 | CxProperties *prop, |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
73 | char *buf, |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
74 | size_t capacity |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
75 | ) { |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
76 | cxBufferInit(&prop->buffer, buf, capacity, NULL, CX_BUFFER_COPY_ON_EXTEND); |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
77 | } |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
78 | |
928
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
79 | CxPropertiesStatus cxPropertiesNext( |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
80 | CxProperties *prop, |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
81 | cxstring *key, |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
82 | cxstring *value |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
83 | ) { |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
84 | // check if we have a text buffer |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
85 | if (prop->input.space == NULL) { |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
86 | return CX_PROPERTIES_NULL_INPUT; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
87 | } |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
88 | |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
89 | // a pointer to the buffer we want to read from |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
90 | CxBuffer *current_buffer = &prop->input; |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
91 | |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
92 | // check if we have rescued data |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
93 | if (!cxBufferEof(&prop->buffer)) { |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
94 | // check if we can now get a complete line |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
95 | cxstring input = cx_strn(prop->input.space + prop->input.pos, |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
96 | prop->input.size - prop->input.pos); |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
97 | cxstring nl = cx_strchr(input, '\n'); |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
98 | if (nl.length > 0) { |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
99 | // we add as much data to the rescue buffer as we need |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
100 | // to complete the line |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
101 | size_t len_until_nl = (size_t)(nl.ptr - input.ptr) + 1; |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
102 | |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
103 | if (cxBufferAppend(input.ptr, 1, |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
104 | len_until_nl, &prop->buffer) < len_until_nl) { |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
105 | return CX_PROPERTIES_BUFFER_ALLOC_FAILED; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
106 | } |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
107 | |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
108 | // advance the position in the input buffer |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
109 | prop->input.pos += len_until_nl; |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
110 | |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
111 | // we now want to read from the rescue buffer |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
112 | current_buffer = &prop->buffer; |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
113 | } else { |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
114 | // still not enough data, copy input buffer to internal buffer |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
115 | if (cxBufferAppend(input.ptr, 1, |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
116 | input.length, &prop->buffer) < input.length) { |
928
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
117 | return CX_PROPERTIES_BUFFER_ALLOC_FAILED; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
118 | } |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
119 | // reset the input buffer (make way for a re-fill) |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
120 | cxBufferReset(&prop->input); |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
121 | return CX_PROPERTIES_INCOMPLETE_DATA; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
122 | } |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
123 | } |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
124 | |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
125 | char comment1 = prop->config.comment1; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
126 | char comment2 = prop->config.comment2; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
127 | char comment3 = prop->config.comment3; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
128 | char delimiter = prop->config.delimiter; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
129 | |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
130 | // get one line and parse it |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
131 | while (!cxBufferEof(current_buffer)) { |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
132 | const char *buf = current_buffer->space + current_buffer->pos; |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
133 | size_t len = current_buffer->size - current_buffer->pos; |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
134 | |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
135 | /* |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
136 | * First we check if we have at least one line. We also get indices of |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
137 | * delimiter and comment chars |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
138 | */ |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
139 | size_t delimiter_index = 0; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
140 | size_t comment_index = 0; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
141 | bool has_comment = false; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
142 | |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
143 | size_t i = 0; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
144 | char c = 0; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
145 | for (; i < len; i++) { |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
146 | c = buf[i]; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
147 | if (c == comment1 || c == comment2 || c == comment3) { |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
148 | if (comment_index == 0) { |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
149 | comment_index = i; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
150 | has_comment = true; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
151 | } |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
152 | } else if (c == delimiter) { |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
153 | if (delimiter_index == 0 && !has_comment) { |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
154 | delimiter_index = i; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
155 | } |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
156 | } else if (c == '\n') { |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
157 | break; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
158 | } |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
159 | } |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
160 | |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
161 | if (c != '\n') { |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
162 | // we don't have enough data for a line, use the rescue buffer |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
163 | assert(current_buffer != &prop->buffer); |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
164 | // make sure that the rescue buffer does not already contain something |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
165 | assert(cxBufferEof(&prop->buffer)); |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
166 | if (prop->buffer.space == NULL) { |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
167 | // initialize a rescue buffer, if the user did not provide one |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
168 | cxBufferInit(&prop->buffer, NULL, 256, NULL, CX_BUFFER_AUTO_EXTEND); |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
169 | } else { |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
170 | // from a previous rescue there might be already read data |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
171 | // reset the buffer to avoid unnecessary buffer extension |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
172 | cxBufferReset(&prop->buffer); |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
173 | } |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
174 | if (cxBufferAppend(buf, 1, len, &prop->buffer) < len) { |
928
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
175 | return CX_PROPERTIES_BUFFER_ALLOC_FAILED; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
176 | } |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
177 | // reset the input buffer (make way for a re-fill) |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
178 | cxBufferReset(&prop->input); |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
179 | return CX_PROPERTIES_INCOMPLETE_DATA; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
180 | } |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
181 | |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
182 | cxstring line = has_comment ? |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
183 | cx_strn(buf, comment_index) : |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
184 | cx_strn(buf, i); |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
185 | // check line |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
186 | if (delimiter_index == 0) { |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
187 | // if line is not blank ... |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
188 | line = cx_strtrim(line); |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
189 | // ... either no delimiter found, or key is empty |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
190 | if (line.length > 0) { |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
191 | if (line.ptr[0] == delimiter) { |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
192 | return CX_PROPERTIES_INVALID_EMPTY_KEY; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
193 | } else { |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
194 | return CX_PROPERTIES_INVALID_MISSING_DELIMITER; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
195 | } |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
196 | } else { |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
197 | // skip blank line |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
198 | // if it was the rescue buffer, return to the original buffer |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
199 | if (current_buffer == &prop->buffer) { |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
200 | // assert that the rescue buffer really does not contain more data |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
201 | assert(current_buffer->pos + i + 1 == current_buffer->size); |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
202 | // reset the rescue buffer, but don't destroy it! |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
203 | cxBufferReset(&prop->buffer); |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
204 | // continue with the input buffer |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
205 | current_buffer = &prop->input; |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
206 | } else { |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
207 | // if it was the input buffer already, just advance the position |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
208 | current_buffer->pos += i + 1; |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
209 | } |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
210 | continue; |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
211 | } |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
212 | } else { |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
213 | cxstring k = cx_strn(buf, delimiter_index); |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
214 | cxstring val = cx_strn( |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
215 | buf + delimiter_index + 1, |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
216 | line.length - delimiter_index - 1); |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
217 | k = cx_strtrim(k); |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
218 | val = cx_strtrim(val); |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
219 | if (k.length > 0) { |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
220 | *key = k; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
221 | *value = val; |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
222 | current_buffer->pos += i + 1; |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
223 | assert(current_buffer->pos <= current_buffer->size); |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
224 | return CX_PROPERTIES_NO_ERROR; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
225 | } else { |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
226 | return CX_PROPERTIES_INVALID_EMPTY_KEY; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
227 | } |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
228 | } |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
229 | // unreachable - either we returned or skipped a blank line |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
230 | assert(false); |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
231 | } |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
232 | |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
233 | // when we come to this point, all data must have been read |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
234 | assert(cxBufferEof(&prop->buffer)); |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
235 | assert(cxBufferEof(&prop->input)); |
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
236 | |
924
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
237 | return CX_PROPERTIES_NO_DATA; |
3c90dfc35f06
add implementation for the properties parser
Mike Becker <universe@uap-core.de>
parents:
923
diff
changeset
|
238 | } |
928
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
239 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
240 | static int cx_properties_sink_map( |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
972
diff
changeset
|
241 | cx_attr_unused CxProperties *prop, |
928
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
242 | CxPropertiesSink *sink, |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
243 | cxstring key, |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
244 | cxstring value |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
245 | ) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
246 | CxMap *map = sink->sink; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
247 | CxAllocator *alloc = sink->data; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
248 | cxmutstr v = cx_strdup_a(alloc, value); |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
249 | int r = cx_map_put_cxstr(map, key, v.ptr); |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
250 | if (r != 0) cx_strfree_a(alloc, &v); |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
251 | return r; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
252 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
253 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
254 | CxPropertiesSink cxPropertiesMapSink(CxMap *map) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
255 | CxPropertiesSink sink; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
256 | sink.sink = map; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
257 | sink.data = cxDefaultAllocator; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
258 | sink.sink_func = cx_properties_sink_map; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
259 | return sink; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
260 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
261 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
262 | static int cx_properties_read_string( |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
263 | CxProperties *prop, |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
264 | CxPropertiesSource *src, |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
265 | cxstring *target |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
266 | ) { |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
267 | if (prop->input.space == src->src) { |
928
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
268 | // when the input buffer already contains the string |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
269 | // we have nothing more to provide |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
270 | target->length = 0; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
271 | } else { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
272 | target->ptr = src->src; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
273 | target->length = src->data_size; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
274 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
275 | return 0; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
276 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
277 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
278 | static int cx_properties_read_file( |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
972
diff
changeset
|
279 | cx_attr_unused CxProperties *prop, |
928
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
280 | CxPropertiesSource *src, |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
281 | cxstring *target |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
282 | ) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
283 | target->ptr = src->data_ptr; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
284 | target->length = fread(src->data_ptr, 1, src->data_size, src->src); |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
285 | return ferror(src->src); |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
286 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
287 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
288 | static int cx_properties_read_init_file( |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
972
diff
changeset
|
289 | cx_attr_unused CxProperties *prop, |
928
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
290 | CxPropertiesSource *src |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
291 | ) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
292 | src->data_ptr = malloc(src->data_size); |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
293 | if (src->data_ptr == NULL) return 1; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
294 | return 0; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
295 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
296 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
297 | static void cx_properties_read_clean_file( |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
972
diff
changeset
|
298 | cx_attr_unused CxProperties *prop, |
928
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
299 | CxPropertiesSource *src |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
300 | ) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
301 | free(src->data_ptr); |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
302 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
303 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
304 | CxPropertiesSource cxPropertiesStringSource(cxstring str) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
305 | CxPropertiesSource src; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
306 | src.src = (void*) str.ptr; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
307 | src.data_size = str.length; |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
308 | src.data_ptr = NULL; |
928
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
309 | src.read_func = cx_properties_read_string; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
310 | src.read_init_func = NULL; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
311 | src.read_clean_func = NULL; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
312 | return src; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
313 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
314 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
315 | CxPropertiesSource cxPropertiesCstrnSource(const char *str, size_t len) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
316 | CxPropertiesSource src; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
317 | src.src = (void*) str; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
318 | src.data_size = len; |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
319 | src.data_ptr = NULL; |
928
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
320 | src.read_func = cx_properties_read_string; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
321 | src.read_init_func = NULL; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
322 | src.read_clean_func = NULL; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
323 | return src; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
324 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
325 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
326 | CxPropertiesSource cxPropertiesCstrSource(const char *str) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
327 | CxPropertiesSource src; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
328 | src.src = (void*) str; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
329 | src.data_size = strlen(str); |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
330 | src.data_ptr = NULL; |
928
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
331 | src.read_func = cx_properties_read_string; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
332 | src.read_init_func = NULL; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
333 | src.read_clean_func = NULL; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
334 | return src; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
335 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
336 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
337 | CxPropertiesSource cxPropertiesFileSource(FILE *file, size_t chunk_size) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
338 | CxPropertiesSource src; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
339 | src.src = file; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
340 | src.data_size = chunk_size; |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
341 | src.data_ptr = NULL; |
928
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
342 | src.read_func = cx_properties_read_file; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
343 | src.read_init_func = cx_properties_read_init_file; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
344 | src.read_clean_func = cx_properties_read_clean_file; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
345 | return src; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
346 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
347 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
348 | CxPropertiesStatus cxPropertiesLoad( |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
349 | CxProperties *prop, |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
350 | CxPropertiesSink sink, |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
351 | CxPropertiesSource source |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
352 | ) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
353 | assert(source.read_func != NULL); |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
354 | assert(sink.sink_func != NULL); |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
355 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
356 | // initialize reader |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
357 | if (source.read_init_func != NULL) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
358 | if (source.read_init_func(prop, &source)) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
359 | return CX_PROPERTIES_READ_INIT_FAILED; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
360 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
361 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
362 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
363 | // transfer the data from the source to the sink |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
364 | CxPropertiesStatus status; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
365 | bool found = false; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
366 | while (true) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
367 | // read input |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
368 | cxstring input; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
369 | if (source.read_func(prop, &source, &input)) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
370 | status = CX_PROPERTIES_READ_FAILED; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
371 | break; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
372 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
373 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
374 | // no more data - break |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
375 | if (input.length == 0) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
376 | status = found ? CX_PROPERTIES_NO_ERROR : CX_PROPERTIES_NO_DATA; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
377 | break; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
378 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
379 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
380 | // set the input buffer and read the k/v-pairs |
1031
8a90552bba29
rework of properties parser - fixes #529 and resolves #458
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
381 | cxPropertiesFill(prop, input); |
928
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
382 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
383 | CxPropertiesStatus kv_status; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
384 | do { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
385 | cxstring key, value; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
386 | kv_status = cxPropertiesNext(prop, &key, &value); |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
387 | if (kv_status == CX_PROPERTIES_NO_ERROR) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
388 | found = true; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
389 | if (sink.sink_func(prop, &sink, key, value)) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
390 | kv_status = CX_PROPERTIES_SINK_FAILED; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
391 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
392 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
393 | } while (kv_status == CX_PROPERTIES_NO_ERROR); |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
394 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
395 | if (kv_status > CX_PROPERTIES_OK) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
396 | status = kv_status; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
397 | break; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
398 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
399 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
400 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
401 | if (source.read_clean_func != NULL) { |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
402 | source.read_clean_func(prop, &source); |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
403 | } |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
404 | |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
405 | return status; |
d2d42cb1d59e
add source/sink facility for properties - fixes #430
Mike Becker <universe@uap-core.de>
parents:
924
diff
changeset
|
406 | } |