| [0b990d] | 1 |  | 
|---|
|  | 2 | // translate.h -- data translation classes for StateIn and StateOut | 
|---|
|  | 3 | // | 
|---|
|  | 4 | // Copyright (C) 1997 Limit Point Systems, Inc. | 
|---|
|  | 5 | // | 
|---|
|  | 6 | // Author: Curtis Janssen <cljanss@limitpt.com> | 
|---|
|  | 7 | // Maintainer: LPS | 
|---|
|  | 8 | // | 
|---|
|  | 9 | // This file is part of the SC Toolkit. | 
|---|
|  | 10 | // | 
|---|
|  | 11 | // The SC Toolkit is free software; you can redistribute it and/or modify | 
|---|
|  | 12 | // it under the terms of the GNU Library General Public License as published by | 
|---|
|  | 13 | // the Free Software Foundation; either version 2, or (at your option) | 
|---|
|  | 14 | // any later version. | 
|---|
|  | 15 | // | 
|---|
|  | 16 | // The SC Toolkit is distributed in the hope that it will be useful, | 
|---|
|  | 17 | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
|  | 18 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|---|
|  | 19 | // GNU Library General Public License for more details. | 
|---|
|  | 20 | // | 
|---|
|  | 21 | // You should have received a copy of the GNU Library General Public License | 
|---|
|  | 22 | // along with the SC Toolkit; see the file COPYING.LIB.  If not, write to | 
|---|
|  | 23 | // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | 
|---|
|  | 24 | // | 
|---|
|  | 25 | // The U.S. Government is granted a limited license as per AL 91-7. | 
|---|
|  | 26 | // | 
|---|
|  | 27 |  | 
|---|
|  | 28 | #ifndef _util_state_translate_h | 
|---|
|  | 29 | #define _util_state_translate_h | 
|---|
|  | 30 |  | 
|---|
|  | 31 | #ifdef HAVE_CONFIG_H | 
|---|
|  | 32 | #include <scconfig.h> | 
|---|
|  | 33 | #endif | 
|---|
|  | 34 |  | 
|---|
|  | 35 | #if defined(WORDS_BIGENDIAN) | 
|---|
|  | 36 | #define BIGENDIAN 1 | 
|---|
|  | 37 | #else | 
|---|
|  | 38 | #define BIGENDIAN 0 | 
|---|
|  | 39 | #endif | 
|---|
|  | 40 |  | 
|---|
|  | 41 | namespace sc { | 
|---|
|  | 42 |  | 
|---|
|  | 43 | /** Generic data translation. | 
|---|
|  | 44 | */ | 
|---|
|  | 45 | class TranslateData { | 
|---|
|  | 46 | public: | 
|---|
|  | 47 | TranslateData(); | 
|---|
|  | 48 | virtual ~TranslateData(); | 
|---|
|  | 49 |  | 
|---|
|  | 50 | /// Returns a code for the type of format for the external data. | 
|---|
|  | 51 | virtual char format_code(); | 
|---|
|  | 52 |  | 
|---|
|  | 53 | /** A virtual constructor that choses a specialization based on | 
|---|
|  | 54 | the format code. */ | 
|---|
|  | 55 | static TranslateData *vctor(char code); | 
|---|
|  | 56 |  | 
|---|
|  | 57 | /** Translates to native format in-place. | 
|---|
|  | 58 | Similar routines exist for all the basic types. */ | 
|---|
|  | 59 | virtual void to_native  (char *,   int n); | 
|---|
|  | 60 | /** Translates to external format in-place. | 
|---|
|  | 61 | Similar routines exist for all the basic types. */ | 
|---|
|  | 62 | virtual void to_external(char *,   int n); | 
|---|
|  | 63 | virtual void to_native  (short *,  int n); | 
|---|
|  | 64 | virtual void to_external(short *,  int n); | 
|---|
|  | 65 | virtual void to_native  (unsigned int *, int n); | 
|---|
|  | 66 | virtual void to_external(unsigned int *, int n); | 
|---|
|  | 67 | virtual void to_native  (int *,    int n); | 
|---|
|  | 68 | virtual void to_external(int *,    int n); | 
|---|
|  | 69 | virtual void to_native  (long *,   int n); | 
|---|
|  | 70 | virtual void to_external(long *,   int n); | 
|---|
|  | 71 | virtual void to_native  (float *,  int n); | 
|---|
|  | 72 | virtual void to_external(float *,  int n); | 
|---|
|  | 73 | virtual void to_native  (double *, int n); | 
|---|
|  | 74 | virtual void to_external(double *, int n); | 
|---|
|  | 75 |  | 
|---|
|  | 76 | /** Translates to native format. | 
|---|
|  | 77 | Similar routines exist for all the basic types. */ | 
|---|
|  | 78 | virtual void to_native  (char *target,   const void *source,   int n); | 
|---|
|  | 79 | /** Translates to external format. | 
|---|
|  | 80 | Similar routines exist for all the basic types. */ | 
|---|
|  | 81 | virtual void to_external(void *target,   const char *source,   int n); | 
|---|
|  | 82 | virtual void to_native  (short *,  const void *,   int n); | 
|---|
|  | 83 | virtual void to_external(void *,   const short *,  int n); | 
|---|
|  | 84 | virtual void to_native  (unsigned int *,    const void *,   int n); | 
|---|
|  | 85 | virtual void to_external(void *,   const unsigned int *,    int n); | 
|---|
|  | 86 | virtual void to_native  (int *,    const void *,   int n); | 
|---|
|  | 87 | virtual void to_external(void *,   const int *,    int n); | 
|---|
|  | 88 | virtual void to_native  (long *,   const void *,   int n); | 
|---|
|  | 89 | virtual void to_external(void *,   const long *,   int n); | 
|---|
|  | 90 | virtual void to_native  (float *,  const void *,   int n); | 
|---|
|  | 91 | virtual void to_external(void *,   const float *,  int n); | 
|---|
|  | 92 | virtual void to_native  (double *, const void *,   int n); | 
|---|
|  | 93 | virtual void to_external(void *,   const double *, int n); | 
|---|
|  | 94 | }; | 
|---|
|  | 95 |  | 
|---|
|  | 96 | /** Data translation to an external representation with bytes swapped. | 
|---|
|  | 97 | */ | 
|---|
|  | 98 | class TranslateDataByteSwap: public TranslateData { | 
|---|
|  | 99 | public: | 
|---|
|  | 100 | TranslateDataByteSwap(); | 
|---|
|  | 101 | virtual ~TranslateDataByteSwap(); | 
|---|
|  | 102 |  | 
|---|
|  | 103 | /// Returns a code for the type of format for the external data. | 
|---|
|  | 104 | virtual char format_code(); | 
|---|
|  | 105 |  | 
|---|
|  | 106 | /// Overridden translation routines exist for all the basic types. | 
|---|
|  | 107 | virtual void to_native  (char *,   int n); | 
|---|
|  | 108 | /// Overridden translation routines exist for all the basic types. | 
|---|
|  | 109 | virtual void to_external(char *,   int n); | 
|---|
|  | 110 | virtual void to_native  (short *,  int n); | 
|---|
|  | 111 | virtual void to_external(short *,  int n); | 
|---|
|  | 112 | virtual void to_native  (unsigned int *, int n); | 
|---|
|  | 113 | virtual void to_external(unsigned int *, int n); | 
|---|
|  | 114 | virtual void to_native  (int *,    int n); | 
|---|
|  | 115 | virtual void to_external(int *,    int n); | 
|---|
|  | 116 | virtual void to_native  (long *,   int n); | 
|---|
|  | 117 | virtual void to_external(long *,   int n); | 
|---|
|  | 118 | virtual void to_native  (float *,  int n); | 
|---|
|  | 119 | virtual void to_external(float *,  int n); | 
|---|
|  | 120 | virtual void to_native  (double *, int n); | 
|---|
|  | 121 | virtual void to_external(double *, int n); | 
|---|
|  | 122 |  | 
|---|
|  | 123 | /// Overridden translation routines exist for all the basic types. | 
|---|
|  | 124 | virtual void to_native  (char *,   const void *,   int n); | 
|---|
|  | 125 | /// Overridden translation routines exist for all the basic types. | 
|---|
|  | 126 | virtual void to_external(void *,   const char *,   int n); | 
|---|
|  | 127 | virtual void to_native  (short *,  const void *,   int n); | 
|---|
|  | 128 | virtual void to_external(void *,   const short *,  int n); | 
|---|
|  | 129 | virtual void to_native  (unsigned int *,    const void *,   int n); | 
|---|
|  | 130 | virtual void to_external(void *,   const unsigned int *,    int n); | 
|---|
|  | 131 | virtual void to_native  (int *,    const void *,   int n); | 
|---|
|  | 132 | virtual void to_external(void *,   const int *,    int n); | 
|---|
|  | 133 | virtual void to_native  (long *,   const void *,   int n); | 
|---|
|  | 134 | virtual void to_external(void *,   const long *,   int n); | 
|---|
|  | 135 | virtual void to_native  (float *,  const void *,   int n); | 
|---|
|  | 136 | virtual void to_external(void *,   const float *,  int n); | 
|---|
|  | 137 | virtual void to_native  (double *, const void *,   int n); | 
|---|
|  | 138 | virtual void to_external(void *,   const double *, int n); | 
|---|
|  | 139 | }; | 
|---|
|  | 140 |  | 
|---|
|  | 141 | #if BIGENDIAN | 
|---|
|  | 142 | typedef TranslateDataByteSwap TranslateDataLittleEndian; | 
|---|
|  | 143 | typedef TranslateData TranslateDataBigEndian; | 
|---|
|  | 144 | #else | 
|---|
|  | 145 | typedef TranslateDataByteSwap TranslateDataBigEndian; | 
|---|
|  | 146 | typedef TranslateData TranslateDataLittleEndian; | 
|---|
|  | 147 | #endif | 
|---|
|  | 148 |  | 
|---|
|  | 149 | class StateOut; | 
|---|
|  | 150 |  | 
|---|
|  | 151 | /** Convert data to other formats. | 
|---|
|  | 152 | The generated data is inserted into a StateOut object. | 
|---|
|  | 153 | */ | 
|---|
|  | 154 | class TranslateDataOut { | 
|---|
|  | 155 | private: | 
|---|
|  | 156 | StateOut *so_; | 
|---|
|  | 157 | TranslateData *translate_; | 
|---|
|  | 158 | // the translation buffer | 
|---|
|  | 159 | enum { bufsize = 8192 }; | 
|---|
|  | 160 | char buf_[bufsize]; | 
|---|
|  | 161 | protected: | 
|---|
|  | 162 | int putv(const void*d,int s); | 
|---|
|  | 163 | public: | 
|---|
|  | 164 | /** Write to s using the translation defined by t. | 
|---|
|  | 165 | The t argument will be deleted by this. */ | 
|---|
|  | 166 | TranslateDataOut(StateOut*s, TranslateData*t); | 
|---|
|  | 167 | virtual ~TranslateDataOut(); | 
|---|
|  | 168 |  | 
|---|
|  | 169 | /** Translate and write the data. A similar member exists for | 
|---|
|  | 170 | each basic type. */ | 
|---|
|  | 171 | virtual int put(const char*,int); | 
|---|
|  | 172 | virtual int put(const short*,int); | 
|---|
|  | 173 | virtual int put(const unsigned int*,int); | 
|---|
|  | 174 | virtual int put(const int*,int); | 
|---|
|  | 175 | virtual int put(const long*,int); | 
|---|
|  | 176 | virtual int put(const float*,int); | 
|---|
|  | 177 | virtual int put(const double*,int); | 
|---|
|  | 178 |  | 
|---|
|  | 179 | /// Returns the translator. | 
|---|
|  | 180 | TranslateData *translator() { return translate_; } | 
|---|
|  | 181 | }; | 
|---|
|  | 182 |  | 
|---|
|  | 183 | class StateIn; | 
|---|
|  | 184 |  | 
|---|
|  | 185 | /** Convert data from other formats. | 
|---|
|  | 186 | The data is taken from a StateIn object. | 
|---|
|  | 187 | */ | 
|---|
|  | 188 | class TranslateDataIn { | 
|---|
|  | 189 | private: | 
|---|
|  | 190 | StateIn *si_; | 
|---|
|  | 191 | TranslateData *translate_; | 
|---|
|  | 192 | protected: | 
|---|
|  | 193 | int getv(void*d,int s); | 
|---|
|  | 194 | public: | 
|---|
|  | 195 | /** Input data will come from s.  The t argument will be deleted by this. | 
|---|
|  | 196 | */ | 
|---|
|  | 197 | TranslateDataIn(StateIn*s, TranslateData *t); | 
|---|
|  | 198 | virtual ~TranslateDataIn(); | 
|---|
|  | 199 |  | 
|---|
|  | 200 | /** Read and translate data.  A similar member exists for each basic | 
|---|
|  | 201 | type. */ | 
|---|
|  | 202 | virtual int get(char*,int); | 
|---|
|  | 203 | virtual int get(short*,int); | 
|---|
|  | 204 | virtual int get(unsigned int*,int); | 
|---|
|  | 205 | virtual int get(int*,int); | 
|---|
|  | 206 | virtual int get(long*,int); | 
|---|
|  | 207 | virtual int get(float*,int); | 
|---|
|  | 208 | virtual int get(double*,int); | 
|---|
|  | 209 |  | 
|---|
|  | 210 | /// Return the translator. | 
|---|
|  | 211 | TranslateData *translator() { return translate_; } | 
|---|
|  | 212 | }; | 
|---|
|  | 213 |  | 
|---|
|  | 214 | } | 
|---|
|  | 215 |  | 
|---|
|  | 216 | #endif | 
|---|
|  | 217 |  | 
|---|
|  | 218 | // Local Variables: | 
|---|
|  | 219 | // mode: c++ | 
|---|
|  | 220 | // c-file-style: "CLJ" | 
|---|
|  | 221 | // End: | 
|---|