*** empty log message ***
[m17n/m17n-test.git] / findfont.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #include <m17n-gui.h>
6 #include <m17n-misc.h>
7
8 void
9 help ()
10 {
11   printf ("Usage: findfont [FONT-SPEC]\n");
12   printf ("FONT-SPEC::=[FAMILY][:script=SCRIPT][:lang=LANG][:otf=OTFSPEC]\n");
13   exit (1);
14 }
15
16 MSymbol
17 make_symbol (char *str, int len)
18 {
19   char *p = alloca (len + 1);
20
21   memcpy (p, str, len);
22   p[len] = '\0';
23   return msymbol (p);
24 }
25
26 MFont *
27 parse_font_name (char *str)
28 {
29   MFont *font = mfont ();
30   char *p;
31
32   if (*str != ':')
33     {
34       for (p = str + 1; *p && *p != ':'; p++);
35       mfont_put_prop (font, Mfamily, make_symbol (str, p - str));
36       str = p;
37     }
38   while (*str == ':')
39     {
40       str++;
41       if (strncmp (str, "script=", 7) == 0)
42         {
43           str += 7;
44           for (p = str; *p && *p != ':'; p++);
45           mfont_put_prop (font, Mscript, make_symbol (str, p - str));
46         }
47       else if (strncmp (str, "lang=", 5) == 0)
48         {
49           str += 5;
50           for (p = str; *p && *p != ':'; p++);
51           mfont_put_prop (font, Mlanguage, make_symbol (str, p - str));
52         }
53       else if (strncmp (str, "otf=", 4) == 0)
54         {
55           str += 4;
56           for (p = str; *p && *p != ':'; p++);
57           mfont_put_prop (font, msymbol ("otf"), make_symbol (str, p - str));
58         }
59       else
60         {
61           for (p =  str; *p && *p != ':'; p++);
62           fprintf (stderr, "Unknown option ignored: %s\n",
63                    msymbol_name (make_symbol (str, p - str)));
64         }
65       str = p;
66     }
67   return font;
68 }
69
70 void
71 print_font (MFont *font)
72 {
73   MSymbol family, foundry, weight, slant, stretch;
74   char *weight_name, *slant_name, *stretch_name;
75   char style_name[1024];
76
77   family = mfont_get_prop (font, Mfamily);
78   foundry = mfont_get_prop (font, Mfoundry);
79   weight = mfont_get_prop (font, Mweight);
80   weight_name = weight ? msymbol_name (weight) : "";
81   slant = mfont_get_prop (font, Mstyle);
82   slant_name = slant ? msymbol_name (slant) : "";
83   stretch = mfont_get_prop (font, Mstretch);
84   stretch_name = stretch ? msymbol_name (stretch) : "";
85
86   sprintf (style_name, "%s-%s-%s", weight_name, slant_name, stretch_name);
87   printf ("%s:foundry=%s:style=%s\n",
88           msymbol_name (family), msymbol_name (foundry), style_name);
89 }
90
91 int
92 main (int argc, char **argv)
93 {
94   MPlist *plist, *p;
95   MFrame *frame;
96   
97   M17N_INIT ();
98
99   plist = mplist ();
100   mplist_add (plist, Mdevice, Mnil);
101   frame = mframe (plist);
102   m17n_object_unref (plist);
103
104   if (argc == 1)
105     {
106       printf ("Listing all available family names...\n");
107       plist = mfont_list_family_names (frame);
108
109       for (p = plist; p && mplist_key (p) != Mnil; p = mplist_next (p))
110         printf ("%s\n", msymbol_name ((MSymbol) mplist_value (p)));
111     }
112   else if (argc == 2)
113     {
114       MFont *font = parse_font_name (argv[1]);
115
116       plist = mfont_list (frame, font, Mnil, 0);
117       free (font);
118       /* List up unique pairs of family and foundry of fonts in PL.  */
119       for (p = plist; p && mplist_key (p) != Mnil; p = mplist_next (p))
120         print_font (mplist_value (p));
121     }
122   else
123     help ();
124
125   if (plist)
126     m17n_object_unref (plist);
127   m17n_object_unref (frame);
128   M17N_FINI ();
129   exit (0);
130 }