Eina_Hash *_eina_file_cache = NULL;
Eina_Lock _eina_file_lock_cache;
+#if defined(EINA_SAFETY_CHECKS) && defined(EINA_MAGIC_DEBUG)
+# define EINA_FILE_MAGIC_CHECK(f, ...) do { \
+ if (EINA_UNLIKELY((f) == NULL)) \
+ { \
+ EINA_SAFETY_ERROR("safety check failed: " # f " == NULL"); \
+ return __VA_ARGS__; \
+ } \
+ if (EINA_UNLIKELY((f)->__magic != EINA_FILE_MAGIC)) \
+ { \
+ EINA_MAGIC_FAIL(f, EINA_FILE_MAGIC); \
+ return __VA_ARGS__; \
+ } \
+ } while (0)
+#else
+# define EINA_FILE_MAGIC_CHECK(f, ...) do {} while(0)
+#endif
+
static char *
_eina_file_escape(char *path, size_t len)
{
EAPI Eina_Bool
eina_file_virtual(Eina_File *file)
{
- if (file) return file->virtual;
- return EINA_FALSE;
+ if (!file) return EINA_FALSE;
+ EINA_FILE_MAGIC_CHECK(file, EINA_FALSE);
+ return file->virtual;
}
EAPI Eina_File *
if (file)
{
+ EINA_FILE_MAGIC_CHECK(f, NULL);
eina_lock_take(&file->lock);
file->refcount++;
eina_lock_release(&file->lock);
unsigned int length;
unsigned int key;
- EINA_SAFETY_ON_NULL_RETURN(file);
+ EINA_FILE_MAGIC_CHECK(file);
eina_lock_take(&_eina_file_lock_cache);
EAPI size_t
eina_file_size_get(const Eina_File *file)
{
- EINA_SAFETY_ON_NULL_RETURN_VAL(file, 0);
+ EINA_FILE_MAGIC_CHECK(file, 0);
return file->length;
}
EAPI time_t
eina_file_mtime_get(const Eina_File *file)
{
- EINA_SAFETY_ON_NULL_RETURN_VAL(file, 0);
+ EINA_FILE_MAGIC_CHECK(file, 0);
return file->mtime;
}
EAPI const char *
eina_file_filename_get(const Eina_File *file)
{
- EINA_SAFETY_ON_NULL_RETURN_VAL(file, NULL);
+ EINA_FILE_MAGIC_CHECK(file, NULL);
return file->filename;
}
{
Eina_Lines_Iterator *it;
- EINA_SAFETY_ON_NULL_RETURN_VAL(file, NULL);
+ EINA_FILE_MAGIC_CHECK(file, NULL);
if (file->length == 0) return NULL;