-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcdata-encode.c
More file actions
116 lines (96 loc) · 2.28 KB
/
cdata-encode.c
File metadata and controls
116 lines (96 loc) · 2.28 KB
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
/*
Copyright 2022 James R.
All rights reserved.
Redistribution and use in source and binary forms, with or
without modification, is permitted provided that the
following condition is met:
Redistributions of source code must retain the above
copyright notice, this condition and the following
disclaimer.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
*/
#include "cdata.h"
void
cdata_encode16
( void * buffer,
long val)
{
unsigned char *p = buffer;
p[0] = (val & 0xFF);
p[1] = ((val >> 8) & 0xFF);
}
void
cdata_encode32
( void * buffer,
long val)
{
unsigned char *p = buffer;
cdata_encode16(p, val);
cdata_encode16(&p[2], (val >> 16));
}
long
cdata_decode16 (const void *buffer)
{
const unsigned char *p = buffer;
return (p[0] | (p[1] << 8));
}
long
cdata_decode32 (const void *buffer)
{
const unsigned char *p = buffer;
return (cdata_decode16(p) |
(cdata_decode16(&p[2]) << 16));
}
int
cdata_size_bytes (size_t n)
{
n <<= 2;
return (1 << ((n > 0xFC) + (n > 0xFFFC)));
}
int
cdata_encode_size
( void * buffer,
size_t val)
{
const size_t enc = (val << 2);
const int nbs = cdata_size_bytes(val);
switch (nbs)
{
case 4:
cdata_encode32(buffer, ((enc & 0xFFFFFFFF) | 2));
break;
case 2:
cdata_encode16(buffer, ((enc & 0xFFFF) | 1));
break;
default:
*(unsigned char*)buffer = (enc & 0xFF);
}
return nbs;
}
size_t
cdata_decode_size (const void *buffer)
{
const int enc = *(const unsigned char*)buffer;
switch (enc & 3)
{
case 2:
return (cdata_decode32(buffer) >> 2);
case 1:
return (cdata_decode16(buffer) >> 2);
default:
return (enc >> 2);
}
}