CharacterSet.cc
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2017 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 <iostream>
14 #include <functional>
15 
18 {
19  Storage::const_iterator s = src.chars_.begin();
20  const Storage::const_iterator e = src.chars_.end();
21  Storage::iterator d = chars_.begin();
22  while (s != e) {
23  if (*s)
24  *d = 1;
25  ++s;
26  ++d;
27  }
28  return *this;
29 }
30 
33 {
34  Storage::const_iterator s = src.chars_.begin();
35  const Storage::const_iterator e = src.chars_.end();
36  Storage::iterator d = chars_.begin();
37  while (s != e) {
38  if (*s)
39  *d = 0;
40  ++s;
41  ++d;
42  }
43  return *this;
44 }
45 
47 CharacterSet::add(const unsigned char c)
48 {
49  chars_[static_cast<uint8_t>(c)] = 1;
50  return *this;
51 }
52 
54 CharacterSet::addRange(unsigned char low, unsigned char high)
55 {
56  //manual loop splitting is needed to cover case where high is 255
57  // otherwise low will wrap, resulting in infinite loop
58  while (low < high) {
59  chars_[static_cast<uint8_t>(low)] = 1;
60  ++low;
61  }
62  chars_[static_cast<uint8_t>(high)] = 1;
63  return *this;
64 }
65 
67 CharacterSet::complement(const char *label) const
68 {
69  CharacterSet result((label ? label : "complement_of_some_other_set"), "");
70  // negate each of our elements and add them to the result storage
71  std::transform(chars_.begin(), chars_.end(), result.chars_.begin(),
72  std::logical_not<Storage::value_type>());
73  return result;
74 }
75 
76 CharacterSet::CharacterSet(const char *label, const char * const c) :
77  name(label ? label: "anonymous"),
78  chars_(Storage(256,0))
79 {
80  const size_t clen = strlen(c);
81  for (size_t i = 0; i < clen; ++i)
82  add(c[i]);
83 }
84 
85 CharacterSet::CharacterSet(const char *label, unsigned char low, unsigned char high) :
86  name(label ? label: "anonymous"),
87  chars_(Storage(256,0))
88 {
89  addRange(low,high);
90 }
91 
92 CharacterSet::CharacterSet(const char *label, std::initializer_list<std::pair<uint8_t, uint8_t>> ranges) :
93  name(label ? label: "anonymous"),
94  chars_(Storage(256,0))
95 {
96  for (auto range: ranges)
97  addRange(range.first, range.second);
98 }
99 
100 void
101 CharacterSet::printChars(std::ostream &os) const
102 {
103  for (size_t idx = 0; idx < 256; ++idx) {
104  if (chars_[idx])
105  os << static_cast<char>(idx);
106  }
107 }
108 
111 {
112  lhs += rhs;
113  return lhs;
114 }
115 
118 {
119  lhs -= rhs;
120  return lhs;
121 }
122 
123 std::ostream&
124 operator <<(std::ostream &s, const CharacterSet &c)
125 {
126  s << "CharacterSet(" << c.name << ')';
127  return s;
128 }
129 
130 const CharacterSet
131 // RFC 5234
132 CharacterSet::ALPHA("ALPHA", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"),
133  CharacterSet::BIT("BIT","01"),
134  CharacterSet::CR("CR","\r"),
135 CharacterSet::CTL("CTL", {{0x01,0x1f},{0x7f,0x7f}}),
136 CharacterSet::DIGIT("DIGIT","0123456789"),
137 CharacterSet::DQUOTE("DQUOTE","\""),
138 CharacterSet::HEXDIG("HEXDIG","0123456789aAbBcCdDeEfF"),
139 CharacterSet::HTAB("HTAB","\t"),
140 CharacterSet::LF("LF","\n"),
141 CharacterSet::SP("SP"," "),
142 CharacterSet::VCHAR("VCHAR", 0x21, 0x7e),
143 // RFC 7230
144 CharacterSet::WSP("WSP"," \t"),
145 CharacterSet::CTEXT("ctext", {{0x09,0x09},{0x20,0x20},{0x2a,0x5b},{0x5d,0x7e},{0x80,0xff}}),
146 CharacterSet::TCHAR("TCHAR","!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"),
147 CharacterSet::SPECIAL("SPECIAL","()<>@,;:\\\"/[]?={}"),
148 CharacterSet::QDTEXT("QDTEXT", {{0x09,0x09},{0x20,0x21},{0x23,0x5b},{0x5d,0x7e},{0x80,0xff}}),
149 CharacterSet::OBSTEXT("OBSTEXT",0x80,0xff),
150 // RFC 7232
151 CharacterSet::ETAGC("ETAGC", {{0x21,0x21},{0x23,0x7e},{0x80,0xff}}),
152 // RFC 7235
153 CharacterSet::TOKEN68C("TOKEN68C","-._~+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
154 ;
155 
const char * name
optional set label for debugging (default: "anonymous")
Definition: CharacterSet.h:69
void printChars(std::ostream &os) const
prints all chars in arbitrary order, without any quoting/escaping
static const CharacterSet LF
Definition: CharacterSet.h:89
CharacterSet & operator+=(const CharacterSet &rhs)
set addition: add to this set all characters that are also in rhs
Definition: CharacterSet.cc:17
static const CharacterSet ETAGC
Definition: CharacterSet.h:112
int i
Definition: membanger.c:49
static const CharacterSet DQUOTE
Definition: CharacterSet.h:83
CharacterSet operator+(CharacterSet lhs, const CharacterSet &rhs)
static const CharacterSet CTEXT
Definition: CharacterSet.h:99
static const CharacterSet ALPHA
Definition: CharacterSet.h:73
static const CharacterSet TCHAR
Definition: CharacterSet.h:102
static const CharacterSet HEXDIG
Definition: CharacterSet.h:85
CharacterSet & add(const unsigned char c)
add a given character to the character set
Definition: CharacterSet.cc:47
static const CharacterSet WSP
Definition: CharacterSet.h:95
static const CharacterSet VCHAR
Definition: CharacterSet.h:93
std::ostream & operator<<(std::ostream &s, const CharacterSet &c)
static const CharacterSet DIGIT
Definition: CharacterSet.h:81
std::vector< uint8_t > Storage
Definition: CharacterSet.h:20
static const CharacterSet HTAB
Definition: CharacterSet.h:87
static const CharacterSet CR
Definition: CharacterSet.h:77
static const CharacterSet SPECIAL
Definition: CharacterSet.h:104
optimized set of C chars, with quick membership test and merge support
Definition: CharacterSet.h:17
CharacterSet & operator-=(const CharacterSet &rhs)
set subtraction: remove all characters that are also in rhs
Definition: CharacterSet.cc:32
Storage chars_
Definition: CharacterSet.h:124
CharacterSet & addRange(unsigned char low, unsigned char high)
add a list of character ranges, expressed as pairs [low,high], including both ends ...
Definition: CharacterSet.cc:54
static const CharacterSet QDTEXT
Definition: CharacterSet.h:106
static const CharacterSet BIT
Definition: CharacterSet.h:75
static const CharacterSet SP
Definition: CharacterSet.h:91
static const CharacterSet CTL
Definition: CharacterSet.h:79
static const CharacterSet OBSTEXT
Definition: CharacterSet.h:108
CharacterSet operator-(CharacterSet lhs, const CharacterSet &rhs)
CharacterSet complement(const char *complementLabel=nullptr) const
Definition: CharacterSet.cc:67
CharacterSet(const char *label="anonymous", const char *const chars="")
a character set with a given label and contents
Definition: CharacterSet.cc:76
static const CharacterSet TOKEN68C
Definition: CharacterSet.h:116

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors