fputwc.c (1e98f88776fc606df245a382685b1ac634a81389) | fputwc.c (e74101e4eff767325553039def89de70b70f36d3) |
---|---|
1/*- | 1/*- |
2 * Copyright (c) 2002-2004 Tim J. Robbins. | 2 * Copyright (c) 2002 Tim J. Robbins. |
3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright --- 13 unchanged lines hidden (view full) --- 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> 28__FBSDID("$FreeBSD$"); 29 30#include "namespace.h" 31#include <errno.h> | 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright --- 13 unchanged lines hidden (view full) --- 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> 28__FBSDID("$FreeBSD$"); 29 30#include "namespace.h" 31#include <errno.h> |
32#include <limits.h> | 32#include <rune.h> |
33#include <stdio.h> | 33#include <stdio.h> |
34#include <stdlib.h> | |
35#include <wchar.h> 36#include "un-namespace.h" 37#include "libc_private.h" 38#include "local.h" | 34#include <wchar.h> 35#include "un-namespace.h" 36#include "libc_private.h" 37#include "local.h" |
39#include "mblocal.h" | |
40 | 38 |
41/* 42 * Non-MT-safe version. 43 */ | |
44wint_t | 39wint_t |
45__fputwc(wchar_t wc, FILE *fp) 46{ 47 char buf[MB_LEN_MAX]; 48 size_t i, len; 49 50 if (MB_CUR_MAX == 1 && wc > 0 && wc <= UCHAR_MAX) { 51 /* 52 * Assume single-byte locale with no special encoding. 53 * A more careful test would be to check 54 * _CurrentRuneLocale->encoding. 55 */ 56 *buf = (unsigned char)wc; 57 len = 1; 58 } else { 59 if ((len = __wcrtomb(buf, wc, &fp->_mbstate)) == (size_t)-1) { 60 fp->_flags |= __SERR; 61 return (WEOF); 62 } 63 } 64 65 for (i = 0; i < len; i++) 66 if (__sputc((unsigned char)buf[i], fp) == EOF) 67 return (WEOF); 68 69 return ((wint_t)wc); 70} 71 72/* 73 * MT-safe version. 74 */ 75wint_t | |
76fputwc(wchar_t wc, FILE *fp) 77{ | 40fputwc(wchar_t wc, FILE *fp) 41{ |
78 wint_t r; | |
79 | 42 |
80 FLOCKFILE(fp); 81 ORIENT(fp, 1); 82 r = __fputwc(wc, fp); 83 FUNLOCKFILE(fp); | 43 ORIENTLOCK(fp, 1); |
84 | 44 |
85 return (r); | 45 return (fputrune((rune_t)wc, fp) != EOF ? (wint_t)wc : WEOF); |
86} | 46} |