+ MXFont font;
+ MFont *bfont = NULL;
+
+ plist = mplist_get (font_list, registry);
+ if (plist)
+ return plist;
+ plist = mplist ();
+ mplist_add (font_list, registry, plist);
+ sprintf (pattern, "-*-*-*-*-*-*-*-*-*-*-*-*-%s", msymbol_name (registry));
+ font_names = XListFonts (disp_info->display, pattern, 0x8000, &nfonts);
+ if (nfonts == 0)
+ return plist;
+ names = alloca (sizeof (char *) * nfonts);
+ memcpy (names, font_names, sizeof (char *) * nfonts);
+ qsort (names, nfonts, sizeof (char *), font_compare);
+ for (i = 0, p = NULL; i < nfonts; i++)
+ if (mfont__parse_name_into_font (names[i], Mx, (MFont *) &font) == 0
+ && (font.core.property[MFONT_SIZE] > 0
+ || font.core.property[MFONT_RESY] == 0))
+ {
+ MSymbol family = FONT_PROPERTY ((MFont *) &font, MFONT_FAMILY);
+ MXFontList *xfont_table;
+ int sizes[256];
+ int sizes_idx = 0;
+ int size, smallest, largest;
+ int have_scalable;
+ unsigned int size_bits = 0;
+ char *base_end;
+ int base_len;
+ int fields;
+
+ if (p && MPLIST_KEY (p) != family)
+ p = mplist_find_by_key (plist, family);
+ if (p)
+ xfont_table = MPLIST_VAL (p);
+ else
+ {
+ p = plist;
+ MSTRUCT_MALLOC (xfont_table, MERROR_WIN);
+ MLIST_INIT1 (xfont_table, fonts, 4);
+ mplist_push (p, family, xfont_table);
+ }