2012-09-20 20:42:31 +02:00
|
|
|
/*
|
|
|
|
* fontconfig/src/fclist.c
|
|
|
|
*
|
|
|
|
* Copyright © 2000 Keith Packard
|
|
|
|
*
|
|
|
|
* Permission to use, copy, modify, distribute, and sell this software and its
|
|
|
|
* documentation for any purpose is hereby granted without fee, provided that
|
|
|
|
* the above copyright notice appear in all copies and that both that
|
|
|
|
* copyright notice and this permission notice appear in supporting
|
|
|
|
* documentation, and that the name of the author(s) not be used in
|
|
|
|
* advertising or publicity pertaining to distribution of the software without
|
|
|
|
* specific, written prior permission. The authors make no
|
|
|
|
* representations about the suitability of this software for any purpose. It
|
|
|
|
* is provided "as is" without express or implied warranty.
|
|
|
|
*
|
|
|
|
* THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
|
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
|
|
|
* EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
|
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
|
|
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
|
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "fcint.h"
|
|
|
|
|
2013-01-03 00:52:00 +01:00
|
|
|
static unsigned int
|
2017-02-23 13:39:10 +01:00
|
|
|
FcObjectTypeHash (register const char *str, register FC_GPERF_SIZE_T len);
|
2013-01-03 00:52:00 +01:00
|
|
|
|
|
|
|
static const struct FcObjectTypeInfo *
|
2017-02-23 13:39:10 +01:00
|
|
|
FcObjectTypeLookup (register const char *str, register FC_GPERF_SIZE_T len);
|
2013-01-03 00:52:00 +01:00
|
|
|
|
2012-09-20 20:42:31 +02:00
|
|
|
#include "fcobjshash.h"
|
|
|
|
|
|
|
|
#include <string.h>
|
|
|
|
|
2013-01-03 11:19:12 +01:00
|
|
|
/* The 1000 is to leave some room for future added internal objects, such
|
|
|
|
* that caches from newer fontconfig can still be used with older fontconfig
|
|
|
|
* without getting confused. */
|
2013-08-05 13:04:13 +02:00
|
|
|
static fc_atomic_int_t next_id = FC_MAX_BASE_OBJECT + FC_EXT_OBJ_INDEX;
|
2012-09-20 20:42:31 +02:00
|
|
|
struct FcObjectOtherTypeInfo {
|
|
|
|
struct FcObjectOtherTypeInfo *next;
|
|
|
|
FcObjectType object;
|
2013-01-03 00:52:00 +01:00
|
|
|
FcObject id;
|
2012-09-20 20:42:31 +02:00
|
|
|
} *other_types;
|
|
|
|
|
2015-05-22 09:53:34 +02:00
|
|
|
void
|
|
|
|
FcObjectFini (void)
|
|
|
|
{
|
|
|
|
struct FcObjectOtherTypeInfo *ots, *ot;
|
|
|
|
|
|
|
|
retry:
|
|
|
|
ots = fc_atomic_ptr_get (&other_types);
|
2015-05-22 13:51:21 +02:00
|
|
|
if (!ots)
|
|
|
|
return;
|
2015-05-22 09:53:34 +02:00
|
|
|
if (!fc_atomic_ptr_cmpexch (&other_types, ots, NULL))
|
|
|
|
goto retry;
|
|
|
|
|
|
|
|
while (ots)
|
|
|
|
{
|
|
|
|
ot = ots->next;
|
|
|
|
if (ots->object.object)
|
|
|
|
free (ots->object.object);
|
|
|
|
free (ots);
|
|
|
|
ots = ot;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-20 20:42:31 +02:00
|
|
|
static FcObjectType *
|
|
|
|
_FcObjectLookupOtherTypeByName (const char *str, FcObject *id)
|
|
|
|
{
|
|
|
|
struct FcObjectOtherTypeInfo *ots, *ot;
|
|
|
|
|
2013-01-02 08:09:20 +01:00
|
|
|
retry:
|
|
|
|
ots = fc_atomic_ptr_get (&other_types);
|
2012-09-20 20:42:31 +02:00
|
|
|
|
|
|
|
for (ot = ots; ot; ot = ot->next)
|
|
|
|
if (0 == strcmp (ot->object.object, str))
|
|
|
|
break;
|
|
|
|
|
|
|
|
if (!ot)
|
|
|
|
{
|
|
|
|
ot = malloc (sizeof (*ot));
|
|
|
|
if (!ot)
|
|
|
|
return NULL;
|
|
|
|
|
2015-05-22 09:53:34 +02:00
|
|
|
ot->object.object = (char *) FcStrdup (str);
|
2013-06-28 08:04:11 +02:00
|
|
|
ot->object.type = FcTypeUnknown;
|
2013-01-02 08:09:20 +01:00
|
|
|
ot->id = fc_atomic_int_add (next_id, +1);
|
2015-05-25 14:41:05 +02:00
|
|
|
if (ot->id < (FC_MAX_BASE_OBJECT + FC_EXT_OBJ_INDEX))
|
2015-05-22 13:51:21 +02:00
|
|
|
{
|
|
|
|
fprintf (stderr, "Fontconfig error: No object ID to assign\n");
|
|
|
|
abort ();
|
|
|
|
}
|
2013-01-02 08:54:38 +01:00
|
|
|
ot->next = ots;
|
2012-09-20 20:42:31 +02:00
|
|
|
|
2013-01-02 08:09:20 +01:00
|
|
|
if (!fc_atomic_ptr_cmpexch (&other_types, ots, ot)) {
|
2015-05-22 09:53:34 +02:00
|
|
|
if (ot->object.object)
|
|
|
|
free (ot->object.object);
|
2013-01-02 08:09:20 +01:00
|
|
|
free (ot);
|
|
|
|
goto retry;
|
|
|
|
}
|
2012-09-20 20:42:31 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (id)
|
|
|
|
*id = ot->id;
|
|
|
|
|
|
|
|
return &ot->object;
|
|
|
|
}
|
|
|
|
|
|
|
|
FcObject
|
|
|
|
FcObjectLookupBuiltinIdByName (const char *str)
|
|
|
|
{
|
|
|
|
const struct FcObjectTypeInfo *o = FcObjectTypeLookup (str, strlen (str));
|
2013-01-02 09:19:04 +01:00
|
|
|
|
2012-09-20 20:42:31 +02:00
|
|
|
if (o)
|
|
|
|
return o->id;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
FcObject
|
|
|
|
FcObjectLookupIdByName (const char *str)
|
|
|
|
{
|
|
|
|
const struct FcObjectTypeInfo *o = FcObjectTypeLookup (str, strlen (str));
|
|
|
|
FcObject id;
|
|
|
|
if (o)
|
|
|
|
return o->id;
|
|
|
|
|
|
|
|
if (_FcObjectLookupOtherTypeByName (str, &id))
|
|
|
|
return id;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char *
|
|
|
|
FcObjectLookupOtherNameById (FcObject id)
|
|
|
|
{
|
|
|
|
struct FcObjectOtherTypeInfo *ot;
|
|
|
|
|
2013-01-02 08:09:20 +01:00
|
|
|
for (ot = fc_atomic_ptr_get (&other_types); ot; ot = ot->next)
|
2012-09-20 20:42:31 +02:00
|
|
|
if (ot->id == id)
|
|
|
|
return ot->object.object;
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
const FcObjectType *
|
|
|
|
FcObjectLookupOtherTypeByName (const char *str)
|
|
|
|
{
|
|
|
|
return _FcObjectLookupOtherTypeByName (str, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
FcPrivate const FcObjectType *
|
|
|
|
FcObjectLookupOtherTypeById (FcObject id)
|
|
|
|
{
|
|
|
|
struct FcObjectOtherTypeInfo *ot;
|
|
|
|
|
2013-01-02 08:09:20 +01:00
|
|
|
for (ot = fc_atomic_ptr_get (&other_types); ot; ot = ot->next)
|
2012-09-20 20:42:31 +02:00
|
|
|
if (ot->id == id)
|
|
|
|
return &ot->object;
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#include "fcaliastail.h"
|
|
|
|
#undef __fcobjs__
|