#!/usr/bin/env python3

# Copyright 2021 Collabora, Ltd.
#
# 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 (including the
# next paragraph) 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.

# Helper script that reads drm_fourcc.h and writes a static table with the
# simpler format token modifiers

import sys
import re

filename = sys.argv[1]
towrite = sys.argv[2]

fm_re = {
    'intel': r'^#define I915_FORMAT_MOD_(\w+)',
    'others': r'^#define DRM_FORMAT_MOD_((?:ARM|SAMSUNG|QCOM|VIVANTE|NVIDIA|BROADCOM|ALLWINNER)\w+)\s',
    'vendors': r'^#define DRM_FORMAT_MOD_VENDOR_(\w+)'
}

def print_fm_intel(f, f_mod):
    f.write('    {{ DRM_MODIFIER_INTEL({}, {}) }},\n'.format(f_mod, f_mod))

# generic write func
def print_fm(f, vendor, mod, f_name):
    f.write('    {{ DRM_MODIFIER({}, {}, {}) }},\n'.format(vendor, mod, f_name))

with open(filename, "r") as f:
    data = f.read()
    for k, v in fm_re.items():
        fm_re[k] = re.findall(v, data, flags=re.M)

with open(towrite, "w") as f:
    f.write('''\
/* AUTOMATICALLY GENERATED by gen_table_fourcc.py. You should modify
   that script instead of adding here entries manually! */
static const struct drmFormatModifierInfo drm_format_modifier_table[] = {
''')
    f.write('    { DRM_MODIFIER_INVALID(NONE, INVALID_MODIFIER) },\n')
    f.write('    { DRM_MODIFIER_LINEAR(NONE, LINEAR) },\n')

    for entry in fm_re['intel']:
        print_fm_intel(f, entry)

    for entry in fm_re['others']:
        (vendor, mod) = entry.split('_', 1)
        if vendor == 'ARM' and (mod == 'TYPE_AFBC' or mod == 'TYPE_MISC' or mod == 'TYPE_AFRC'):
            continue
        print_fm(f, vendor, mod, mod)

    f.write('''\
};
''')

    f.write('''\
static const struct drmFormatModifierVendorInfo drm_format_modifier_vendor_table[] = {
''')

    for entry in fm_re['vendors']:
        f.write("    {{ DRM_FORMAT_MOD_VENDOR_{}, \"{}\" }},\n".format(entry, entry))

    f.write('''\
};
''')
