/*   ncbimisc.h
* ===========================================================================
*
*                            PUBLIC DOMAIN NOTICE                          
*               National Center for Biotechnology Information
*                                                                          
*  This software/database is a "United States Government Work" under the
*  terms of the United States Copyright Act.  It was written as part of
*  the author's official duties as a United States Government employee and 
*  thus cannot be copyrighted.  This software/database is freely available 
*  to the public for use. The National Library of Medicine and the U.S.
*  Government have not placed any restriction on its use or reproduction.
*
*  Although all reasonable efforts have been taken to ensure the accuracy
*  and reliability of the software and data, the NLM and the U.S.
*  Government do not and cannot warrant the performance or results that
*  may be obtained by using this software or data. The NLM and the U.S.
*  Government disclaim all warranties, express or implied, including
*  warranties of performance, merchantability or fitness for any particular
*  purpose.
*
*  Please cite the author in any work or product based on this material.
*
* ===========================================================================
*
* File Name:  ncbimisc.h
*
* Author:  Gish, Kans, Ostell, Schuler
*
* Version Creation Date:   10/23/91
*
* $Revision: 2.3 $
*
* File Description: 
*   	prototypes of miscellaneous functions
*
* Modifications:
* --------------------------------------------------------------------------
* Date     Name        Description of modification
* -------  ----------  -----------------------------------------------------
* 04-15-93 Schuler     Changed _cdecl to LIBCALL
* 06-15-93 Schuler     SGML functions moved to ncbisgml.c
* 06-15-93 Schuler     Added macros for Gestalt functins.
*
* ==========================================================================
*/

#ifndef _NCBIMISC_
#define _NCBIMISC_

#ifdef __cplusplus
extern "C" {
#endif

/* Obtain length of ASCII representation of signed and unsigned long integers */
/* opts&1 ==> use commas before thousands, millions, etc. when |value| >=10000*/
/* opts&2 ==> use commas before thousands, millions, etc. when |value| >=1000 */
/* opts&4 ==> prepend + sign to any positive values */
int LIBCALL Nlm_Lwidth PROTO((long x, int opts));
int LIBCALL Nlm_Ulwidth PROTO((unsigned long x, int opts));

/* convert integers to ASCII in static storage */
/* Same 1,2,4 opts as Nlm_Lwidth and Nlm_Ulwidth */
char * LIBCALL Nlm_Ltostr PROTO((long x, int opts));
char * LIBCALL Nlm_Ultostr PROTO((unsigned long x, int opts));

/* Sorting */
void LIBCALL Nlm_HeapSort PROTO((VoidPtr base, size_t nel, size_t width, int (LIBCALL *cmp) (VoidPtr, VoidPtr) ));


/*****************************************************************************
*
*   DataVal = a universal data type
*   ValNode = a linked list of DataVal
*
*****************************************************************************/


typedef union dataval { 
	Nlm_VoidPtr ptrvalue;
	Nlm_Int4 intvalue;
	Nlm_FloatHi realvalue;
	Nlm_Boolean boolvalue;
}	DataVal, PNTR DataValPtr;

typedef struct valnode {     
	Nlm_Uint1 choice;            /* to pick a choice */
	DataVal data;            /* attached data */
	struct valnode PNTR next;   /* next in linked list */
} ValNode, PNTR ValNodePtr;

ValNodePtr LIBCALL ValNodeNew PROTO((ValNodePtr vnp));
ValNodePtr LIBCALL ValNodeFree PROTO((ValNodePtr vnp));
ValNodePtr LIBCALL ValNodeFreeData PROTO((ValNodePtr vnp));
ValNodePtr LIBCALL ValNodeLink PROTO((ValNodePtr vnp, ValNodePtr newnode));
ValNodePtr LIBCALL ValNodeExtract PROTO((ValNodePtr PNTR headptr, Nlm_Uint1 choice));


/* Warning: the following "Gestalt" mechanism is likely to be replaced by   */
/* another mechanism in the not-too-distant future.  Use of these functions */
/* is strongly discouraged outside of NCBI.     J. Epstein 5/26/93          */
#ifdef OBSOLETE
extern void Nlm_SetGestaltValue PROTO((Nlm_Int2 option, Nlm_Int4 value));
extern void Nlm_ClearGestaltValue PROTO((Nlm_Int2 option));
extern Nlm_Int4 Nlm_GetGestaltValue PROTO((Nlm_Int2 option));
#endif

/* The Application Property functions may be used instead of the Gestalt
	functions in order to eliminate the dependency on asnlib.
	The following macros are used for backward compatibility */

#define Nlm_SetGestaltValue(x,y)	SetAppProperty("gestalt_" #x,(void*)y)
#define Nlm_GetGestaltValue(x)		(long) GetAppProperty("gestalt_" #x)
#define Nlm_ClearGestaltValue(x)	RemoveAppProperty("gestalt_" #x)

    /****** Choice is a compact variant of ValNode **********/

typedef union _IntPnt_ {
    Int4 intvalue;
    Pointer ptrvalue;
} IntPnt;

typedef struct _Choice_ {
    Uint1 choice;
    IntPnt value;
} Choice, PNTR ChoicePtr;


#define Lwidth	Nlm_Lwidth
#define Ulwidth	Nlm_Ulwidth
#define Ltostr	Nlm_Ltostr
#define Ultostr	Nlm_Ultostr
#define HeapSort	Nlm_HeapSort


/* Error codes for the CTX_NCBIMISC context */


#ifdef __cplusplus
}
#endif

#endif /* !_NCBIMISC_ */
