summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric BAIL <cedric.bail@samsung.com>2013-03-14 20:36:56 +0900
committerCedric BAIL <cedric.bail@samsung.com>2013-03-14 20:52:37 +0900
commit81f739da8407a3cd218a54ebdf3488545f08b84d (patch)
treeebfbfc7b97f6043f37573389ca7936a9cdb9a0d8
parent4ab02d7f6b5a91e2d5a3c727100dfb332ac48838 (diff)
downloadefl-81f739da8407a3cd218a54ebdf3488545f08b84d.tar.gz
eina: improve usability of Eina_Tmpstr.
Added eina_tmpstr_add_length and eina_tmpstr_strlen.
-rw-r--r--NEWS22
-rw-r--r--src/lib/eina/eina_tmpstr.c43
-rw-r--r--src/lib/eina/eina_tmpstr.h40
3 files changed, 89 insertions, 16 deletions
diff --git a/NEWS b/NEWS
index ea4a824a0e..a33b5215b7 100644
--- a/NEWS
+++ b/NEWS
@@ -7,11 +7,18 @@ Changes since 1.7.0:
Additions:
* Add multiple font draws support to engines
- * Add DOCTYPE children parsing in eina_simple_xml
- * Add eina_barrier thread API
- * Add eina_tmpstr_add() and eina_tmpstr_del()
- * Add eina_thread API
- * Add eina_list_last_data_get
+ * eina :
+ - Add DOCTYPE children parsing in eina_simple_xml
+ - Add eina_barrier thread API
+ - Add eina_tmpstr_add(), eina_tmpstr_del(), eina_tmpstr_add_length() and
+ eina_tmpstr_strlen().
+ - Add eina_thread API
+ - Add eina_list_last_data_get
+ - Add eina_xattr_fd_get(), eina_xattr_fd_set(),
+ eina_xattr_del(), eina_xattr_fd_del(), eina_xattr_copy() and
+ eina_xattr_fd_copy()
+ - Add eina_stringshare_refplace()
+ - Add eina_file_copy()
* Add Cserve2 scalecache support
* ecore_x:
- Add window profile support.
@@ -58,11 +65,6 @@ Additions:
- Add EVAS_GL_DIRECT_MEM_OPT to enable on-demand fallback memory allocation policy for EvasGL direct rendering.
- Add engine specific alpha_get.
* Add ecore_audio API
- * Added eina_xattr_fd_get(), eina_xattr_fd_set(),
- eina_xattr_del(), eina_xattr_fd_del(), eina_xattr_copy() and
- eina_xattr_fd_copy()
- * added eina_stringshare_refplace()
- * Added eina_file_copy()
* Add eet_mmap.
* added eet_data_descriptor_name_get()
* Add eio_eet_sync symbols.
diff --git a/src/lib/eina/eina_tmpstr.c b/src/lib/eina/eina_tmpstr.c
index 849d6c618d..5ce79c3c20 100644
--- a/src/lib/eina/eina_tmpstr.c
+++ b/src/lib/eina/eina_tmpstr.c
@@ -45,6 +45,7 @@ typedef struct _Str Str;
struct _Str
{
+ size_t length;
Str *next;
char *str;
};
@@ -67,15 +68,14 @@ eina_tmpstr_shutdown(void)
}
EAPI Eina_Tmpstr *
-eina_tmpstr_add(const char *str)
+eina_tmpstr_add_length(const char *str, size_t length)
{
Str *s;
- int len;
-
- if (!str) return NULL;
- len = strlen(str);
- s = malloc(sizeof(Str) + len + 1);
+
+ if (!str || !length) return NULL;
+ s = malloc(sizeof(Str) + length + 1);
if (!s) return NULL;
+ s->length = length;
s->str = ((char *)s) + sizeof(Str);
strcpy(s->str, str);
eina_lock_take(&_mutex);
@@ -85,6 +85,16 @@ eina_tmpstr_add(const char *str)
return s->str;
}
+EAPI Eina_Tmpstr *
+eina_tmpstr_add(const char *str)
+{
+ size_t len;
+
+ if (!str) return NULL;
+ len = strlen(str);
+ return eina_tmpstr_add_length(str, len);
+}
+
EAPI void
eina_tmpstr_del(Eina_Tmpstr *tmpstr)
{
@@ -104,3 +114,24 @@ eina_tmpstr_del(Eina_Tmpstr *tmpstr)
}
eina_lock_release(&_mutex);
}
+
+EAPI size_t
+eina_tmpstr_strlen(Eina_Tmpstr *tmpstr)
+{
+ Str *s;
+
+ if (!tmpstr) return 0;
+ if (!strs) return strlen(tmpstr) + 1;
+ eina_lock_take(&_mutex);
+ for (s = strs; s; s = s->next)
+ {
+ if (s->str == tmpstr)
+ {
+ eina_lock_release(&_mutex);
+ return s->length;
+ }
+ }
+ eina_lock_release(&_mutex);
+
+ return strlen(tmpstr) + 1;
+}
diff --git a/src/lib/eina/eina_tmpstr.h b/src/lib/eina/eina_tmpstr.h
index aab682dd8f..cd1589a706 100644
--- a/src/lib/eina/eina_tmpstr.h
+++ b/src/lib/eina/eina_tmpstr.h
@@ -158,12 +158,52 @@ typedef const char Eina_Tmpstr;
* @endcode
*
* @see eina_tmpstr_del()
+ * @see eina_tmpstr_add_length()
*
* @since 1.8.0
*/
EAPI Eina_Tmpstr *eina_tmpstr_add(const char *str) EINA_WARN_UNUSED_RESULT;
/**
+ * @brief Add a new temporary string based on the input string and length.
+ *
+ * @param str This is the input stringthat is copied into the temp string.
+ * @param length This is the maximum length and the allocated length of the temp string.
+ * @return A pointer to the tmp string that is a standard C string.
+ *
+ * When you add a temporary string (tmpstr) it is expected to have a very
+ * short lifespan, and at any one time only a few of these are intended to
+ * exist. This is not intended for longer term storage of strings. The
+ * intended use is the ability to safely pass strings as return values from
+ * functions directly into parameters of new functions and then have the
+ * string be cleaned up automatically by the caller.
+ *
+ * If @p str is NULL, or no memory space exists to store the tmpstr, then
+ * NULL will be returned, otherwise a valid string pointer will be returned
+ * that you can treat as any other C string (eg strdup(tmpstr) or
+ * printf("%s\n", tmpstr) etc.). This string should be considered read-only
+ * and immutable, and when youa re done with the string yo should delete it
+ * with eina_tmpstr_del().
+ *
+ * @see eina_tmpstr_del()
+ * @see eina_tmpstr_add()
+ *
+ * @since 1.8.0
+ */
+EAPI Eina_Tmpstr *eina_tmpstr_add_length(const char *str, size_t length);
+
+/**
+ * @brief Return the length of a temporary string including the '\0'.
+ *
+ * @param tmpstr This is any C string pointer, but if it is a tmp string
+ * it will return the length faster.
+ * @return The length of the string including the '\0';
+ *
+ * @since 1.8.0
+ */
+EAPI size_t eina_tmpstr_strlen(Eina_Tmpstr *tmpstr);
+
+/**
* @brief Delete the temporary string if it is one, or ignore it if it is not.
*
* @param tmpstr This is any C string pointer, but if it is a tmp string