mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-30 15:31:34 +00:00
f83b3c8af2
We have a couple of Python 3.x scripts that parse C files, and since C does not have any encoding, we need to force one ourselves, to avoid the case when we're running the build in a non-UTF-8 locale. https://bugzilla.gnome.org/show_bug.cgi?id=792497
109 lines
2.8 KiB
Python
Executable File
109 lines
2.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import sys
|
|
import re
|
|
import os
|
|
from collections import *
|
|
|
|
out_file = sys.argv[1]
|
|
in_files = sys.argv[2:]
|
|
|
|
|
|
file_output = """
|
|
typedef GtkWidget *(*GDoDemoFunc) (GtkWidget *do_widget);
|
|
|
|
typedef struct _Demo Demo;
|
|
|
|
struct _Demo
|
|
{
|
|
gchar *name;
|
|
gchar *title;
|
|
gchar *filename;
|
|
GDoDemoFunc func;
|
|
Demo *children;
|
|
};
|
|
|
|
"""
|
|
|
|
# Demo = namedtuple('Demo', ['name', 'title', 'file', 'func'])
|
|
|
|
demos = []
|
|
|
|
for demo_file in in_files:
|
|
filename = demo_file[demo_file.rfind('/')+1:]
|
|
demo_name = filename.replace(".c", "")
|
|
with open(demo_file, 'r', encoding='utf-8') as f:
|
|
title = f.readline().replace("/*", "").strip()
|
|
|
|
|
|
file_output += "GtkWidget *do_" + demo_name + " (GtkWidget *do_widget);\n"
|
|
# demos += Demo(name = demo_name,
|
|
# title = title,
|
|
# file = demo_file,
|
|
# func = "do_" + title)
|
|
demos.append((demo_name, title, filename, "do_" + demo_name, -1))
|
|
|
|
# Generate a List of "Parent names"
|
|
parents = []
|
|
parent_ids = []
|
|
parent_index = 0
|
|
for demo in demos:
|
|
if "/" in demo[1]:
|
|
slash_index = demo[1].index('/')
|
|
parent_name = demo[1][:slash_index]
|
|
do_break = False
|
|
|
|
# Check for duplicates
|
|
if not parent_name in parents:
|
|
parents.append(parent_name)
|
|
parent_ids.append(parent_index)
|
|
demos.append(("NULL", parent_name, "NULL", "NULL", parent_index))
|
|
|
|
parent_index = parent_index + 1
|
|
|
|
|
|
# For every child with a parent, generate a list of child demos
|
|
i = 0
|
|
for parent in parents:
|
|
id = parent_ids[i]
|
|
file_output += "\nDemo child" + str(id) + "[] = {\n"
|
|
# iterate over all demos and check if the name starts with the given parent name
|
|
for child in demos:
|
|
if child[1].startswith(parent + "/"):
|
|
title = child[1][child[1].rfind('/') + 1:]
|
|
file_output += " { \"" + child[0] + "\", \"" + title + "\", \"" + child[2] + "\", " + child[3] + ", NULL },\n"
|
|
|
|
|
|
file_output += " { NULL }\n};\n"
|
|
i = i + 1
|
|
|
|
|
|
# Sort demos by title
|
|
demos = sorted(demos, key=lambda x: x[1])
|
|
|
|
file_output += "\nDemo gtk_demos[] = {\n"
|
|
for demo in demos:
|
|
# Do not generate one of these for demos with a parent demo
|
|
if "/" not in demo[1]:
|
|
child_array = "NULL"
|
|
name = demo[0];
|
|
title = demo[1];
|
|
file = demo[2]
|
|
if name != "NULL":
|
|
name = "\"" + name + "\""
|
|
if title != "NULL":
|
|
title = "\"" + title + "\""
|
|
if file != "NULL":
|
|
file = "\"" + file + "\""
|
|
|
|
if demo[4] != -1:
|
|
child_array = "child" + str(demo[4])
|
|
file_output += " { " + name + ", " + title + ", " + file + ", " + demo[3] + ", " + child_array + " },\n"
|
|
|
|
file_output += " { NULL }\n};\n"
|
|
|
|
ofile = open(out_file, "w")
|
|
ofile.write(file_output)
|
|
ofile.close()
|