]> git.eshelyaron.com Git - emacs.git/commitdiff
(x_to_w32_color): Fix argument to alloca.
authorAndrew Innes <andrewi@gnu.org>
Thu, 4 Oct 2001 17:14:01 +0000 (17:14 +0000)
committerAndrew Innes <andrewi@gnu.org>
Thu, 4 Oct 2001 17:14:01 +0000 (17:14 +0000)
(w32_load_system_font): Don't believe what GetLanguageFontInfo
says; query codepage info directly to determine if font is double
byte.
(x_to_w32_charset): Handle private format for unknown charsets.
Handle wildcards in charset spec, by ignoring them.
(w32_codepage_for_font): Fix argument to alloca.  Don't remove
"*-" prefix from charset.
(x_to_w32_font): Enlarge remainder array for safety.  Specifically
handle the truncated font spec form constructed by font_list_1, so
that we correctly identify the charset fields.  Don't remove "*-"
prefix from charset.
(w32_list_synthesized_fonts): Fix argument to alloca.

src/w32fns.c

index a1c79a07831762b58ebf2ab7a515d0f5f82e0133..5173a25fe938edd12a93890770451c31d040fe0b 100644 (file)
@@ -1646,7 +1646,7 @@ x_to_w32_color (colorname)
 
       if (isdigit (colorname[len - 1])) 
        {
-         char *ptr, *approx = alloca (len);
+         char *ptr, *approx = alloca (len + 1);
 
          strcpy (approx, colorname);
          ptr = &approx[len - 1];
@@ -5625,7 +5625,18 @@ w32_load_system_font (f,fontname,size)
         if (codepage == CP_UNICODE)
           font->double_byte_p = 1;
         else
-          font->double_byte_p = GetFontLanguageInfo(hdc) & GCP_DBCS;
+         {
+           /* Unfortunately, some fonts (eg. MingLiU, a big5 ttf font)
+               don't report themselves as double byte fonts, when
+               patently they are.  So instead of trusting
+               GetFontLanguageInfo, we check the properties of the
+               codepage directly, since that is ultimately what we are
+               working from anyway.  */
+           /* font->double_byte_p = GetFontLanguageInfo(hdc) & GCP_DBCS; */
+           CPINFO cpi = {0};
+           GetCPInfo (codepage, &cpi);
+           font->double_byte_p = cpi.MaxCharSize > 1;
+         }
 
        SelectObject (hdc, oldobj);
        ReleaseDC (dpyinfo->root_window, hdc);
@@ -5846,17 +5857,30 @@ x_to_w32_charset (lpcs)
     char * lpcs;
 {
   Lisp_Object this_entry, w32_charset;
+  char *charset;
+  int len = strlen (lpcs);
+
+  /* Support "*-#nnn" format for unknown charsets.  */
+  if (strncmp (lpcs, "*-#", 3) == 0)
+    return atoi (lpcs + 3);
+
+  /* Handle wildcards by ignoring them; eg. treat "big5*-*" as "big5".  */
+  charset = alloca (len + 1);
+  strcpy (charset, lpcs);
+  lpcs = strchr (charset, '*');
+  if (lpcs)
+    *lpcs = 0;
 
   /* Look through w32-charset-info-alist for the character set.
      Format of each entry is
        (CHARSET_NAME . (WINDOWS_CHARSET . CODEPAGE)).
   */
-  this_entry = Fassoc (build_string(lpcs), Vw32_charset_info_alist);
+  this_entry = Fassoc (build_string(charset), Vw32_charset_info_alist);
 
   if (NILP(this_entry))
     {
       /* At startup, we want iso8859-1 fonts to come up properly. */
-      if (stricmp(lpcs, "iso8859-1") == 0)
+      if (stricmp(charset, "iso8859-1") == 0)
         return ANSI_CHARSET;
       else
         return DEFAULT_CHARSET;
@@ -6088,13 +6112,15 @@ w32_codepage_for_font (char *fontname)
   if (!charset)
     return CP_UNKNOWN;
 
-  charset_str = (char *) alloca (strlen (charset));
+  charset_str = (char *) alloca (strlen (charset) + 1);
   strcpy (charset_str, charset);
 
+#if 0
   /* Remove leading "*-".  */
   if (strncmp ("*-", charset_str, 2) == 0)
     charset = charset_str + 2;
   else
+#endif
     charset = charset_str;
 
   /* Stop match at wildcard (including preceding '-'). */
@@ -6250,20 +6276,33 @@ x_to_w32_font (lpxstr, lplogfont)
     {
       int fields, tem;
       char name[50], weight[20], slant, pitch, pixels[10], height[10],
-        width[10], resy[10], remainder[20];
+        width[10], resy[10], remainder[50];
       char * encoding;
       int dpi = one_w32_display_info.resy;
 
       fields = sscanf (lpxstr,
-                      "-%*[^-]-%49[^-]-%19[^-]-%c-%*[^-]-%*[^-]-%9[^-]-%9[^-]-%*[^-]-%9[^-]-%c-%9[^-]-%19s",
+                      "-%*[^-]-%49[^-]-%19[^-]-%c-%*[^-]-%*[^-]-%9[^-]-%9[^-]-%*[^-]-%9[^-]-%c-%9[^-]-%49s",
                       name, weight, &slant, pixels, height, resy, &pitch, width, remainder);
-      if (fields == EOF) return (FALSE);
-
-      /* If wildcards cover more than one field, we don't know which
-         field is which, so don't fill any in.  */
-
-      if (fields < 9)
-        fields = 0;
+      if (fields == EOF)
+       return (FALSE);
+
+      /* In the general case when wildcards cover more than one field,
+        we don't know which field is which, so don't fill any in.
+        However, we need to cope with this particular form, which is
+        generated by font_list_1 (invoked by try_font_list):
+            "-raster-6x10-*-gb2312*-*"
+        and make sure to correctly parse the charset field.  */
+      if (fields == 3)
+       {
+         fields = sscanf (lpxstr,
+                          "-%*[^-]-%49[^-]-*-%49s",
+                          name, remainder);
+       }
+      else if (fields < 9)
+       {
+         fields = 0;
+         remainder[0] = 0;
+       }
 
       if (fields > 0 && name[0] != '*')
         {
@@ -6331,9 +6370,11 @@ x_to_w32_font (lpxstr, lplogfont)
          remainder[len-1] = 0;
       }
       encoding = remainder;
+#if 0
       if (strncmp (encoding, "*-", 2) == 0)
        encoding += 2;
-      lplogfont->lfCharSet = x_to_w32_charset (fields > 0 ? encoding : "");
+#endif
+      lplogfont->lfCharSet = x_to_w32_charset (encoding);
     }
   else
     {
@@ -6953,7 +6994,7 @@ w32_list_synthesized_fonts (f, pattern, size, max_names)
 
   full_pattn = XSTRING (pattern)->data;
 
-  pattn_part2 = alloca (XSTRING (pattern)->size);
+  pattn_part2 = alloca (XSTRING (pattern)->size + 1);
   /* Allow some space for wildcard expansion.  */
   new_pattn = alloca (XSTRING (pattern)->size + 100);