You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

131 lines
2.5 KiB

/* -*- coding: utf-8 -*-
* ----------------------------------------------------------------------
* Copyright © 2011, RedJack, LLC.
* All rights reserved.
*
* Please see the COPYING file in this distribution for license
* details.
* ----------------------------------------------------------------------
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "libcork/core/allocator.h"
#include "libcork/core/attributes.h"
#include "libcork/core/error.h"
#include "libcork/core/types.h"
/*-----------------------------------------------------------------------
* reallocf
*/
#if !CORK_HAVE_REALLOCF
void *
cork_xrealloc(void *ptr, size_t new_size)
{
void *result = realloc(ptr, new_size);
if (result == NULL) {
free(ptr);
}
return result;
}
#endif
/*-----------------------------------------------------------------------
* Allocating strings
*/
static inline const char *
strndup_internal(const char *str, size_t len)
{
size_t allocated_size = len + sizeof(size_t) + 1;
size_t *new_str = malloc(allocated_size);
if (new_str == NULL) {
return NULL;
}
*new_str = allocated_size;
char *dest = (char *) (void *) (new_str + 1);
strncpy(dest, str, len);
dest[len] = '\0';
return dest;
}
const char *
cork_xstrndup(const char *str, size_t len)
{
return strndup_internal(str, len);
}
const char *
cork_xstrdup(const char *str)
{
return strndup_internal(str, strlen(str));
}
void
cork_strfree(const char *str)
{
size_t *base = ((size_t *) str) - 1;
free(base);
}
/*-----------------------------------------------------------------------
* Abort on failure
*/
void *
cork_malloc(size_t size)
{
void *result = cork_xmalloc(size);
if (CORK_UNLIKELY(result == NULL)) {
abort();
}
return result;
}
void *
cork_calloc(size_t count, size_t size)
{
void *result = cork_xcalloc(count, size);
if (CORK_UNLIKELY(result == NULL)) {
abort();
}
return result;
}
void *
cork_realloc(void *ptr, size_t new_size)
{
void *result = cork_xrealloc(ptr, new_size);
if (CORK_UNLIKELY(result == NULL)) {
abort();
}
return result;
}
const char *
cork_strdup(const char *src)
{
const char *result = cork_xstrdup(src);
if (CORK_UNLIKELY(result == NULL)) {
abort();
}
return result;
}
const char *
cork_strndup(const char *src, size_t size)
{
const char *result = cork_xstrndup(src, size);
if (CORK_UNLIKELY(result == NULL)) {
abort();
}
return result;
}