ungetwc.c (1e98f88776fc606df245a382685b1ac634a81389) | ungetwc.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__ungetwc(wint_t wc, FILE *fp) 46{ 47 char buf[MB_LEN_MAX]; 48 size_t len; 49 50 if (wc == WEOF) 51 return (WEOF); 52 if ((len = __wcrtomb(buf, wc, &fp->_mbstate)) == (size_t)-1) { 53 fp->_flags |= __SERR; 54 return (WEOF); 55 } 56 while (len-- != 0) 57 if (__ungetc((unsigned char)buf[len], fp) == EOF) 58 return (WEOF); 59 60 return (wc); 61} 62 63/* 64 * MT-safe version. 65 */ 66wint_t | |
67ungetwc(wint_t wc, FILE *fp) 68{ | 40ungetwc(wint_t wc, FILE *fp) 41{ |
69 wint_t r; | |
70 | 42 |
71 FLOCKFILE(fp); 72 ORIENT(fp, 1); 73 r = __ungetwc(wc, fp); 74 FUNLOCKFILE(fp); | 43 ORIENTLOCK(fp, 1); |
75 | 44 |
76 return (r); | 45 return (fungetrune((rune_t)wc, fp) == EOF ? WEOF : wc); |
77} | 46} |