View | Details | Raw Unified | Return to bug 128930
Collapse All | Expand All

(-)fontconfig-2.3.91.20051007.old/src/fcdefault.c (-49 / +62 lines)
Lines 38-43 Link Here
38
38
39
#define NUM_FC_BOOL_DEFAULTS	(int) (sizeof FcBoolDefaults / sizeof FcBoolDefaults[0])
39
#define NUM_FC_BOOL_DEFAULTS	(int) (sizeof FcBoolDefaults / sizeof FcBoolDefaults[0])
40
40
41
FcChar8 *
42
FcGetDefaultLang (void)
43
{
44
    static char	lang_local [128] = {0};
45
    char        *ctype;
46
    char        *territory;
47
    char        *after;
48
    int         lang_len, territory_len;
49
50
    if (lang_local [0])
51
	return (FcChar8 *) lang_local;
52
53
    ctype = setlocale (LC_CTYPE, NULL);
54
55
    /*
56
     * Check if setlocale (LC_ALL, "") has been called
57
     */
58
    if (!ctype || !strcmp (ctype, "C"))
59
    {
60
	ctype = getenv ("LC_ALL");
61
	if (!ctype)
62
	{
63
	    ctype = getenv ("LC_CTYPE");
64
	    if (!ctype)
65
		ctype = getenv ("LANG");
66
	}
67
    }
68
69
    /* ignore missing or empty ctype */
70
    if (ctype && *ctype != '\0')
71
    {
72
	territory = strchr (ctype, '_');
73
	if (territory)
74
	{
75
	    lang_len = territory - ctype;
76
	    territory = territory + 1;
77
	    after = strchr (territory, '.');
78
	    if (!after)
79
	    {
80
		after = strchr (territory, '@');
81
		if (!after)
82
		    after = territory + strlen (territory);
83
	    }
84
	    territory_len = after - territory;
85
	    if (lang_len + 1 + territory_len + 1 <= (int) sizeof (lang_local))
86
	    {
87
		strncpy (lang_local, ctype, lang_len);
88
		lang_local[lang_len] = '-';
89
		strncpy (lang_local + lang_len + 1, territory, territory_len);
90
		lang_local[lang_len + 1 + territory_len] = '\0';
91
	    }
92
	}
93
    }
94
95
    /* set default lang to en */
96
    if (!lang_local [0])
97
	strcpy (lang_local, "en");
98
99
    return (FcChar8 *) lang_local;
100
}
101
41
void
102
void
42
FcDefaultSubstitute (FcPattern *pattern)
103
FcDefaultSubstitute (FcPattern *pattern)
43
{
104
{
Lines 92-146 Link Here
92
153
93
    if (FcPatternGet (pattern, FC_LANG, 0, &v) == FcResultNoMatch)
154
    if (FcPatternGet (pattern, FC_LANG, 0, &v) == FcResultNoMatch)
94
    {
155
    {
95
	char	*lang;
156
	FcPatternAddString (pattern, FC_LANG, FcGetDefaultLang ());
96
	char	*territory;
97
	char	*after;
98
	int	lang_len, territory_len;
99
	char	lang_local[128];
100
	char	*ctype = setlocale (LC_CTYPE, NULL);
101
102
	/*
103
	 * Check if setlocale (LC_ALL, "") has been called
104
	 */
105
	if (!ctype || !strcmp (ctype, "C"))
106
	{
107
	    ctype = getenv ("LC_ALL");
108
	    if (!ctype)
109
	    {
110
		ctype = getenv ("LC_CTYPE");
111
		if (!ctype)
112
		    ctype = getenv ("LANG");
113
	    }
114
	}
115
	/* ignore missing or empty ctype */
116
	if (ctype && *ctype != '\0')
117
	{
118
	    lang = ctype;
119
	    territory = strchr (ctype, '_');
120
	    if (territory)
121
	    {
122
		lang_len = territory - lang;
123
		territory = territory + 1;
124
		after = strchr (territory, '.');
125
		if (!after)
126
		{
127
		    after = strchr (territory, '@');
128
		    if (!after)
129
			after = territory + strlen (territory);
130
		}
131
		territory_len = after - territory;
132
		if (lang_len + 1 + territory_len + 1 <= (int) sizeof (lang_local))
133
		{
134
		    strncpy (lang_local, lang, lang_len);
135
		    lang_local[lang_len] = '-';
136
		    strncpy (lang_local + lang_len + 1, territory, territory_len);
137
		    lang_local[lang_len + 1 + territory_len] = '\0';
138
		    FcPatternAddString (pattern, FC_LANG, (FcChar8 *) lang_local);
139
		}
140
	    }
141
	    else
142
		FcPatternAddString (pattern, FC_LANG, (FcChar8 *) lang);
143
	}
144
    }
157
    }
145
    if (FcPatternGet (pattern, FC_FONTVERSION, 0, &v) == FcResultNoMatch)
158
    if (FcPatternGet (pattern, FC_FONTVERSION, 0, &v) == FcResultNoMatch)
146
    {
159
    {
(-)fontconfig-2.3.91.20051007.old/src/fcint.h (+4 lines)
Lines 571-576 Link Here
571
int
571
int
572
FcDebug (void);
572
FcDebug (void);
573
573
574
/* fcdefault.c */
575
FcChar8 *
576
FcGetDefaultLang (void);
577
574
/* fcdir.c */
578
/* fcdir.c */
575
579
576
FcBool
580
FcBool
(-)fontconfig-2.3.91.20051007.old/src/fclist.c (-3 / +57 lines)
Lines 337-342 Link Here
337
    table->entries = 0;
337
    table->entries = 0;
338
}
338
}
339
339
340
static int
341
FcGetDefaultObjectLangIndex (FcPattern *font, const char *object)
342
{
343
    FcChar8	   *lang = FcGetDefaultLang ();
344
    FcPatternElt   *e = FcPatternFindElt (font, object);
345
    FcValueListPtr  v;
346
    FcValue         value;
347
    int             idx = -1;
348
    int             i;
349
350
    if (e)
351
    {
352
	for (v = e->values, i = 0; FcValueListPtrU(v); v = FcValueListPtrU(v)->next, ++i)
353
	{
354
	    value = FcValueCanonicalize (&FcValueListPtrU (v)->value);
355
356
	    if ((value.type & ~FC_STORAGE_STATIC) == FcTypeString)
357
	    {
358
		FcLangResult res = FcLangCompare (value.u.s, lang);
359
		if (res == FcLangEqual || (res == FcLangDifferentCountry && idx < 0))
360
		    idx = i;
361
	    }
362
	}
363
    }
364
365
    return (idx > 0) ? idx : 0;
366
}
367
340
static FcBool
368
static FcBool
341
FcListAppend (FcListHashTable	*table,
369
FcListAppend (FcListHashTable	*table,
342
	      FcPattern		*font,
370
	      FcPattern		*font,
Lines 347-352 Link Here
347
    FcValueListPtr  v;
375
    FcValueListPtr  v;
348
    FcChar32	    hash;
376
    FcChar32	    hash;
349
    FcListBucket    **prev, *bucket;
377
    FcListBucket    **prev, *bucket;
378
    int             familyidx = -1;
379
    int             fullnameidx = -1;
380
    int             styleidx = -1;
381
    int             defidx = 0;
382
    int             idx;
350
383
351
    hash = FcListPatternHash (font, os);
384
    hash = FcListPatternHash (font, os);
352
    for (prev = &table->buckets[hash % FC_LIST_HASH_SIZE];
385
    for (prev = &table->buckets[hash % FC_LIST_HASH_SIZE];
Lines 368-382 Link Here
368
    
401
    
369
    for (o = 0; o < os->nobject; o++)
402
    for (o = 0; o < os->nobject; o++)
370
    {
403
    {
404
	if (!strcmp (os->objects[o], FC_FAMILY) || !strcmp (os->objects[o], FC_FAMILYLANG))
405
	{
406
	    if (familyidx < 0)
407
		familyidx = FcGetDefaultObjectLangIndex (font, FC_FAMILYLANG);
408
	    defidx = familyidx;
409
	}
410
	else if (!strcmp (os->objects[o], FC_FULLNAME) || !strcmp (os->objects[o], FC_FULLNAMELANG))
411
	{
412
	    if (fullnameidx < 0)
413
		fullnameidx = FcGetDefaultObjectLangIndex (font, FC_FULLNAMELANG);
414
	    defidx = fullnameidx;
415
	}
416
	else if (!strcmp (os->objects[o], FC_STYLE) || !strcmp (os->objects[o], FC_STYLELANG))
417
	{
418
	    if (styleidx < 0)
419
		styleidx = FcGetDefaultObjectLangIndex (font, FC_STYLELANG);
420
	    defidx = styleidx;
421
	}
422
	else
423
	    defidx = 0;
424
371
	e = FcPatternFindElt (font, os->objects[o]);
425
	e = FcPatternFindElt (font, os->objects[o]);
372
	if (e)
426
	if (e)
373
	{
427
	{
374
	    for (v = e->values; FcValueListPtrU(v); 
428
	    for (v = e->values, idx = 0; FcValueListPtrU(v); 
375
		 v = FcValueListPtrU(v)->next)
429
		 v = FcValueListPtrU(v)->next, ++idx)
376
	    {
430
	    {
377
		if (!FcPatternAdd (bucket->pattern, 
431
		if (!FcPatternAdd (bucket->pattern, 
378
				   os->objects[o], 
432
				   os->objects[o], 
379
				   FcValueCanonicalize(&FcValueListPtrU(v)->value), FcTrue))
433
				   FcValueCanonicalize(&FcValueListPtrU(v)->value), defidx != idx))
380
		    goto bail2;
434
		    goto bail2;
381
	    }
435
	    }
382
	}
436
	}

Return to bug 128930