Added srfinfo which just reads header information.
authorPat Thoyts <patthoyts@users.sourceforge.net>
Thu, 19 Jan 2023 15:24:29 +0000 (15:24 +0000)
committerPat Thoyts <patthoyts@users.sourceforge.net>
Thu, 19 Jan 2023 15:24:29 +0000 (15:24 +0000)
CMakeLists.txt
srfinfo.c [new file with mode: 0644]

index 264d9c6efff3976ee03c481d0d89927b21d8fde9..3bfd4c436df26f1771476ec7b39f3140f60442c3 100644 (file)
@@ -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 (file)
index 0000000..e1bf9f7
--- /dev/null
+++ b/srfinfo.c
@@ -0,0 +1,74 @@
+/* Copyright (c) 2019 Pat Thoyts <patthoyts>users.sourceforge.net>
+ *
+ * Print out some header information from a surface file.
+ */
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <assert.h>
+#include "surfacefile.h"
+
+#ifdef WIN32
+#include <direct.h>
+#include <tchar.h>
+#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;
+}