Initial FAT32 interface
Include code page 437 This is now moved to a better location Fixed initrd doc for allocator Added test files Plus minor extras Created initial FAT32 filesystem This initial FAT32 filesystem will parse a stream, which could be a HDD or a in memory filesystem and produce a FAT32 filesystem. This will check if the raw bytes is a valid FAT32 filesystem as descibed in the spec. This is only a skeleton with no open, read or write functionality. Part of #216 logger -> log Fmt Removed 'zero_' from struct fields number_free_cluster -> number_free_clusters Return non allocated FAT32FS prefix test_ Added doc comment for boot sector arrays Moved code_page.zig info -> debug for init FAT32 Abstracted getting code page table
This commit is contained in:
		
							parent
							
								
									7b2599c964
								
							
						
					
					
						commit
						fab372a6cf
					
				
					 21 changed files with 2042 additions and 7 deletions
				
			
		
							
								
								
									
										33
									
								
								mkfat32.zig
									
										
									
									
									
								
							
							
						
						
									
										33
									
								
								mkfat32.zig
									
										
									
									
									
								
							|  | @ -230,6 +230,29 @@ pub const Fat32 = struct { | |||
|         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA, | ||||
|     }; | ||||
| 
 | ||||
|     /// | ||||
|     /// A convenient function for returning the error types for reading, writing and seeking a stream. | ||||
|     /// | ||||
|     /// Argument: | ||||
|     ///     IN comptime StreamType: type - The stream to get the error set from. | ||||
|     /// | ||||
|     /// Return: type | ||||
|     ///     The Error set for reading, writing and seeking the stream. | ||||
|     /// | ||||
|     fn ErrorSet(comptime StreamType: type) type { | ||||
|         const WriteError = switch (@typeInfo(StreamType)) { | ||||
|             .Pointer => |p| p.child.WriteError, | ||||
|             else => StreamType.WriteError, | ||||
|         }; | ||||
| 
 | ||||
|         const SeekError = switch (@typeInfo(StreamType)) { | ||||
|             .Pointer => |p| p.child.SeekError, | ||||
|             else => StreamType.SeekError, | ||||
|         }; | ||||
| 
 | ||||
|         return WriteError || SeekError; | ||||
|     } | ||||
| 
 | ||||
|     /// | ||||
|     /// Get the number of reserved sectors. The number of reserved sectors doesn't have to be 32, | ||||
|     /// but this is a commonly used value. | ||||
|  | @ -310,7 +333,7 @@ pub const Fat32 = struct { | |||
|     } | ||||
| 
 | ||||
