@table(Name, NameLower, NameCaps, Type, Arguments) platform_functions:
{
    { Reserve          reserve           RESERVE           `void *`               `u64 Size`                                                                       }
    { Release          release           RELEASE           `void`                 `void *Pointer`                                                                  }
    { Commit           commit            COMMIT            `void`                 `void *Pointer, u64 Size`                                                        }
    { Decommit         decommit          DECOMMIT          `void`                 `void *Pointer, u64 Size`                                                        }
    { OpenFile         open_file         OPEN_FILE         `platform_file_handle` `string Path, platform_access_flags FileAccess`                                  }
    { CloseFile        close_file        CLOSE_FILE        `void`                 `platform_file_handle Handle`                                                    }
    { ReadFile         read_file         READ_FILE         `void`                 `platform_file_handle Handle, void *Dest, u64 Offset, u64 Size`                  }
    { WriteFile        write_file        WRITE_FILE        `void`                 `platform_file_handle Handle, void *Source, u64 Offset, u64 Size`                }
    { GetFileSize      get_file_size     GET_FILE_SIZE     `u64`                  `platform_file_handle Handle`                                                    }
    { SetCursor        set_cursor        SET_CURSOR        `void`                 `platform_cursor Cursor`                                                         }
    { ToggleFullscreen toggle_fullscreen TOGGLE_FULLSCREEN `void`                 `void`                                                                           }
    { ShowMessage      show_message      SHOW_MESSAGE      `void`                 `string Message, platform_message_type Type`                                     }
    { BeginFileIter    begin_file_iter   BEGIN_FILE_ITER   `platform_file_iter *` `memory_arena *Arena, string Path`                                               }
    { AdvanceFileIter  advance_file_iter ADVANCE_FILE_ITER `b32`                  `memory_arena *Arena, platform_file_iter *Iter, platform_file_info *OutInfo`     }
    { EndFileIter      end_file_iter     END_FILE_ITER     `void`                 `platform_file_iter *Iter`                                                       }
    { SetClipboard     set_clipboard     SET_CLIPBOARD     `void`                 `string String`                                                                  }
    { GetClipboard     get_clipboard     GET_CLIPBOARD     `string`               `memory_arena *Arena`                                                            }
}

@table_gen
{
    @expand(platform_functions s) `#define PLATFORM_$(s.NameCaps)(name) $(s.Type) name($(s.Arguments))`
}

@table_gen
{
    @expand(platform_functions s) `typedef PLATFORM_$(s.NameCaps)(platform_$(s.NameLower));`
}

@table_gen
{
    `struct platform_api`
        `{`
            @expand(platform_functions s) `platform_$(s.NameLower) *$(s.Name); `
            `};`
}

@table_gen
{
    `#define RegisterPlatformFunctions(PlatformName)\\`
    @expand(platform_functions s) `Platform.$(s.Name) = PlatformName##_$(s.Name);\\`
}