Codeset_IBM1047.cpp

Go to the documentation of this file.
00001 
00002 //=============================================================================
00003 /**
00004  *  @file    Codeset_IBM1047.cpp
00005  *
00006  *  $Id: Codeset_IBM1047.cpp 81661 2008-05-09 12:05:34Z johnnyw $
00007  *
00008  *  Defines the arrays required to convert between ISO8859 (aka
00009  *  Latin/1) and IBM1047 (aka EBCDIC).
00010  *
00011  *
00012  *  @author Jim Rogers (jrogers@viasoft.com)
00013  */
00014 //=============================================================================
00015 
00016 
00017 #include "ace/Codeset_IBM1047.h"
00018 
00019 #if defined (ACE_HAS_EBCDIC)
00020 
00021 ACE_RCSID (ace,
00022            Codeset_IBM1047,
00023            "$Id: Codeset_IBM1047.cpp 81661 2008-05-09 12:05:34Z johnnyw $")
00024 
00025 #include "ace/OS_Memory.h"
00026 #include "ace/OS_NS_string.h"
00027 
00028 namespace
00029 {
00030   char const to_IBM1047[] =
00031     {
00032   "\x00\x01\x02\x03\x37\x2D\x2E\x2F\x16\x05\x25\x0B\x0C\x0D\x0E\x0F" // 00-0F
00033   "\x10\x11\x12\x13\x3C\x3D\x32\x26\x18\x19\x3F\x27\x22\x1D\x35\x1F" // 10-1F
00034   "\x40\x5A\x7F\x7B\x5B\x6C\x50\x7D\x4D\x5D\x5C\x4E\x6B\x60\x4B\x61" // 20-2F
00035   "\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\x7A\x5E\x4C\x7E\x6E\x6F" // 30-3F
00036   "\x7C\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xD1\xD2\xD3\xD4\xD5\xD6" // 40-4F
00037   "\xD7\xD8\xD9\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xAD\xE0\xBD\x5F\x6D" // 50-5F
00038   "\x79\x81\x82\x83\x84\x85\x86\x87\x88\x89\x91\x92\x93\x94\x95\x96" // 60-6F
00039   "\x97\x98\x99\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xC0\x4F\xD0\xA1\x07" // 70-7F
00040   "\x43\x20\x21\x1C\x23\xEB\x24\x9B\x71\x28\x38\x49\x90\xBA\xEC\xDF" // 80-8F
00041   "\x45\x29\x2A\x9D\x72\x2B\x8A\x9A\x67\x56\x64\x4A\x53\x68\x59\x46" // 90-9F
00042   "\xEA\xDA\x2C\xDE\x8B\x55\x41\xFE\x58\x51\x52\x48\x69\xDB\x8E\x8D" // A0-AF
00043   "\x73\x74\x75\xFA\x15\xB0\xB1\xB3\xB4\xB5\x6A\xB7\xB8\xB9\xCC\xBC" // B0-BF
00044   "\xAB\x3E\x3B\x0A\xBF\x8F\x3A\x14\xA0\x17\xCB\xCA\x1A\x1B\x9C\x04" // C0-CF
00045   "\x34\xEF\x1E\x06\x08\x09\x77\x70\xBE\xBB\xAC\x54\x63\x65\x66\x62" // D0-DF
00046   "\x30\x42\x47\x57\xEE\x33\xB6\xE1\xCD\xED\x36\x44\xCE\xCF\x31\xAA" // E0-EF
00047   "\xFC\x9E\xAE\x8C\xDD\xDC\x39\xFB\x80\xAF\xFD\x78\x76\xB2\x9F\xFF" // F0-FF
00048 };
00049 
00050   char const from_IBM1047[] =
00051     {
00052   "\x00\x01\x02\x03\xCF\x09\xD3\x7F\xD4\xD5\xC3\x0B\x0C\x0D\x0E\x0F" // 00-0F
00053   "\x10\x11\x12\x13\xC7\xB4\x08\xC9\x18\x19\xCC\xCD\x83\x1D\xD2\x1F" // 10-1F
00054   "\x81\x82\x1C\x84\x86\x0A\x17\x1B\x89\x91\x92\x95\xA2\x05\x06\x07" // 20-2F
00055   "\x20\xEE\x16\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\xC1\x1A" // 30-3F
00056   "\x20\xA6\xE1\x80\xEB\x90\x9F\xE2\xAB\x8B\x9B\x2E\x3C\x28\x2B\x7C" // 40-4F
00057   "\x26\xA9\xAA\x9C\xDB\xA5\x99\xE3\xA8\x9E\x21\x24\x2A\x29\x3B\x5E" // 50-5F
00058   "\x2D\x2F\xDF\xDC\x9A\xDD\xDE\x98\x9D\xAC\xBA\x2C\x25\x5F\x3E\x3F" // 60-6F
00059   "\xD7\x88\x94\xB0\xB1\xB2\xFC\xD6\xFB\x60\x3A\x23\x40\x27\x3D\x22" // 70-7F
00060   "\xF8\x61\x62\x63\x64\x65\x66\x67\x68\x69\x96\xA4\xF3\xAF\xAE\xC5" // 80-8F
00061   "\x8C\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72\x97\x87\xCE\x93\xF1\xFE" // 90-9F
00062   "\xC8\x7E\x73\x74\x75\x76\x77\x78\x79\x7A\xEF\xC0\xDA\x5B\xF2\xF9" // A0-AF
00063   "\xB5\xB6\xFD\xB7\xB8\xB9\xE6\xBB\xBC\xBD\x8D\xD9\xBF\x5D\xD8\xC4" // B0-BF
00064   "\x7B\x41\x42\x43\x44\x45\x46\x47\x48\x49\xCB\xCA\xBE\xE8\xEC\xED" // C0-CF
00065   "\x7D\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\xA1\xAD\xF5\xF4\xA3\x8F" // D0-DF
00066   "\x5C\xE7\x53\x54\x55\x56\x57\x58\x59\x5A\xA0\x85\x8E\xE9\xE4\xD1" // E0-EF
00067   "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\xB3\xF7\xF0\xFA\xA7\xFF" // F0-FF
00068     };
00069 }
00070 
00071 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00072 
00073 ACE_IBM1047_ISO8859::ACE_IBM1047_ISO8859 (void)
00074 {
00075 }
00076 
00077 ACE_IBM1047_ISO8859::~ACE_IBM1047_ISO8859 (void)
00078 {
00079 }
00080 
00081 ACE_CDR::ULong
00082 ACE_IBM1047_ISO8859::ncs ()
00083 {
00084   return 0x10020417;
00085 }
00086 
00087 ACE_CDR::ULong
00088 ACE_IBM1047_ISO8859::tcs ()
00089 {
00090   return 0x00010001;
00091 }
00092 
00093 ACE_CDR::Boolean
00094 ACE_IBM1047_ISO8859::read_char (ACE_InputCDR &in,
00095                                 ACE_CDR::Char &x)
00096 {
00097   if (this->read_1 (in, reinterpret_cast<ACE_CDR::Octet*> (&x)))
00098     {
00099       x = to_IBM1047[x];
00100       return 1;
00101     }
00102   return 0;
00103 }
00104 
00105 ACE_CDR::Boolean
00106 ACE_IBM1047_ISO8859::read_string (ACE_InputCDR& in,
00107                                   ACE_CDR::Char *& x)
00108 {
00109   ACE_CDR::ULong len;
00110 
00111   in.read_ulong (len);
00112 
00113   if (len > 0)
00114     {
00115       ACE_NEW_RETURN (x,
00116                       ACE_CDR::Char[len],
00117                       0);
00118 
00119       if (this->read_char_array (in, x, len))
00120         return 1;
00121 
00122       delete [] x;
00123     }
00124 
00125   x = 0;
00126   return 0;
00127 }
00128 
00129 ACE_CDR::Boolean
00130 ACE_IBM1047_ISO8859::read_char_array (ACE_InputCDR& in,
00131                                       ACE_CDR::Char* x,
00132                                       ACE_CDR::ULong len)
00133 {
00134   if (this->read_array (in,
00135                         x,
00136                         ACE_CDR::OCTET_SIZE,
00137                         ACE_CDR::OCTET_ALIGN,
00138                         len))
00139     {
00140       for (ACE_CDR::ULong i = 0; i != len; ++i)
00141         x[i] = to_IBM1047[x[i]];
00142 
00143       return 1;
00144     }
00145 
00146   return 0;
00147 }
00148 
00149 ACE_CDR::Boolean
00150 ACE_IBM1047_ISO8859::write_char (ACE_OutputCDR& out,
00151                                  ACE_CDR::Char x)
00152 {
00153   return
00154     this->write_1 (out,
00155                    reinterpret_cast<const ACE_CDR::Octet*> (&from_IBM1047[x]));
00156 }
00157 
00158 ACE_CDR::Boolean
00159 ACE_IBM1047_ISO8859::write_string (ACE_OutputCDR& out,
00160                                    ACE_CDR::ULong len,
00161                                    const ACE_CDR::Char* x)
00162 {
00163   if (out.write_ulong (len + 1))
00164     return this->write_char_array (out, x, len + 1);
00165   return 0;
00166 }
00167 
00168 ACE_CDR::Boolean
00169 ACE_IBM1047_ISO8859::write_char_array (ACE_OutputCDR& out,
00170                                        const ACE_CDR::Char* x,
00171                                        ACE_CDR::ULong len)
00172 {
00173   char *buf = 0;
00174   if (this->adjust (out, len, 1, buf) == 0)
00175     {
00176       ACE_OS::memcpy (buf, x, len);
00177 
00178       for (ACE_CDR::ULong i = 0; i != len; ++i)
00179         buf[i] = from_IBM1047[buf[i]];
00180 
00181       return 1;
00182     }
00183 
00184   this->good_bit(out, 0);
00185   return 0;
00186 }
00187 
00188 // ****************************************************************
00189 
00190 ACE_ISO8859_IBM1047::ACE_ISO8859_IBM1047 (void)
00191 {
00192 }
00193 
00194 ACE_ISO8859_IBM1047::~ACE_ISO8859_IBM1047 (void)
00195 {
00196 }
00197 
00198 ACE_CDR::ULong
00199 ACE_ISO8859_IBM1047::ncs ()
00200 {
00201   return 0x00010001;
00202 }
00203 
00204 ACE_CDR::ULong
00205 ACE_ISO8859_IBM1047::tcs ()
00206 {
00207   return 0x10020417;
00208 }
00209 
00210 ACE_CDR::Boolean
00211 ACE_ISO8859_IBM1047::read_char (ACE_InputCDR& in,
00212                                 ACE_CDR::Char& x)
00213 {
00214   if (this->read_1 (in, reinterpret_cast<ACE_CDR::Octet*> (&x)))
00215     {
00216       x = from_IBM1047[x];
00217       return 1;
00218     }
00219   return 0;
00220 }
00221 
00222 ACE_CDR::Boolean
00223 ACE_ISO8859_IBM1047::read_string (ACE_InputCDR &in,
00224                                   ACE_CDR::Char *&x)
00225 {
00226   ACE_CDR::ULong len;
00227 
00228   in.read_ulong (len);
00229 
00230   if (len > 0)
00231     {
00232       ACE_NEW_RETURN (x,
00233                       ACE_CDR::Char[len],
00234                       0);
00235 
00236       if (this->read_char_array (in, x, len))
00237         return 1;
00238 
00239       delete [] x;
00240     }
00241 
00242   x = 0;
00243   return 0;
00244 }
00245 
00246 ACE_CDR::Boolean
00247 ACE_ISO8859_IBM1047::read_char_array (ACE_InputCDR &in,
00248                                       ACE_CDR::Char *x,
00249                                       ACE_CDR::ULong len)
00250 {
00251   if (this->read_array (in,
00252                         x,
00253                         ACE_CDR::OCTET_SIZE,
00254                         ACE_CDR::OCTET_ALIGN,
00255                         len))
00256     {
00257       for (ACE_CDR::ULong i = 0; i != len; ++i)
00258         x[i] = from_IBM1047[x[i]];
00259 
00260       return 1;
00261     }
00262 
00263   return 0;
00264 }
00265 
00266 ACE_CDR::Boolean
00267 ACE_ISO8859_IBM1047::write_char (ACE_OutputCDR &out,
00268                                  ACE_CDR::Char x)
00269 {
00270   return
00271     this->write_1 (out,
00272                    reinterpret_cast<const ACE_CDR::Octet *> (&to_IBM1047[x]));
00273 }
00274 
00275 ACE_CDR::Boolean
00276 ACE_ISO8859_IBM1047::write_string (ACE_OutputCDR& out,
00277                                    ACE_CDR::ULong len,
00278                                    const ACE_CDR::Char* x)
00279 {
00280   if (out.write_ulong (len + 1))
00281     return this->write_char_array (out, x, len + 1);
00282   else
00283     return 0;
00284 }
00285 
00286 ACE_CDR::Boolean
00287 ACE_ISO8859_IBM1047::write_char_array (ACE_OutputCDR &out,
00288                                        const ACE_CDR::Char *x,
00289                                        ACE_CDR::ULong len)
00290 {
00291   char *buf = 0;
00292 
00293   if (this->adjust (out, len, 1, buf) == 0)
00294     {
00295       ACE_OS::memcpy (buf, x, len);
00296 
00297       for (ACE_CDR::ULong i = 0; i != len; ++i)
00298         buf[i] = to_IBM1047[buf[i]];
00299 
00300       return 1;
00301     }
00302 
00303   this->good_bit (out, 0);
00304   return 0;
00305 }
00306 
00307 ACE_END_VERSIONED_NAMESPACE_DECL
00308 
00309 #endif /* ACE_HAS_EBCDIC */

Generated on Tue Feb 2 17:18:38 2010 for ACE by  doxygen 1.4.7