/*
 *      %Z% %M% %I% %D% %Q%
 *
 *      Copyright (C) Microsoft Corporation, 1983
 *
 *      This Module contains Proprietary Information of Microsoft
 *      Corporation and AT&T, and should be treated as Confidential.
 */
/***    nstdio.h - msdos net version of stdio.h
 *
 *      MODIFICATION HISTORY
 */

#define NBUFSIZ 512
#define _NLSN   32
extern  struct _niobuf {        /* looks like stdio structure */
        unsigned char   *_ptr;
        int             _cnt;
        unsigned char   *_base;
        char            _flag;
        char            _file;
} _niob[_NLSN];

/* Buffer size for small, pre-allocated buffers */
#define _NSBFSIZ 8


/*
 * _IOLBF means that a file's output will be buffered line by line
 */
#define _NIOFBF         0000
#define _NIOREAD        01
#define _NIOWRT         02
#define _NIONBF         04
#define _NIOMYBUF       010
#define _NIOEOF         020
#define _NIOERR         040
#define _NIOLBF         0100
#define _NIORW          0200

#ifndef NULL
#define NULL    ((char *)0)
#endif
#define NFILE   struct _niobuf
#ifndef EOF
#define EOF     (-1)
#endif


#define _nbufend(p)     _nbufendtab[(p)-_niob]
#define _nbufsiz(p)     (_nbufend(p) - (p)->_base)

/***    ngetc -- get character from a net stream.
 *
 *      return character on success.  return EOF on end of file or
 *      error.
 *
 *      int ngetc(stream)
 *      NFILE  *stream;
 */

#define ngetc(p)        (                       \
        --(p)->_cnt >= 0 ?                      \
        (0xff & (int) (*(p)->_ptr++)) :         \
        _nfilbuf(p)                             \
)

/***    nputc -- put character on a net stream.
 *
 *      return character on success.  return EOF on error.
 *
 *      int nputc(ch, stream)
 *      char  ch;
 *      NFILE  *stream;
 */
#define nputc(c, p)     (                       \
        --(p)->_cnt >= 0 ?                      \
        (0xff & (int) (*(p)->_ptr++ = (c))) :   \
        _nflsbuf((c), (p))                      \
)
/* The following macros improve performance of the net stdio by reducing the
        number of calls to _nbufsync and _nwrtchk.  _NBUFSYNC has the same
        effect as _nbufsync, and _NWRTCHK has the same effect as _nwrtchk,
        but often these functions have no effect, and in those cases the
        macros avoid the expense of calling the functions.  */

#define _NBUFSYNC(iop)  if (_nbufend(iop) - iop->_ptr <   \
                                ( iop->_cnt < 0 ? 0 : iop->_cnt ) )  \
                                        _nbufsync(iop)
#define _NWRTCHK(iop)   ((((iop->_flag & (_NIOWRT | _NIOEOF)) != _NIOWRT) \
                                || (iop->_base == NULL)  \
                                || (iop->_ptr == iop->_base && iop->_cnt == 0 \
                                        && !(iop->_flag & (_NIONBF | _NIOLBF)))) \
                        ? _nwrtchk(iop) : 0 )

#define nclearerr(p)    ((void) ((p)->_flag &= ~(char)(_NIOERR | _NIOEOF)))
#define nfeof(p)                (((p)->_flag&_NIOEOF)!=0)
#define nferror(p)      (((p)->_flag&_NIOERR)!=0)
#define nfileno(p)      (p)->_file

extern  NFILE   *nfdopen(int, char *);
extern  char    *nfgets(char *, int, NFILE *);
extern  unsigned char   *_nbufendtab[];
extern  int     nfflush(NFILE *);
extern  int     nfclose(NFILE *);
extern  int     nfflush(NFILE *);
extern  void    nfprintf(NFILE *,char *, ...);
extern  void    nsetbuf(NFILE *,char *);
extern  int     checknet(void);