]> git.saurik.com Git - apple/libc.git/blob - locale.subproj/mbrune.c
Libc-166.tar.gz
[apple/libc.git] / locale.subproj / mbrune.c
1 /*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
11 *
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22 /*
23 * Copyright (c) 1993
24 * The Regents of the University of California. All rights reserved.
25 *
26 * This code is derived from software contributed to Berkeley by
27 * Paul Borman at Krystal Technologies.
28 *
29 * Redistribution and use in source and binary forms, with or without
30 * modification, are permitted provided that the following conditions
31 * are met:
32 * 1. Redistributions of source code must retain the above copyright
33 * notice, this list of conditions and the following disclaimer.
34 * 2. Redistributions in binary form must reproduce the above copyright
35 * notice, this list of conditions and the following disclaimer in the
36 * documentation and/or other materials provided with the distribution.
37 * 3. All advertising materials mentioning features or use of this software
38 * must display the following acknowledgement:
39 * This product includes software developed by the University of
40 * California, Berkeley and its contributors.
41 * 4. Neither the name of the University nor the names of its contributors
42 * may be used to endorse or promote products derived from this software
43 * without specific prior written permission.
44 *
45 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
46 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
49 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
55 * SUCH DAMAGE.
56 */
57
58
59 #include <limits.h>
60 #include <rune.h>
61 #include <stddef.h>
62 #include <string.h>
63
64 char *
65 mbrune(string, c)
66 const char *string;
67 rune_t c;
68 {
69 char const *result;
70 rune_t r;
71
72 while ((r = sgetrune(string, MB_LEN_MAX, &result))) {
73 if (r == c)
74 return ((char *)string);
75 string = result == string ? string + 1 : result;
76 }
77
78 return (c == *string ? (char *)string : NULL);
79 }
80
81 char *
82 mbrrune(string, c)
83 const char *string;
84 rune_t c;
85 {
86 const char *last = 0;
87 char const *result;
88 rune_t r;
89
90 while ((r = sgetrune(string, MB_LEN_MAX, &result))) {
91 if (r == c)
92 last = string;
93 string = result == string ? string + 1 : result;
94 }
95 return (c == *string ? (char *)string : (char *)last);
96 }
97
98 char *
99 mbmb(string, pattern)
100 const char *string;
101 char *pattern;
102 {
103 rune_t first, r;
104 size_t plen, slen;
105 char const *result;
106
107 plen = strlen(pattern);
108 slen = strlen(string);
109 if (plen > slen)
110 return (0);
111
112 first = sgetrune(pattern, plen, &result);
113 if (result == string)
114 return (0);
115
116 while (slen >= plen && (r = sgetrune(string, slen, &result))) {
117 if (r == first) {
118 if (strncmp(string, pattern, slen) == 0)
119 return ((char *) string);
120 }
121 if (result == string) {
122 --slen;
123 ++string;
124 } else {
125 slen -= result - string;
126 string = result;
127 }
128 }
129 return (0);
130 }