1 // Copyright (c) 1994 James Clark
2 // See the file COPYING for copying permission.
3 #pragma ident "%Z%%M% %I% %E% SMI"
4
5 #ifndef CodingSystem_INCLUDED
6 #define CodingSystem_INCLUDED 1
7
8 #ifdef __GNUG__
9 #pragma interface
10 #endif
11
12 #include "types.h"
13 #include "Boolean.h"
14 #include "StringC.h"
15 #include "OutputByteStream.h"
16
17 #include <stddef.h>
18
19
20 #ifdef SP_NAMESPACE
21 namespace SP_NAMESPACE {
22 #endif
23
24 class SP_API Decoder {
25 public:
26 Decoder(unsigned minBytesPerChar = 1);
27 virtual ~Decoder();
28 virtual size_t decode(Char *, const char *, size_t, const char **) = 0;
29 virtual Boolean convertOffset(unsigned long &offset) const;
30 // Decoder assumes that for every decoded Char there must be at least
31 // minBytesPerChar bytes
32 unsigned minBytesPerChar() const;
33 protected:
34 unsigned minBytesPerChar_;
35 };
36
37
38 class SP_API Encoder {
39 public:
40 class SP_API Handler {
41 public:
42 virtual void handleUnencodable(Char, OutputByteStream *) = 0;
43 };
44 Encoder();
45 virtual ~Encoder();
46 virtual void output(const Char *, size_t, OutputByteStream *) = 0;
47 // This outputs a byte order mark with Unicode.
48 virtual void startFile(OutputByteStream *);
49 virtual void output(Char *, size_t, OutputByteStream *);
50 virtual void setUnencodableHandler(Handler *);
51 virtual void handleUnencodable(Char, OutputByteStream *);
52 };
53
54 class SP_API RecoveringEncoder : public Encoder {
55 public:
56 RecoveringEncoder();
57 void setUnencodableHandler(Handler *);
58 void handleUnencodable(Char, OutputByteStream *);
59 private:
60 Handler *unencodableHandler_;
61 };
62
63 class SP_API InputCodingSystem {
64 public:
65 virtual ~InputCodingSystem();
66 virtual Decoder *makeDecoder() const = 0;
67 StringC convertIn(const char *) const;
68 virtual Boolean isIdentity() const;
69 };
70
71 class SP_API OutputCodingSystem {
72 public:
73 virtual ~OutputCodingSystem();
74 virtual Encoder *makeEncoder() const = 0;
75 virtual unsigned fixedBytesPerChar() const;
76 String<char> convertOut(const StringC &) const;
77 };
78
79 class SP_API CodingSystem : public InputCodingSystem, public OutputCodingSystem {
80 };
81
82 inline
minBytesPerChar()83 unsigned Decoder::minBytesPerChar() const
84 {
85 return minBytesPerChar_;
86 }
87
88 #ifdef SP_NAMESPACE
89 }
90 #endif
91
92 #endif /* not CodingSystem_INCLUDED */
93