Implement btowc() in terms of mbrtowc() instead of sgetrune(), and

wctob() in terms of wcrtomb() instead of sputrune(). There should be
no functional differences, but there may be a small performance hit
because we make an extra function call.

The aim here is to have as few functions as possible calling
s{get,put}rune() to make it easier to remove them in the future.
This commit is contained in:
Tim J. Robbins 2003-08-07 07:45:35 +00:00
parent a50bc30203
commit dab4fca49b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=118589
2 changed files with 27 additions and 10 deletions

View file

@ -1,5 +1,5 @@
/*-
* Copyright (c) 2002 Tim J. Robbins.
* Copyright (c) 2002, 2003 Tim J. Robbins.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -27,19 +27,29 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <rune.h>
#include <stdio.h>
#include <string.h>
#include <wchar.h>
wint_t
btowc(int c)
{
rune_t r;
char cc;
wchar_t wc;
if (c == EOF)
return (WEOF);
cc = (char)c;
if ((r = sgetrune(&cc, 1, NULL)) == _INVALID_RUNE)
/*
* We expect mbrtowc() to return 0 or 1, hence the check for n > 1
* which detects error return values as well as "impossible" byte
* counts.
*
* We pass NULL as the state pointer to mbrtowc() because we don't
* support state-dependent encodings and don't want to waste time
* creating a zeroed mbstate_t that will not be used.
*/
if (mbrtowc(&wc, &cc, 1, NULL) > 1)
return (WEOF);
return (r);
return (wc);
}

View file

@ -1,5 +1,5 @@
/*-
* Copyright (c) 2002 Tim J. Robbins.
* Copyright (c) 2002, 2003 Tim J. Robbins.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -27,15 +27,22 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <rune.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <wchar.h>
int
wctob(wint_t c)
{
char cc;
char buf[MB_LEN_MAX];
if (c == WEOF || sputrune(c, &cc, 1, NULL) != 1)
/*
* We pass NULL as the state pointer to wcrtomb() because we don't
* support state-dependent encodings and don't want to waste time
* creating a zeroed mbstate_t that will not be used.
*/
if (c == WEOF || wcrtomb(buf, c, NULL) != 1)
return (EOF);
return ((unsigned char)cc);
return ((unsigned char)*buf);
}