You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Ventoy/VtoyTool/BabyISO/biso_util.h

251 lines
6.5 KiB
C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/******************************************************************************
* biso_util.h
*
* Copyright (c) 2020, longpanda <admin@ventoy.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef __BISO_UTIL_H__
#define __BISO_UTIL_H__
#ifndef scnprintf
#define scnprintf(buf, bufsize, fmt, arg...) \
{\
snprintf((buf), (bufsize) - 1, fmt, ##arg);\
(buf)[(bufsize) - 1] = 0;\
}
#endif
#define MEMORY_DEBUG 0
#define MEMORY_DEBUG_DUMP 0
#if (MEMORY_DEBUG == 1)
#define BISO_MALLOC BISO_UTIL_Malloc
#define BISO_ZALLOC BISO_UTIL_Zalloc
#define BISO_FREE BISO_UTIL_Free
#else
#define BISO_MALLOC malloc
#define BISO_ZALLOC zalloc
#define BISO_FREE free
#endif
#define BISO_UCHAR_MAX 0xFF
#define BISO_USHORT_MAX 0xFFFF
#define BISO_UINT_MAX 0xFFFFFFFF
/* 无条件字节序转换 */
#define BISO_SWAP_UINT(data) \
((((data) & 0x000000FF) << 24) | \
(((data) & 0x0000FF00) << 8) | \
(((data) & 0x00FF0000) >> 8) | \
(((data) & 0xFF000000) >> 24))
#define BISO_SWAP_USHORT(data) \
((USHORT)(((data) & 0x00FF) << 8) | \
(USHORT)(((data) & 0xFF00) >> 8))
/* 更新计数(加或减) */
#define BISO_STAT_UPDATE(bAdd, a, b) \
{ \
if (BOOL_TRUE == bAdd) \
{ \
(a) += (b); \
} \
else \
{ \
(a) -= (b); \
} \
}
#if (__BYTE_ORDER == __LITTLE_ENDIAN)
/* 从小字节序转为主机序 */
#define BISO_LTOH_UINT(data) data
#define BISO_LTOH_USHORT(data) data
/* 从主机序转为小字节序 */
#define BISO_HTOL_UINT(data) data
#define BISO_HTOL_USHORT(data) data
/* 从主机序转为大字节序 */
#define BISO_HTOM_UINT(data) BISO_SWAP_UINT(data)
#define BISO_HTOM_USHORT(data) BISO_SWAP_USHORT(data)
#elif (__BYTE_ORDER == __BIG_ENDIAN)
/* 从小字节序转为主机序 */
#define BISO_LTOH_UINT(data) BISO_SWAP_UINT(data)
#define BISO_LTOH_USHORT(data) BISO_SWAP_USHORT(data)
/* 从主机序转为小字节序 */
#define BISO_HTOL_UINT(data) BISO_SWAP_UINT(data)
#define BISO_HTOL_USHORT(data) BISO_SWAP_USHORT(data)
/* 从主机序转为大字节序 */
#define BISO_HTOM_UINT(data) data
#define BISO_HTOM_USHORT(data) data
#else
#error ("you must first define __BYTE_ORDER !!!")
#endif
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(a) ((UINT)(sizeof (a) / sizeof ((a)[0])))
#endif
#ifndef DBGASSERT
#define DBGASSERT(expr)
#endif
/* 读写文件时的缓冲区大小 1M */
#define BISO_FILE_BUF_LEN (1024 * 1024)
/* MBUF中最大内存块个数 */
#define BISO_MBUF_MAX_BLK 256
/* MBUF 结构 */
typedef struct tagBISO_MBUF
{
UCHAR *apucDataBuf[BISO_MBUF_MAX_BLK];
UINT auiBufSize[BISO_MBUF_MAX_BLK];
UINT uiCurBufNum;
UINT uiTotDataSize;
}BISO_MBUF_S;
/* 检查读操作句柄有没有已经和ISO文件关联 */
#define BISO_IS_READ_HANDLE_VALID(pstRead) \
(NULL == (((BISO_PARSER_S *)pstRead)->pstPVD) ? BOOL_FALSE : BOOL_TRUE)
#define BISO_CHECK_READ_HANDLE(pstRead) \
{\
if (NULL == ((BISO_PARSER_S *)(pstRead))->pstPVD) \
{ \
return BISO_ERR_HANDLE_UNINITIALIZED; \
} \
}
/* 设置类型 */
#define BISO_SET_FLAG(pstFileNode, pstDirTree) \
{ \
(pstFileNode)->ucFlag = BISO_NODE_REGFILE; \
if (NULL != (pstDirTree)->pstDirStat) \
{ \
(pstFileNode)->ucFlag = BISO_NODE_DIRECTORY; \
} \
else if (BOOL_TRUE == BISO_DIR_TREE_IS_SYMLINK(pstDirTree)) \
{ \
(pstFileNode)->ucFlag = BISO_NODE_SYMLINK; \
} \
}
#define BISO_QUEUE_PTR_NUM 1024
/* 队列节点为避免频繁分配内存这里每次扩展1024个指针的长度空间 */
typedef struct tagBISO_QUEUE_NODE
{
BISO_DLL_NODE_S stNode;
PVOID apList[BISO_QUEUE_PTR_NUM];
USHORT usFirst;
USHORT usLast;
}BISO_QUEUE_NODE_S;
/* 队列/堆栈 简单实现 */
typedef BISO_DLL_S BISO_QUEUE_S;
INT BISO_UTIL_GetTimeZone(VOID);
CHAR * BISO_UTIL_CopyStr
(
IN CONST CHAR *szSrc,
IN UINT uiSrcSize,
OUT CHAR *szDest
);
CHAR * BISO_UTIL_CopyUCS2Str
(
IN CONST CHAR *szSrc,
IN UINT uiSrcSize,
OUT CHAR *szDest
);
VOID BISO_UTIL_PathProc(INOUT CHAR *pcPath, INOUT UINT *puiLen);
ULONG BISO_UTIL_PathSplit
(
IN CONST CHAR *pcFullPath,
OUT UINT *puiDirNum,
OUT UINT *puiDirPos
);
ULONG BISO_UTIL_ReadFile
(
IN CONST CHAR *pcFileName,
IN UINT64 ui64Seek,
IN UINT uiDataLen,
OUT VOID *pDataBuf
);
ULONG BISO_MBUF_Append
(
IN BISO_MBUF_S *pstMBuf,
IN UINT uiDataSize,
IN VOID *pData
);
VOID BISO_MBUF_Free(IN BISO_MBUF_S *pstMBuf);
VOID BISO_MBUF_CopyToBuf(IN CONST BISO_MBUF_S *pstMBuf, OUT VOID *pDataBuf);
VOID BISO_MBUF_PULLUP(INOUT BISO_MBUF_S *pstMBuf);
BISO_QUEUE_S * BISO_QUEUE_Create(VOID);
VOID BISO_QUEUE_Destroy(IN BISO_QUEUE_S *pstQueue);
VOID BISO_QUEUE_Push(IN BISO_QUEUE_S *pstQueue, IN VOID *pData);
VOID * BISO_QUEUE_PopHead(IN BISO_QUEUE_S *pstQueue);
VOID * BISO_QUEUE_PopTail(IN BISO_QUEUE_S *pstQueue);
VOID * BISO_UTIL_Malloc(IN size_t ulSize);
VOID * BISO_UTIL_Zalloc(IN size_t ulSize);
VOID BISO_UTIL_Free(IN VOID *pData);
VOID BISO_UTIL_DumpMemOp(VOID);
ULONG BISO_UTIL_ExtractFile
(
IN BISO_FILE_S *pstFile,
IN UINT64 ui64Seek,
IN UINT64 ui64Len,
IN CONST CHAR *pcNewFileName
);
BOOL_T BISO_PLAT_IsPathExist(IN CONST CHAR *pcPath);
ULONG BISO_PLAT_MkDir(IN CONST CHAR *pcFullPath);
UINT BISO_PLAT_GetMaxPath(VOID);
BISO_FILE_S * BISO_PLAT_OpenExistFile(IN CONST CHAR *pcFileName);
BISO_FILE_S * BISO_PLAT_CreateNewFile(IN CONST CHAR *pcFileName);
VOID BISO_PLAT_CloseFile(IN BISO_FILE_S *pstFile);
INT64 BISO_PLAT_SeekFile(BISO_FILE_S *pstFile, INT64 i64Offset, INT iFromWhere);
UINT64 BISO_PLAT_ReadFile
(
IN BISO_FILE_S *pstFile,
IN UINT uiBlkSize,
IN UINT uiBlkNum,
OUT VOID *pBuf
);
UINT64 BISO_PLAT_WriteFile
(
IN BISO_FILE_S *pstFile,
IN UINT uiBlkSize,
IN UINT uiBlkNum,
IN VOID *pBuf
);
VOID *zalloc(size_t size);
#endif /* __BISO_UTIL_H__ */