Bonjour tout le monde,
Je jouais avec fontconfig quand m'est venu l'envie de séparer l'ensemble de mon code (j'avais tout mis dans main()) en petit fonctions. Et voilà le problème: fontconfig refuse de fonctionner correctement hors de main(). Même si je mets tout dans une fonction main2 ayant la même signature que main, et que main ne contient que return main2(argc, argv), ça ne marche pas (en fait, il ne remplit pas la variable res, c'est pour ça que l'assertion res == FcFontMatch échoue). Essayez le code ci-dessous succesivement avec BUG non défini (tout le code est alors dans la fonction main()) puis avec BUG défini (le code est dans une fonction main2 appelée par main)
#include <stdlib.h>
#include <assert.h>
#include <fontconfig/fontconfig.h>
#ifdef BUG
# define FUNC_NAME main2
#else
# define FUNC_NAME main
#endif
int FUNC_NAME(int argc, char** argv) {
assert(FcInit() == FcTrue);
FcConfig *fc = FcConfigGetCurrent();
assert(fc != NULL);
FcPattern *pattern, *font_pat;
FcResult res;
pattern = FcPatternCreate();
assert(FcPatternAddString(pattern, FC_FAMILY, (FcChar8*)"Monospace") == FcTrue);
assert(FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_NORMAL) == FcTrue);
assert(FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN) == FcTrue);
assert(FcConfigSubstitute(fc, pattern, FcMatchFont) == FcTrue);
FcDefaultSubstitute(pattern);
font_pat = FcFontMatch(fc, pattern, &res);
assert(res == FcResultMatch);
FcPatternPrint(font_pat);
FcPatternDestroy(pattern);
FcPatternDestroy(font_pat);
FcConfigDestroy(fc);
FcFini();
return 0;
}
#ifdef BUG
int main(int argc, char** argv) {
return FUNC_NAME(argc, argv);
}
#endif
Une idée de la provenance de ce bug étrange ?
Merci d'avance :)
# chez moi...
Posté par Nicolas Bernard (site web personnel) . Évalué à 2.
# Un début de solution...
Posté par jlh . Évalué à 2.
Si on l'initialise à -1, elle reste toujours à -1 et l'assertion n'est jamais vérifiée.
Dans ton programme, la variable res est initialisée à 0 dans un cas, ce qui correspond à FcResultMatch et ça marche, et dans l'autre cas, res est initialisée à une autre valeur et ça ne marche plus.
Ça doit être lié à l'état de la pile du programme où sont stockées les variables, ou à gcc ...
[^] # Re: Un début de solution...
Posté par Moonz . Évalué à 1.
A votre avis, c'est un bug que je devais reporter+corriger, ou j'ai mal lu la documentation quelque part ? (parce que quand même, si c'était un bug, c'est assez gros, ça m'étonnerais que personne l'ai trouvé avant... Et j'ai beau relire la doc de la fonction FcFontMatch, il ne dit pas qu'on doit affecter la variable result à FcMatch avant l'appel à la fonction...)
[^] # Re: Un début de solution...
Posté par jlh . Évalué à 1.
Ils se contentent de vérifier que le pointeur "font_pat" n'est pas nul au retour de la fonction.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.