109 #error Wrong include file (ff.h).
114 #if _MAX_SS != 512 && _MAX_SS != 1024 && _MAX_SS != 2048 && _MAX_SS != 4096
115 #error Wrong sector size.
118 #define SS(fs) ((fs)->ssize)
127 #error Static LFN work area must not be used in re-entrant configuration.
129 #define ENTER_FF(fs) { if (!lock_fs(fs)) return FR_TIMEOUT; }
130 #define LEAVE_FF(fs, res) { unlock_fs(fs, res); return res; }
133 #define LEAVE_FF(fs, res) return res
136 #define ABORT(fs, res) { fp->flag |= FA__ERROR; LEAVE_FF(fs, res); }
142 #error _FS_LOCK must be 0 on read-only cfg.
156 #if _CODE_PAGE == 932
166 #elif _CODE_PAGE == 936
174 #elif _CODE_PAGE == 949
184 #elif _CODE_PAGE == 950
192 #elif _CODE_PAGE == 437
194 #define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F,0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \
195 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
196 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
197 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
199 #elif _CODE_PAGE == 720
201 #define _EXCVT {0x80,0x81,0x45,0x41,0x84,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x49,0x49,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \
202 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
203 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
204 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
206 #elif _CODE_PAGE == 737
208 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \
209 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
210 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
211 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xE7,0xE8,0xF1,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
213 #elif _CODE_PAGE == 775
215 #define _EXCVT {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \
216 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
217 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
218 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
220 #elif _CODE_PAGE == 850
222 #define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \
223 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
224 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
225 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
227 #elif _CODE_PAGE == 852
229 #define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F,0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0x9F, \
230 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \
231 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
232 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF}
234 #elif _CODE_PAGE == 855
236 #define _EXCVT {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F,0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \
237 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \
238 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \
239 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF}
241 #elif _CODE_PAGE == 857
243 #define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x98,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \
244 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
245 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
246 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0x59,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
248 #elif _CODE_PAGE == 858
250 #define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \
251 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
252 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
253 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
255 #elif _CODE_PAGE == 862
257 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \
258 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
259 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
260 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
262 #elif _CODE_PAGE == 866
264 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \
265 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
266 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
267 0x90,0x91,0x92,0x93,0x9d,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
269 #elif _CODE_PAGE == 874
271 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \
272 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
273 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
274 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
276 #elif _CODE_PAGE == 1250
278 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \
279 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xA3,0xB4,0xB5,0xB6,0xB7,0xB8,0xA5,0xAA,0xBB,0xBC,0xBD,0xBC,0xAF, \
280 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
281 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF}
283 #elif _CODE_PAGE == 1251
285 #define _EXCVT {0x80,0x81,0x82,0x82,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x80,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \
286 0xA0,0xA2,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB2,0xA5,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xA3,0xBD,0xBD,0xAF, \
287 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
288 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF}
290 #elif _CODE_PAGE == 1252
292 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xAd,0x9B,0x8C,0x9D,0xAE,0x9F, \
293 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
294 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
295 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F}
297 #elif _CODE_PAGE == 1253
299 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \
300 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
301 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xA2,0xB8,0xB9,0xBA, \
302 0xE0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xFB,0xBC,0xFD,0xBF,0xFF}
304 #elif _CODE_PAGE == 1254
306 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x9D,0x9E,0x9F, \
307 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
308 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
309 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F}
311 #elif _CODE_PAGE == 1255
313 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \
314 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
315 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
316 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}
318 #elif _CODE_PAGE == 1256
320 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x8C,0x9D,0x9E,0x9F, \
321 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
322 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
323 0x41,0xE1,0x41,0xE3,0xE4,0xE5,0xE6,0x43,0x45,0x45,0x45,0x45,0xEC,0xED,0x49,0x49,0xF0,0xF1,0xF2,0xF3,0x4F,0xF5,0xF6,0xF7,0xF8,0x55,0xFA,0x55,0x55,0xFD,0xFE,0xFF}
325 #elif _CODE_PAGE == 1257
327 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \
328 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xBC,0xBD,0xBE,0xAF, \
329 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
330 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF}
332 #elif _CODE_PAGE == 1258
334 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0xAC,0x9D,0x9E,0x9F, \
335 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \
336 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \
337 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xEC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xFE,0x9F}
339 #elif _CODE_PAGE == 1
341 #error Cannot use LFN feature without valid code page.
346 #error Unknown code page
352 #define IsUpper(c) (((c)>='A')&&((c)<='Z'))
353 #define IsLower(c) (((c)>='a')&&((c)<='z'))
354 #define IsDigit(c) (((c)>='0')&&((c)<='9'))
359 #define IsDBCS1(c) (((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) || ((BYTE)(c) >= _DF2S && (BYTE)(c) <= _DF2E))
361 #define IsDBCS1(c) ((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E)
365 #define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E) || ((BYTE)(c) >= _DS3S && (BYTE)(c) <= _DS3E))
367 #define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E))
390 #define MIN_FAT16 4086
391 #define MIN_FAT32 65526
400 #define BPB_BytsPerSec 11
401 #define BPB_SecPerClus 13
402 #define BPB_RsvdSecCnt 14
403 #define BPB_NumFATs 16
404 #define BPB_RootEntCnt 17
405 #define BPB_TotSec16 19
407 #define BPB_FATSz16 22
408 #define BPB_SecPerTrk 24
409 #define BPB_NumHeads 26
410 #define BPB_HiddSec 28
411 #define BPB_TotSec32 32
413 #define BS_BootSig 38
416 #define BS_FilSysType 54
417 #define BPB_FATSz32 36
418 #define BPB_ExtFlags 40
420 #define BPB_RootClus 44
421 #define BPB_FSInfo 48
422 #define BPB_BkBootSec 50
423 #define BS_DrvNum32 64
424 #define BS_BootSig32 66
425 #define BS_VolID32 67
426 #define BS_VolLab32 71
427 #define BS_FilSysType32 82
428 #define FSI_LeadSig 0
429 #define FSI_StrucSig 484
430 #define FSI_Free_Count 488
431 #define FSI_Nxt_Free 492
432 #define MBR_Table 446
439 #define DIR_CrtTimeTenth 13
440 #define DIR_CrtTime 14
441 #define DIR_CrtDate 16
442 #define DIR_LstAccDate 18
443 #define DIR_FstClusHI 20
444 #define DIR_WrtTime 22
445 #define DIR_WrtDate 24
446 #define DIR_FstClusLO 26
447 #define DIR_FileSize 28
451 #define LDIR_Chksum 13
452 #define LDIR_FstClusLO 26
471 #error Number of volumes must not be 0.
484 FILESEM Files[_FS_LOCK];
488 #define DEF_NAMEBUF BYTE sfn[12]
489 #define INIT_BUF(dobj) (dobj).fn = sfn
493 static WCHAR LfnBuf[_MAX_LFN+1];
494 #define DEF_NAMEBUF BYTE sfn[12]
495 #define INIT_BUF(dobj) { (dobj).fn = sfn; (dobj).lfn = LfnBuf; }
499 #define DEF_NAMEBUF BYTE sfn[12]; WCHAR lbuf[_MAX_LFN+1]
500 #define INIT_BUF(dobj) { (dobj).fn = sfn; (dobj).lfn = lbuf; }
504 #define DEF_NAMEBUF BYTE sfn[12]; WCHAR *lfn
505 #define INIT_BUF(dobj) { lfn = ff_memalloc((_MAX_LFN + 1) * 2); \
506 if (!lfn) LEAVE_FF((dobj).fs, FR_NOT_ENOUGH_CORE); \
507 (dobj).lfn = lfn; (dobj).fn = sfn; }
508 #define FREE_BUF() ff_memfree(lfn)
511 #error Wrong LFN configuration.
534 #if _WORD_ACCESS == 1
535 while (cnt >=
sizeof (
int)) {
537 d +=
sizeof (int); s +=
sizeof (int);
557 const BYTE *d = (
const BYTE *)dst, *s = (
const BYTE *)src;
560 while (cnt-- && (r = *d++ - *s++) == 0) ;
567 while (*str && *str != chr) str++;
583 return ff_req_grant(fs->sobj);
598 ff_rel_grant(fs->sobj);
619 for (i = be = 0; i < _FS_LOCK; i++) {
621 if (Files[i].fs == dj->
fs &&
622 Files[i].clu == dj->
sclust &&
623 Files[i].idx == dj->
index)
break;
641 for (i = 0; i < _FS_LOCK && Files[i].fs; i++) ;
642 return (i == _FS_LOCK) ? 0 : 1;
655 for (i = 0; i < _FS_LOCK; i++) {
656 if (Files[i].fs == dj->
fs &&
657 Files[i].clu == dj->
sclust &&
658 Files[i].idx == dj->
index)
break;
662 for (i = 0; i < _FS_LOCK && Files[i].fs; i++) ;
663 if (i == _FS_LOCK)
return 0;
664 Files[i].fs = dj->
fs;
665 Files[i].clu = dj->
sclust;
666 Files[i].idx = dj->
index;
670 if (acc && Files[i].ctr)
return 0;
672 Files[i].ctr = acc ? 0x100 : Files[i].ctr + 1;
687 if (--i < _FS_LOCK) {
689 if (n == 0x100) n = 0;
692 if (!n) Files[i].fs = 0;
708 for (i = 0; i < _FS_LOCK; i++) {
709 if (Files[i].fs == fs) Files[i].fs = 0;
730 if (wsect != sector) {
738 for (nf = fs->
n_fats; nf > 1; nf--) {
809 if (clst >= (fs->
n_fatent - 2))
return 0;
830 if (clst < 2 || clst >= fs->
n_fatent)
835 bc = (
UINT)clst; bc += bc / 2;
837 wc = fs->
win[bc %
SS(fs)]; bc++;
839 wc |= fs->
win[bc %
SS(fs)] << 8;
840 return (clst & 1) ? (wc >> 4) : (wc & 0xFFF);
844 p = &fs->
win[clst * 2 %
SS(fs)];
849 p = &fs->
win[clst * 4 %
SS(fs)];
875 if (clst < 2 || clst >= fs->
n_fatent) {
881 bc = (
UINT)clst; bc += bc / 2;
883 if (res !=
FR_OK)
break;
884 p = &fs->
win[bc %
SS(fs)];
885 *p = (clst & 1) ? ((*p & 0x0F) | ((
BYTE)val << 4)) : (
BYTE)val;
889 if (res !=
FR_OK)
break;
890 p = &fs->
win[bc %
SS(fs)];
891 *p = (clst & 1) ? (
BYTE)(val >> 4) : ((*p & 0xF0) | ((
BYTE)(val >> 8) & 0x0F));
896 if (res !=
FR_OK)
break;
897 p = &fs->
win[clst * 2 %
SS(fs)];
903 if (res !=
FR_OK)
break;
904 p = &fs->
win[clst * 4 %
SS(fs)];
935 DWORD scl = clst, ecl = clst, rt[2];
938 if (clst < 2 || clst >= fs->
n_fatent) {
943 while (clst < fs->n_fatent) {
947 if (nxt == 0xFFFFFFFF) { res =
FR_DISK_ERR;
break; }
949 if (res !=
FR_OK)
break;
955 if (ecl + 1 == nxt) {
991 if (!scl || scl >= fs->
n_fatent) scl = 1;
995 if (cs < 2)
return 1;
996 if (cs < fs->n_fatent)
return cs;
1005 if (ncl > scl)
return 0;
1009 if (cs == 0xFFFFFFFF || cs == 1)
1011 if (ncl == scl)
return 0;
1014 res =
put_fat(fs, ncl, 0x0FFFFFFF);
1015 if (res ==
FR_OK && clst != 0) {
1045 DWORD cl, ncl, *tbl;
1048 tbl = fp->cltbl + 1;
1053 if (cl < ncl)
break;
1126 if (!i || !dj->
sect)
1132 if (dj->
clust == 0) {
1153 for (c = 0; c < dj->
fs->
csize; c++) {
1217 const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30};
1235 wc = ff_wtoupper(uc);
1236 if (i >= _MAX_LFN || wc != ff_wtoupper(lfnbuf[i++]))
1239 if (uc != 0xFFFF)
return 0;
1261 i = ((dir[
LDIR_Ord] & 0x3F) - 1) * 13;
1267 if (i >= _MAX_LFN)
return 0;
1268 lfnbuf[i++] = wc = uc;
1270 if (uc != 0xFFFF)
return 0;
1275 if (i >= _MAX_LFN)
return 0;
1286 const WCHAR *lfnbuf,
1304 if (wc != 0xFFFF) wc = lfnbuf[i++];
1306 if (!wc) wc = 0xFFFF;
1308 if (wc == 0xFFFF || !lfnbuf[i]) ord |=
LLE;
1335 do seq = (seq >> 1) + (seq << 15) + (
WORD)*lfn++;
while (*lfn);
1341 c = (seq % 16) +
'0';
1342 if (c >
'9') c += 7;
1349 for (j = 0; j < i && dst[j] !=
' '; j++) {
1351 if (j == i - 1)
break;
1356 dst[j++] = (i < 8) ? ns[i++] :
' ';
1376 do sum = (sum >> 1) + (sum << 7) + *dir++;
while (--n);
1400 if (res !=
FR_OK)
return res;
1407 if (res !=
FR_OK)
break;
1421 dj->lfn_idx = dj->
index;
1424 ord = (c == ord && sum == dir[
LDIR_Chksum] && cmp_lfn(dj->lfn, dir)) ? ord - 1 : 0xFF;
1427 if (!ord && sum == sum_sfn(dir))
break;
1428 ord = 0xFF; dj->lfn_idx = 0xFFFF;
1437 }
while (res ==
FR_OK);
1448 #if _FS_MINIMIZE <= 1
1457 BYTE a, ord = 0xFF, sum = 0xFF;
1463 if (res !=
FR_OK)
break;
1469 if (c ==
DDE || (!_FS_RPATH && c ==
'.') || ((a &
AM_VOL) && a !=
AM_LFN)) {
1476 dj->lfn_idx = dj->
index;
1479 ord = (c == ord && sum == dir[
LDIR_Chksum] && pick_lfn(dj->lfn, dir)) ? ord - 1 : 0xFF;
1481 if (ord || sum != sum_sfn(dir))
1482 dj->lfn_idx = 0xFFFF;
1491 if (res !=
FR_OK)
break;
1515 BYTE sn[12], *fn, sum;
1519 fn = dj->
fn; lfn = dj->lfn;
1522 if (_FS_RPATH && (sn[
NS] &
NS_DOT))
1526 fn[
NS] = 0; dj->lfn = 0;
1527 for (n = 1; n < 100; n++) {
1528 gen_numname(fn, sn, lfn, n);
1530 if (res !=
FR_OK)
break;
1534 fn[
NS] = sn[
NS]; dj->lfn = lfn;
1538 for (ne = 0; lfn[ne]; ne++) ;
1539 ne = (ne + 25) / 13;
1546 if (res !=
FR_OK)
return res;
1550 if (res !=
FR_OK)
break;
1552 if (c ==
DDE || c == 0) {
1553 if (n == 0) is = dj->
index;
1554 if (++n == ne)
break;
1559 }
while (res ==
FR_OK);
1561 if (res ==
FR_OK && ne > 1) {
1564 sum = sum_sfn(dj->
fn);
1568 if (res !=
FR_OK)
break;
1569 fit_lfn(dj->lfn, dj->
dir, (
BYTE)ne, sum);
1572 }
while (res ==
FR_OK && --ne);
1581 if (res !=
FR_OK)
break;
1583 if (c ==
DDE || c == 0)
break;
1585 }
while (res ==
FR_OK);
1612 #if !_FS_READONLY && !_FS_MINIMIZE
1623 res =
dir_sdi(dj, (
WORD)((dj->lfn_idx == 0xFFFF) ? i : dj->lfn_idx));
1627 if (res !=
FR_OK)
break;
1630 if (dj->
index >= i)
break;
1632 }
while (res ==
FR_OK);
1665 static const BYTE excvt[] = _EXCVT;
1675 for (p = *path; *p ==
'/' || *p ==
'\\'; p++) ;
1680 if (w <
' ' || w ==
'/' || w ==
'\\')
break;
1691 w = ff_convert(w, 1);
1694 if (w < 0x80 &&
chk_chr(
"\"*:<>\?|\x7F", w))
1701 if ((di == 1 && lfn[di-1] ==
'.') ||
1702 (di == 2 && lfn[di-1] ==
'.' && lfn[di-2] ==
'.')) {
1704 for (i = 0; i < 11; i++)
1705 dj->
fn[i] = (i < di) ?
'.' :
' ';
1712 if (w !=
' ' && w !=
'.')
break;
1721 for (si = 0; lfn[si] ==
' ' || lfn[si] ==
'.'; si++) ;
1723 while (di && lfn[di - 1] !=
'.') di--;
1729 if (w ==
' ' || (w ==
'.' && si != di)) {
1733 if (i >= ni || si == di) {
1739 si = di; i = 8; ni = 11;
1745 w = ff_convert(w, 0);
1746 if (w) w = excvt[w - 0x80];
1748 w = ff_convert(ff_wtoupper(w), 0);
1753 if (_DF1S && w >= 0x100) {
1757 dj->
fn[i++] = (
BYTE)(w >> 8);
1759 if (!w ||
chk_chr(
"+,;=[]", w)) {
1776 if (ni == 8) b <<= 2;
1777 if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03)
1780 if ((b & 0x03) == 0x01) cf |=
NS_EXT;
1781 if ((b & 0x0C) == 0x04) cf |=
NS_BODY;
1795 for (p = *path; *p ==
'/' || *p ==
'\\'; p++) ;
1798 si = i = b = 0; ni = 8;
1803 if (c !=
'.' || si >= 3)
break;
1814 if (c <=
' ' || c ==
'/' || c ==
'\\')
break;
1815 if (c ==
'.' || i >= ni) {
1823 c = excvt[c - 0x80];
1832 if (!
IsDBCS2(d) || i >= ni - 1)
1837 if (
chk_chr(
"\"*+,:;<=>\?[]|\x7F", c))
1853 if (sfn[0] ==
DDE) sfn[0] =
NDDE;
1855 if (ni == 8) b <<= 2;
1856 if ((b & 0x03) == 0x01) c |=
NS_EXT;
1857 if ((b & 0x0C) == 0x04) c |=
NS_BODY;
1871 #if _FS_MINIMIZE <= 1
1887 for (i = 0; i < 8; i++) {
1889 if (c ==
' ')
break;
1894 c = (c << 8) | dir[++i];
1895 c = ff_convert(c, 1);
1900 if (dir[8] !=
' ') {
1902 for (i = 8; i < 11; i++) {
1904 if (c ==
' ')
break;
1908 c = (c << 8) | dir[++i];
1909 c = ff_convert(c, 1);
1923 if (fno->lfname && fno->lfsize) {
1924 TCHAR *tp = fno->lfname;
1928 if (dj->
sect && dj->lfn_idx != 0xFFFF) {
1930 while ((w = *lfn++) != 0) {
1932 w = ff_convert(w, 0);
1933 if (!w) { i = 0;
break; }
1934 if (_DF1S && w >= 0x100)
1935 tp[i++] = (
TCHAR)(w >> 8);
1937 if (i >= fno->lfsize - 1) { i = 0;
break; }
1965 if (*path ==
'/' || *path ==
'\\') {
1971 if (*path ==
'/' || *path ==
'\\')
1976 if ((
UINT)*path <
' ') {
1982 if (res !=
FR_OK)
break;
1988 if (_FS_RPATH && (ns &
NS_DOT)) {
1991 if (!(ns &
NS_LAST))
continue;
2049 BYTE fmt, b, pi, *tbl;
2052 DWORD bsect, fasize, tsect, sysect, nclst, szbfat;
2054 const TCHAR *p = *path;
2060 if (vol <= 9 && p[1] ==
':') {
2072 if (vol >= _VOLUMES)
2083 if (!_FS_READONLY && wmode && (stat &
STA_PROTECT))
2097 if (!_FS_READONLY && wmode && (stat &
STA_PROTECT))
2105 if (
LD2PT(vol) && !fmt) fmt = 1;
2147 nclst = (tsect - sysect) / fs->
csize;
2167 if (fs->
fsize < (szbfat + (
SS(fs) - 1)) /
SS(fs))
2252 if (vol >= _VOLUMES)
2261 if (!ff_del_syncobj(rfs->sobj))
return FR_INT_ERR;
2269 if (!ff_cre_syncobj(vol, &fs->sobj))
return FR_INT_ERR;
2316 res = chk_lock(&dj, (mode & ~
FA_READ) ? 1 : 0);
2375 fp->lockid = inc_lock(&dj, (mode & ~
FA_READ) ? 1 : 0);
2424 DWORD clst, sect, remain;
2426 BYTE csect, *rbuff = buff;
2438 if (btr > remain) btr = (
UINT)remain;
2441 rbuff += rcnt, fp->
fptr += rcnt, *br += rcnt, btr -= rcnt) {
2442 if ((fp->
fptr %
SS(fp->
fs)) == 0) {
2445 if (fp->
fptr == 0) {
2450 clst = clmt_clust(fp, fp->
fptr);
2462 cc = btr /
SS(fp->
fs);
2464 if (csect + cc > fp->
fs->
csize)
2468 #if !_FS_READONLY && _FS_MINIMIZE <= 2
2477 rcnt =
SS(fp->
fs) * cc;
2481 if (fp->
dsect != sect) {
2496 if (rcnt > btr) rcnt = btr;
2527 const BYTE *wbuff = buff;
2542 wbuff += wcnt, fp->
fptr += wcnt, *bw += wcnt, btw -= wcnt) {
2543 if ((fp->
fptr %
SS(fp->
fs)) == 0) {
2546 if (fp->
fptr == 0) {
2553 clst = clmt_clust(fp, fp->
fptr);
2558 if (clst == 0)
break;
2576 cc = btw /
SS(fp->
fs);
2578 if (csect + cc > fp->
fs->
csize)
2588 if (fp->
dsect - sect < cc) {
2593 wcnt =
SS(fp->
fs) * cc;
2602 if (fp->
dsect != sect) {
2611 if (wcnt > btw) wcnt = btw;
2708 res = dec_lock(fp->lockid);
2709 unlock_fs(fs,
FR_OK);
2712 res = dec_lock(fp->lockid);
2795 while ((ccl = dj.
sclust) != 0) {
2797 if (res !=
FR_OK)
break;
2799 if (res !=
FR_OK)
break;
2802 if (res !=
FR_OK)
break;
2805 if (res !=
FR_OK)
break;
2808 }
while (res ==
FR_OK);
2810 if (res !=
FR_OK)
break;
2817 if (_USE_LFN && *path) tp = path;
2818 for (n = 0; tp[n]; n++) ;
2822 while (n) path[--i] = tp[--n];
2827 *tp++ =
'0' + CurrVol;
2834 while (i < sz_path);
2848 #if _FS_MINIMIZE <= 2
2868 DWORD cl, pcl, ncl, tcl, dsc, tlen, ulen, *tbl;
2872 tlen = *tbl++; ulen = 2;
2877 tcl = cl; ncl = 0; ulen += 2;
2883 }
while (cl == pcl + 1);
2885 *tbl++ = ncl; *tbl++ = tcl;
2896 if (ofs > fp->
fsize)
2900 fp->
clust = clmt_clust(fp, ofs - 1);
2903 dsc += (ofs - 1) /
SS(fp->
fs) & (fp->
fs->
csize - 1);
2925 DWORD clst, bcs, nsect, ifptr;
2934 fp->
fptr = nsect = 0;
2938 (ofs - 1) / bcs >= (ifptr - 1) / bcs) {
2939 fp->
fptr = (ifptr - 1) & ~(bcs - 1);
2972 if (ofs %
SS(fp->
fs)) {
2975 nsect += ofs /
SS(fp->
fs);
3006 #if _FS_MINIMIZE <= 1
3095 #if _FS_MINIMIZE == 0
3141 DWORD n, clst, sect, stat;
3161 if (stat == 0xFFFFFFFF) { res =
FR_DISK_ERR;
break; }
3164 }
while (++clst < fs->n_fatent);
3172 if (res !=
FR_OK)
break;
3180 if ((
LD_DWORD(p) & 0x0FFFFFFF) == 0) n++;
3223 if (fp->
fptr == 0) {
3268 if (res ==
FR_OK) res = chk_lock(&dj, 2);
3290 || dclst == dj.
fs->cdir
3354 dir[33] =
'.'; pcl = dj.
sclust;
3358 for (n = dj.
fs->
csize; n; n--) {
3362 if (res !=
FR_OK)
break;
3475 const TCHAR *path_old,
3476 const TCHAR *path_new
3494 if (res ==
FR_OK) res = chk_lock(&djo, 2);
3519 if (res ==
FR_OK && dir[1] ==
'.') {
3551 #if _USE_FORWARD && _FS_TINY
3561 DWORD remain, clst, sect;
3578 if (btr > remain) btr = (
UINT)remain;
3580 for ( ; btr && (*func)(0, 0);
3581 fp->
fptr += rcnt, *bf += rcnt, btr -= rcnt) {
3583 if ((fp->
fptr %
SS(fp->
fs)) == 0) {
3585 clst = (fp->
fptr == 0) ?
3599 if (rcnt > btr) rcnt = btr;
3610 #if _USE_MKFS && !_FS_READONLY
3614 #define N_ROOTDIR 512
3624 static const WORD vst[] = { 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 0};
3625 static const WORD cst[] = {32768, 16384, 8192, 4096, 2048, 16384, 8192, 4096, 2048, 1024, 512};
3626 BYTE fmt, md, sys, *tbl, pdrv, part;
3627 DWORD n_clst, vs, n, wsect;
3629 DWORD b_vol, b_fat, b_dir, b_data;
3630 DWORD n_vol, n_rsv, n_fat, n_dir;
3653 if (_MULTI_PARTITION && part) {
3665 b_vol = (sfd) ? 0 : 63;
3670 vs = n_vol / (2000 / (
SS(fs) / 512));
3671 for (i = 0; vs < vst[i]; i++) ;
3675 if (au == 0) au = 1;
3676 if (au > 128) au = 128;
3679 n_clst = n_vol / au;
3686 n_fat = ((n_clst * 4) + 8 +
SS(fs) - 1) /
SS(fs);
3690 n_fat = (fmt ==
FS_FAT12) ? (n_clst * 3 + 1) / 2 + 3 : (n_clst * 2) + 4;
3691 n_fat = (n_fat +
SS(fs) - 1) /
SS(fs);
3695 b_fat = b_vol + n_rsv;
3696 b_dir = b_fat + n_fat * N_FATS;
3697 b_data = b_dir + n_dir;
3702 n = (b_data + n - 1) & ~(n - 1);
3703 n = (n - b_data) / N_FATS;
3712 n_clst = (n_vol - n_rsv - n_fat * N_FATS - n_dir) / au;
3719 case FS_FAT16: sys = (n_vol < 0x10000) ? 0x04 : 0x06;
break;
3720 default: sys = 0x0C;
3723 if (_MULTI_PARTITION && part) {
3740 n = (b_vol + n_vol) / 63 / 255;
3741 tbl[6] = (
BYTE)((n >> 2) | 63);
3755 mem_cpy(tbl,
"\xEB\xFE\x90" "MSDOS5.0", 11);
3761 i = (fmt ==
FS_FAT32) ? 0 : N_ROOTDIR;
3763 if (n_vol < 0x10000) {
3797 for (i = 0; i < N_FATS; i++) {
3801 n |= (fmt ==
FS_FAT12) ? 0x00FFFF00 : 0xFFFFFF00;
3812 for (n = 1; n < n_fat; n++) {
3819 i = (fmt ==
FS_FAT32) ? au : n_dir;
3829 eb[0] = wsect; eb[1] = wsect + (n_clst - ((fmt ==
FS_FAT32) ? 1 : 0)) * au - 1;
3849 #if _MULTI_PARTITION == 2
3860 UINT i, n, sz_cyl, tot_cyl, b_cyl, e_cyl, p_cyl;
3861 BYTE s_hd, e_hd, *p, *buf = (
BYTE*)work;
3863 DWORD sz_disk, sz_part, s_part;
3872 for (n = 16; n < 256 && sz_disk / n / 63 > 1024; n *= 2) ;
3876 tot_cyl = sz_disk / sz_cyl;
3881 for (i = 0; i < 4; i++, p +=
SZ_PTE) {
3882 p_cyl = (szt[i] <= 100) ? (
DWORD)tot_cyl * szt[i] / 100 : szt[i] / sz_cyl;
3883 if (!p_cyl)
continue;
3884 s_part = (
DWORD)sz_cyl * b_cyl;
3885 sz_part = (
DWORD)sz_cyl * p_cyl;
3888 s_part += 63; sz_part -= 63;
3892 e_cyl = b_cyl + p_cyl - 1;
3897 p[2] = (
BYTE)((b_cyl >> 2) + 1);
3901 p[6] = (
BYTE)((e_cyl >> 2) + 63);
3938 while (n < len - 1) {
3944 if (c < 0xC0)
continue;
3948 c = ((c & 0x1F) << 6) | (s[0] & 0x3F);
3949 if (c < 0x80) c =
'?';
3954 c = (c << 12) | ((s[0] & 0x3F) << 6) | (s[1] & 0x3F);
3955 if (c < 0x800) c =
'?';
3962 #if _USE_STRFUNC >= 2
3963 if (c ==
'\r')
continue;
3967 if (c ==
'\n')
break;
3970 return n ? buff : 0;
3989 #if _USE_STRFUNC >= 2
3990 if (c ==
'\n')
f_putc (
'\r', fil);
3999 s[0] = (
BYTE)(0xC0 | (c >> 6));
4000 s[1] = (
BYTE)(0x80 | (c & 0x3F));
4003 s[0] = (
BYTE)(0xE0 | (c >> 12));
4004 s[1] = (
BYTE)(0x80 | ((c >> 6) & 0x3F));
4005 s[2] = (
BYTE)(0x80 | (c & 0x3F));
4014 return (bw == btw) ? 1 :
EOF;
4031 for (n = 0; *str; str++, n++) {
4053 TCHAR c, d, s[16], *p;
4059 for (cc = res = 0; cc !=
EOF; res += cc) {
4064 if (cc !=
EOF) cc = 1;
4077 w = w * 10 + c -
'0';
4080 if (c ==
'l' || c ==
'L') {
4088 p = va_arg(arp,
TCHAR*);
4089 for (j = 0; p[j]; j++) ;
4092 while (j++ < w) chc += (cc =
f_putc(
' ', fil));
4094 chc += (cc =
f_puts(p, fil));
4095 while (j++ < w) chc += (cc =
f_putc(
' ', fil));
4096 if (cc !=
EOF) cc = chc;
4099 cc =
f_putc((
TCHAR)va_arg(arp,
int), fil);
continue;
4110 cc =
f_putc(c, fil);
continue;
4114 v = (f & 4) ? (
ULONG)va_arg(arp,
long) : ((d ==
'D') ? (
ULONG)(long)va_arg(arp, int) : (
ULONG)va_arg(arp, unsigned int));
4115 if (d ==
'D' && (v & 0x80000000)) {
4121 d = (
TCHAR)(v % r); v /= r;
4122 if (d > 9) d += (c ==
'x') ? 0x27 : 0x07;
4124 }
while (v && i <
sizeof s /
sizeof s[0]);
4125 if (f & 8) s[i++] =
'-';
4126 j = i; d = (f & 1) ?
'0' :
' ';
4128 while (!(f & 2) && j++ < w) res += (cc =
f_putc(d, fil));
4129 do res += (cc =
f_putc(s[--i], fil));
while(i);
4130 while (j++ < w) res += (cc =
f_putc(
' ', fil));
4131 if (cc !=
EOF) cc = res;
4135 return (cc ==
EOF) ? cc : res;