// XXX: This program is not in sync with EDuke32 (e.g. texcacheheader type).

#include "compat.h"
#include <dirent.h>

#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT   0x83F0
#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT  0x83F1
#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT  0x83F2
#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT  0x83F3

typedef struct {
    char magic[8];    // 'Polymost'
    int xdim, ydim;    // of image, unpadded
    int flags;        // 1 = !2^x, 2 = has alpha, 4 = lzw compressed
} texcacheheader;
typedef struct {
    int size;
    int format;
    int xdim, ydim;    // of mipmap (possibly padded)
    int border, depth;
} texcachepicture;

int main(void)
{
    DIR *dir;
    struct dirent *dirent;
    struct stat st;
    FILE *fp;
    texcacheheader head;
    texcachepicture mip;

    dir = opendir(".");
    while ((dirent = readdir(dir))) {
        if (stat(dirent->d_name, &st)) {
            printf("%s: failed to stat\n", dirent->d_name);
            continue;
        }
        if (!(st.st_mode&S_IFREG)) {
            printf("%s: not a regular file\n", dirent->d_name);
            continue;
        }

        fp = fopen(dirent->d_name,"rb");
        if (!fp) {
            printf("%s: failed to open\n", dirent->d_name);
            continue;
        }

        if (fread(&head, sizeof(head), 1, fp) != 1) {
            fclose(fp);
            printf("%s: failed to read header\n", dirent->d_name);
            continue;
        }
        head.xdim = B_LITTLE32(head.xdim);
        head.ydim = B_LITTLE32(head.ydim);
        head.flags = B_LITTLE32(head.flags);
        if (fread(&mip, sizeof(mip), 1, fp) != 1) {
            fclose(fp);
            printf("%s: failed to read mipmap header\n", dirent->d_name);
            continue;
        }
        mip.format = B_LITTLE32(mip.format);
        fclose(fp);
        if (memcmp(head.magic, "Polymost", 8)) {
            printf("%s: bad signature\n", dirent->d_name);
            continue;
        }
        else {
            char const * format;
            char flags[4] = "", flagsc = 0;
            switch (mip.format) {
                case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: format = "RGB DXT1"; break;
                case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: format = "RGBA DXT1"; break;
                case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: format = "RGBA DXT3"; break;
                case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: format = "RGBA DXT5"; break;
                default: format = "Unknown"; break;
            }
            if (head.flags&1) flags[flagsc++] = '2';
            if (head.flags&2) flags[flagsc++] = 'A';
            if (head.flags&4) flags[flagsc++] = 'L';
            flags[flagsc++] = 0;

            printf("%s: flags=%s format=%s\n", dirent->d_name, flags, format);
        }
    }
    closedir(dir);

    return 0;
}
