]> git.ipfire.org Git - thirdparty/squid.git/blob - src/base/CharacterSet.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / base / CharacterSet.cc
1 /*
2 * Copyright (C) 1996-2016 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9 #include "squid.h"
10 #include "CharacterSet.h"
11
12 #include <algorithm>
13 #include <functional>
14
15 CharacterSet &
16 CharacterSet::operator +=(const CharacterSet &src)
17 {
18 Storage::const_iterator s = src.chars_.begin();
19 const Storage::const_iterator e = src.chars_.end();
20 Storage::iterator d = chars_.begin();
21 while (s != e) {
22 if (*s)
23 *d = 1;
24 ++s;
25 ++d;
26 }
27 return *this;
28 }
29
30 CharacterSet
31 CharacterSet::operator +(const CharacterSet &src) const
32 {
33 CharacterSet rv(*this);
34 rv += src;
35 return rv;
36 }
37
38 CharacterSet &
39 CharacterSet::add(const unsigned char c)
40 {
41 chars_[static_cast<uint8_t>(c)] = 1;
42 return *this;
43 }
44
45 CharacterSet &
46 CharacterSet::addRange(unsigned char low, unsigned char high)
47 {
48 //manual loop splitting is needed to cover case where high is 255
49 // otherwise low will wrap, resulting in infinite loop
50 while (low < high) {
51 chars_[static_cast<uint8_t>(low)] = 1;
52 ++low;
53 }
54 chars_[static_cast<uint8_t>(high)] = 1;
55 return *this;
56 }
57
58 CharacterSet
59 CharacterSet::complement(const char *label) const
60 {
61 CharacterSet result((label ? label : "complement_of_some_other_set"), "");
62 // negate each of our elements and add them to the result storage
63 std::transform(chars_.begin(), chars_.end(), result.chars_.begin(),
64 std::logical_not<Storage::value_type>());
65 return result;
66 }
67
68 CharacterSet::CharacterSet(const char *label, const char * const c) :
69 name(label == NULL ? "anonymous" : label),
70 chars_(Storage(256,0))
71 {
72 const size_t clen = strlen(c);
73 for (size_t i = 0; i < clen; ++i)
74 add(c[i]);
75 }
76
77 CharacterSet::CharacterSet(const char *label, unsigned char low, unsigned char high) :
78 name(label == NULL ? "anonymous" : label),
79 chars_(Storage(256,0))
80 {
81 addRange(low,high);
82 }
83
84 const CharacterSet
85 // RFC 5234
86 CharacterSet::ALPHA("ALPHA", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"),
87 CharacterSet::BIT("BIT","01"),
88 CharacterSet::CR("CR","\r"),
89 #if __cplusplus == 201103L
90 //CharacterSet::CTL("CTL",{{0x01,0x1f},{0x7f,0x7f}}),
91 #endif
92 CharacterSet::DIGIT("DIGIT","0123456789"),
93 CharacterSet::DQUOTE("DQUOTE","\""),
94 CharacterSet::HEXDIG("HEXDIG","0123456789aAbBcCdDeEfF"),
95 CharacterSet::HTAB("HTAB","\t"),
96 CharacterSet::LF("LF","\n"),
97 CharacterSet::SP("SP"," "),
98 CharacterSet::VCHAR("VCHAR", 0x21, 0x7e),
99 // RFC 7230
100 CharacterSet::WSP("WSP"," \t"),
101 #if __cplusplus == 201103L
102 //CharacterSet::CTEXT("ctext",{{0x09,0x09},{0x20,0x20},{0x2a,0x5b},{0x5d,0x7e},{0x80,0xff}}),
103 #endif
104 CharacterSet::TCHAR("TCHAR","!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"),
105 CharacterSet::SPECIAL("SPECIAL","()<>@,;:\\\"/[]?={}"),
106 #if __cplusplus == 201103L
107 //CharacterSet::QDTEXT("QDTEXT",{{0x09,0x09},{0x20,0x21},{0x23,0x5b},{0x5d,0x7e},{0x80,0xff}}),
108 #endif
109 CharacterSet::OBSTEXT("OBSTEXT",0x80,0xff),
110 // RFC 7232
111 #if __cplusplus == 201103L
112 //CharacterSet::ETAGC("ETAGC",{{0x21,0x21},{0x23,0x7e},{0x80,0xff}}),
113 #endif
114 // RFC 7235
115 CharacterSet::TOKEN68C("TOKEN68C","-._~+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
116 ;
117