31#include "NvFlowTypes.h"
41void NvFlowStringPoolTempAllocate(
NvFlowStringPool* ptr,
char** p_str_data, NvFlowUint64* p_str_size);
43void NvFlowStringPoolTempAllocateCommit(
NvFlowStringPool* ptr,
char* str_data, NvFlowUint64 str_size);
51char* NvFlowStringPrintV(
NvFlowStringPool* pool,
const char* format, va_list args);
55#define NV_FLOW_CSTR(X) NvFlowStringView{X, sizeof(X) - 1}
57#define NvFlowStringToInteger(input) atoi(input)
59#define NvFlowStringMakeView(input) NvFlowStringView{ input, (int)strlen(input) }
63NV_FLOW_INLINE
int NvFlowCharIsWhiteSpace(
char c)
65 return c ==
' ' || c ==
'\n' || c ==
'\r' || c ==
'\t' || c ==
'\f' || c ==
'\v';
68NV_FLOW_INLINE
int NvFlowCharIsWhiteSpaceButNotNewline(
char c)
70 return c ==
' ' || c ==
'\r' || c ==
'\t' || c ==
'\f' || c ==
'\v';
73NV_FLOW_INLINE
int NvFlowCharIsAlphaUnderscore(
char c)
75 return (c >=
'a' && c <=
'z') || (c >=
'A' && c <=
'Z') || (c ==
'_');
78NV_FLOW_INLINE
int NvFlowCharIsAlphaNum(
char c)
80 return (c >=
'a' && c <=
'z') || (c >=
'A' && c <=
'Z') || (c >=
'0' && c <=
'9') || (c ==
'_');
83NV_FLOW_INLINE
int NvFlowCharIsNum(
char c)
85 return (c >=
'0' && c <=
'9');
90NV_FLOW_INLINE NvFlowUint64 NvFlowStringLength(
const char* a)
104NV_FLOW_INLINE
int NvFlowStringCompare(
const char* a,
const char* b)
109 while (a[idx] || b[idx])
111 if (a[idx] != b[idx])
113 return a[idx] < b[idx] ? -1 : +1;
120NV_FLOW_INLINE
char* NvFlowStringFromView(
NvFlowStringPool* pool,
const char* data, NvFlowUint64 size)
122 char* str = NvFlowStringPoolAllocate(pool, size);
123 for (NvFlowUint64 i = 0; i < size; i++)
130NV_FLOW_INLINE
void NvFlowStringSplitDelimFirst(
NvFlowStringPool* pool,
char** pFirst,
char** pSecond,
const char* input_data,
char delim)
132 NvFlowUint64 input_size = NvFlowStringLength(input_data);
133 NvFlowUint64 slashIdx = 0;
134 while (slashIdx < input_size)
136 if (input_data[slashIdx] == delim)
142 *pFirst = NvFlowStringFromView(pool, input_data, slashIdx + 1);
143 *pSecond = NvFlowStringFromView(pool, input_data + slashIdx + 1, input_size - slashIdx - 1);
146NV_FLOW_INLINE
void NvFlowStringSplitDelimLast(
NvFlowStringPool* pool,
char** pFirst,
char** pSecond,
const char* input_data,
char delim)
148 NvFlowUint64 input_size = NvFlowStringLength(input_data);
149 NvFlowUint64 slashIdx = input_size - 1;
150 while (slashIdx < input_size)
152 if (input_data[slashIdx] == delim)
158 *pFirst = NvFlowStringFromView(pool, input_data, slashIdx + 1);
159 *pSecond = NvFlowStringFromView(pool, input_data + slashIdx + 1, input_size - slashIdx - 1);
162NV_FLOW_INLINE
char* NvFlowStringDup(
NvFlowStringPool* pool,
const char* name)
164 NvFlowUint64 name_size = NvFlowStringLength(name);
165 return NvFlowStringFromView(pool, name, name_size);
168NV_FLOW_INLINE
char* NvFlowStringConcat(
NvFlowStringPool* pool,
const char* dir_data,
const char* filename_data)
170 NvFlowUint64 dir_size = NvFlowStringLength(dir_data);
171 NvFlowUint64 filename_size = NvFlowStringLength(filename_data);
172 char* s_data = NvFlowStringPoolAllocate(pool, dir_size + filename_size);
173 for (NvFlowUint64 i = 0; i < dir_size; i++)
175 s_data[i] = dir_data[i];
177 for (NvFlowUint64 i = 0; i < filename_size; i++)
179 s_data[i + dir_size] = filename_data[i];
184NV_FLOW_INLINE
char* NvFlowStringConcatN(
NvFlowStringPool* pool,
const char** views, NvFlowUint64 numViews)
186 NvFlowUint64 totalSize = 0;
187 for (NvFlowUint64 viewIdx = 0; viewIdx < numViews; viewIdx++)
189 totalSize += NvFlowStringLength(views[viewIdx]);
191 char* s_data = NvFlowStringPoolAllocate(pool, totalSize);
192 NvFlowUint64 dstOffset = 0;
193 for (NvFlowUint64 viewIdx = 0; viewIdx < numViews; viewIdx++)
195 const char* view_data = views[viewIdx];
196 NvFlowUint64 view_size = NvFlowStringLength(view_data);
197 for (NvFlowUint64 i = 0; i < view_size; i++)
199 s_data[i + dstOffset] = view_data[i];
201 dstOffset += view_size;
206NV_FLOW_INLINE
char* NvFlowStringConcat3(
NvFlowStringPool* pool,
const char* a,
const char* b,
const char* c)
208 const char* list[3u] = { a, b, c };
209 return NvFlowStringConcatN(pool, list, 3u);
212NV_FLOW_INLINE
char* NvFlowStringConcat4(
NvFlowStringPool* pool,
const char* a,
const char* b,
const char* c,
const char* d)
214 const char* list[4u] = { a, b, c, d };
215 return NvFlowStringConcatN(pool, list, 4u);
218NV_FLOW_INLINE
char* NvFlowStringTrimEnd(
NvFlowStringPool* pool,
const char* a_data,
char trimChar)
220 NvFlowUint64 a_size = NvFlowStringLength(a_data);
221 while (a_size > 0 && a_data[a_size - 1] == trimChar)
225 return NvFlowStringFromView(pool, a_data, a_size);
228NV_FLOW_INLINE
char* NvFlowStringTrimBeginAndEnd(
NvFlowStringPool* pool,
const char* a_data,
char trimChar)
230 NvFlowUint64 a_size = NvFlowStringLength(a_data);
231 while (a_size > 0 && a_data[0] == trimChar)
236 while (a_size > 0 && a_data[a_size - 1] == trimChar)
240 return NvFlowStringFromView(pool, a_data, a_size);
245const char* NvFlowTextFileLoad(
NvFlowStringPool* pool,
const char* filename);
247void NvFlowTextFileStore(
const char* text,
const char* filename);
249NvFlowBool32 NvFlowTextFileTestOpen(
const char* filename);
251void NvFlowTextFileRemove(
const char* name);
253void NvFlowTextFileRename(
const char* oldName,
const char* newName);
255NvFlowBool32 NvFlowTextFileDiffAndWriteIfModified(
const char* filenameDst,
const char* filenameTmp);
Definition NvFlowString.cpp:35