Couche de compatibilité : shim GLib et en-têtes réduits
engine/compat/ remplace ce que le cœur de gnubg attend du reste de gnubg et de GLib : config.h écrit à la main (sans threads, C générique, NEON prévu), shim GLib minimal (dont un analyseur XML pour les tables d'équité et mmap pour les bases de fin de partie), en-têtes réduits et fonctions de support. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
792f6395bf
commit
42bfb6506d
@@ -0,0 +1,212 @@
|
||||
/*
|
||||
* glib.h -- shim minimal de GLib pour le moteur embarqué d'Ustagammon.
|
||||
*
|
||||
* Copyright (C) 2026 les auteurs d'Ustagammon.
|
||||
* Licence : GPLv3 ou ultérieure (voir LICENSE).
|
||||
*
|
||||
* Le cœur de GNU Backgammon repris dans engine/gnubg/ utilise une petite
|
||||
* partie de GLib. Plutôt que d'embarquer GLib entière (taille, portage Android
|
||||
* et WebAssembly), ce fichier en fournit le sous-ensemble utilisé, avec le
|
||||
* même comportement observable pour le moteur. Implémentation :
|
||||
* engine/compat/glib-shim.c.
|
||||
*
|
||||
* Écarts assumés avec GLib :
|
||||
* - g_print écrit sur la sortie d'erreur (et non la sortie standard), pour ne
|
||||
* jamais mêler de messages de diagnostic à la sortie JSON d'engine-cli ;
|
||||
* - GMarkup ne reconnaît que le XML simple des tables d'équité de match
|
||||
* (éléments, attributs, texte, commentaires, prologue, DOCTYPE, entités
|
||||
* prédéfinies et numériques) ; pas de CDATA ni d'instructions dans le texte ;
|
||||
* - g_error et l'échec d'allocation interrompent le programme (abort), comme
|
||||
* GLib : ces chemins signalent des erreurs internes, pas des erreurs
|
||||
* d'utilisation ;
|
||||
* - ni threads, ni atomiques, ni listes GLib : le moteur est compilé sans
|
||||
* USE_MULTITHREAD.
|
||||
*
|
||||
* Ce fichier ne sert qu'au moteur embarqué. Les outils de génération de
|
||||
* données (makeweights, makebearoff) sont compilés avec la vraie GLib.
|
||||
*/
|
||||
|
||||
#ifndef USTAGAMMON_GLIB_SHIM_H
|
||||
#define USTAGAMMON_GLIB_SHIM_H
|
||||
|
||||
#include <float.h>
|
||||
#include <limits.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <alloca.h>
|
||||
|
||||
/* Types de base. */
|
||||
typedef char gchar;
|
||||
typedef unsigned char guchar;
|
||||
typedef int gint;
|
||||
typedef unsigned int guint;
|
||||
typedef int gboolean;
|
||||
typedef short gshort;
|
||||
typedef unsigned short gushort;
|
||||
typedef long glong;
|
||||
typedef unsigned long gulong;
|
||||
typedef float gfloat;
|
||||
typedef double gdouble;
|
||||
typedef void *gpointer;
|
||||
typedef const void *gconstpointer;
|
||||
typedef size_t gsize;
|
||||
typedef ptrdiff_t gssize;
|
||||
typedef int8_t gint8;
|
||||
typedef uint8_t guint8;
|
||||
typedef int16_t gint16;
|
||||
typedef uint16_t guint16;
|
||||
typedef int32_t gint32;
|
||||
typedef uint32_t guint32;
|
||||
typedef int64_t gint64;
|
||||
typedef uint64_t guint64;
|
||||
|
||||
#ifndef FALSE
|
||||
#define FALSE (0)
|
||||
#endif
|
||||
#ifndef TRUE
|
||||
#define TRUE (!FALSE)
|
||||
#endif
|
||||
|
||||
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
||||
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
||||
|
||||
#define G_PI 3.1415926535897932384626433832795028841971693993751
|
||||
#define G_PI_2 1.5707963267948966192313216916397514420985846996876
|
||||
#define G_GSIZE_FORMAT "zu"
|
||||
#define G_STRINGIFY_ARG(x) #x
|
||||
#define G_STRINGIFY(x) G_STRINGIFY_ARG(x)
|
||||
#define G_STRLOC __FILE__ ":" G_STRINGIFY(__LINE__)
|
||||
|
||||
/*
|
||||
* Version de GLib imitée : 2.84 (celle de Debian trixie), pour que le code
|
||||
* de gnubg choisisse les mêmes branches qu'avec la vraie bibliothèque
|
||||
* (g_memdup2 plutôt que g_memdup, par exemple).
|
||||
*/
|
||||
#define GLIB_MAJOR_VERSION 2
|
||||
#define GLIB_MINOR_VERSION 84
|
||||
#define GLIB_MICRO_VERSION 0
|
||||
#define GLIB_CHECK_VERSION(major, minor, micro) \
|
||||
(GLIB_MAJOR_VERSION > (major) || \
|
||||
(GLIB_MAJOR_VERSION == (major) && GLIB_MINOR_VERSION > (minor)) || \
|
||||
(GLIB_MAJOR_VERSION == (major) && GLIB_MINOR_VERSION == (minor) && \
|
||||
GLIB_MICRO_VERSION >= (micro)))
|
||||
|
||||
/* Assertions : désactivées par G_DISABLE_ASSERT, comme dans le build officiel. */
|
||||
void ustagammon_g_assert_failed(const char *expr, const char *file, int line);
|
||||
|
||||
#if defined(G_DISABLE_ASSERT)
|
||||
#define g_assert(expr) ((void) 0)
|
||||
#define g_assert_not_reached() ((void) 0)
|
||||
#else
|
||||
#define g_assert(expr) \
|
||||
((expr) ? (void) 0 : ustagammon_g_assert_failed(#expr, __FILE__, __LINE__))
|
||||
#define g_assert_not_reached() \
|
||||
ustagammon_g_assert_failed("code inatteignable", __FILE__, __LINE__)
|
||||
#endif
|
||||
|
||||
#define g_return_val_if_fail(expr, val) \
|
||||
do { if (!(expr)) { \
|
||||
g_warning("%s : condition « %s » fausse", G_STRLOC, #expr); \
|
||||
return (val); } } while (0)
|
||||
#define g_return_if_fail(expr) \
|
||||
do { if (!(expr)) { \
|
||||
g_warning("%s : condition « %s » fausse", G_STRLOC, #expr); \
|
||||
return; } } while (0)
|
||||
|
||||
/* Mémoire. */
|
||||
gpointer g_malloc(gsize n);
|
||||
gpointer g_malloc0(gsize n);
|
||||
void g_free(gpointer p);
|
||||
gpointer g_memdup2(gconstpointer mem, gsize n);
|
||||
gchar *g_strdup(const gchar *s);
|
||||
#define g_new(type, n) ((type *) g_malloc(sizeof(type) * (gsize) (n)))
|
||||
#define g_new0(type, n) ((type *) g_malloc0(sizeof(type) * (gsize) (n)))
|
||||
#define g_alloca(size) alloca(size)
|
||||
|
||||
/* Messages. */
|
||||
void g_print(const gchar *format, ...) __attribute__((format(printf, 1, 2)));
|
||||
void g_printerr(const gchar *format, ...) __attribute__((format(printf, 1, 2)));
|
||||
void g_warning(const gchar *format, ...) __attribute__((format(printf, 1, 2)));
|
||||
void g_error(const gchar *format, ...) __attribute__((format(printf, 1, 2), noreturn));
|
||||
|
||||
/* Chaînes. */
|
||||
gdouble g_ascii_strtod(const gchar *nptr, gchar **endptr);
|
||||
guint64 g_ascii_strtoull(const gchar *nptr, gchar **endptr, guint base);
|
||||
gint g_ascii_strcasecmp(const gchar *s1, const gchar *s2);
|
||||
gint g_ascii_strncasecmp(const gchar *s1, const gchar *s2, gsize n);
|
||||
const gchar *g_strerror(gint errnum);
|
||||
gchar *g_build_filename(const gchar *first, ...);
|
||||
gsize g_strlcpy(gchar *dest, const gchar *src, gsize dest_size);
|
||||
|
||||
/* GString : seul le type est utilisé (structures FIBS de drawboard.c). */
|
||||
typedef struct {
|
||||
gchar *str;
|
||||
gsize len;
|
||||
gsize allocated_len;
|
||||
} GString;
|
||||
|
||||
/* Erreurs. */
|
||||
typedef guint32 GQuark;
|
||||
typedef struct {
|
||||
GQuark domain;
|
||||
gint code;
|
||||
gchar *message;
|
||||
} GError;
|
||||
|
||||
void g_error_free(GError *error);
|
||||
|
||||
/* Fichiers. */
|
||||
typedef enum {
|
||||
G_FILE_TEST_IS_REGULAR = 1 << 0,
|
||||
G_FILE_TEST_IS_SYMLINK = 1 << 1,
|
||||
G_FILE_TEST_IS_DIR = 1 << 2,
|
||||
G_FILE_TEST_IS_EXECUTABLE = 1 << 3,
|
||||
G_FILE_TEST_EXISTS = 1 << 4
|
||||
} GFileTest;
|
||||
|
||||
gboolean g_file_test(const gchar *filename, GFileTest test);
|
||||
gboolean g_file_get_contents(const gchar *filename, gchar **contents, gsize *length, GError **error);
|
||||
|
||||
/* Fichier projeté en mémoire (bases de fin de partie .bd). */
|
||||
typedef struct UstagammonMappedFile GMappedFile;
|
||||
|
||||
GMappedFile *g_mapped_file_new(const gchar *filename, gboolean writable, GError **error);
|
||||
gchar *g_mapped_file_get_contents(GMappedFile *file);
|
||||
gsize g_mapped_file_get_length(GMappedFile *file);
|
||||
void g_mapped_file_unref(GMappedFile *file);
|
||||
|
||||
/* Analyseur XML simple (tables d'équité de match). */
|
||||
typedef struct UstagammonMarkupParseContext GMarkupParseContext;
|
||||
typedef void (*GDestroyNotify)(gpointer data);
|
||||
|
||||
typedef enum {
|
||||
G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG = 1 << 0,
|
||||
G_MARKUP_TREAT_CDATA_AS_TEXT = 1 << 1,
|
||||
G_MARKUP_PREFIX_ERROR_POSITION = 1 << 2,
|
||||
G_MARKUP_IGNORE_QUALIFIED = 1 << 3
|
||||
} GMarkupParseFlags;
|
||||
|
||||
typedef struct {
|
||||
void (*start_element)(GMarkupParseContext *context, const gchar *element_name,
|
||||
const gchar **attribute_names, const gchar **attribute_values,
|
||||
gpointer user_data, GError **error);
|
||||
void (*end_element)(GMarkupParseContext *context, const gchar *element_name,
|
||||
gpointer user_data, GError **error);
|
||||
void (*text)(GMarkupParseContext *context, const gchar *text, gsize text_len,
|
||||
gpointer user_data, GError **error);
|
||||
void (*passthrough)(GMarkupParseContext *context, const gchar *passthrough_text,
|
||||
gsize text_len, gpointer user_data, GError **error);
|
||||
void (*error)(GMarkupParseContext *context, GError *error, gpointer user_data);
|
||||
} GMarkupParser;
|
||||
|
||||
GMarkupParseContext *g_markup_parse_context_new(const GMarkupParser *parser, GMarkupParseFlags flags,
|
||||
gpointer user_data, GDestroyNotify user_data_dnotify);
|
||||
gboolean g_markup_parse_context_parse(GMarkupParseContext *context, const gchar *text,
|
||||
gssize text_len, GError **error);
|
||||
void g_markup_parse_context_free(GMarkupParseContext *context);
|
||||
|
||||
#endif /* USTAGAMMON_GLIB_SHIM_H */
|
||||
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* glib/gi18n.h -- shim minimal de GLib (voir ../glib.h).
|
||||
*
|
||||
* Copyright (C) 2026 les auteurs d'Ustagammon.
|
||||
* Licence : GPLv3 ou ultérieure (voir LICENSE).
|
||||
*
|
||||
* Pas de traduction dans le moteur : les messages de gnubg restent en
|
||||
* anglais et ne sont destinés qu'aux journaux de diagnostic.
|
||||
*/
|
||||
|
||||
#ifndef USTAGAMMON_GLIB_GI18N_H
|
||||
#define USTAGAMMON_GLIB_GI18N_H
|
||||
|
||||
#include "../glib.h"
|
||||
|
||||
#define _(s) (s)
|
||||
#define N_(s) (s)
|
||||
#define gettext(s) (s)
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,14 @@
|
||||
/*
|
||||
* glib/gprintf.h -- shim minimal de GLib (voir ../glib.h).
|
||||
*
|
||||
* Copyright (C) 2026 les auteurs d'Ustagammon.
|
||||
* Licence : GPLv3 ou ultérieure (voir LICENSE).
|
||||
*/
|
||||
|
||||
#ifndef USTAGAMMON_GLIB_GPRINTF_H
|
||||
#define USTAGAMMON_GLIB_GPRINTF_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include "../glib.h"
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* glib/gstdio.h -- shim minimal de GLib (voir ../glib.h).
|
||||
*
|
||||
* Copyright (C) 2026 les auteurs d'Ustagammon.
|
||||
* Licence : GPLv3 ou ultérieure (voir LICENSE).
|
||||
*/
|
||||
|
||||
#ifndef USTAGAMMON_GLIB_GSTDIO_H
|
||||
#define USTAGAMMON_GLIB_GSTDIO_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include "../glib.h"
|
||||
|
||||
#define g_fopen fopen
|
||||
#define g_unlink unlink
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user