New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add POSIX compatible case insensitive compare #290
Merged
Merged
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
/* | ||
* Copyright (C) 2013 INRIA. | ||
* | ||
* This file subject to the terms and conditions of the GNU Lesser General | ||
* Public License. See the file LICENSE in the top level directory for more | ||
* details. | ||
*/ | ||
|
||
/** | ||
* @defgroup posix POSIX wrapper of RIOT | ||
* @brief POSIX header files | ||
* @see <a href="http://pubs.opengroup.org/onlinepubs/9699919799/"> | ||
* The Open Group Specifications Issue 7 | ||
* </a> | ||
* @ingroup posix | ||
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
/** | ||
* Copyright (C) 2013 INRIA. | ||
* | ||
* This file subject to the terms and conditions of the GNU Lesser General | ||
* Public License. See the file LICENSE in the top level directory for more | ||
* details. | ||
*/ | ||
|
||
/** | ||
* @addtogroup posix | ||
* @{ | ||
*/ | ||
|
||
/** | ||
* @file strings.h | ||
* @brief string operations | ||
* | ||
* @see <a href="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/strings.h.html"> | ||
* The Open Group Base Specifications Issue 7, <strings.h> | ||
* </a> | ||
* | ||
* @author Freie Universität Berlin | ||
* @author Martin Lenders <mlenders@inf.fu-berlin.de> | ||
*/ | ||
#ifndef STRINGS_H | ||
#define STRINGS_H | ||
|
||
#include <sys/types.h> | ||
|
||
/** | ||
* @brief Returns the position of the first (least significant) bit set in | ||
* integer *i*, or 0 if no bits are set in i. | ||
* | ||
* @param[in] i an integer number. | ||
* | ||
* @return Position (1 for least significant bit) of the first bit set, | ||
* 0 if no bits are set. | ||
* | ||
* @see <a href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/ffs.html"> | ||
* The Open Group Base Specification Issue 7, ffs | ||
* </a> | ||
*/ | ||
#define ffs(i) __builtin_ffs(i) | ||
|
||
/** | ||
* @brief Compares two strings *s1* and *s2*, ignoring the case of the | ||
* characters for not more than n bytes from the strings. | ||
* | ||
* @param[in] s1 a string. | ||
* @param[in] s2 another string. | ||
* @param[in] n number of bytes to be compared | ||
* | ||
* @return A value greater 0 if, ignoring the case of the character, *s1* is | ||
* greater than *s2* up to n bytes, less than 0 if smaller, and 0 if | ||
* equal | ||
* | ||
* @see <a href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/strcasecmp.html"> | ||
* The Open Group Base Specification Issue 7, strcasecmp | ||
* </a> | ||
*/ | ||
int strncasecmp(const char *s1, const char *s2, size_t n); | ||
|
||
/** | ||
* @brief Compares two strings *s1* and *s2*, ignoring the case of the | ||
* characters for not more than n bytes from the strings, but using | ||
* the current locale settings to determine the case. | ||
* | ||
* @note Since RIOT does not support locales (yet), this is just an | ||
* alias for strncasecmp() | ||
* | ||
* @param[in] s1 a string. | ||
* @param[in] s2 another string. | ||
* @param[in] n number of bytes to be compared | ||
* | ||
* @return A value greater 0 if, ignoring the case of the character, *s1* is | ||
* greater than *s2* up to n bytes, less than 0 if smaller, and 0 if | ||
* equal | ||
* | ||
* @see <a href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/strcasecmp.html"> | ||
* The Open Group Base Specification Issue 7, strcasecmp | ||
* </a> | ||
*/ | ||
#define strncasecmp_l(s1, s2, n, l) (strncasecmp(s1, s2, n)) | ||
|
||
/** | ||
* @brief Compares two strings *s1* and *s2*, ignoring the case of the characters. | ||
* | ||
* @param[in] s1 a string. | ||
* @param[in] s2 another string. | ||
* | ||
* @return A value greater 0 if, ignoring the case of the character, *s1* is | ||
* greater than *s2*, less than 0 if smaller, and 0 if equal | ||
* | ||
* @see <a href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/strcasecmp.html"> | ||
* The Open Group Base Specification Issue 7, strcasecmp | ||
* </a> | ||
*/ | ||
#define strcasecmp(s1, s2) strncasecmp(s1, s2, -1) | ||
|
||
/** | ||
* @brief Compares two strings *s1* and *s2*, ignoring the case of the | ||
* characters, but using the current locale settings to determine the | ||
* case. | ||
* | ||
* @note Since RIOT does not support locales (yet), this is just an | ||
* alias for strcasecmp() | ||
* | ||
* @param[in] s1 a string. | ||
* @param[in] s2 another string. | ||
* | ||
* @return A value greater 0 if, ignoring the case of the character, *s1* is | ||
* greater than *s2*, less than 0 if smaller, and 0 if equal | ||
* | ||
* @see <a href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/strcasecmp.html"> | ||
* The Open Group Base Specification Issue 7, strcasecmp | ||
* </a> | ||
*/ | ||
#define strcasecmp_l(s1, s2, l) strncasecmp(s1, s2, -1) | ||
|
||
#endif /* STRINGS_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
#include <strings.h> | ||
#include <ctype.h> | ||
|
||
int strncasecmp(const char *s1, const char *s2, size_t n) | ||
{ | ||
while (n-- && tolower(*s1) == tolower(*s2)) { | ||
if (!n && !*s1) { | ||
break; | ||
} | ||
|
||
s1++; | ||
s2++; | ||
} | ||
|
||
return (tolower(*s1) - tolower(*s2)); | ||
} |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks very similar to
number_of_lowest_bit()
fromcore/bitarithm.c
. I think we should make the latter one a wrapper using this.Be careful: the return value is slightly different.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
number_of_lowest_bit()
shows some very strange behaviour on native (v is not the given value but some random value) so I can't say if it would work or not. Furthermore it takes unsigned integers, while ffs takes signed, so it is slightly different.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tested with https://github.com/OlegHahm/miniature-dangerzone/tree/master/string_test and seems to work. (Note that 0 is no valid input for
number_of_lowest_bit()
.)There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah, 0 was of course the first value I tested. So what did you meant with your original suggestion?
or
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would vote for the second solution.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Then it's not relevant for this PR. Moved the discussion to #294