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 | }
|
---|