xref: /original-bsd/lib/libc/locale/mbrune.c (revision 0fa75f0e)
1 /*-
2  * Copyright (c) 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Paul Borman at Krystal Technologies.
7  *
8  * %sccs.include.redist.c%
9  */
10 
11 #if defined(LIBC_SCCS) && !defined(lint)
12 static char sccsid[] = "@(#)mbrune.c	8.1 (Berkeley) 06/27/93";
13 #endif /* LIBC_SCCS and not lint */
14 
15 #include <limits.h>
16 #include <rune.h>
17 #include <stddef.h>
18 #include <string.h>
19 
20 char *
21 mbrune(string, c)
22 	const char *string;
23 	rune_t c;
24 {
25 	char const *result;
26 	rune_t r;
27 
28 	while ((r = sgetrune(string, MB_LEN_MAX, &result))) {
29 		if (r == c)
30 			return ((char *)string);
31 		string = result == string ? string + 1 : result;
32 	}
33 
34 	return (c == *string ? (char *)string : NULL);
35 }
36 
37 char *
38 mbrrune(string, c)
39 	const char *string;
40 	rune_t c;
41 {
42 	const char *last = 0;
43 	char const *result;
44 	rune_t  r;
45 
46 	while ((r = sgetrune(string, MB_LEN_MAX, &result))) {
47 		if (r == c)
48 			last = string;
49 		string = result == string ? string + 1 : result;
50 	}
51 	return (c == *string ? (char *)string : (char *)last);
52 }
53 
54 char *
55 mbmb(string, pattern)
56 	const char *string;
57 	char *pattern;
58 {
59 	rune_t first, r;
60 	size_t plen, slen;
61 	char const *result;
62 
63 	plen = strlen(pattern);
64 	slen = strlen(string);
65 	if (plen > slen)
66 		return (0);
67 
68 	first = sgetrune(pattern, plen, &result);
69 	if (result == string)
70 		return (0);
71 
72 	while (slen >= plen && (r = sgetrune(string, slen, &result))) {
73 		if (r == first) {
74 			if (strncmp(string, pattern, slen) == 0)
75 				return ((char *) string);
76 		}
77 		if (result == string) {
78 			--slen;
79 			++string;
80 		} else {
81 			slen -= result - string;
82 			string = result;
83 		}
84 	}
85 	return (0);
86 }
87