BDE 4.39.x Production Release
Loading...
Searching...
No Matches
bdlde_quotedprintabledecoder.h
Go to the documentation of this file.
1/// @file bdlde_quotedprintabledecoder.h
2///
3/// The content of this file has been pre-processed for Doxygen.
4///
5
6
7// bdlde_quotedprintabledecoder.h -*-C++-*-
8#ifndef INCLUDED_BDLDE_QUOTEDPRINTABLEDECODER
9#define INCLUDED_BDLDE_QUOTEDPRINTABLEDECODER
10
11#include <bsls_ident.h>
12BSLS_IDENT("$Id: $")
13
14/// @defgroup bdlde_quotedprintabledecoder bdlde_quotedprintabledecoder
15/// @brief Provide automata converting to and from Quoted-Printable encodings.
16/// @addtogroup bdl
17/// @{
18/// @addtogroup bdlde
19/// @{
20/// @addtogroup bdlde_quotedprintabledecoder
21/// @{
22///
23/// <h1> Outline </h1>
24/// * <a href="#bdlde_quotedprintabledecoder-purpose"> Purpose</a>
25/// * <a href="#bdlde_quotedprintabledecoder-classes"> Classes </a>
26/// * <a href="#bdlde_quotedprintabledecoder-description"> Description </a>
27/// * <a href="#bdlde_quotedprintabledecoder-quoted-printable-decoding"> Quoted-Printable Decoding </a>
28/// * <a href="#bdlde_quotedprintabledecoder-usage"> Usage </a>
29/// * <a href="#bdlde_quotedprintabledecoder-example-1-basic-usage"> Example 1: Basic Usage </a>
30///
31/// # Purpose {#bdlde_quotedprintabledecoder-purpose}
32/// Provide automata converting to and from Quoted-Printable encodings.
33///
34/// # Classes {#bdlde_quotedprintabledecoder-classes}
35///
36/// - bdlde::QuotedPrintableDecoder: automata for Quoted-Printable decoding
37///
38/// @see bdlde_quotedprintableencoder
39///
40/// # Description {#bdlde_quotedprintabledecoder-description}
41/// This component provides a template class (parameterized
42/// separately on both input and output iterators) that can be used to decode
43/// byte sequences of arbitrary length from the Quoted Printable representation
44/// described in Section 6.7 "Quoted-Printable Content Transfer Encoding" of RFC
45/// 2045, "Multipurpose Internet Mail Extensions (MIME) Part One: Format of
46/// Internet Message Bodies."
47///
48/// Each instance of the decoder retains the state of the conversion from one
49/// supplied input to the next, enabling the processing of segmented input --
50/// i.e., processing resumes where it left off with the next invocation on new
51/// input. Instance methods are provided for the decoder to (1) assert the end
52/// of input, (2) determine whether the input so far is currently acceptable,
53/// and (3) indicate whether a non-recoverable error has occurred.
54///
55/// ## Quoted-Printable Decoding {#bdlde_quotedprintabledecoder-quoted-printable-decoding}
56///
57///
58/// (In the following, all rules mentioned refer to those listed in the encoder
59/// section above.)
60///
61/// The decoding process for this encoding scheme involves:
62///
63/// 1. transforming any encoded character triplets back into their original
64/// representation (rule #1 and rule #4).
65/// 2. literally writing out characters that have not been changed (rule #2).
66/// 3. deleting any trailing whitespace at the end of an encoded line (rule #3).
67///
68/// 4. removing the soft line breaks including the `=` prefix (i.e.,
69/// concatenating broken sentences) (rule #5).
70///
71/// The standard imposes a maximum of 76 characters exclusive of CRLF; however,
72/// the decoder implemented in this component will handle lines of arbitrary
73/// length.
74///
75/// The decoder also provides support for 2 error-reporting modes: the strict
76/// mode and the relaxed mode (configurable at construction). A strict-mode
77/// decoder stops decoding at the first offending character encountered, while a
78/// relaxed-mode decoder would continue decoding to the end of the input,
79/// allowing straight pass-through of character sets that cannot be interpreted.
80///
81/// The following kinds of errors can be encountered during decoding, listed in
82/// order of decreasing order of precedence:
83/// @code
84/// E1. BAD_DATA
85/// @endcode
86/// An `=` character is not followed by either two uppercase hexadecimal digits,
87/// or a soft line break -- e.g.,
88/// @code
89/// '=4=' (only one hexadecimal)
90/// '=K3' (K3 is not a hexadecimal number)
91/// '=1f' (lower case f is a literally encoded character)
92/// @endcode
93///
94/// Note that:
95///
96/// 1. In the relaxed error-reporting mode of this implementation, lowercase
97/// hexadecimal digits are treated as valid numerals.
98/// 2. E1 can be caused by a missing or corrupted numeric, a corrupted character
99/// disguised as an `=`, or an accidental insertion of a `=` that does not
100/// belong.
101/// 3. The case where a seemingly valid character is found in place of a missing
102/// numeric cannot be detected, e.g., `=4F` where `F` is actually a literally
103/// encoded character.
104/// 4. An erroneous occurrence of a `=` character preceding 2 seemingly valid
105/// hexadecimal numerics is also undetectable, e.g., `=4F` where `=` was
106/// actually a `t` corrupted during transmission.
107/// @code
108/// E2. BAD_LINEBREAK
109/// @endcode
110/// A '\r' is not followed by a '\n'. In the relaxed mode, each stand-alone
111/// '\r' or '\n' will be copied straight through to the output. For soft line
112/// breaks, whitespace is ignored between the `=` character and the CRLF as they
113/// are to be treated and removed as transport padding.
114/// @code
115/// E3. BAD_LINELENTH
116/// @endcode
117/// An encoded line exceeds the specified maximum line length with missing soft
118/// line breaks. (Because input of flexible line lengths is allowed in this
119/// implementation, this error is not detected or reported.)
120///
121/// In the relaxed-mode, errors of the types E1 and E2 would be copied straight
122/// to output and type E3 ignored. Decoded lines will be broken even when a
123/// bare CRLF is encountered in this mode. Users can still be alerted to the
124/// the unreported errors as offending characters are copied straight through to
125/// the output stream, which can be observed.
126///
127/// The `isError` method is used to detect the above anomalies, while for the
128/// `convert` method, a `numIn` output parameter (indicating the number of input
129/// characters consumed) or possibly the iterator itself (for iterators with
130/// reference-semantics) identifies the offending character.
131///
132/// ## Usage {#bdlde_quotedprintabledecoder-usage}
133///
134///
135/// This section illustrates intended use of this component.
136///
137/// ### Example 1: Basic Usage {#bdlde_quotedprintabledecoder-example-1-basic-usage}
138///
139///
140/// TBD
141/// @}
142/** @} */
143/** @} */
144
145/** @addtogroup bdl
146 * @{
147 */
148/** @addtogroup bdlde
149 * @{
150 */
151/** @addtogroup bdlde_quotedprintabledecoder
152 * @{
153 */
154
155#include <bdlscm_version.h>
156
157#include <bsl_cstring.h>
158#include <bsl_queue.h>
159#include <bsl_vector.h>
160
161
162namespace bdlde {
163
164/// This class implements a mechanism capable of converting data of
165/// arbitrary length from its corresponding Quoted-Printable representation.
166///
167/// See @ref bdlde_quotedprintabledecoder
169
170 // PRIVATE TYPES
171
172 /// Symbolic state values.
173 enum {
174 e_ERROR_STATE = -1, // input is irreparably invalid
175 e_INPUT_STATE = 0, // general input state
176 e_SAW_EQUAL_STATE = 1, // need two hexadecimal values or CR LF
177 e_SAW_WS_STATE = 2, // saw a whitespace
178 e_NEED_HEX_STATE = 3, // need one hexadecimal value
179 e_NEED_SOFT_LF_STATE = 4, // need soft new line
180 e_NEED_HARD_LF_STATE = 5, // need soft new line
181 e_DONE_STATE = 6 // any additional input is an error
182 };
183
184 public:
185
187 // This enumeration type enumerates the input equivalence classes.
188 // Separate enums are given to variants resulting from different modes
189 // of operation to eliminate an extra step of mode checking inside the
190 // main decoding loop.
191
192 // Regular character - copy straight to output
193 e_RC_ = 0, // strict mode
194 e_RC, // relaxed mode
195
196 // Hexadecimal digit - numeral only when preceded by
197 // '='; otherwise a regular character
198 e_HX_, // strict mode
199 e_HX, // relaxed mode
200
201 // '=' - wait for more input
202 e_EQ_, // strict mode
203 e_EQ, // relaxed mode
204
205 // Whitespace - buffer; wait for more input
206 e_WS_, // strict mode
207 e_WS, // relaxed mode
208
209 // Carriage return
210 e_CR_, // strict mode - wait for further input
211 e_CR, // relaxed mode - wait for further input
212
213 // Line Feed Strict mode
214 // ------------
215 e_LC_, // CRLF_MODE - decode to "\r\n" if preceded by
216 // '\r'; report error otherwise
217 e_LL_, // LF_MODE - decode to '\n' if preceded by
218 // '\r' report error otherwise Relaxed mode
219 // ------------
220 e_LC, // CRLF_MODE - decode to "\r\n" if preceded by
221 // '\r'; ignore otherwise
222 e_LL, // LF_MODE - decode to "\n" if preceded by
223 // '\r'; ignore otherwise
224
225 // Unrecognized char - halt and report error
226 e_UC_, // strict mode - Ignore and halt decoding
227 e_UC // relaxed mode - Ignore but continue decoding
228#ifndef BDE_OMIT_INTERNAL_DEPRECATED
245#endif // BDE_OMIT_INTERNAL_DEPRECATED
246 };
247
249 // Configuration governing how line breaks are decoded.
250
251 e_CRLF_MODE, // "\r\n" are decoded to "\r\n".
252 e_LF_MODE // "\r\n" are decoded to "\n".
253#ifndef BDE_OMIT_INTERNAL_DEPRECATED
256#endif // BDE_OMIT_INTERNAL_DEPRECATED
257 };
258
259 // CLASS DATA
260
261 /// Name of component used when reporting errors.
262 static const char s_componentName[];
263
264 /// Default error reporting mode
266
267 /// Default map of `unsigned char` to equivalence class for strict mode
268 static const char *s_defaultEquivClassStrict_p;
269
270 /// Default map of `unsigned char` to equivalence class for CRLF line
271 /// break mode
272 static const char *s_defaultEquivClassCRLF_p;
273
274 /// Character map used for converting an ASCII character to the
275 /// hexadecimal value it is representing.
276 static const unsigned char *const s_decodingMap_p;
277
278 static const int s_defaultMaxLineLength; // Default maximum line length
279 static const char* s_lineBreakModeName[]; // Names of line break mode
280
281 // INSTANCE DATA
282 bool d_unrecognizedIsErrorFlag; // If true, fail on "bad" characters
283 LineBreakMode d_lineBreakMode; // Line break mode
284 int d_state; // TBD doc
285 char d_buffer[90]; // TBD doc
286 int d_bufferLength; // TBD doc
287 char d_hexBuffer; // TBD doc
288 int d_outputLength; // Total number of output characters
289 char *d_equivClass_p; // Map of `unsigned char` to input equivalence class;
290 // dynamically allocated because there is no default
291 // complete configuration.
292
293 private:
294 // NOT IMPLEMENTED
297
298 public:
299 // CLASS METHODS
300
301 /// Return the ASCII string describing the specified `mode` governing
302 /// the decoding of hard linebreaks ("\r\n").
303 ///
304 /// \pre The behavior is undefined unless `mode` is either e_CRLF_MODE or e_LF_MODE.
305 static const char* lineBreakModeToAscii(LineBreakMode mode);
306
307 // CREATORS
308
309 /// Create a Quoted-Printable decoder in the initial state, set to the
310 /// strict or relaxed error-reporting mode according to whether the
311 /// specified `detectError` flag is `true` or `false`, respectively, and
312 /// also configured to the specified `lineBreakMode`.
313 ///
314 /// \pre The behavior is undefined unless `lineBreakMode` is either e_CRLF_MODE or e_LF_MODE.
315 ///
316 /// \note Note that the decoder reports errors in the strict mode and output
317 /// offending characters in the relaxed mode. Hard line breaks (`\r\n`)
318 /// are decoded to `\r\n` in e_CRLF_MODE (default) and to `\n` in
319 /// e_LF_MODE.
320 explicit
322 bool detectError,
325
326 /// Destroy this object.
328
329 // MANIPULATORS
330
331 /// Append to the buffer addressed by the specified `out` all pending
332 /// output (if there is any) up to the optionally specified `maxNumOut`
333 /// limit (default is negative, meaning no limit) and, when there is no
334 /// pending output and `maxNumOut` is still not reached, begin to
335 /// consume and decode a sequence of input characters starting at the
336 /// specified `begin` position, up to but not including the specified
337 /// `end` position, writing any resulting output in the specified
338 /// `output` buffer up to the (cumulative) `maxNumOut` limit. If
339 /// `maxNumOut` limit is reached, no further input will be consumed.
340 /// Load into the specified `numOut` and `numIn` the number of output
341 /// bytes produced and input bytes consumed, respectively. Return a
342 /// non-negative value on success and a negative value otherwise. A
343 /// successful return status indicates the number of characters that
344 /// would be output if `endConvert` were called with no output limit
345 /// immediately upon exit from this method. These bytes are also
346 /// available for output if this method is called with a sufficiently large `maxNumOut`.
347 ///
348 /// \note Note that calling this method after `endConvert`
349 /// has been invoked without an intervening `reset` call will place this
350 /// instance in an error state, and return an error status. Note also
351 /// that it is recommended that after all calls to `convert` are
352 /// finished, the `endConvert` method be called to complete the decoding
353 /// of any unprocessed input characters (e.g., whitespace).
354 int convert(char *out,
355 int *numOut,
356 int *numIn,
357 const char *begin,
358 const char *end,
359 int maxNumOut = -1);
360
361 /// Terminate encoding for this decoder; write any retained output
362 /// (e.g., from a previous call to `convert` with a non-zero `maxNumOut`
363 /// argument) to the specified `out` buffer. Optionally specify the
364 /// `maxNumOut` limit on the number of bytes to output; if `maxNumOut`
365 /// is negative, no limit is imposed. Load into the specified `numOut`
366 /// the number of output bytes produced. Return 0 on success with no
367 /// pending output, the positive number of bytes (if any) that would be
368 /// output if `endConvert` were called with no output limit immediately
369 /// upon exit from this method, and a negative value otherwise. Any
370 /// retained bytes are available on a subsequent call to `endConvert`.
371 /// Once this method is called, no additional input may be supplied
372 /// without an intervening call to `reset`; once this method returns a
373 /// zero status, a subsequent call will place this decoder in the error
374 /// state, and return an error status.
375 int endConvert(char *out, int *numOut, int maxNumOut = -1);
376
377 /// Reset this decoder to its initial state (i.e., as if no input had
378 /// been consumed).
379 void reset();
380
381 // ACCESSORS
382
383 /// Return `true` if the input read so far by this decoder is considered
384 /// syntactically complete and all resulting output has been emitted; return `false` otherwise.
385 ///
386 /// \note Note that there must not be any
387 /// unprocessed characters accumulated in the input buffer of this
388 /// decoder.
389 bool isAccepting() const;
390
391 /// Return `true` if this decoder is in the done state (i.e.,
392 /// `endConvert` has been called and any additional input will result in
393 /// an error), and if there is no pending output; return `false`
394 /// otherwise.
395 bool isDone() const;
396
397 /// Return `true` if this decoder has encountered an irrecoverable error
398 /// and `false` otherwise. An irrecoverable error is one for which
399 /// there is no subsequent possibility of achieving an "acceptable"
400 /// result (as defined by the `isAccepting` method).
401 bool isError() const;
402
403 /// Return `true` if this decoder is in the initial state (i.e., as if
404 /// no input had been consumed) and `false` otherwise.
405 bool isInitialState() const;
406
407 /// Return `true` if the input to this decoder is maximal (i.e., the
408 /// input contains an end-of-input sentinel, signaling that no further
409 /// input should be expected). *Always* returns `false` for
410 /// Quoted-Printable decoders since the encoding scheme does not specify
411 /// an end-of-input sentinel.
412 bool isMaximal() const;
413
414 /// Return `true` if this decoder is currently configured to detect an
415 /// error when an unrecognizable encoding is encountered, and `false`
416 /// otherwise.
417 bool isUnrecognizedAnError() const;
418
419 /// Return the line break mode specified for this decoder.
421
422 /// Return the number of output bytes retained by this decoder and not
423 /// emitted because `maxNumOut` has been reached.
424 int numOutputPending() const;
425
426 /// Return the total length of the output emitted by this decoder
427 /// (possibly after several calls to the `convert` or the `input`
428 /// methods) since its initial construction or the latest `reset`.
429 int outputLength() const;
430};
431
432// ============================================================================
433// INLINE DEFINITIONS
434// ============================================================================
435
436// CLASS METHODS
437inline
439 LineBreakMode mode)
440{
441 return s_lineBreakModeName[mode];
442}
443
444// CREATORS
445inline
446QuotedPrintableDecoder::QuotedPrintableDecoder(
447 bool unrecognizedIsErrorFlag,
449: d_unrecognizedIsErrorFlag(unrecognizedIsErrorFlag)
450, d_lineBreakMode(lineBreakMode)
451, d_state(e_INPUT_STATE)
452, d_bufferLength(0)
453, d_outputLength(0)
454{
455 if (unrecognizedIsErrorFlag) {
456 // Strict mode
457 d_equivClass_p = const_cast<char*>(s_defaultEquivClassStrict_p);
458 }
459 else {
460 if (lineBreakMode == e_CRLF_MODE) {
461 d_equivClass_p = const_cast<char*>(s_defaultEquivClassCRLF_p);
462 }
463 else {
464 // First copy the map of equivalence classes for the
465 // e_CRLF_MODE to the strict error-report mode.
466
467 int len = sizeof(*s_defaultEquivClassCRLF_p) * 256;
468 d_equivClass_p = new char[len];
469 bsl::memcpy(d_equivClass_p, s_defaultEquivClassCRLF_p, len);
470 d_equivClass_p['\n'] = e_LL; // output '\n' instead if preceded
471 // by '='.
472 }
473 }
474}
475
476// MANIPULATORS
477inline
479{
480 d_state = e_INPUT_STATE;
481 d_outputLength = 0;
482 d_bufferLength = 0;
483}
484
485// ACCESSORS
486inline
488{
489 return e_INPUT_STATE == d_state || e_DONE_STATE == d_state;
490}
491
492inline
494{
495 return e_DONE_STATE == d_state && 0 == d_bufferLength;
496}
497
498inline
500{
501 return e_ERROR_STATE == d_state;
502}
503
504inline
506{
507 return e_INPUT_STATE == d_state && 0 == d_outputLength;
508}
509
510inline
512{
513 return false;
514}
515
516inline
521
522inline
528
529inline
534
535inline
537{
538 return d_outputLength;
539}
540
541} // close package namespace
542
543
544#endif
545
546// ----------------------------------------------------------------------------
547// Copyright 2015 Bloomberg Finance L.P.
548//
549// Licensed under the Apache License, Version 2.0 (the "License");
550// you may not use this file except in compliance with the License.
551// You may obtain a copy of the License at
552//
553// http://www.apache.org/licenses/LICENSE-2.0
554//
555// Unless required by applicable law or agreed to in writing, software
556// distributed under the License is distributed on an "AS IS" BASIS,
557// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
558// See the License for the specific language governing permissions and
559// limitations under the License.
560// ----------------------------- END-OF-FILE ----------------------------------
561
562/** @} */
563/** @} */
564/** @} */
Definition bdlde_quotedprintabledecoder.h:168
int d_bufferLength
Definition bdlde_quotedprintabledecoder.h:286
static const char s_componentName[]
Name of component used when reporting errors.
Definition bdlde_quotedprintabledecoder.h:262
static const char * s_defaultEquivClassStrict_p
Default map of unsigned char to equivalence class for strict mode.
Definition bdlde_quotedprintabledecoder.h:268
int endConvert(char *out, int *numOut, int maxNumOut=-1)
bool isMaximal() const
Definition bdlde_quotedprintabledecoder.h:511
int convert(char *out, int *numOut, int *numIn, const char *begin, const char *end, int maxNumOut=-1)
static const char * s_defaultEquivClassCRLF_p
Definition bdlde_quotedprintabledecoder.h:272
static const char * lineBreakModeToAscii(LineBreakMode mode)
Definition bdlde_quotedprintabledecoder.h:438
LineBreakMode lineBreakMode() const
Return the line break mode specified for this decoder.
Definition bdlde_quotedprintabledecoder.h:524
int numOutputPending() const
Definition bdlde_quotedprintabledecoder.h:530
char d_hexBuffer
Definition bdlde_quotedprintabledecoder.h:287
bool isInitialState() const
Definition bdlde_quotedprintabledecoder.h:505
LineBreakMode d_lineBreakMode
Definition bdlde_quotedprintabledecoder.h:283
static const int s_defaultMaxLineLength
Definition bdlde_quotedprintabledecoder.h:278
char * d_equivClass_p
Definition bdlde_quotedprintabledecoder.h:289
void reset()
Definition bdlde_quotedprintabledecoder.h:478
int d_state
Definition bdlde_quotedprintabledecoder.h:284
static const unsigned char *const s_decodingMap_p
Definition bdlde_quotedprintabledecoder.h:276
static const bool s_defaultUnrecognizedIsErrorFlag
Default error reporting mode.
Definition bdlde_quotedprintabledecoder.h:265
EquivalenceClasses
Definition bdlde_quotedprintabledecoder.h:186
@ e_UC_
Definition bdlde_quotedprintabledecoder.h:226
@ e_HX_
Definition bdlde_quotedprintabledecoder.h:198
@ BDEDE_CR
Definition bdlde_quotedprintabledecoder.h:238
@ e_RC
Definition bdlde_quotedprintabledecoder.h:194
@ BDEDE_LC_
Definition bdlde_quotedprintabledecoder.h:239
@ e_LC
Definition bdlde_quotedprintabledecoder.h:220
@ BDEDE_WS
Definition bdlde_quotedprintabledecoder.h:236
@ e_CR
Definition bdlde_quotedprintabledecoder.h:211
@ e_WS
Definition bdlde_quotedprintabledecoder.h:207
@ BDEDE_UC
Definition bdlde_quotedprintabledecoder.h:244
@ BDEDE_CR_
Definition bdlde_quotedprintabledecoder.h:237
@ e_WS_
Definition bdlde_quotedprintabledecoder.h:206
@ BDEDE_LL_
Definition bdlde_quotedprintabledecoder.h:240
@ e_CR_
Definition bdlde_quotedprintabledecoder.h:210
@ e_EQ_
Definition bdlde_quotedprintabledecoder.h:202
@ e_LL_
Definition bdlde_quotedprintabledecoder.h:217
@ BDEDE_RC_
Definition bdlde_quotedprintabledecoder.h:229
@ e_HX
Definition bdlde_quotedprintabledecoder.h:199
@ BDEDE_WS_
Definition bdlde_quotedprintabledecoder.h:235
@ BDEDE_LL
Definition bdlde_quotedprintabledecoder.h:242
@ BDEDE_LC
Definition bdlde_quotedprintabledecoder.h:241
@ e_LL
Definition bdlde_quotedprintabledecoder.h:222
@ e_RC_
Definition bdlde_quotedprintabledecoder.h:193
@ BDEDE_UC_
Definition bdlde_quotedprintabledecoder.h:243
@ BDEDE_HX
Definition bdlde_quotedprintabledecoder.h:232
@ BDEDE_HX_
Definition bdlde_quotedprintabledecoder.h:231
@ BDEDE_RC
Definition bdlde_quotedprintabledecoder.h:230
@ e_UC
Definition bdlde_quotedprintabledecoder.h:227
@ BDEDE_EQ
Definition bdlde_quotedprintabledecoder.h:234
@ BDEDE_EQ_
Definition bdlde_quotedprintabledecoder.h:233
@ e_EQ
Definition bdlde_quotedprintabledecoder.h:203
@ e_LC_
Definition bdlde_quotedprintabledecoder.h:215
bool isUnrecognizedAnError() const
Definition bdlde_quotedprintabledecoder.h:517
int d_outputLength
Definition bdlde_quotedprintabledecoder.h:288
~QuotedPrintableDecoder()
Destroy this object.
static const char * s_lineBreakModeName[]
Definition bdlde_quotedprintabledecoder.h:279
bool isError() const
Definition bdlde_quotedprintabledecoder.h:499
bool d_unrecognizedIsErrorFlag
Definition bdlde_quotedprintabledecoder.h:282
int outputLength() const
Definition bdlde_quotedprintabledecoder.h:536
bool isDone() const
Definition bdlde_quotedprintabledecoder.h:493
bool isAccepting() const
Definition bdlde_quotedprintabledecoder.h:487
LineBreakMode
Definition bdlde_quotedprintabledecoder.h:248
@ e_LF_MODE
Definition bdlde_quotedprintabledecoder.h:252
@ BDEDE_CRLF_MODE
Definition bdlde_quotedprintabledecoder.h:254
@ e_CRLF_MODE
Definition bdlde_quotedprintabledecoder.h:251
@ BDEDE_LF_MODE
Definition bdlde_quotedprintabledecoder.h:255
char d_buffer[90]
Definition bdlde_quotedprintabledecoder.h:285
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
Definition bdlde_base64alphabet.h:118