Mercurial > hg > aim92
diff stitch/stitch.h @ 0:5242703e91d3 tip
Initial checkin for AIM92 aimR8.2 (last updated May 1997).
author | tomwalters |
---|---|
date | Fri, 20 May 2011 15:19:45 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stitch/stitch.h Fri May 20 15:19:45 2011 +0100 @@ -0,0 +1,149 @@ +/* + Copyright (c) Applied Psychology Unit, Medical Research Council. 1988, 1989 + =========================================================================== + + Permission to use, copy, modify, and distribute this software without fee + is hereby granted for research purposes, provided that this copyright + notice appears in all copies and in all supporting documentation, and that + the software is not redistributed for any fee (except for a nominal shipping + charge). Anyone wanting to incorporate all or part of this software in a + commercial product must obtain a license from the Medical Research Council. + + The MRC makes no representations about the suitability of this + software for any purpose. It is provided "as is" without express or implied + warranty. + + THE MRC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE + A.P.U. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY + DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/* + stitch.h + ======== + + interface for stitch system. + + This contains many regrettable #defines which are the act of a parnoid + bad typist who wishes to lerave nothing to chance. They are not as hostile + as they might first seem being mostly to do with methodical means of + allocation making more use of typeing to avoid any chance of a badly + allocated data buffer. This file is supported by two other abstractions: + buffer.[ch] which ensures a buffer is the size required without realoocation. + wrap.[ch] which encapsulates allocations to detect buffer overflows. + + In general there are two levels of indirection between the macros defined + below and the final calls for memory allocation from the C library function. + The first level is a C pre-processor macro to get all the catsings right + for lint and do things with types that procedures just can't do. + The second level is just passes the allocation call on so it can + be intercepted as an aid to portability. + +*/ + + +#ifndef _STITCH_H_ +#define _STITCH_H_ + +/* redefinitions of general memory allocation to check number and cast argumnets */ + +#define Malloc( _size, _where ) stitch_malloc( (unsigned) ( _size ), _where ) +#define Ralloc( _size, _where ) stitch_ralloc( (unsigned) ( _size ), _where ) +#define Calloc( _size, _items, _where ) stitch_malloc( (unsigned) ( _size ), (unsigned) ( _items ), _where ) +#define Realloc( _old, _size , _where ) stitch_realloc( (Pointer) ( _old ), (unsigned) ( _size ) ) + +/* deallocation - delete destroys pointer to keep it out of trouble */ + +#define Free( _old ) stitch_free( (Pointer) ( _old ) ) +#define Delete( _variable ) ( Free( _variable ), _variable = 0 ) + +/* more names for the allocation */ + +#define Allocate( _size, _where ) stitch_malloc( (unsigned) ( _size ), _where ) +#define AllocateZeroed( _size, _where ) stitch_zeroed_malloc( (unsigned) ( _size ), _where ) +#define AllocateCopied( _size, _model, _where ) stitch_copied_malloc( (unsigned) ( _size ), (Pointer) _model, _where ) + +#define Reallocate( _old, _size ) stitchRealloc( (Pointer) ( _old ), (unsigned) ( _size ) ) + +/* macros for allocation making more use of type of variable receiving pointer */ + +#define TypeSize( _pointer ) ( sizeof * (_pointer) 0 ) + +/* return pointer to New structure, random, zeroed or copied */ + +#define New( _type ) (_type ) Allocate( TypeSize( _type ), stitchStructStr ) +#define NewZeroed( _type ) (_type ) AllocateZeroed( TypeSize( _type ), stitchStructStr ) +#define NewCopied( _type, _model ) (_type ) AllocateCopied( TypeSize( _type ), _model, stitchStructStr ) + +/* return pointer to array of structures */ + +#define NewArray( _type, _n, _where ) (_type *) Allocate( sizeof (_type) * (unsigned) ( _n ), _where ) +#define NewZeroedArray( _type, _n, _where ) (_type *) AllocateZeroed( sizeof (_type) * (unsigned) ( _n ), _where ) +#define NewCopiedArray( _type, _n, _model, _where ) (_type *) AllocateCopied( sizeof (_type) * (unsigned) ( _n ), _model, _where ) + +/* as above but declare variable to receive pointer as well like new in C++ */ + +#define DeclareNew( _type, _name ) _type _name = New( _type ) +#define DeclareNewZeroed( _type, _name ) _type _name = NewZeroed( _type ) +#define DeclareNewCopied( _type, _name, _model ) _type _name = NewCopied( _type, _model ) + +#define DeclareNewArray( _type, _name, _n, _where ) _type *_name = NewArray( _type, _n, _where ) +#define DeclareNewZeroedArray( _type, _name, _n, _where ) _type *_name = NewZeroedArray( _type, _n, _where ) +#define DeclareNewCopiedArray( _type, _name, _n, _model, _where ) _type *_name = NewCopiedArray( _type, _n, _model, _where ) + +/* structure utilities */ + +#define CopyArray( _from, _to, _number ) ( stitch_bcopy( _from, _to, sizeof ( * ( _to ) ) * ( _number ) ), _to ) +#define ZeroArray( _to, _number ) ( stitch_bzero( _to, sizeof ( * ( _to ) ) * ( _number ) ), _to ) + +#define Copy( _from, _to ) ( stitch_bcopy( _from, _to, sizeof ( * ( _to ) ) ), _to ) +#define Zero( _to ) ( stitch_bzero( _to, sizeof ( * ( _to ) ) ), _to ) + +#if 0 + +/* defines for new names for now ( removed for clarity ) */ + +#define stitchMalloc( _size, _where ) stitch_malloc( (unsigned) _size, _where ) +#define stitchZeroedMalloc( _size, _where ) stitch_zeroed_malloc( (unsigned) _size, _where ) +#define stitchCopiedMalloc( _size, _model, _where ) stitch_copied_malloc( (unsigned) _size, _model, _where ) + +#define stitchRealloc( _pt, _size, _where ) stitch_ralloc( (Pointer) _pt, (unsigned) _size, _where ) + +#define stitchFree( _old ) stitch_free( _old ) +#endif + + +/* realy important typedefs.... */ + +#if PEDANTIC +typedef struct _void *Pointer ; /* pointer to object of unknown size effectively void * */ +#else +typedef char *Pointer ; +#endif +typedef char *Address ; + + +/* a portable inteface to the system */ + +extern void stitch_error() ; + +extern Pointer stitch_malloc() ; +extern Pointer stitch_copied_malloc() ; +extern Pointer stitch_zeroed_malloc() ; +extern Pointer stitch_ralloc() ; +extern Pointer stitch_calloc() ; + +extern void stitch_free() ; +extern void stitch_exit() ; + +/* beware these definitions, they are for speed and fail if stitch.h not included */ + +extern void (*stitch_bcopy)() ; +extern void (*stitch_bzero)() ; + +extern char stitchStructStr[] ; + +#endif