reactos/sdk/tools/mkisofs/schilytools/libschily/stdio/schilyio.h

252 lines
6.4 KiB
C

/* @(#)schilyio.h 2.31 16/11/06 Copyright 1986, 1995-2016 J. Schilling */
/*
* Copyright (c) 1986, 1995-2016 J. Schilling
*/
/*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* See the file CDDL.Schily.txt in this distribution for details.
* A copy of the CDDL is also available via the Internet at
* http://www.opensource.org/licenses/cddl1.txt
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file CDDL.Schily.txt from this distribution.
*/
#ifndef _STDIO_SCHILYIO_H
#define _STDIO_SCHILYIO_H
#include <schily/mconfig.h>
#include <schily/stdio.h>
#include <schily/standard.h>
#include <schily/types.h>
#include <schily/unistd.h>
#include <schily/fcntl.h>
#include <schily/schily.h>
#include <schily/errno.h>
#ifdef NO_USG_STDIO
# ifdef HAVE_USG_STDIO
# undef HAVE_USG_STDIO
# endif
#endif
#ifdef HAVE_LARGEFILES
/*
* XXX We may need to put this code to a more global place to allow all
* XXX users of fseek()/ftell() to automaticaly use fseeko()/ftello()
* XXX if the latter are available.
*
* If HAVE_LARGEFILES is defined, it is guaranteed that fseeko()/ftello()
* both are available.
*/
# define fseek fseeko
# define ftell ftello
#else /* !HAVE_LARGEFILES */
/*
* If HAVE_LARGEFILES is not defined, we depend on specific tests for
* fseeko()/ftello() which must have been done before the tests for
* Large File support have been done.
* Note that this only works if the tests used below are really done before
* the Large File autoconf test is run. This is because autoconf does no
* clean testing but instead cumulatively modifes the envivonment used for
* testing.
*/
#ifdef HAVE_FSEEKO
# define fseek fseeko
#endif
#ifdef HAVE_FTELLO
# define ftell ftello
#endif
#endif
/*
* speed things up...
*/
#ifndef _OPENFD_SRC
#ifdef _openfd
#undef _openfd
#endif
#define _openfd(name, omode) (open(name, omode, (mode_t)0666))
#endif
#define DO_MYFLAG /* use local flags */
/*
* Flags used during fileopen(), ... by _fcons()/ _cvmod()
*/
#define FI_NONE 0x0000 /* no flags defined */
#define FI_READ 0x0001 /* open for reading */
#define FI_WRITE 0x0002 /* open for writing */
#define FI_BINARY 0x0004 /* open in binary mode */
#define FI_APPEND 0x0008 /* append on each write */
#define FI_CREATE 0x0010 /* create if nessecary */
#define FI_TRUNC 0x0020 /* truncate file on open */
#define FI_UNBUF 0x0080 /* dont't buffer io */
#define FI_CLOSE 0x1000 /* close file on error */
/*
* Additional Schily FILE * flags that are not present with the
* standard stdio implementation.
*/
#define _JS_IONORAISE 01 /* do no raisecond() on errors */
#define _JS_IOUNBUF 02 /* do unbuffered i/o */
#ifdef DO_MYFLAG
struct _io_flags {
FILE *fl_io; /* file pointer */
struct _io_flags /* pointer to next struct */
*fl_next; /* if more file pointer to same fd */
int fl_flags; /* my flags */
};
typedef struct _io_flags _io_fl;
extern int _io_glflag; /* global default flag */
extern _io_fl *_io_myfl; /* array of structs to hold my flags */
extern int _fl_max; /* max fd currently in _io_myfl */
/*
* if fileno > max
* expand
* else if map[fileno].pointer == 0
* return 0
* else if map[fileno].pointer == p
* return map[fileno].flags
* else
* search list
*/
#define flp(p) (&_io_myfl[fileno(p)])
#ifdef MY_FLAG_IS_MACRO
#define my_flag(p) ((int)fileno(p) >= _fl_max ? \
_io_get_my_flag(p) : \
((flp(p)->fl_io == 0 || flp(p)->fl_io == p) ? \
flp(p)->fl_flags : \
_io_get_my_flag(p)))
#else
#define my_flag(p) _io_get_my_flag(p)
#endif
#define set_my_flag(p, v) _io_set_my_flag(p, v)
#define add_my_flag(p, v) _io_add_my_flag(p, v)
extern int _io_get_my_flag __PR((FILE *));
extern void _io_set_my_flag __PR((FILE *, int));
extern void _io_add_my_flag __PR((FILE *, int));
#else /* DO_MYFLAG */
#define my_flag(p) _JS_IONORAISE /* Always noraise */
#define set_my_flag(p, v) /* Ignore */
#define add_my_flag(p, v) /* Ignore */
#endif /* DO_MYFLAG */
#if defined(HAVE_USG_STDIO) || defined(FAST_GETC_PUTC)
/*
* We are on a system with AT&T compatible stdio implementation
*/
/*
* Use the right filbuf()/flsbuf() function.
*/
#ifdef FAST_GETC_PUTC
#define __c (struct SCHILY__FILE_TAG *)
#ifndef HAVE___FILBUF
#define HAVE___FILBUF
#endif
#endif
#ifdef HAVE___FILBUF
# define usg_filbuf(fp) __filbuf(fp)
# define usg_flsbuf(c, fp) __flsbuf(c, fp)
/*
* Define prototypes to verify if our interface is right
*/
extern int __filbuf __PR((FILE *));
#else /* !HAVE___FILBUF */
# ifdef HAVE__FILBUF
# define usg_filbuf(fp) _filbuf(fp)
# define usg_flsbuf(c, fp) _flsbuf(c, fp)
/*
* Define prototypes to verify if our interface is right
*/
extern int _filbuf __PR((FILE *));
# else
/*
* no filbuf() but this will not happen on USG_STDIO systems.
*/
# endif
#endif /* !HAVE___FILBUF */
/*
* Do not check this because flsbuf()'s 1st parameter may be
* int SunOS
* unsigned int Apollo
* unsigned char HP-UX-11
*
* Note that the interface is now checked by autoconf.
*/
#else /* !HAVE_USG_STDIO */
/*
* If we are on a non USG system we cannot down file pointers
* and we do not know about the internals of the FILE structure.
*/
#undef DO_DOWN
#endif /* !HAVE_USG_STDIO */
#ifndef __c
#define __c
#endif
#ifndef DO_DOWN
/*
* No stream checking
*/
#define down(f)
#define down1(f, fl1)
#define down2(f, fl1, fl2)
#else
/*
* Do stream checking (works only on USG stdio)
*
* New version of USG stdio.
* _iob[] holds only a small amount of pointers.
* Aditional space is allocated.
* We may check only if the file pointer is != NULL
* and if iop->_flag refers to a stream with appropriate modes.
* If _iob[] gets expanded by malloc() we cannot check upper bound.
*/
#define down(f) ((f) == 0 || (__c f)->_flag == 0 ? \
(raisecond(_badfile, 0L), (FILE *)0) : (f))
#define down1(f, fl1) ((f) == 0 || (__c f)->_flag == 0 ? \
(raisecond(_badfile, 0L), (FILE *)0) : \
(((__c f)->_flag & fl1) != fl1 ? \
(raisecond(_badop, 0L), (FILE *)0) : \
(f)))
#define down2(f, fl1, fl2) ((f) == 0 || (__c f)->_flag == 0 ? \
(raisecond(_badfile, 0L), (FILE *)0) : \
(((__c f)->_flag & fl1) != fl1 && \
((__c f)->_flag & fl2) != fl2 ? \
(raisecond(_badop, 0L), (FILE *)0) : \
(f)))
#endif /* DO_DOWN */
extern char _badfile[];
extern char _badmode[];
extern char _badop[];
#endif /* _STDIO_SCHILYIO_H */