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