Branch data Line data Source code
1 : : // Copyright 2019-2026 David Robillard <d@drobilla.net>
2 : : // SPDX-License-Identifier: ISC
3 : :
4 : : #include <exess/exess.h>
5 : :
6 : : #include <string.h>
7 : :
8 : : static const size_t xsd_len = sizeof(EXESS_XSD_URI) - 1U;
9 : :
10 : : /// The full URI for supported datatypes
11 : : static const char* EXESS_NONNULL const uris[EXESS_MAX_DATATYPE + 1U] = {
12 : : NULL, //
13 : : EXESS_XSD_URI "boolean", //
14 : : EXESS_XSD_URI "double", //
15 : : EXESS_XSD_URI "float", //
16 : : EXESS_XSD_URI "long", //
17 : : EXESS_XSD_URI "int", //
18 : : EXESS_XSD_URI "short", //
19 : : EXESS_XSD_URI "byte", //
20 : : EXESS_XSD_URI "unsignedLong", //
21 : : EXESS_XSD_URI "unsignedInt", //
22 : : EXESS_XSD_URI "unsignedShort", //
23 : : EXESS_XSD_URI "unsignedByte", //
24 : : EXESS_XSD_URI "decimal", //
25 : : EXESS_XSD_URI "integer", //
26 : : EXESS_XSD_URI "nonPositiveInteger", //
27 : : EXESS_XSD_URI "negativeInteger", //
28 : : EXESS_XSD_URI "nonNegativeInteger", //
29 : : EXESS_XSD_URI "positiveInteger", //
30 : : EXESS_XSD_URI "duration", //
31 : : EXESS_XSD_URI "yearMonthDuration", //
32 : : EXESS_XSD_URI "dayTimeDuration", //
33 : : EXESS_XSD_URI "dateTime", //
34 : : EXESS_XSD_URI "dateTimeStamp", //
35 : : EXESS_XSD_URI "time", //
36 : : EXESS_XSD_URI "date", //
37 : : EXESS_XSD_URI "gYearMonth", //
38 : : EXESS_XSD_URI "gYear", //
39 : : EXESS_XSD_URI "gMonthDay", //
40 : : EXESS_XSD_URI "gDay", //
41 : : EXESS_XSD_URI "gMonth", //
42 : : EXESS_XSD_URI "hexBinary", //
43 : : EXESS_XSD_URI "base64Binary", //
44 : : };
45 : :
46 : : EXESS_NONBLOCKING const char*
47 : 104 : exess_datatype_uri(const ExessDatatype datatype)
48 : : {
49 [ + + ]: 99 : return (datatype > EXESS_NOTHING && datatype <= EXESS_BASE64) ? uris[datatype]
50 [ + + ]: 203 : : NULL;
51 : : }
52 : :
53 : : EXESS_NONBLOCKING const char*
54 : 48 : exess_datatype_name(const ExessDatatype datatype)
55 : : {
56 : 48 : const char* const uri = exess_datatype_uri(datatype);
57 : :
58 [ + + ]: 48 : return uri ? uri + xsd_len : NULL;
59 : : }
60 : :
61 : : EXESS_NONBLOCKING ExessDatatype
62 : 70 : exess_datatype_from_name(const char* const name)
63 : : {
64 [ + + ]: 1248 : for (unsigned i = 1U; i <= EXESS_MAX_DATATYPE; ++i) {
65 [ + + ]: 1240 : if (!strcmp(name, uris[i] + xsd_len)) {
66 : 62 : return (ExessDatatype)i;
67 : : }
68 : : }
69 : :
70 : 8 : return EXESS_NOTHING;
71 : : }
72 : :
73 : : EXESS_NONBLOCKING ExessDatatype
74 : 35 : exess_datatype_from_uri(const char* const uri)
75 : : {
76 : 35 : return !strncmp(uri, EXESS_XSD_URI, xsd_len)
77 : 33 : ? exess_datatype_from_name(uri + xsd_len)
78 [ + + ]: 68 : : EXESS_NOTHING;
79 : : }
|