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