1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
/*
* Doubly linked list primitives
* Copyright
* (C) 1992 Joseph H. Allen
*
* This file is part of JOE (Joe's Own Editor)
*/
#include "config.h"
#include "types.h"
__RCSID("$MirOS: contrib/code/jupp/queue.c,v 1.7 2021/09/09 16:46:18 tg Exp $");
#include <stdlib.h>
#include "queue.h"
#include "utils.h"
void *QUEUE;
void *ITEM;
void *LAST;
void *
alitem(void *list, size_t itemsize)
{
STDITEM *freelist = (STDITEM *)list;
if (qempty(STDITEM, link, freelist)) {
size_t num = 16;
unsigned char *i = calloc(num, itemsize);
while (num--) {
enquef(STDITEM, link, freelist, i);
i += itemsize;
}
}
return (void *)deque_f(STDITEM, link, freelist->link.prev);
}
void frchn(void *list, void *ch)
{
STDITEM *freelist = (STDITEM *)list;
STDITEM *chn = (STDITEM *)ch;
STDITEM *i;
if ((i = chn->link.prev) != chn) {
deque(STDITEM, link, chn);
splicef(STDITEM, link, freelist, i);
}
}
|