1c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes/*	$OpenBSD: fwide.c,v 1.4 2009/11/09 00:18:27 kurt Exp $	*/
2c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes/* $NetBSD: fwide.c,v 1.2 2003/01/18 11:29:54 thorpej Exp $ */
3c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes
4c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes/*-
5c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * Copyright (c)2001 Citrus Project,
6c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * All rights reserved.
7c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes *
8c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * Redistribution and use in source and binary forms, with or without
9c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * modification, are permitted provided that the following conditions
10c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * are met:
11c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * 1. Redistributions of source code must retain the above copyright
12c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes *    notice, this list of conditions and the following disclaimer.
13c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * 2. Redistributions in binary form must reproduce the above copyright
14c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes *    notice, this list of conditions and the following disclaimer in the
15c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes *    documentation and/or other materials provided with the distribution.
16c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes *
17c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * SUCH DAMAGE.
28c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes *
29c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes * $Citrus$
30c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes */
31c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes
32c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes#include <stdio.h>
33c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes#include <wchar.h>
34c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes#include "local.h"
35c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes
36c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughesint
37c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughesfwide(FILE *fp, int mode)
38c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes{
39c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes	struct wchar_io_data *wcio;
40c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes
41c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes	/*
42c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes	 * this implementation use only -1, 0, 1
43c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes	 * for mode value.
44c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes	 * (we don't need to do this, but
45c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes	 *  this can make things simpler.)
46c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes	 */
47c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes	if (mode > 0)
48c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes		mode = 1;
49c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes	else if (mode < 0)
50c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes		mode = -1;
51c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes
52c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes	FLOCKFILE(fp);
53c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes	wcio = WCIO_GET(fp);
54c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes	if (!wcio)
55c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes		return 0; /* XXX */
56c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes
57c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes	if (wcio->wcio_mode == 0 && mode != 0)
58c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes		wcio->wcio_mode = mode;
59c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes	else
60c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes		mode = wcio->wcio_mode;
61c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes	FUNLOCKFILE(fp);
62c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes
63c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes	return mode;
64c932225e1061dc57fc4bf2d6203d9737f4f989faElliott Hughes}
65