/* * avrdude - A Downloader/Uploader for AVR device programmers * Copyright (C) 1990-2004 Brian S. Dean * * 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, see . */ /* $Id$ */ /*---------------------------------------------------------------------- Id: lists.h,v 1.2 2001/08/19 23:13:17 bsd Exp $ ----------------------------------------------------------------------*/ /*---------------------------------------------------------------------- General purpose linked list routines - header file declarations. Author : Brian Dean Date : 10 January, 1990 ----------------------------------------------------------------------*/ #ifndef lists_h #define lists_h #include typedef void * LISTID; typedef void * LNODEID; /*---------------------------------------------------------------------- several defines to access the LIST structure as as stack or a queue --- use for program readability ----------------------------------------------------------------------*/ #define STACKID LISTID #define SNODEID LNODEID #define QUEUEID LISTID #define QNODEID LNODEID #define PUSH(s,d) lins_n(s,d,1) /* push 'd' onto the stack */ #define POP(s) lrmv_n(s,1) /* pop the stack */ #define LOOKSTACK(s) lget_n(s,1) /* look at the top of the stack, but don't pop */ #define ENQUEUE(q,d) lins_n(q,d,1) /* put 'd' on the end of the queue */ #define DEQUEUE(q) lrmv(q) /* remove next item from the front of the queue */ #define REQUEUE(q,d) ladd(q,d) /* re-insert (push) item back on the front of the queue */ #define LOOKQUEUE(q) lget(q) /* return next item on the queue, but don't dequeue */ #define QUEUELEN(q) lsize(q) /* length of the queue */ #define LISTADD(l,d) ladd(l,d) /* add to end of the list */ #define LISTRMV(l,d) lrmv_d(l,d) /* remove from end of the list */ #ifdef __cplusplus extern "C" { #endif /* .................... Function Prototypes .................... */ LISTID lcreat ( void * liststruct, int poolsize ); void ldestroy ( LISTID lid ); void ldestroy_cb ( LISTID lid, void (*ucleanup)(void * data_ptr) ); LNODEID lfirst ( LISTID ); /* head of the list */ LNODEID llast ( LISTID ); /* tail of the list */ LNODEID lnext ( LNODEID ); /* next item in the list */ LNODEID lprev ( LNODEID ); /* previous item in the list */ void * ldata ( LNODEID ); /* data at the current position */ int lsize ( LISTID ); /* number of elements in the list */ int ladd ( LISTID lid, void * p ); int laddo ( LISTID lid, void *p, int (*compare)(const void *p1,const void *p2), LNODEID * firstdup ); int laddu ( LISTID lid, void * p, int (*compare)(const void *p1,const void *p2)); int lins_n ( LISTID lid, void * d, unsigned int n ); int lins_ln ( LISTID lid, LNODEID lnid, void * data_ptr ); void * lget ( LISTID lid ); void * lget_n ( LISTID lid, unsigned int n ); LNODEID lget_ln ( LISTID lid, unsigned int n ); void * lrmv ( LISTID lid ); void * lrmv_n ( LISTID lid, unsigned int n ); void * lrmv_ln ( LISTID lid, LNODEID lnid ); void * lrmv_d ( LISTID lid, void * data_ptr ); LISTID lcat ( LISTID lid1, LISTID lid2 ); void lsort ( LISTID lid, int (*compare)(void * p1, void * p2)); void * lsrch ( LISTID lid, void * p, int (*compare)(void *p1,void *p2)); int lprint ( FILE * f, LISTID lid ); #ifdef __cplusplus } #endif #endif