| /* | |
| * FreeRTOS+FAT SL V1.0.1 (C) 2014 HCC Embedded | |
| * | |
| * The FreeRTOS+FAT SL license terms are different to the FreeRTOS license | |
| * terms. | |
| * | |
| * FreeRTOS+FAT SL uses a dual license model that allows the software to be used | |
| * under a standard GPL open source license, or a commercial license. The | |
| * standard GPL license (unlike the modified GPL license under which FreeRTOS | |
| * itself is distributed) requires that all software statically linked with | |
| * FreeRTOS+FAT SL is also distributed under the same GPL V2 license terms. | |
| * Details of both license options follow: | |
| * | |
| * - Open source licensing - | |
| * FreeRTOS+FAT SL is a free download and may be used, modified, evaluated and | |
| * distributed without charge provided the user adheres to version two of the | |
| * GNU General Public License (GPL) and does not remove the copyright notice or | |
| * this text. The GPL V2 text is available on the gnu.org web site, and on the | |
| * following URL: http://www.FreeRTOS.org/gpl-2.0.txt. | |
| * | |
| * - Commercial licensing - | |
| * Businesses and individuals who for commercial or other reasons cannot comply | |
| * with the terms of the GPL V2 license must obtain a commercial license before | |
| * incorporating FreeRTOS+FAT SL into proprietary software for distribution in | |
| * any form. Commercial licenses can be purchased from | |
| * http://shop.freertos.org/fat_sl and do not require any source files to be | |
| * changed. | |
| * | |
| * FreeRTOS+FAT SL is distributed in the hope that it will be useful. You | |
| * cannot use FreeRTOS+FAT SL unless you agree that you use the software 'as | |
| * is'. FreeRTOS+FAT SL is provided WITHOUT ANY WARRANTY; without even the | |
| * implied warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A | |
| * PARTICULAR PURPOSE. Real Time Engineers Ltd. and HCC Embedded disclaims all | |
| * conditions and terms, be they implied, expressed, or statutory. | |
| * | |
| * http://www.FreeRTOS.org | |
| * http://www.FreeRTOS.org/FreeRTOS-Plus | |
| * | |
| */ | |
| #include "test.h" | |
| #include "../../api/fat_sl.h" | |
| #include "config_fat_sl_test.h" | |
| #include "../../psp/target/fat_sl/psp_test.h" | |
| #include "../../version/ver_fat_sl.h" | |
| #if VER_FAT_SL_MAJOR != 5 || VER_FAT_SL_MINOR != 2 | |
| #error Incompatible FAT_SL version number! | |
| #endif | |
| static char cwd[F_MAXPATH]; | |
| static F_FIND find; | |
| static void _f_deleteall ( void ) | |
| { | |
| F_FIND f2; | |
| unsigned char sd = 0, rc, fl = 0; | |
| f2 = find; | |
| do | |
| { | |
| rc = f_findfirst( "*.*", &find ); | |
| while ( rc == 0 && find.filename[0] == '.' ) | |
| { | |
| rc = f_findnext( &find ); | |
| } | |
| if ( rc == 0 ) | |
| { | |
| if ( find.attr & F_ATTR_DIR ) | |
| { | |
| ++sd; | |
| fl = 1; | |
| f2 = find; | |
| (void)f_chdir( find.filename ); | |
| continue; | |
| } | |
| else | |
| { | |
| (void)f_delete( find.filename ); | |
| rc = f_findnext( &find ); | |
| } | |
| } | |
| if ( rc && sd && fl ) | |
| { | |
| (void)f_chdir( ".." ); | |
| --sd; | |
| fl = 0; | |
| find = f2; | |
| (void)f_rmdir( find.filename ); | |
| rc = f_findnext( &find ); | |
| } | |
| if ( rc && sd && !fl ) | |
| { | |
| (void)f_chdir( "/" ); | |
| sd = 0; | |
| rc = 0; | |
| } | |
| } | |
| while ( rc == 0 ); | |
| } /* _f_deleteall */ | |
| char stmp[20]; | |
| static char * f_nameconv ( char * s ) | |
| { | |
| char * ss = stmp; | |
| for ( ; ; ) | |
| { | |
| char ch = *s++; | |
| if ( ( ch >= 'a' ) && ( ch <= 'z' ) ) | |
| { | |
| ch += 'A' - 'a'; | |
| } | |
| *ss++ = ch; | |
| if ( !ch ) | |
| { | |
| break; | |
| } | |
| } | |
| return stmp; | |
| } /* f_nameconv */ | |
| static unsigned char f_formatting ( void ) | |
| { | |
| unsigned char ret; | |
| _f_dump( "f_formatting" ); | |
| /*checking formatting*/ | |
| ret = f_format( F_FAT_TYPE ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = _f_poweron(); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "*.*", &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| _f_dump( "passed..." ); | |
| return 0; | |
| } /* f_formatting */ | |
| static unsigned char _f_checkcwd ( char * orig ) | |
| { | |
| unsigned char ret; | |
| ret = f_getcwd( cwd, F_MAXPATH ); | |
| if ( ret ) | |
| { | |
| return ret; | |
| } | |
| if ( strcmp( orig, cwd ) ) | |
| { | |
| return (unsigned char)-1; | |
| } | |
| return 0; | |
| } | |
| static unsigned char f_dirtest ( void ) | |
| { | |
| unsigned char ret; | |
| _f_dump( "f_dirtest" ); | |
| _f_deleteall(); | |
| /*creates a ab abc abcd*/ | |
| ret = f_mkdir( "a" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_mkdir( "ab" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_mkdir( "abc" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_mkdir( "abca" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*creates directories in /a - a ab abc abcd*/ | |
| ret = f_mkdir( "a/a" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_mkdir( "a/ab" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_mkdir( "a/abc" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_mkdir( "a/abcd" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*change into a/abcd and check cwd*/ | |
| ret = f_chdir( "a/abcd" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = _f_checkcwd( f_nameconv( "/a/abcd" ) ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*make directory t change into t and check cwd="a/abcd/t"*/ | |
| ret = f_mkdir( "t" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( "t" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = _f_checkcwd( f_nameconv( "/a/abcd/t" ) ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( "." ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = _f_checkcwd( f_nameconv( "/a/abcd/t" ) ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( "../." ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = _f_checkcwd( f_nameconv( "/a/abcd" ) ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*removing t dir*/ | |
| ret = f_rmdir( "t" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( "t" ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*removing /a dir*/ | |
| ret = f_rmdir( "/ab" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( "/ab" ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*removing /a dir*/ | |
| ret = f_rmdir( "../../a" ); | |
| if ( ret != F_ERR_NOTEMPTY ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*removing /abca dir*/ | |
| ret = f_rmdir( "a:/abca" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*changing invalid dirs*/ | |
| ret = f_chdir( "" ); | |
| if ( ret != F_ERR_INVALIDNAME ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( " " ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = _f_checkcwd( f_nameconv( "/a/abcd" ) ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( "?" ); | |
| if ( ret != F_ERR_INVALIDNAME ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( "*.*" ); | |
| if ( ret != F_ERR_INVALIDNAME ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = _f_checkcwd( f_nameconv( "/a/abcd" ) ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*changing into /abc and removes subfolder from /a/ */ | |
| ret = f_chdir( "/abc" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_rmdir( "/a/a" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_rmdir( "A:../a/ab" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_rmdir( "A:/a/abc" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_rmdir( ".././abc/.././a/../a/abcd" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*some invalid rmdir*/ | |
| ret = f_rmdir( "." ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_rmdir( ".." ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*create again abc remove abc*/ | |
| ret = f_mkdir( ".././abc" ); | |
| if ( ret != F_ERR_DUPLICATED ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_rmdir( "../abc" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_mkdir( ".././abc" ); | |
| if ( ret != F_ERR_INVALIDDIR ) | |
| { | |
| return _f_result( __LINE__, ret ); /*cwd is not exist*/ | |
| } | |
| ret = f_chdir( "/" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*try . and .. in the root*/ | |
| ret = f_chdir( "." ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( "./././." ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( ".." ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = _f_checkcwd( "/" ); /*root!*/ | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*test . and .. in a and remove a*/ | |
| ret = f_chdir( "a" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( ".." ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( "a" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( "." ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( "a" ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( "./.." ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_rmdir( "a" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*check if all are removed*/ | |
| ret = f_findfirst( "*.*", &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| _f_dump( "passed..." ); | |
| return 0; | |
| } /* f_dirtest */ | |
| static unsigned char f_findingtest ( void ) | |
| { | |
| unsigned char ret; | |
| _f_dump( "f_findingtest" ); | |
| _f_deleteall(); | |
| /*check empty*/ | |
| ret = f_findfirst( "*.*", &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*create Hello.dir*/ | |
| ret = f_mkdir( "Hello.dir" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*check if it is exist, and only exist*/ | |
| ret = f_findfirst( "*.*", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( strcmp( find.filename, f_nameconv( "Hello.dir" ) ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( find.attr != F_ATTR_DIR ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_findnext( &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*check some not founds*/ | |
| ret = f_findfirst( "q*.*", &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "Hello.", &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "a/*.*", &find ); | |
| if ( ret != F_ERR_INVALIDDIR ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( ".", &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "..", &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "?e.*", &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "*.", &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "*.?", &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "*.??", &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*check some founds*/ | |
| ret = f_findfirst( "*.dir", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "*.d?r", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "*.d??", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "*.???", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "?ello.???", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "he??o.dir", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "he?*.dir", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "HELLO.DIR", &find ); /*no capitals sensitivity in find!!*/ | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*change into hello.dir*/ | |
| ret = f_chdir( "hello.dir" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "*.*", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "..", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "??", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( ".", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "k*.*", &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "*.", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( strcmp( find.filename, "." ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_findnext( &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( strcmp( find.filename, ".." ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_findnext( &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "*.a", &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*creating testdir and find it*/ | |
| ret = f_mkdir( "testdir" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "*.", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( strcmp( find.filename, "." ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_findnext( &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( strcmp( find.filename, ".." ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_findnext( &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( strcmp( find.filename, f_nameconv( "testdir" ) ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_findfirst( "*.*", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( strcmp( find.filename, "." ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_findnext( &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( strcmp( find.filename, ".." ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_findnext( &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( strcmp( find.filename, f_nameconv( "testdir" ) ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_findnext( &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*search exact file*/ | |
| ret = f_findfirst( "testDir", &find ); /*no capitals!*/ | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( strcmp( find.filename, f_nameconv( "testdir" ) ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_findnext( &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*go back to root and remove dirs*/ | |
| ret = f_chdir( "\\" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_rmdir( "Hello.dir/testdir" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_rmdir( "Hello.dir" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*check if all are removed*/ | |
| ret = f_findfirst( "*.*", &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| _f_dump( "passed..." ); | |
| return 0; | |
| } /* f_findingtest */ | |
| static unsigned char f_powerfail ( void ) | |
| { | |
| unsigned char ret; | |
| _f_dump( "f_powerfail" ); | |
| /*checking if its power fail system (RAMDRIVE is not powerfail!)*/ | |
| ret = f_mkdir( "testdir" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = _f_poweron(); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "testdir", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*checking formatting*/ | |
| ret = f_format( F_FAT_TYPE ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = _f_poweron(); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "*.*", &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*checking formatting, 1st creating*/ | |
| ret = f_format( F_FAT_TYPE ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_mkdir( "testdir" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "testdir", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( strcmp( find.filename, f_nameconv( "testdir" ) ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = _f_poweron(); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "*.*", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( strcmp( find.filename, f_nameconv( "testdir" ) ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| /*checking formatting, 2nd creating*/ | |
| ret = f_format( F_FAT_TYPE ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_mkdir( "testdir" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "testdir", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( strcmp( find.filename, f_nameconv( "testdir" ) ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_mkdir( "testdir2" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "testdir2", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( strcmp( find.filename, f_nameconv( "testdir2" ) ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = _f_poweron(); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "*.*", &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( strcmp( find.filename, f_nameconv( "testdir" ) ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_findnext( &find ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( strcmp( find.filename, f_nameconv( "testdir2" ) ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_findnext( &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*checking empty*/ | |
| ret = _f_poweron(); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_format( F_FAT_TYPE ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = _f_poweron(); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_findfirst( "*.*", &find ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| _f_dump( "passed..." ); | |
| return 0; | |
| } /* f_powerfail */ | |
| char testbuffer[F_MAX_SEEK_TEST + 16]; /* +16 for f_appending test */ | |
| static unsigned char checkfilecontent ( long nums, unsigned char value, F_FILE * file ) | |
| { | |
| unsigned char ch; | |
| while ( nums-- ) | |
| { | |
| if ( f_eof( file ) ) | |
| { | |
| return 1; /*eof ?*/ | |
| } | |
| if ( 1 != f_read( &ch, 1, 1, file ) ) | |
| { | |
| return 1; | |
| } | |
| if ( ch != value ) | |
| { | |
| return 1; | |
| } | |
| } | |
| return 0; | |
| } /* checkfilecontent */ | |
| static unsigned char f_seeking ( int sectorsize ) | |
| { | |
| F_FILE * file; | |
| unsigned char ret; | |
| unsigned long size; | |
| unsigned long pos; | |
| unsigned long fname_pos; | |
| char * test_fname[4] = | |
| { | |
| "test1.txt", "test2.txt", "test3.txt", "test4.txt" | |
| }; | |
| if ( sectorsize == 128 ) | |
| { | |
| _f_dump( "f_seeking with 128" ); | |
| } | |
| #if ( F_MAX_SEEK_TEST > 128 ) | |
| else if ( sectorsize == 256 ) | |
| { | |
| _f_dump( "f_seeking with 256" ); | |
| } | |
| #endif | |
| #if ( F_MAX_SEEK_TEST > 256 ) | |
| else if ( sectorsize == 512 ) | |
| { | |
| _f_dump( "f_seeking with 512" ); | |
| } | |
| #endif | |
| #if ( F_MAX_SEEK_TEST > 512 ) | |
| else if ( sectorsize == 1024 ) | |
| { | |
| _f_dump( "f_seeking with 1024" ); | |
| } | |
| #endif | |
| #if ( F_MAX_SEEK_TEST > 1024 ) | |
| else if ( sectorsize == 2048 ) | |
| { | |
| _f_dump( "f_seeking with 2048" ); | |
| } | |
| #endif | |
| #if ( F_MAX_SEEK_TEST > 2048 ) | |
| else if ( sectorsize == 4096 ) | |
| { | |
| _f_dump( "f_seeking with 4096" ); | |
| } | |
| #endif | |
| #if ( F_MAX_SEEK_TEST > 4096 ) | |
| else if ( sectorsize == 8192 ) | |
| { | |
| _f_dump( "f_seeking with 8192" ); | |
| } | |
| #endif | |
| #if ( F_MAX_SEEK_TEST > 8192 ) | |
| else if ( sectorsize == 16384 ) | |
| { | |
| _f_dump( "f_seeking with 16384" ); | |
| } | |
| #endif | |
| #if ( F_MAX_SEEK_TEST > 16384 ) | |
| else if ( sectorsize == 32768 ) | |
| { | |
| _f_dump( "f_seeking with 32768" ); | |
| } | |
| #endif | |
| else | |
| { | |
| _f_dump( "f_seeking with random" ); | |
| } | |
| /*checking sector boundary seekeng*/ | |
| file = f_open( "test.bin", "w+" ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| /*write sectorsize times 0*/ | |
| psp_memset( testbuffer, 0, sectorsize ); | |
| size = (unsigned long)f_write( testbuffer, 1, (long)sectorsize, file ); | |
| if ( size != (unsigned long)sectorsize ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != (unsigned long)sectorsize ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*seek back and read some*/ | |
| ret = f_seek( file, 0, F_SEEK_SET ); /*seek back*/ | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| size = (unsigned long)f_read( testbuffer, 1, sectorsize, file ); | |
| if ( size != (unsigned long)sectorsize ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != (unsigned long)sectorsize ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*fake read at eof*/ | |
| size = (unsigned long)f_read( testbuffer, 1, 2, file ); /*eof!*/ | |
| if ( size != 0 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != (unsigned long)sectorsize ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*writing sectorsize times 1 at the end*/ | |
| psp_memset( testbuffer, 1, sectorsize ); | |
| size = (unsigned long)f_write( testbuffer, 1, sectorsize, file ); | |
| if ( size != (unsigned long)sectorsize ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != (unsigned long)( sectorsize * 2 ) ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*seeking back and read 1byte less*/ | |
| ret = f_seek( file, 0, F_SEEK_SET ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| size = (unsigned long)f_read( testbuffer, 1, sectorsize - 1, file ); | |
| if ( size != (unsigned long)( sectorsize - 1 ) ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != (unsigned long)( sectorsize - 1 ) ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*write 2 times 2*/ | |
| psp_memset( testbuffer, 2, sectorsize ); | |
| size = (unsigned long)f_write( testbuffer, 1, 2, file ); | |
| if ( size != 2 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != (unsigned long)( sectorsize + 1 ) ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*read 2 bytes*/ | |
| size = (unsigned long)f_read( testbuffer, 2, 1, file ); | |
| if ( size != 1 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != (unsigned long)( sectorsize + 3 ) ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*write 4 times 3*/ | |
| psp_memset( testbuffer, 3, sectorsize ); | |
| size = (unsigned long)f_write( testbuffer, 1, 4, file ); | |
| if ( size != 4 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != (unsigned long)( sectorsize + 3 + 4 ) ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*seek at 2*/ | |
| ret = f_seek( file, 2, F_SEEK_SET ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != 2 ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*write 6 times 4*/ | |
| psp_memset( testbuffer, 4, sectorsize ); | |
| size = (unsigned long)f_write( testbuffer, 1, 6, file ); | |
| if ( size != 6 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != 8 ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*seek end -4*/ | |
| ret = f_seek( file, -4, F_SEEK_END ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != (unsigned long)( 2 * sectorsize - 4 ) ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*read 2 bytes*/ | |
| size = (unsigned long)f_read( testbuffer, 1, 2, file ); | |
| if ( size != 2 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != (unsigned long)( 2 * sectorsize - 2 ) ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*write 8 times 5*/ | |
| psp_memset( testbuffer, 5, sectorsize ); | |
| size = (unsigned long)f_write( testbuffer, 1, 8, file ); | |
| if ( size != 8 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != (unsigned long)( 2 * sectorsize + 6 ) ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*seek to the begining*/ | |
| ret = f_seek( file, 0, F_SEEK_SET ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*seek to the end*/ | |
| ret = f_seek( file, 2 * sectorsize + 6, F_SEEK_SET ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != (unsigned long)( 2 * sectorsize + 6 ) ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*write 2 times 6*/ | |
| psp_memset( testbuffer, 6, sectorsize ); | |
| size = (unsigned long)f_write( testbuffer, 1, 2, file ); | |
| if ( size != 2 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != (unsigned long)( 2 * sectorsize + 8 ) ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*seek to the begining*/ | |
| (void)f_seek( file, -( 2 * sectorsize + 8 ), F_SEEK_CUR ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*read 2 times sector*/ | |
| size = (unsigned long)f_read( testbuffer, 1, sectorsize, file ); | |
| if ( size != (unsigned long)sectorsize ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != (unsigned long)sectorsize ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| size = (unsigned long)f_read( testbuffer, 1, sectorsize, file ); | |
| if ( size != (unsigned long)sectorsize ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != (unsigned long)( 2 * sectorsize ) ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*write 1 once 7*/ | |
| psp_memset( testbuffer, 7, sectorsize ); | |
| size = (unsigned long)f_write( testbuffer, 1, 1, file ); | |
| if ( size != 1 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != (unsigned long)( 2 * sectorsize + 1 ) ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*close it*/ | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*check the result*/ | |
| size = (unsigned long)f_filelength( "test.bin" ); | |
| if ( size != (unsigned long)( 2 * sectorsize + 8 ) ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| /*opens it*/ | |
| file = f_open( "test.bin", "r" ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| if ( checkfilecontent( 2, 0, file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( 6, 4, file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( sectorsize - 8 - 1, 0, file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( 2, 2, file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( 2, 1, file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( 4, 3, file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( sectorsize - 7 - 2, 1, file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( 2, 5, file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( 1, 7, file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( 5, 5, file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( 2, 6, file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| /*check pos result*/ | |
| pos = (unsigned long)f_tell( file ); | |
| if ( pos != (unsigned long)( 2 * sectorsize + 8 ) ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*this has to be eof*/ | |
| pos = f_eof( file ); | |
| if ( !pos ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| /*close it*/ | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*deletes it*/ | |
| ret = f_delete( "test.bin" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /**************************************************************/ | |
| for ( pos = 0 ; pos < 4 ; pos++ ) | |
| { | |
| file = f_open( test_fname[pos], "w" ); | |
| if ( file == NULL ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| memset( testbuffer, '0' + pos, sectorsize ); | |
| if ( f_write( testbuffer, 1, sectorsize - 1, file ) != ( sectorsize - 1 ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| } | |
| ret = f_delete( test_fname[0] ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_delete( test_fname[2] ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| file = f_open( "test.txt", "w" ); | |
| if ( file == NULL ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| memset( testbuffer, 'a', sectorsize ); | |
| if ( f_write( testbuffer, 1, sectorsize, file ) != sectorsize ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| file = f_open( "test.txt", "r+" ); | |
| if ( file == NULL ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_seek( file, 2 * sectorsize, F_SEEK_SET ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| for ( pos = 0 ; pos < 2 ; pos++ ) | |
| { | |
| file = f_open( "test.txt", "r+" ); | |
| if ( file == NULL ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_seek( file, ( pos + 2 ) * sectorsize, F_SEEK_SET ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| memset( testbuffer, 'b' + pos, sectorsize ); | |
| if ( f_write( testbuffer, 1, sectorsize, file ) != sectorsize ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| } | |
| fname_pos = 1; | |
| for ( pos = 0 ; pos < 2 ; pos++ ) | |
| { | |
| file = f_open( test_fname[fname_pos], "r" ); | |
| if ( file == NULL ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( sectorsize - 1, '0' + ( unsigned char ) fname_pos, file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| fname_pos = 3; | |
| } | |
| file = f_open( "test.txt", "r" ); | |
| if ( file == NULL ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( sectorsize, 'a', file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( sectorsize, 0, file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( sectorsize, 'b', file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( sectorsize, 'c', file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_delete( "test.txt" ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /************************************/ | |
| file = f_open( "test.txt", "w" ); | |
| if ( file == NULL ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_seek( file, sectorsize - 2, F_SEEK_SET ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| file = f_open( "test.txt", "r+" ); | |
| if ( file == NULL ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| memset( testbuffer, 'f', 2 ); | |
| if ( f_write( testbuffer, 1, 2, file ) != 2 ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_seek( file, sectorsize - 2, F_SEEK_SET ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| memset( testbuffer, 'g', 3 ); | |
| if ( f_write( testbuffer, 1, 3, file ) != 3 ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| file = f_open( "test.txt", "r+" ); | |
| if ( file == NULL ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_seek( file, sectorsize * 2, F_SEEK_SET ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| memset( testbuffer, 'h', sectorsize ); | |
| if ( f_write( testbuffer, 1, sectorsize, file ) != sectorsize ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| size = f_filelength( "test.txt" ); | |
| if ( size != ( unsigned long ) ( 3 * sectorsize ) ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| fname_pos = 1; | |
| for ( pos = 0 ; pos < 2 ; pos++ ) | |
| { | |
| file = f_open( test_fname[fname_pos], "r" ); | |
| if ( file == NULL ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( sectorsize - 1, '0' + ( unsigned char ) fname_pos, file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| fname_pos = 3; | |
| } | |
| file = f_open( "test.txt", "r" ); | |
| if ( file == NULL ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( 2, 'f', file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( sectorsize - 4, 0, file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( 3, 'g', file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( sectorsize - 1, 0, file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( sectorsize, 'h', file ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_delete( "test.txt" ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_delete( test_fname[1] ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_delete( test_fname[3] ); | |
| if ( ret != F_NO_ERROR ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| _f_dump( "passed..." ); | |
| return 0; | |
| } /* f_seeking */ | |
| static unsigned char f_opening ( void ) | |
| { | |
| F_FILE * file; | |
| F_FILE * file2; | |
| unsigned char ret; | |
| unsigned short size, pos; | |
| _f_dump( "f_opening" ); | |
| /*test non existing file open r, r+*/ | |
| file = f_open( "file.bin", "r" ); | |
| if ( file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| file = f_open( "file.bin", "r+" ); | |
| if ( file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| /*test non existing appends "a" a+*/ | |
| file = f_open( "file.bin", "a" ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| file2 = f_open( "file.bin", "a+" ); /*open again*/ | |
| if ( file2 ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, 1 ); | |
| } | |
| ret = f_close( file2 ); | |
| if ( ret != F_ERR_NOTOPEN ) | |
| { | |
| return _f_result( __LINE__, 2 ); | |
| } | |
| /*try to creates it w*/ | |
| file = f_open( "file.bin", "w" ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| /*write 512 times 1*/ | |
| psp_memset( testbuffer, 1, 512 ); /*set all 1*/ | |
| size = (unsigned short)f_write( testbuffer, 1, 512, file ); /*test write*/ | |
| if ( size != 512 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| /*go back, and read it*/ | |
| ret = f_rewind( file ); /*back to the begining*/ | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); /*it should fail*/ | |
| } | |
| size = (unsigned short)f_read( testbuffer, 1, 512, file ); /*test read*/ | |
| if ( size ) | |
| { | |
| return _f_result( __LINE__, size ); /*it should fail*/ | |
| } | |
| /*close and check size*/ | |
| size = (unsigned short)f_filelength( "file.bin" ); | |
| if ( size ) | |
| { | |
| return _f_result( __LINE__, size ); /*has to be zero*/ | |
| } | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| size = (unsigned short)f_filelength( "file.bin" ); | |
| if ( size != 512 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| /*try to owerwrites it it*/ | |
| file = f_open( "file.bin", "w+" ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| /*close and check size*/ | |
| size = (unsigned short)f_filelength( "file.bin" ); | |
| if ( size ) | |
| { | |
| return _f_result( __LINE__, size ); /*has to be zero*/ | |
| } | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| size = (unsigned short)f_filelength( "file.bin" ); | |
| if ( size ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| /*test non existing appends "a" */ | |
| file = f_open( "file.bin", "r+" ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| /*write 512 times 1*/ | |
| psp_memset( testbuffer, 1, 512 ); /*set all 1*/ | |
| size = (unsigned short)f_write( testbuffer, 1, 512, file ); /*test write*/ | |
| if ( size != 512 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| /*go back, and read it*/ | |
| ret = f_rewind( file ); /*back to the begining*/ | |
| size = (unsigned short)f_read( testbuffer, 1, 512, file ); /*test read*/ | |
| if ( size != 512 ) | |
| { | |
| return _f_result( __LINE__, size ); /*it should fail*/ | |
| } | |
| ret = f_rewind( file ); /*back to the begining*/ | |
| /*write 256 times 2*/ | |
| psp_memset( testbuffer, 2, 512 ); /*set all 2*/ | |
| size = (unsigned short)f_write( testbuffer, 1, 256, file ); /*test write*/ | |
| if ( size != 256 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| pos = (unsigned short)f_tell( file ); | |
| if ( pos != 256 ) | |
| { | |
| return _f_result( __LINE__, pos ); /*position has to be 512*/ | |
| } | |
| size = (unsigned short)f_filelength( "file.bin" ); | |
| if ( size ) | |
| { | |
| return _f_result( __LINE__, size ); /*has to be zero*/ | |
| } | |
| /*close and check size*/ | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| size = (unsigned short)f_filelength( "file.bin" ); | |
| if ( size != 512 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| /*test non existing appends a+*/ | |
| file = f_open( "file.bin", "a+" ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| pos = (unsigned short)f_tell( file ); | |
| if ( pos != 512 ) | |
| { | |
| return _f_result( __LINE__, pos ); /*position has to be 512*/ | |
| } | |
| /*write 512 times 3*/ | |
| psp_memset( testbuffer, 3, 512 ); /*set all 3*/ | |
| size = (unsigned short)f_write( testbuffer, 1, 512, file ); /*test write*/ | |
| if ( size != 512 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| /*go back, and read it*/ | |
| ret = f_rewind( file ); /*back to the begining*/ | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); /*it should fail*/ | |
| } | |
| size = (unsigned short)f_read( testbuffer, 1, 512, file ); /*test read*/ | |
| if ( size != 512 ) | |
| { | |
| return _f_result( __LINE__, size ); /*it should fail*/ | |
| } | |
| pos = (unsigned short)f_tell( file ); | |
| if ( pos != 512 ) | |
| { | |
| return _f_result( __LINE__, pos ); /*position has to be 512*/ | |
| } | |
| /*close and check size*/ | |
| size = (unsigned short)f_filelength( "file.bin" ); | |
| if ( size != 512 ) | |
| { | |
| return _f_result( __LINE__, size ); /*has to be zero*/ | |
| } | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| size = (unsigned short)f_filelength( "file.bin" ); | |
| if ( size != 1024 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| /*close again!*/ | |
| ret = f_close( file ); | |
| if ( ret != F_ERR_NOTOPEN ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| ret = f_delete( "file.bin" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| _f_dump( "passed..." ); | |
| return 0; | |
| } /* f_opening */ | |
| static unsigned char f_appending ( void ) | |
| { | |
| F_FILE * file; | |
| unsigned short size, tsize, pos; | |
| unsigned char a, b, ret; | |
| _f_dump( "f_appending" ); | |
| _f_deleteall(); | |
| for ( tsize = 0, a = 0 ; a < 16 ; a++ ) | |
| { | |
| file = f_open( "ap.bin", "a" ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| psp_memset( testbuffer, a, sizeof( testbuffer ) ); | |
| size = (unsigned short)f_write( testbuffer, 1, a + 128, file ); | |
| if ( size != a + 128 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| size = (unsigned short)f_filelength( "ap.bin" ); | |
| if ( size != tsize ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| tsize += a + 128; | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| size = (unsigned short)f_filelength( "ap.bin" ); | |
| if ( size != tsize ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| } | |
| file = f_open( "ap.bin", "r" ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| for ( tsize = 0, a = 0 ; a < 16 ; a++ ) | |
| { | |
| if ( checkfilecontent( a + 128, (char)a, file ) ) | |
| { | |
| return _f_result( __LINE__, a ); | |
| } | |
| } | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| for ( tsize = 0, a = 0 ; a < 16 ; a++ ) | |
| { | |
| file = f_open( "ap.bin", "r" ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_seek( file, tsize, F_SEEK_SET ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| pos = (unsigned short)f_tell( file ); | |
| if ( pos != tsize ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| size = (unsigned short)f_read( testbuffer, 1, a + 128, file ); | |
| if ( size != a + 128 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| for ( b = 0 ; b < a + 128 ; b++ ) | |
| { | |
| if ( testbuffer[b] != (char)a ) | |
| { | |
| return _f_result( __LINE__, a ); | |
| } | |
| } | |
| tsize += a + 128; | |
| pos = (unsigned short)f_tell( file ); | |
| if ( pos != tsize ) | |
| { | |
| return _f_result( __LINE__, pos ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| } | |
| ret = f_close( file ); | |
| if ( ret != F_ERR_NOTOPEN ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_delete( "ap.bin" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| _f_dump( "passed..." ); | |
| return 0; | |
| } /* f_appending */ | |
| static unsigned char f_writing ( void ) | |
| { | |
| F_FILE * file; | |
| unsigned short size; | |
| unsigned char a, ret; | |
| F_SPACE before, after; | |
| _f_dump( "f_writing" ); | |
| ret = f_getfreespace( &before ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| for ( a = 0 ; a < 4 ; a++ ) | |
| { | |
| file = f_open( "wr.bin", "w" ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| psp_memset( testbuffer, a, sizeof( testbuffer ) ); | |
| size = (unsigned short)f_write( testbuffer, 1, a * 128, file ); | |
| if ( size != a * 128 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| size = (unsigned short)f_filelength( "wr.bin" ); | |
| if ( size != a * 128 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| file = f_open( "wr.bin", "r" ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( a * 128, (char)a, file ) ) | |
| { | |
| return _f_result( __LINE__, a ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| } | |
| for ( a = 0 ; a < 4 ; a++ ) | |
| { | |
| file = f_open( "wr.bin", "w+" ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| psp_memset( testbuffer, a, sizeof( testbuffer ) ); | |
| size = (unsigned short)f_write( testbuffer, 1, a * 128, file ); | |
| if ( size != a * 128 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| size = (unsigned short)f_filelength( "wr.bin" ); | |
| if ( size != a * 128 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| file = f_open( "wr.bin", "r+" ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( checkfilecontent( a * 128, (char)a, file ) ) | |
| { | |
| return _f_result( __LINE__, a ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| } | |
| ret = f_getfreespace( &after ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( before.bad != after.bad ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( before.free == after.free ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( before.used == after.used ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( before.total != after.total ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( before.used + before.free != after.used + after.free ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_delete( "wr.bin" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_getfreespace( &after ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| if ( before.bad != after.bad ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( before.free != after.free ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( before.used != after.used ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| if ( before.total != after.total ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| _f_dump( "passed..." ); | |
| return 0; | |
| } /* f_writing */ | |
| static unsigned char f_dots ( void ) | |
| { | |
| unsigned char ret; | |
| unsigned char a, size; | |
| F_FILE * file; | |
| _f_dump( "f_dots" ); | |
| ret = f_mkdir( "/tt" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( "/tt" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_rmdir( "." ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_rmdir( ".." ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( "." ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = _f_checkcwd( f_nameconv( "/tt" ) ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_delete( "." ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_delete( ".." ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_mkdir( "." ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_mkdir( ".." ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_mkdir( "..." ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| for ( a = 0 ; a < 6 ; a++ ) | |
| { | |
| char * mode; | |
| switch ( a ) | |
| { | |
| case 0: | |
| mode = "r"; | |
| break; | |
| case 1: | |
| mode = "r+"; | |
| break; | |
| case 2: | |
| mode = "w"; | |
| break; | |
| case 3: | |
| mode = "w+"; | |
| break; | |
| case 4: | |
| mode = "a"; | |
| break; | |
| case 5: | |
| mode = "a+"; | |
| break; | |
| default: | |
| return _f_result( __LINE__, a ); | |
| } /* switch */ | |
| file = f_open( ".", mode ); | |
| if ( file ) | |
| { | |
| return _f_result( __LINE__, a ); | |
| } | |
| file = f_open( "..", mode ); | |
| if ( file ) | |
| { | |
| return _f_result( __LINE__, a ); | |
| } | |
| file = f_open( "...", mode ); | |
| if ( file ) | |
| { | |
| return _f_result( __LINE__, a ); | |
| } | |
| } | |
| size = (unsigned char)f_filelength( "." ); | |
| if ( size ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| size = (unsigned char)f_filelength( ".." ); | |
| if ( size ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| size = (unsigned char)f_filelength( "..." ); | |
| if ( size ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| ret = f_chdir( "..." ); | |
| if ( ret != F_ERR_NOTFOUND ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_chdir( ".." ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_rmdir( "tt" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| _f_dump( "passed..." ); | |
| return 0; | |
| } /* f_dots */ | |
| typedef struct | |
| { | |
| unsigned char MagicNum; | |
| unsigned char Line; | |
| unsigned char Buf[87]; | |
| } struct_TestFileSysEntry; | |
| #define NUM_OF_RECORDS 10 | |
| static unsigned char f_rit ( void ) | |
| { | |
| unsigned char i; | |
| unsigned char ret; | |
| F_FILE * File; | |
| struct_TestFileSysEntry * Entry = (struct_TestFileSysEntry *)( ( ( (long)testbuffer + 3 ) >> 2 ) << 2 ); | |
| unsigned short Pos; | |
| unsigned char Ch; | |
| unsigned char Founded; | |
| _f_dump( "f_rit" ); | |
| (void)f_delete( "MyTest" ); | |
| File = f_open( "MyTest", "a+" ); | |
| if ( !File ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| /* add records */ | |
| for ( i = 0 ; i < NUM_OF_RECORDS ; i++ ) | |
| { | |
| Ch = (char)( i % 10 ); | |
| Entry->MagicNum = 0xbc; | |
| Entry->Line = i; | |
| Entry->Buf[0] = Ch; | |
| Entry->Buf[10] = (unsigned char)( Ch + 1 ); | |
| if ( F_NO_ERROR != f_seek( File, 0, F_SEEK_END ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); /* Fail, could not go to the end of the file */ | |
| } | |
| if ( sizeof( struct_TestFileSysEntry ) != f_write( (void *)Entry, 1, sizeof( struct_TestFileSysEntry ), File ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); /* Fail, could not write new entry */ | |
| } | |
| Pos = (unsigned short)f_tell( File ); | |
| if ( ( ( Pos / sizeof( struct_TestFileSysEntry ) ) - 1 ) != i ) | |
| { | |
| return _f_result( __LINE__, 0 ); /* Fail, wrong file position */ | |
| } | |
| if ( F_NO_ERROR != f_seek( File, (long)( Pos - sizeof( struct_TestFileSysEntry ) ), F_SEEK_SET ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); /* Fail, could not go to new entry position */ | |
| } | |
| if ( sizeof( struct_TestFileSysEntry ) != f_read( (void *)Entry, 1, sizeof( struct_TestFileSysEntry ), File ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); /* Fail, could not read the new entry */ | |
| } | |
| if ( ( Entry->MagicNum != 0xbc ) || ( Entry->Line != (int)i ) || ( Entry->Buf[0] != Ch ) || ( Entry->Buf[10] != Ch + 1 ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); /*Fail, the new entry is corrupted"*/ | |
| } | |
| } | |
| ret = f_close( File ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| /*Open file again*/ | |
| File = f_open( "MyTest", "a+" ); | |
| if ( !File ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| /* read records */ | |
| for ( i = 0 ; i < NUM_OF_RECORDS ; i++ ) | |
| { | |
| Ch = (char)( i % 10 ); | |
| if ( F_NO_ERROR != f_seek( File, 0, F_SEEK_SET ) ) | |
| { | |
| return _f_result( __LINE__, 0 ); /* Fail, could not go to the start of the file */ | |
| } | |
| Founded = 0; | |
| while ( sizeof( struct_TestFileSysEntry ) == f_read( (void *)Entry, 1, sizeof( struct_TestFileSysEntry ), File ) ) | |
| { | |
| if ( ( Entry->MagicNum == 0xbc ) | |
| && ( Entry->Line == (int)i ) | |
| && ( Entry->Buf[0] == Ch ) | |
| && ( Entry->Buf[10] == Ch + 1 ) ) | |
| { | |
| Founded = 1; | |
| break; | |
| } | |
| } | |
| if ( !Founded ) | |
| { | |
| return _f_result( __LINE__, i ); /* Entry not founded */ | |
| } | |
| } | |
| ret = f_close( File ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| ret = f_delete( "MyTest" ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| _f_dump( "passed..." ); | |
| return 0; | |
| } /* f_rit */ | |
| static unsigned char f_truncating ( void ) | |
| { | |
| F_FILE * file; | |
| unsigned long size; | |
| unsigned char ret; | |
| _f_dump( "f_truncating" ); | |
| file = f_open( "test.bin", "w+" ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| (void)psp_memset( testbuffer, 1, F_MAX_SEEK_TEST ); | |
| size = (unsigned long)f_write( testbuffer, 1, F_MAX_SEEK_TEST, file ); | |
| if ( size != F_MAX_SEEK_TEST ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| file = f_truncate( "test.bin", F_MAX_SEEK_TEST - 4 ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| size = (unsigned long)f_filelength( "test.bin" ); | |
| if ( size != F_MAX_SEEK_TEST - 4 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| file = f_truncate( "test.bin", F_MAX_SEEK_TEST ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| size = (unsigned long)f_filelength( "test.bin" ); | |
| if ( size != F_MAX_SEEK_TEST ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| file = f_truncate( "test.bin", ( F_MAX_SEEK_TEST / 2 ) - 92 ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| (void)psp_memset( testbuffer, 2, 92 ); | |
| size = (unsigned long)f_write( testbuffer, 1, 92, file ); | |
| if ( size != 92 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| size = (unsigned long)f_filelength( "test.bin" ); | |
| if ( size != ( F_MAX_SEEK_TEST / 2 ) ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| file = f_truncate( "test.bin", 1 ); | |
| if ( !file ) | |
| { | |
| return _f_result( __LINE__, 0 ); | |
| } | |
| (void)psp_memset( testbuffer, 3, 2 ); | |
| size = (unsigned long)f_write( testbuffer, 1, 2, file ); | |
| if ( size != 2 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| ret = f_close( file ); | |
| if ( ret ) | |
| { | |
| return _f_result( __LINE__, ret ); | |
| } | |
| size = (unsigned long)f_filelength( "test.bin" ); | |
| if ( size != 3 ) | |
| { | |
| return _f_result( __LINE__, size ); | |
| } | |
| _f_dump( "passed..." ); | |
| return 0; | |
| } /* f_truncating */ | |
| void f_dotest ( unsigned char t ) | |
| { | |
| _f_dump( "File system test started..." ); | |
| _f_dump( "WARNING: The contents of your drive will be destroyed!\n" ); | |
| (void)_f_poweron(); | |
| switch ( t ) | |
| { | |
| case 0: | |
| case 1: | |
| (void)f_formatting(); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| /* fall through */ | |
| case 2: | |
| (void)f_dirtest(); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| /* fall through */ | |
| case 3: | |
| (void)f_findingtest(); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| /* fall through */ | |
| case 4: | |
| (void)f_powerfail(); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| /* fall through */ | |
| case 5: | |
| (void)f_seeking( 128 ); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| #if ( F_MAX_SEEK_TEST > 128 ) | |
| /* fall through */ | |
| case 6: | |
| (void)f_seeking( 256 ); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| #endif | |
| #if ( F_MAX_SEEK_TEST > 256 ) | |
| /* fall through */ | |
| case 7: | |
| (void)f_seeking( 512 ); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| #endif | |
| #if ( F_MAX_SEEK_TEST > 512 ) | |
| /* fall through */ | |
| case 8: | |
| (void)f_seeking( 1024 ); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| #endif | |
| #if ( F_MAX_SEEK_TEST > 1024 ) | |
| /* fall through */ | |
| case 9: | |
| (void)f_seeking( 2048 ); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| #endif | |
| #if ( F_MAX_SEEK_TEST > 2048 ) | |
| /* fall through */ | |
| case 10: | |
| (void)f_seeking( 4096 ); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| #endif | |
| #if ( F_MAX_SEEK_TEST > 4096 ) | |
| /* fall through */ | |
| case 11: | |
| (void)f_seeking( 8192 ); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| #endif | |
| #if ( F_MAX_SEEK_TEST > 8192 ) | |
| /* fall through */ | |
| case 12: | |
| (void)f_seeking( 16384 ); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| #endif | |
| #if ( F_MAX_SEEK_TEST > 16384 ) | |
| /* fall through */ | |
| case 13: | |
| (void)f_seeking( 32768 ); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| #endif | |
| /* fall through */ | |
| case 14: | |
| (void)f_opening(); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| /* fall through */ | |
| case 15: | |
| (void)f_appending(); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| /* fall through */ | |
| case 16: | |
| (void)f_writing(); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| /* fall through */ | |
| case 17: | |
| (void)f_dots(); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| /* fall through */ | |
| case 18: | |
| (void)f_rit(); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| case 19: | |
| (void)f_truncating(); | |
| if ( t ) | |
| { | |
| break; | |
| } | |
| break; | |
| } /* switch */ | |
| _f_dump( "End of tests..." ); | |
| } /* f_dotest */ | |
| /**************************************************************************** | |
| * | |
| * end of test.c | |
| * | |
| ***************************************************************************/ |