1 /* dynstring.h */
2 /*****************************************************************************/
3 /* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only */
4 /* */
5 /* AS-Port */
6 /* */
7 /* Dynamic String Handling */
8 /* */
9 /*****************************************************************************/
10
11 #include "stdinc.h"
12 #include <string.h>
13 #include "strutil.h"
14
15 #include "dynstring.h"
16
DynString2CString(char * pDest,const tDynString * pSrc,unsigned DestLen)17 unsigned DynString2CString(char *pDest, const tDynString *pSrc, unsigned DestLen)
18 {
19 if (DestLen > 0)
20 {
21 unsigned TransLen = DestLen - 1;
22
23 if (TransLen > pSrc->Length)
24 TransLen = pSrc->Length;
25 memcpy(pDest, pSrc->Contents, TransLen);
26 pDest[TransLen] = '\0';
27 return TransLen;
28 }
29 else
30 return 0;
31 }
32
DynString2DynString(tDynString * pDest,const tDynString * pSrc)33 unsigned DynString2DynString(tDynString *pDest, const tDynString *pSrc)
34 {
35 memcpy(pDest->Contents, pSrc->Contents, pDest->Length = pSrc->Length);
36 return pDest->Length;
37 }
38
DynStringAppend(tDynString * pDest,const char * pSrc,int SrcLen)39 unsigned DynStringAppend(tDynString *pDest, const char *pSrc, int SrcLen)
40 {
41 int TransLen;
42
43 if (SrcLen < 0)
44 SrcLen = strlen(pSrc);
45
46 TransLen = sizeof(pDest->Contents) - pDest->Length;
47 if (SrcLen < TransLen)
48 TransLen = SrcLen;
49 memcpy(pDest->Contents + pDest->Length, pSrc, TransLen);
50 pDest->Length += TransLen;
51 return TransLen;
52 }
53
CString2DynString(tDynString * pDest,const char * pSrc)54 unsigned CString2DynString(tDynString *pDest, const char *pSrc)
55 {
56 pDest->Length = 0;
57 return DynStringAppend(pDest, pSrc, -1);
58 }
59
DynStringAppendDynString(tDynString * pDest,const tDynString * pSrc)60 unsigned DynStringAppendDynString(tDynString *pDest, const tDynString *pSrc)
61 {
62 return DynStringAppend(pDest, pSrc->Contents, pSrc->Length);
63 }
64
DynStringCmp(const tDynString * pStr1,const tDynString * pStr2)65 int DynStringCmp(const tDynString *pStr1, const tDynString *pStr2)
66 {
67 return strlencmp(pStr1->Contents, pStr1->Length, pStr2->Contents, pStr2->Length);
68 }
69
DynStringFind(const tDynString * pHaystack,const tDynString * pNeedle)70 int DynStringFind(const tDynString *pHaystack, const tDynString *pNeedle)
71 {
72 int pos, maxpos = ((int)pHaystack->Length) - ((int)pNeedle->Length);
73
74 for (pos = 0; pos <= maxpos; pos++)
75 if (!memcmp(pHaystack->Contents + pos, pNeedle->Contents, pNeedle->Length))
76 return pos;
77
78 return -1;
79 }
80