diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..56cc685 --- /dev/null +++ b/.clang-format @@ -0,0 +1,67 @@ +# Generated from CLion C/C++ Code Style settings +BasedOnStyle: LLVM +AccessModifierOffset: -4 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: Consecutive +AlignConsecutiveMacros: AcrossEmptyLinesAndComments +AlignOperands: Align +AllowAllArgumentsOnNextLine: false +AllowAllConstructorInitializersOnNextLine: false +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: Always +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Always +AllowShortLambdasOnASingleLine: All +AllowShortLoopsOnASingleLine: true +AlwaysBreakAfterReturnType: None +AlwaysBreakTemplateDeclarations: Yes +BreakBeforeBraces: Custom +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false + SplitEmptyFunction: false + SplitEmptyRecord: true +BreakBeforeBinaryOperators: None +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: BeforeColon +BreakInheritanceList: BeforeColon +ColumnLimit: 0 +CompactNamespaces: false +ContinuationIndentWidth: 8 +IndentCaseLabels: true +IndentPPDirectives: None +IndentWidth: 4 +KeepEmptyLinesAtTheStartOfBlocks: true +MaxEmptyLinesToKeep: 2 +NamespaceIndentation: All +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PointerAlignment: Right +ReflowComments: false +SpaceAfterCStyleCast: true +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInCStyleCastParentheses: false +SpacesInContainerLiterals: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +TabWidth: 4 +UseTab: Never diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 0000000..54f5094 --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,25 @@ +name: CI-PR + +on: [pull_request] + +jobs: + clang-format: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v2 + - name: clang-format + run: | + docker run --rm -v ${PWD}:/src wiiuenv/clang-format:13.0.0-2 -r ./source ./include + build-lib: + runs-on: ubuntu-18.04 + needs: clang-format + steps: + - uses: actions/checkout@v2 + - name: build lib + run: | + docker build . -f Dockerfile.buildlocal -t builder + docker run --rm -v ${PWD}:/project builder make + - uses: actions/upload-artifact@master + with: + name: lib + path: "lib/*.a" \ No newline at end of file diff --git a/.github/workflows/push_image.yml b/.github/workflows/push_image.yml index 620b98d..c630731 100644 --- a/.github/workflows/push_image.yml +++ b/.github/workflows/push_image.yml @@ -4,13 +4,21 @@ on: branches: - main jobs: + clang-format: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v2 + - name: clang-format + run: | + docker run --rm -v ${PWD}:/src wiiuenv/clang-format:13.0.0-2 -r ./source ./include build: runs-on: ubuntu-latest + needs: clang-format steps: - uses: actions/checkout@master - name: Get release version id: get_release_tag - run: | + run: | echo RELEASE_VERSION=$(echo $(date '+%Y%m%d')) >> $GITHUB_ENV echo REPOSITORY_NAME=$(echo "$GITHUB_REPOSITORY" | awk -F / '{print $2}' | sed -e "s/:refs//" | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV echo REPOSITORY_OWNER=$(echo "$GITHUB_REPOSITORY" | awk -F / '{print $1}' | sed 's/[^a-zA-Z0-9]//g' | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV @@ -22,5 +30,4 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} snapshot: true cache: true - tags: "latest, ${{ env.RELEASE_VERSION }}" - dockerfile: Dockerfile \ No newline at end of file + tags: "latest, ${{ env.RELEASE_VERSION }}" \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index e9f1e65..9941cb4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM wiiuenv/devkitppc:20210920 +FROM wiiuenv/devkitppc:20211229 WORKDIR tmp_build COPY . . diff --git a/Dockerfile.buildlocal b/Dockerfile.buildlocal new file mode 100644 index 0000000..080eec7 --- /dev/null +++ b/Dockerfile.buildlocal @@ -0,0 +1,3 @@ +FROM wiiuenv/devkitppc:20211229 + +WORKDIR project \ No newline at end of file diff --git a/README.md b/README.md index 7d7ce51..1db6971 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Publish Docker Image](https://github.com/wiiu-env/libromfs_wiiu/actions/workflows/push_image.yml/badge.svg)](https://github.com/wiiu-env/libromfs_wiiu/actions/workflows/push_image.yml) + # libromfs Ported from [libnx](https://github.com/switchbrew/libnx/blob/e5ae43f4c2cca5320559d9c27ce256b2901aed40/nx/source/runtime/devices/romfs_dev.c) @@ -16,3 +18,7 @@ COPY --from=wiiuenv/libromfs_wiiu:[tag] /artifacts $DEVKITPRO ``` Replace [tag] with a tag you want to use, a list of tags can be found [here](https://hub.docker.com/r/wiiuenv/libromfs_wiiu/tags). It's highly recommended to pin the version to the **latest date** instead of using `latest`. + +## Format the code via docker + +`docker run --rm -v ${PWD}:/src wiiuenv/clang-format:13.0.0-2 -r ./source ./include -i` \ No newline at end of file diff --git a/include/romfs_dev.h b/include/romfs_dev.h index 2b6af1b..80105ed 100644 --- a/include/romfs_dev.h +++ b/include/romfs_dev.h @@ -34,7 +34,7 @@ typedef struct { uint32_t childFile; ///< Offset of the first file. uint32_t nextHash; ///< Directory hash table pointer. uint32_t nameLen; ///< Name length. - uint8_t name[]; ///< Name. (UTF-8) + uint8_t name[]; ///< Name. (UTF-8) } romfs_dir; /// RomFS file. @@ -45,7 +45,7 @@ typedef struct { uint64_t dataSize; ///< Length of the file's data. uint32_t nextHash; ///< File hash table pointer. uint32_t nameLen; ///< Name length. - uint8_t name[]; ///< Name. (UTF-8) + uint8_t name[]; ///< Name. (UTF-8) } romfs_file; #ifdef __cplusplus @@ -76,7 +76,7 @@ int32_t romfsUnmount(const char *name); /// RomFS file. typedef struct { - uint64_t length; ///< Offset of the file's data. + uint64_t length; ///< Offset of the file's data. uint64_t offset; ///< Length of the file's data. } romfs_fileInfo; @@ -85,4 +85,3 @@ int romfsGetFileInfoPerPath(const char *romfs, const char *path, romfs_fileInfo #ifdef __cplusplus } #endif - diff --git a/source/romfs_dev.c b/source/romfs_dev.c index f5cbd2f..02d25dd 100644 --- a/source/romfs_dev.c +++ b/source/romfs_dev.c @@ -1,16 +1,16 @@ +#include +#include #include #include #include +#include +#include #include #include #include #include #include #include -#include -#include -#include -#include #include "romfs_dev.h" @@ -37,8 +37,8 @@ extern char **__system_argv; //static char __thread __component[PATH_MAX+1]; static char __component[PATH_MAX + 1]; -#define romFS_root(m) ((romfs_dir*)(m)->dirTable) -#define romFS_none ((uint32_t)~0) +#define romFS_root(m) ((romfs_dir *) (m)->dirTable) +#define romFS_none ((uint32_t) ~0) #define romFS_dir_mode (S_IFDIR | S_IRUSR | S_IRGRP | S_IROTH) #define romFS_file_mode (S_IFREG | S_IRUSR | S_IRGRP | S_IROTH) @@ -147,8 +147,8 @@ static const devoptab_t romFS_devoptab = .dirnext_r = romfs_dirnext, .dirclose_r = romfs_dirclose, // symlinks aren't supported so alias lstat to stat - .lstat_r = romfs_stat, - }; + .lstat_r = romfs_stat, +}; static bool romfs_initialised = false; static romfs_mount romfs_mounts[32]; @@ -162,9 +162,9 @@ static void romfsInitMtime(romfs_mount *mount); static void _romfsResetMount(romfs_mount *mount, int32_t id) { memset(mount, 0, sizeof(*mount)); memcpy(&mount->device, &romFS_devoptab, sizeof(romFS_devoptab)); - mount->device.name = mount->name; + mount->device.name = mount->name; mount->device.deviceData = mount; - mount->id = id; + mount->id = id; DCFlushRange(mount, sizeof(*mount)); } @@ -183,7 +183,7 @@ static void _romfsInit(void) { static romfs_mount *romfsFindMount(const char *name) { uint32_t i; - uint32_t total = sizeof(romfs_mounts) / sizeof(romfs_mount); + uint32_t total = sizeof(romfs_mounts) / sizeof(romfs_mount); romfs_mount *mount = NULL; _romfsInit(); @@ -294,10 +294,10 @@ int32_t romfsMountCommon(const char *name, romfs_mount *mount) { goto fail_io; } - mount->dirHashTable = NULL; - mount->dirTable = NULL; + mount->dirHashTable = NULL; + mount->dirTable = NULL; mount->fileHashTable = NULL; - mount->fileTable = NULL; + mount->fileTable = NULL; mount->dirHashTable = (uint32_t *) memalign(0x40, mount->header.dirHashTableSize); if (!mount->dirHashTable) { @@ -341,11 +341,11 @@ int32_t romfsMountCommon(const char *name, romfs_mount *mount) { DCFlushRange(mount, sizeof(*mount)); return 0; - fail_oom: +fail_oom: romfs_mountclose(mount); return 9; - fail_io: +fail_io: romfs_mountclose(mount); return 10; } @@ -408,8 +408,8 @@ static bool comparePaths(const uint8_t *name1, const uint8_t *name2, uint32_t na static int searchForDir(romfs_mount *mount, romfs_dir *parent, const uint8_t *name, uint32_t namelen, romfs_dir **out) { uint64_t parentOff = (uintptr_t) parent - (uintptr_t) mount->dirTable; - uint32_t hash = calcHash(parentOff, name, namelen, mount->header.dirHashTableSize / 4); - romfs_dir *curDir = NULL; + uint32_t hash = calcHash(parentOff, name, namelen, mount->header.dirHashTableSize / 4); + romfs_dir *curDir = NULL; uint32_t curOff; *out = NULL; for (curOff = mount->dirHashTable[hash]; curOff != romFS_none; curOff = curDir->nextHash) { @@ -431,8 +431,8 @@ static int searchForDir(romfs_mount *mount, romfs_dir *parent, const uint8_t *na } static int searchForFile(romfs_mount *mount, romfs_dir *parent, const uint8_t *name, uint32_t namelen, romfs_file **out) { - uint64_t parentOff = (uintptr_t) parent - (uintptr_t) mount->dirTable; - uint32_t hash = calcHash(parentOff, name, namelen, mount->header.fileHashTableSize / 4); + uint64_t parentOff = (uintptr_t) parent - (uintptr_t) mount->dirTable; + uint32_t hash = calcHash(parentOff, name, namelen, mount->header.fileHashTableSize / 4); romfs_file *curFile = NULL; uint32_t curOff; *out = NULL; @@ -471,7 +471,7 @@ static int navigateToDir(romfs_mount *mount, romfs_dir **ppDir, const char **pPa } while (**pPath) { - char *slashPos = strchr(*pPath, '/'); + char *slashPos = strchr(*pPath, '/'); char *component = __component; if (slashPos) { @@ -485,7 +485,7 @@ static int navigateToDir(romfs_mount *mount, romfs_dir **ppDir, const char **pPa memcpy(component, *pPath, len); component[len] = 0; - *pPath = slashPos + 1; + *pPath = slashPos + 1; } else if (isDir) { component = (char *) *pPath; *pPath += strlen(component); @@ -522,7 +522,7 @@ static off_t dir_size(romfs_dir *dir) { } static nlink_t dir_nlink(romfs_mount *mount, romfs_dir *dir) { - nlink_t count = 2; // one for self, one for parent + nlink_t count = 2; // one for self, one for parent uint32_t offset = dir->childDir; while (offset != romFS_none) { @@ -556,12 +556,12 @@ int romfsGetFileInfoPerPath(const char *romfs, const char *path, romfs_fileInfo return -2; } romfs_dir *curDir = NULL; - int errno2 = navigateToDir(mount, &curDir, &path, false); + int errno2 = navigateToDir(mount, &curDir, &path, false); if (errno2 != 0) { return -3; } romfs_file *file = NULL; - int err = searchForFile(mount, curDir, (uint8_t *) path, strlen(path), &file); + int err = searchForFile(mount, curDir, (uint8_t *) path, strlen(path), &file); if (err != 0) { return -4; } @@ -586,13 +586,13 @@ int romfs_open(struct _reent *r, void *fileStruct, const char *path, int flags, } romfs_dir *curDir = NULL; - r->_errno = navigateToDir(fileobj->mount, &curDir, &path, false); + r->_errno = navigateToDir(fileobj->mount, &curDir, &path, false); if (r->_errno != 0) { return -1; } romfs_file *file = NULL; - int ret = searchForFile(fileobj->mount, curDir, (uint8_t *) path, strlen(path), &file); + int ret = searchForFile(fileobj->mount, curDir, (uint8_t *) path, strlen(path), &file); if (ret != 0) { if (ret == ENOENT && (flags & O_CREAT)) { r->_errno = EROFS; @@ -605,9 +605,9 @@ int romfs_open(struct _reent *r, void *fileStruct, const char *path, int flags, return -1; } - fileobj->file = file; + fileobj->file = file; fileobj->offset = fileobj->mount->header.fileDataOff + file->dataOff; - fileobj->pos = 0; + fileobj->pos = 0; return 0; } @@ -618,7 +618,7 @@ int romfs_close(struct _reent *r, void *fd) { ssize_t romfs_read(struct _reent *r, void *fd, char *ptr, size_t len) { romfs_fileobj *file = (romfs_fileobj *) fd; - uint64_t endPos = file->pos + len; + uint64_t endPos = file->pos + len; /* check if past end-of-file */ if (file->pos >= file->file->dataSize) { @@ -669,7 +669,7 @@ off_t romfs_seek(struct _reent *r, void *fd, off_t pos, int dir) { return -1; } } - /* check for overflow */ + /* check for overflow */ else if (INT64_MAX - pos < start) { r->_errno = EOVERFLOW; return -1; @@ -681,23 +681,23 @@ off_t romfs_seek(struct _reent *r, void *fd, off_t pos, int dir) { static void fillDir(struct stat *st, romfs_mount *mount, romfs_dir *dir) { memset(st, 0, sizeof(*st)); - st->st_ino = dir_inode(mount, dir); - st->st_mode = romFS_dir_mode; - st->st_nlink = dir_nlink(mount, dir); - st->st_size = dir_size(dir); + st->st_ino = dir_inode(mount, dir); + st->st_mode = romFS_dir_mode; + st->st_nlink = dir_nlink(mount, dir); + st->st_size = dir_size(dir); st->st_blksize = 512; - st->st_blocks = (st->st_blksize + 511) / 512; + st->st_blocks = (st->st_blksize + 511) / 512; st->st_atime = st->st_mtime = st->st_ctime = mount->mtime; } static void fillFile(struct stat *st, romfs_mount *mount, romfs_file *file) { memset(st, 0, sizeof(struct stat)); - st->st_ino = file_inode(mount, file); - st->st_mode = romFS_file_mode; - st->st_nlink = 1; - st->st_size = (off_t) file->dataSize; + st->st_ino = file_inode(mount, file); + st->st_mode = romFS_file_mode; + st->st_nlink = 1; + st->st_size = (off_t) file->dataSize; st->st_blksize = 512; - st->st_blocks = (st->st_blksize + 511) / 512; + st->st_blocks = (st->st_blksize + 511) / 512; st->st_atime = st->st_mtime = st->st_ctime = mount->mtime; } @@ -710,8 +710,8 @@ int romfs_fstat(struct _reent *r, void *fd, struct stat *st) { int romfs_stat(struct _reent *r, const char *path, struct stat *st) { romfs_mount *mount = (romfs_mount *) r->deviceData; - romfs_dir *curDir = NULL; - r->_errno = navigateToDir(mount, &curDir, &path, false); + romfs_dir *curDir = NULL; + r->_errno = navigateToDir(mount, &curDir, &path, false); if (r->_errno != 0) { return -1; } @@ -722,8 +722,8 @@ int romfs_stat(struct _reent *r, const char *path, struct stat *st) { } romfs_dir *dir = NULL; - int ret = 0; - ret = searchForDir(mount, curDir, (uint8_t *) path, strlen(path), &dir); + int ret = 0; + ret = searchForDir(mount, curDir, (uint8_t *) path, strlen(path), &dir); if (ret != 0 && ret != ENOENT) { r->_errno = ret; return -1; @@ -735,7 +735,7 @@ int romfs_stat(struct _reent *r, const char *path, struct stat *st) { } romfs_file *file = NULL; - ret = searchForFile(mount, curDir, (uint8_t *) path, strlen(path), &file); + ret = searchForFile(mount, curDir, (uint8_t *) path, strlen(path), &file); if (ret != 0 && ret != ENOENT) { r->_errno = ret; return -1; @@ -751,8 +751,8 @@ int romfs_stat(struct _reent *r, const char *path, struct stat *st) { int romfs_chdir(struct _reent *r, const char *path) { romfs_mount *mount = (romfs_mount *) r->deviceData; - romfs_dir *curDir = NULL; - r->_errno = navigateToDir(mount, &curDir, &path, true); + romfs_dir *curDir = NULL; + r->_errno = navigateToDir(mount, &curDir, &path, true); if (r->_errno != 0) { return -1; } @@ -763,17 +763,17 @@ int romfs_chdir(struct _reent *r, const char *path) { DIR_ITER *romfs_diropen(struct _reent *r, DIR_ITER *dirState, const char *path) { romfs_diriter *iter = (romfs_diriter *) (dirState->dirStruct); - romfs_dir *curDir = NULL; - iter->mount = (romfs_mount *) r->deviceData; + romfs_dir *curDir = NULL; + iter->mount = (romfs_mount *) r->deviceData; r->_errno = navigateToDir(iter->mount, &curDir, &path, true); if (r->_errno != 0) { return NULL; } - iter->dir = curDir; - iter->state = 0; - iter->childDir = curDir->childDir; + iter->dir = curDir; + iter->state = 0; + iter->childDir = curDir->childDir; iter->childFile = curDir->childFile; return dirState; @@ -782,8 +782,8 @@ DIR_ITER *romfs_diropen(struct _reent *r, DIR_ITER *dirState, const char *path) int romfs_dirreset(struct _reent *r, DIR_ITER *dirState) { romfs_diriter *iter = (romfs_diriter *) (dirState->dirStruct); - iter->state = 0; - iter->childDir = iter->dir->childDir; + iter->state = 0; + iter->childDir = iter->dir->childDir; iter->childFile = iter->dir->childFile; return 0; @@ -795,7 +795,7 @@ int romfs_dirnext(struct _reent *r, DIR_ITER *dirState, char *filename, struct s if (iter->state == 0) { /* '.' entry */ memset(filestat, 0, sizeof(*filestat)); - filestat->st_ino = dir_inode(iter->mount, iter->dir); + filestat->st_ino = dir_inode(iter->mount, iter->dir); filestat->st_mode = romFS_dir_mode; strcpy(filename, "."); @@ -810,7 +810,7 @@ int romfs_dirnext(struct _reent *r, DIR_ITER *dirState, char *filename, struct s } memset(filestat, 0, sizeof(*filestat)); - filestat->st_ino = dir_inode(iter->mount, dir); + filestat->st_ino = dir_inode(iter->mount, dir); filestat->st_mode = romFS_dir_mode; strcpy(filename, ".."); @@ -828,7 +828,7 @@ int romfs_dirnext(struct _reent *r, DIR_ITER *dirState, char *filename, struct s iter->childDir = dir->sibling; memset(filestat, 0, sizeof(*filestat)); - filestat->st_ino = dir_inode(iter->mount, dir); + filestat->st_ino = dir_inode(iter->mount, dir); filestat->st_mode = romFS_dir_mode; memset(filename, 0, NAME_MAX); @@ -851,7 +851,7 @@ int romfs_dirnext(struct _reent *r, DIR_ITER *dirState, char *filename, struct s iter->childFile = file->sibling; memset(filestat, 0, sizeof(*filestat)); - filestat->st_ino = file_inode(iter->mount, file); + filestat->st_ino = file_inode(iter->mount, file); filestat->st_mode = romFS_file_mode; memset(filename, 0, NAME_MAX);