[libc] Add islower and isupper implementation.
Reviewed By: sivachandra Differential Revision: https://reviews.llvm.org/D84960
This commit is contained in:
parent
46591b9536
commit
e2d4bf6cec
|
@ -3,6 +3,8 @@ set(TARGET_LIBC_ENTRYPOINTS
|
|||
libc.src.ctype.isalnum
|
||||
libc.src.ctype.isalpha
|
||||
libc.src.ctype.isdigit
|
||||
libc.src.ctype.islower
|
||||
libc.src.ctype.isupper
|
||||
|
||||
# errno.h entrypoints
|
||||
libc.src.errno.__errno_location
|
||||
|
|
|
@ -91,6 +91,8 @@ def CTypeAPI : PublicAPI<"ctype.h"> {
|
|||
"isalnum",
|
||||
"isalpha",
|
||||
"isdigit",
|
||||
"islower",
|
||||
"isupper",
|
||||
];
|
||||
}
|
||||
|
||||
|
|
|
@ -6,6 +6,8 @@ set(TARGET_LIBC_ENTRYPOINTS
|
|||
libc.src.ctype.isalnum
|
||||
libc.src.ctype.isalpha
|
||||
libc.src.ctype.isdigit
|
||||
libc.src.ctype.islower
|
||||
libc.src.ctype.isupper
|
||||
|
||||
# errno.h entrypoints
|
||||
libc.src.errno.__errno_location
|
||||
|
|
|
@ -61,6 +61,16 @@ def StdC : StandardSpec<"stdc"> {
|
|||
RetValSpec<IntType>,
|
||||
[ArgSpec<IntType>]
|
||||
>,
|
||||
FunctionSpec<
|
||||
"islower",
|
||||
RetValSpec<IntType>,
|
||||
[ArgSpec<IntType>]
|
||||
>,
|
||||
FunctionSpec<
|
||||
"isupper",
|
||||
RetValSpec<IntType>,
|
||||
[ArgSpec<IntType>]
|
||||
>,
|
||||
]
|
||||
>;
|
||||
|
||||
|
|
|
@ -33,3 +33,19 @@ add_entrypoint_object(
|
|||
DEPENDS
|
||||
.ctype_utils
|
||||
)
|
||||
|
||||
add_entrypoint_object(
|
||||
islower
|
||||
SRCS
|
||||
islower.cpp
|
||||
HDRS
|
||||
islower.h
|
||||
)
|
||||
|
||||
add_entrypoint_object(
|
||||
isupper
|
||||
SRCS
|
||||
isupper.cpp
|
||||
HDRS
|
||||
isupper.h
|
||||
)
|
||||
|
|
22
libc/src/ctype/islower.cpp
Normal file
22
libc/src/ctype/islower.cpp
Normal file
|
@ -0,0 +1,22 @@
|
|||
//===-- Implementation of islower------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "src/ctype/islower.h"
|
||||
|
||||
#include "src/__support/common.h"
|
||||
|
||||
namespace __llvm_libc {
|
||||
|
||||
// TODO: Currently restricted to default locale.
|
||||
// These should be extended using locale information.
|
||||
int LLVM_LIBC_ENTRYPOINT(islower)(int c) {
|
||||
const unsigned ch = c;
|
||||
return (ch - 'a') < 26;
|
||||
}
|
||||
|
||||
} // namespace __llvm_libc
|
18
libc/src/ctype/islower.h
Normal file
18
libc/src/ctype/islower.h
Normal file
|
@ -0,0 +1,18 @@
|
|||
//===-- Implementation header for islower -------------------------*-C++-*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_LIBC_SRC_CTYPE_ISLOWER_H
|
||||
#define LLVM_LIBC_SRC_CTYPE_ISLOWER_H
|
||||
|
||||
namespace __llvm_libc {
|
||||
|
||||
int islower(int c);
|
||||
|
||||
} // namespace __llvm_libc
|
||||
|
||||
#endif // LLVM_LIBC_SRC_CTYPE_ISLOWER_H
|
22
libc/src/ctype/isupper.cpp
Normal file
22
libc/src/ctype/isupper.cpp
Normal file
|
@ -0,0 +1,22 @@
|
|||
//===-- Implementation of isupper------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "src/ctype/isupper.h"
|
||||
|
||||
#include "src/__support/common.h"
|
||||
|
||||
namespace __llvm_libc {
|
||||
|
||||
// TODO: Currently restricted to default locale.
|
||||
// These should be extended using locale information.
|
||||
int LLVM_LIBC_ENTRYPOINT(isupper)(int c) {
|
||||
const unsigned ch = c;
|
||||
return (ch - 'A') < 26;
|
||||
}
|
||||
|
||||
} // namespace __llvm_libc
|
18
libc/src/ctype/isupper.h
Normal file
18
libc/src/ctype/isupper.h
Normal file
|
@ -0,0 +1,18 @@
|
|||
//===-- Implementation header for isupper -------------------------*-C++-*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_LIBC_SRC_CTYPE_ISUPPER_H
|
||||
#define LLVM_LIBC_SRC_CTYPE_ISUPPER_H
|
||||
|
||||
namespace __llvm_libc {
|
||||
|
||||
int isupper(int c);
|
||||
|
||||
} // namespace __llvm_libc
|
||||
|
||||
#endif // LLVM_LIBC_SRC_CTYPE_ISUPPER_H
|
|
@ -29,3 +29,23 @@ add_libc_unittest(
|
|||
DEPENDS
|
||||
libc.src.ctype.isdigit
|
||||
)
|
||||
|
||||
add_libc_unittest(
|
||||
islower
|
||||
SUITE
|
||||
libc_ctype_unittests
|
||||
SRCS
|
||||
islower_test.cpp
|
||||
DEPENDS
|
||||
libc.src.ctype.islower
|
||||
)
|
||||
|
||||
add_libc_unittest(
|
||||
isupper
|
||||
SUITE
|
||||
libc_ctype_unittests
|
||||
SRCS
|
||||
isupper_test.cpp
|
||||
DEPENDS
|
||||
libc.src.ctype.isupper
|
||||
)
|
||||
|
|
|
@ -7,21 +7,17 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "src/ctype/isalnum.h"
|
||||
#include "utils/UnitTest/Test.h"
|
||||
|
||||
// Helper function that makes a call to isalnum a bit cleaner
|
||||
// for use with testing utilities, since it explicitly requires
|
||||
// a boolean value for EXPECT_TRUE and EXPECT_FALSE.
|
||||
bool call_isalnum(int c) { return __llvm_libc::isalnum(c); }
|
||||
#include "utils/UnitTest/Test.h"
|
||||
|
||||
TEST(IsAlNum, DefaultLocale) {
|
||||
// Loops through all characters, verifying that numbers and letters
|
||||
// return true and everything else returns false.
|
||||
// return non-zero integer and everything else returns a zero.
|
||||
for (int c = 0; c < 255; ++c) {
|
||||
if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') ||
|
||||
('0' <= c && c <= '9'))
|
||||
EXPECT_TRUE(call_isalnum(c));
|
||||
EXPECT_NE(__llvm_libc::isalnum(c), 0);
|
||||
else
|
||||
EXPECT_FALSE(call_isalnum(c));
|
||||
EXPECT_EQ(__llvm_libc::isalnum(c), 0);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,20 +7,16 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "src/ctype/isalpha.h"
|
||||
|
||||
#include "utils/UnitTest/Test.h"
|
||||
|
||||
// Helper function that makes a call to isalpha a bit cleaner
|
||||
// for use with testing utilities, since it explicitly requires
|
||||
// a boolean value for EXPECT_TRUE and EXPECT_FALSE.
|
||||
bool call_isalpha(int c) { return __llvm_libc::isalpha(c); }
|
||||
|
||||
TEST(IsAlpha, DefaultLocale) {
|
||||
// Loops through all characters, verifying that letters return true
|
||||
// and everything else returns false.
|
||||
// Loops through all characters, verifying that letters return a
|
||||
// non-zero integer and everything else returns zero.
|
||||
for (int ch = 0; ch < 255; ++ch) {
|
||||
if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z'))
|
||||
EXPECT_TRUE(call_isalpha(ch));
|
||||
EXPECT_NE(__llvm_libc::isalpha(ch), 0);
|
||||
else
|
||||
EXPECT_FALSE(call_isalpha(ch));
|
||||
EXPECT_EQ(__llvm_libc::isalpha(ch), 0);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,20 +7,16 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "src/ctype/isdigit.h"
|
||||
|
||||
#include "utils/UnitTest/Test.h"
|
||||
|
||||
// Helper function that makes a call to isdigit a bit cleaner
|
||||
// for use with testing utilities, since it explicitly requires
|
||||
// a boolean value for EXPECT_TRUE and EXPECT_FALSE.
|
||||
bool call_isdigit(int c) { return __llvm_libc::isdigit(c); }
|
||||
|
||||
TEST(IsDigit, DefaultLocale) {
|
||||
// Loops through all characters, verifying that numbers return true
|
||||
// and everything else returns false.
|
||||
// Loops through all characters, verifying that numbers return a
|
||||
// non-zero integer and everything else returns zero.
|
||||
for (int ch = 0; ch < 255; ++ch) {
|
||||
if ('0' <= ch && ch <= '9')
|
||||
EXPECT_TRUE(call_isdigit(ch));
|
||||
EXPECT_NE(__llvm_libc::isdigit(ch), 0);
|
||||
else
|
||||
EXPECT_FALSE(call_isdigit(ch));
|
||||
EXPECT_EQ(__llvm_libc::isdigit(ch), 0);
|
||||
}
|
||||
}
|
||||
|
|
21
libc/test/src/ctype/islower_test.cpp
Normal file
21
libc/test/src/ctype/islower_test.cpp
Normal file
|
@ -0,0 +1,21 @@
|
|||
//===-- Unittests for islower----------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "src/ctype/islower.h"
|
||||
#include "utils/UnitTest/Test.h"
|
||||
|
||||
TEST(IsLower, DefaultLocale) {
|
||||
// Loops through all characters, verifying that lowercase letters
|
||||
// return a non-zero integer and everything else returns zero.
|
||||
for (int ch = 0; ch < 255; ++ch) {
|
||||
if ('a' <= ch && ch <= 'z')
|
||||
EXPECT_NE(__llvm_libc::islower(ch), 0);
|
||||
else
|
||||
EXPECT_EQ(__llvm_libc::islower(ch), 0);
|
||||
}
|
||||
}
|
21
libc/test/src/ctype/isupper_test.cpp
Normal file
21
libc/test/src/ctype/isupper_test.cpp
Normal file
|
@ -0,0 +1,21 @@
|
|||
//===-- Unittests for isupper----------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "src/ctype/isupper.h"
|
||||
#include "utils/UnitTest/Test.h"
|
||||
|
||||
TEST(IsUpper, DefaultLocale) {
|
||||
// Loops through all characters, verifying that uppercase letters
|
||||
// return a non-zero integer and everything else returns zero.
|
||||
for (int ch = 0; ch < 255; ++ch) {
|
||||
if ('A' <= ch && ch <= 'Z')
|
||||
EXPECT_NE(__llvm_libc::isupper(ch), 0);
|
||||
else
|
||||
EXPECT_EQ(__llvm_libc::isupper(ch), 0);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue