blob: 9e1c88368b25660230acbf37ca813e30353e666c [file] [log] [blame]
/**
* @file oss_clib.h
* @brief C¿âÍ·Îļþ
*
* Copyright (C) 2017 Sanechips Technology Co., Ltd.
*
*/
#ifndef _OSS_CLIB_H
#define _OSS_CLIB_H
#define _USE_CLIB
#ifdef _USE_CLIB
/*******************************************************************************
* Include header files *
******************************************************************************/
#if defined (_OS_LINUX)
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/string.h>
#else
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <time.h>
#include <math.h>
#include <ctype.h>
#endif
#ifdef _OS_WIN
#include <stddef.h>
#endif
#include "oss_pub.h"
#include "oss_compiler.h"
#ifdef __cplusplus
extern "C"
{
#endif
/*******************************************************************************
* Macro definitions *
******************************************************************************/
#ifdef _OS_LINUX
/*
* stdio.h
*/
#define printf(fmt, ...) printk(fmt, ##__VA_ARGS__)
/*
* random
*/
#define RAND_MAX (0x7FFFFFFF)
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))
# define srand(s) prandom_seed(s)
# define rand() (prandom_u32() & RAND_MAX)
#else
# define srand(s) srandom32(s)
# define rand() (random32() & RAND_MAX)
#endif
/*
* stdlib.h
*/
#define atol(nptr) simple_strtol(nptr, (char **)NULL, 10)
#define atoi(nptr) simple_strtoul(nptr, (char **)NULL, 10)
#define strtol simple_strtol
#define strtoul simple_strtoul
#define malloc(size) kmalloc(size, GFP_ATOMIC)
#define free(ptr) kfree(ptr)
/*
* assert.h
*/
#define assert(exp) zOss_ASSERT(exp)
/*
* time
*/
#define settimeofday sys_settimeofday
/*
* unistd.h
*/
#define exit(nr) do_exit(nr)
#define zOss_Malloc(size) kmalloc(size, GFP_ATOMIC)
#define zOss_MallocEx(size) kmalloc(size, GFP_KERNEL | __GFP_PAGEMODEM)
#define zOss_Realloc(mem_ptr, new_size) krealloc(mem_ptr, new_size, GFP_ATOMIC)
#define zOss_Free(mem_ptr) kfree(mem_ptr)
#define zOss_Memcpy(dest_ptr, src_ptr, size) memcpy(dest_ptr, src_ptr, size)
#define zOss_Memset(dest_ptr, value, size) memset(dest_ptr, value, size)
#define zOss_Memmove(dest_ptr, src_ptr, count) memmove(dest_ptr, src_ptr, count)
#define zOss_Memcmp(f_buf_ptr, s_buf_ptr, count) memcmp(f_buf_ptr, s_buf_ptr, count)
#else
/**
* @brief ¶¯Ì¬ÉêÇëÄڴ溯Êýºê
* @param size Èë²Î£¬ÉêÇëÄÚ´æµÄ´óС
* @return ³É¹¦·µ»Ø·ÖÅäµÄÄÚ´æÖ¸Õ룬ʧ°Ü·µ»Ø¿ÕÖ¸Õë
* @retval void*ÀàÐ͵ÄÖ¸Õë ³É¹¦
* @retval NULL ʧ°Ü
*/
#define zOss_Malloc(size) mem_malloc(size, ZOSS_FILE, ZOSS_LINE)
/**
* @brief ¶¯Ì¬ÄÚ´æµ÷Õûº¯Êýºê
* @param mem_ptr Èë²Î£¬Òªµ÷ÕûµÄÄÚ´æÖ¸Õë
* @param new_size Èë²Î£¬Òªµ÷ÕûµÄÄÚ´æ´óС
* @return ³É¹¦·µ»Øµ÷ÕûºóµÄÄÚ´æÖ¸Õ룬ʧ°Ü·µ»Ø¿ÕÖ¸Õë
* @retval void*ÀàÐ͵ÄÖ¸Õë ³É¹¦
* @retval NULL ʧ°Ü
*/
#define zOss_Realloc(mem_ptr, new_size) mem_re_alloc(mem_ptr, new_size, ZOSS_FILE, ZOSS_LINE)
/**
* @brief ÊÍ·ÅÄڴ溯Êýºê
* @param mem_ptr Èë²Î£¬ÒªÊͷŵÄÄÚ´æÖ¸Õë
* @return void
*/
#define zOss_Free(mem_ptr) mem_free_extend(mem_ptr, ZOSS_FILE, ZOSS_LINE)
/**
* @brief Äڴ濽±´º¯Êýºê
* @param dest_ptr Èë²Î£¬Ä¿±êÄÚ´æÖ¸Õë
* @param src_ptr Èë²Î£¬Ô´ÄÚ´æÖ¸Õë
* @param size Èë²Î£¬Òª¿½±´µÄ´óС
* @return ·µ»Ødest_ptrµÄÖ¸Õë
*/
#define zOss_Memcpy(dest_ptr, src_ptr, size) mem_memcpy(dest_ptr, src_ptr, size, ZOSS_FILE, ZOSS_LINE)
/**
* @brief ÄÚ´æ³õʼ»¯º¯Êýºê
* @param dest_ptr Èë²Î£¬Òª³õʼ»¯µÄÄ¿±êÄÚ´æÖ¸Õë
* @param value Èë²Î£¬³õʼ»¯µÄÖµ
* @param size Èë²Î£¬³õʼ»¯µÄÄÚ´æ´óС
* @return ·µ»Ø±»³õʼ»¯ÄÚ´æµÄÖ¸Õ루void*£©
*/
#define zOss_Memset(dest_ptr, value, size) mem_memset(dest_ptr, value, size, ZOSS_FILE, ZOSS_LINE)
/**
* @brief ÄÚ´æ°áÒÆ
* @param dest_ptr Èë²Î£¬Òª°áÒÆµÄÄ¿±êÄÚ´æÖ¸Õë
* @param src_ptr Èë²Î£¬°áÒÆµÄÔ´ÄÚ´æÖ¸Õë
* @param count Èë²Î£¬°áÒÆÄÚ´æ´óС
* @return ·µ»Ødest_ptrµÄÖ¸Õë
*/
#define zOss_Memmove(dest_ptr, src_ptr, count) mem_memmove(dest_ptr, src_ptr, count)
/**
* @brief ÄÚ´æ±È½Ïº¯Êýºê
* @param f_buf_ptr Èë²Î£¬Òª±È½ÏµÄÒ»·½ÄÚ´æÖ¸Õë
* @param s_buf_ptr Èë²Î£¬Òª±È½ÏµÄÁíÒ»·½ÄÚ´æÖ¸Õë
* @param count Èë²Î£¬Òª±È½ÏµÄÄÚ´æ´óС
* @return Ïàͬ·µ»Ø0£¬·ñÔò²»Ïàͬ
*/
#define zOss_Memcmp(f_buf_ptr, s_buf_ptr, count) mem_memcmp(f_buf_ptr, s_buf_ptr, count)
#endif
/*******************************************************************************
* Type definitions *
******************************************************************************/
/**
* @brief ZOSS_TIME_TµÄÀàÐͶ¨Òå
*/
typedef UINT32 ZOSS_TIME_T;
/*******************************************************************************
* Global variable declarations *
******************************************************************************/
/*******************************************************************************
* Global function declarations *
******************************************************************************/
/**
* @brief ·µ»Ø´Ó¹«Ôª1970Äê1ÔÂ1ÈÕµÄUTCʱ¼ä´Ó0ʱ0·Ö0ÃëËãÆðµ½ÏÖÔÚËù¾­¹ýµÄÃëÊý
* @param t ³ö²Î£¬±£´æ´Ó¹«Ôª1970Äê1ÔÂ1ÈÕµÄUTCʱ¼ä´Ó0ʱ0·Ö0ÃëËãÆðµ½ÏÖÔÚËù¾­¹ýµÄ
ÃëÊý£¬¸Ã²ÎÊý¿ÉΪNULL
* @return ´Ó¹«Ôª1970Äê1ÔÂ1ÈÕµÄUTCʱ¼ä´Ó0ʱ0·Ö0ÃëËãÆðµ½ÏÖÔÚËù¾­¹ýµÄÃëÊý
* @note
* @warning
*/
ZOSS_TIME_T zOss_Time(ZOSS_TIME_T *t);
#ifndef DOXYGEN_SHOULD_SKIP_THIS
VOID *zOss_CacheMalloc(UINT32 size);
VOID zOss_CacheFree(VOID *ptr);
/* ÕûÊýת³É×Ö·û */
char *itoa(int num, char *str, int radix);
/*******************************************************************************
* Inline function implementations *
******************************************************************************/
#if defined(_MEM_USE_HEAP)
#if defined (_OS_TOS)
static inline VOID *mem_malloc(UINT32 size, const CHAR *file, UINT32 line)
{
return (VOID *)tos_heap_alloc(size, file, line);
}
static inline VOID *mem_re_alloc(VOID *mem_ptr, UINT32 new_size, const CHAR *file, UINT32 line)
{
return (VOID *)tos_heap_realloc(mem_ptr, new_size, file, line);
}
static inline VOID mem_free_extend(VOID *mem_ptr, const CHAR *file, UINT32 line)
{
(VOID)tos_heap_free(mem_ptr, file, line);
}
#elif defined (_OS_LINUX)
static inline VOID *mem_malloc(UINT32 size, const CHAR *file, UINT32 line)
{
return (VOID *)kmalloc(size, GFP_KERNEL);
}
static inline VOID *mem_re_alloc(VOID *mem_ptr, UINT32 new_size, const CHAR *file, UINT32 line)
{
return (VOID *)krealloc(mem_ptr, new_size, GFP_KERNEL);
}
static inline VOID mem_free_extend(VOID *mem_ptr, const CHAR *file, UINT32 line)
{
(VOID)kfree(mem_ptr);
}
#endif
static inline VOID *mem_memcpy(VOID *dest_ptr, const VOID *src_ptr, UINT32 size, const CHAR *file, UINT32 line)
{
return memcpy(dest_ptr, src_ptr, size);
}
static inline VOID *mem_memset(VOID *dest_ptr, SINT32 value, UINT32 size, const CHAR *file, UINT32 line)
{
return memset(dest_ptr, value, size);
}
static inline VOID *mem_memmove(VOID *dest_ptr, const VOID *src_ptr, UINT32 count)
{
return memmove(dest_ptr, src_ptr, count);
}
static inline SINT32 mem_memcmp(const VOID *f_buf_ptr, const VOID *s_buf_ptr, UINT32 count)
{
return memcmp(f_buf_ptr, s_buf_ptr, count);
}
#else
VOID *mem_malloc(UINT32 size, const CHAR *file, UINT32 line);
VOID *mem_re_alloc(VOID *mem_ptr, UINT32 new_size, const CHAR *file, UINT32 line);
VOID mem_free_extend(VOID *mem_ptr, const CHAR *file, UINT32 line);
VOID *mem_memcpy(VOID *dest_ptr, const VOID *src_ptr, UINT32 size, const CHAR *file, UINT32 line);
VOID *mem_memset(VOID *dest_ptr, SINT32 value, UINT32 size, const CHAR *file, UINT32 line);
VOID *mem_memmove(VOID *dest_ptr, const VOID *src_ptr, UINT32 count);
SINT32 mem_memcmp(const VOID *f_buf_ptr, const VOID *s_buf_ptr, UINT32 count);
#endif
#endif//#ifndef DOXYGEN_SHOULD_SKIP_THIS
#ifdef __cplusplus
}
#endif
#endif //#ifdef _USE_CLIB
#endif //#ifndef _OSS_CLIB_H