This is queue.h in view mode; [Download] [Up]
/* Doubly linked list primitives Copyright (C) 1992 Joseph H. Allen This file is part of JOE (Joe's Own Editor) JOE 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 1, or (at your option) any later version. JOE 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 JOE; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef _Iqueue #define _Iqueue 1 #include "config.h" extern void *ITEM; extern void *QUEUE; extern void *LAST; #define LINK(type) struct { type *next; type *prev; } #define izque(type,member,item) \ ( \ QUEUE=(void *)(item), \ ((type *)QUEUE)->member.prev=(type *)QUEUE, \ ((type *)QUEUE)->member.next=(type *)QUEUE, \ (type *)QUEUE \ ) #define deque(type,member,item) \ ( \ ITEM=(void *)(item), \ ((type *)ITEM)->member.prev->member.next=((type *)ITEM)->member.next, \ ((type *)ITEM)->member.next->member.prev=((type *)ITEM)->member.prev, \ (type *)ITEM \ ) #define qempty(type,member,item) \ ( \ QUEUE=(void *)(item), \ (type *)QUEUE==((type *)QUEUE)->member.next \ ) #define enquef(type,member,queue,item) \ ( \ ITEM=(void *)(item), \ QUEUE=(void *)(queue), \ ((type *)ITEM)->member.next=((type *)QUEUE)->member.next, \ ((type *)ITEM)->member.prev=(type *)QUEUE, \ ((type *)QUEUE)->member.next->member.prev=(type *)ITEM, \ ((type *)QUEUE)->member.next=(type *)ITEM, \ (type *)ITEM \ ) #define enqueb(type,member,queue,item) \ ( \ ITEM=(void *)(item), \ QUEUE=(void *)(queue), \ ((type *)ITEM)->member.next=(type *)QUEUE, \ ((type *)ITEM)->member.prev=((type *)QUEUE)->member.prev, \ ((type *)QUEUE)->member.prev->member.next=(type *)ITEM, \ ((type *)QUEUE)->member.prev=(type *)ITEM, \ (type *)ITEM \ ) #define promote(type,member,queue,item) \ ( \ enquef(type,member,(queue),deque(type,member,(item))) \ ) #define demote(type,member,queue,item) \ ( \ enqueb(type,member,(queue),deque(type,member,(item))) \ ) #define splicef(type,member,queue,chain) \ ( \ ITEM=(void *)(chain), \ LAST=(void *)((type *)ITEM)->member.prev, \ QUEUE=(void *)(queue), \ ((type *)LAST)->member.next=((type *)QUEUE)->member.next, \ ((type *)ITEM)->member.prev=(type *)QUEUE, \ ((type *)QUEUE)->member.next->member.prev=(type *)LAST, \ ((type *)QUEUE)->member.next=(type *)ITEM, \ (type *)ITEM \ ) #define spliceb(type,member,queue,chain) \ ( \ ITEM=(void *)(chain), \ LAST=(void *)((type *)ITEM)->member.prev, \ QUEUE=(void *)(queue), \ ((type *)LAST)->member.next=(type *)QUEUE, \ ((type *)ITEM)->member.prev=((type *)QUEUE)->member.prev, \ ((type *)QUEUE)->member.prev->member.next=(type *)ITEM, \ ((type *)QUEUE)->member.prev=(type *)LAST, \ (type *)ITEM \ ) #define snip(type,member,first,last) \ ( \ ITEM=(void *)(first), \ LAST=(void *)(last), \ ((type *)LAST)->member.next->member.prev=((type *)ITEM)->member.prev, \ ((type *)ITEM)->member.prev->member.next=((type *)LAST)->member.next, \ ((type *)ITEM)->member.prev=(type *)LAST, \ ((type *)LAST)->member.next=(type *)ITEM, \ (type *)ITEM \ ) void *alitem(); void frchn(); #endif
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.