1 /* 2 * Copyright 2017-2018 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the Apache License 2.0 (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include "testutil.h" 11 #include "crypto/ctype.h" 12 #include "internal/nelem.h" 13 #include <ctype.h> 14 #include <stdio.h> 15 16 /* 17 * Even though the VMS C RTL claims to be C99 compatible, it's not entirely 18 * so far (C RTL version 8.4). Same applies to OSF. For the sake of these 19 * tests, we therefore define our own. 20 */ 21 #if (defined(__VMS) && __CRTL_VER <= 80400000) || defined(__osf__) 22 static int isblank(int c) 23 { 24 return c == ' ' || c == '\t'; 25 } 26 #endif 27 28 static int test_ctype_chars(int n) 29 { 30 if (!TEST_int_eq(isascii((unsigned char)n) != 0, ossl_isascii(n) != 0)) 31 return 0; 32 33 if (!ossl_isascii(n)) 34 return 1; 35 36 return TEST_int_eq(isalpha(n) != 0, ossl_isalpha(n) != 0) 37 && TEST_int_eq(isalnum(n) != 0, ossl_isalnum(n) != 0) 38 #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L 39 && TEST_int_eq(isblank(n) != 0, ossl_isblank(n) != 0) 40 #endif 41 && TEST_int_eq(iscntrl(n) != 0, ossl_iscntrl(n) != 0) 42 && TEST_int_eq(isdigit(n) != 0, ossl_isdigit(n) != 0) 43 && TEST_int_eq(isgraph(n) != 0, ossl_isgraph(n) != 0) 44 && TEST_int_eq(islower(n) != 0, ossl_islower(n) != 0) 45 && TEST_int_eq(isprint(n) != 0, ossl_isprint(n) != 0) 46 && TEST_int_eq(ispunct(n) != 0, ossl_ispunct(n) != 0) 47 && TEST_int_eq(isspace(n) != 0, ossl_isspace(n) != 0) 48 && TEST_int_eq(isupper(n) != 0, ossl_isupper(n) != 0) 49 && TEST_int_eq(isxdigit(n) != 0, ossl_isxdigit(n) != 0); 50 } 51 52 static struct { 53 int u; 54 int l; 55 } case_change[] = { 56 { 'A', 'a' }, 57 { 'X', 'x' }, 58 { 'Z', 'z' }, 59 { '0', '0' }, 60 { '%', '%' }, 61 { '~', '~' }, 62 { 0, 0 }, 63 { EOF, EOF } 64 }; 65 66 static int test_ctype_toupper(int n) 67 { 68 return TEST_int_eq(ossl_toupper(case_change[n].l), case_change[n].u) 69 && TEST_int_eq(ossl_toupper(case_change[n].u), case_change[n].u); 70 } 71 72 static int test_ctype_tolower(int n) 73 { 74 return TEST_int_eq(ossl_tolower(case_change[n].u), case_change[n].l) 75 && TEST_int_eq(ossl_tolower(case_change[n].l), case_change[n].l); 76 } 77 78 static int test_ctype_eof(void) 79 { 80 return test_ctype_chars(EOF); 81 } 82 83 int setup_tests(void) 84 { 85 ADD_ALL_TESTS(test_ctype_chars, 256); 86 ADD_ALL_TESTS(test_ctype_toupper, OSSL_NELEM(case_change)); 87 ADD_ALL_TESTS(test_ctype_tolower, OSSL_NELEM(case_change)); 88 ADD_TEST(test_ctype_eof); 89 return 1; 90 } 91