1 /*------------------------------------------------------------------
2  * strismixedcase_s.c
3  *
4  * November 2008, Bo Berry
5  *
6  * Copyright (c) 2008-2011, 2013 by Cisco Systems, Inc
7  * All rights reserved.
8  *
9  * Permission is hereby granted, free of charge, to any person
10  * obtaining a copy of this software and associated documentation
11  * files (the "Software"), to deal in the Software without
12  * restriction, including without limitation the rights to use,
13  * copy, modify, merge, publish, distribute, sublicense, and/or
14  * sell copies of the Software, and to permit persons to whom the
15  * Software is furnished to do so, subject to the following
16  * conditions:
17  *
18  * The above copyright notice and this permission notice shall be
19  * included in all copies or substantial portions of the Software.
20  *
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
23  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24  * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
25  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
26  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
28  * OTHER DEALINGS IN THE SOFTWARE.
29  *------------------------------------------------------------------
30  */
31 
32 #include "safeclib_private.h"
33 #include "safe_str_constraint.h"
34 #include "safe_str_lib.h"
35 
36 
37 /**
38  * NAME
39  *    strismixedcase_s
40  *
41  * SYNOPSIS
42  *    #include "safe_str_lib.h"
43  *    bool
44  *    strismixedcase_s(const char *dest, rsize_t dmax)
45  *
46  * DESCRIPTION
47  *    This function checks that the entire string is mixed
48  *    case.  The scanning stops at the first null or after
49  *    dmax characters.
50  *
51  * EXTENSION TO
52  *    ISO/IEC TR 24731, Programming languages, environments
53  *    and system software interfaces, Extensions to the C Library,
54  *    Part I: Bounds-checking interfaces
55  *
56  * INPUT PARAMETERS
57  *    dest       pointer to string
58  *
59  *    dmax       maximum length of string
60  *
61  * OUTPUT PARAMETERS
62  *    none
63  *
64  * RUNTIME CONSTRAINTS
65  *    dest shall not be a null pointer.
66  *    dmax shall not equal zero.
67  *    dmax shall not be greater than RSIZE_MAX_STR.
68  *
69  * RETURN VALUE
70  *    true       string is mixed case
71  *    false      string is not mixed case or error
72  *
73  * ALSO SEE
74  *    strisalphanumeric_s(), strisascii_s(), strisdigit_s(),
75  *    strishex_s(), strislowercase_s(),
76  *    strisuppercase_s()
77  *
78  */
79 bool
strismixedcase_s(const char * dest,rsize_t dmax)80 strismixedcase_s (const char *dest, rsize_t dmax)
81 {
82     if (!dest) {
83         invoke_safe_str_constraint_handler("strismixedcase_s: "
84                    "dest is null",
85                    NULL, ESNULLP);
86         return (false);
87     }
88 
89     if (dmax == 0) {
90         invoke_safe_str_constraint_handler("strismixedcase_s: "
91                    "dmax is 0",
92                    NULL, ESZEROL);
93         return (false);
94     }
95 
96     if (dmax > RSIZE_MAX_STR) {
97         invoke_safe_str_constraint_handler("strismixedcase_s: "
98                    "dmax exceeds max",
99                    NULL, ESLEMAX);
100         return (false);
101     }
102 
103     if (*dest == '\0') {
104         return (false);
105     }
106 
107     while (*dest) {
108 
109         if (((*dest >= 'a') && (*dest <= 'z'))  ||
110             ((*dest >= 'A') && (*dest <= 'Z'))) {
111             dest++;
112             dmax--;
113         } else {
114             return (false);
115         }
116     }
117 
118     return (true);
119 }
120 EXPORT_SYMBOL(strismixedcase_s)
121