ReactOS 0.4.15-dev-7842-g558ab78
encint.h
Go to the documentation of this file.
1/*
2
3 Copyright (C) 2010 Alex Andreotti <alex.andreotti@gmail.com>
4
5 This file is part of chmc.
6
7 chmc is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 chmc is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with chmc. If not, see <http://www.gnu.org/licenses/>.
19
20*/
21#ifndef CHMC_ENCINT_H
22#define CHMC_ENCINT_H
23
24// 0x7f 127
25// 0x3fff 16383
26// 0x1fffff 2097151
27// 0xfffffff 268435455
28static inline int chmc_encint_len ( const UInt32 val ) {
29 int len;
30
31 // FIXME should support 64 bit?
32 if ( val > 0xfffffffUL )
33 len = 0; // overflow
34 else if ( val > 0x1fffffUL )
35 len = 4;
36 else if ( val > 0x3fffUL )
37 len = 3;
38 else if ( val > 0x7fUL )
39 len = 2;
40 else
41 len = 1;
42
43 return len;
44}
45
46static inline int chmc_encint ( const UInt32 val, UChar *out ) {
47 int len;
48 UInt32 a;
49 UChar *p, *l;
50
51 // FIXME should support 64 bit?
52 if ( ! out || val > 0xfffffffUL )
53 return 0; // FIXME can't handle, overflow
54
55 if ( val > 0x1fffffUL )
56 len = 4;
57 else if ( val > 0x3fffUL )
58 len = 3;
59 else if ( val > 0x7fUL )
60 len = 2;
61 else
62 len = 1;
63
64 a = val;
65 l = p = out + (len - 1);
66
67 while ( p >= out ) {
68 *p = (a & 0x7fUL);
69 if ( p < l )
70 *p |= 0x80UL;
71 p--;
72 a >>= 7;
73 }
74
75 return len;
76}
77
78static inline int chmc_decint ( const UChar *in, UInt32 *value ) {
79 int len;
80
81 len = 0;
82 *value = 0;
83
84 while ( (in[len] & 0x80) && (len < 3) ) {
85 *value <<= 7;
86 *value |= in[len] & 0x7f;
87 len++;
88 }
89 *value <<= 7;
90 *value |= in[len] & 0x7f;
91 len++;
92
93 return len;
94}
95
96#endif /* CHMC_ENCINT_H */
r l[0]
Definition: byte_order.h:168
DWORD UInt32
Definition: chm_lib.c:104
BYTE UChar
Definition: chm_lib.c:100
static int chmc_encint(const UInt32 val, UChar *out)
Definition: encint.h:46
static int chmc_decint(const UChar *in, UInt32 *value)
Definition: encint.h:78
static int chmc_encint_len(const UInt32 val)
Definition: encint.h:28
GLuint in
Definition: glext.h:9616
GLuint GLfloat * val
Definition: glext.h:7180
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
#define a
Definition: ke_i.h:78
static FILE * out
Definition: regtests2xml.c:44
Definition: pdh_main.c:94