File: fnetorderstream.h

package info (click to toggle)
ctsim 4.5.2-1.1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 6,536 kB
  • ctags: 3,720
  • sloc: cpp: 26,768; sh: 3,691; ansic: 1,254; perl: 296; makefile: 263
file content (155 lines) | stat: -rw-r--r-- 3,656 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*****************************************************************************
** FILE IDENTIFICATION
**
**   Name:          fnetorderstream.h
**   Purpose:       Network-order file stream header
**   Programmer:    Kevin Rosenberg
**   Date Started:  Sep 2000
**
**  This is part of the CTSim program
**  Copyright (c) 1983-2001 Kevin Rosenberg
**
**  $Id: fnetorderstream.h 7061 2003-09-07 06:34:45Z kevin $
**
**  This program is free software; you can redistribute it and/or modify
**  it under the terms of the GNU General Public License (version 2) as
**  published by the Free Software Foundation.
**
**  This program is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
**  GNU General Public License for more details.
**
**  You should have received a copy of the GNU General Public License
**  along with this program; if not, write to the Free Software
**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
******************************************************************************/


#ifndef NETORDER_H
#define NETORDER_H

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <fstream>
#include <iostream>
#include <string>


inline bool NativeBigEndian (void)
{
#ifdef WORDS_BIGENDIAN
    return true;
#else
    return false;
#endif
}

inline void
SwapBytes2 (void* buffer)
{
  unsigned char* p = static_cast<unsigned char*>(buffer);
  unsigned char temp = p[0];
  p[0] = p[1];
  p[1] = temp;
}

// 0<->3  1<->2 = 0123 -> 3210
inline void
SwapBytes4 (void* buffer)
{
  unsigned char* p = static_cast<unsigned char*>(buffer);
  unsigned char temp = p[0];
  p[0] = p[3];
  p[3] = temp;
  temp = p[1];
  p[1] = p[2];
  p[2] = temp;
}

// 0<->7 1<->6 2<->5 3<->4 = 01234567 -> 76543210
inline void
SwapBytes8 (void* buffer)
{
  unsigned char* p = static_cast<unsigned char*>(buffer);
  unsigned char temp = p[0];
  p[0] = p[7];
  p[7] = temp;
  temp = p[1];
  p[1] = p[6];
  p[6] = temp;
  temp = p[2];
  p[2] = p[5];
  p[5] = temp;
  temp = p[3];
  p[3] = p[4];
  p[4] = temp;
}

inline void
SwapBytes2IfLittleEndian (void* buffer)
{
#ifndef WORDS_BIGENDIAN
  SwapBytes2 (buffer);
#endif
}

inline void
SwapBytes4IfLittleEndian (void* buffer)
{
#ifndef WORDS_BIGENDIAN
  SwapBytes4 (buffer);
#endif
}

inline void
SwapBytes8IfLittleEndian (void* buffer)
{
#ifndef WORDS_BIGENDIAN
  SwapBytes8 (buffer);
#endif
}

void ConvertNetworkOrder (void* buffer, size_t bytes);
void ConvertReverseNetworkOrder (void* buffer, size_t bytes);

using std::fstream;
class fnetorderstream : public fstream {
 public:
  fnetorderstream (const char* filename, std::ios::openmode mode)
	  : fstream (filename, mode) {}

  ~fnetorderstream (void)
      {}

  virtual void writeInt16 (kuint16 n);
  virtual void writeInt32 (kuint32 n);
  virtual void  writeFloat32 (kfloat32 n);
  virtual void  writeFloat64 (kfloat64 n);
  
  virtual void  readInt16 (kuint16& n);
  virtual void  readInt32 (kuint32& n);
  virtual void  readFloat32 (kfloat32& n);
  virtual void  readFloat64 (kfloat64& n);
};


class frnetorderstream : public fnetorderstream {
 public:
  frnetorderstream (const char* filename, std::ios::openmode mode)
    : fnetorderstream (filename, mode) {}

  virtual void writeInt16 (kuint16 n);
  virtual void writeInt32 (kuint32 n);
  virtual void writeFloat32 (kfloat32 n);
  virtual void writeFloat64 (kfloat64 n);
  
  virtual void readInt16 (kuint16& n);
  virtual void readInt32 (kuint32& n);
  virtual void readFloat32 (kfloat32& n);
  virtual void readFloat64 (kfloat64& n);
};

#endif