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 "hexBinary", //
38 : : EXESS_XSD_URI "base64Binary", //
39 : : };
40 : :
41 : : EXESS_NONBLOCKING const char*
42 : 94 : exess_datatype_uri(const ExessDatatype datatype)
43 : : {
44 [ + + ]: 89 : return (datatype > EXESS_NOTHING && datatype <= EXESS_BASE64) ? uris[datatype]
45 [ + + ]: 183 : : NULL;
46 : : }
47 : :
48 : : EXESS_NONBLOCKING const char*
49 : 43 : exess_datatype_name(const ExessDatatype datatype)
50 : : {
51 : 43 : const char* const uri = exess_datatype_uri(datatype);
52 : :
53 [ + + ]: 43 : return uri ? uri + xsd_len : NULL;
54 : : }
55 : :
56 : : EXESS_NONBLOCKING ExessDatatype
57 : 60 : exess_datatype_from_name(const char* const name)
58 : : {
59 [ + + ]: 918 : for (unsigned i = 1U; i <= EXESS_MAX_DATATYPE; ++i) {
60 [ + + ]: 910 : if (!strcmp(name, uris[i] + xsd_len)) {
61 : 52 : return (ExessDatatype)i;
62 : : }
63 : : }
64 : :
65 : 8 : return EXESS_NOTHING;
66 : : }
67 : :
68 : : EXESS_NONBLOCKING ExessDatatype
69 : 30 : exess_datatype_from_uri(const char* const uri)
70 : : {
71 : 30 : return !strncmp(uri, EXESS_XSD_URI, xsd_len)
72 : 28 : ? exess_datatype_from_name(uri + xsd_len)
73 [ + + ]: 58 : : EXESS_NOTHING;
74 : : }
|