/*
 *                            COPYRIGHT
 *
 *  PCB, interactive printed circuit board design
 *  Copyright (C) 1994,1995,1996 Thomas Nau
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *  Contact addresses for paper mail and Email:
 *  Thomas Nau, Schlehenweg 15, 88471 Baustetten, Germany
 *  Thomas.Nau@rz.uni-ulm.de
 *
 *  RCS: $Id: mymem.h,v 145.1 1997/07/26 12:56:25 nau Exp $
 */

/* prototypes for memory routines
 */

#ifndef	__MYMEM_INCLUDED__
#define	__MYMEM_INCLUDED__

#include <stdlib.h>
#include "global.h"

/* ---------------------------------------------------------------------------
 * number of additional objects that are allocated with one system call
 */
#define	STEP_VIA			500		/* block size for realloc() calls */
#define	STEP_PIN			20
#define	STEP_PAD			20
#define	STEP_LINE			500
#define	STEP_ELEMENTLINE	10
#define	STEP_ELEMENTARC		5
#define	STEP_TEXT			50
#define	STEP_ELEMENT		50
#define STEP_DRILL		30
#define STEP_POINT		100
#define	STEP_SYMBOLLINE		10
#define	STEP_SELECTORENTRY	128
#define	STEP_REMOVELIST		500
#define	STEP_UNDOLIST		500
#define	STEP_POLYGON		10
#define	STEP_POLYGONPOINT	10
#define	STEP_LIBRARYMENU	10
#define	STEP_LIBRARYENTRY	20
#define	STEP_RUBBERBAND		100

/* ---------------------------------------------------------------------------
 * some memory types
 */
typedef struct
{
	size_t	MaxLength;
	char	*Data;
} DynamicStringType, *DynamicStringTypePtr;

RubberbandTypePtr	GetRubberbandMemory(void);
PinTypePtr			GetPinMemory(ElementTypePtr);
PadTypePtr			GetPadMemory(ElementTypePtr);
PinTypePtr			GetViaMemory(DataTypePtr);
LineTypePtr			GetLineMemory(LayerTypePtr);
TextTypePtr			GetTextMemory(LayerTypePtr);
PolygonTypePtr		GetPolygonMemory(LayerTypePtr);
PointTypePtr		GetPointMemoryInPolygon(PolygonTypePtr);
ElementTypePtr		GetElementMemory(DataTypePtr);
ConnectionTypePtr	GetConnectionMemory(SubnetTypePtr);
SubnetTypePtr		GetSubnetMemory(NetTypePtr);
LibraryMenuTypePtr	GetLibraryMenuMemory(void);
LibraryEntryTypePtr	GetLibraryEntryMemory(LibraryMenuTypePtr);
ElementTypeHandle	GetDrillElementMemory(DrillTypePtr);
PinTypeHandle		GetDrillPinMemory(DrillTypePtr);
DrillTypePtr		GetDrillInfoDrillMemory(DrillInfoTypePtr);
void				*MyCalloc(size_t, size_t, char *);
void				*MyRealloc(void *, size_t, char *);
char				*MyStrdup(char *s, char *);
void				MyFree(char **);
void				FreePolygonMemory(PolygonTypePtr);
void				FreeElementMemory(ElementTypePtr);
void				FreePCBMemory(PCBTypePtr);
void				FreeNetMemory(NetTypePtr);
void				FreeSubnetMemory(SubnetTypePtr);
void				FreeDataMemory(DataTypePtr);
void				FreeLibraryMemory(void);
void				SaveFree(void *);
void				DSAddCharacter(DynamicStringTypePtr, char);
void				DSAddString(DynamicStringTypePtr, char *);
void				DSClearString(DynamicStringTypePtr);
char				*StripWhiteSpaceAndDup(char *);

#ifdef NEED_STRDUP
char				*strdup(const char *);
#endif

#endif