|     /// | ||||
|     /// Get the default image size: 34090496 (~32.5KB). This is the recommended minimum image size | ||||
|     /// Get the default image size: 34090496 (~32.5MB). This is the recommended minimum image size | ||||
|     /// for FAT32. (Valid cluster values + (sectors per FAT * 2) + reserved sectors) * bytes per sector. | ||||
|     /// | ||||
|     /// Return: u32 | ||||
|  | @ -363,7 +386,7 @@ pub const Fat32 = struct { | |||
|     ///     @TypeOf(stream).WriteError - If there is an error when writing. See the relevant error for the stream. | ||||
|     ///     @TypeOf(stream).SeekError  - If there is an error when seeking. See the relevant error for the stream. | ||||
|     /// | ||||
|     fn writeFSInfo(stream: anytype, fat32_header: Header, free_cluster_num: u32, next_free_cluster: u32) (@TypeOf(stream).WriteError || @TypeOf(stream).SeekError)!void { | ||||
|     fn writeFSInfo(stream: anytype, fat32_header: Header, free_cluster_num: u32, next_free_cluster: u32) ErrorSet(@TypeOf(stream))!void { | ||||
|         const seekable_stream = stream.seekableStream(); | ||||
|         const writer = stream.writer(); | ||||
| 
 | ||||
|  | @ -414,7 +437,7 @@ pub const Fat32 = struct { | |||
|     ///     @TypeOf(stream).WriteError - If there is an error when writing. See the relevant error for the stream. | ||||
|     ///     @TypeOf(stream).SeekError  - If there is an error when seeking. See the relevant error for the stream. | ||||
|     /// | ||||
|     fn writeFAT(stream: anytype, fat32_header: Header) (@TypeOf(stream).WriteError || @TypeOf(stream).SeekError)!void { | ||||
|     fn writeFAT(stream: anytype, fat32_header: Header) ErrorSet(@TypeOf(stream))!void { | ||||
|         const seekable_stream = stream.seekableStream(); | ||||
|         const writer = stream.writer(); | ||||
| 
 | ||||
|  | @ -448,7 +471,7 @@ pub const Fat32 = struct { | |||
|     ///     @TypeOf(stream).WriteError - If there is an error when writing. See the relevant error for the stream. | ||||
|     ///     @TypeOf(stream).SeekError  - If there is an error when seeking. See the relevant error for the stream. | ||||
|     /// | ||||
|     fn writeBootSector(stream: anytype, fat32_header: Header) (@TypeOf(stream).WriteError || @TypeOf(stream).SeekError)!void { | ||||
|     fn writeBootSector(stream: anytype, fat32_header: Header) ErrorSet(@TypeOf(stream))!void { | ||||
|         const seekable_stream = stream.seekableStream(); | ||||
|         const writer = stream.writer(); | ||||
| 
 | ||||
|  | @ -549,7 +572,7 @@ pub const Fat32 = struct { | |||
|     ///     Error.TooLarge                   - The stream size is too small. < 17.5KB. | ||||
|     ///     Error.TooSmall                   - The stream size is to large. > 2TB. | ||||
|     /// | ||||
|     pub fn make(options: Options, stream: anytype) (@TypeOf(stream).WriteError || @TypeOf(stream).SeekError || Error)!void { | ||||
|     pub fn make(options: Options, stream: anytype) (ErrorSet(@TypeOf(stream)) || Error)!void { | ||||
|         // First set up the header | ||||
|         const fat32_header = try Fat32.createFATHeader(options); | ||||
|         // Get the total image size again. As the above has a check for the size, we don't need one here again | ||||
|  |  | |||
							
								
								
									
										97
									
								
								src/kernel/code_page/code_page.zig
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								src/kernel/code_page/code_page.zig
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,97 @@ | |||
| const std = @import("std"); | ||||
| const cp437 = @import("cp437.zig"); | ||||
| 
 | ||||
| /// The code page namespace | ||||
| pub const CodePage = struct { | ||||
|     /// The different code pages | ||||
|     pub const CodePages = enum { | ||||
|         /// Code page 437, the original IBM PC character set. Also known as OEM-US. | ||||
|         CP437, | ||||
|     }; | ||||
| 
 | ||||
|     /// The Error set for converting characters. | ||||
|     pub const Error = error{ | ||||
|         /// The character to be converted is not part of the code page table. | ||||
|         InvalidChar, | ||||
|     }; | ||||
| 
 | ||||
|     /// | ||||
|     /// Get the code page table for the given code page enum. | ||||
|     /// | ||||
|     /// Arguments: | ||||
|     ///     IN code_page: CodePages - The code page enum to get the table for. | ||||
|     /// | ||||
|     /// Return: [0x100]u16 | ||||
|     ///     The table of u16 that represent the code page provided. | ||||
|     /// | ||||
|     fn getTable(code_page: CodePages) [0x100]u16 { | ||||
|         return switch (code_page) { | ||||
|             .CP437 => cp437.table, | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     /// | ||||
|     /// Convert a wide character (16-bits) to a code page. | ||||
|     /// | ||||
|     /// Arguments: | ||||
|     ///     IN code_page: CodePages - The code page to convert to. | ||||
|     ///     IN char: u16            - The character to convert. | ||||
|     /// | ||||
|     /// Return: u8 | ||||
|     ///     The converted character. | ||||
|     /// | ||||
|     /// Error: Error | ||||
|     ///     error.InvalidChar - The character to be converted is not in the code page table. | ||||
|     /// | ||||
|     pub fn toCodePage(code_page: CodePages, char: u16) Error!u8 { | ||||
|         // Optimisation for ascii | ||||
|         if (char >= 0x20 and char < 0x7F) { | ||||
|             return @intCast(u8, char); | ||||
|         } | ||||
| 
 | ||||
|         // Find the code point and then return the index | ||||
|         for (getTable(code_page)) |code_point, i| { | ||||
|             if (code_point == char) { | ||||
|                 return @intCast(u8, i); | ||||
|             } | ||||
|         } | ||||
|         return Error.InvalidChar; | ||||
|     } | ||||
| 
 | ||||
|     /// | ||||
|     /// Convert a code page character to a wide character (16-bits) | ||||
|     /// | ||||
|     /// Arguments: | ||||
|     ///     IN code_page: CodePages - The code page the character is coming from. | ||||
|     ///     IN char: u8             - The character to convert to wide char. | ||||
|     /// | ||||
|     /// Return: u16 | ||||
|     ///     The wide character. | ||||
|     /// | ||||
|     pub fn toWideChar(code_page: CodePages, char: u8) u16 { | ||||
|         return getTable(code_page)[char]; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| test "ASCII toCodePage" { | ||||
|     // The ASCII characters will be the same values | ||||
|     var ascii: u8 = 0x20; | ||||
|     while (ascii < 0x7F) : (ascii += 1) { | ||||
|         const char = try CodePage.toCodePage(.CP437, ascii); | ||||
|         std.testing.expectEqual(char, ascii); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| test "ASCII toWideChar" { | ||||
|     // The ASCII characters will be the same values | ||||
|     var ascii: u8 = 0x20; | ||||
|     while (ascii < 0x7F) : (ascii += 1) { | ||||
|         const char = CodePage.toWideChar(.CP437, ascii); | ||||
|         std.testing.expectEqual(char, ascii); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| test "Invalid characters" { | ||||
|     const char = '€'; | ||||
|     std.testing.expectError(CodePage.Error.InvalidChar, CodePage.toCodePage(.CP437, char)); | ||||
| } | ||||
							
								
								
									
										19
									
								
								src/kernel/code_page/cp437.zig
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/kernel/code_page/cp437.zig
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | |||
| /// The code page table for 437: IBM PC or OEM-US. | ||||
| pub const table = [0x100]u16{ | ||||
|     0x0000, 0x263A, 0x263B, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022, 0x25D8, 0x25CB, 0x25D9, 0x2642, 0x2640, 0x266A, 0x266B, 0x263C, | ||||
|     0x25BA, 0x25C4, 0x2195, 0x203C, 0x00B6, 0x00A7, 0x25AC, 0x21A8, 0x2191, 0x2193, 0x2192, 0x2190, 0x221F, 0x2194, 0x25B2, 0x25BC, | ||||
|     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, | ||||
|     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, | ||||
|     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, | ||||
|     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, | ||||
|     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, | ||||
|     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x2302, | ||||
|     0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, | ||||
|     0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, | ||||
|     0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, | ||||
|     0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, | ||||
|     0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
|     0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
|     0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, | ||||
|     0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0, | ||||
| }; | ||||
							
								
								
									
										1753
									
								
								src/kernel/filesystem/fat32.zig
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1753
									
								
								src/kernel/filesystem/fat32.zig
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -42,7 +42,7 @@ pub const InitrdFS = struct { | |||
|     /// The underlying file system | ||||
|     fs: *vfs.FileSystem, | ||||
| 
 | ||||
|     /// The allocator used for allocating memory for opening and reading. | ||||
|     /// The allocator used for allocating memory for opening files. | ||||
|     allocator: *Allocator, | ||||
| 
 | ||||
|     /// The list of files in the ram disk. These will be pointers into the raw ramdisk to save on | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ comptime { | |||
|     if (!is_test) { | ||||
|         switch (builtin.arch) { | ||||
|             .i386 => _ = @import("arch/x86/boot.zig"), | ||||
|             else => {}, | ||||
|             else => unreachable, | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
							
								
								
									
										1
									
								
								test/fat32/....leading_dots.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/fat32/....leading_dots.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| ....leading_dots.txt | ||||
|  | @ -0,0 +1 @@ | |||
| A_verY_Long_File_namE_With_normal_Extension.tXt | ||||
							
								
								
									
										1
									
								
								test/fat32/Sma.ll.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/fat32/Sma.ll.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| Sma.ll.txt | ||||
							
								
								
									
										1
									
								
								test/fat32/UTF16.€xt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/fat32/UTF16.€xt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| UTF16.€xt | ||||
							
								
								
									
										1
									
								
								test/fat32/UTF16€.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/fat32/UTF16€.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| UTF16€.txt | ||||
							
								
								
									
										1
									
								
								test/fat32/[nope].txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/fat32/[nope].txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| [nope].txt | ||||
							
								
								
									
										1
									
								
								test/fat32/dot.in.file.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/fat32/dot.in.file.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| dot.in.file.txt | ||||
							
								
								
									
										1
									
								
								test/fat32/file.long_ext
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/fat32/file.long_ext
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| file.long_ext | ||||
							
								
								
									
										1
									
								
								test/fat32/file.t x t
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/fat32/file.t x t
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| file.t x t | ||||
							
								
								
									
										
											BIN
										
									
								
								test/fat32/golden_image.img
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								test/fat32/golden_image.img
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -0,0 +1 @@ | |||
| insanely_long_insanely_long_insanely_long_insanely_long_insanely_long_insanely_long_insanely_long_insanely_long_insanely_long_insanely_long_insanely_long_insanely_long_insanely_long_insanely_long_insanely_long_insanely_long.txt | ||||
							
								
								
									
										130
									
								
								test/fat32/large_file2.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								test/fat32/large_file2.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,130 @@ | |||
| AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | ||||
| BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB | ||||
| CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC | ||||
| DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD | ||||
| EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE | ||||
| FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF | ||||
| GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG | ||||
| HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH | ||||
| IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | ||||
| JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ | ||||
| KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK | ||||
| LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL | ||||
| MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM | ||||
| NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN | ||||
| OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO | ||||
| PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP | ||||
| QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ | ||||
| RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR | ||||
| SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS | ||||
| TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT | ||||
| UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU | ||||
| VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV | ||||
| WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW | ||||
| XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||||
| YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY | ||||
| ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ | ||||
| AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | ||||
| BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB | ||||
| CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC | ||||
| DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD | ||||
| EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE | ||||
| FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF | ||||
| GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG | ||||
| HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH | ||||
| IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | ||||
| JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ | ||||
| KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK | ||||
| LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL | ||||
| MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM | ||||
| NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN | ||||
| OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO | ||||
| PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP | ||||
| QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ | ||||
| RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR | ||||
| SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS | ||||
| TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT | ||||
| UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU | ||||
| VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV | ||||
| WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW | ||||
| XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||||
| YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY | ||||
| ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ | ||||
| AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | ||||
| BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB | ||||
| CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC | ||||
| DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD | ||||
| EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE | ||||
| FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF | ||||
| GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG | ||||
| HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH | ||||
| IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | ||||
| JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ | ||||
| KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK | ||||
| LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL | ||||
| MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM | ||||
| NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN | ||||
| OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO | ||||
| PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP | ||||
| QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ | ||||
| RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR | ||||
| SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS | ||||
| TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT | ||||
| UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU | ||||
| VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV | ||||
| WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW | ||||
| XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||||
| YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY | ||||
| ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ | ||||
| AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | ||||
| BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB | ||||
| CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC | ||||
| DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD | ||||
| EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE | ||||
| FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF | ||||
| GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG | ||||
| HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH | ||||
| IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | ||||
| JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ | ||||
| KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK | ||||
| LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL | ||||
| MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM | ||||
| NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN | ||||
| OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO | ||||
| PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP | ||||
| QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ | ||||
| RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR | ||||
| SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS | ||||
| TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT | ||||
| UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU | ||||
| VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV | ||||
| WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW | ||||
| XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||||
| YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY | ||||
| ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ | ||||
| AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | ||||
| BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB | ||||
| CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC | ||||
| DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD | ||||
| EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE | ||||
| FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF | ||||
| GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG | ||||
| HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH | ||||
| IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | ||||
| JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ | ||||
| KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK | ||||
| LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL | ||||
| MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM | ||||
| NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN | ||||
| OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO | ||||
| PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP | ||||
| QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ | ||||
| RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR | ||||
| SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS | ||||
| TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT | ||||
| UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU | ||||
| VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV | ||||
| WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW | ||||
| XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||||
| YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY | ||||
| ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ | ||||
							
								
								
									
										1
									
								
								test/fat32/nope.[x]
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/fat32/nope.[x]
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| nope.[x] | ||||
							
								
								
									
										1
									
								
								test/fat32/s  p  a  c  e  s.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/fat32/s  p  a  c  e  s.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| s  p  a  c  e  s.txt | ||||
							
								
								
									
										1
									
								
								test/fat32/short.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/fat32/short.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| short.txt | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 DrDeano
						DrDeano