Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Postfix/src/util/   (Postfix Mailserver Version 3.11©)  Datei vom 7.11.2014 mit Größe 4 kB image not shown  

Quelle  vbuf.h

  Sprache: C
 

#ifndef _VBUF_H_INCLUDED_
#define _VBUF_H_INCLUDED_

/*++
/* NAME
/* vbuf 3h
/* SUMMARY
/* generic buffer
/* SYNOPSIS
/* #include <vbuf.h>
/* DESCRIPTION
/* .nf

 /*
  * The VBUF buffer is defined by 1) its structure, by 2) the VBUF_GET() and
  * 3) VBUF_PUT() operations that automatically handle buffer empty and
  * buffer full conditions, and 4) by the VBUF_SPACE() operation that allows
  * the user to reserve buffer space ahead of time, to allow for situations
  * where calling VBUF_PUT() is not possible or desirable.
  *
  * The VBUF buffer does not specify primitives for memory allocation or
  * deallocation. The purpose is to allow different applications to have
  * different strategies: a memory-resident buffer; a memory-mapped file; or
  * a stdio-like window to an open file. Each application provides its own
  * get(), put() and space() methods that perform the necessary magic.
  *
  * This interface is pretty normal. With one exception: the number of bytes
  * left to read is negated. This is done so that we can change direction
  * between reading and writing on the fly. The alternative would be to use
  * separate read and write counters per buffer.
  */

typedef struct VBUF VBUF;
typedef int (*VBUF_GET_READY_FN) (VBUF *);
typedef int (*VBUF_PUT_READY_FN) (VBUF *);
typedef int (*VBUF_SPACE_FN) (VBUF *, ssize_t);

struct VBUF {
    int     flags;   /* status, see below */
    unsigned char *data;  /* variable-length buffer */
    ssize_t len;   /* buffer length */
    ssize_t cnt;   /* bytes left to read/write */
    unsigned char *ptr;   /* read/write position */
    VBUF_GET_READY_FN get_ready; /* read buffer empty action */
    VBUF_PUT_READY_FN put_ready; /* write buffer full action */
    VBUF_SPACE_FN space;  /* request for buffer space */
};

 /*
  * Typically, an application will embed a VBUF structure into a larger
  * structure that also contains application-specific members. This approach
  * gives us the best of both worlds. The application can still use the
  * generic VBUF primitives for reading and writing VBUFs. The macro below
  * transforms a pointer from VBUF structure to the structure that contains
  * it.
  */

#define VBUF_TO_APPL(vbuf_ptr,app_type,vbuf_member) \
    ((app_type *) (((char *) (vbuf_ptr)) - offsetof(app_type,vbuf_member)))

 /*
  * Buffer status management.
  */

#define VBUF_FLAG_RD_ERR (1<<0/* read error */
#define VBUF_FLAG_WR_ERR (1<<1/* write error */
#define VBUF_FLAG_ERR  (VBUF_FLAG_RD_ERR | VBUF_FLAG_WR_ERR)
#define VBUF_FLAG_EOF  (1<<2/* end of data */
#define VBUF_FLAG_RD_TIMEOUT (1<<3/* read timeout */
#define VBUF_FLAG_WR_TIMEOUT (1<<4/* write timeout */
#define VBUF_FLAG_TIMEOUT (VBUF_FLAG_RD_TIMEOUT | VBUF_FLAG_WR_TIMEOUT)
#define VBUF_FLAG_BAD (VBUF_FLAG_ERR | VBUF_FLAG_EOF | VBUF_FLAG_TIMEOUT)
#define VBUF_FLAG_FIXED  (1<<5/* fixed-size buffer */

#define vbuf_rd_error(v) ((v)->flags & (VBUF_FLAG_RD_ERR | VBUF_FLAG_RD_TIMEOUT))
#define vbuf_wr_error(v) ((v)->flags & (VBUF_FLAG_WR_ERR | VBUF_FLAG_WR_TIMEOUT))
#define vbuf_rd_timeout(v) ((v)->flags & VBUF_FLAG_RD_TIMEOUT)
#define vbuf_wr_timeout(v) ((v)->flags & VBUF_FLAG_WR_TIMEOUT)

#define vbuf_error(v) ((v)->flags & (VBUF_FLAG_ERR | VBUF_FLAG_TIMEOUT))
#define vbuf_eof(v) ((v)->flags & VBUF_FLAG_EOF)
#define vbuf_timeout(v) ((v)->flags & VBUF_FLAG_TIMEOUT)
#define vbuf_clearerr(v) ((v)->flags &= ~VBUF_FLAG_BAD)

 /*
  * Buffer I/O-like operations and results.
  */

#define VBUF_GET(v) ((v)->cnt < 0 ? ++(v)->cnt, \
    (int) *(v)->ptr++ : vbuf_get(v))
#define VBUF_PUT(v,c) ((v)->cnt > 0 ? --(v)->cnt, \
    (int) (*(v)->ptr++ = (c)) : vbuf_put((v),(c)))
#define VBUF_SPACE(v,n) ((v)->space((v),(n)))

#define VBUF_EOF (-1)  /* no more space or data */

extern int vbuf_get(VBUF *);
extern int vbuf_put(VBUF *, int);
extern int vbuf_unget(VBUF *, int);
extern ssize_t vbuf_read(VBUF *, void *, ssize_t);
extern ssize_t vbuf_write(VBUF *, const void *, ssize_t);

/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/


#endif

Messung V0.5 in Prozent
C=89 H=92 G=90

¤ Dauer der Verarbeitung: 0.12 Sekunden  (vorverarbeitet am  2026-08-08) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.