📄 fat_8c-source.html
字号:
00326 }00327 <span class="comment">// TODO: handle pathname properly for going up a directory</span>00328 <span class="comment">// set path string</span>00329 strcat(PathNameBuffer, FileNameBuffer);00330 strcat(PathNameBuffer, <span class="stringliteral">"\\"</span>);00331 <span class="comment">// return success</span>00332 <span class="keywordflow">return</span> TRUE;00333 }00334 <span class="keywordflow">else</span>00335 {00336 <span class="comment">// not a directory, cannot CD into a file!</span>00337 <span class="keywordflow">return</span> FALSE;00338 }00339 }00340 <span class="keywordflow">else</span>00341 {00342 <span class="comment">// not a valid entry, cannot CD!</span>00343 <span class="keywordflow">return</span> FALSE;00344 }00345 }00346 00347 <span class="keywordtype">void</span> fatPrintDirEntry(<span class="keywordtype">void</span>)00348 {00349 <span class="comment">// print a formatted dir-style output for most recent file</span>00350 <span class="comment">// print date</span>00351 <a class="code" href="group__rprintf.html#ga10">rprintfNum</a>(10, 2, FALSE, <span class="charliteral">'0'</span>, (FileInfo.CreateDate&DD_MONTH_MASK)>>DD_MONTH_SHIFT ); <span class="comment">// month</span>00352 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'/'</span>);00353 <a class="code" href="group__rprintf.html#ga10">rprintfNum</a>(10, 2, FALSE, <span class="charliteral">'0'</span>, (FileInfo.CreateDate&DD_DAY_MASK)>>DD_DAY_SHIFT ); <span class="comment">// day</span>00354 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'/'</span>);00355 <a class="code" href="group__rprintf.html#ga10">rprintfNum</a>(10, 4, FALSE, <span class="charliteral">'0'</span>, (FileInfo.CreateDate&DD_YEAR_MASK)>>DD_YEAR_SHIFT ); <span class="comment">// year</span>00356 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">' '</span>);00357 00358 <span class="comment">// print time</span>00359 <a class="code" href="group__rprintf.html#ga10">rprintfNum</a>(10, 2, FALSE, <span class="charliteral">'0'</span>, (FileInfo.CreateTime&DT_HOURS_MASK)>>DT_HOURS_SHIFT ); <span class="comment">// month</span>00360 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">':'</span>);00361 <a class="code" href="group__rprintf.html#ga10">rprintfNum</a>(10, 2, FALSE, <span class="charliteral">'0'</span>, (FileInfo.CreateTime&DT_MINUTES_MASK)>>DT_MINUTES_SHIFT ); <span class="comment">// day</span>00362 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">':'</span>);00363 <a class="code" href="group__rprintf.html#ga10">rprintfNum</a>(10, 2, FALSE, <span class="charliteral">'0'</span>, 2*(FileInfo.CreateTime&DT_2SECONDS_MASK)>>DT_2SECONDS_SHIFT ); <span class="comment">// seconds</span>00364 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">' '</span>);00365 00366 <span class="comment">// print attributes</span>00367 <span class="keywordflow">if</span>(FileInfo.Attr & ATTR_VOLUME) <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'V'</span>); <span class="keywordflow">else</span> <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'-'</span>);00368 <span class="keywordflow">if</span>(FileInfo.Attr & ATTR_DIRECTORY) <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'D'</span>); <span class="keywordflow">else</span> <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'-'</span>);00369 <span class="keywordflow">if</span>(FileInfo.Attr & ATTR_READONLY) <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'R'</span>); <span class="keywordflow">else</span> <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'-'</span>);00370 <span class="keywordflow">if</span>(FileInfo.Attr & ATTR_HIDDEN) <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'H'</span>); <span class="keywordflow">else</span> <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'-'</span>);00371 <span class="keywordflow">if</span>(FileInfo.Attr & ATTR_SYSTEM) <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'S'</span>); <span class="keywordflow">else</span> <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'-'</span>);00372 <span class="keywordflow">if</span>(FileInfo.Attr & ATTR_ARCHIVE) <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'A'</span>); <span class="keywordflow">else</span> <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'-'</span>);00373 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">' '</span>);00374 00375 <span class="comment">// print filesize</span>00376 <a class="code" href="group__rprintf.html#ga10">rprintfNum</a>(10, 8, FALSE, <span class="charliteral">' '</span>, FileInfo.Size); <span class="comment">// filesize</span>00377 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">' '</span>);00378 00379 <span class="comment">// print filename</span>00380 <a class="code" href="group__rprintf.html#ga2">rprintfStr</a>(FileNameBuffer);00381 }00382 00383 <span class="keywordtype">void</span> fatDumpDirSlot(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot)00384 {00385 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> sector;00386 <span class="comment">// load correct sector</span>00387 sector = fatClustToSect(CurrentDirStartCluster);00388 sector += slot/DIRENTRIES_PER_SECTOR;00389 <span class="comment">// print the entry as a hex table</span>00390 <a class="code" href="debug_8c.html#a0">debugPrintHexTable</a>(32, SectorBuffer+(slot<<5) );00391 }00392 00393 <span class="keyword">struct </span>FileInfoStruct* fatGetFileInfo(<span class="keywordtype">void</span>)00394 {00395 <span class="keywordflow">return</span> &FileInfo;00396 }00397 00398 <span class="comment">// return the size of the last directory entry</span>00399 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> fatGetFilesize(<span class="keywordtype">void</span>)00400 {00401 <span class="keywordflow">return</span> FileInfo.Size;00402 }00403 00404 <span class="comment">// return the long name of the last directory entry</span>00405 <span class="keywordtype">char</span>* fatGetFilename(<span class="keywordtype">void</span>)00406 { 00407 <span class="keywordflow">return</span> FileNameBuffer;00408 }00409 00410 <span class="comment">// return the directory of the last directory entry</span>00411 <span class="keywordtype">char</span>* fatGetDirname(<span class="keywordtype">void</span>)00412 { 00413 <span class="keywordflow">return</span> PathNameBuffer;00414 }00415 00416 <span class="comment">// load a clusterfull of data</span>00417 <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)00418 {00419 <span class="keyword">register</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> i;00420 <span class="comment">// read cluster</span>00421 <span class="comment">//while ( ataReadSectors( DRIVE0, clust2sect(cluster), SectorsPerCluster, buffer) != 0);</span>00422 <span class="keywordflow">for</span>(i=0; i<SectorsPerCluster; i++)00423 {00424 ataReadSectors( DRIVE0, fatClustToSect(cluster)+i, 1, buffer+(i<<9) );00425 <span class="comment">// temporary fix for wierd misaligned cluster problem</span>00426 <span class="comment">// (only when using FAT16?)</span>00427 <span class="comment">// ataReadSectors( DRIVE0, fatClustToSect(cluster+8)+i, 1, buffer+(i<<9) );</span>00428 }00429 }00430 00431 00432 <span class="comment">// find next cluster in the FAT chain</span>00433 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> fatNextCluster(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> cluster)00434 {00435 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> nextCluster;00436 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> fatMask;00437 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> fatOffset;00438 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> sector;00439 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> offset;00440 00441 <span class="comment">// get fat offset in bytes</span>00442 <span class="keywordflow">if</span>(Fat32Enabled)00443 {00444 <span class="comment">// four FAT bytes (32 bits) for every cluster</span>00445 fatOffset = cluster << 2;00446 <span class="comment">// set the FAT bit mask</span>00447 fatMask = FAT32_MASK;00448 }00449 <span class="keywordflow">else</span>00450 {00451 <span class="comment">// two FAT bytes (16 bits) for every cluster</span>00452 fatOffset = cluster << 1;00453 <span class="comment">// set the FAT bit mask</span>00454 fatMask = FAT16_MASK;00455 }00456 00457 <span class="comment">// calculate the FAT sector that we're interested in</span>00458 sector = FirstFATSector + (fatOffset / BytesPerSector);00459 <span class="comment">// calculate offset of the our entry within that FAT sector</span>00460 offset = fatOffset % BytesPerSector;00461 00462 <span class="comment">// if we don't already have this FAT chunk loaded, go get it</span>00463 <span class="keywordflow">if</span> (sector != FatInCache)00464 {00465 <span class="comment">// read sector of FAT table</span>00466 <span class="keywordflow">while</span> (ataReadSectors( DRIVE0, sector, 1, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*)FAT_CACHE_ADDR) != 0);00467 FatInCache = sector;00468 }00469 00470 <span class="comment">// read the nextCluster value</span>00471 nextCluster = (*((<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>*) &((<span class="keywordtype">char</span>*)FAT_CACHE_ADDR)[offset])) & fatMask;00472 00473 <span class="comment">// check to see if we're at the end of the chain</span>00474 <span class="keywordflow">if</span> (nextCluster == (CLUST_EOFE & fatMask))00475 nextCluster = 0;00476 00477 <span class="preprocessor">#ifdef DEBUG_FAT</span>00478 <span class="preprocessor"></span> <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">">"</span>);00479 <a class="code" href="group__rprintf.html#ga9">rprintfu32</a>(nextCluster);00480 <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00481 <span class="preprocessor">#endif</span>00482 <span class="preprocessor"></span> 00483 <span class="keywordflow">return</span> nextCluster;00484 }</pre></div><hr size="1"><address style="align: right;"><small>Generated on Sun Oct 29 03:41:06 2006 for Procyon AVRlib by <a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.2 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -