2 * FreeRTOS+FAT SL V1.0.1 (C) 2014 HCC Embedded
\r
4 * The FreeRTOS+FAT SL license terms are different to the FreeRTOS license
\r
7 * FreeRTOS+FAT SL uses a dual license model that allows the software to be used
\r
8 * under a standard GPL open source license, or a commercial license. The
\r
9 * standard GPL license (unlike the modified GPL license under which FreeRTOS
\r
10 * itself is distributed) requires that all software statically linked with
\r
11 * FreeRTOS+FAT SL is also distributed under the same GPL V2 license terms.
\r
12 * Details of both license options follow:
\r
14 * - Open source licensing -
\r
15 * FreeRTOS+FAT SL is a free download and may be used, modified, evaluated and
\r
16 * distributed without charge provided the user adheres to version two of the
\r
17 * GNU General Public License (GPL) and does not remove the copyright notice or
\r
18 * this text. The GPL V2 text is available on the gnu.org web site, and on the
\r
19 * following URL: http://www.FreeRTOS.org/gpl-2.0.txt.
\r
21 * - Commercial licensing -
\r
22 * Businesses and individuals who for commercial or other reasons cannot comply
\r
23 * with the terms of the GPL V2 license must obtain a commercial license before
\r
24 * incorporating FreeRTOS+FAT SL into proprietary software for distribution in
\r
25 * any form. Commercial licenses can be purchased from
\r
26 * http://shop.freertos.org/fat_sl and do not require any source files to be
\r
29 * FreeRTOS+FAT SL is distributed in the hope that it will be useful. You
\r
30 * cannot use FreeRTOS+FAT SL unless you agree that you use the software 'as
\r
31 * is'. FreeRTOS+FAT SL is provided WITHOUT ANY WARRANTY; without even the
\r
32 * implied warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A
\r
33 * PARTICULAR PURPOSE. Real Time Engineers Ltd. and HCC Embedded disclaims all
\r
34 * conditions and terms, be they implied, expressed, or statutory.
\r
36 * http://www.FreeRTOS.org
\r
37 * http://www.FreeRTOS.org/FreeRTOS-Plus
\r
42 #include "../../api/fat_sl.h"
\r
43 #include "config_fat_sl_test.h"
\r
44 #include "../../psp/target/fat_sl/psp_test.h"
\r
46 #include "../../version/ver_fat_sl.h"
\r
47 #if VER_FAT_SL_MAJOR != 5 || VER_FAT_SL_MINOR != 2
\r
48 #error Incompatible FAT_SL version number!
\r
51 static char cwd[F_MAXPATH];
\r
55 static void _f_deleteall ( void )
\r
58 unsigned char sd = 0, rc, fl = 0;
\r
63 rc = f_findfirst( "*.*", &find );
\r
64 while ( rc == 0 && find.filename[0] == '.' )
\r
66 rc = f_findnext( &find );
\r
71 if ( find.attr & F_ATTR_DIR )
\r
76 (void)f_chdir( find.filename );
\r
81 (void)f_delete( find.filename );
\r
82 rc = f_findnext( &find );
\r
86 if ( rc && sd && fl )
\r
88 (void)f_chdir( ".." );
\r
92 (void)f_rmdir( find.filename );
\r
93 rc = f_findnext( &find );
\r
96 if ( rc && sd && !fl )
\r
98 (void)f_chdir( "/" );
\r
104 } /* _f_deleteall */
\r
107 static char * f_nameconv ( char * s )
\r
114 if ( ( ch >= 'a' ) && ( ch <= 'z' ) )
\r
129 static unsigned char f_formatting ( void )
\r
133 _f_dump( "f_formatting" );
\r
135 /*checking formatting*/
\r
136 ret = f_format( F_FAT_TYPE );
\r
139 return _f_result( __LINE__, ret );
\r
142 ret = _f_poweron();
\r
145 return _f_result( __LINE__, ret );
\r
148 ret = f_findfirst( "*.*", &find );
\r
149 if ( ret != F_ERR_NOTFOUND )
\r
151 return _f_result( __LINE__, ret );
\r
154 _f_dump( "passed..." );
\r
156 } /* f_formatting */
\r
158 static unsigned char _f_checkcwd ( char * orig )
\r
162 ret = f_getcwd( cwd, F_MAXPATH );
\r
168 if ( strcmp( orig, cwd ) )
\r
170 return (unsigned char)-1;
\r
176 static unsigned char f_dirtest ( void )
\r
180 _f_dump( "f_dirtest" );
\r
184 /*creates a ab abc abcd*/
\r
185 ret = f_mkdir( "a" );
\r
188 return _f_result( __LINE__, ret );
\r
191 ret = f_mkdir( "ab" );
\r
194 return _f_result( __LINE__, ret );
\r
197 ret = f_mkdir( "abc" );
\r
200 return _f_result( __LINE__, ret );
\r
203 ret = f_mkdir( "abca" );
\r
206 return _f_result( __LINE__, ret );
\r
209 /*creates directories in /a - a ab abc abcd*/
\r
210 ret = f_mkdir( "a/a" );
\r
213 return _f_result( __LINE__, ret );
\r
216 ret = f_mkdir( "a/ab" );
\r
219 return _f_result( __LINE__, ret );
\r
222 ret = f_mkdir( "a/abc" );
\r
225 return _f_result( __LINE__, ret );
\r
228 ret = f_mkdir( "a/abcd" );
\r
231 return _f_result( __LINE__, ret );
\r
234 /*change into a/abcd and check cwd*/
\r
235 ret = f_chdir( "a/abcd" );
\r
238 return _f_result( __LINE__, ret );
\r
241 ret = _f_checkcwd( f_nameconv( "/a/abcd" ) );
\r
244 return _f_result( __LINE__, ret );
\r
247 /*make directory t change into t and check cwd="a/abcd/t"*/
\r
248 ret = f_mkdir( "t" );
\r
251 return _f_result( __LINE__, ret );
\r
254 ret = f_chdir( "t" );
\r
257 return _f_result( __LINE__, ret );
\r
260 ret = _f_checkcwd( f_nameconv( "/a/abcd/t" ) );
\r
263 return _f_result( __LINE__, ret );
\r
266 ret = f_chdir( "." );
\r
269 return _f_result( __LINE__, ret );
\r
272 ret = _f_checkcwd( f_nameconv( "/a/abcd/t" ) );
\r
275 return _f_result( __LINE__, ret );
\r
278 ret = f_chdir( "../." );
\r
281 return _f_result( __LINE__, ret );
\r
284 ret = _f_checkcwd( f_nameconv( "/a/abcd" ) );
\r
287 return _f_result( __LINE__, ret );
\r
291 ret = f_rmdir( "t" );
\r
294 return _f_result( __LINE__, ret );
\r
297 ret = f_chdir( "t" );
\r
298 if ( ret != F_ERR_NOTFOUND )
\r
300 return _f_result( __LINE__, ret );
\r
303 /*removing /a dir*/
\r
304 ret = f_rmdir( "/ab" );
\r
307 return _f_result( __LINE__, ret );
\r
310 ret = f_chdir( "/ab" );
\r
311 if ( ret != F_ERR_NOTFOUND )
\r
313 return _f_result( __LINE__, ret );
\r
316 /*removing /a dir*/
\r
317 ret = f_rmdir( "../../a" );
\r
318 if ( ret != F_ERR_NOTEMPTY )
\r
320 return _f_result( __LINE__, ret );
\r
323 /*removing /abca dir*/
\r
324 ret = f_rmdir( "a:/abca" );
\r
327 return _f_result( __LINE__, ret );
\r
330 /*changing invalid dirs*/
\r
331 ret = f_chdir( "" );
\r
332 if ( ret != F_ERR_INVALIDNAME )
\r
334 return _f_result( __LINE__, ret );
\r
337 ret = f_chdir( " " );
\r
340 return _f_result( __LINE__, ret );
\r
343 ret = _f_checkcwd( f_nameconv( "/a/abcd" ) );
\r
346 return _f_result( __LINE__, ret );
\r
349 ret = f_chdir( "?" );
\r
350 if ( ret != F_ERR_INVALIDNAME )
\r
352 return _f_result( __LINE__, ret );
\r
355 ret = f_chdir( "*.*" );
\r
356 if ( ret != F_ERR_INVALIDNAME )
\r
358 return _f_result( __LINE__, ret );
\r
361 ret = _f_checkcwd( f_nameconv( "/a/abcd" ) );
\r
364 return _f_result( __LINE__, ret );
\r
367 /*changing into /abc and removes subfolder from /a/ */
\r
368 ret = f_chdir( "/abc" );
\r
371 return _f_result( __LINE__, ret );
\r
374 ret = f_rmdir( "/a/a" );
\r
377 return _f_result( __LINE__, ret );
\r
380 ret = f_rmdir( "A:../a/ab" );
\r
383 return _f_result( __LINE__, ret );
\r
386 ret = f_rmdir( "A:/a/abc" );
\r
389 return _f_result( __LINE__, ret );
\r
392 ret = f_rmdir( ".././abc/.././a/../a/abcd" );
\r
395 return _f_result( __LINE__, ret );
\r
398 /*some invalid rmdir*/
\r
399 ret = f_rmdir( "." );
\r
400 if ( ret != F_ERR_NOTFOUND )
\r
402 return _f_result( __LINE__, ret );
\r
405 ret = f_rmdir( ".." );
\r
406 if ( ret != F_ERR_NOTFOUND )
\r
408 return _f_result( __LINE__, ret );
\r
411 /*create again abc remove abc*/
\r
412 ret = f_mkdir( ".././abc" );
\r
413 if ( ret != F_ERR_DUPLICATED )
\r
415 return _f_result( __LINE__, ret );
\r
418 ret = f_rmdir( "../abc" );
\r
421 return _f_result( __LINE__, ret );
\r
424 ret = f_mkdir( ".././abc" );
\r
425 if ( ret != F_ERR_INVALIDDIR )
\r
427 return _f_result( __LINE__, ret ); /*cwd is not exist*/
\r
430 ret = f_chdir( "/" );
\r
433 return _f_result( __LINE__, ret );
\r
436 /*try . and .. in the root*/
\r
437 ret = f_chdir( "." );
\r
440 return _f_result( __LINE__, ret );
\r
443 ret = f_chdir( "./././." );
\r
446 return _f_result( __LINE__, ret );
\r
449 ret = f_chdir( ".." );
\r
450 if ( ret != F_ERR_NOTFOUND )
\r
452 return _f_result( __LINE__, ret );
\r
455 ret = _f_checkcwd( "/" ); /*root!*/
\r
458 return _f_result( __LINE__, ret );
\r
461 /*test . and .. in a and remove a*/
\r
462 ret = f_chdir( "a" );
\r
465 return _f_result( __LINE__, ret );
\r
468 ret = f_chdir( ".." );
\r
471 return _f_result( __LINE__, ret );
\r
474 ret = f_chdir( "a" );
\r
477 return _f_result( __LINE__, ret );
\r
480 ret = f_chdir( "." );
\r
483 return _f_result( __LINE__, ret );
\r
486 ret = f_chdir( "a" );
\r
487 if ( ret != F_ERR_NOTFOUND )
\r
489 return _f_result( __LINE__, ret );
\r
492 ret = f_chdir( "./.." );
\r
495 return _f_result( __LINE__, ret );
\r
498 ret = f_rmdir( "a" );
\r
501 return _f_result( __LINE__, ret );
\r
504 /*check if all are removed*/
\r
505 ret = f_findfirst( "*.*", &find );
\r
506 if ( ret != F_ERR_NOTFOUND )
\r
508 return _f_result( __LINE__, ret );
\r
511 _f_dump( "passed..." );
\r
516 static unsigned char f_findingtest ( void )
\r
520 _f_dump( "f_findingtest" );
\r
525 ret = f_findfirst( "*.*", &find );
\r
526 if ( ret != F_ERR_NOTFOUND )
\r
528 return _f_result( __LINE__, ret );
\r
531 /*create Hello.dir*/
\r
532 ret = f_mkdir( "Hello.dir" );
\r
535 return _f_result( __LINE__, ret );
\r
538 /*check if it is exist, and only exist*/
\r
539 ret = f_findfirst( "*.*", &find );
\r
542 return _f_result( __LINE__, ret );
\r
545 if ( strcmp( find.filename, f_nameconv( "Hello.dir" ) ) )
\r
547 return _f_result( __LINE__, 0 );
\r
550 if ( find.attr != F_ATTR_DIR )
\r
552 return _f_result( __LINE__, 0 );
\r
555 ret = f_findnext( &find );
\r
556 if ( ret != F_ERR_NOTFOUND )
\r
558 return _f_result( __LINE__, ret );
\r
561 /*check some not founds*/
\r
562 ret = f_findfirst( "q*.*", &find );
\r
563 if ( ret != F_ERR_NOTFOUND )
\r
565 return _f_result( __LINE__, ret );
\r
568 ret = f_findfirst( "Hello.", &find );
\r
569 if ( ret != F_ERR_NOTFOUND )
\r
571 return _f_result( __LINE__, ret );
\r
574 ret = f_findfirst( "a/*.*", &find );
\r
575 if ( ret != F_ERR_INVALIDDIR )
\r
577 return _f_result( __LINE__, ret );
\r
580 ret = f_findfirst( ".", &find );
\r
581 if ( ret != F_ERR_NOTFOUND )
\r
583 return _f_result( __LINE__, ret );
\r
586 ret = f_findfirst( "..", &find );
\r
587 if ( ret != F_ERR_NOTFOUND )
\r
589 return _f_result( __LINE__, ret );
\r
592 ret = f_findfirst( "?e.*", &find );
\r
593 if ( ret != F_ERR_NOTFOUND )
\r
595 return _f_result( __LINE__, ret );
\r
598 ret = f_findfirst( "*.", &find );
\r
599 if ( ret != F_ERR_NOTFOUND )
\r
601 return _f_result( __LINE__, ret );
\r
604 ret = f_findfirst( "*.?", &find );
\r
605 if ( ret != F_ERR_NOTFOUND )
\r
607 return _f_result( __LINE__, ret );
\r
610 ret = f_findfirst( "*.??", &find );
\r
611 if ( ret != F_ERR_NOTFOUND )
\r
613 return _f_result( __LINE__, ret );
\r
617 /*check some founds*/
\r
618 ret = f_findfirst( "*.dir", &find );
\r
621 return _f_result( __LINE__, ret );
\r
624 ret = f_findfirst( "*.d?r", &find );
\r
627 return _f_result( __LINE__, ret );
\r
630 ret = f_findfirst( "*.d??", &find );
\r
633 return _f_result( __LINE__, ret );
\r
636 ret = f_findfirst( "*.???", &find );
\r
639 return _f_result( __LINE__, ret );
\r
642 ret = f_findfirst( "?ello.???", &find );
\r
645 return _f_result( __LINE__, ret );
\r
648 ret = f_findfirst( "he??o.dir", &find );
\r
651 return _f_result( __LINE__, ret );
\r
654 ret = f_findfirst( "he?*.dir", &find );
\r
657 return _f_result( __LINE__, ret );
\r
660 ret = f_findfirst( "HELLO.DIR", &find ); /*no capitals sensitivity in find!!*/
\r
663 return _f_result( __LINE__, ret );
\r
666 /*change into hello.dir*/
\r
667 ret = f_chdir( "hello.dir" );
\r
670 return _f_result( __LINE__, ret );
\r
673 ret = f_findfirst( "*.*", &find );
\r
676 return _f_result( __LINE__, ret );
\r
679 ret = f_findfirst( "..", &find );
\r
682 return _f_result( __LINE__, ret );
\r
685 ret = f_findfirst( "??", &find );
\r
688 return _f_result( __LINE__, ret );
\r
691 ret = f_findfirst( ".", &find );
\r
694 return _f_result( __LINE__, ret );
\r
697 ret = f_findfirst( "k*.*", &find );
\r
698 if ( ret != F_ERR_NOTFOUND )
\r
700 return _f_result( __LINE__, ret );
\r
703 ret = f_findfirst( "*.", &find );
\r
706 return _f_result( __LINE__, ret );
\r
709 if ( strcmp( find.filename, "." ) )
\r
711 return _f_result( __LINE__, 0 );
\r
714 ret = f_findnext( &find );
\r
717 return _f_result( __LINE__, ret );
\r
720 if ( strcmp( find.filename, ".." ) )
\r
722 return _f_result( __LINE__, 0 );
\r
725 ret = f_findnext( &find );
\r
726 if ( ret != F_ERR_NOTFOUND )
\r
728 return _f_result( __LINE__, ret );
\r
732 ret = f_findfirst( "*.a", &find );
\r
733 if ( ret != F_ERR_NOTFOUND )
\r
735 return _f_result( __LINE__, ret );
\r
738 /*creating testdir and find it*/
\r
739 ret = f_mkdir( "testdir" );
\r
742 return _f_result( __LINE__, ret );
\r
745 ret = f_findfirst( "*.", &find );
\r
748 return _f_result( __LINE__, ret );
\r
751 if ( strcmp( find.filename, "." ) )
\r
753 return _f_result( __LINE__, 0 );
\r
756 ret = f_findnext( &find );
\r
759 return _f_result( __LINE__, ret );
\r
762 if ( strcmp( find.filename, ".." ) )
\r
764 return _f_result( __LINE__, 0 );
\r
767 ret = f_findnext( &find );
\r
770 return _f_result( __LINE__, ret );
\r
774 if ( strcmp( find.filename, f_nameconv( "testdir" ) ) )
\r
776 return _f_result( __LINE__, 0 );
\r
779 ret = f_findfirst( "*.*", &find );
\r
782 return _f_result( __LINE__, ret );
\r
785 if ( strcmp( find.filename, "." ) )
\r
787 return _f_result( __LINE__, 0 );
\r
790 ret = f_findnext( &find );
\r
793 return _f_result( __LINE__, ret );
\r
796 if ( strcmp( find.filename, ".." ) )
\r
798 return _f_result( __LINE__, 0 );
\r
801 ret = f_findnext( &find );
\r
804 return _f_result( __LINE__, ret );
\r
807 if ( strcmp( find.filename, f_nameconv( "testdir" ) ) )
\r
809 return _f_result( __LINE__, 0 );
\r
812 ret = f_findnext( &find );
\r
813 if ( ret != F_ERR_NOTFOUND )
\r
815 return _f_result( __LINE__, ret );
\r
818 /*search exact file*/
\r
819 ret = f_findfirst( "testDir", &find ); /*no capitals!*/
\r
822 return _f_result( __LINE__, ret );
\r
825 if ( strcmp( find.filename, f_nameconv( "testdir" ) ) )
\r
827 return _f_result( __LINE__, 0 );
\r
830 ret = f_findnext( &find );
\r
831 if ( ret != F_ERR_NOTFOUND )
\r
833 return _f_result( __LINE__, ret );
\r
837 /*go back to root and remove dirs*/
\r
838 ret = f_chdir( "\\" );
\r
841 return _f_result( __LINE__, ret );
\r
844 ret = f_rmdir( "Hello.dir/testdir" );
\r
847 return _f_result( __LINE__, ret );
\r
850 ret = f_rmdir( "Hello.dir" );
\r
853 return _f_result( __LINE__, ret );
\r
856 /*check if all are removed*/
\r
857 ret = f_findfirst( "*.*", &find );
\r
858 if ( ret != F_ERR_NOTFOUND )
\r
860 return _f_result( __LINE__, ret );
\r
863 _f_dump( "passed..." );
\r
865 } /* f_findingtest */
\r
867 static unsigned char f_powerfail ( void )
\r
871 _f_dump( "f_powerfail" );
\r
873 /*checking if its power fail system (RAMDRIVE is not powerfail!)*/
\r
874 ret = f_mkdir( "testdir" );
\r
877 return _f_result( __LINE__, ret );
\r
880 ret = _f_poweron();
\r
883 return _f_result( __LINE__, ret );
\r
886 ret = f_findfirst( "testdir", &find );
\r
889 return _f_result( __LINE__, ret );
\r
892 /*checking formatting*/
\r
893 ret = f_format( F_FAT_TYPE );
\r
896 return _f_result( __LINE__, ret );
\r
899 ret = _f_poweron();
\r
902 return _f_result( __LINE__, ret );
\r
905 ret = f_findfirst( "*.*", &find );
\r
906 if ( ret != F_ERR_NOTFOUND )
\r
908 return _f_result( __LINE__, ret );
\r
911 /*checking formatting, 1st creating*/
\r
912 ret = f_format( F_FAT_TYPE );
\r
915 return _f_result( __LINE__, ret );
\r
918 ret = f_mkdir( "testdir" );
\r
921 return _f_result( __LINE__, ret );
\r
924 ret = f_findfirst( "testdir", &find );
\r
927 return _f_result( __LINE__, ret );
\r
930 if ( strcmp( find.filename, f_nameconv( "testdir" ) ) )
\r
932 return _f_result( __LINE__, 0 );
\r
935 ret = _f_poweron();
\r
938 return _f_result( __LINE__, ret );
\r
941 ret = f_findfirst( "*.*", &find );
\r
944 return _f_result( __LINE__, ret );
\r
947 if ( strcmp( find.filename, f_nameconv( "testdir" ) ) )
\r
949 return _f_result( __LINE__, 0 );
\r
952 /*checking formatting, 2nd creating*/
\r
953 ret = f_format( F_FAT_TYPE );
\r
956 return _f_result( __LINE__, ret );
\r
959 ret = f_mkdir( "testdir" );
\r
962 return _f_result( __LINE__, ret );
\r
965 ret = f_findfirst( "testdir", &find );
\r
968 return _f_result( __LINE__, ret );
\r
971 if ( strcmp( find.filename, f_nameconv( "testdir" ) ) )
\r
973 return _f_result( __LINE__, 0 );
\r
976 ret = f_mkdir( "testdir2" );
\r
979 return _f_result( __LINE__, ret );
\r
982 ret = f_findfirst( "testdir2", &find );
\r
985 return _f_result( __LINE__, ret );
\r
988 if ( strcmp( find.filename, f_nameconv( "testdir2" ) ) )
\r
990 return _f_result( __LINE__, 0 );
\r
993 ret = _f_poweron();
\r
996 return _f_result( __LINE__, ret );
\r
999 ret = f_findfirst( "*.*", &find );
\r
1002 return _f_result( __LINE__, ret );
\r
1005 if ( strcmp( find.filename, f_nameconv( "testdir" ) ) )
\r
1007 return _f_result( __LINE__, 0 );
\r
1010 ret = f_findnext( &find );
\r
1013 return _f_result( __LINE__, ret );
\r
1016 if ( strcmp( find.filename, f_nameconv( "testdir2" ) ) )
\r
1018 return _f_result( __LINE__, 0 );
\r
1021 ret = f_findnext( &find );
\r
1022 if ( ret != F_ERR_NOTFOUND )
\r
1024 return _f_result( __LINE__, ret );
\r
1028 /*checking empty*/
\r
1029 ret = _f_poweron();
\r
1032 return _f_result( __LINE__, ret );
\r
1035 ret = f_format( F_FAT_TYPE );
\r
1038 return _f_result( __LINE__, ret );
\r
1041 ret = _f_poweron();
\r
1044 return _f_result( __LINE__, ret );
\r
1047 ret = f_findfirst( "*.*", &find );
\r
1048 if ( ret != F_ERR_NOTFOUND )
\r
1050 return _f_result( __LINE__, ret );
\r
1054 _f_dump( "passed..." );
\r
1056 } /* f_powerfail */
\r
1059 char testbuffer[F_MAX_SEEK_TEST + 16]; /* +16 for f_appending test */
\r
1061 static unsigned char checkfilecontent ( long nums, unsigned char value, F_FILE * file )
\r
1067 if ( f_eof( file ) )
\r
1069 return 1; /*eof ?*/
\r
1072 if ( 1 != f_read( &ch, 1, 1, file ) )
\r
1077 if ( ch != value )
\r
1084 } /* checkfilecontent */
\r
1086 static unsigned char f_seeking ( int sectorsize )
\r
1089 unsigned char ret;
\r
1090 unsigned long size;
\r
1091 unsigned long pos;
\r
1092 unsigned long fname_pos;
\r
1093 char * test_fname[4] =
\r
1095 "test1.txt", "test2.txt", "test3.txt", "test4.txt"
\r
1098 if ( sectorsize == 128 )
\r
1100 _f_dump( "f_seeking with 128" );
\r
1103 #if ( F_MAX_SEEK_TEST > 128 )
\r
1104 else if ( sectorsize == 256 )
\r
1106 _f_dump( "f_seeking with 256" );
\r
1109 #if ( F_MAX_SEEK_TEST > 256 )
\r
1110 else if ( sectorsize == 512 )
\r
1112 _f_dump( "f_seeking with 512" );
\r
1115 #if ( F_MAX_SEEK_TEST > 512 )
\r
1116 else if ( sectorsize == 1024 )
\r
1118 _f_dump( "f_seeking with 1024" );
\r
1121 #if ( F_MAX_SEEK_TEST > 1024 )
\r
1122 else if ( sectorsize == 2048 )
\r
1124 _f_dump( "f_seeking with 2048" );
\r
1127 #if ( F_MAX_SEEK_TEST > 2048 )
\r
1128 else if ( sectorsize == 4096 )
\r
1130 _f_dump( "f_seeking with 4096" );
\r
1133 #if ( F_MAX_SEEK_TEST > 4096 )
\r
1134 else if ( sectorsize == 8192 )
\r
1136 _f_dump( "f_seeking with 8192" );
\r
1139 #if ( F_MAX_SEEK_TEST > 8192 )
\r
1140 else if ( sectorsize == 16384 )
\r
1142 _f_dump( "f_seeking with 16384" );
\r
1145 #if ( F_MAX_SEEK_TEST > 16384 )
\r
1146 else if ( sectorsize == 32768 )
\r
1148 _f_dump( "f_seeking with 32768" );
\r
1153 _f_dump( "f_seeking with random" );
\r
1156 /*checking sector boundary seekeng*/
\r
1157 file = f_open( "test.bin", "w+" );
\r
1160 return _f_result( __LINE__, 0 );
\r
1163 /*write sectorsize times 0*/
\r
1164 psp_memset( testbuffer, 0, sectorsize );
\r
1165 size = (unsigned long)f_write( testbuffer, 1, (long)sectorsize, file );
\r
1166 if ( size != (unsigned long)sectorsize )
\r
1168 return _f_result( __LINE__, size );
\r
1171 pos = (unsigned long)f_tell( file );
\r
1172 if ( pos != (unsigned long)sectorsize )
\r
1174 return _f_result( __LINE__, pos );
\r
1177 /*seek back and read some*/
\r
1178 ret = f_seek( file, 0, F_SEEK_SET ); /*seek back*/
\r
1181 return _f_result( __LINE__, ret );
\r
1184 pos = (unsigned long)f_tell( file );
\r
1187 return _f_result( __LINE__, pos );
\r
1190 size = (unsigned long)f_read( testbuffer, 1, sectorsize, file );
\r
1191 if ( size != (unsigned long)sectorsize )
\r
1193 return _f_result( __LINE__, size );
\r
1196 pos = (unsigned long)f_tell( file );
\r
1197 if ( pos != (unsigned long)sectorsize )
\r
1199 return _f_result( __LINE__, pos );
\r
1202 /*fake read at eof*/
\r
1203 size = (unsigned long)f_read( testbuffer, 1, 2, file ); /*eof!*/
\r
1206 return _f_result( __LINE__, size );
\r
1209 pos = (unsigned long)f_tell( file );
\r
1210 if ( pos != (unsigned long)sectorsize )
\r
1212 return _f_result( __LINE__, pos );
\r
1215 /*writing sectorsize times 1 at the end*/
\r
1216 psp_memset( testbuffer, 1, sectorsize );
\r
1217 size = (unsigned long)f_write( testbuffer, 1, sectorsize, file );
\r
1218 if ( size != (unsigned long)sectorsize )
\r
1220 return _f_result( __LINE__, size );
\r
1223 pos = (unsigned long)f_tell( file );
\r
1224 if ( pos != (unsigned long)( sectorsize * 2 ) )
\r
1226 return _f_result( __LINE__, pos );
\r
1229 /*seeking back and read 1byte less*/
\r
1230 ret = f_seek( file, 0, F_SEEK_SET );
\r
1233 return _f_result( __LINE__, ret );
\r
1236 pos = (unsigned long)f_tell( file );
\r
1239 return _f_result( __LINE__, pos );
\r
1242 size = (unsigned long)f_read( testbuffer, 1, sectorsize - 1, file );
\r
1243 if ( size != (unsigned long)( sectorsize - 1 ) )
\r
1245 return _f_result( __LINE__, size );
\r
1248 pos = (unsigned long)f_tell( file );
\r
1249 if ( pos != (unsigned long)( sectorsize - 1 ) )
\r
1251 return _f_result( __LINE__, pos );
\r
1255 /*write 2 times 2*/
\r
1256 psp_memset( testbuffer, 2, sectorsize );
\r
1257 size = (unsigned long)f_write( testbuffer, 1, 2, file );
\r
1260 return _f_result( __LINE__, size );
\r
1263 pos = (unsigned long)f_tell( file );
\r
1264 if ( pos != (unsigned long)( sectorsize + 1 ) )
\r
1266 return _f_result( __LINE__, pos );
\r
1270 size = (unsigned long)f_read( testbuffer, 2, 1, file );
\r
1273 return _f_result( __LINE__, size );
\r
1276 pos = (unsigned long)f_tell( file );
\r
1277 if ( pos != (unsigned long)( sectorsize + 3 ) )
\r
1279 return _f_result( __LINE__, pos );
\r
1283 /*write 4 times 3*/
\r
1284 psp_memset( testbuffer, 3, sectorsize );
\r
1285 size = (unsigned long)f_write( testbuffer, 1, 4, file );
\r
1288 return _f_result( __LINE__, size );
\r
1291 pos = (unsigned long)f_tell( file );
\r
1292 if ( pos != (unsigned long)( sectorsize + 3 + 4 ) )
\r
1294 return _f_result( __LINE__, pos );
\r
1298 ret = f_seek( file, 2, F_SEEK_SET );
\r
1301 return _f_result( __LINE__, ret );
\r
1304 pos = (unsigned long)f_tell( file );
\r
1307 return _f_result( __LINE__, pos );
\r
1310 /*write 6 times 4*/
\r
1311 psp_memset( testbuffer, 4, sectorsize );
\r
1312 size = (unsigned long)f_write( testbuffer, 1, 6, file );
\r
1315 return _f_result( __LINE__, size );
\r
1318 pos = (unsigned long)f_tell( file );
\r
1321 return _f_result( __LINE__, pos );
\r
1325 ret = f_seek( file, -4, F_SEEK_END );
\r
1328 return _f_result( __LINE__, ret );
\r
1331 pos = (unsigned long)f_tell( file );
\r
1332 if ( pos != (unsigned long)( 2 * sectorsize - 4 ) )
\r
1334 return _f_result( __LINE__, pos );
\r
1338 size = (unsigned long)f_read( testbuffer, 1, 2, file );
\r
1341 return _f_result( __LINE__, size );
\r
1344 pos = (unsigned long)f_tell( file );
\r
1345 if ( pos != (unsigned long)( 2 * sectorsize - 2 ) )
\r
1347 return _f_result( __LINE__, pos );
\r
1350 /*write 8 times 5*/
\r
1351 psp_memset( testbuffer, 5, sectorsize );
\r
1352 size = (unsigned long)f_write( testbuffer, 1, 8, file );
\r
1355 return _f_result( __LINE__, size );
\r
1358 pos = (unsigned long)f_tell( file );
\r
1359 if ( pos != (unsigned long)( 2 * sectorsize + 6 ) )
\r
1361 return _f_result( __LINE__, pos );
\r
1364 /*seek to the begining*/
\r
1365 ret = f_seek( file, 0, F_SEEK_SET );
\r
1368 return _f_result( __LINE__, ret );
\r
1371 pos = (unsigned long)f_tell( file );
\r
1374 return _f_result( __LINE__, pos );
\r
1377 /*seek to the end*/
\r
1378 ret = f_seek( file, 2 * sectorsize + 6, F_SEEK_SET );
\r
1381 return _f_result( __LINE__, ret );
\r
1384 pos = (unsigned long)f_tell( file );
\r
1385 if ( pos != (unsigned long)( 2 * sectorsize + 6 ) )
\r
1387 return _f_result( __LINE__, pos );
\r
1390 /*write 2 times 6*/
\r
1391 psp_memset( testbuffer, 6, sectorsize );
\r
1392 size = (unsigned long)f_write( testbuffer, 1, 2, file );
\r
1395 return _f_result( __LINE__, size );
\r
1398 pos = (unsigned long)f_tell( file );
\r
1399 if ( pos != (unsigned long)( 2 * sectorsize + 8 ) )
\r
1401 return _f_result( __LINE__, pos );
\r
1404 /*seek to the begining*/
\r
1405 (void)f_seek( file, -( 2 * sectorsize + 8 ), F_SEEK_CUR );
\r
1408 return _f_result( __LINE__, ret );
\r
1411 pos = (unsigned long)f_tell( file );
\r
1414 return _f_result( __LINE__, pos );
\r
1417 /*read 2 times sector*/
\r
1418 size = (unsigned long)f_read( testbuffer, 1, sectorsize, file );
\r
1419 if ( size != (unsigned long)sectorsize )
\r
1421 return _f_result( __LINE__, size );
\r
1424 pos = (unsigned long)f_tell( file );
\r
1425 if ( pos != (unsigned long)sectorsize )
\r
1427 return _f_result( __LINE__, pos );
\r
1430 size = (unsigned long)f_read( testbuffer, 1, sectorsize, file );
\r
1431 if ( size != (unsigned long)sectorsize )
\r
1433 return _f_result( __LINE__, size );
\r
1436 pos = (unsigned long)f_tell( file );
\r
1437 if ( pos != (unsigned long)( 2 * sectorsize ) )
\r
1439 return _f_result( __LINE__, pos );
\r
1442 /*write 1 once 7*/
\r
1443 psp_memset( testbuffer, 7, sectorsize );
\r
1444 size = (unsigned long)f_write( testbuffer, 1, 1, file );
\r
1447 return _f_result( __LINE__, size );
\r
1450 pos = (unsigned long)f_tell( file );
\r
1451 if ( pos != (unsigned long)( 2 * sectorsize + 1 ) )
\r
1453 return _f_result( __LINE__, pos );
\r
1457 ret = f_close( file );
\r
1460 return _f_result( __LINE__, ret );
\r
1464 /*check the result*/
\r
1465 size = (unsigned long)f_filelength( "test.bin" );
\r
1466 if ( size != (unsigned long)( 2 * sectorsize + 8 ) )
\r
1468 return _f_result( __LINE__, size );
\r
1472 file = f_open( "test.bin", "r" );
\r
1475 return _f_result( __LINE__, size );
\r
1478 if ( checkfilecontent( 2, 0, file ) )
\r
1480 return _f_result( __LINE__, 0 );
\r
1483 if ( checkfilecontent( 6, 4, file ) )
\r
1485 return _f_result( __LINE__, 0 );
\r
1488 if ( checkfilecontent( sectorsize - 8 - 1, 0, file ) )
\r
1490 return _f_result( __LINE__, 0 );
\r
1493 if ( checkfilecontent( 2, 2, file ) )
\r
1495 return _f_result( __LINE__, 0 );
\r
1498 if ( checkfilecontent( 2, 1, file ) )
\r
1500 return _f_result( __LINE__, 0 );
\r
1503 if ( checkfilecontent( 4, 3, file ) )
\r
1505 return _f_result( __LINE__, 0 );
\r
1508 if ( checkfilecontent( sectorsize - 7 - 2, 1, file ) )
\r
1510 return _f_result( __LINE__, 0 );
\r
1513 if ( checkfilecontent( 2, 5, file ) )
\r
1515 return _f_result( __LINE__, 0 );
\r
1518 if ( checkfilecontent( 1, 7, file ) )
\r
1520 return _f_result( __LINE__, 0 );
\r
1523 if ( checkfilecontent( 5, 5, file ) )
\r
1525 return _f_result( __LINE__, 0 );
\r
1528 if ( checkfilecontent( 2, 6, file ) )
\r
1530 return _f_result( __LINE__, 0 );
\r
1533 /*check pos result*/
\r
1534 pos = (unsigned long)f_tell( file );
\r
1535 if ( pos != (unsigned long)( 2 * sectorsize + 8 ) )
\r
1537 return _f_result( __LINE__, pos );
\r
1540 /*this has to be eof*/
\r
1541 pos = f_eof( file );
\r
1544 return _f_result( __LINE__, pos );
\r
1548 ret = f_close( file );
\r
1551 return _f_result( __LINE__, ret );
\r
1555 ret = f_delete( "test.bin" );
\r
1558 return _f_result( __LINE__, ret );
\r
1561 /**************************************************************/
\r
1562 for ( pos = 0 ; pos < 4 ; pos++ )
\r
1564 file = f_open( test_fname[pos], "w" );
\r
1565 if ( file == NULL )
\r
1567 return _f_result( __LINE__, 0 );
\r
1570 memset( testbuffer, '0' + pos, sectorsize );
\r
1571 if ( f_write( testbuffer, 1, sectorsize - 1, file ) != ( sectorsize - 1 ) )
\r
1573 return _f_result( __LINE__, 0 );
\r
1576 ret = f_close( file );
\r
1577 if ( ret != F_NO_ERROR )
\r
1579 return _f_result( __LINE__, 0 );
\r
1583 ret = f_delete( test_fname[0] );
\r
1584 if ( ret != F_NO_ERROR )
\r
1586 return _f_result( __LINE__, ret );
\r
1589 ret = f_delete( test_fname[2] );
\r
1590 if ( ret != F_NO_ERROR )
\r
1592 return _f_result( __LINE__, ret );
\r
1595 file = f_open( "test.txt", "w" );
\r
1596 if ( file == NULL )
\r
1598 return _f_result( __LINE__, 0 );
\r
1601 memset( testbuffer, 'a', sectorsize );
\r
1602 if ( f_write( testbuffer, 1, sectorsize, file ) != sectorsize )
\r
1604 return _f_result( __LINE__, 0 );
\r
1607 ret = f_close( file );
\r
1608 if ( ret != F_NO_ERROR )
\r
1610 return _f_result( __LINE__, 0 );
\r
1613 file = f_open( "test.txt", "r+" );
\r
1614 if ( file == NULL )
\r
1616 return _f_result( __LINE__, 0 );
\r
1619 ret = f_seek( file, 2 * sectorsize, F_SEEK_SET );
\r
1620 if ( ret != F_NO_ERROR )
\r
1622 return _f_result( __LINE__, ret );
\r
1625 ret = f_close( file );
\r
1626 if ( ret != F_NO_ERROR )
\r
1628 return _f_result( __LINE__, 0 );
\r
1631 for ( pos = 0 ; pos < 2 ; pos++ )
\r
1633 file = f_open( "test.txt", "r+" );
\r
1634 if ( file == NULL )
\r
1636 return _f_result( __LINE__, 0 );
\r
1639 ret = f_seek( file, ( pos + 2 ) * sectorsize, F_SEEK_SET );
\r
1640 if ( ret != F_NO_ERROR )
\r
1642 return _f_result( __LINE__, ret );
\r
1645 memset( testbuffer, 'b' + pos, sectorsize );
\r
1646 if ( f_write( testbuffer, 1, sectorsize, file ) != sectorsize )
\r
1648 return _f_result( __LINE__, 0 );
\r
1651 ret = f_close( file );
\r
1652 if ( ret != F_NO_ERROR )
\r
1654 return _f_result( __LINE__, ret );
\r
1659 for ( pos = 0 ; pos < 2 ; pos++ )
\r
1661 file = f_open( test_fname[fname_pos], "r" );
\r
1662 if ( file == NULL )
\r
1664 return _f_result( __LINE__, 0 );
\r
1667 if ( checkfilecontent( sectorsize - 1, '0' + ( unsigned char ) fname_pos, file ) )
\r
1669 return _f_result( __LINE__, 0 );
\r
1672 ret = f_close( file );
\r
1673 if ( ret != F_NO_ERROR )
\r
1675 return _f_result( __LINE__, ret );
\r
1681 file = f_open( "test.txt", "r" );
\r
1682 if ( file == NULL )
\r
1684 return _f_result( __LINE__, 0 );
\r
1687 if ( checkfilecontent( sectorsize, 'a', file ) )
\r
1689 return _f_result( __LINE__, 0 );
\r
1692 if ( checkfilecontent( sectorsize, 0, file ) )
\r
1694 return _f_result( __LINE__, 0 );
\r
1697 if ( checkfilecontent( sectorsize, 'b', file ) )
\r
1699 return _f_result( __LINE__, 0 );
\r
1702 if ( checkfilecontent( sectorsize, 'c', file ) )
\r
1704 return _f_result( __LINE__, 0 );
\r
1707 ret = f_close( file );
\r
1708 if ( ret != F_NO_ERROR )
\r
1710 return _f_result( __LINE__, ret );
\r
1713 ret = f_delete( "test.txt" );
\r
1714 if ( ret != F_NO_ERROR )
\r
1716 return _f_result( __LINE__, ret );
\r
1719 /************************************/
\r
1720 file = f_open( "test.txt", "w" );
\r
1721 if ( file == NULL )
\r
1723 return _f_result( __LINE__, 0 );
\r
1726 ret = f_seek( file, sectorsize - 2, F_SEEK_SET );
\r
1727 if ( ret != F_NO_ERROR )
\r
1729 return _f_result( __LINE__, 0 );
\r
1732 ret = f_close( file );
\r
1733 if ( ret != F_NO_ERROR )
\r
1735 return _f_result( __LINE__, 0 );
\r
1738 file = f_open( "test.txt", "r+" );
\r
1739 if ( file == NULL )
\r
1741 return _f_result( __LINE__, 0 );
\r
1744 memset( testbuffer, 'f', 2 );
\r
1745 if ( f_write( testbuffer, 1, 2, file ) != 2 )
\r
1747 return _f_result( __LINE__, 0 );
\r
1750 ret = f_seek( file, sectorsize - 2, F_SEEK_SET );
\r
1751 if ( ret != F_NO_ERROR )
\r
1753 return _f_result( __LINE__, 0 );
\r
1756 memset( testbuffer, 'g', 3 );
\r
1757 if ( f_write( testbuffer, 1, 3, file ) != 3 )
\r
1759 return _f_result( __LINE__, 0 );
\r
1762 ret = f_close( file );
\r
1763 if ( ret != F_NO_ERROR )
\r
1765 return _f_result( __LINE__, 0 );
\r
1768 file = f_open( "test.txt", "r+" );
\r
1769 if ( file == NULL )
\r
1771 return _f_result( __LINE__, 0 );
\r
1774 ret = f_seek( file, sectorsize * 2, F_SEEK_SET );
\r
1775 if ( ret != F_NO_ERROR )
\r
1777 return _f_result( __LINE__, 0 );
\r
1780 memset( testbuffer, 'h', sectorsize );
\r
1781 if ( f_write( testbuffer, 1, sectorsize, file ) != sectorsize )
\r
1783 return _f_result( __LINE__, 0 );
\r
1786 ret = f_close( file );
\r
1787 if ( ret != F_NO_ERROR )
\r
1789 return _f_result( __LINE__, 0 );
\r
1792 size = f_filelength( "test.txt" );
\r
1793 if ( size != ( unsigned long ) ( 3 * sectorsize ) )
\r
1795 return _f_result( __LINE__, size );
\r
1799 for ( pos = 0 ; pos < 2 ; pos++ )
\r
1801 file = f_open( test_fname[fname_pos], "r" );
\r
1802 if ( file == NULL )
\r
1804 return _f_result( __LINE__, 0 );
\r
1807 if ( checkfilecontent( sectorsize - 1, '0' + ( unsigned char ) fname_pos, file ) )
\r
1809 return _f_result( __LINE__, 0 );
\r
1812 ret = f_close( file );
\r
1813 if ( ret != F_NO_ERROR )
\r
1815 return _f_result( __LINE__, ret );
\r
1821 file = f_open( "test.txt", "r" );
\r
1822 if ( file == NULL )
\r
1824 return _f_result( __LINE__, 0 );
\r
1827 if ( checkfilecontent( 2, 'f', file ) )
\r
1829 return _f_result( __LINE__, 0 );
\r
1832 if ( checkfilecontent( sectorsize - 4, 0, file ) )
\r
1834 return _f_result( __LINE__, 0 );
\r
1837 if ( checkfilecontent( 3, 'g', file ) )
\r
1839 return _f_result( __LINE__, 0 );
\r
1842 if ( checkfilecontent( sectorsize - 1, 0, file ) )
\r
1844 return _f_result( __LINE__, 0 );
\r
1847 if ( checkfilecontent( sectorsize, 'h', file ) )
\r
1849 return _f_result( __LINE__, 0 );
\r
1852 ret = f_close( file );
\r
1853 if ( ret != F_NO_ERROR )
\r
1855 return _f_result( __LINE__, ret );
\r
1858 ret = f_delete( "test.txt" );
\r
1859 if ( ret != F_NO_ERROR )
\r
1861 return _f_result( __LINE__, ret );
\r
1864 ret = f_delete( test_fname[1] );
\r
1865 if ( ret != F_NO_ERROR )
\r
1867 return _f_result( __LINE__, ret );
\r
1870 ret = f_delete( test_fname[3] );
\r
1871 if ( ret != F_NO_ERROR )
\r
1873 return _f_result( __LINE__, ret );
\r
1876 _f_dump( "passed..." );
\r
1880 static unsigned char f_opening ( void )
\r
1884 unsigned char ret;
\r
1885 unsigned short size, pos;
\r
1887 _f_dump( "f_opening" );
\r
1889 /*test non existing file open r, r+*/
\r
1890 file = f_open( "file.bin", "r" );
\r
1893 return _f_result( __LINE__, 0 );
\r
1896 file = f_open( "file.bin", "r+" );
\r
1899 return _f_result( __LINE__, 0 );
\r
1902 /*test non existing appends "a" a+*/
\r
1903 file = f_open( "file.bin", "a" );
\r
1906 return _f_result( __LINE__, 0 );
\r
1909 file2 = f_open( "file.bin", "a+" ); /*open again*/
\r
1912 return _f_result( __LINE__, 0 );
\r
1915 ret = f_close( file );
\r
1918 return _f_result( __LINE__, 1 );
\r
1921 ret = f_close( file2 );
\r
1922 if ( ret != F_ERR_NOTOPEN )
\r
1924 return _f_result( __LINE__, 2 );
\r
1928 /*try to creates it w*/
\r
1929 file = f_open( "file.bin", "w" );
\r
1932 return _f_result( __LINE__, 0 );
\r
1935 /*write 512 times 1*/
\r
1936 psp_memset( testbuffer, 1, 512 ); /*set all 1*/
\r
1937 size = (unsigned short)f_write( testbuffer, 1, 512, file ); /*test write*/
\r
1938 if ( size != 512 )
\r
1940 return _f_result( __LINE__, size );
\r
1943 /*go back, and read it*/
\r
1944 ret = f_rewind( file ); /*back to the begining*/
\r
1947 return _f_result( __LINE__, ret ); /*it should fail*/
\r
1950 size = (unsigned short)f_read( testbuffer, 1, 512, file ); /*test read*/
\r
1953 return _f_result( __LINE__, size ); /*it should fail*/
\r
1956 /*close and check size*/
\r
1957 size = (unsigned short)f_filelength( "file.bin" );
\r
1960 return _f_result( __LINE__, size ); /*has to be zero*/
\r
1963 ret = f_close( file );
\r
1966 return _f_result( __LINE__, ret );
\r
1969 size = (unsigned short)f_filelength( "file.bin" );
\r
1970 if ( size != 512 )
\r
1972 return _f_result( __LINE__, size );
\r
1975 /*try to owerwrites it it*/
\r
1976 file = f_open( "file.bin", "w+" );
\r
1979 return _f_result( __LINE__, 0 );
\r
1982 /*close and check size*/
\r
1983 size = (unsigned short)f_filelength( "file.bin" );
\r
1986 return _f_result( __LINE__, size ); /*has to be zero*/
\r
1989 ret = f_close( file );
\r
1992 return _f_result( __LINE__, ret );
\r
1995 size = (unsigned short)f_filelength( "file.bin" );
\r
1998 return _f_result( __LINE__, size );
\r
2003 /*test non existing appends "a" */
\r
2004 file = f_open( "file.bin", "r+" );
\r
2007 return _f_result( __LINE__, 0 );
\r
2010 /*write 512 times 1*/
\r
2011 psp_memset( testbuffer, 1, 512 ); /*set all 1*/
\r
2012 size = (unsigned short)f_write( testbuffer, 1, 512, file ); /*test write*/
\r
2013 if ( size != 512 )
\r
2015 return _f_result( __LINE__, size );
\r
2018 /*go back, and read it*/
\r
2019 ret = f_rewind( file ); /*back to the begining*/
\r
2020 size = (unsigned short)f_read( testbuffer, 1, 512, file ); /*test read*/
\r
2021 if ( size != 512 )
\r
2023 return _f_result( __LINE__, size ); /*it should fail*/
\r
2026 ret = f_rewind( file ); /*back to the begining*/
\r
2028 /*write 256 times 2*/
\r
2029 psp_memset( testbuffer, 2, 512 ); /*set all 2*/
\r
2030 size = (unsigned short)f_write( testbuffer, 1, 256, file ); /*test write*/
\r
2031 if ( size != 256 )
\r
2033 return _f_result( __LINE__, size );
\r
2036 pos = (unsigned short)f_tell( file );
\r
2039 return _f_result( __LINE__, pos ); /*position has to be 512*/
\r
2042 size = (unsigned short)f_filelength( "file.bin" );
\r
2045 return _f_result( __LINE__, size ); /*has to be zero*/
\r
2048 /*close and check size*/
\r
2049 ret = f_close( file );
\r
2052 return _f_result( __LINE__, ret );
\r
2055 size = (unsigned short)f_filelength( "file.bin" );
\r
2056 if ( size != 512 )
\r
2058 return _f_result( __LINE__, size );
\r
2062 /*test non existing appends a+*/
\r
2063 file = f_open( "file.bin", "a+" );
\r
2066 return _f_result( __LINE__, 0 );
\r
2069 pos = (unsigned short)f_tell( file );
\r
2072 return _f_result( __LINE__, pos ); /*position has to be 512*/
\r
2075 /*write 512 times 3*/
\r
2076 psp_memset( testbuffer, 3, 512 ); /*set all 3*/
\r
2077 size = (unsigned short)f_write( testbuffer, 1, 512, file ); /*test write*/
\r
2078 if ( size != 512 )
\r
2080 return _f_result( __LINE__, size );
\r
2083 /*go back, and read it*/
\r
2084 ret = f_rewind( file ); /*back to the begining*/
\r
2087 return _f_result( __LINE__, ret ); /*it should fail*/
\r
2090 size = (unsigned short)f_read( testbuffer, 1, 512, file ); /*test read*/
\r
2091 if ( size != 512 )
\r
2093 return _f_result( __LINE__, size ); /*it should fail*/
\r
2096 pos = (unsigned short)f_tell( file );
\r
2099 return _f_result( __LINE__, pos ); /*position has to be 512*/
\r
2102 /*close and check size*/
\r
2103 size = (unsigned short)f_filelength( "file.bin" );
\r
2104 if ( size != 512 )
\r
2106 return _f_result( __LINE__, size ); /*has to be zero*/
\r
2109 ret = f_close( file );
\r
2112 return _f_result( __LINE__, ret );
\r
2115 size = (unsigned short)f_filelength( "file.bin" );
\r
2116 if ( size != 1024 )
\r
2118 return _f_result( __LINE__, size );
\r
2122 ret = f_close( file );
\r
2123 if ( ret != F_ERR_NOTOPEN )
\r
2125 return _f_result( __LINE__, pos );
\r
2128 ret = f_delete( "file.bin" );
\r
2131 return _f_result( __LINE__, ret );
\r
2134 _f_dump( "passed..." );
\r
2138 static unsigned char f_appending ( void )
\r
2141 unsigned short size, tsize, pos;
\r
2142 unsigned char a, b, ret;
\r
2144 _f_dump( "f_appending" );
\r
2148 for ( tsize = 0, a = 0 ; a < 16 ; a++ )
\r
2150 file = f_open( "ap.bin", "a" );
\r
2153 return _f_result( __LINE__, 0 );
\r
2156 psp_memset( testbuffer, a, sizeof( testbuffer ) );
\r
2157 size = (unsigned short)f_write( testbuffer, 1, a + 128, file );
\r
2158 if ( size != a + 128 )
\r
2160 return _f_result( __LINE__, size );
\r
2163 size = (unsigned short)f_filelength( "ap.bin" );
\r
2164 if ( size != tsize )
\r
2166 return _f_result( __LINE__, size );
\r
2171 ret = f_close( file );
\r
2174 return _f_result( __LINE__, ret );
\r
2177 size = (unsigned short)f_filelength( "ap.bin" );
\r
2178 if ( size != tsize )
\r
2180 return _f_result( __LINE__, size );
\r
2184 file = f_open( "ap.bin", "r" );
\r
2187 return _f_result( __LINE__, 0 );
\r
2190 for ( tsize = 0, a = 0 ; a < 16 ; a++ )
\r
2192 if ( checkfilecontent( a + 128, (char)a, file ) )
\r
2194 return _f_result( __LINE__, a );
\r
2198 ret = f_close( file );
\r
2201 return _f_result( __LINE__, ret );
\r
2204 for ( tsize = 0, a = 0 ; a < 16 ; a++ )
\r
2206 file = f_open( "ap.bin", "r" );
\r
2209 return _f_result( __LINE__, 0 );
\r
2212 ret = f_seek( file, tsize, F_SEEK_SET );
\r
2215 return _f_result( __LINE__, ret );
\r
2218 pos = (unsigned short)f_tell( file );
\r
2219 if ( pos != tsize )
\r
2221 return _f_result( __LINE__, pos );
\r
2224 size = (unsigned short)f_read( testbuffer, 1, a + 128, file );
\r
2225 if ( size != a + 128 )
\r
2227 return _f_result( __LINE__, size );
\r
2230 for ( b = 0 ; b < a + 128 ; b++ )
\r
2232 if ( testbuffer[b] != (char)a )
\r
2234 return _f_result( __LINE__, a );
\r
2240 pos = (unsigned short)f_tell( file );
\r
2241 if ( pos != tsize )
\r
2243 return _f_result( __LINE__, pos );
\r
2246 ret = f_close( file );
\r
2249 return _f_result( __LINE__, ret );
\r
2253 ret = f_close( file );
\r
2254 if ( ret != F_ERR_NOTOPEN )
\r
2256 return _f_result( __LINE__, ret );
\r
2259 ret = f_delete( "ap.bin" );
\r
2262 return _f_result( __LINE__, ret );
\r
2265 _f_dump( "passed..." );
\r
2267 } /* f_appending */
\r
2269 static unsigned char f_writing ( void )
\r
2272 unsigned short size;
\r
2273 unsigned char a, ret;
\r
2274 F_SPACE before, after;
\r
2276 _f_dump( "f_writing" );
\r
2278 ret = f_getfreespace( &before );
\r
2281 return _f_result( __LINE__, ret );
\r
2284 for ( a = 0 ; a < 4 ; a++ )
\r
2286 file = f_open( "wr.bin", "w" );
\r
2289 return _f_result( __LINE__, 0 );
\r
2292 psp_memset( testbuffer, a, sizeof( testbuffer ) );
\r
2293 size = (unsigned short)f_write( testbuffer, 1, a * 128, file );
\r
2294 if ( size != a * 128 )
\r
2296 return _f_result( __LINE__, size );
\r
2299 ret = f_close( file );
\r
2302 return _f_result( __LINE__, ret );
\r
2305 size = (unsigned short)f_filelength( "wr.bin" );
\r
2306 if ( size != a * 128 )
\r
2308 return _f_result( __LINE__, size );
\r
2311 file = f_open( "wr.bin", "r" );
\r
2314 return _f_result( __LINE__, 0 );
\r
2317 if ( checkfilecontent( a * 128, (char)a, file ) )
\r
2319 return _f_result( __LINE__, a );
\r
2322 ret = f_close( file );
\r
2325 return _f_result( __LINE__, ret );
\r
2330 for ( a = 0 ; a < 4 ; a++ )
\r
2332 file = f_open( "wr.bin", "w+" );
\r
2335 return _f_result( __LINE__, 0 );
\r
2338 psp_memset( testbuffer, a, sizeof( testbuffer ) );
\r
2339 size = (unsigned short)f_write( testbuffer, 1, a * 128, file );
\r
2340 if ( size != a * 128 )
\r
2342 return _f_result( __LINE__, size );
\r
2345 ret = f_close( file );
\r
2348 return _f_result( __LINE__, ret );
\r
2351 size = (unsigned short)f_filelength( "wr.bin" );
\r
2352 if ( size != a * 128 )
\r
2354 return _f_result( __LINE__, size );
\r
2357 file = f_open( "wr.bin", "r+" );
\r
2360 return _f_result( __LINE__, 0 );
\r
2363 if ( checkfilecontent( a * 128, (char)a, file ) )
\r
2365 return _f_result( __LINE__, a );
\r
2368 ret = f_close( file );
\r
2371 return _f_result( __LINE__, ret );
\r
2375 ret = f_getfreespace( &after );
\r
2378 return _f_result( __LINE__, ret );
\r
2381 if ( before.bad != after.bad )
\r
2383 return _f_result( __LINE__, 0 );
\r
2386 if ( before.free == after.free )
\r
2388 return _f_result( __LINE__, 0 );
\r
2391 if ( before.used == after.used )
\r
2393 return _f_result( __LINE__, 0 );
\r
2396 if ( before.total != after.total )
\r
2398 return _f_result( __LINE__, 0 );
\r
2401 if ( before.used + before.free != after.used + after.free )
\r
2403 return _f_result( __LINE__, 0 );
\r
2406 ret = f_delete( "wr.bin" );
\r
2409 return _f_result( __LINE__, ret );
\r
2412 ret = f_getfreespace( &after );
\r
2415 return _f_result( __LINE__, ret );
\r
2418 if ( before.bad != after.bad )
\r
2420 return _f_result( __LINE__, 0 );
\r
2423 if ( before.free != after.free )
\r
2425 return _f_result( __LINE__, 0 );
\r
2428 if ( before.used != after.used )
\r
2430 return _f_result( __LINE__, 0 );
\r
2433 if ( before.total != after.total )
\r
2435 return _f_result( __LINE__, 0 );
\r
2438 _f_dump( "passed..." );
\r
2442 static unsigned char f_dots ( void )
\r
2444 unsigned char ret;
\r
2445 unsigned char a, size;
\r
2448 _f_dump( "f_dots" );
\r
2450 ret = f_mkdir( "/tt" );
\r
2453 return _f_result( __LINE__, ret );
\r
2456 ret = f_chdir( "/tt" );
\r
2459 return _f_result( __LINE__, ret );
\r
2462 ret = f_rmdir( "." );
\r
2463 if ( ret != F_ERR_NOTFOUND )
\r
2465 return _f_result( __LINE__, ret );
\r
2468 ret = f_rmdir( ".." );
\r
2469 if ( ret != F_ERR_NOTFOUND )
\r
2471 return _f_result( __LINE__, ret );
\r
2474 ret = f_chdir( "." );
\r
2477 return _f_result( __LINE__, ret );
\r
2480 ret = _f_checkcwd( f_nameconv( "/tt" ) );
\r
2483 return _f_result( __LINE__, ret );
\r
2486 ret = f_delete( "." );
\r
2487 if ( ret != F_ERR_NOTFOUND )
\r
2489 return _f_result( __LINE__, ret );
\r
2492 ret = f_delete( ".." );
\r
2493 if ( ret != F_ERR_NOTFOUND )
\r
2495 return _f_result( __LINE__, ret );
\r
2498 ret = f_mkdir( "." );
\r
2499 if ( ret != F_ERR_NOTFOUND )
\r
2501 return _f_result( __LINE__, ret );
\r
2504 ret = f_mkdir( ".." );
\r
2505 if ( ret != F_ERR_NOTFOUND )
\r
2507 return _f_result( __LINE__, ret );
\r
2510 ret = f_mkdir( "..." );
\r
2511 if ( ret != F_ERR_NOTFOUND )
\r
2513 return _f_result( __LINE__, ret );
\r
2516 for ( a = 0 ; a < 6 ; a++ )
\r
2546 return _f_result( __LINE__, a );
\r
2549 file = f_open( ".", mode );
\r
2552 return _f_result( __LINE__, a );
\r
2555 file = f_open( "..", mode );
\r
2558 return _f_result( __LINE__, a );
\r
2561 file = f_open( "...", mode );
\r
2564 return _f_result( __LINE__, a );
\r
2568 size = (unsigned char)f_filelength( "." );
\r
2571 return _f_result( __LINE__, size );
\r
2574 size = (unsigned char)f_filelength( ".." );
\r
2577 return _f_result( __LINE__, size );
\r
2580 size = (unsigned char)f_filelength( "..." );
\r
2583 return _f_result( __LINE__, size );
\r
2587 ret = f_chdir( "..." );
\r
2588 if ( ret != F_ERR_NOTFOUND )
\r
2590 return _f_result( __LINE__, ret );
\r
2593 ret = f_chdir( ".." );
\r
2596 return _f_result( __LINE__, ret );
\r
2599 ret = f_rmdir( "tt" );
\r
2602 return _f_result( __LINE__, ret );
\r
2606 _f_dump( "passed..." );
\r
2613 unsigned char MagicNum;
\r
2614 unsigned char Line;
\r
2615 unsigned char Buf[87];
\r
2616 } struct_TestFileSysEntry;
\r
2617 #define NUM_OF_RECORDS 10
\r
2618 static unsigned char f_rit ( void )
\r
2621 unsigned char ret;
\r
2623 struct_TestFileSysEntry * Entry = (struct_TestFileSysEntry *)( ( ( (long)testbuffer + 3 ) >> 2 ) << 2 );
\r
2624 unsigned short Pos;
\r
2626 unsigned char Founded;
\r
2628 _f_dump( "f_rit" );
\r
2630 (void)f_delete( "MyTest" );
\r
2631 File = f_open( "MyTest", "a+" );
\r
2634 return _f_result( __LINE__, 0 );
\r
2638 for ( i = 0 ; i < NUM_OF_RECORDS ; i++ )
\r
2640 Ch = (char)( i % 10 );
\r
2641 Entry->MagicNum = 0xbc;
\r
2643 Entry->Buf[0] = Ch;
\r
2644 Entry->Buf[10] = (unsigned char)( Ch + 1 );
\r
2646 if ( F_NO_ERROR != f_seek( File, 0, F_SEEK_END ) )
\r
2648 return _f_result( __LINE__, 0 ); /* Fail, could not go to the end of the file */
\r
2651 if ( sizeof( struct_TestFileSysEntry ) != f_write( (void *)Entry, 1, sizeof( struct_TestFileSysEntry ), File ) )
\r
2653 return _f_result( __LINE__, 0 ); /* Fail, could not write new entry */
\r
2656 Pos = (unsigned short)f_tell( File );
\r
2657 if ( ( ( Pos / sizeof( struct_TestFileSysEntry ) ) - 1 ) != i )
\r
2659 return _f_result( __LINE__, 0 ); /* Fail, wrong file position */
\r
2662 if ( F_NO_ERROR != f_seek( File, (long)( Pos - sizeof( struct_TestFileSysEntry ) ), F_SEEK_SET ) )
\r
2664 return _f_result( __LINE__, 0 ); /* Fail, could not go to new entry position */
\r
2667 if ( sizeof( struct_TestFileSysEntry ) != f_read( (void *)Entry, 1, sizeof( struct_TestFileSysEntry ), File ) )
\r
2669 return _f_result( __LINE__, 0 ); /* Fail, could not read the new entry */
\r
2672 if ( ( Entry->MagicNum != 0xbc ) || ( Entry->Line != (int)i ) || ( Entry->Buf[0] != Ch ) || ( Entry->Buf[10] != Ch + 1 ) )
\r
2674 return _f_result( __LINE__, 0 ); /*Fail, the new entry is corrupted"*/
\r
2678 ret = f_close( File );
\r
2681 return _f_result( __LINE__, ret );
\r
2685 /*Open file again*/
\r
2686 File = f_open( "MyTest", "a+" );
\r
2689 return _f_result( __LINE__, 0 );
\r
2692 /* read records */
\r
2693 for ( i = 0 ; i < NUM_OF_RECORDS ; i++ )
\r
2695 Ch = (char)( i % 10 );
\r
2697 if ( F_NO_ERROR != f_seek( File, 0, F_SEEK_SET ) )
\r
2699 return _f_result( __LINE__, 0 ); /* Fail, could not go to the start of the file */
\r
2703 while ( sizeof( struct_TestFileSysEntry ) == f_read( (void *)Entry, 1, sizeof( struct_TestFileSysEntry ), File ) )
\r
2705 if ( ( Entry->MagicNum == 0xbc )
\r
2706 && ( Entry->Line == (int)i )
\r
2707 && ( Entry->Buf[0] == Ch )
\r
2708 && ( Entry->Buf[10] == Ch + 1 ) )
\r
2717 return _f_result( __LINE__, i ); /* Entry not founded */
\r
2721 ret = f_close( File );
\r
2724 return _f_result( __LINE__, ret );
\r
2728 ret = f_delete( "MyTest" );
\r
2731 return _f_result( __LINE__, ret );
\r
2734 _f_dump( "passed..." );
\r
2742 static unsigned char f_truncating ( void )
\r
2745 unsigned long size;
\r
2746 unsigned char ret;
\r
2748 _f_dump( "f_truncating" );
\r
2750 file = f_open( "test.bin", "w+" );
\r
2753 return _f_result( __LINE__, 0 );
\r
2756 (void)psp_memset( testbuffer, 1, F_MAX_SEEK_TEST );
\r
2757 size = (unsigned long)f_write( testbuffer, 1, F_MAX_SEEK_TEST, file );
\r
2758 if ( size != F_MAX_SEEK_TEST )
\r
2760 return _f_result( __LINE__, size );
\r
2763 ret = f_close( file );
\r
2766 return _f_result( __LINE__, ret );
\r
2769 file = f_truncate( "test.bin", F_MAX_SEEK_TEST - 4 );
\r
2772 return _f_result( __LINE__, 0 );
\r
2775 ret = f_close( file );
\r
2778 return _f_result( __LINE__, ret );
\r
2781 size = (unsigned long)f_filelength( "test.bin" );
\r
2782 if ( size != F_MAX_SEEK_TEST - 4 )
\r
2784 return _f_result( __LINE__, size );
\r
2788 file = f_truncate( "test.bin", F_MAX_SEEK_TEST );
\r
2791 return _f_result( __LINE__, 0 );
\r
2794 ret = f_close( file );
\r
2797 return _f_result( __LINE__, ret );
\r
2800 size = (unsigned long)f_filelength( "test.bin" );
\r
2801 if ( size != F_MAX_SEEK_TEST )
\r
2803 return _f_result( __LINE__, size );
\r
2807 file = f_truncate( "test.bin", ( F_MAX_SEEK_TEST / 2 ) - 92 );
\r
2810 return _f_result( __LINE__, 0 );
\r
2813 (void)psp_memset( testbuffer, 2, 92 );
\r
2814 size = (unsigned long)f_write( testbuffer, 1, 92, file );
\r
2817 return _f_result( __LINE__, size );
\r
2820 ret = f_close( file );
\r
2823 return _f_result( __LINE__, ret );
\r
2826 size = (unsigned long)f_filelength( "test.bin" );
\r
2827 if ( size != ( F_MAX_SEEK_TEST / 2 ) )
\r
2829 return _f_result( __LINE__, size );
\r
2833 file = f_truncate( "test.bin", 1 );
\r
2836 return _f_result( __LINE__, 0 );
\r
2839 (void)psp_memset( testbuffer, 3, 2 );
\r
2840 size = (unsigned long)f_write( testbuffer, 1, 2, file );
\r
2843 return _f_result( __LINE__, size );
\r
2846 ret = f_close( file );
\r
2849 return _f_result( __LINE__, ret );
\r
2852 size = (unsigned long)f_filelength( "test.bin" );
\r
2855 return _f_result( __LINE__, size );
\r
2860 _f_dump( "passed..." );
\r
2862 } /* f_truncating */
\r
2865 void f_dotest ( unsigned char t )
\r
2867 _f_dump( "File system test started..." );
\r
2868 _f_dump( "WARNING: The contents of your drive will be destroyed!\n" );
\r
2870 (void)_f_poweron();
\r
2876 (void)f_formatting();
\r
2883 /* fall through */
\r
2885 (void)f_dirtest();
\r
2892 /* fall through */
\r
2894 (void)f_findingtest();
\r
2901 /* fall through */
\r
2903 (void)f_powerfail();
\r
2910 /* fall through */
\r
2912 (void)f_seeking( 128 );
\r
2918 #if ( F_MAX_SEEK_TEST > 128 )
\r
2920 /* fall through */
\r
2922 (void)f_seeking( 256 );
\r
2929 #if ( F_MAX_SEEK_TEST > 256 )
\r
2931 /* fall through */
\r
2933 (void)f_seeking( 512 );
\r
2940 #if ( F_MAX_SEEK_TEST > 512 )
\r
2942 /* fall through */
\r
2944 (void)f_seeking( 1024 );
\r
2951 #if ( F_MAX_SEEK_TEST > 1024 )
\r
2953 /* fall through */
\r
2955 (void)f_seeking( 2048 );
\r
2962 #if ( F_MAX_SEEK_TEST > 2048 )
\r
2964 /* fall through */
\r
2966 (void)f_seeking( 4096 );
\r
2973 #if ( F_MAX_SEEK_TEST > 4096 )
\r
2975 /* fall through */
\r
2977 (void)f_seeking( 8192 );
\r
2984 #if ( F_MAX_SEEK_TEST > 8192 )
\r
2986 /* fall through */
\r
2988 (void)f_seeking( 16384 );
\r
2995 #if ( F_MAX_SEEK_TEST > 16384 )
\r
2997 /* fall through */
\r
2999 (void)f_seeking( 32768 );
\r
3007 /* fall through */
\r
3009 (void)f_opening();
\r
3016 /* fall through */
\r
3018 (void)f_appending();
\r
3025 /* fall through */
\r
3027 (void)f_writing();
\r
3034 /* fall through */
\r
3043 /* fall through */
\r
3052 (void)f_truncating();
\r
3061 _f_dump( "End of tests..." );
\r
3065 /****************************************************************************
\r
3069 ***************************************************************************/
\r