![Gerald Combs](/assets/img/avatar_default.png)
Add conversions from G_GINT64_CONSTANT to INT64_C and G_GUINT64_CONSTANT to UINT64_C to convert-glib-types. Convert instances in epan/ftypes and wsutil.
127 lines
3.6 KiB
Python
Executable file
127 lines
3.6 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
# Wireshark - Network traffic analyzer
|
|
# By Gerald Combs <gerald@wireshark.org>
|
|
# Copyright 1998 Gerald Combs
|
|
#
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
'''\
|
|
convert-glib-types.py - Convert glib types to their C and C99 eqivalents.
|
|
'''
|
|
|
|
# Imports
|
|
|
|
import argparse
|
|
import glob
|
|
import platform
|
|
import re
|
|
import sys
|
|
|
|
padded_type_map = {}
|
|
|
|
type_map = {
|
|
'gboolean': 'bool',
|
|
'gchar': 'char',
|
|
'guchar': 'unsigned char',
|
|
'gint': 'int',
|
|
'guint': 'unsigned', # Matches README.developer
|
|
'glong': 'long',
|
|
'gulong': 'unsigned long',
|
|
'gint8': 'int8_t',
|
|
'gint16': 'int16_t',
|
|
'gint32': 'int32_t',
|
|
'gint64': 'int64_t',
|
|
'guint8': 'uint8_t',
|
|
'guint16': 'uint16_t',
|
|
'guint32': 'uint32_t',
|
|
'guint64': 'uint64_t',
|
|
'gfloat': 'float',
|
|
'gdouble': 'double',
|
|
'gpointer ': 'void *', # 'void *foo' instead of 'void * foo'
|
|
'gpointer': 'void *',
|
|
# Is gsize the same as size_t on the platforms we support?
|
|
# https://gitlab.gnome.org/GNOME/glib/-/issues/2493
|
|
'gsize': 'size_t',
|
|
'gssize': 'ssize_t',
|
|
}
|
|
|
|
definition_map = {
|
|
'TRUE': 'true',
|
|
'FALSE': 'false',
|
|
'G_MAXINT8': 'INT8_MAX',
|
|
'G_MAXINT16': 'INT16_MAX',
|
|
'G_MAXINT32': 'INT32_MAX',
|
|
'G_MAXINT64': 'INT64_MAX',
|
|
'G_MAXINT': 'INT_MAX',
|
|
'G_MAXUINT8': 'UINT8_MAX',
|
|
'G_MAXUINT16': 'UINT16_MAX',
|
|
'G_MAXUINT32': 'UINT32_MAX',
|
|
'G_MAXUINT64': 'UINT64_MAX',
|
|
'G_MAXUINT': 'UINT_MAX',
|
|
'G_MININT8': 'INT8_MIN',
|
|
'G_MININT16': 'INT16_MIN',
|
|
'G_MININT32': 'INT32_MIN',
|
|
'G_MININT64': 'INT64_MIN',
|
|
'G_MININT': 'INT_MIN',
|
|
'G_GINT64_CONSTANT': 'INT64_C',
|
|
'G_GUINT64_CONSTANT': 'UINT64_C',
|
|
}
|
|
|
|
format_spec_map = {
|
|
'G_GINT64_FORMAT': 'PRId64',
|
|
'G_GUINT64_FORMAT': 'PRIu64',
|
|
}
|
|
|
|
def convert_file(file):
|
|
lines = ''
|
|
try:
|
|
with open(file, 'r') as f:
|
|
lines = f.read()
|
|
for glib_type, c99_type in padded_type_map.items():
|
|
lines = lines.replace(glib_type, c99_type)
|
|
for glib_type, c99_type in type_map.items():
|
|
lines = re.sub(rf'([^"])\b{glib_type}\b([^"])', rf'\1{c99_type}\2', lines, flags=re.MULTILINE)
|
|
for glib_define, c99_define in definition_map.items():
|
|
lines = re.sub(rf'\b{glib_define}\b', rf'{c99_define}', lines, flags=re.MULTILINE)
|
|
for glib_fmt_spec, c99_fmt_spec in format_spec_map.items():
|
|
lines = re.sub(rf'\b{glib_fmt_spec}\b', rf'{c99_fmt_spec}', lines, flags=re.MULTILINE)
|
|
except IsADirectoryError:
|
|
sys.stderr.write(f'{file} is a directory.\n')
|
|
return
|
|
except UnicodeDecodeError:
|
|
sys.stderr.write(f"{file} isn't valid UTF-8.\n")
|
|
return
|
|
except:
|
|
sys.stderr.write(f'Unable to open {file}.\n')
|
|
return
|
|
|
|
with open(file, 'w') as f:
|
|
f.write(lines)
|
|
print(f'Converted {file}')
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description='Convert glib types to their C and C99 eqivalents.')
|
|
parser.add_argument('files', metavar='FILE', nargs='*')
|
|
args = parser.parse_args()
|
|
|
|
# Build a padded version of type_map which attempts to preseve alignment
|
|
for glib_type, c99_type in type_map.items():
|
|
pg_type = glib_type + ' '
|
|
pc_type = c99_type + ' '
|
|
pad_len = max(len(pg_type), len(pc_type))
|
|
padded_type_map[f'{pg_type:{pad_len}s}'] = f'{pc_type:{pad_len}s}'
|
|
|
|
files = []
|
|
if platform.system() == 'Windows':
|
|
for arg in args.files:
|
|
files += glob.glob(arg)
|
|
else:
|
|
files = args.files
|
|
|
|
for file in files:
|
|
convert_file(file)
|
|
|
|
# On with the show
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|