1/* $NetBSD: multibyte_sb.c,v 1.5 2004/07/21 20:27:46 tshiozak Exp $ */ 2 3/* 4 * Copyright (c) 1991 The Regents of the University of California. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of the University nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31#include <LibConfig.h> 32#include <sys/EfiCdefs.h> 33#if defined(LIBC_SCCS) && !defined(lint) 34#if 0 35static char *sccsid = "from: @(#)multibyte.c 5.1 (Berkeley) 2/18/91"; 36#else 37__RCSID("$NetBSD: multibyte_sb.c,v 1.5 2004/07/21 20:27:46 tshiozak Exp $"); 38#endif 39#endif /* LIBC_SCCS and not lint */ 40 41#include <assert.h> 42#include <errno.h> 43#include <stdlib.h> 44#include <wchar.h> 45 46/* 47 * Stub multibyte character functions. 48 * This cheezy implementation is fixed to the native single-byte 49 * character set. 50 */ 51 52/*ARGSUSED*/ 53int 54mbsinit(const mbstate_t *ps) 55{ 56 57 return 1; 58} 59 60/*ARGSUSED*/ 61size_t 62mbrlen( 63 const char *s, 64 size_t n, 65 mbstate_t *ps 66 ) 67{ 68 69 /* ps appears to be unused */ 70 71 if (s == NULL || *s == '\0') 72 return 0; 73 if (n == 0) 74 return (size_t)-1; 75 return 1; 76} 77 78int 79mblen( 80 const char *s, 81 size_t n 82 ) 83{ 84 85 /* s may be NULL */ 86 87 return (int)mbrlen(s, n, NULL); 88} 89 90/*ARGSUSED*/ 91size_t 92mbrtowc( 93 wchar_t *pwc, 94 const char *s, 95 size_t n, 96 mbstate_t *ps 97 ) 98{ 99 100 /* pwc may be NULL */ 101 /* s may be NULL */ 102 /* ps appears to be unused */ 103 104 if (s == NULL) 105 return 0; 106 if (n == 0) 107 return (size_t)-1; 108 if (pwc) 109 *pwc = (wchar_t) *s; 110 return (*s != '\0'); 111} 112 113int 114mbtowc( 115 wchar_t *pwc, 116 const char *s, 117 size_t n 118 ) 119{ 120 121 /* pwc may be NULL */ 122 /* s may be NULL */ 123 124 return (int)mbrtowc(pwc, s, n, NULL); 125} 126 127/*ARGSUSED*/ 128size_t 129wcrtomb( 130 char *s, 131 wchar_t wchar, 132 mbstate_t *ps 133 ) 134{ 135 136 /* s may be NULL */ 137 /* ps appears to be unused */ 138 139 if (s == NULL) 140 return 1; /* Spec. says this should be 1. */ 141 142 *s = (char) wchar; 143 return 1; 144} 145 146int 147wctomb( 148 char *s, 149 wchar_t wchar 150 ) 151{ 152 153 /* 154 If s is NULL just return if MB Characters have state 155 dependent encodings. 156 */ 157 if (s == NULL) 158 return 0; 159 160 return (int)wcrtomb(s, wchar, NULL); 161} 162 163/*ARGSUSED*/ 164size_t 165mbsrtowcs( 166 wchar_t *pwcs, 167 const char **s, 168 size_t n, 169 mbstate_t *ps 170 ) 171{ 172 int count = 0; 173 174 /* pwcs may be NULL */ 175 /* s may be NULL */ 176 /* ps appears to be unused */ 177 178 if (!s || !*s) 179 return 0; 180 181 if (n != 0) { 182 if (pwcs != NULL) { 183 do { 184 if ((*pwcs++ = (wchar_t) *(*s)++) == 0) { 185 *s = NULL; 186 break; 187 } 188 count++; 189 } while (--n != 0); 190 } else { 191 do { 192 if (((wchar_t)*(*s)++) == 0) 193 break; 194 count++; 195 } while (--n != 0); 196 } 197 } 198 199 return count; 200} 201 202size_t 203mbstowcs( 204 wchar_t *pwcs, 205 const char *s, 206 size_t n 207 ) 208{ 209 210 /* pwcs may be NULL */ 211 /* s may be NULL */ 212 213 return mbsrtowcs(pwcs, &s, n, NULL); 214} 215 216/*ARGSUSED*/ 217size_t 218wcsrtombs( 219 char *s, 220 const wchar_t **pwcs, 221 size_t n, 222 mbstate_t *ps 223 ) 224{ 225 int count = 0; 226 227 /* s may be NULL */ 228 /* pwcs may be NULL */ 229 /* ps appears to be unused */ 230 231 if (pwcs == NULL || *pwcs == NULL) 232 return (0); 233 234 if (s == NULL) { 235 while (*(*pwcs)++ != 0) 236 count++; 237 return(count); 238 } 239 240 if (n != 0) { 241 do { 242 if ((*s++ = (char) *(*pwcs)++) == 0) { 243 *pwcs = NULL; 244 break; 245 } 246 count++; 247 } while (--n != 0); 248 } 249 250 return count; 251} 252 253size_t 254wcstombs( 255 char *s, 256 const wchar_t *pwcs, 257 size_t n 258 ) 259{ 260 261 /* s may be NULL */ 262 /* pwcs may be NULL */ 263 264 return wcsrtombs(s, &pwcs, n, NULL); 265} 266 267wint_t 268btowc(int c) 269{ 270 if (c == EOF || c & ~0xFF) 271 return WEOF; 272 return (wint_t)c; 273} 274 275int 276wctob(wint_t c) 277{ 278 /* wctob needs to be consistent with wcrtomb. 279 if wcrtomb says that a character is representable in 1 byte, 280 which this implementation always says, then wctob needs to 281 also represent the character as 1 byte. 282 */ 283 if (c == WEOF) { 284 return EOF; 285 } 286 return (int)(c & 0xFF); 287} 288