/*
 * Motif
 *
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
 *
 * These libraries and programs are free software; you can
 * redistribute them and/or modify them under the terms of the GNU
 * Lesser General Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * These libraries and programs are distributed in the hope that
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 * PURPOSE. See the GNU Lesser General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with these librararies and programs; if not, write
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
 * Floor, Boston, MA 02110-1301 USA
 * 
 */

#ifndef _LIST_H
#define _LIST_H

#if defined(VMS) || defined (__VMS)
#include <X11/apienvset.h>
#endif

#include <Xm/Xm.h>
#include <Xm/Ext.h>

#ifdef __cplusplus
extern "C" {
#endif

/************************************************************
 *
 * Stack Data structure.  
 *
 ************************************************************/

typedef struct _XmStackRec {
    int top, alloc;    		/* The top node of the stack, and the number
				   of allocated nodes. */
    XtPointer * elems;		/* The stack elements. */
} XmStackRec, *XmStack;

/************************************************************
 *
 *  Global function defs.
 *
 ************************************************************/

XmStack _XmStackInit(void);
void _XmStackFree(XmStack), _XmStackPush(XmStack, XtPointer);
XtPointer _XmStackPop(XmStack);

/************************************************************
 *
 * Queue Data structure.  
 *
 ************************************************************/

typedef struct __XmQElem {
    struct __XmQElem *next, *prev;	/* doubly linked list. */
    XtPointer data;		/* The data associated with this element. */
    Boolean alloced;
} _XmQElem;

typedef struct _XmQueueRec {
    _XmQElem *first, *last;	/* the first and last elements. */
    _XmQElem *free_elems;		/* Unused elements. */
} XmQueueRec, *XmQueue;

/************************************************************
 *
 *  Global function defs.
 *
 ************************************************************/

XmQueue _XmQueueInit(void);
void _XmQueueFree(XmQueue), _XmQueuePush(XmQueue, XtPointer);
XtPointer _XmQueuePop(XmQueue);
int _XmQueueCount(XmQueue);

/* 
 * Internal functions used only by other parts of the utils library.
 */

void _Xm_AddQueue(XmQueue, _XmQElem *, _XmQElem *);
_XmQElem * _Xm_RemQueue(_XmQElem **);
_XmQElem * _Xm_GetNewElement(XmQueue);

/************************************************************
 *
 * New types.
 *
 ************************************************************/

typedef _XmQElem XmListElem;
typedef XmQueueRec *XmList;
typedef Boolean (*XmListFunc)(XmListElem *, XtPointer);

/************************************************************
 *
 * Macros.
 *
 ************************************************************/

#define XmListElemNext(elem) (elem)->next
#define XmListElemPrev(elem) (elem)->prev
#define XmListElemData(elem) (elem)->data

#define XmListFirst(list) (list)->first
#define XmListLast(list) (list)->last

/************************************************************
 *
 *  Global function defs.
 *
 ************************************************************/

void _XmListFree(XmList), _XmListRemove(XmList, XmListElem *);

XmListElem * _XmListAddAfter(XmList, XmListElem *, XtPointer);
XmListElem * _XmListAddBefore(XmList, XmListElem *, XtPointer); 

XmList _XmListInit(void);

int _XmListCount(XmList);

XmListElem *_XmListExec(XmList, XmListElem *, XmListElem *, XmListFunc, XtPointer);

#ifdef __cplusplus
}	/* Closes scope of 'extern "C"' declaration */
#endif

#if defined(VMS) || defined (__VMS)
#include <X11/apienvrst.h>
#endif

/* #ifdef XmRENAME_WIDGETS */
/* #define USE_OLD_NAMES */
/* #endif */

#ifdef USE_OLD_NAMES

#define ListAddAfter	_XmListAddAfter
#define ListAddBefore	_XmListAddBefore
#define ListCount	_XmListCount
#define ListExec	_XmListExec
#define ListFree	_XmListFree
#define ListInit	_XmListInit
#define ListRemove	_XmListRemove
#define QueueCount	_XmQueueCount
#define QueueFree	_XmQueueFree
#define QueueInit	_XmQueueInit
#define QueuePop	_XmQueuePop
#define QueuePush	_XmQueuePush
#define StackFree	_XmStackFree
#define StackInit	_XmStackInit
#define StackPop	_XmStackPop
#define StackPush	_XmStackPush
#define _AddQueue	_Xm_AddQueue
#define _GetNewElement	_Xm_GetNewElement
#define _RemQueue	_Xm_RemQueue

#define Stack		XmStack
#define StackRec	XmStackRec
#define QElem		_XmQElem
#define QueueRec	XmQueueRec
#define Queue		XmQueue
#define ListElem	XmListElem
#define List		XmList
#define ListFunc	XmListFunc

#define ListElemNext	XmListElemNext
#define ListElemPrev	XmListElemPrev
#define ListElemData	XmListElemData
#define ListFirst	XmListFirst
#define ListLast	XmListLast

#endif /* USE_OLD_NAMES */

#endif /* _LIST_H */
