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, |         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, |     /// Get the number of reserved sectors. The number of reserved sectors doesn't have to be 32, | ||||||
|     /// but this is a commonly used value. |     /// 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. |     /// for FAT32. (Valid cluster values + (sectors per FAT * 2) + reserved sectors) * bytes per sector. | ||||||
|     /// |     /// | ||||||
|     /// Return: u32 |     /// 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).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. |     ///     @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 seekable_stream = stream.seekableStream(); | ||||||
|         const writer = stream.writer(); |         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).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. |     ///     @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 seekable_stream = stream.seekableStream(); | ||||||
|         const writer = stream.writer(); |         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).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. |     ///     @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 seekable_stream = stream.seekableStream(); | ||||||
|         const writer = stream.writer(); |         const writer = stream.writer(); | ||||||
| 
 | 
 | ||||||
|  | @ -549,7 +572,7 @@ pub const Fat32 = struct { | ||||||
|     ///     Error.TooLarge                   - The stream size is too small. < 17.5KB. |     ///     Error.TooLarge                   - The stream size is too small. < 17.5KB. | ||||||
|     ///     Error.TooSmall                   - The stream size is to large. > 2TB. |     ///     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 |         // First set up the header | ||||||
|         const fat32_header = try Fat32.createFATHeader(options); |         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 |         // 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 |     /// The underlying file system | ||||||
|     fs: *vfs.FileSystem, |     fs: *vfs.FileSystem, | ||||||
| 
 | 
 | ||||||
|     /// The allocator used for allocating memory for opening and reading. |     /// The allocator used for allocating memory for opening files. | ||||||
|     allocator: *Allocator, |     allocator: *Allocator, | ||||||
| 
 | 
 | ||||||
|     /// The list of files in the ram disk. These will be pointers into the raw ramdisk to save on |     /// 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) { |     if (!is_test) { | ||||||
|         switch (builtin.arch) { |         switch (builtin.arch) { | ||||||
|             .i386 => _ = @import("arch/x86/boot.zig"), |             .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