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
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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue