Blame lib/IdentityCodingSystem.cxx

Packit 8a864e
// Copyright (c) 1994 James Clark
Packit 8a864e
// See the file COPYING for copying permission.
Packit 8a864e
Packit 8a864e
#include "splib.h"
Packit 8a864e
#include "IdentityCodingSystem.h"
Packit 8a864e
#include <limits.h>
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
namespace SP_NAMESPACE {
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
class IdentityDecoder : public Decoder {
Packit 8a864e
public:
Packit 8a864e
  size_t decode(Char *to, const char *from, size_t fromLen,
Packit 8a864e
		const char **rest);
Packit 8a864e
  Boolean convertOffset(unsigned long &offset) const;
Packit 8a864e
};
Packit 8a864e
Packit 8a864e
class IdentityEncoder : public RecoveringEncoder {
Packit 8a864e
public:
Packit 8a864e
  IdentityEncoder();
Packit 8a864e
  void output(const Char *, size_t, OutputByteStream *);
Packit 8a864e
};
Packit 8a864e
Packit 8a864e
IdentityCodingSystem::IdentityCodingSystem()
Packit 8a864e
{
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
Decoder *IdentityCodingSystem::makeDecoder() const
Packit 8a864e
{
Packit 8a864e
  return new IdentityDecoder;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
Encoder *IdentityCodingSystem::makeEncoder() const
Packit 8a864e
{
Packit 8a864e
  return new IdentityEncoder;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
Boolean IdentityCodingSystem::isIdentity() const
Packit 8a864e
{
Packit 8a864e
  return 1;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
size_t IdentityDecoder::decode(Char *to, const char *from, size_t fromLen,
Packit 8a864e
			       const char **rest)
Packit 8a864e
{
Packit 8a864e
  if (sizeof(Char) == sizeof(char) && from == (char *)to) {
Packit 8a864e
    *rest = from + fromLen;
Packit 8a864e
    return fromLen;
Packit 8a864e
  }
Packit 8a864e
  for (size_t n = fromLen; n > 0; n--)
Packit 8a864e
    *to++ = (unsigned char)*from++; // zero extend
Packit 8a864e
  *rest = from;
Packit 8a864e
  return fromLen;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
Boolean IdentityDecoder::convertOffset(unsigned long &) const
Packit 8a864e
{
Packit 8a864e
  return true;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
IdentityEncoder::IdentityEncoder()
Packit 8a864e
{
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void IdentityEncoder::output(const Char *s, size_t n, OutputByteStream *sb)
Packit 8a864e
{
Packit 8a864e
  if (sizeof(Char) != sizeof(char)) {
Packit 8a864e
    for (size_t i = 0; i < n; i++) {
Packit 8a864e
      Char c = s[i];
Packit 8a864e
      if (c > UCHAR_MAX)
Packit 8a864e
	handleUnencodable(c, sb);
Packit 8a864e
      else
Packit 8a864e
	sb->sputc((unsigned char)c);
Packit 8a864e
    }
Packit 8a864e
  }
Packit 8a864e
  else
Packit 8a864e
    sb->sputn((const char *)s, n);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
}
Packit 8a864e
#endif