Simplify DqnJson array iterator, fixed string ctor change
This commit is contained in:
parent
920df31c51
commit
5d77aa3f4a
79
dqn.h
79
dqn.h
@ -675,7 +675,7 @@ struct DqnSlice
|
|||||||
DqnSlice() = default;
|
DqnSlice() = default;
|
||||||
DqnSlice(T *str, i32 len) { this->data = str; this->len = len; }
|
DqnSlice(T *str, i32 len) { this->data = str; this->len = len; }
|
||||||
};
|
};
|
||||||
#define DQN_SLICE_NAME(name) DqnSlice<char const>(name, DQN_CHAR_COUNT(name))
|
#define DQN_SLICE(literal) DqnSlice<char const>(literal, DQN_CHAR_COUNT(literal))
|
||||||
|
|
||||||
#define DQN_SLICE_CMP(a, b, ignoreCase) (a.len == b.len && (DqnStr_Cmp(a.data, b.data, a.len, ignoreCase) == 0))
|
#define DQN_SLICE_CMP(a, b, ignoreCase) (a.len == b.len && (DqnStr_Cmp(a.data, b.data, a.len, ignoreCase) == 0))
|
||||||
// #DqnChar API
|
// #DqnChar API
|
||||||
@ -747,8 +747,11 @@ DQN_FILE_SCOPE inline DqnSlice<char> DqnStr_RemoveLeadTrailBraces (char const *s
|
|||||||
// Return the len of the derived string. If buf is nullptr and or bufSize is 0 the function returns the
|
// Return the len of the derived string. If buf is nullptr and or bufSize is 0 the function returns the
|
||||||
// required string length for the integer
|
// required string length for the integer
|
||||||
// TODO NOTE(doyle): Parsing stops when a non-digit is encountered, so numbers with ',' don't work atm.
|
// TODO NOTE(doyle): Parsing stops when a non-digit is encountered, so numbers with ',' don't work atm.
|
||||||
DQN_FILE_SCOPE i32 Dqn_I64ToStr(i64 const value, char *buf, i32 bufSize);
|
DQN_FILE_SCOPE i32 Dqn_I64ToStr(i64 const value, char *buf, i32 bufSize);
|
||||||
DQN_FILE_SCOPE i64 Dqn_StrToI64(char const *buf, i64 bufSize);
|
DQN_FILE_SCOPE i64 Dqn_StrToI64(char const *buf, i64 bufSize);
|
||||||
|
DQN_FILE_SCOPE inline i64 Dqn_StrToI64(DqnSlice<char const> buf) { return Dqn_StrToI64(buf.data, buf.len); }
|
||||||
|
DQN_FILE_SCOPE inline i64 Dqn_StrToI64(DqnSlice<char> buf) { return Dqn_StrToI64(buf.data, buf.len); }
|
||||||
|
|
||||||
// WARNING: Not robust, precision errors and whatnot but good enough!
|
// WARNING: Not robust, precision errors and whatnot but good enough!
|
||||||
DQN_FILE_SCOPE f32 Dqn_StrToF32(char const *buf, i64 bufSize);
|
DQN_FILE_SCOPE f32 Dqn_StrToF32(char const *buf, i64 bufSize);
|
||||||
|
|
||||||
@ -2038,7 +2041,8 @@ struct DqnFixedString
|
|||||||
char str[MAX];
|
char str[MAX];
|
||||||
|
|
||||||
DqnFixedString(): len(0) { this->str[0] = 0; }
|
DqnFixedString(): len(0) { this->str[0] = 0; }
|
||||||
DqnFixedString(char const *str, int len = -1) { this->len = DqnFixedString__Append(this->str, MAX, str, len); }
|
DqnFixedString(char const *str) { this->len = DqnFixedString__Append(this->str, MAX, str, -1); }
|
||||||
|
DqnFixedString(char const *str, int len) { this->len = DqnFixedString__Append(this->str, MAX, str, len); }
|
||||||
DqnFixedString(DqnSlice<char const> const &other) { this->len = DqnFixedString__Append(this->str, MAX, other.data, other.len); }
|
DqnFixedString(DqnSlice<char const> const &other) { this->len = DqnFixedString__Append(this->str, MAX, other.data, other.len); }
|
||||||
DqnFixedString(DqnSlice<char> const &other) { this->len = DqnFixedString__Append(this->str, MAX, other.data, other.len); }
|
DqnFixedString(DqnSlice<char> const &other) { this->len = DqnFixedString__Append(this->str, MAX, other.data, other.len); }
|
||||||
DqnFixedString(DqnFixedString const &other) { if (this != &other) this->len = DqnFixedString__Append(this->str, MAX, other.str, other.len); }
|
DqnFixedString(DqnFixedString const &other) { if (this != &other) this->len = DqnFixedString__Append(this->str, MAX, other.str, other.len); }
|
||||||
@ -2641,7 +2645,8 @@ struct DqnJson
|
|||||||
DqnSlice<char> value;
|
DqnSlice<char> value;
|
||||||
i32 numEntries;
|
i32 numEntries;
|
||||||
|
|
||||||
operator bool() const { return (value.data != nullptr); }
|
operator bool () const { return (value.data != nullptr); }
|
||||||
|
i64 ToI64() const { return Dqn_StrToI64(value.data, value.len); }
|
||||||
};
|
};
|
||||||
|
|
||||||
// Zero allocation json finder. Returns the data of the value.
|
// Zero allocation json finder. Returns the data of the value.
|
||||||
@ -2654,10 +2659,8 @@ DQN_FILE_SCOPE DqnJson DqnJson_Get (DqnSlice<char const> const buf,
|
|||||||
DQN_FILE_SCOPE DqnJson DqnJson_Get (DqnJson const input, DqnSlice<char const> const findProperty);
|
DQN_FILE_SCOPE DqnJson DqnJson_Get (DqnJson const input, DqnSlice<char const> const findProperty);
|
||||||
DQN_FILE_SCOPE DqnJson DqnJson_Get (DqnJson const input, DqnSlice<char> const findProperty);
|
DQN_FILE_SCOPE DqnJson DqnJson_Get (DqnJson const input, DqnSlice<char> const findProperty);
|
||||||
|
|
||||||
// newInput: (Optional) Returns the input advanced to the next array item, can be used again with
|
|
||||||
// function to get next array item.
|
|
||||||
// return: The array item.
|
// return: The array item.
|
||||||
DQN_FILE_SCOPE DqnJson DqnJson_GetNextArrayItem(DqnJson const input, DqnJson *newInput);
|
DQN_FILE_SCOPE DqnJson DqnJson_GetNextArrayItem(DqnJson *iterator);
|
||||||
|
|
||||||
#endif /* DQN_H */
|
#endif /* DQN_H */
|
||||||
|
|
||||||
@ -6439,17 +6442,31 @@ wchar_t *DqnString::ToWChar(DqnMemAPI *api) const
|
|||||||
// return: The number of bytes written to dest
|
// return: The number of bytes written to dest
|
||||||
FILE_SCOPE int DqnFixedString__Append(char *dest, int destSize, char const *src, int len)
|
FILE_SCOPE int DqnFixedString__Append(char *dest, int destSize, char const *src, int len)
|
||||||
{
|
{
|
||||||
|
i32 realLen = 0;
|
||||||
if (len <= -1)
|
if (len <= -1)
|
||||||
{
|
{
|
||||||
len = DqnStr_Len(src);
|
char *ptr = dest;
|
||||||
|
char *end = ptr + destSize;
|
||||||
|
|
||||||
|
while (*src && ptr != end)
|
||||||
|
*ptr++ = *src++;
|
||||||
|
|
||||||
|
if (ptr == end)
|
||||||
|
{
|
||||||
|
DQN_ASSERT(!src[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
realLen = ptr - dest;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
realLen = DQN_MIN(len, destSize - 1);
|
||||||
|
DqnMem_Copy(dest, src, realLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
i32 bytesToCopy = DQN_MIN(len, destSize - 1);
|
DQN_ASSERT(realLen <= destSize && realLen >= 0);
|
||||||
DQN_ASSERT(len <= destSize && bytesToCopy >= 0);
|
dest[realLen] = 0;
|
||||||
|
return realLen;
|
||||||
DqnMem_Copy(dest, src, bytesToCopy);
|
|
||||||
dest[bytesToCopy] = 0;
|
|
||||||
return bytesToCopy;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// #Dqn
|
// #Dqn
|
||||||
@ -6689,30 +6706,28 @@ DQN_FILE_SCOPE DqnJson DqnJson_Get(DqnJson const input, DqnSlice<char const> con
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
DQN_FILE_SCOPE DqnJson DqnJson_GetNextArrayItem(DqnJson const input, DqnJson *newInput)
|
DQN_FILE_SCOPE DqnJson DqnJson_GetNextArrayItem(DqnJson *iterator)
|
||||||
{
|
{
|
||||||
DqnJson result = {};
|
DqnJson result = {};
|
||||||
if (input.type != DqnJson::Type::Array || input.numEntries <= 0)
|
if (iterator->type != DqnJson::Type::Array || iterator->numEntries <= 0)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
result = DqnJson_Get(input.value, DQN_SLICE_NAME("{"));
|
result = DqnJson_Get(iterator->value, DQN_SLICE("{"));
|
||||||
if (result && newInput)
|
if (result)
|
||||||
{
|
{
|
||||||
*newInput = input;
|
char const *end = iterator->value.data + iterator->value.len;
|
||||||
char const *end = input.value.data + input.value.len;
|
iterator->value.data = result.value.data + result.value.len;
|
||||||
newInput->value.data = result.value.data + result.value.len;
|
iterator->numEntries--;
|
||||||
newInput->numEntries--;
|
|
||||||
|
|
||||||
while (newInput->value.data[0] && *newInput->value.data++ != '}')
|
while (iterator->value.data[0] && *iterator->value.data++ != '}')
|
||||||
;
|
;
|
||||||
|
|
||||||
newInput->value.data = DqnChar_SkipWhitespace(newInput->value.data);
|
iterator->value.data = DqnChar_SkipWhitespace(iterator->value.data);
|
||||||
if (newInput->value.data[0] && newInput->value.data[0] == ',')
|
if (iterator->value.data[0] && iterator->value.data[0] == ',')
|
||||||
newInput->value.data++;
|
iterator->value.data++;
|
||||||
|
|
||||||
newInput->value.data = DqnChar_SkipWhitespace(newInput->value.data);
|
iterator->value.data = DqnChar_SkipWhitespace(iterator->value.data);
|
||||||
|
iterator->value.len = (iterator->value.data) ? static_cast<i32>(end - iterator->value.data) : 0;
|
||||||
newInput->value.len = (newInput->value.data) ? static_cast<i32>(end - newInput->value.data) : 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -8957,7 +8972,7 @@ DQN_PLATFORM_INTERNAL_GET_NUM_CORES_AND_THREADS(DqnPlatformInternal_GetNumCoresA
|
|||||||
{
|
{
|
||||||
*numThreadsPerCore = 0;
|
*numThreadsPerCore = 0;
|
||||||
// Find the offset to the processor field and move to it
|
// Find the offset to the processor field and move to it
|
||||||
DqnSlice<char const> processor = DQN_SLICE_NAME("processor");
|
DqnSlice<char const> processor = DQN_SLICE("processor");
|
||||||
i32 processorOffset = DqnStr_FindFirstOccurence(srcPtr, srcLen, processor.data, processor.len);
|
i32 processorOffset = DqnStr_FindFirstOccurence(srcPtr, srcLen, processor.data, processor.len);
|
||||||
|
|
||||||
DQN_ASSERT(processorOffset != -1);
|
DQN_ASSERT(processorOffset != -1);
|
||||||
@ -8977,7 +8992,7 @@ DQN_PLATFORM_INTERNAL_GET_NUM_CORES_AND_THREADS(DqnPlatformInternal_GetNumCoresA
|
|||||||
{
|
{
|
||||||
*numCores = 0;
|
*numCores = 0;
|
||||||
// Find the offset to the cpu cores field and move to it
|
// Find the offset to the cpu cores field and move to it
|
||||||
DqnSlice<char const> cpuCores = DQN_SLICE_NAME("cpu cores");
|
DqnSlice<char const> cpuCores = DQN_SLICE("cpu cores");
|
||||||
i32 cpuCoresOffset = DqnStr_FindFirstOccurence(srcPtr, srcLen, cpuCores.data, cpuCores.len);
|
i32 cpuCoresOffset = DqnStr_FindFirstOccurence(srcPtr, srcLen, cpuCores.data, cpuCores.len);
|
||||||
DQN_ASSERT(cpuCoresOffset != -1);
|
DQN_ASSERT(cpuCoresOffset != -1);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user