mirror of
https://github.com/php/php-src.git
synced 2024-11-25 10:54:15 +08:00
138 lines
3.4 KiB
C
138 lines
3.4 KiB
C
/****************************************************************************
|
|
*
|
|
* Copyright (C) 1991 Kendall Bennett.
|
|
* All rights reserved.
|
|
*
|
|
* Filename: $RCSfile$
|
|
* Version: $Revision$
|
|
*
|
|
* Language: ANSI C
|
|
* Environment: any
|
|
*
|
|
* Description: Header file for doubly linked list routines.
|
|
*
|
|
* $Id$
|
|
*
|
|
* Revision History:
|
|
* -----------------
|
|
*
|
|
* $Log$
|
|
* Revision 1.1 1999/04/21 23:11:20 ssb
|
|
* moved apache, com and hyperwave into ext/
|
|
*
|
|
* Revision 1.1.1.1 1999/04/07 21:03:20 zeev
|
|
* PHP 4.0
|
|
*
|
|
* Revision 1.1.1.1 1999/03/17 04:29:11 andi
|
|
* PHP4
|
|
*
|
|
* Revision 1.1.1.1 1998/12/21 07:56:22 andi
|
|
* Trying to start the zend CVS tree
|
|
*
|
|
* Revision 1.2 1998/08/14 15:51:12 shane
|
|
* Some work on getting hyperwave to work on windows. hg_comm needs a lot of work.
|
|
*
|
|
* Mainly, signals, fnctl, bzero, bcopy, etc are not portable functions. Most of this
|
|
* will have to be rewriten for windows.
|
|
*
|
|
* Revision 1.1 1998/08/12 09:29:16 steinm
|
|
* First version of Hyperwave module.
|
|
*
|
|
* Revision 1.5 91/12/31 19:40:54 kjb
|
|
*
|
|
* Modified include files directories.
|
|
*
|
|
* Revision 1.4 91/09/27 03:10:41 kjb
|
|
* Added compatibility with C++.
|
|
*
|
|
* Revision 1.3 91/09/26 10:07:16 kjb
|
|
* Took out extern references
|
|
*
|
|
* Revision 1.2 91/09/01 19:37:20 ROOT_DOS
|
|
* Changed DLST_TAIL macro so that it returns a pointer to the REAL last
|
|
* node of the list, not the dummy last node (l->z).
|
|
*
|
|
* Revision 1.1 91/09/01 18:38:23 ROOT_DOS
|
|
* Initial revision
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef __DLIST_H
|
|
#define __DLIST_H
|
|
|
|
#ifndef __DEBUG_H
|
|
/*#include "debug.h"*/
|
|
#endif
|
|
|
|
/*---------------------- Macros and type definitions ----------------------*/
|
|
|
|
typedef struct PHP_DLST_BUCKET {
|
|
struct PHP_DLST_BUCKET *next;
|
|
struct PHP_DLST_BUCKET *prev;
|
|
} PHP_DLST_BUCKET;
|
|
|
|
/* necessary for AIX 4.2.x */
|
|
|
|
#ifdef hz
|
|
#undef hz
|
|
#endif
|
|
|
|
typedef struct {
|
|
int count; /* Number of elements currently in list */
|
|
PHP_DLST_BUCKET *head; /* Pointer to head element of list */
|
|
PHP_DLST_BUCKET *z; /* Pointer to last node of list */
|
|
PHP_DLST_BUCKET hz[2]; /* Space for head and z nodes */
|
|
} DLIST;
|
|
|
|
/* Return a pointer to the user space given the address of the header of
|
|
* a node.
|
|
*/
|
|
|
|
#define PHP_DLST_USERSPACE(h) ((void*)((PHP_DLST_BUCKET*)(h) + 1))
|
|
|
|
/* Return a pointer to the header of a node, given the address of the
|
|
* user space.
|
|
*/
|
|
|
|
#define PHP_DLST_HEADER(n) ((PHP_DLST_BUCKET*)(n) - 1)
|
|
|
|
/* Return a pointer to the user space of the list's head node. This user
|
|
* space does not actually exist, but it is useful to be able to address
|
|
* it to enable insertion at the start of the list.
|
|
*/
|
|
|
|
#define PHP_DLST_HEAD(l) PHP_DLST_USERSPACE((l)->head)
|
|
|
|
/* Return a pointer to the user space of the last node in list. */
|
|
|
|
#define PHP_DLST_TAIL(l) PHP_DLST_USERSPACE((l)->z->prev)
|
|
|
|
/* Determine if a list is empty
|
|
*/
|
|
|
|
#define PHP_DLST_EMPTY(l) ((l)->count == 0)
|
|
|
|
/*-------------------------- Function Prototypes --------------------------*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
void *dlst_newnode(int size);
|
|
void dlst_freenode(void *node);
|
|
DLIST *dlst_init(void);
|
|
void dlst_kill(DLIST *l,void (*freeNode)(void *node));
|
|
void dlst_insertafter(DLIST *l,void *node,void *after);
|
|
void *dlst_deletenext(DLIST *l,void *node);
|
|
void *dlst_first(DLIST *l);
|
|
void *dlst_last(DLIST *l);
|
|
void *dlst_next(void *prev);
|
|
void *dlst_prev(void *next);
|
|
void dlst_mergesort(DLIST *l,int (*cmp_func)(void*,void*));
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|