(root)/
fontconfig-2.14.2/
src/
fcobjs.c
       1  /*
       2   * fontconfig/src/fclist.c
       3   *
       4   * Copyright © 2000 Keith Packard
       5   *
       6   * Permission to use, copy, modify, distribute, and sell this software and its
       7   * documentation for any purpose is hereby granted without fee, provided that
       8   * the above copyright notice appear in all copies and that both that
       9   * copyright notice and this permission notice appear in supporting
      10   * documentation, and that the name of the author(s) not be used in
      11   * advertising or publicity pertaining to distribution of the software without
      12   * specific, written prior permission.  The authors make no
      13   * representations about the suitability of this software for any purpose.  It
      14   * is provided "as is" without express or implied warranty.
      15   *
      16   * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
      17   * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
      18   * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
      19   * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
      20   * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
      21   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
      22   * PERFORMANCE OF THIS SOFTWARE.
      23   */
      24  
      25  #include "fcint.h"
      26  
      27  static unsigned int
      28  FcObjectTypeHash (register const char *str, register FC_GPERF_SIZE_T len);
      29  
      30  static const struct FcObjectTypeInfo *
      31  FcObjectTypeLookup (register const char *str, register FC_GPERF_SIZE_T len);
      32  
      33  #include "fcobjshash.h"
      34  
      35  #include <string.h>
      36  
      37  /* The 1000 is to leave some room for future added internal objects, such
      38   * that caches from newer fontconfig can still be used with older fontconfig
      39   * without getting confused. */
      40  static fc_atomic_int_t next_id = FC_MAX_BASE_OBJECT + FC_EXT_OBJ_INDEX;
      41  struct FcObjectOtherTypeInfo {
      42      struct FcObjectOtherTypeInfo *next;
      43      FcObjectType object;
      44      FcObject id;
      45  } *other_types;
      46  
      47  void
      48  FcObjectFini (void)
      49  {
      50      struct FcObjectOtherTypeInfo *ots, *ot;
      51  
      52  retry:
      53      ots = fc_atomic_ptr_get (&other_types);
      54      if (!ots)
      55  	return;
      56      if (!fc_atomic_ptr_cmpexch (&other_types, ots, NULL))
      57  	goto retry;
      58  
      59      while (ots)
      60      {
      61  	ot = ots->next;
      62  	if (ots->object.object)
      63  	    free (ots->object.object);
      64  	free (ots);
      65  	ots = ot;
      66      }
      67  }
      68  
      69  static FcObjectType *
      70  _FcObjectLookupOtherTypeByName (const char *str, FcObject *id)
      71  {
      72      struct FcObjectOtherTypeInfo *ots, *ot;
      73  
      74  retry:
      75      ots = fc_atomic_ptr_get (&other_types);
      76  
      77      for (ot = ots; ot; ot = ot->next)
      78  	if (0 == strcmp (ot->object.object, str))
      79  	    break;
      80  
      81      if (!ot)
      82      {
      83  	ot = malloc (sizeof (*ot));
      84  	if (!ot)
      85  	    return NULL;
      86  
      87  	ot->object.object = (char *) FcStrdup (str);
      88  	ot->object.type = FcTypeUnknown;
      89  	ot->id = fc_atomic_int_add (next_id, +1);
      90  	if (ot->id < (FC_MAX_BASE_OBJECT + FC_EXT_OBJ_INDEX))
      91  	{
      92  	    fprintf (stderr, "Fontconfig error: No object ID to assign\n");
      93  	    abort ();
      94  	}
      95  	ot->next = ots;
      96  
      97  	if (!fc_atomic_ptr_cmpexch (&other_types, ots, ot)) {
      98  	    if (ot->object.object)
      99  		free (ot->object.object);
     100  	    free (ot);
     101  	    goto retry;
     102  	}
     103      }
     104  
     105      if (id)
     106        *id = ot->id;
     107  
     108      return &ot->object;
     109  }
     110  
     111  FcObject
     112  FcObjectLookupBuiltinIdByName (const char *str)
     113  {
     114      const struct FcObjectTypeInfo *o = FcObjectTypeLookup (str, strlen (str));
     115  
     116      if (o)
     117  	return o->id;
     118  
     119      return 0;
     120  }
     121  
     122  FcObject
     123  FcObjectLookupIdByName (const char *str)
     124  {
     125      const struct FcObjectTypeInfo *o = FcObjectTypeLookup (str, strlen (str));
     126      FcObject id;
     127      if (o)
     128  	return o->id;
     129  
     130      if (_FcObjectLookupOtherTypeByName (str, &id))
     131  	return id;
     132  
     133      return 0;
     134  }
     135  
     136  const char *
     137  FcObjectLookupOtherNameById (FcObject id)
     138  {
     139      struct FcObjectOtherTypeInfo *ot;
     140  
     141      for (ot = fc_atomic_ptr_get (&other_types); ot; ot = ot->next)
     142  	if (ot->id == id)
     143  	    return ot->object.object;
     144  
     145      return NULL;
     146  }
     147  
     148  const FcObjectType *
     149  FcObjectLookupOtherTypeByName (const char *str)
     150  {
     151      return _FcObjectLookupOtherTypeByName (str, NULL);
     152  }
     153  
     154  FcPrivate const FcObjectType *
     155  FcObjectLookupOtherTypeById (FcObject id)
     156  {
     157      struct FcObjectOtherTypeInfo *ot;
     158  
     159      for (ot = fc_atomic_ptr_get (&other_types); ot; ot = ot->next)
     160  	if (ot->id == id)
     161  	    return &ot->object;
     162  
     163      return NULL;
     164  }
     165  
     166  
     167  #include "fcaliastail.h"
     168  #undef __fcobjs__