/*
- * Copyright 2017 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2017-2023 The OpenSSL Project Authors. All Rights Reserved.
*
- * Licensed under the OpenSSL license (the "License"). You may not use
+ * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*/
#include <string.h>
-#include "internal/ctype.h"
-#include "openssl/ebcdic.h"
+#include <stdio.h>
+#include "crypto/ctype.h"
+#include <openssl/ebcdic.h>
/*
* Define the character classes for each character in the seven bit ASCII
#ifdef CHARSET_EBCDIC
int ossl_toascii(int c)
{
- if (c < -128 || c > 256)
+ if (c < -128 || c > 256 || c == EOF)
return c;
/*
* Adjust negatively signed characters.
int ossl_fromascii(int c)
{
- if (c < -128 || c > 256)
+ if (c < -128 || c > 256 || c == EOF)
return c;
if (c < 0)
c += 256;
return a >= 0 && a < max && (ctype_char_map[a] & mask) != 0;
}
+/*
+ * Implement some of the simpler functions directly to avoid the overhead of
+ * accessing memory via ctype_char_map[].
+ */
+
+#define ASCII_IS_DIGIT(c) (c >= 0x30 && c <= 0x39)
+#define ASCII_IS_UPPER(c) (c >= 0x41 && c <= 0x5A)
+#define ASCII_IS_LOWER(c) (c >= 0x61 && c <= 0x7A)
+
+int ossl_isdigit(int c)
+{
+ int a = ossl_toascii(c);
+
+ return ASCII_IS_DIGIT(a);
+}
+
+int ossl_isupper(int c)
+{
+ int a = ossl_toascii(c);
+
+ return ASCII_IS_UPPER(a);
+}
+
+int ossl_islower(int c)
+{
+ int a = ossl_toascii(c);
+
+ return ASCII_IS_LOWER(a);
+}
+
#if defined(CHARSET_EBCDIC) && !defined(CHARSET_EBCDIC_TEST)
static const int case_change = 0x40;
#else
int ossl_tolower(int c)
{
- return ossl_isupper(c) ? c ^ case_change : c;
+ int a = ossl_toascii(c);
+
+ return ASCII_IS_UPPER(a) ? c ^ case_change : c;
}
int ossl_toupper(int c)
{
- return ossl_islower(c) ? c ^ case_change : c;
+ int a = ossl_toascii(c);
+
+ return ASCII_IS_LOWER(a) ? c ^ case_change : c;
+}
+
+int ossl_ascii_isdigit(int c)
+{
+ return ASCII_IS_DIGIT(c);
}