1 /******************************************************************************
4 * Copyright (c) 2020, longpanda <admin@ventoy.net>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 3 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
23 #include "biso_list.h"
24 #include "biso_util.h"
25 #include "biso_9660.h"
27 VOID
*zalloc(size_t size
)
29 void *p
= malloc(size
);
38 #if (1 == MEMORY_DEBUG)
39 STATIC UINT g_uiBISOTotMalloc
= 0;
40 STATIC UINT g_uiBISOPeekMalloc
= 0;
41 STATIC UINT g_uiBISOMallocTime
= 0;
42 STATIC UINT g_uiBISOFreeTime
= 0;
44 VOID
*g_apstBISOMalloc
[7000];
45 VOID
*g_apstBISOFree
[7000];
47 VOID
* BISO_UTIL_Malloc(IN
size_t ulSize
)
49 VOID
*pData
= malloc(ulSize
+ 4);
51 #if (1 == MEMORY_DEBUG_DUMP)
52 printf("ID %u Malloc %p %lu\n", g_uiBISOMallocTime
, (UCHAR
*)pData
+ 4, ulSize
);
53 g_apstBISOMalloc
[g_uiBISOMallocTime
] = (UCHAR
*)pData
+ 4;
56 *(UINT32
*)pData
= (UINT32
)ulSize
;
58 g_uiBISOTotMalloc
+= (UINT32
)ulSize
;
59 if (g_uiBISOTotMalloc
> g_uiBISOPeekMalloc
)
61 g_uiBISOPeekMalloc
= g_uiBISOTotMalloc
;
64 return (UCHAR
*)pData
+ 4;
67 VOID
*BISO_UTIL_Zalloc(IN
size_t ulSize
)
69 VOID
*pData
= zalloc(ulSize
+ 4);
71 #if (1 == MEMORY_DEBUG_DUMP)
72 printf("ID %u Zalloc %p %lu\n", g_uiBISOMallocTime
, (UCHAR
*)pData
+ 4, ulSize
);
73 g_apstBISOMalloc
[g_uiBISOMallocTime
] = (UCHAR
*)pData
+ 4;
76 *(UINT32
*)pData
= (UINT32
)ulSize
;
78 g_uiBISOTotMalloc
+= (UINT32
)ulSize
;
79 if (g_uiBISOTotMalloc
> g_uiBISOPeekMalloc
)
81 g_uiBISOPeekMalloc
= g_uiBISOTotMalloc
;
84 return (UCHAR
*)pData
+ 4;
87 VOID
BISO_UTIL_Free(IN VOID
*pData
)
89 #if (1 == MEMORY_DEBUG_DUMP)
90 printf("ID %u Free %p %u\n", g_uiBISOFreeTime
, pData
, *(UINT32
*)((UCHAR
*)pData
- 4));
91 g_apstBISOFree
[g_uiBISOFreeTime
] = pData
;
95 g_uiBISOTotMalloc
-= *(UINT32
*)((UCHAR
*)pData
- 4);
96 if (g_uiBISOTotMalloc
> g_uiBISOPeekMalloc
)
98 g_uiBISOPeekMalloc
= g_uiBISOTotMalloc
;
101 free((UCHAR
*)pData
- 4);
104 VOID
BISO_UTIL_DumpMemOp(VOID
)
106 BISO_DUMP("\n Memory Operation: Malloc(%u) Free(%u) \nTotal current use %u, Peek memory use %u.\n",
107 g_uiBISOMallocTime
, g_uiBISOFreeTime
, g_uiBISOTotMalloc
, g_uiBISOPeekMalloc
);
109 #if (1 == MEMORY_DEBUG_DUMP)
112 for (i
= 0; i
< g_uiBISOMallocTime
; i
++)
114 for (j
= 0; j
< g_uiBISOFreeTime
; j
++)
116 if (g_apstBISOMalloc
[i
] == g_apstBISOFree
[j
])
122 if (j
>= g_uiBISOFreeTime
)
124 printf("ID %u ptr %p is not freed.\n", i
, g_apstBISOMalloc
[i
]);
133 INT
BISO_UTIL_GetTimeZone(VOID
)
139 struct tm
*pstLocalTM
= NULL
;
140 struct tm
*pstGMTM
= NULL
;
143 pstGMTM
= gmtime(&ulTime
);
144 iGMTHour
= pstGMTM
->tm_hour
;
146 pstLocalTM
= localtime(&ulTime
);
147 iLocalHour
= pstLocalTM
->tm_hour
;
149 iTimeZone
= iLocalHour
- iGMTHour
;
154 else if (iTimeZone
> 12)
162 ULONG BISO_UTIL_ReadFile
164 IN CONST CHAR
*pcFileName
,
171 BISO_FILE_S
*pstFile
= NULL
;
173 if ((NULL
== pcFileName
) || (NULL
== pDataBuf
))
175 return BISO_ERR_NULL_PTR
;
178 pstFile
= BISO_PLAT_OpenExistFile(pcFileName
);
181 return BISO_ERR_OPEN_FILE
;
184 BISO_PLAT_SeekFile(pstFile
, ui64Seek
, SEEK_SET
);
185 uiReadLen
= (UINT
)BISO_PLAT_ReadFile(pstFile
, 1, uiDataLen
, pDataBuf
);
186 if (uiReadLen
!= uiDataLen
)
188 BISO_DIAG("Read Len %u, data len %u.", uiReadLen
, uiDataLen
);
189 BISO_PLAT_CloseFile(pstFile
);
190 return BISO_ERR_READ_FILE
;
193 BISO_PLAT_CloseFile(pstFile
);
198 CHAR
* BISO_UTIL_CopyStr
200 IN CONST CHAR
*szSrc
,
208 for (i
= uiSrcSize
; i
> 0; i
--)
210 if ((0 != szSrc
[i
- 1]) && (' ' != szSrc
[i
- 1]))
216 if (' ' != szSrc
[i
- 1])
224 memcpy(szDest
, szSrc
, i
);
230 scnprintf(szDest
, uiSrcSize
, "*All Space*"); /* no safe */
235 scnprintf(szDest
, uiSrcSize
, "*Empty*"); /* no safe */
241 CHAR
* BISO_UTIL_CopyUCS2Str
243 IN CONST CHAR
*szSrc
,
250 memcpy(szDest
, szSrc
, uiSrcSize
);
252 for (i
= 0; (i
* 2 + 1) < uiSrcSize
; i
++)
254 szDest
[i
] = szDest
[i
* 2 + 1];
261 VOID
BISO_UTIL_PathProc(INOUT CHAR
*pcPath
, INOUT UINT
*puiLen
)
265 if ((NULL
== pcPath
) || (NULL
== puiLen
) || (0 == *puiLen
))
271 for (i
= 0; i
< *puiLen
; i
++)
273 if ('\\' == pcPath
[i
])
280 if ('/' != pcPath
[*puiLen
- 1])
282 pcPath
[(*puiLen
)++] = '/';
287 ULONG BISO_UTIL_PathSplit
289 IN CONST CHAR
*pcFullPath
,
297 CONST CHAR
*pcLastPos
= pcFullPath
;
298 CONST CHAR
*pcCurPos
= pcFullPath
;
300 DBGASSERT(NULL
!= pcFullPath
);
301 DBGASSERT(NULL
!= puiDirNum
);
302 DBGASSERT(NULL
!= puiDirPos
);
306 if (('/' == *pcCurPos
) || ('\\' == *pcCurPos
))
308 usPos
= pcLastPos
- pcFullPath
;
309 usLen
= pcCurPos
- pcLastPos
;
312 return BISO_ERR_FAILED
;
315 puiDirPos
[uiDirNum
] = (UINT
)((UINT
)usPos
<< 16) | usLen
;
318 pcLastPos
= pcCurPos
+ 1;
324 usPos
= pcLastPos
- pcFullPath
;
325 usLen
= pcCurPos
- pcLastPos
;
328 return BISO_ERR_FAILED
;
330 puiDirPos
[uiDirNum
++] = (UINT
)((UINT
)usPos
<< 16) | usLen
;
332 *puiDirNum
= uiDirNum
;
336 BISO_DIR_TREE_S
* BISO_UTIL_FindLinkTgt(IN BISO_DIR_TREE_S
*pstCurNode
)
341 CHAR szDirName
[1024];
345 BISO_DIR_TREE_S
*pstFileList
= NULL
;
346 BISO_DIR_TREE_S
*pstRootDir
= NULL
;
348 DBGASSERT(NULL
!= pstCurNode
);
351 if (BOOL_TRUE
!= BISO_DIR_TREE_IS_SYMLINK(pstCurNode
))
356 pcLink
= pstCurNode
->pstPosixInfo
->pcLinkSrc
;
358 if ('/' == pcLink
[0])
364 if (BISO_SUCCESS
!= BISO_UTIL_PathSplit(pcLink
, &uiDirNum
, auiDirPos
))
369 pstRootDir
= pstCurNode
->pstParent
;
372 for (i
= 0; (i
< uiDirNum
) && (NULL
!= pstCurNode
)&& (NULL
!= pstRootDir
); i
++)
374 usPos
= auiDirPos
[i
] >> 16;
375 usLen
= auiDirPos
[i
] & 0xFF;
377 memcpy(szDirName
, pcLink
+ usPos
, usLen
);
378 szDirName
[usLen
] = 0;
380 if (0 == BISO_PATH_STRCMP(szDirName
, "."))
382 pstCurNode
= pstCurNode
->pstParent
;
384 else if (0 == BISO_PATH_STRCMP(szDirName
, ".."))
386 if (NULL
== pstCurNode
->pstParent
)
390 pstCurNode
= pstCurNode
->pstParent
->pstParent
;
391 pstRootDir
= pstCurNode
;
395 pstCurNode
= pstRootDir
->pstChild
;
396 pstFileList
= pstRootDir
->pstFileList
;
401 if (0 == BISO_PATH_STRCMP(pstCurNode
->szName
, szDirName
))
403 pstRootDir
= pstCurNode
;
406 pstCurNode
= pstCurNode
->pstNext
;
410 if (NULL
== pstCurNode
)
412 pstCurNode
= pstFileList
;
415 if (0 == BISO_PATH_STRCMP(pstCurNode
->szName
, szDirName
))
420 pstCurNode
= pstCurNode
->pstNext
;
429 ULONG BISO_MBUF_Append
431 IN BISO_MBUF_S
*pstMBuf
,
436 if ((NULL
== pstMBuf
) || (pstMBuf
->uiCurBufNum
>= BISO_MBUF_MAX_BLK
))
438 return BISO_ERR_INVALID_PARAM
;
441 pstMBuf
->apucDataBuf
[pstMBuf
->uiCurBufNum
] = (UCHAR
*)BISO_MALLOC(uiDataSize
);
442 if (NULL
== pstMBuf
->apucDataBuf
[pstMBuf
->uiCurBufNum
])
444 return BISO_ERR_ALLOC_MEM
;
449 memset(pstMBuf
->apucDataBuf
[pstMBuf
->uiCurBufNum
], 0, uiDataSize
);
453 memcpy(pstMBuf
->apucDataBuf
[pstMBuf
->uiCurBufNum
], pData
, uiDataSize
);
456 pstMBuf
->auiBufSize
[pstMBuf
->uiCurBufNum
] = uiDataSize
;
457 pstMBuf
->uiTotDataSize
+= uiDataSize
;
458 pstMBuf
->uiCurBufNum
++;
463 VOID
BISO_MBUF_Free(IN BISO_MBUF_S
*pstMBuf
)
468 for (i
= 0; i
< pstMBuf
->uiCurBufNum
; i
++)
470 BISO_FREE(pstMBuf
->apucDataBuf
[i
]);
472 memset(pstMBuf
, 0, sizeof(BISO_MBUF_S
));
476 VOID
BISO_MBUF_CopyToBuf(IN CONST BISO_MBUF_S
*pstMBuf
, OUT VOID
*pDataBuf
)
479 UCHAR
*pucDataBuf
= (UCHAR
*)pDataBuf
;
481 if ((NULL
!= pstMBuf
) && (NULL
!= pucDataBuf
))
483 for (i
= 0; i
< pstMBuf
->uiCurBufNum
; i
++)
485 if (NULL
!= pstMBuf
->apucDataBuf
[i
])
487 memcpy(pucDataBuf
, pstMBuf
->apucDataBuf
[i
], pstMBuf
->auiBufSize
[i
]);
488 pucDataBuf
+= pstMBuf
->auiBufSize
[i
];
494 VOID
BISO_MBUF_PULLUP(INOUT BISO_MBUF_S
*pstMBuf
)
499 DBGASSERT(NULL
!= pstMBuf
);
501 if (pstMBuf
->uiCurBufNum
<= 1)
506 uiSize
= pstMBuf
->uiTotDataSize
;
507 pData
= BISO_MALLOC(uiSize
);
513 BISO_MBUF_CopyToBuf(pstMBuf
, pData
);
514 BISO_MBUF_Free(pstMBuf
);
516 memset(pstMBuf
, 0, sizeof(BISO_MBUF_S
));
517 pstMBuf
->apucDataBuf
[0] = (UCHAR
*)pData
;
518 pstMBuf
->auiBufSize
[0] = uiSize
;
519 pstMBuf
->uiTotDataSize
= uiSize
;
520 pstMBuf
->uiCurBufNum
= 1;
525 BISO_QUEUE_S
* BISO_QUEUE_Create(VOID
)
527 BISO_DLL_S
*pstSLL
= (BISO_DLL_S
*)BISO_ZALLOC(sizeof(BISO_DLL_S
));
530 BISO_DLL_Init(pstSLL
);
532 return (BISO_QUEUE_S
*)pstSLL
;
535 VOID
BISO_QUEUE_Destroy(IN BISO_QUEUE_S
*pstQueue
)
537 BISO_DLL_Free(pstQueue
);
541 VOID
BISO_QUEUE_Push(IN BISO_QUEUE_S
*pstQueue
, IN VOID
*pData
)
543 BISO_QUEUE_NODE_S
*pstNode
= NULL
;
545 pstNode
= (BISO_QUEUE_NODE_S
*)BISO_DLL_Last(pstQueue
);
547 /* 当前节点已满需要扩展新内存节点 */
548 if ((NULL
== pstNode
) || (BISO_QUEUE_PTR_NUM
== pstNode
->usLast
))
550 pstNode
= (BISO_QUEUE_NODE_S
*)BISO_ZALLOC(sizeof(BISO_QUEUE_NODE_S
));
555 BISO_DLL_AddTail(pstQueue
, (BISO_DLL_NODE_S
*)pstNode
);
559 pstNode
= (BISO_QUEUE_NODE_S
*)BISO_DLL_Last(pstQueue
);
560 pstNode
->apList
[pstNode
->usLast
++] = pData
;
563 VOID
* BISO_QUEUE_PopHead(IN BISO_QUEUE_S
*pstQueue
)
566 BISO_QUEUE_NODE_S
*pstNode
= NULL
;
568 pstNode
= (BISO_QUEUE_NODE_S
*)BISO_DLL_First(pstQueue
);
575 pData
= pstNode
->apList
[pstNode
->usFirst
++];
577 /* 该节点已空,则摘除节点,释放内存 */
578 if (pstNode
->usFirst
== pstNode
->usLast
)
580 BISO_DLL_DelHead(pstQueue
);
587 VOID
* BISO_QUEUE_PopTail(IN BISO_QUEUE_S
*pstQueue
)
590 BISO_QUEUE_NODE_S
*pstNode
= NULL
;
592 pstNode
= (BISO_QUEUE_NODE_S
*)BISO_DLL_Last(pstQueue
);
593 if ((NULL
== pstNode
) || (0 == pstNode
->usLast
))
600 pData
= pstNode
->apList
[pstNode
->usLast
];
602 /* 该节点已空,则摘除节点,释放内存 */
603 if (pstNode
->usFirst
== pstNode
->usLast
)
605 BISO_DLL_DelTail(pstQueue
);
612 UINT64
BISO_UTIL_WholeFile2Buf(IN CONST CHAR
*szFileName
, OUT UCHAR
*pucBuf
)
616 BISO_FILE_S
*pstFile
= BISO_PLAT_OpenExistFile(szFileName
);
618 uiFileSize
= BISO_PLAT_GetFileSize(szFileName
);
619 uiReadSize
= BISO_PLAT_ReadFile(pstFile
, 1, uiFileSize
, pucBuf
);
621 BISO_PLAT_CloseFile(pstFile
);