From f87fae7a25007a65c4907b534921747d19359532 Mon Sep 17 00:00:00 2001 From: sergeypdev Date: Fri, 25 Apr 2025 11:40:28 +0400 Subject: [PATCH] Squashed 'libs/physfs/' content from commit 3c22b323 git-subtree-dir: libs/physfs git-subtree-split: 3c22b32319315fa4d25308767e719331dd539ced --- .gitignore | 3 ++ LICENSE | 26 +++++++++++ README.md | 7 +++ physfs.odin | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++ types.odin | 121 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 289 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 physfs.odin create mode 100644 types.odin diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ec9c72e --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +physfs +*.a +*.so diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..566969a --- /dev/null +++ b/LICENSE @@ -0,0 +1,26 @@ +Copyright (c) 2022 Stanaforth (@spindlebink). All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..0233c88 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# PhysFS Odin + +1-1 bindings to [PhysFS](https://icculus.org/physfs) in the [Odin programming language](https://odin-lang.org). + +## License + +BSD 3-clause. diff --git a/physfs.odin b/physfs.odin new file mode 100644 index 0000000..58a3f85 --- /dev/null +++ b/physfs.odin @@ -0,0 +1,132 @@ +package physfs + +import "core:c" + +when ODIN_OS == .Linux || ODIN_OS == .Darwin { + foreign import lib "libphysfs.a" +} + +@(default_calling_convention="c", link_prefix="PHYSFS_") +foreign lib { + init :: proc(argv0: cstring) -> c.int --- + isInit :: proc() -> c.int --- + deinit :: proc() -> c.int --- + supportedArchiveTypes :: proc() -> [^]^ArchiveInfo --- + freeList :: proc(listVar: rawptr) --- + + getLastError :: proc() -> cstring --- + getDirSeparator :: proc() -> cstring --- + permitSymbolicLinks :: proc(allow: c.int) --- + getCdRomDirs :: proc() -> [^]cstring --- + getBaseDir :: proc() -> cstring --- + getUserDir :: proc() -> cstring --- + getWriteDir :: proc() -> cstring --- + setWriteDir :: proc(newDir: cstring) -> c.int --- + addToSearchPath :: proc(newDir: cstring, appendToPath: c.int) -> c.int --- + removeFromSearchPath :: proc(oldDir: cstring) -> c.int --- + getSearchPath :: proc() -> [^]cstring --- + setSaneConfig :: proc(organization, appName, archiveExt: cstring, includedCdRoms, archivesFirst: c.int) -> c.int --- + + mkdir :: proc(dirName: cstring) -> c.int --- + delete :: proc(filename: cstring) -> c.int --- + + getRealDir :: proc(filename: cstring) -> cstring --- + getPrefDir :: proc(org, app: cstring) -> cstring --- + enumerateFiles :: proc(dir: cstring) -> [^]cstring --- + exists :: proc(fname: cstring) -> c.int --- + isDirectory :: proc(fname: cstring) -> c.int --- + isSymbolicLink :: proc(fname: cstring) -> c.int --- + getLastModTime :: proc(fname: cstring) -> sint64 --- + symbolicLinksPermitted :: proc() -> c.int --- + getLastErrorCode :: proc() -> ErrorCode --- + getErrorByCode :: proc(code: ErrorCode) -> cstring --- + setErrorCode :: proc(code: ErrorCode) --- + + openWrite :: proc(filename: cstring) -> ^File --- + openAppend :: proc(filename: cstring) -> ^File --- + openRead :: proc(filename: cstring) -> ^File --- + + close :: proc(handle: ^File) -> c.int --- + read :: proc(handle: ^File, buffer: rawptr, objSize, objCount: uint32) -> sint64 --- + write :: proc(handle: ^File, buffer: rawptr, objSize, objCount: uint32) -> sint64 --- + eof :: proc(handle: ^File) -> c.int --- + tell :: proc(handle: ^File) -> sint64 --- + seek :: proc(handle: ^File, pos: uint64) -> c.int --- + stat :: proc(fname: cstring, stat: ^Stat) -> c.int --- + fileLength :: proc(handle: ^File) -> sint64 --- + setBuffer :: proc(handle: ^File, bufsize: uint64) -> c.int --- + flush :: proc(handle: ^File) -> c.int --- + readBytes :: proc(handle: ^File, buffer: rawptr, len: uint64) -> sint64 --- + writeBytes :: proc(handle: ^File, buffer: rawptr, len: uint64) -> sint64 --- + + registerArchiver :: proc(archiver: ^Archiver) -> c.int --- + deregisterArchiver :: proc(ext: cstring) -> c.int --- + + setRoot :: proc(archive, subdir: cstring) -> c.int --- + setAllocator :: proc(allocator: ^Allocator) -> c.int --- + getAllocator :: proc() -> ^Allocator --- + + mount :: proc(newDir, mountPoint: cstring, appendToPath: c.int) -> c.int --- + unmount :: proc(oldDir: cstring) -> c.int --- + mountIo :: proc(io: ^Io, newdir, mountPoint: cstring, appendToPath: c.int) -> c.int --- + mountMemory :: proc(buf: rawptr, len: uint64, del: proc "c"(rawptr), newDir, mountPoint: cstring, appendToPath: c.int) -> c.int --- + mountHandle :: proc(file: ^File, newDir, mountPoint: cstring, appendToPath: c.int) -> c.int --- + + getMountPoint :: proc(dir: cstring) -> cstring --- + getCdRomDirsCallback :: proc(c: StringCallback, d: rawptr) --- + getSearchPathCallback :: proc(c: StringCallback, d: rawptr) --- + enumerateFilesCallback :: proc(dir: cstring, c: EnumFilesCallback, d: rawptr) --- + enumerate :: proc(dir: cstring, callback: EnumerateCallback, d: rawptr) -> c.int --- + + swapSLE16 :: proc(val: sint16) -> sint16 --- + swapULE16 :: proc(val: uint16) -> uint16 --- + swapLE32 :: proc(val: sint32) -> sint32 --- + swapULE32 :: proc(val: uint32) -> uint32 --- + swapSLE64 :: proc(val: sint64) -> sint64 --- + swapULE64 :: proc(val: uint64) -> uint64 --- + swapSBE16 :: proc(val: sint16) -> sint16 --- + swapUBE16 :: proc(val: uint16) -> uint16 --- + swapBE32 :: proc(val: sint32) -> sint32 --- + swapUBE32 :: proc(val: uint32) -> uint32 --- + swapSBE64 :: proc(val: sint64) -> sint64 --- + swapUBE64 :: proc(val: uint64) -> uint64 --- + + readSLE16 :: proc(file: ^File, val: ^sint16) -> c.int --- + readULE16 :: proc(file: ^File, val: ^uint16) -> c.int --- + readSLE32 :: proc(file: ^File, val: ^sint32) -> c.int --- + readULE32 :: proc(file: ^File, val: ^uint32) -> c.int --- + readSLE64 :: proc(file: ^File, val: ^sint64) -> c.int --- + readULE64 :: proc(file: ^File, val: ^uint64) -> c.int --- + readSBE16 :: proc(file: ^File, val: ^sint16) -> c.int --- + readUBE16 :: proc(file: ^File, val: ^uint16) -> c.int --- + readSBE32 :: proc(file: ^File, val: ^sint32) -> c.int --- + readUBE32 :: proc(file: ^File, val: ^uint32) -> c.int --- + readSBE64 :: proc(file: ^File, val: ^sint64) -> c.int --- + readUBE64 :: proc(file: ^File, val: ^uint64) -> c.int --- + + writeSLE16 :: proc(file: ^File, val: sint16) -> c.int --- + writeULE16 :: proc(file: ^File, val: uint16) -> c.int --- + writeSLE32 :: proc(file: ^File, val: sint32) -> c.int --- + writeULE32 :: proc(file: ^File, val: uint32) -> c.int --- + writeSLE64 :: proc(file: ^File, val: sint64) -> c.int --- + writeULE64 :: proc(file: ^File, val: uint64) -> c.int --- + writeSBE16 :: proc(file: ^File, val: sint16) -> c.int --- + writeUBE16 :: proc(file: ^File, val: uint16) -> c.int --- + writeSBE32 :: proc(file: ^File, val: sint32) -> c.int --- + writeUBE32 :: proc(file: ^File, val: uint32) -> c.int --- + writeSBE64 :: proc(file: ^File, val: sint64) -> c.int --- + writeUBE64 :: proc(file: ^File, val: uint64) -> c.int --- + + utf8FromUcs4 :: proc(src: ^uint32, dst: cstring, len: uint64) --- + utf8ToUcs4 :: proc(src: cstring, dst: ^uint32, len: uint64) --- + utf8FromUcs2 :: proc(src: ^uint16, dst: cstring, len: uint64) --- + utf8ToUcs2 :: proc(src: cstring, dst: ^uint16, len: uint64) --- + utf8FromLatin1 :: proc(src, dst: cstring, len: uint64) --- + utf8FromUtf16 :: proc(src: ^uint16, dst: cstring, len: uint64) --- + utf8ToUtf16 :: proc(src: cstring, dst: ^uint16, len: uint64) --- + + caseFold :: proc(from: uint32, to: ^uint32) -> c.int --- + utf8stricmp :: proc(str1, str2: cstring) -> c.int --- + utf16stricmp :: proc(str1, str2: cstring) -> c.int --- + ucs4stricmp :: proc(str1, str2: ^uint32) -> c.int --- +} diff --git a/types.odin b/types.odin new file mode 100644 index 0000000..7b36e3f --- /dev/null +++ b/types.odin @@ -0,0 +1,121 @@ +package physfs + +import "core:c" + +uint8 :: c.uchar +sint8 :: c.char +uint16 :: c.ushort +sint16 :: c.short +uint32 :: c.uint +sint32 :: c.int +uint64 :: c.ulonglong +sint64 :: c.longlong + +File :: struct { + opaque: rawptr, +} + +ArchiveInfo :: struct { + extension, description, author, url: cstring, + supportsSymlinks: c.int, +} + +Version :: struct { + major, minor, patch: uint8, +} + +AndroidInit :: struct { + jnienv, ctx: rawptr, +} + +Allocator :: struct { + Init: proc "c" () -> c.int, + Deinit: proc "c" (), + Malloc: proc "c" (uint64) -> rawptr, + Realloc: proc "c" (rawptr, uint64) -> rawptr, + Free: proc "c" (rawptr), +} + +StringCallback :: proc "c" (rawptr, cstring) +EnumFilesCallback :: proc "c" (rawptr, cstring, cstring) + +EnumerateCallbackResult :: enum c.int { + ERROR = -1, + STOP = 0, + OK = 1, +} + +EnumerateCallback :: proc "c" (rawptr, cstring, cstring) -> EnumerateCallbackResult + +FileType :: enum c.int { + REGULAR, + DIRECTORY, + SYMLINK, + OTHER, +} + +Stat :: struct { + filesize, modtime, createtime, accesstime: sint64, + filetype: FileType, + readonly: c.int, +} + +Io :: struct { + version: uint32, + opaque: rawptr, + read: proc "c" (^Io, rawptr, uint64) -> sint64, + write: proc "c" (^Io, rawptr, uint64) -> sint64, + seek: proc "c" (^Io, uint64) -> c.int, + tell: proc "c" (^Io) -> sint64, + length: proc "c" (^Io) -> sint64, + duplicate: proc "c" (^Io) -> ^Io, + flush: proc "c" (^Io) -> c.int, + destroy: proc "c" (^Io), +} + +ErrorCode :: enum c.int { + OK, + OTHER_ERROR, + OUT_OF_MEMORY, + NOT_INITIALIZED, + IS_INITIALIZED, + ARGV0_IS_NULL, + UNSUPPORTED, + PAST_EOF, + FILES_STILL_OPEN, + INVALID_ARGUMENT, + NOT_MOUNTED, + NOT_FOUND, + SYMLINK_FORBIDDEN, + NO_WRITE_DIR, + OPEN_FOR_READING, + OPEN_FOR_WRITING, + NOT_A_FILE, + READ_ONLY, + CORRUPT, + SYMLINK_LOOP, + IO, + PERMISSION, + NO_SPACE, + BAD_FILENAME, + BUSY, + DIR_NOT_EMPTY, + OS_ERROR, + DUPLICATE, + BAD_PASSWORD, + APP_CALLBACK, +} + +Archiver :: struct { + version: uint32, + info: ArchiveInfo, + openArchive: proc "c" (^Io, cstring, c.int, ^c.int) -> rawptr, + enumerate: proc "c" (rawptr, cstring, EnumerateCallback, cstring, rawptr) -> EnumerateCallbackResult, + openRead: proc "c" (rawptr, cstring) -> ^Io, + openWrite: proc "c" (rawptr, cstring) -> ^Io, + openAppend: proc "c" (rawptr, cstring) -> ^Io, + remove: proc "c" (rawptr, cstring) -> c.int, + mkdir: proc "c" (rawptr, cstring) -> c.int, + stat: proc "c" (rawptr, cstring, ^Stat) -> c.int, + closeArchive: proc "c" (rawptr), +}