forked from dorimanx/exfat-nofuse
-
Notifications
You must be signed in to change notification settings - Fork 0
/
exfat_global.c
150 lines (122 loc) · 4.66 KB
/
exfat_global.c
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/************************************************************************/
/* */
/* PROJECT : exFAT & FAT12/16/32 File System */
/* FILE : exfat_global.c */
/* PURPOSE : exFAT Miscellaneous Functions */
/* */
/*----------------------------------------------------------------------*/
/* NOTES */
/* */
/*----------------------------------------------------------------------*/
/* REVISION HISTORY (Ver 0.9) */
/* */
/* - 2010.11.15 [Joosun Hahn] : first writing */
/* */
/************************************************************************/
#include "exfat_config.h"
#include "exfat_global.h"
/*----------------------------------------------------------------------*/
/* Global Variable Definitions */
/*----------------------------------------------------------------------*/
/*======================================================================*/
/* */
/* LIBRARY FUNCTION DEFINITIONS -- WELL-KNOWN FUNCTIONS */
/* */
/*======================================================================*/
/*----------------------------------------------------------------------*/
/* String Manipulation Functions */
/* (defined if no system memory functions are available) */
/*----------------------------------------------------------------------*/
INT32 __wstrchr(UINT16 *str, UINT16 wchar)
{
while (*str) {
if (*(str++) == wchar) return(1);
}
return(0);
}
INT32 __wstrlen(UINT16 *str)
{
INT32 length = 0;
while (*(str++)) length++;
return(length);
}
/*======================================================================*/
/* */
/* LIBRARY FUNCTION DEFINITIONS -- OTHER UTILITY FUNCTIONS */
/* */
/*======================================================================*/
/*----------------------------------------------------------------------*/
/* Bitmap Manipulation Functions */
/*----------------------------------------------------------------------*/
#define BITMAP_LOC(v) ((v) >> 3)
#define BITMAP_SHIFT(v) ((v) & 0x07)
void Bitmap_set_all(UINT8 *bitmap, INT32 mapsize)
{
MEMSET(bitmap, 0xFF, mapsize);
} /* end of Bitmap_set_all */
void Bitmap_clear_all(UINT8 *bitmap, INT32 mapsize)
{
MEMSET(bitmap, 0x0, mapsize);
} /* end of Bitmap_clear_all */
INT32 Bitmap_test(UINT8 *bitmap, INT32 i)
{
UINT8 data;
data = bitmap[BITMAP_LOC(i)];
if ((data >> BITMAP_SHIFT(i)) & 0x01) return(1);
return(0);
} /* end of Bitmap_test */
void Bitmap_set(UINT8 *bitmap, INT32 i)
{
bitmap[BITMAP_LOC(i)] |= (0x01 << BITMAP_SHIFT(i));
} /* end of Bitmap_set */
void Bitmap_clear(UINT8 *bitmap, INT32 i)
{
bitmap[BITMAP_LOC(i)] &= ~(0x01 << BITMAP_SHIFT(i));
} /* end of Bitmap_clear */
void Bitmap_nbits_set(UINT8 *bitmap, INT32 offset, INT32 nbits)
{
INT32 i;
for (i = 0; i < nbits; i++) {
Bitmap_set(bitmap, offset+i);
}
} /* end of Bitmap_nbits_set */
void Bitmap_nbits_clear(UINT8 *bitmap, INT32 offset, INT32 nbits)
{
INT32 i;
for (i = 0; i < nbits; i++) {
Bitmap_clear(bitmap, offset+i);
}
} /* end of Bitmap_nbits_clear */
/*----------------------------------------------------------------------*/
/* Miscellaneous Library Functions */
/*----------------------------------------------------------------------*/
/* integer to ascii conversion */
void my_itoa(INT8 *buf, INT32 v)
{
INT32 mod[10];
INT32 i;
for (i = 0; i < 10; i++) {
mod[i] = (v % 10);
v = v / 10;
if (v == 0) break;
}
if (i == 10)
i--;
for (; i >= 0; i--) {
*buf = (UINT8) ('0' + mod[i]);
buf++;
}
*buf = '\0';
} /* end of my_itoa */
/* value to base 2 log conversion */
INT32 my_log2(UINT32 v)
{
UINT32 bits = 0;
while (v > 1) {
if (v & 0x01) return(-1);
v >>= 1;
bits++;
}
return(bits);
} /* end of my_log2 */
/* end of exfat_global.c */