================ @@ -173,5 +173,145 @@ RT_API_ATTRS void ShallowCopy(const Descriptor &to, const Descriptor &from) { ShallowCopy(to, from, to.IsContiguous(), from.IsContiguous()); } +RT_API_ATTRS const char *EnsureNullTerminated( + const char *str, size_t length, Terminator &terminator) { + if (length <= std::strlen(str)) { + char *newCmd{(char *)AllocateMemoryOrCrash(terminator, length + 1)}; + std::memcpy(newCmd, str, length); + newCmd[length] = '\0'; + return newCmd; + } else { + return str; + } +} + +RT_API_ATTRS std::size_t LengthWithoutTrailingSpaces(const Descriptor &d) { + std::size_t s{d.ElementBytes() - 1}; + while (*d.OffsetElement(s) == ' ') { + --s; + } + return s + 1; +} + +// Returns the length of the \p string. Assumes \p string is valid. +RT_API_ATTRS std::int64_t StringLength(const char *string) { + std::size_t length{std::strlen(string)}; + if constexpr (sizeof(std::size_t) < sizeof(std::int64_t)) { + return static_cast<std::int64_t>(length); + } else { + std::size_t max{std::numeric_limits<std::int64_t>::max()}; + return length > max ? 0 // Just fail. + : static_cast<std::int64_t>(length); + } +} + +RT_API_ATTRS bool IsValidCharDescriptor(const Descriptor *value) { + return value && value->IsAllocated() && + value->type() == TypeCode(TypeCategory::Character, 1) && + value->rank() == 0; +} + +RT_API_ATTRS bool IsValidIntDescriptor(const Descriptor *length) { + auto typeCode{length->type().GetCategoryAndKind()}; + // Check that our descriptor is allocated and is a scalar integer with + // kind != 1 (i.e. with a large enough decimal exponent range). + return length->IsAllocated() && length->rank() == 0 && + length->type().IsInteger() && typeCode && typeCode->second != 1; +} + +RT_API_ATTRS void FillWithSpaces(const Descriptor &value, std::size_t offset) { + if (offset < value.ElementBytes()) { ---------------- klausler wrote:
If it's not a safe general-purpose utility routine, then don't put it into `tools.cpp`. Or leave it here and add some checking. https://github.com/llvm/llvm-project/pull/74077 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits