diff options
author | arphaman <arphaman@gmail.com> | 2013-09-18 14:35:17 +0100 |
---|---|---|
committer | arphaman <arphaman@gmail.com> | 2013-09-18 14:35:17 +0100 |
commit | e183a128858719f968a20bf84c8780a362316422 (patch) | |
tree | 3bc62a789a277bd10e7c8ade44ee9ad504733dd0 /lib/Strings/Character.cpp | |
parent | 8e83adfdc9dacf83d9bdee65bd23b9416ceededf (diff) | |
download | libflangrt-e183a128858719f968a20bf84c8780a362316422.tar.gz |
added support for INDEX intrinsic
Diffstat (limited to 'lib/Strings/Character.cpp')
-rw-r--r-- | lib/Strings/Character.cpp | 52 |
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)); } |