From b57ee630fd8ee9e1c2660fef90c0f5bd0edfff65 Mon Sep 17 00:00:00 2001 From: Rafal Kupiec Date: Sat, 9 Dec 2023 20:17:08 +0100 Subject: [PATCH] Implement RtlTrimLeftString(), RtlTrimRightString() and RtlTrimString() routines --- sdk/xtdk/rtlfuncs.h | 12 +++++++ xtoskrnl/rtl/string.c | 80 ++++++++++++++++++++++++++++++++++++++++++ xtoskrnl/xtoskrnl.spec | 3 ++ 3 files changed, 95 insertions(+) diff --git a/sdk/xtdk/rtlfuncs.h b/sdk/xtdk/rtlfuncs.h index 4f275ad..e435a7b 100644 --- a/sdk/xtdk/rtlfuncs.h +++ b/sdk/xtdk/rtlfuncs.h @@ -131,6 +131,18 @@ RtlTokenizeWideString(IN PWCHAR String, IN CONST PWCHAR Delimiter, IN OUT PWCHAR *SavePtr); +XTCDECL +PCHAR +RtlTrimLeftString(IN CONST PCHAR String); + +XTCDECL +PCHAR +RtlTrimRightString(IN CONST PCHAR String); + +XTCDECL +PCHAR +RtlTrimString(IN CONST PCHAR String); + XTCDECL SIZE_T RtlWideStringLength(IN CONST PWCHAR String, diff --git a/xtoskrnl/rtl/string.c b/xtoskrnl/rtl/string.c index 3716d6b..c277e44 100644 --- a/xtoskrnl/rtl/string.c +++ b/xtoskrnl/rtl/string.c @@ -218,3 +218,83 @@ RtlStringToWideString(OUT PWCHAR Destination, return Length - Count; } + +/** + * Removes certain characters from a beginning of the string. + * + * @param String + * Pointer to the null-terminated string to be trimmed. + * + * @return This routine returns a pointer to the left-trimmed string. + * + * @since XT 1.0 + */ +XTCDECL +PCHAR +RtlTrimLeftString(IN CONST PCHAR String) +{ + PCHAR Start; + + /* Initialize pointer */ + Start = String; + + /* Skip all leading whitespaces */ + while(*Start == ' ' || *Start == '\n' || *Start == '\t' || *Start == '\r' || *Start == '\v' || *Start == '\f') + { + /* Advance to the next character */ + Start++; + } + + /* Return left-trimmed string */ + return Start; +} + +/** + * Removes certain characters from the end of the string. + * + * @param String + * Pointer to the null-terminated string to be trimmed. + * + * @return This routine returns a pointer to the right-trimmed string. + * + * @since XT 1.0 + */ +XTCDECL +PCHAR +RtlTrimRightString(IN CONST PCHAR String) +{ + PCHAR End; + + /* Find end of the string */ + End = String + RtlStringLength(String, 0); + + /* Skip all trailing whitespaces */ + while((End != String) && (*End == ' ' || *End == '\n' || *End == '\t' || *End == '\r' || *End == '\v' || *End == '\f')) + { + /* Move to the previous character */ + End--; + } + + /* Terminate the string */ + *End = 0; + + /* Return right-trimmed string */ + return String; +} + +/** + * Removes certain characters from the beginning and the end of the string. + * + * @param String + * Pointer to the null-terminated string to be trimmed. + * + * @return This routine returns a pointer to the trimmed string. + * + * @since XT 1.0 + */ +XTCDECL +PCHAR +RtlTrimString(IN CONST PCHAR String) +{ + return RtlTrimLeftString(RtlTrimRightString(String)); +} diff --git a/xtoskrnl/xtoskrnl.spec b/xtoskrnl/xtoskrnl.spec index 0864d76..cb5869c 100644 --- a/xtoskrnl/xtoskrnl.spec +++ b/xtoskrnl/xtoskrnl.spec @@ -40,6 +40,9 @@ @ cdecl RtlCompareWideStringInsensitive(wstr wstr long) @ cdecl RtlConcatenateWideString(wstr wstr long) @ cdecl RtlTokenizeWideString(wstr wstr wstr) +@ cdecl RtlTrimLeftString(str) +@ cdecl RtlTrimRightString(str) +@ cdecl RtlTrimString(str) @ cdecl RtlWideStringLength(wstr long) @ stdcall RtlWriteRegisterByte(ptr long) @ stdcall RtlWriteRegisterLong(ptr long)