FATFileSystem fork with fixes
Fork of FATFileSystem by
Diff: ChaN/ff.cpp
- Revision:
- 3:e960e2b81a3c
- Parent:
- 1:46ce1e16c870
- Child:
- 4:3ff2606d5713
--- a/ChaN/ff.cpp Thu Nov 29 10:56:08 2012 +0000 +++ b/ChaN/ff.cpp Mon Mar 17 14:09:00 2014 +0000 @@ -527,14 +527,16 @@ /* Copy memory to memory */ static -void mem_cpy (void* dst, const void* src, UINT cnt) { +void mem_cpy (void* dst, const void* src, UINT cnt) +{ BYTE *d = (BYTE*)dst; const BYTE *s = (const BYTE*)src; #if _WORD_ACCESS == 1 while (cnt >= sizeof (int)) { *(int*)d = *(int*)s; - d += sizeof (int); s += sizeof (int); + d += sizeof (int); + s += sizeof (int); cnt -= sizeof (int); } #endif @@ -544,7 +546,8 @@ /* Fill memory */ static -void mem_set (void* dst, int val, UINT cnt) { +void mem_set (void* dst, int val, UINT cnt) +{ BYTE *d = (BYTE*)dst; while (cnt--) @@ -553,7 +556,8 @@ /* Compare memory to memory */ static -int mem_cmp (const void* dst, const void* src, UINT cnt) { +int mem_cmp (const void* dst, const void* src, UINT cnt) +{ const BYTE *d = (const BYTE *)dst, *s = (const BYTE *)src; int r = 0; @@ -563,7 +567,8 @@ /* Check if chr is contained in the string */ static -int chk_chr (const char* str, int chr) { +int chk_chr (const char* str, int chr) +{ while (*str && *str != chr) str++; return *str; } @@ -591,10 +596,10 @@ ) { if (fs && - res != FR_NOT_ENABLED && - res != FR_INVALID_DRIVE && - res != FR_INVALID_OBJECT && - res != FR_TIMEOUT) { + res != FR_NOT_ENABLED && + res != FR_INVALID_DRIVE && + res != FR_INVALID_OBJECT && + res != FR_TIMEOUT) { ff_rel_grant(fs->sobj); } } @@ -619,8 +624,8 @@ for (i = be = 0; i < _FS_LOCK; i++) { if (Files[i].fs) { /* Existing entry */ if (Files[i].fs == dj->fs && /* Check if the file matched with an open file */ - Files[i].clu == dj->sclust && - Files[i].idx == dj->index) break; + Files[i].clu == dj->sclust && + Files[i].idx == dj->index) break; } else { /* Blank entry */ be++; } @@ -654,8 +659,8 @@ for (i = 0; i < _FS_LOCK; i++) { /* Find the file */ if (Files[i].fs == dj->fs && - Files[i].clu == dj->sclust && - Files[i].idx == dj->index) break; + Files[i].clu == dj->sclust && + Files[i].idx == dj->index) break; } if (i == _FS_LOCK) { /* Not opened. Register it as new. */ @@ -831,23 +836,25 @@ return 1; switch (fs->fs_type) { - case FS_FAT12 : - bc = (UINT)clst; bc += bc / 2; - if (move_window(fs, fs->fatbase + (bc / SS(fs)))) break; - wc = fs->win[bc % SS(fs)]; bc++; - if (move_window(fs, fs->fatbase + (bc / SS(fs)))) break; - wc |= fs->win[bc % SS(fs)] << 8; - return (clst & 1) ? (wc >> 4) : (wc & 0xFFF); - - case FS_FAT16 : - if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 2)))) break; - p = &fs->win[clst * 2 % SS(fs)]; - return LD_WORD(p); - - case FS_FAT32 : - if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4)))) break; - p = &fs->win[clst * 4 % SS(fs)]; - return LD_DWORD(p) & 0x0FFFFFFF; + case FS_FAT12 : + bc = (UINT)clst; + bc += bc / 2; + if (move_window(fs, fs->fatbase + (bc / SS(fs)))) break; + wc = fs->win[bc % SS(fs)]; + bc++; + if (move_window(fs, fs->fatbase + (bc / SS(fs)))) break; + wc |= fs->win[bc % SS(fs)] << 8; + return (clst & 1) ? (wc >> 4) : (wc & 0xFFF); + + case FS_FAT16 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 2)))) break; + p = &fs->win[clst * 2 % SS(fs)]; + return LD_WORD(p); + + case FS_FAT32 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4)))) break; + p = &fs->win[clst * 4 % SS(fs)]; + return LD_DWORD(p) & 0x0FFFFFFF; } return 0xFFFFFFFF; /* An error occurred at the disk I/O layer */ @@ -877,37 +884,38 @@ } else { switch (fs->fs_type) { - case FS_FAT12 : - bc = (UINT)clst; bc += bc / 2; - res = move_window(fs, fs->fatbase + (bc / SS(fs))); - if (res != FR_OK) break; - p = &fs->win[bc % SS(fs)]; - *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; - bc++; - fs->wflag = 1; - res = move_window(fs, fs->fatbase + (bc / SS(fs))); - if (res != FR_OK) break; - p = &fs->win[bc % SS(fs)]; - *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); - break; - - case FS_FAT16 : - res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))); - if (res != FR_OK) break; - p = &fs->win[clst * 2 % SS(fs)]; - ST_WORD(p, (WORD)val); - break; - - case FS_FAT32 : - res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))); - if (res != FR_OK) break; - p = &fs->win[clst * 4 % SS(fs)]; - val |= LD_DWORD(p) & 0xF0000000; - ST_DWORD(p, val); - break; - - default : - res = FR_INT_ERR; + case FS_FAT12 : + bc = (UINT)clst; + bc += bc / 2; + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc % SS(fs)]; + *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; + bc++; + fs->wflag = 1; + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc % SS(fs)]; + *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); + break; + + case FS_FAT16 : + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))); + if (res != FR_OK) break; + p = &fs->win[clst * 2 % SS(fs)]; + ST_WORD(p, (WORD)val); + break; + + case FS_FAT32 : + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))); + if (res != FR_OK) break; + p = &fs->win[clst * 4 % SS(fs)]; + val |= LD_DWORD(p) & 0xF0000000; + ST_DWORD(p, val); + break; + + default : + res = FR_INT_ERR; } fs->wflag = 1; } @@ -943,8 +951,14 @@ while (clst < fs->n_fatent) { /* Not a last link? */ nxt = get_fat(fs, clst); /* Get cluster status */ if (nxt == 0) break; /* Empty cluster? */ - if (nxt == 1) { res = FR_INT_ERR; break; } /* Internal error? */ - if (nxt == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } /* Disk error? */ + if (nxt == 1) { + res = FR_INT_ERR; /* Internal error? */ + break; + } + if (nxt == 0xFFFFFFFF) { + res = FR_DISK_ERR; /* Disk error? */ + break; + } res = put_fat(fs, clst, 0); /* Mark the cluster "empty" */ if (res != FR_OK) break; if (fs->free_clust != 0xFFFFFFFF) { /* Update FSInfo */ @@ -989,8 +1003,7 @@ if (clst == 0) { /* Create a new chain */ scl = fs->last_clust; /* Get suggested start point */ if (!scl || scl >= fs->n_fatent) scl = 1; - } - else { /* Stretch the current chain */ + } else { /* Stretch the current chain */ cs = get_fat(fs, clst); /* Check the cluster status */ if (cs < 2) return 1; /* It is an invalid cluster */ if (cs < fs->n_fatent) return cs; /* It is already followed by next cluster */ @@ -1051,7 +1064,8 @@ ncl = *tbl++; /* Number of cluters in the fragment */ if (!ncl) return 0; /* End of table? (error) */ if (cl < ncl) break; /* In this fragment? */ - cl -= ncl; tbl++; /* Next fragment */ + cl -= ncl; + tbl++; /* Next fragment */ } return cl + *tbl; /* Return the cluster number */ } @@ -1085,8 +1099,7 @@ if (idx >= dj->fs->n_rootdir) /* Index is out of range */ return FR_INT_ERR; dj->sect = dj->fs->dirbase + idx / (SS(dj->fs) / SZ_DIR); /* Sector# */ - } - else { /* Dynamic table (sub-dirs or root-dir in FAT32) */ + } else { /* Dynamic table (sub-dirs or root-dir in FAT32) */ ic = SS(dj->fs) / SZ_DIR * dj->fs->csize; /* Entries per cluster */ while (idx >= ic) { /* Follow cluster chain */ clst = get_fat(dj->fs, clst); /* Get next cluster */ @@ -1132,8 +1145,7 @@ if (dj->clust == 0) { /* Static table */ if (i >= dj->fs->n_rootdir) /* Report EOT when end of table */ return FR_NO_FILE; - } - else { /* Dynamic table */ + } else { /* Dynamic table */ if (((i / (SS(dj->fs) / SZ_DIR)) & (dj->fs->csize - 1)) == 0) { /* Cluster changed? */ clst = get_fat(dj->fs, dj->clust); /* Get next cluster */ if (clst <= 1) return FR_INT_ERR; @@ -1228,7 +1240,8 @@ i = ((dir[LDIR_Ord] & ~LLE) - 1) * 13; /* Get offset in the LFN buffer */ - s = 0; wc = 1; + s = 0; + wc = 1; do { uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ if (wc) { /* Last char has not been processed */ @@ -1260,7 +1273,8 @@ i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ - s = 0; wc = 1; + s = 0; + wc = 1; do { uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ if (wc) { /* Last char has not been processed */ @@ -1332,7 +1346,8 @@ mem_cpy(dst, src, 11); if (seq > 5) { /* On many collisions, generate a hash number instead of sequential number */ - do seq = (seq >> 1) + (seq << 15) + (WORD)*lfn++; while (*lfn); + do seq = (seq >> 1) + (seq << 15) + (WORD)*lfn++; + while (*lfn); } /* itoa (hexdecimal) */ @@ -1373,7 +1388,8 @@ BYTE sum = 0; UINT n = 11; - do sum = (sum >> 1) + (sum << 7) + *dir++; while (--n); + do sum = (sum >> 1) + (sum << 7) + *dir++; + while (--n); return sum; } #endif @@ -1407,7 +1423,10 @@ if (res != FR_OK) break; dir = dj->dir; /* Ptr to the directory entry of current index */ c = dir[DIR_Name]; - if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ + if (c == 0) { + res = FR_NO_FILE; /* Reached to end of table */ + break; + } #if _USE_LFN /* LFN configuration */ a = dir[DIR_Attr] & AM_MASK; if (c == DDE || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ @@ -1417,7 +1436,8 @@ if (dj->lfn) { if (c & LLE) { /* Is it start of LFN sequence? */ sum = dir[LDIR_Chksum]; - c &= ~LLE; ord = c; /* LFN start order */ + c &= ~LLE; + ord = c; /* LFN start order */ dj->lfn_idx = dj->index; } /* Check validity of the LFN entry and compare it with given name */ @@ -1425,7 +1445,8 @@ } } else { /* An SFN entry is found */ if (!ord && sum == sum_sfn(dir)) break; /* LFN matched? */ - ord = 0xFF; dj->lfn_idx = 0xFFFF; /* Reset LFN sequence */ + ord = 0xFF; + dj->lfn_idx = 0xFFFF; /* Reset LFN sequence */ if (!(dj->fn[NS] & NS_LOSS) && !mem_cmp(dir, dj->fn, 11)) break; /* SFN matched? */ } } @@ -1463,7 +1484,10 @@ if (res != FR_OK) break; dir = dj->dir; /* Ptr to the directory entry of current index */ c = dir[DIR_Name]; - if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ + if (c == 0) { + res = FR_NO_FILE; /* Reached to end of table */ + break; + } #if _USE_LFN /* LFN configuration */ a = dir[DIR_Attr] & AM_MASK; if (c == DDE || (!_FS_RPATH && c == '.') || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ @@ -1472,7 +1496,8 @@ if (a == AM_LFN) { /* An LFN entry is found */ if (c & LLE) { /* Is it start of LFN sequence? */ sum = dir[LDIR_Chksum]; - c &= ~LLE; ord = c; + c &= ~LLE; + ord = c; dj->lfn_idx = dj->index; } /* Check LFN validity and capture it */ @@ -1516,14 +1541,16 @@ WCHAR *lfn; - fn = dj->fn; lfn = dj->lfn; + fn = dj->fn; + lfn = dj->lfn; mem_cpy(sn, fn, 12); if (_FS_RPATH && (sn[NS] & NS_DOT)) /* Cannot create dot entry */ return FR_INVALID_NAME; if (sn[NS] & NS_LOSS) { /* When LFN is out of 8.3 format, generate a numbered name */ - fn[NS] = 0; dj->lfn = 0; /* Find only SFN */ + fn[NS] = 0; + dj->lfn = 0; /* Find only SFN */ for (n = 1; n < 100; n++) { gen_numname(fn, sn, lfn, n); /* Generate a numbered name */ res = dir_find(dj); /* Check if the name collides with existing SFN */ @@ -1531,7 +1558,8 @@ } if (n == 100) return FR_DENIED; /* Abort if too many collisions */ if (res != FR_NO_FILE) return res; /* Abort if the result is other than 'not collided' */ - fn[NS] = sn[NS]; dj->lfn = lfn; + fn[NS] = sn[NS]; + dj->lfn = lfn; } if (sn[NS] & NS_LFN) { /* When LFN is to be created, reserve an SFN + LFN entries. */ @@ -1686,7 +1714,8 @@ b = (BYTE)p[si++]; /* Get 2nd byte */ if (!IsDBCS2(b)) return FR_INVALID_NAME; /* Reject invalid sequence */ - w = (w << 8) + b; /* Create a DBC */ + else + w = (w << 8) + b; /* Create a DBC */ } w = ff_convert(w, 1); /* Convert ANSI/OEM to Unicode */ if (!w) return FR_INVALID_NAME; /* Reject invalid code */ @@ -1699,7 +1728,7 @@ cf = (w < ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ #if _FS_RPATH if ((di == 1 && lfn[di-1] == '.') || /* Is this a dot entry? */ - (di == 2 && lfn[di-1] == '.' && lfn[di-2] == '.')) { + (di == 2 && lfn[di-1] == '.' && lfn[di-2] == '.')) { lfn[di] = 0; for (i = 0; i < 11; i++) dj->fn[i] = (i < di) ? '.' : ' '; @@ -1722,22 +1751,28 @@ if (si) cf |= NS_LOSS | NS_LFN; while (di && lfn[di - 1] != '.') di--; /* Find extension (di<=si: no extension) */ - b = i = 0; ni = 8; + b = i = 0; + ni = 8; for (;;) { w = lfn[si++]; /* Get an LFN char */ if (!w) break; /* Break on end of the LFN */ if (w == ' ' || (w == '.' && si != di)) { /* Remove spaces and dots */ - cf |= NS_LOSS | NS_LFN; continue; + cf |= NS_LOSS | NS_LFN; + continue; } if (i >= ni || si == di) { /* Extension or end of SFN */ if (ni == 11) { /* Long extension */ - cf |= NS_LOSS | NS_LFN; break; + cf |= NS_LOSS | NS_LFN; + break; } if (si != di) cf |= NS_LOSS | NS_LFN; /* Out of 8.3 format */ if (si > di) break; /* No extension */ - si = di; i = 8; ni = 11; /* Enter extension section */ - b <<= 2; continue; + si = di; + i = 8; + ni = 11; /* Enter extension section */ + b <<= 2; + continue; } if (w >= 0x80) { /* Non ASCII char */ @@ -1752,18 +1787,22 @@ if (_DF1S && w >= 0x100) { /* Double byte char (always false on SBCS cfg) */ if (i >= ni - 1) { - cf |= NS_LOSS | NS_LFN; i = ni; continue; + cf |= NS_LOSS | NS_LFN; + i = ni; + continue; } dj->fn[i++] = (BYTE)(w >> 8); } else { /* Single byte char */ if (!w || chk_chr("+,;=[]", w)) { /* Replace illegal chars for SFN */ - w = '_'; cf |= NS_LOSS | NS_LFN;/* Lossy conversion */ + w = '_'; + cf |= NS_LOSS | NS_LFN;/* Lossy conversion */ } else { if (IsUpper(w)) { /* ASCII large capital */ b |= 2; } else { if (IsLower(w)) { /* ASCII small capital */ - b |= 1; w -= 0x20; + b |= 1; + w -= 0x20; } } } @@ -1795,7 +1834,8 @@ for (p = *path; *p == '/' || *p == '\\'; p++) ; /* Strip duplicated separator */ sfn = dj->fn; mem_set(sfn, ' ', 11); - si = i = b = 0; ni = 8; + si = i = b = 0; + ni = 8; #if _FS_RPATH if (p[si] == '.') { /* Is this a dot entry? */ for (;;) { @@ -1814,8 +1854,10 @@ if (c <= ' ' || c == '/' || c == '\\') break; /* Break on end of segment */ if (c == '.' || i >= ni) { if (ni != 8 || c != '.') return FR_INVALID_NAME; - i = 8; ni = 11; - b <<= 2; continue; + i = 8; + ni = 11; + b <<= 2; + continue; } if (c >= 0x80) { /* Extended char? */ b |= 3; /* Eliminate NT flag */ @@ -1840,7 +1882,8 @@ b |= 2; } else { if (IsLower(c)) { /* ASCII small capital? */ - b |= 1; c -= 0x20; + b |= 1; + c -= 0x20; } } sfn[i++] = c; @@ -1930,11 +1973,17 @@ while ((w = *lfn++) != 0) { /* Get an LFN char */ #if !_LFN_UNICODE w = ff_convert(w, 0); /* Unicode -> OEM conversion */ - if (!w) { i = 0; break; } /* Could not convert, no LFN */ + if (!w) { + i = 0; /* Could not convert, no LFN */ + break; + } if (_DF1S && w >= 0x100) /* Put 1st byte if it is a DBC (always false on SBCS cfg) */ tp[i++] = (TCHAR)(w >> 8); #endif - if (i >= fno->lfsize - 1) { i = 0; break; } /* Buffer overflow, no LFN */ + if (i >= fno->lfsize - 1) { + i = 0; /* Buffer overflow, no LFN */ + break; + } tp[i++] = (TCHAR)w; } } @@ -1963,7 +2012,8 @@ #if _FS_RPATH if (*path == '/' || *path == '\\') { /* There is a heading separator */ - path++; dj->sclust = 0; /* Strip it and start from the root dir */ + path++; + dj->sclust = 0; /* Strip it and start from the root dir */ } else { /* No heading separator */ dj->sclust = dj->fs->cdir; /* Start from the current dir */ } @@ -1986,7 +2036,8 @@ if (res != FR_NO_FILE) break; /* Abort if any hard error occurred */ /* Object not found */ if (_FS_RPATH && (ns & NS_DOT)) { /* If dot entry is not exit */ - dj->sclust = 0; dj->dir = 0; /* It is the root dir */ + dj->sclust = 0; + dj->dir = 0; /* It is the root dir */ res = FR_OK; if (!(ns & NS_LAST)) continue; } else { /* Could not find the object */ @@ -1997,7 +2048,8 @@ if (ns & NS_LAST) break; /* Last segment match. Function completed. */ dir = dj->dir; /* There is next segment. Follow the sub directory */ if (!(dir[DIR_Attr] & AM_DIR)) { /* Cannot follow because it is a file */ - res = FR_NO_PATH; break; + res = FR_NO_PATH; + break; } dj->sclust = ld_clust(dj->fs, dir); } @@ -2058,7 +2110,8 @@ /* Get logical drive number from the path name */ vol = p[0] - '0'; /* Is there a drive number? */ if (vol <= 9 && p[1] == ':') { /* Found a drive number, get and strip it */ - p += 2; *path = p; /* Return pointer to the path name */ + p += 2; + *path = p; /* Return pointer to the path name */ } else { /* No drive number is given */ #if _FS_RPATH vol = CurrVol; /* Use current drive */ @@ -2162,7 +2215,7 @@ if (!fs->n_rootdir) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must not be 0) */ fs->dirbase = fs->fatbase + fasize; /* Root directory start sector */ szbfat = (fmt == FS_FAT16) ? /* (Required FAT size) */ - fs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1); + fs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1); } if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) /* (BPB_FATSz must not be less than required) */ return FR_NO_FILESYSTEM; @@ -2177,11 +2230,11 @@ fs->fsi_flag = 0; fs->fsi_sector = bsect + LD_WORD(fs->win+BPB_FSInfo); if (disk_read(fs->drv, fs->win, fs->fsi_sector, 1) == RES_OK && - LD_WORD(fs->win+BS_55AA) == 0xAA55 && - LD_DWORD(fs->win+FSI_LeadSig) == 0x41615252 && - LD_DWORD(fs->win+FSI_StrucSig) == 0x61417272) { - fs->last_clust = LD_DWORD(fs->win+FSI_Nxt_Free); - fs->free_clust = LD_DWORD(fs->win+FSI_Free_Count); + LD_WORD(fs->win+BS_55AA) == 0xAA55 && + LD_DWORD(fs->win+FSI_LeadSig) == 0x41615252 && + LD_DWORD(fs->win+FSI_StrucSig) == 0x61417272) { + fs->last_clust = LD_DWORD(fs->win+FSI_Nxt_Free); + fs->free_clust = LD_DWORD(fs->win+FSI_Free_Count); } } #endif @@ -2329,8 +2382,7 @@ #endif mode |= FA_CREATE_ALWAYS; /* File is created */ dir = dj.dir; /* New entry */ - } - else { /* Any object is already existing */ + } else { /* Any object is already existing */ if (dir[DIR_Attr] & (AM_RDO | AM_DIR)) { /* Cannot overwrite it (R/O or DIR) */ res = FR_DENIED; } else { @@ -2355,8 +2407,7 @@ } } } - } - else { /* Open an existing file */ + } else { /* Open an existing file */ if (res == FR_OK) { /* Follow succeeded */ if (dir[DIR_Attr] & AM_DIR) { /* It is a directory */ res = FR_NO_FILE; @@ -2399,7 +2450,8 @@ #if _USE_FASTSEEK fp->cltbl = 0; /* Normal seek mode */ #endif - fp->fs = dj.fs; fp->id = dj.fs->id; /* Validate file object */ + fp->fs = dj.fs; + fp->id = dj.fs->id; /* Validate file object */ } } @@ -2438,7 +2490,7 @@ if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ for ( ; btr; /* Repeat until all data read */ - rbuff += rcnt, fp->fptr += rcnt, *br += rcnt, btr -= rcnt) { + rbuff += rcnt, fp->fptr += rcnt, *br += rcnt, btr -= rcnt) { if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ csect = (BYTE)(fp->fptr / SS(fp->fs) & (fp->fs->csize - 1)); /* Sector offset in the cluster */ if (!csect) { /* On the cluster boundary? */ @@ -2539,7 +2591,7 @@ if ((DWORD)(fp->fsize + btw) < fp->fsize) btw = 0; /* File size cannot reach 4GB */ for ( ; btw; /* Repeat until all data written */ - wbuff += wcnt, fp->fptr += wcnt, *bw += wcnt, btw -= wcnt) { + wbuff += wcnt, fp->fptr += wcnt, *bw += wcnt, btw -= wcnt) { if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ csect = (BYTE)(fp->fptr / SS(fp->fs) & (fp->fs->csize - 1)); /* Sector offset in the cluster */ if (!csect) { /* On the cluster boundary? */ @@ -2601,8 +2653,8 @@ #else if (fp->dsect != sect) { /* Fill sector cache with file data */ if (fp->fptr < fp->fsize && - disk_read(fp->fs->drv, fp->buf, sect, 1) != RES_OK) - ABORT(fp->fs, FR_DISK_ERR); + disk_read(fp->fs->drv, fp->buf, sect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); } #endif fp->dsect = sect; @@ -2817,7 +2869,8 @@ if (_USE_LFN && *path) tp = path; for (n = 0; tp[n]; n++) ; if (i < n + 3) { - res = FR_NOT_ENOUGH_CORE; break; + res = FR_NOT_ENOUGH_CORE; + break; } while (n) path[--i] = tp[--n]; path[--i] = '/'; @@ -2869,20 +2922,25 @@ if (ofs == CREATE_LINKMAP) { /* Create CLMT */ tbl = fp->cltbl; - tlen = *tbl++; ulen = 2; /* Given table size and required table size */ + tlen = *tbl++; + ulen = 2; /* Given table size and required table size */ cl = fp->sclust; /* Top of the chain */ if (cl) { do { /* Get a fragment */ - tcl = cl; ncl = 0; ulen += 2; /* Top, length and used items */ + tcl = cl; + ncl = 0; + ulen += 2; /* Top, length and used items */ do { - pcl = cl; ncl++; + pcl = cl; + ncl++; cl = get_fat(fp->fs, cl); if (cl <= 1) ABORT(fp->fs, FR_INT_ERR); if (cl == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); } while (cl == pcl + 1); if (ulen <= tlen) { /* Store the length and top of the fragment */ - *tbl++ = ncl; *tbl++ = tcl; + *tbl++ = ncl; + *tbl++ = tcl; } } while (cl < fp->fs->n_fatent); /* Repeat until end of chain */ } @@ -2920,22 +2978,22 @@ } else #endif - /* Normal Seek */ + /* Normal Seek */ { DWORD clst, bcs, nsect, ifptr; if (ofs > fp->fsize /* In read-only mode, clip offset with the file size */ #if !_FS_READONLY - && !(fp->flag & FA_WRITE) + && !(fp->flag & FA_WRITE) #endif - ) ofs = fp->fsize; + ) ofs = fp->fsize; ifptr = fp->fptr; fp->fptr = nsect = 0; if (ofs) { bcs = (DWORD)fp->fs->csize * SS(fp->fs); /* Cluster size (byte) */ if (ifptr > 0 && - (ofs - 1) / bcs >= (ifptr - 1) / bcs) { /* When seek to same or following cluster, */ + (ofs - 1) / bcs >= (ifptr - 1) / bcs) { /* When seek to same or following cluster, */ fp->fptr = (ifptr - 1) & ~(bcs - 1); /* start from the current cluster */ ofs -= fp->fptr; clst = fp->clust; @@ -2957,7 +3015,8 @@ if (fp->flag & FA_WRITE) { /* Check if in write mode or not */ clst = create_chain(fp->fs, clst); /* Force stretch if in write mode */ if (clst == 0) { /* When disk gets full, clip file size */ - ofs = bcs; break; + ofs = bcs; + break; } } else #endif @@ -3158,14 +3217,21 @@ clst = 2; do { stat = get_fat(fs, clst); - if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } - if (stat == 1) { res = FR_INT_ERR; break; } + if (stat == 0xFFFFFFFF) { + res = FR_DISK_ERR; + break; + } + if (stat == 1) { + res = FR_INT_ERR; + break; + } if (stat == 0) n++; } while (++clst < fs->n_fatent); } else { clst = fs->n_fatent; sect = fs->fatbase; - i = 0; p = 0; + i = 0; + p = 0; do { if (!i) { res = move_window(fs, sect++); @@ -3175,10 +3241,12 @@ } if (fat == FS_FAT16) { if (LD_WORD(p) == 0) n++; - p += 2; i -= 2; + p += 2; + i -= 2; } else { if ((LD_DWORD(p) & 0x0FFFFFFF) == 0) n++; - p += 4; i -= 4; + p += 4; + i -= 4; } } while (--clst); } @@ -3287,9 +3355,9 @@ res = dir_read(&sdj); if (res == FR_OK /* Not empty dir */ #if _FS_RPATH - || dclst == dj.fs->cdir /* Current dir */ + || dclst == dj.fs->cdir /* Current dir */ #endif - ) res = FR_DENIED; + ) res = FR_DENIED; if (res == FR_NO_FILE) res = FR_OK; /* Empty */ } } @@ -3351,7 +3419,8 @@ ST_DWORD(dir+DIR_WrtTime, tim); st_clust(dir, dcl); mem_cpy(dir+SZ_DIR, dir, SZ_DIR); /* Create ".." entry */ - dir[33] = '.'; pcl = dj.sclust; + dir[33] = '.'; + pcl = dj.sclust; if (dj.fs->fs_type == FS_FAT32 && pcl == dj.fs->dirbase) pcl = 0; st_clust(dir+SZ_DIR, pcl); @@ -3502,7 +3571,7 @@ res = follow_path(&djn, path_new); if (res == FR_OK) res = FR_EXIST; /* The new object name is already existing */ if (res == FR_NO_FILE) { /* Is it a valid path and no name collision? */ -/* Start critical section that an interruption or error can cause cross-link */ + /* Start critical section that an interruption or error can cause cross-link */ res = dir_register(&djn); /* Register the new entry */ if (res == FR_OK) { dir = djn.dir; /* Copy object information except for name */ @@ -3529,7 +3598,7 @@ res = sync(djo.fs); } } -/* End critical section */ + /* End critical section */ } } } @@ -3578,12 +3647,12 @@ if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ for ( ; btr && (*func)(0, 0); /* Repeat until all data transferred or stream becomes busy */ - fp->fptr += rcnt, *bf += rcnt, btr -= rcnt) { + fp->fptr += rcnt, *bf += rcnt, btr -= rcnt) { csect = (BYTE)(fp->fptr / SS(fp->fs) & (fp->fs->csize - 1)); /* Sector offset in the cluster */ if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ if (!csect) { /* On the cluster boundary? */ clst = (fp->fptr == 0) ? /* On the top of the file? */ - fp->sclust : get_fat(fp->fs, fp->clust); + fp->sclust : get_fat(fp->fs, fp->clust); if (clst <= 1) ABORT(fp->fs, FR_INT_ERR); if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); fp->clust = clst; /* Update current cluster */ @@ -3711,13 +3780,18 @@ /* Determine number of clusters and final check of validity of the FAT sub-type */ n_clst = (n_vol - n_rsv - n_fat * N_FATS - n_dir) / au; if ( (fmt == FS_FAT16 && n_clst < MIN_FAT16) - || (fmt == FS_FAT32 && n_clst < MIN_FAT32)) + || (fmt == FS_FAT32 && n_clst < MIN_FAT32)) return FR_MKFS_ABORTED; switch (fmt) { /* Determine system ID for partition table */ - case FS_FAT12: sys = 0x01; break; - case FS_FAT16: sys = (n_vol < 0x10000) ? 0x04 : 0x06; break; - default: sys = 0x0C; + case FS_FAT12: + sys = 0x01; + break; + case FS_FAT16: + sys = (n_vol < 0x10000) ? 0x04 : 0x06; + break; + default: + sys = 0x0C; } if (_MULTI_PARTITION && part) { @@ -3826,7 +3900,8 @@ { DWORD eb[2]; - eb[0] = wsect; eb[1] = wsect + (n_clst - ((fmt == FS_FAT32) ? 1 : 0)) * au - 1; + eb[0] = wsect; + eb[1] = wsect + (n_clst - ((fmt == FS_FAT32) ? 1 : 0)) * au - 1; disk_ioctl(pdrv, CTRL_ERASE_SECTOR, eb); } #endif @@ -3877,7 +3952,8 @@ /* Create partition table */ mem_set(buf, 0, _MAX_SS); - p = buf + MBR_Table; b_cyl = 0; + p = buf + MBR_Table; + b_cyl = 0; for (i = 0; i < 4; i++, p += SZ_PTE) { p_cyl = (szt[i] <= 100) ? (DWORD)tot_cyl * szt[i] / 100 : szt[i] / sz_cyl; if (!p_cyl) continue; @@ -3885,7 +3961,8 @@ sz_part = (DWORD)sz_cyl * p_cyl; if (i == 0) { /* Exclude first track of cylinder 0 */ s_hd = 1; - s_part += 63; sz_part -= 63; + s_part += 63; + sz_part -= 63; } else { s_hd = 0; } @@ -4067,10 +4144,12 @@ w = f = 0; c = *str++; if (c == '0') { /* Flag: '0' padding */ - f = 1; c = *str++; + f = 1; + c = *str++; } else { if (c == '-') { /* Flag: left justified */ - f = 2; c = *str++; + f = 2; + c = *str++; } } while (IsDigit(c)) { /* Precision */ @@ -4078,36 +4157,43 @@ c = *str++; } if (c == 'l' || c == 'L') { /* Prefix: Size is long int */ - f |= 4; c = *str++; + f |= 4; + c = *str++; } if (!c) break; d = c; if (IsLower(d)) d -= 0x20; switch (d) { /* Type is... */ - case 'S' : /* String */ - p = va_arg(arp, TCHAR*); - for (j = 0; p[j]; j++) ; - chc = 0; - if (!(f & 2)) { + case 'S' : /* String */ + p = va_arg(arp, TCHAR*); + for (j = 0; p[j]; j++) ; + chc = 0; + if (!(f & 2)) { + while (j++ < w) chc += (cc = f_putc(' ', fil)); + } + chc += (cc = f_puts(p, fil)); while (j++ < w) chc += (cc = f_putc(' ', fil)); - } - chc += (cc = f_puts(p, fil)); - while (j++ < w) chc += (cc = f_putc(' ', fil)); - if (cc != EOF) cc = chc; - continue; - case 'C' : /* Character */ - cc = f_putc((TCHAR)va_arg(arp, int), fil); continue; - case 'B' : /* Binary */ - r = 2; break; - case 'O' : /* Octal */ - r = 8; break; - case 'D' : /* Signed decimal */ - case 'U' : /* Unsigned decimal */ - r = 10; break; - case 'X' : /* Hexdecimal */ - r = 16; break; - default: /* Unknown type (pass-through) */ - cc = f_putc(c, fil); continue; + if (cc != EOF) cc = chc; + continue; + case 'C' : /* Character */ + cc = f_putc((TCHAR)va_arg(arp, int), fil); + continue; + case 'B' : /* Binary */ + r = 2; + break; + case 'O' : /* Octal */ + r = 8; + break; + case 'D' : /* Signed decimal */ + case 'U' : /* Unsigned decimal */ + r = 10; + break; + case 'X' : /* Hexdecimal */ + r = 16; + break; + default: /* Unknown type (pass-through) */ + cc = f_putc(c, fil); + continue; } /* Get an argument and put it in numeral */ @@ -4118,15 +4204,18 @@ } i = 0; do { - d = (TCHAR)(v % r); v /= r; + d = (TCHAR)(v % r); + v /= r; if (d > 9) d += (c == 'x') ? 0x27 : 0x07; s[i++] = d + '0'; } while (v && i < sizeof s / sizeof s[0]); if (f & 8) s[i++] = '-'; - j = i; d = (f & 1) ? '0' : ' '; + j = i; + d = (f & 1) ? '0' : ' '; res = 0; while (!(f & 2) && j++ < w) res += (cc = f_putc(d, fil)); - do res += (cc = f_putc(s[--i], fil)); while(i); + do res += (cc = f_putc(s[--i], fil)); + while(i); while (j++ < w) res += (cc = f_putc(' ', fil)); if (cc != EOF) cc = res; }