Imported Upstream version 1.1.11
[platform/upstream/cdrkit.git] / librols / stdio / fcons.c
1 /*
2  * This file has been modified for the cdrkit suite.
3  *
4  * The behaviour and appearence of the program code below can differ to a major
5  * extent from the version distributed by the original author(s).
6  *
7  * For details, see Changelog file distributed with the cdrkit package. If you
8  * received this file from another source then ask the distributing person for
9  * a log of modifications.
10  *
11  */
12
13 /* @(#)fcons.c  2.17 04/08/08 Copyright 1986, 1995-2003 J. Schilling */
14 /*
15  *      Copyright (c) 1986, 1995-2003  J. Schilling
16  */
17 /*
18  * This program is free software; you can redistribute it and/or modify
19  * it under the terms of the GNU General Public License version 2
20  * as published by the Free Software Foundation.
21  *
22  * This program is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25  * GNU General Public License for more details.
26  *
27  * You should have received a copy of the GNU General Public License along with
28  * this program; see the file COPYING.  If not, write to the Free Software
29  * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
30  */
31
32 #include "schilyio.h"
33
34 /*
35  * Note that because of a definition in schilyio.h we are using fseeko()/ftello()
36  * instead of fseek()/ftell() if available.
37  */
38
39 LOCAL   char    *fmtab[] = {
40                         "",     /* 0    FI_NONE                         */
41                         "r",    /* 1    FI_READ                         */
42                         "w",    /* 2    FI_WRITE                **1)    */
43                         "r+",   /* 3    FI_READ  | FI_WRITE             */
44                         "b",    /* 4    FI_NONE  | FI_BINARY            */
45                         "rb",   /* 5    FI_READ  | FI_BINARY            */
46                         "wb",   /* 6    FI_WRITE | FI_BINARY    **1)    */
47                         "r+b",  /* 7    FI_READ  | FI_WRITE | FI_BINARY */
48
49 /* + FI_APPEND  */      "",     /* 0    FI_NONE                         */
50 /* ...          */      "r",    /* 1    FI_READ                         */
51                         "a",    /* 2    FI_WRITE                **1)    */
52                         "a+",   /* 3    FI_READ  | FI_WRITE             */
53                         "b",    /* 4    FI_NONE  | FI_BINARY            */
54                         "rb",   /* 5    FI_READ  | FI_BINARY            */
55                         "ab",   /* 6    FI_WRITE | FI_BINARY    **1)    */
56                         "a+b",  /* 7    FI_READ  | FI_WRITE | FI_BINARY */
57                 };
58 /*
59  * NOTES:
60  *      1)      fdopen() guarantees not to create/trunc files in this case
61  *
62  *      "w"     will create/trunc files with fopen()
63  *      "a"     will create files with fopen()
64  */
65
66
67 EXPORT FILE *
68 _fcons(fd, f, flag)
69         register FILE   *fd;
70                 int     f;
71                 int     flag;
72 {
73         int     my_gflag = _io_glflag;
74
75         if (fd == (FILE *)NULL)
76                 fd = fdopen(f,
77                         fmtab[flag&(FI_READ|FI_WRITE|FI_BINARY | FI_APPEND)]);
78
79         if (fd != (FILE *)NULL) {
80                 if (flag & FI_APPEND) {
81                         (void) fseek(fd, (off_t)0, SEEK_END);
82                 }
83                 if (flag & FI_UNBUF) {
84                         setbuf(fd, NULL);
85                         my_gflag |= _IOUNBUF;
86                 }
87                 set_my_flag(fd, my_gflag); /* must clear it if fd is reused */
88                 return (fd);
89         }
90         if (flag & FI_CLOSE)
91                 close(f);
92
93         return ((FILE *) NULL);
94 }