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