1 #include "csf.h"
2
3 /* global header (opt.) and swapio's prototypes "" */
4 #include "csfimpl.h"
5
6
7 /* headers of this app. modules called */
8
9 /***************/
10 /* EXTERNALS */
11 /***************/
12
13 /**********************/
14 /* LOCAL DECLARATIONS */
15 /**********************/
16
17 /* typedef for swap functions (LIBRARY_INTERNAL)
18 * typedef for swap functions
19 */
20 typedef void (*SWAP)(unsigned char *buf, size_t n);
21 /*********************/
22 /* LOCAL DEFINITIONS */
23 /*********************/
24
25 /******************/
26 /* IMPLEMENTATION */
27 /******************/
28
29 /* check valid size of element (LIBRARY_INTERNAL)
30 */
CsfValidSize(size_t size)31 int CsfValidSize(size_t size)
32 {
33 return size == 1 || size == 2 || size == 4 || size == 8;
34 }
35
36 #ifdef DEBUG
CsfWritePlain(void * buf,size_t size,size_t n,FILE * f)37 size_t CsfWritePlain(void *buf, size_t size, size_t n, FILE *f)
38 {
39 PRECOND(CsfValidSize(size));
40 return fwrite(buf, size, n, f);
41 }
CsfReadPlain(void * buf,size_t size,size_t n,FILE * f)42 size_t CsfReadPlain(void *buf, size_t size, size_t n, FILE *f)
43 {
44 PRECOND(CsfValidSize(size));
45 return fread(buf, size, n, f);
46 }
47 #endif
48
49 /* ARGSUSED */
Swap1(unsigned char * buf,size_t n)50 static void Swap1(unsigned char *buf, size_t n)
51 {
52 /* do nothing */
53 /* Shut up C compiler. */
54 (void)buf;
55 (void)n;
56 }
57
Swap2(unsigned char * b,size_t n)58 static void Swap2(unsigned char *b, size_t n)
59 {
60 unsigned char tmp;
61 size_t i;
62 for (i=0; i < n; i++)
63 {
64 /* 01 => 10 */
65 tmp = b[0]; b[0] = b[1]; b[1] = tmp;
66 b += 2;
67 }
68 }
69
Swap4(unsigned char * b,size_t n)70 static void Swap4(unsigned char *b, size_t n)
71 {
72 unsigned char tmp;
73 size_t i;
74 for (i=0; i < n; i++)
75 {
76 /* 0123 => 3210 */
77 tmp = b[0]; b[0] = b[3]; b[3] = tmp;
78 tmp = b[1]; b[1] = b[2]; b[2] = tmp;
79 b += 4;
80 }
81 }
82
Swap8(unsigned char * b,size_t n)83 static void Swap8(unsigned char *b, size_t n)
84 {
85 unsigned char tmp;
86 size_t i;
87 for (i=0; i < n; i++)
88 {
89 /* 01234567 => 76543210 */
90 tmp = b[0]; b[0] = b[7]; b[7] = tmp;
91 tmp = b[1]; b[1] = b[6]; b[6] = tmp;
92 tmp = b[2]; b[2] = b[5]; b[5] = tmp;
93 tmp = b[3]; b[3] = b[4]; b[4] = tmp;
94 b += 8;
95 }
96 }
97
CsfSwap(void * buf,size_t size,size_t n)98 void CsfSwap(void *buf, size_t size, size_t n)
99 {
100 SWAP l[9] = { NULL, Swap1, Swap2, NULL, Swap4,
101 NULL, NULL, NULL, Swap8};
102 PRECOND(CsfValidSize(size));
103 PRECOND(l[size] != NULL);
104
105 l[size]((unsigned char *)buf,n);
106 }
107
CsfWriteSwapped(void * buf,size_t size,size_t n,FILE * f)108 size_t CsfWriteSwapped(void *buf, size_t size, size_t n, FILE *f)
109 {
110 CsfSwap(buf,size, n);
111 return fwrite(buf, size, n,f);
112 }
113
CsfReadSwapped(void * buf,size_t size,size_t n,FILE * f)114 size_t CsfReadSwapped(void *buf, size_t size, size_t n, FILE *f)
115 {
116 size_t r = fread(buf, size, n,f);
117 CsfSwap(buf,size, r);
118 return r;
119 }
120