Unbreak the umlauts

"Stephen J. Turnbull" <[email protected]> Tue, 28 Oct 2014 11:21:53 +0900
Newsgroups gmane.emacs.xemacs.patches
Message-ID <[email protected]>
APPROVE 21.5

That said, I don't like this because of the memory allocation implied,
and because I suspect my own patch was too intrusive.  The crashes
seem to be only from the PRINT_XFT_PATTERN code (at least for me).  I
don't understand why there are crashes there but not elsewhere yet.

The patch is OK for now, and I'll open an issue for it later, but I
wanted to raise the question here now so that others who have looked
at the code will be aware of it.

Steve


Michael Sperber writes:
 > 
 > This patch ...
 > 
 > 2014-10-18  Stephen J. Turnbull  <[email protected]>
 > 
 > 	* fontcolor-xlike-inc.c (xft_find_charset_font):
 > 	* fontcolor-x.c (x_font_instance_truename):
 > 
 > 	* font-mgr.c (Ffc_name_unparse):
 > 	Protect Ffc_name_unparse from FcNameUnparse crash on charset property.
 > 
 > ... caused some breakage for me.  In particular, the test whether a
 > particular font implements a charset would always fail.  The reason is
 > that fc patterns passed as arguments are modified in place.  This patch
 > fixes that.
 > 
 > I'll push on Monday if nobody objects.
 > 
 > 2014-10-25  Michael Sperber  <[email protected]>
 > 
 > 	* fontcolor-x.c (x_font_instance_truename): 
 > 	* font-mgr.c (Ffc_name_unparse): 
 > 	* font-mgr.h (PRINT_XFT_PATTERN): Don't modify
 > 	fontconfig pattern passed in in place.
 > 
 > -- 
 > Regards,
 > Mike
 > diff --git a/src/font-mgr.c b/src/font-mgr.c
 > --- a/src/font-mgr.c
 > +++ b/src/font-mgr.c
 > @@ -266,9 +266,12 @@
 >  
 >    CHECK_FC_PATTERN (pattern);
 >    /* #### Could use multiple values here to extract and return charset? */
 > -  FcPatternDel (XFC_PATTERN_PTR (pattern), FC_CHARSET);
 > -
 > -  name = FcNameUnparse (XFC_PATTERN_PTR (pattern));
 > +  {
 > +    FcPattern* temp = FcPatternDuplicate (XFC_PATTERN_PTR (pattern));
 > +    FcPatternDel (temp, FC_CHARSET);
 > +    name = FcNameUnparse (XFC_PATTERN_PTR (pattern));
 > +    FcPatternDestroy (temp);
 > +  }
 >    result = build_fcapi_string (name);
 >    xfree (name);
 >    return result;
 > diff --git a/src/font-mgr.h b/src/font-mgr.h
 > --- a/src/font-mgr.h
 > +++ b/src/font-mgr.h
 > @@ -145,8 +145,10 @@
 >    do {								\
 >      DECLARE_EISTRING (eistrpxft_name);				\
 >      Extbyte *name;						\
 > -    FcPatternDel(pattern, FC_CHARSET);				\
 > -    name = (Extbyte *) FcNameUnparse (pattern);			\
 > +    FcPattern* temp = FcPatternDuplicate (pattern);		\
 > +    FcPatternDel (temp, FC_CHARSET);				\
 > +    name = (Extbyte *) FcNameUnparse (temp);			\
 > +    FcPatternDestroy (temp);					\
 >      eicpy_ext(eistrpxft_name,					\
 >                name ? name : "FONT WITH NULL NAME",		\
 >                Qfc_font_name_encoding);				\
 > diff --git a/src/fontcolor-x.c b/src/fontcolor-x.c
 > --- a/src/fontcolor-x.c
 > +++ b/src/fontcolor-x.c
 > @@ -763,8 +763,12 @@
 >  			      "Xft font present but lacks pattern",
 >  			      wrap_font_instance(f), Qfont, errb);
 >  	}
 > -      FcPatternDel (pattern, FC_CHARSET);  /* FcNameUnparse may choke */
 > -      res = FcNameUnparse (pattern);
 > +      {
 > +	FcPattern* temp = FcPatternDuplicate (pattern);
 > +	FcPatternDel (temp, FC_CHARSET);  /* FcNameUnparse may choke */
 > +	res = FcNameUnparse (temp);
 > +	FcPatternDestroy (temp);
 > +      }
 >        if (res)
 >  	{
 >  	  FONT_INSTANCE_TRUENAME (f) = 
 > 
 > _______________________________________________
 > XEmacs-Patches mailing list
 > [email protected]
 > http://lists.xemacs.org/mailman/listinfo/xemacs-patches