File Coverage

tstr_format.h
Criterion Covered Total %
statement 51 52 98.0
branch 2 4 50.0
condition n/a
subroutine n/a
pod n/a
total 53 56 94.6


line stmt bran cond sub pod time code
1             #ifndef TSTR_FORMAT_H
2             #define TSTR_FORMAT_H
3              
4             #include
5             #include
6             #include
7             #include "tstr_packed_alnum.h"
8              
9             typedef enum {
10             TSTR_FORMAT_UNKNOWN = 0,
11             TSTR_FORMAT_ANSIC,
12             TSTR_FORMAT_ASN1GT,
13             TSTR_FORMAT_ASN1UT,
14             TSTR_FORMAT_CLF,
15             TSTR_FORMAT_DATETIME,
16             TSTR_FORMAT_ECMASCRIPT,
17             TSTR_FORMAT_GITDATE,
18             TSTR_FORMAT_ISO8601,
19             TSTR_FORMAT_ISO9075,
20             TSTR_FORMAT_RFC2616,
21             TSTR_FORMAT_RFC2822,
22             TSTR_FORMAT_RFC2822FWS,
23             TSTR_FORMAT_RFC3339,
24             TSTR_FORMAT_RFC3501,
25             TSTR_FORMAT_RFC4287,
26             TSTR_FORMAT_RFC5280,
27             TSTR_FORMAT_RFC5545,
28             TSTR_FORMAT_RFC9557,
29             TSTR_FORMAT_RUBYDATE,
30             TSTR_FORMAT_UNIXDATE,
31             TSTR_FORMAT_UNIXSTAMP,
32             TSTR_FORMAT_W3CDTF,
33             TSTR_FORMAT_TYPE_COUNT,
34             } tstr_format_t;
35              
36             static inline bool tstr_format_is_known(tstr_format_t fmt) {
37             return (fmt > TSTR_FORMAT_UNKNOWN && fmt < TSTR_FORMAT_TYPE_COUNT);
38             }
39              
40             static inline const char * tstr_format_name(tstr_format_t fmt) {
41             static const char * kFormatName[TSTR_FORMAT_TYPE_COUNT] = {
42             [TSTR_FORMAT_UNKNOWN] = "Unknown",
43             [TSTR_FORMAT_ANSIC] = "ANSIC",
44             [TSTR_FORMAT_ASN1GT] = "ASN.1 GeneralizedTime",
45             [TSTR_FORMAT_ASN1UT] = "ASN.1 UTCTime",
46             [TSTR_FORMAT_CLF] = "Common Log Format",
47             [TSTR_FORMAT_DATETIME] = "DateTime",
48             [TSTR_FORMAT_ECMASCRIPT] = "ECMAScript",
49             [TSTR_FORMAT_GITDATE] = "GitDate",
50             [TSTR_FORMAT_ISO8601] = "ISO 8601",
51             [TSTR_FORMAT_ISO9075] = "ISO 9075",
52             [TSTR_FORMAT_RFC2616] = "RFC 2616",
53             [TSTR_FORMAT_RFC2822] = "RFC 2822",
54             [TSTR_FORMAT_RFC2822FWS] = "RFC 2822 (Folding WS)",
55             [TSTR_FORMAT_RFC3339] = "RFC 3339",
56             [TSTR_FORMAT_RFC3501] = "RFC 3501",
57             [TSTR_FORMAT_RFC4287] = "RFC 4287",
58             [TSTR_FORMAT_RFC5280] = "RFC 5280",
59             [TSTR_FORMAT_RFC5545] = "RFC 5545",
60             [TSTR_FORMAT_RFC9557] = "RFC 9557",
61             [TSTR_FORMAT_RUBYDATE] = "RubyDate",
62             [TSTR_FORMAT_UNIXDATE] = "UnixDate",
63             [TSTR_FORMAT_UNIXSTAMP] = "UnixStamp",
64             [TSTR_FORMAT_W3CDTF] = "W3CDTF",
65             };
66              
67             if (!tstr_format_is_known(fmt))
68             fmt = TSTR_FORMAT_UNKNOWN;
69             return kFormatName[fmt];
70             }
71              
72 1602           static inline tstr_format_t tstr_format_from_packed_alnum(uint64_t packed) {
73 1602           switch (packed) {
74 34           case TSTR_PACKED_ALNUM5('A','N','S','I','C'):
75             case TSTR_PACKED_ALNUM5('C','T','I','M','E'):
76 34           return TSTR_FORMAT_ANSIC;
77 142           case TSTR_PACKED_ALNUM6('A','S','N','1','G','T'):
78 142           return TSTR_FORMAT_ASN1GT;
79 59           case TSTR_PACKED_ALNUM6('A','S','N','1','U','T'):
80 59           return TSTR_FORMAT_ASN1UT;
81 61           case TSTR_PACKED_ALNUM3('C','L','F'):
82 61           return TSTR_FORMAT_CLF;
83 221           case TSTR_PACKED_ALNUM8('D','A','T','E','T','I','M','E'):
84             case TSTR_PACKED_ALNUM7('G','E','N','E','R','I','C'):
85 221           return TSTR_FORMAT_DATETIME;
86 57           case TSTR_PACKED_ALNUM10('E','C','M','A','S','C','R','I','P','T'):
87             case TSTR_PACKED_ALNUM10('J','A','V','A','S','C','R','I','P','T'):
88 57           return TSTR_FORMAT_ECMASCRIPT;
89 41           case TSTR_PACKED_ALNUM7('G','I','T','D','A','T','E'):
90             case TSTR_PACKED_ALNUM3('G','I','T'):
91 41           return TSTR_FORMAT_GITDATE;
92 121           case TSTR_PACKED_ALNUM7('I','S','O','8','6','0','1'):
93 121           return TSTR_FORMAT_ISO8601;
94 68           case TSTR_PACKED_ALNUM7('I','S','O','9','0','7','5'):
95             case TSTR_PACKED_ALNUM3('S','Q','L'):
96 68           return TSTR_FORMAT_ISO9075;
97 44           case TSTR_PACKED_ALNUM7('R','F','C','2','6','1','6'):
98             case TSTR_PACKED_ALNUM7('R','F','C','7','2','3','1'):
99             case TSTR_PACKED_ALNUM4('H','T','T','P'):
100 44           return TSTR_FORMAT_RFC2616;
101 56           case TSTR_PACKED_ALNUM7('R','F','C','2','8','2','2'):
102             case TSTR_PACKED_ALNUM7('R','F','C','5','3','2','2'):
103             case TSTR_PACKED_ALNUM5('E','M','A','I','L'):
104             case TSTR_PACKED_ALNUM3('I','M','F'):
105 56           return TSTR_FORMAT_RFC2822;
106 24           case TSTR_PACKED_ALNUM10('R','F','C','2','8','2','2','F','W','S'):
107 24           return TSTR_FORMAT_RFC2822FWS;
108 123           case TSTR_PACKED_ALNUM7('R','F','C','3','3','3','9'):
109 123           return TSTR_FORMAT_RFC3339;
110 54           case TSTR_PACKED_ALNUM7('R','F','C','3','5','0','1'):
111             case TSTR_PACKED_ALNUM7('R','F','C','9','0','5','1'):
112             case TSTR_PACKED_ALNUM4('I','M','A','P'):
113 54           return TSTR_FORMAT_RFC3501;
114 45           case TSTR_PACKED_ALNUM7('R','F','C','4','2','8','7'):
115             case TSTR_PACKED_ALNUM4('A','T','O','M'):
116 45           return TSTR_FORMAT_RFC4287;
117 42           case TSTR_PACKED_ALNUM7('R','F','C','5','2','8','0'):
118             case TSTR_PACKED_ALNUM4('X','5','0','9'):
119 42           return TSTR_FORMAT_RFC5280;
120 39           case TSTR_PACKED_ALNUM7('R','F','C','5','5','4','5'):
121             case TSTR_PACKED_ALNUM4('I','C','A','L'):
122 39           return TSTR_FORMAT_RFC5545;
123 74           case TSTR_PACKED_ALNUM7('R','F','C','9','5','5','7'):
124             case TSTR_PACKED_ALNUM5('I','X','D','T','F'):
125 74           return TSTR_FORMAT_RFC9557;
126 40           case TSTR_PACKED_ALNUM8('R','U','B','Y','D','A','T','E'):
127             case TSTR_PACKED_ALNUM4('R','U','B','Y'):
128 40           return TSTR_FORMAT_RUBYDATE;
129 47           case TSTR_PACKED_ALNUM8('U','N','I','X','D','A','T','E'):
130             case TSTR_PACKED_ALNUM4('U','N','I','X'):
131 47           return TSTR_FORMAT_UNIXDATE;
132 77           case TSTR_PACKED_ALNUM9('U','N','I','X','S','T','A','M','P'):
133 77           return TSTR_FORMAT_UNIXSTAMP;
134 131           case TSTR_PACKED_ALNUM6('W','3','C','D','T','F'):
135             case TSTR_PACKED_ALNUM3('W','3','C'):
136 131           return TSTR_FORMAT_W3CDTF;
137 2           default:
138 2           return TSTR_FORMAT_UNKNOWN;
139             }
140             }
141              
142 1602           static inline tstr_format_t tstr_format_from_string(const char* src,
143             size_t len) {
144             uint64_t packed;
145              
146 1602 50         if (!len || tstr_packed_alnum_encode(src, len, &packed) != len)
    50          
147 0           return TSTR_FORMAT_UNKNOWN;
148 1602           return tstr_format_from_packed_alnum(packed);
149             }
150              
151             #endif /* TSTR_FORMAT_H */