GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: src/nrrd/endianNrrd.c Lines: 0 41 0.0 %
Date: 2017-05-26 Branches: 0 18 0.0 %

Line Branch Exec Source
1
/*
2
  Teem: Tools to process and visualize scientific data and images             .
3
  Copyright (C) 2013, 2012, 2011, 2010, 2009  University of Chicago
4
  Copyright (C) 2008, 2007, 2006, 2005  Gordon Kindlmann
5
  Copyright (C) 2004, 2003, 2002, 2001, 2000, 1999, 1998  University of Utah
6
7
  This library is free software; you can redistribute it and/or
8
  modify it under the terms of the GNU Lesser General Public License
9
  (LGPL) as published by the Free Software Foundation; either
10
  version 2.1 of the License, or (at your option) any later version.
11
  The terms of redistributing and/or modifying this software also
12
  include exceptions to the LGPL that facilitate static linking.
13
14
  This library is distributed in the hope that it will be useful,
15
  but WITHOUT ANY WARRANTY; without even the implied warranty of
16
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17
  Lesser General Public License for more details.
18
19
  You should have received a copy of the GNU Lesser General Public License
20
  along with this library; if not, write to Free Software Foundation, Inc.,
21
  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
22
*/
23
24
#include "nrrd.h"
25
26
static void
27
_nrrdSwap16Endian(void *_data, size_t N) {
28
  unsigned short *data, dd, fix, mask;
29
  size_t I;
30
31
  if (!_data) {
32
    return;
33
  }
34
  data = AIR_CAST(unsigned short *, _data);
35
  mask = AIR_CAST(unsigned short, 0x00FFu);
36
  for (I=0; I<N; I++) {
37
    dd = data[I];
38
    fix = (dd & mask); dd >>= 0x08;
39
    fix = (dd & mask) | AIR_CAST(unsigned short, fix << 0x08);
40
    data[I] = fix;
41
  }
42
}
43
44
static void
45
_nrrdSwap32Endian(void *_data, size_t N) {
46
  unsigned int *data, dd, fix, mask;
47
  size_t I;
48
49
  if (!_data) {
50
    return;
51
  }
52
  data = AIR_CAST(unsigned int *, _data);
53
  mask = 0x000000FFu;
54
  for (I=0; I<N; I++) {
55
    dd = data[I];
56
    fix = (dd & mask);                 dd >>= 0x08;
57
    fix = (dd & mask) | (fix << 0x08); dd >>= 0x08;
58
    fix = (dd & mask) | (fix << 0x08); dd >>= 0x08;
59
    fix = (dd & mask) | (fix << 0x08);
60
    data[I] = fix;
61
  }
62
}
63
64
static void
65
_nrrdSwap64Endian(void *_data, size_t N) {
66
  airULLong *data, dd, fix, mask;
67
  size_t I;
68
69
  if (!_data) {
70
    return;
71
  }
72
  data = AIR_CAST(airULLong *, _data);
73
  mask = AIR_ULLONG(0x00000000000000FF);
74
  for (I=0; I<N; I++) {
75
    dd = data[I];
76
    fix = (dd & mask);                 dd >>= 0x08;
77
    fix = (dd & mask) | (fix << 0x08); dd >>= 0x08;
78
    fix = (dd & mask) | (fix << 0x08); dd >>= 0x08;
79
    fix = (dd & mask) | (fix << 0x08); dd >>= 0x08;
80
    fix = (dd & mask) | (fix << 0x08); dd >>= 0x08;
81
    fix = (dd & mask) | (fix << 0x08); dd >>= 0x08;
82
    fix = (dd & mask) | (fix << 0x08); dd >>= 0x08;
83
    fix = (dd & mask) | (fix << 0x08);
84
    data[I] = fix;
85
  }
86
}
87
88
static void
89
_nrrdNoopEndian(void *data, size_t N) {
90
  AIR_UNUSED(data);
91
  AIR_UNUSED(N);
92
  return;
93
}
94
95
static void
96
_nrrdBlockEndian(void *data, size_t N) {
97
  char me[]="_nrrdBlockEndian";
98
99
  AIR_UNUSED(data);
100
  AIR_UNUSED(N);
101
  fprintf(stderr, "%s: WARNING: can't fix endiannes of nrrd type %s\n", me,
102
          airEnumStr(nrrdType, nrrdTypeBlock));
103
}
104
105
static void
106
(*_nrrdSwapEndian[])(void *, size_t) = {
107
  _nrrdNoopEndian,         /*  0: nobody knows! */
108
  _nrrdNoopEndian,         /*  1:   signed 1-byte integer */
109
  _nrrdNoopEndian,         /*  2: unsigned 1-byte integer */
110
  _nrrdSwap16Endian,       /*  3:   signed 2-byte integer */
111
  _nrrdSwap16Endian,       /*  4: unsigned 2-byte integer */
112
  _nrrdSwap32Endian,       /*  5:   signed 4-byte integer */
113
  _nrrdSwap32Endian,       /*  6: unsigned 4-byte integer */
114
  _nrrdSwap64Endian,       /*  7:   signed 8-byte integer */
115
  _nrrdSwap64Endian,       /*  8: unsigned 8-byte integer */
116
  _nrrdSwap32Endian,       /*  9:          4-byte floating point */
117
  _nrrdSwap64Endian,       /* 10:          8-byte floating point */
118
  _nrrdBlockEndian         /* 11: size user defined at run time */
119
};
120
121
void
122
nrrdSwapEndian(Nrrd *nrrd) {
123
124
  if (nrrd
125
      && nrrd->data
126
      && !airEnumValCheck(nrrdType, nrrd->type)) {
127
    _nrrdSwapEndian[nrrd->type](nrrd->data, nrrdElementNumber(nrrd));
128
  }
129
  return;
130
}