OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc2/] [newlib/] [libc/] [stdio/] [fopen.c] - Diff between revs 207 and 520

Only display areas with differences | Details | Blame | View Log

Rev 207 Rev 520
/*
/*
 * Copyright (c) 1990 The Regents of the University of California.
 * Copyright (c) 1990 The Regents of the University of California.
 * All rights reserved.
 * All rights reserved.
 *
 *
 * Redistribution and use in source and binary forms are permitted
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation,
 * duplicated in all such forms and that any documentation,
 * advertising materials, and other materials related to such
 * advertising materials, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * distribution and use acknowledge that the software was developed
 * by the University of California, Berkeley.  The name of the
 * by the University of California, Berkeley.  The name of the
 * University may not be used to endorse or promote products derived
 * University may not be used to endorse or promote products derived
 * from this software without specific prior written permission.
 * from this software without specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */
 */
 
 
/*
/*
FUNCTION
FUNCTION
<<fopen>>---open a file
<<fopen>>---open a file
 
 
INDEX
INDEX
        fopen
        fopen
INDEX
INDEX
        _fopen_r
        _fopen_r
 
 
ANSI_SYNOPSIS
ANSI_SYNOPSIS
        #include <stdio.h>
        #include <stdio.h>
        FILE *fopen(const char *<[file]>, const char *<[mode]>);
        FILE *fopen(const char *<[file]>, const char *<[mode]>);
 
 
        FILE *_fopen_r(struct _reent *<[reent]>,
        FILE *_fopen_r(struct _reent *<[reent]>,
                       const char *<[file]>, const char *<[mode]>);
                       const char *<[file]>, const char *<[mode]>);
 
 
TRAD_SYNOPSIS
TRAD_SYNOPSIS
        #include <stdio.h>
        #include <stdio.h>
        FILE *fopen(<[file]>, <[mode]>)
        FILE *fopen(<[file]>, <[mode]>)
        char *<[file]>;
        char *<[file]>;
        char *<[mode]>;
        char *<[mode]>;
 
 
        FILE *_fopen_r(<[reent]>, <[file]>, <[mode]>)
        FILE *_fopen_r(<[reent]>, <[file]>, <[mode]>)
        struct _reent *<[reent]>;
        struct _reent *<[reent]>;
        char *<[file]>;
        char *<[file]>;
        char *<[mode]>;
        char *<[mode]>;
 
 
DESCRIPTION
DESCRIPTION
<<fopen>> initializes the data structures needed to read or write a
<<fopen>> initializes the data structures needed to read or write a
file.  Specify the file's name as the string at <[file]>, and the kind
file.  Specify the file's name as the string at <[file]>, and the kind
of access you need to the file with the string at <[mode]>.
of access you need to the file with the string at <[mode]>.
 
 
The alternate function <<_fopen_r>> is a reentrant version.
The alternate function <<_fopen_r>> is a reentrant version.
The extra argument <[reent]> is a pointer to a reentrancy structure.
The extra argument <[reent]> is a pointer to a reentrancy structure.
 
 
Three fundamental kinds of access are available: read, write, and append.
Three fundamental kinds of access are available: read, write, and append.
<<*<[mode]>>> must begin with one of the three characters `<<r>>',
<<*<[mode]>>> must begin with one of the three characters `<<r>>',
`<<w>>', or `<<a>>', to select one of these:
`<<w>>', or `<<a>>', to select one of these:
 
 
o+
o+
o r
o r
Open the file for reading; the operation will fail if the file does
Open the file for reading; the operation will fail if the file does
not exist, or if the host system does not permit you to read it.
not exist, or if the host system does not permit you to read it.
 
 
o w
o w
Open the file for writing @emph{from the beginning} of the file:
Open the file for writing @emph{from the beginning} of the file:
effectively, this always creates a new file.  If the file whose name you
effectively, this always creates a new file.  If the file whose name you
specified already existed, its old contents are discarded.
specified already existed, its old contents are discarded.
 
 
o a
o a
Open the file for appending data, that is writing from the end of
Open the file for appending data, that is writing from the end of
file.  When you open a file this way, all data always goes to the
file.  When you open a file this way, all data always goes to the
current end of file; you cannot change this using <<fseek>>.
current end of file; you cannot change this using <<fseek>>.
o-
o-
 
 
Some host systems distinguish between ``binary'' and ``text'' files.
Some host systems distinguish between ``binary'' and ``text'' files.
Such systems may perform data transformations on data written to, or
Such systems may perform data transformations on data written to, or
read from, files opened as ``text''.
read from, files opened as ``text''.
If your system is one of these, then you can append a `<<b>>' to any
If your system is one of these, then you can append a `<<b>>' to any
of the three modes above, to specify that you are opening the file as
of the three modes above, to specify that you are opening the file as
a binary file (the default is to open the file as a text file).
a binary file (the default is to open the file as a text file).
 
 
`<<rb>>', then, means ``read binary''; `<<wb>>', ``write binary''; and
`<<rb>>', then, means ``read binary''; `<<wb>>', ``write binary''; and
`<<ab>>', ``append binary''.
`<<ab>>', ``append binary''.
 
 
To make C programs more portable, the `<<b>>' is accepted on all
To make C programs more portable, the `<<b>>' is accepted on all
systems, whether or not it makes a difference.
systems, whether or not it makes a difference.
 
 
Finally, you might need to both read and write from the same file.
Finally, you might need to both read and write from the same file.
You can also append a `<<+>>' to any of the three modes, to permit
You can also append a `<<+>>' to any of the three modes, to permit
this.  (If you want to append both `<<b>>' and `<<+>>', you can do it
this.  (If you want to append both `<<b>>' and `<<+>>', you can do it
in either order: for example, <<"rb+">> means the same thing as
in either order: for example, <<"rb+">> means the same thing as
<<"r+b">> when used as a mode string.)
<<"r+b">> when used as a mode string.)
 
 
Use <<"r+">> (or <<"rb+">>) to permit reading and writing anywhere in
Use <<"r+">> (or <<"rb+">>) to permit reading and writing anywhere in
an existing file, without discarding any data; <<"w+">> (or <<"wb+">>)
an existing file, without discarding any data; <<"w+">> (or <<"wb+">>)
to create a new file (or begin by discarding all data from an old one)
to create a new file (or begin by discarding all data from an old one)
that permits reading and writing anywhere in it; and <<"a+">> (or
that permits reading and writing anywhere in it; and <<"a+">> (or
<<"ab+">>) to permit reading anywhere in an existing file, but writing
<<"ab+">>) to permit reading anywhere in an existing file, but writing
only at the end.
only at the end.
 
 
RETURNS
RETURNS
<<fopen>> returns a file pointer which you can use for other file
<<fopen>> returns a file pointer which you can use for other file
operations, unless the file you requested could not be opened; in that
operations, unless the file you requested could not be opened; in that
situation, the result is <<NULL>>.  If the reason for failure was an
situation, the result is <<NULL>>.  If the reason for failure was an
invalid string at <[mode]>, <<errno>> is set to <<EINVAL>>.
invalid string at <[mode]>, <<errno>> is set to <<EINVAL>>.
 
 
PORTABILITY
PORTABILITY
<<fopen>> is required by ANSI C.
<<fopen>> is required by ANSI C.
 
 
Supporting OS subroutines required: <<close>>, <<fstat>>, <<isatty>>,
Supporting OS subroutines required: <<close>>, <<fstat>>, <<isatty>>,
<<lseek>>, <<open>>, <<read>>, <<sbrk>>, <<write>>.
<<lseek>>, <<open>>, <<read>>, <<sbrk>>, <<write>>.
*/
*/
 
 
#if defined(LIBC_SCCS) && !defined(lint)
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "%W% (Berkeley) %G%";
static char sccsid[] = "%W% (Berkeley) %G%";
#endif /* LIBC_SCCS and not lint */
#endif /* LIBC_SCCS and not lint */
 
 
#include <_ansi.h>
#include <_ansi.h>
#include <reent.h>
#include <reent.h>
#include <stdio.h>
#include <stdio.h>
#include <errno.h>
#include <errno.h>
#include <sys/lock.h>
#include <sys/lock.h>
#ifdef __CYGWIN__
#ifdef __CYGWIN__
#include <fcntl.h>
#include <fcntl.h>
#endif
#endif
#include "local.h"
#include "local.h"
 
 
FILE *
FILE *
_DEFUN(_fopen_r, (ptr, file, mode),
_DEFUN(_fopen_r, (ptr, file, mode),
       struct _reent *ptr _AND
       struct _reent *ptr _AND
       _CONST char *file _AND
       _CONST char *file _AND
       _CONST char *mode)
       _CONST char *mode)
{
{
  register FILE *fp;
  register FILE *fp;
  register int f;
  register int f;
  int flags, oflags;
  int flags, oflags;
 
 
  if ((flags = __sflags (ptr, mode, &oflags)) == 0)
  if ((flags = __sflags (ptr, mode, &oflags)) == 0)
    return NULL;
    return NULL;
  if ((fp = __sfp (ptr)) == NULL)
  if ((fp = __sfp (ptr)) == NULL)
    return NULL;
    return NULL;
 
 
  if ((f = _open_r (ptr, file, oflags, 0666)) < 0)
  if ((f = _open_r (ptr, file, oflags, 0666)) < 0)
    {
    {
      __sfp_lock_acquire ();
      __sfp_lock_acquire ();
      fp->_flags = 0;            /* release */
      fp->_flags = 0;            /* release */
#ifndef __SINGLE_THREAD__
#ifndef __SINGLE_THREAD__
      __lock_close_recursive (fp->_lock);
      __lock_close_recursive (fp->_lock);
#endif
#endif
      __sfp_lock_release ();
      __sfp_lock_release ();
      return NULL;
      return NULL;
    }
    }
 
 
  _flockfile (fp);
  _flockfile (fp);
 
 
  fp->_file = f;
  fp->_file = f;
  fp->_flags = flags;
  fp->_flags = flags;
  fp->_cookie = (_PTR) fp;
  fp->_cookie = (_PTR) fp;
  fp->_read = __sread;
  fp->_read = __sread;
  fp->_write = __swrite;
  fp->_write = __swrite;
  fp->_seek = __sseek;
  fp->_seek = __sseek;
  fp->_close = __sclose;
  fp->_close = __sclose;
 
 
  if (fp->_flags & __SAPP)
  if (fp->_flags & __SAPP)
    _fseek_r (ptr, fp, 0, SEEK_END);
    _fseek_r (ptr, fp, 0, SEEK_END);
 
 
#ifdef __SCLE
#ifdef __SCLE
  if (__stextmode (fp->_file))
  if (__stextmode (fp->_file))
    fp->_flags |= __SCLE;
    fp->_flags |= __SCLE;
#endif
#endif
 
 
  _funlockfile (fp);
  _funlockfile (fp);
  return fp;
  return fp;
}
}
 
 
#ifndef _REENT_ONLY
#ifndef _REENT_ONLY
 
 
FILE *
FILE *
_DEFUN(fopen, (file, mode),
_DEFUN(fopen, (file, mode),
       _CONST char *file _AND
       _CONST char *file _AND
       _CONST char *mode)
       _CONST char *mode)
{
{
  return _fopen_r (_REENT, file, mode);
  return _fopen_r (_REENT, file, mode);
}
}
 
 
#endif
#endif
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.