| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -761,13 +761,20 @@ void ff_root(const FAT16* fat, FFILE* file) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					/**
 | 
					 | 
					 | 
					 | 
					/**
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 * Find a file with given "display name" in this directory. | 
					 | 
					 | 
					 | 
					 * Find a file with given "display name" in this directory. | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 * If file is found, "dir" will contain it's handle. | 
					 | 
					 | 
					 | 
					 * If file is found, "dir" will contain it's handle. | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 * Either way, "dir" gets modified and you may need to rewind it afterwards. | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 */ | 
					 | 
					 | 
					 | 
					 */ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					bool ff_open(FFILE* dir, const char* name) | 
					 | 
					 | 
					 | 
					bool ff_find(FFILE* file, const char* name) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					{ | 
					 | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						// save orig pos
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						FSAVEPOS orig = ff_savepos(file); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						char fname[11]; | 
					 | 
					 | 
					 | 
						char fname[11]; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						ff_rawname(name, fname); | 
					 | 
					 | 
					 | 
						ff_rawname(name, fname); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						return dir_find_file_raw(dir, fname); | 
					 | 
					 | 
					 | 
						bool ret = dir_find_file_raw(file, fname); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						if (!ret) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							ff_reopen(file, &orig); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						return ret; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -819,6 +826,8 @@ bool find_empty_file_slot(FFILE* file) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					bool ff_newfile(FFILE* file, const char* name) | 
					 | 
					 | 
					 | 
					bool ff_newfile(FFILE* file, const char* name) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					{ | 
					 | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						const FSAVEPOS orig = ff_savepos(file); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// Convert filename to zero padded raw string
 | 
					 | 
					 | 
					 | 
						// Convert filename to zero padded raw string
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						char fname[11]; | 
					 | 
					 | 
					 | 
						char fname[11]; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						ff_rawname(name, fname); | 
					 | 
					 | 
					 | 
						ff_rawname(name, fname); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -827,11 +836,17 @@ bool ff_newfile(FFILE* file, const char* name) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						bool exists = dir_find_file_raw(file, fname); | 
					 | 
					 | 
					 | 
						bool exists = dir_find_file_raw(file, fname); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						ff_first(file); // rewind dir
 | 
					 | 
					 | 
					 | 
						ff_first(file); // rewind dir
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if (exists) | 
					 | 
					 | 
					 | 
						if (exists) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						{ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							ff_reopen(file, &orig); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							return false; // file already exists in the dir.
 | 
					 | 
					 | 
					 | 
							return false; // file already exists in the dir.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if (!find_empty_file_slot(file)) | 
					 | 
					 | 
					 | 
						if (!find_empty_file_slot(file)) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						{ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							ff_reopen(file, &orig); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							return false; // error finding a slot
 | 
					 | 
					 | 
					 | 
							return false; // error finding a slot
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// Write into the new slot
 | 
					 | 
					 | 
					 | 
						// Write into the new slot
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						const uint16_t newclu = alloc_cluster(file->fat); | 
					 | 
					 | 
					 | 
						const uint16_t newclu = alloc_cluster(file->fat); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -847,6 +862,8 @@ bool ff_newfile(FFILE* file, const char* name) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 */ | 
					 | 
					 | 
					 | 
					 */ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					bool ff_mkdir(FFILE* file, const char* name) | 
					 | 
					 | 
					 | 
					bool ff_mkdir(FFILE* file, const char* name) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					{ | 
					 | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						const FSAVEPOS orig = ff_savepos(file); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// Convert filename to zero padded raw string
 | 
					 | 
					 | 
					 | 
						// Convert filename to zero padded raw string
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						char fname[11]; | 
					 | 
					 | 
					 | 
						char fname[11]; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						ff_rawname(name, fname); | 
					 | 
					 | 
					 | 
						ff_rawname(name, fname); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -855,11 +872,16 @@ bool ff_mkdir(FFILE* file, const char* name) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						bool exists = dir_find_file_raw(file, fname); | 
					 | 
					 | 
					 | 
						bool exists = dir_find_file_raw(file, fname); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						ff_first(file); // rewind dir
 | 
					 | 
					 | 
					 | 
						ff_first(file); // rewind dir
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if (exists) | 
					 | 
					 | 
					 | 
						if (exists) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						{ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							ff_reopen(file, &orig); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							return false; // file already exusts in the dir.
 | 
					 | 
					 | 
					 | 
							return false; // file already exusts in the dir.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if (!find_empty_file_slot(file)) | 
					 | 
					 | 
					 | 
						if (!find_empty_file_slot(file)) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						{ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							ff_reopen(file, &orig); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							return false; // error finding a slot
 | 
					 | 
					 | 
					 | 
							return false; // error finding a slot
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
						} | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// Write into the new slot
 | 
					 | 
					 | 
					 | 
						// Write into the new slot
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						const uint16_t newclu = alloc_cluster(file->fat); | 
					 | 
					 | 
					 | 
						const uint16_t newclu = alloc_cluster(file->fat); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |