summaryrefslogtreecommitdiff
path: root/lib/Strings/Character.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Strings/Character.cpp')
-rw-r--r--lib/Strings/Character.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/lib/Strings/Character.cpp b/lib/Strings/Character.cpp
index e5274bf..823f8e3 100644
--- a/lib/Strings/Character.cpp
+++ b/lib/Strings/Character.cpp
@@ -14,6 +14,10 @@ struct CharacterValue {
CharacterValue<T> sliceFrom(size_t Start) const {
return CharacterValue<T>(Ptr + Start, Length - Start);
}
+
+ T operator[] (size_t I) const {
+ return Ptr[I];
+ }
};
static inline
@@ -82,6 +86,47 @@ static int32_t lexcompare(const CharacterValue<T> LHS,
}
template<typename T>
+static size_t index(const CharacterValue<T> String,
+ const CharacterValue<T> SubString) {
+ if(String.Length < SubString.Length)
+ return 0;
+ if(!SubString.Length) return 1;
+
+ auto Range = String.Length - SubString.Length;
+ for(size_t I = 0; I <= Range; ++I) {
+ bool Match = true;
+ for(size_t J = 0; J < SubString.Length; ++J) {
+ if(String[I+J] != SubString[J]) {
+ Match = false;
+ break;
+ }
+ }
+ if(Match) return I+1;
+ }
+ return 0;
+}
+
+template<typename T>
+static size_t index_reverse(const CharacterValue<T> String,
+ const CharacterValue<T> SubString) {
+ if(String.Length < SubString.Length)
+ return 0;
+ if(!SubString.Length) return String.Length + 1;
+
+ for(size_t I = String.Length - SubString.Length + 1; I != 0; --I) {
+ bool Match = true;
+ for(size_t J = 0; J < SubString.Length; ++J) {
+ if(String[I-1+J] != SubString[J]) {
+ Match = false;
+ break;
+ }
+ }
+ if(Match) return I;
+ }
+ return 0;
+}
+
+template<typename T>
static size_t lentrim(const CharacterValue<T> String) {
for(size_t I = String.Length; I > 0; I--) {
if(isWhitespace(String.Ptr[I-1])) return I;
@@ -115,6 +160,13 @@ LIBFLANG_ABI int32_t libflang_lexcompare_char1(const char *LHS, size_t LHSLength
return lexcompare(generic(LHS, LHSLength), generic(RHS, RHSLength));
}
+LIBFLANG_ABI size_t libflang_index_char1(const char *String, size_t Length,
+ const char *SubString, size_t SubLength,
+ int32_t Back) {
+ return Back == 0? index(generic(String, Length), generic(SubString, SubLength)) :
+ index_reverse(generic(String, Length), generic(SubString, SubLength));
+}
+
LIBFLANG_ABI size_t libflang_lentrim_char1(const char *String, size_t Length) {
return lentrim(generic(String, Length));
}