diff options
Diffstat (limited to 'src/lib/kStuff/kDbg/kDbgHlpCrt.cpp')
-rw-r--r-- | src/lib/kStuff/kDbg/kDbgHlpCrt.cpp | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/src/lib/kStuff/kDbg/kDbgHlpCrt.cpp b/src/lib/kStuff/kDbg/kDbgHlpCrt.cpp new file mode 100644 index 0000000..a218404 --- /dev/null +++ b/src/lib/kStuff/kDbg/kDbgHlpCrt.cpp @@ -0,0 +1,239 @@ +/* $Id: kDbgHlpCrt.cpp 77 2016-06-22 17:03:55Z bird $ */ +/** @file + * kDbg - The Debug Info Reader, Helpers, CRT Based Implementation. + */ + +/* + * Copyright (c) 2006-2007 Knut St. Osmundsen <bird-kStuff-spamix@anduin.net> + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +/******************************************************************************* +* Header Files * +*******************************************************************************/ +#include "kDbgHlp.h" +#include "kDbg.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#ifdef _MSC_VER +# include <io.h> +#endif + + + +/** + * The stdio base implementation of KDBGHLPFILE. + */ +typedef struct KDBGHLPFILE +{ + /** Pointer to the stdio file stream. */ + FILE *pStrm; +} KDBGHLPFILE; + +/** @def HAVE_FSEEKO + * Define HAVE_FSEEKO to indicate that fseeko and ftello should be used. */ +#if !defined(_MSC_VER) +# define HAVE_FSEEKO +#endif + + +void *kDbgHlpAlloc(size_t cb) +{ + return malloc(cb); +} + + +void *kDbgHlpAllocZ(size_t cb) +{ + return calloc(1, cb); +} + + +void *kDbgHlpAllocDup(const void *pv, size_t cb) +{ + void *pvNew = malloc(cb); + if (pvNew) + memcpy(pvNew, pv, cb); + return pvNew; +} + + +void *kDbgHlpReAlloc(void *pv, size_t cb) +{ + return realloc(pv, cb); +} + + +void kDbgHlpFree(void *pv) +{ + free(pv); +} + + +int kDbgHlpCrtConvErrno(int rc) +{ + switch (rc) + { + case 0: return 0; + case EINVAL: return KERR_INVALID_PARAMETER; + case ENOMEM: return KERR_NO_MEMORY; + case EISDIR: + case ENOENT: return KERR_FILE_NOT_FOUND; + default: return KERR_GENERAL_FAILURE; + } +} + + +int kDbgHlpOpenRO(const char *pszFilename, PKDBGHLPFILE *ppFile) +{ + PKDBGHLPFILE pFile = (PKDBGHLPFILE)kDbgHlpAlloc(sizeof(*pFile)); + if (!pFile) + return KERR_NO_MEMORY; + + pFile->pStrm = fopen(pszFilename, "rb"); + if (pFile->pStrm) + { + *ppFile = pFile; + return 0; + } + return kDbgHlpCrtConvErrno(errno); +} + + +void kDbgHlpClose(PKDBGHLPFILE pFile) +{ + if (pFile) + { + fclose(pFile->pStrm); + pFile->pStrm = NULL; + kDbgHlpFree(pFile); + } +} + + +uintptr_t kDbgHlpNativeFileHandle(PKDBGHLPFILE pFile) +{ + int fd = fileno(pFile->pStrm); +#ifdef _MSC_VER + return _get_osfhandle(fd); +#else + return fd; +#endif +} + + +int64_t kDbgHlpFileSize(PKDBGHLPFILE pFile) +{ + int64_t cbFile; + int64_t offCur = kDbgHlpTell(pFile); + if (offCur >= 0) + { + if (kDbgHlpSeekByEnd(pFile, 0) == 0) + cbFile = kDbgHlpTell(pFile); + else + cbFile = -1; + kDbgHlpSeek(pFile, offCur); + } + else + cbFile = -1; + return cbFile; +} + + +int kDbgHlpReadAt(PKDBGHLPFILE pFile, int64_t off, void *pv, size_t cb) +{ + int rc = kDbgHlpSeek(pFile, off); + if (!rc) + rc = kDbgHlpRead(pFile, pv, cb); + return rc; +} + + +int kDbgHlpRead(PKDBGHLPFILE pFile, void *pv, size_t cb) +{ + if (fread(pv, cb, 1, pFile->pStrm) == 1) + return 0; + return -1; +} + + +int kDbgHlpSeek(PKDBGHLPFILE pFile, int64_t off) +{ +#ifdef HAVE_FSEEKO + if (!fseeko(pFile->pStrm, off, SEEK_SET)) + return 0; +#else + long l = (long)off; + if (l != off) + return KERR_OUT_OF_RANGE; + if (!fseek(pFile->pStrm, l, SEEK_SET)) + return 0; +#endif + return kDbgHlpCrtConvErrno(errno); +} + + +int kDbgHlpSeekByCur(PKDBGHLPFILE pFile, int64_t off) +{ +#ifdef HAVE_FSEEKO + if (!fseeko(pFile->pStrm, off, SEEK_CUR)) + return 0; +#else + long l = (long)off; + if (l != off) + return KERR_OUT_OF_RANGE; + if (!fseek(pFile->pStrm, l, SEEK_CUR)) + return 0; +#endif + return kDbgHlpCrtConvErrno(errno); +} + + +int kDbgHlpSeekByEnd(PKDBGHLPFILE pFile, int64_t off) +{ +#ifdef HAVE_FSEEKO + if (!fseeko(pFile->pStrm, -off, SEEK_END)) + return 0; +#else + long l = (long)off; + if (l != off) + return KERR_OUT_OF_RANGE; + if (!fseek(pFile->pStrm, -l, SEEK_END)) + return 0; +#endif + return kDbgHlpCrtConvErrno(errno); +} + + +int64_t kDbgHlpTell(PKDBGHLPFILE pFile) +{ +#ifdef HAVE_FSEEKO + return ftello(pFile->pStrm); +#else + return ftell(pFile->pStrm); +#endif +} + |