Files
stubser/src/ext/xstring.c

131 lines
2.6 KiB
C

/*!
* @file xstring.c
* @brief
* @details
* Project: \n
* Subsystem: \n
* Module: \n
* Code: GNU-C\n
*
* @date 27.02.2017
* @author SESA354004
*/
#include "xstring.h"
#include "ctype.h"
char* gnu_basename(char *path)
{
char *baseWin = strrchr(path, '\\');
char *base = strrchr(path, '/');
if (baseWin > base)
{
base = baseWin;
}
return base ? base + 1 : path;
}
/*!
* @brief Trim leading and trailing whitespaces
* @param [in] *str Input string
* @retval char* pointer to the trimmed substring
*
* @details
* This function returns a pointer to a substring of the original string.
* If the given string was allocated dynamically, the caller must not overwrite
* that pointer with the returned value, since the original pointer must be
* deallocated using the same allocator with which it was allocated. The return
* value must NOT be deallocated using free() etc.
*/
char* strntrimStatic(char *aStr, size_t aMaxLength)
{
char *end;
// Trim leading space
while (isspace((unsigned char)*aStr) && 0 < aMaxLength)
{
if (--aMaxLength > 0)
{
++aStr;
}
}
// All spaces at termination or end of max length
if (*aStr == '\0' || 0 == aMaxLength)
{
return aStr;
}
// Trim trailing space
if (strlen(aStr) >= aMaxLength)
{
end = aStr + aMaxLength - 1;
}
else
{
end = aStr + strlen(aStr) - 1;
}
while (end > aStr && isspace((unsigned char )*end))
{
end--;
}
// Write new null terminator (if length is enough)
if (end < (aStr + aMaxLength - 1))
{
*(end + 1) = '\0';
}
return aStr;
}
void xStringTrim(char *aStr, size_t aMaxLength)
{
char *start;
char *end;
if (NULL == aStr)
{
return;
}
start = aStr;
// Trim leading space
while (isspace((unsigned char)*aStr) && 0 < aMaxLength)
{
if (--aMaxLength > 0)
{
++aStr;
}
}
// All spaces at termination or end of max length
if (*aStr == '\0' || 0 == aMaxLength)
{
start = '\0';
return;
}
(void) strlcpy(start, aStr, strlen(aStr) + 1);
// Trim trailing space
if (strlen(start) >= aMaxLength)
{
end = start + aMaxLength - 1;
}
else
{
end = start + strlen(start) - 1;
}
while (end > start && isspace((unsigned char )*end))
{
end--;
}
// Write new null terminator (if length is enough)
if (end < (start + aMaxLength - 1))
{
*(end + 1) = '\0';
}
}