Example #1
0
EAPI Eina_Stringshare *
eina_stringshare_add_length(const char *str, unsigned int slen)
{
   if (!str)
     return NULL;
   else if (slen == 0)
     {
        eina_share_common_population_add(stringshare_share, slen);

        return "";
     }
   else if (slen == 1)
     {
        eina_share_common_population_add(stringshare_share, slen);

        return (Eina_Stringshare *) _eina_stringshare_single + ((*str) << 1);
     }
   else if (slen < 4)
     {
        const char *s;

        eina_share_common_population_add(stringshare_share, slen);
        eina_spinlock_take(&_mutex_small);
        s = _eina_stringshare_small_add(str, slen);
        eina_spinlock_release(&_mutex_small);

        return s;
     }

   return eina_share_common_add_length(stringshare_share, str, slen *
                                       sizeof(char), sizeof(char));
}
Example #2
0
/**
 * @brief Retrieve an instance of a string for use in a program.
 *
 * @param   str The string to retrieve an instance of.
 * @param   slen The string size (<= strlen(str)).
 * @return  A pointer to an instance of the string on success.
 *          @c NULL on failure.
 *
 * This function retrieves an instance of @p str. If @p str is
 * @c NULL, then @c NULL is returned. If @p str is already stored, it
 * is just returned and its reference counter is increased. Otherwise
 * it is added to the strings to be searched and a duplicated string
 * of @p str is returned.
 *
 * This function does not check string size, but uses the
 * exact given size. This can be used to share_common part of a larger
 * buffer or substring.
 *
 * @see eina_ustringshare_add()
 */
EAPI const Eina_Unicode *eina_ustringshare_add_length(const Eina_Unicode *
						      str,
						      unsigned int slen)
{
	return (const Eina_Unicode *)
	    eina_share_common_add_length(ustringshare_share,
					 (const char *) str,
					 slen * sizeof(Eina_Unicode),
					 sizeof(Eina_Unicode));
}
Example #3
0
/**
 * @brief Retrieve an instance of a string for use in a program.
 *
 * @param   str The string to retrieve an instance of.
 * @param   slen The string size (<= strlen(str)).
 * @return  A pointer to an instance of the string on success.
 *          @c NULL on failure.
 *
 * This function retrieves an instance of @p str. If @p str is
 * @c NULL, then @c NULL is returned. If @p str is already stored, it
 * is just returned and its reference counter is increased. Otherwise
 * it is added to the strings to be searched and a duplicated string
 * of @p str is returned.
 *
 * This function does not check string size, but uses the
 * exact given size. This can be used to share_common part of a larger
 * buffer or substring.
 *
 * @see eina_share_common_add()
 */
EAPI const char *
eina_stringshare_add_length(const char *str, unsigned int slen)
{
   DBG("str=%p (%.*s), slen=%u", str, slen, str ? str : "", slen);

   if ((!str) || (slen <= 0))
      return "";
   else if (slen == 1)
      return (const char *)_eina_stringshare_single + ((*str) << 1);
   else if (slen < 4)
     {
        const char *s;

        STRINGSHARE_LOCK_SMALL();
        s = _eina_stringshare_small_add(str, slen);
        STRINGSHARE_UNLOCK_SMALL();
        return s;
     }

   return eina_share_common_add_length(stringshare_share, str, slen *
                                       sizeof(char), sizeof(char));
}