/* Copyright (c) 2013-2015 Jeffrey Pfau * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "vfs.h" ssize_t VFileReadline(struct VFile* vf, char* buffer, size_t size) { size_t bytesRead = 0; while (bytesRead < size - 1) { size_t newRead = vf->read(vf, &buffer[bytesRead], 1); bytesRead += newRead; if (!newRead || buffer[bytesRead] == '\n') { break; } } return buffer[bytesRead] = '\0'; } struct VFile* VDirOptionalOpenFile(struct VDir* dir, const char* realPath, const char* prefix, const char* suffix, int mode) { char path[PATH_MAX]; path[PATH_MAX - 1] = '\0'; struct VFile* vf; if (!dir) { if (!realPath) { return 0; } char* dotPoint = strrchr(realPath, '.'); if (dotPoint - realPath + 1 >= PATH_MAX - 1) { return 0; } if (dotPoint > strrchr(realPath, '/')) { int len = dotPoint - realPath; strncpy(path, realPath, len); path[len] = 0; strncat(path + len, suffix, PATH_MAX - len - 1); } else { snprintf(path, PATH_MAX - 1, "%s%s", realPath, suffix); } vf = VFileOpen(path, mode); } else { snprintf(path, PATH_MAX - 1, "%s%s", prefix, suffix); vf = dir->openFile(dir, path, mode); } return vf; }