Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

352 lines
7.3 KiB

//
// Copyright (c) 1997-1999 Microsoft Corporation.
//
#include "stdafx.h"
#define LISTDATAMAX 4
#define NIL (void *)0
struct vecdata {
short x, y, atr;
};
struct VDATA {
struct VDATA *next, *prev;
struct vecdata vd;
};
struct VHEAD {
struct VHEAD *next, *prev;
struct VDATA *headp;
int nPoints;
};
struct VCNTL {
struct VHEAD *rootHead;
struct VHEAD *currentHead;
int nCont;
struct VDATA *cvp;
int mendp;
void *memroot;
void *cmem;
};
int VDInit(void);
void VDTerm(void);
void VDNew(int lsthdl);
int VDClose(int lsthdl);
int VDSetData(int lsthdl,struct vecdata *pnt);
int VDGetData(int lsthdl,int contN,int pn,struct vecdata *pnt);
int VDGetHead(int lsthdl,struct VHEAD * *vhd);
static void *getmem(int lsthdl,int siz);
int VDGetNCont(int lstHdl);
int VDReverseList(int lstHdl);
int VDCopy(int srcH,int dstH);
struct VCNTL VCntlTbl[LISTDATAMAX];
#define ALLOCMEMUNIT 2048
static int init=0;
/***********************************************************************
* initialize data
*/
/* */ int
/* */ VDInit()
/*
* returns : 0, -1( out of memory)
***********************************************************************/
{
int lsthdl;
void *mem;
if ( init)
return( 0);
for( lsthdl = 0; lsthdl < LISTDATAMAX; lsthdl++) {
/* Allocate First memory */
mem = (void *)malloc( ALLOCMEMUNIT);
if ( mem==NIL)
return( -1);
*((void **)mem) = NIL;
VCntlTbl[lsthdl].memroot = mem;
VDNew(lsthdl);
}
init = 1;
return( 0);
}
/***********************************************************************
* Terminate
*/
/* */ void
/* */ VDTerm()
/*
* returns : none
***********************************************************************/
{
void *mem, *nextmem;
int lsthdl;
if ( init) {
for( lsthdl = 0; lsthdl < LISTDATAMAX; lsthdl++) {
mem = VCntlTbl[lsthdl].memroot;
do {
nextmem = *((void * *)mem);
free( mem);
mem = nextmem;
} while ( mem!=NIL);
}
init = 0;
}
return;
}
/***********************************************************************
* New Data
*/
/* */ void
/* */ VDNew(int lsthdl)
/*
* returns : none
***********************************************************************/
{
struct VCNTL *vc;
vc = VCntlTbl+lsthdl;
vc->cmem = vc->memroot;
vc->mendp = sizeof( void *);
vc->currentHead = vc->rootHead = (struct VHEAD *)((char *)(vc->cmem)+vc->mendp);
vc->mendp += sizeof( struct VHEAD);
vc->currentHead->prev = (struct VHEAD *)NIL;
vc->currentHead->next = (struct VHEAD *)NIL;
vc->currentHead->headp = (struct VDATA *)NIL;
vc->currentHead->nPoints = 0;
vc->cvp = (struct VDATA *)NIL;
vc->nCont = 0;
}
/***********************************************************************
* Close Contour
*/
/* */ int
/* */ VDClose(int lsthdl)
/*
* returns : none
***********************************************************************/
{
struct VHEAD *vh;
struct VCNTL *vc;
vc = VCntlTbl+lsthdl;
vc->cvp->next = vc->currentHead->headp;
vc->currentHead->headp->prev = vc->cvp;
vh = (struct VHEAD *)getmem( lsthdl, sizeof(struct VHEAD));
if ( vh == NIL) return( -1);
vc->currentHead->next = vh;
vh->prev = vc->currentHead;
vh->next = (struct VHEAD *)NIL;
vh->headp = (struct VDATA *)NIL;
vh->nPoints = 0;
vc->currentHead = vh;
vc->cvp = (struct VDATA *)NIL;
vc->nCont++;
return (0);
}
/***********************************************************************
* Set Data
*/
/* */ int
/* */ VDSetData (
/* */ int lsthdl,
/* */ struct vecdata *pnt)
/*
* return : 0, -1 ( no memory)
***********************************************************************/
{
void *mem;
struct VCNTL *vc;
vc = VCntlTbl+lsthdl;
mem = getmem( lsthdl,sizeof( struct VDATA));
if ( mem == NIL) {
return -1;
}
if ( vc->cvp== NIL) { /* Contour First Point*/
vc->cvp = vc->currentHead->headp = (struct VDATA *)mem;
vc->cvp->vd = *pnt;
vc->cvp->next = vc->cvp->prev= (struct VDATA *)NIL;
}
else {
vc->cvp->next = (struct VDATA *)mem;
vc->cvp->next->prev = vc->cvp;
vc->cvp = vc->cvp->next;
vc->cvp->vd = *pnt;
vc->cvp->next =(struct VDATA *) NIL;
}
vc->currentHead->nPoints++;
return 0;
}
/***********************************************************************
* Get Data
*/
/* */ int
/* */ VDGetData(
/* */ int lsthdl,
/* */ int contN,
/* */ int pn,
/* */ struct vecdata *pnt)
/*
* returns : 0, -1 ( Illeagal Coontour Number)
***********************************************************************/
{
struct VHEAD *vhd;
struct VDATA *cvd;
if ( lsthdl <0 ||lsthdl >= LISTDATAMAX)
return -1;
if ((vhd = VCntlTbl[lsthdl].rootHead)==NIL)
return -1;
while ( contN-->0)
vhd = vhd->next;
cvd = vhd->headp;
while ( pn-->0)
cvd = cvd->next;
*pnt = cvd->vd;
return 0;
}
/***********************************************************************
* Get Data Head
*/
/* */ int
/* */ VDGetHead(
/* */ int lsthdl,
/* */ struct VHEAD **vhd)
/*
* returns : 0, -1
***********************************************************************/
{
if ( lsthdl >= 0 && lsthdl < LISTDATAMAX) {
*vhd = VCntlTbl[lsthdl].rootHead;
return( 0);
}
else
return( -1);
}
/***********************************************************************
* Get Memory
*/
/* */ static void *
/* */ getmem( int lsthdl, int siz)
/*
* returns : 0, -1
***********************************************************************/
{
void *mem;
struct VCNTL *vc;
vc = VCntlTbl+lsthdl;
if ( vc->mendp + siz >= ALLOCMEMUNIT) {
mem = *((void **)vc->cmem);
if ( mem == NIL ) {
mem = (void *)malloc(ALLOCMEMUNIT);
if ( mem == NIL)
return( NIL);
*((void * *)mem) = NIL;
*((void * *)vc->cmem) = mem; /* */
vc->cmem = mem;
}
else
vc->cmem = mem;
vc->mendp = sizeof(void *);
}
mem = (void *)((char *)(vc->cmem) + vc->mendp);
vc->mendp += siz;
return(mem );
}
/***********************************************************************
* Get Number of COntours
*/
/* */ int
/* */ VDGetNCont( int lstHdl)
/*
* returns : Number of Contour
***********************************************************************/
{
if ( lstHdl >= 0 && lstHdl < LISTDATAMAX)
return VCntlTbl[lstHdl].nCont;
else
return( -1);
}
/***********************************************************************
* Reverse List
*/
/* */ int
/* */ VDReverseList( int lstHdl)
/*
* returns : 0, -1 ( handle No )
***********************************************************************/
{
int cont;
int np;
struct VHEAD *vh;
struct VDATA *vp, *nvp;
if ( lstHdl < 0 || lstHdl >= LISTDATAMAX)
return -1;
vh = VCntlTbl[lstHdl].rootHead;
for ( cont = 0; cont < VCntlTbl[lstHdl].nCont; cont++ ) {
vp = vh ->headp;
np = vh->nPoints;
while ( np-->0) {
nvp = vp->next;
vp->next = vp->prev;
vp->prev = nvp;
vp = nvp;
}
vh = vh->next;
}
return 0;
}
/***********************************************************************
* Copy Data
*/
/* */ int
/* */ VDCopy( int srcH, int dstH)
/*
* returns : 0, -1(Invalid Handle)
***********************************************************************/
{
int cont;
int np;
struct VHEAD *vh;
struct VDATA *vp;
if ( srcH < 0 || srcH >= LISTDATAMAX
|| dstH < 0 || dstH >= LISTDATAMAX)
return -1;
VDNew( dstH);
vh = VCntlTbl[srcH].rootHead;
for ( cont = 0; cont < VCntlTbl[srcH].nCont; cont++ ) {
vp = vh ->headp;
np = vh->nPoints;
while ( np-->0) {
if ( VDSetData( dstH, &vp->vd))
return -1;
vp = vp->next;
}
vh = vh->next;
VDClose( dstH);
}
return 0;
}
/* EOF */