From fc3d00229997726b84ee1e7bd5fd40738d7890a4 Mon Sep 17 00:00:00 2001 From: Pat Thoyts Date: Thu, 19 Jan 2023 15:24:29 +0000 Subject: [PATCH] Added srfinfo which just reads header information. --- CMakeLists.txt | 3 ++ srfinfo.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 srfinfo.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 264d9c6..3bfd4c4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,3 +12,6 @@ set(CMAKE_C_STANDARD 11) set(SOURCE srfdump.c) add_executable(${PROJECT_NAME} ${SOURCE}) set_property(TARGET ${PROJECT_NAME} PROPERTY C_STANDARD 11) + +add_executable(srfinfo srfinfo.c) +set_property(TARGET srfinfo PROPERTY C_STANDARD 11) diff --git a/srfinfo.c b/srfinfo.c new file mode 100644 index 0000000..e1bf9f7 --- /dev/null +++ b/srfinfo.c @@ -0,0 +1,74 @@ +/* Copyright (c) 2019 Pat Thoyts users.sourceforge.net> + * + * Print out some header information from a surface file. + */ + +#include +#include +#include +#include +#include +#include "surfacefile.h" + +#ifdef WIN32 +#include +#include +#else +#include "compat/tchar.h" +#endif /* !WIN32 */ + +static int SrfInfo(const char *filename, FILE *fp) +{ + int r = 0; + SurfaceFileHeader hdr = {0}; + fread(&hdr, sizeof(SurfaceFileHeaderRev0), 1, fp); + size_t hdrsize = sizeof(SurfaceFileHeaderRev0); + if (hdr.revision > 1) + hdrsize += sizeof(SurfaceFileHeaderRev2); + if (hdr.revision > 2) + hdrsize += sizeof(SurfaceFileHeaderRev3); + if (hdr.revision > 3) + hdrsize += sizeof(SurfaceFileHeaderRev4); + if (hdr.revision > 4) + hdrsize += sizeof(SurfaceFileHeaderRev5); + fseek(fp, 0, SEEK_SET); + fread(&hdr, hdrsize, 1, fp); + + char ver[5] = { 0 }; + memcpy(ver, &hdr.fileversion, 4); + char path[1024] = { 0 }; + char *q = path; + const char *p = filename; + while (p && *p) + { + if (*p == '\\') + { + *q++ = '\\'; + } + *q++ = *p++; + } + printf("{\"Filename\":\"%s\", \"Version\":\"%s\", \"Revision\":\"%d\", \"Points\":\"%u\", \"Triangles\":\"%u\", \"Images\":\"%u\"}\n", + path, ver, hdr.revision, hdr.num_points, hdr.num_triangles, hdr.num_images); + return 0; +} + +int _tmain(int argc, TCHAR *argv[]) +{ + if (argc != 2) { + _fputts(_T("usage: srfinfo filename"), stderr); + return 1; + } + + FILE *fp = _tfopen(argv[1], _T("rb")); + if (fp == NULL) { + _tperror(_T("fopen")); + return 1; + } +#ifdef UNICODE +#error FIXME +#endif + int r = SrfInfo(argv[1], fp); + + fclose(fp); + return r; +} -- 2.23.0