📄 fat_8c-source.html
字号:
00489 <span class="comment">// set path string</span>00490 strcat(PathNameBuffer, FileNameBuffer);00491 strcat(PathNameBuffer, <span class="stringliteral">"\\"</span>);00492 <span class="comment">// return success</span>00493 <span class="keywordflow">return</span> TRUE;00494 }00495 <span class="keywordflow">else</span>00496 {00497 <span class="comment">// not a directory, cannot CD into a file!</span>00498 <span class="keywordflow">return</span> FALSE;00499 }00500 }00501 <span class="keywordflow">else</span>00502 {00503 <span class="comment">// not a valid entry, cannot CD!</span>00504 <span class="keywordflow">return</span> FALSE;00505 }00506 }00507 00508 <span class="keywordtype">void</span> fatPrintDirEntry(<span class="keywordtype">void</span>)00509 {00510 <span class="comment">// print a formatted dir-style output for most recent file</span>00511 <span class="comment">// print date</span>00512 <a class="code" href="rprintf_8h.html#a16">rprintfNum</a>(10, 2, FALSE, <span class="charliteral">'0'</span>, (FileInfo.CreateDate&DD_MONTH_MASK)>>DD_MONTH_SHIFT ); <span class="comment">// month</span>00513 <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">'/'</span>);00514 <a class="code" href="rprintf_8h.html#a16">rprintfNum</a>(10, 2, FALSE, <span class="charliteral">'0'</span>, (FileInfo.CreateDate&DD_DAY_MASK)>>DD_DAY_SHIFT ); <span class="comment">// day</span>00515 <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">'/'</span>);00516 <a class="code" href="rprintf_8h.html#a16">rprintfNum</a>(10, 4, FALSE, <span class="charliteral">'0'</span>, (FileInfo.CreateDate&DD_YEAR_MASK)>>DD_YEAR_SHIFT ); <span class="comment">// year</span>00517 <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">' '</span>);00518 00519 <span class="comment">// print time</span>00520 <a class="code" href="rprintf_8h.html#a16">rprintfNum</a>(10, 2, FALSE, <span class="charliteral">'0'</span>, (FileInfo.CreateTime&DT_HOURS_MASK)>>DT_HOURS_SHIFT ); <span class="comment">// month</span>00521 <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">':'</span>);00522 <a class="code" href="rprintf_8h.html#a16">rprintfNum</a>(10, 2, FALSE, <span class="charliteral">'0'</span>, (FileInfo.CreateTime&DT_MINUTES_MASK)>>DT_MINUTES_SHIFT ); <span class="comment">// day</span>00523 <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">':'</span>);00524 <a class="code" href="rprintf_8h.html#a16">rprintfNum</a>(10, 2, FALSE, <span class="charliteral">'0'</span>, 2*(FileInfo.CreateTime&DT_2SECONDS_MASK)>>DT_2SECONDS_SHIFT ); <span class="comment">// seconds</span>00525 <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">' '</span>);00526 00527 <span class="comment">// print attributes</span>00528 <span class="keywordflow">if</span>(FileInfo.Attr & ATTR_VOLUME) <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">'V'</span>); <span class="keywordflow">else</span> <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">'-'</span>);00529 <span class="keywordflow">if</span>(FileInfo.Attr & ATTR_DIRECTORY) <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">'D'</span>); <span class="keywordflow">else</span> <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">'-'</span>);00530 <span class="keywordflow">if</span>(FileInfo.Attr & ATTR_READONLY) <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">'R'</span>); <span class="keywordflow">else</span> <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">'-'</span>);00531 <span class="keywordflow">if</span>(FileInfo.Attr & ATTR_HIDDEN) <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">'H'</span>); <span class="keywordflow">else</span> <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">'-'</span>);00532 <span class="keywordflow">if</span>(FileInfo.Attr & ATTR_SYSTEM) <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">'S'</span>); <span class="keywordflow">else</span> <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">'-'</span>);00533 <span class="keywordflow">if</span>(FileInfo.Attr & ATTR_ARCHIVE) <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">'A'</span>); <span class="keywordflow">else</span> <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">'-'</span>);00534 <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">' '</span>);00535 00536 <span class="comment">// print filesize</span>00537 <a class="code" href="rprintf_8h.html#a16">rprintfNum</a>(10, 8, FALSE, <span class="charliteral">' '</span>, FileInfo.Size); <span class="comment">// filesize</span>00538 <a class="code" href="rprintf_8h.html#a7">rprintfChar</a>(<span class="charliteral">' '</span>);00539 00540 <span class="comment">// print filename</span>00541 <a class="code" href="rprintf_8h.html#a8">rprintfStr</a>(FileNameBuffer);00542 }00543 00544 <span class="keywordtype">void</span> fatDumpDirSlot(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot)00545 {00546 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> sector;00547 <span class="comment">// load correct sector</span>00548 sector = fatClustToSect(CurrentDirStartCluster);00549 sector += slot/DIRENTRIES_PER_SECTOR;00550 <span class="comment">// print the entry as a hex table</span>00551 <a class="code" href="debug_8h.html#a0">debugPrintHexTable</a>(32, SectorBuffer+(slot<<5) );00552 }00553 00554 <span class="keyword">struct </span>FileInfoStruct* fatGetFileInfo(<span class="keywordtype">void</span>)00555 {00556 <span class="keywordflow">return</span> &FileInfo;00557 }00558 00559 <span class="comment">// return the size of the last directory entry</span>00560 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> fatGetFilesize(<span class="keywordtype">void</span>)00561 {00562 <span class="keywordflow">return</span> FileInfo.Size;00563 }00564 00565 <span class="comment">// return the long name of the last directory entry</span>00566 <span class="keywordtype">char</span>* fatGetFilename(<span class="keywordtype">void</span>)00567 { 00568 <span class="keywordflow">return</span> FileNameBuffer;00569 }00570 00571 <span class="comment">// return the directory of the last directory entry</span>00572 <span class="keywordtype">char</span>* fatGetDirname(<span class="keywordtype">void</span>)00573 { 00574 <span class="keywordflow">return</span> PathNameBuffer;00575 }00576 00577 <span class="comment">// load a clusterfull of data</span>00578 <span class="keywordtype">void</span> fatLoadCluster(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> cluster, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buffer)00579 {00580 <span class="keyword">register</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> i;00581 <span class="comment">// read cluster</span>00582 <span class="comment">//while ( ataReadSectors( DRIVE0, clust2sect(cluster), SectorsPerCluster, buffer) != 0);</span>00583 <span class="keywordflow">for</span>(i=0; i<SectorsPerCluster; i++)00584 {00585 ataReadSectors( DRIVE0, fatClustToSect(cluster)+i, 1, buffer+(i<<9) );00586 <span class="comment">// temporary fix for wierd misaligned cluster problem</span>00587 <span class="comment">// (only when using FAT16?)</span>00588 <span class="comment">// ataReadSectors( DRIVE0, fatClustToSect(cluster+8)+i, 1, buffer+(i<<9) );</span>00589 }00590 }00591 00592 00593 <span class="comment">// find next cluster in the FAT chain</span>00594 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> fatNextCluster(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> cluster)00595 {00596 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> nextCluster;00597 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> fatMask;00598 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> fatOffset;00599 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> sector;00600 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset;00601 00602 <span class="comment">// get fat offset in bytes</span>00603 <span class="keywordflow">if</span>(Fat32Enabled)00604 {00605 <span class="comment">// four FAT bytes (32 bits) for every cluster</span>00606 fatOffset = cluster << 2;00607 <span class="comment">// set the FAT bit mask</span>00608 fatMask = FAT32_MASK;00609 }00610 <span class="keywordflow">else</span>00611 {00612 <span class="comment">// two FAT bytes (16 bits) for every cluster</span>00613 fatOffset = cluster << 1;00614 <span class="comment">// set the FAT bit mask</span>00615 fatMask = FAT16_MASK;00616 }00617 00618 <span class="comment">// calculate the FAT sector that we're interested in</span>00619 sector = FirstFATSector + (fatOffset / BytesPerSector);00620 <span class="comment">// calculate offset of the our entry within that FAT sector</span>00621 offset = fatOffset % BytesPerSector;00622 00623 <span class="comment">// if we don't already have this FAT chunk loaded, go get it</span>00624 <span class="keywordflow">if</span> (sector != FatInCache)00625 {00626 <span class="comment">// read sector of FAT table</span>00627 <span class="keywordflow">while</span> (ataReadSectors( DRIVE0, sector, 1, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*)FAT_CACHE_ADDR) != 0);00628 FatInCache = sector;00629 }00630 00631 <span class="comment">// read the nextCluster value</span>00632 nextCluster = (*((<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>*) &((<span class="keywordtype">char</span>*)FAT_CACHE_ADDR)[offset])) & fatMask;00633 00634 <span class="comment">// check to see if we're at the end of the chain</span>00635 <span class="keywordflow">if</span> (nextCluster == (CLUST_EOFE & fatMask))00636 nextCluster = 0;00637 00638 <span class="preprocessor">#ifdef DEBUG_FAT</span>00639 <span class="preprocessor"></span> <a class="code" href="rprintf_8h.html#a8">rprintfStr</a>(<span class="stringliteral">">"</span>);00640 <a class="code" href="rprintf_8h.html#a15">rprintfu32</a>(nextCluster);00641 <a class="code" href="rprintf_8c.html#a10">rprintfCRLF</a>();00642 <span class="preprocessor">#endif</span>00643 <span class="preprocessor"></span> 00644 <span class="keywordflow">return</span> nextCluster;00645 }</pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 13 03:38:11 2004 for Procyon ARMlib-LPC2100 by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 > </a>1.3.6 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -