/*
 * tclgeomap.h --
 *
 *	This header file describes the externally visible facilities of
 *	the tclgeomap extension to Tcl.  See the tclgeomap (n) man page for
 *	information on the commands this package adds to Tcl.
 * 
 * Copyright (c) 2004 Gordon D. Carrie.  All rights reserved.
 * 
 * Licensed under the Open Software License version 2.1
 * 
 * Please address questions and feedback to user0@tkgeomap.org
 *
 * @(#) $Id: tclgeomap.h,v 1.31 2007/06/29 15:59:53 tkgeomap Exp $
 *
 ********************************************
 *
 */

#ifndef _TCLGEOMAP
#define _TCLGEOMAP

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <assert.h>
#include <limits.h>
#include <float.h>
#ifdef __WIN32__
#include <rpc.h>
#include <xdr.h>
#else
#include <rpc/rpc.h>
#endif

#include <tcl.h>

#include "geography.h"
#include "geoProj.h"
#include "geoLines.h"
#include "mapLines.h"

#define TCLGEOMAP_MAJOR_VERSION 2
#define TCLGEOMAP_MINOR_VERSION 11
#define TCLGEOMAP_PATCH_LEVEL 4
#define TCLGEOMAP_VERSION "2.11.4"

/*
 * The following declarations export generic geography functions in Tcl.
 */

EXTERN Tcl_Obj *	Tclgeomap_NewGeoPtObj _ANSI_ARGS_((GeoPt geoPt));
EXTERN void		Tclgeomap_SetGeoPtObj _ANSI_ARGS_((Tcl_Obj *ptr,
				GeoPt geoPt));
EXTERN int		Tclgeomap_GetGeoPtFromObj _ANSI_ARGS_((
				Tcl_Interp *interp, Tcl_Obj *objPtr,
				GeoPt *geoPtPtr));
EXTERN Tcl_Obj *	Tclgeomap_NewMapPtObj _ANSI_ARGS_((MapPt mapPt));
EXTERN void		Tclgeomap_SetMapPtObj _ANSI_ARGS_((Tcl_Obj *ptr,
				MapPt mapPt));
EXTERN int		Tclgeomap_GetMapPtFromObj _ANSI_ARGS_((
				Tcl_Interp *interp, Tcl_Obj *objPtr,
				MapPt *mapPtPtr));
EXTERN Tcl_Obj *	Tclgeomap_NewGeoTimeObj _ANSI_ARGS_((
				struct GeoTime_Jul jul));
EXTERN void		Tclgeomap_SetGeoTimeObj _ANSI_ARGS_((Tcl_Obj *ptr,
				struct GeoTime_Jul jul));
EXTERN int		Tclgeomap_GetGeoTimeFromObj _ANSI_ARGS_((
				Tcl_Interp *interp, Tcl_Obj *objPtr,
				struct GeoTime_Jul *julPtr));

/*
 * The following structure manages geographic projections in Tcl.  It is
 * derived from the GeoProj structure declared in geoProj.h, so functions
 * that take pointers to GeoProj structures can also accept pointers to
 * Tclgeomap_Proj structures.
 */

struct Tclgeomap_Proj {
    struct GeoProj proj;	/* Geographic projection */
    Tcl_Interp *interp;		/* Interpreter in which the command
				 * corresponding to the projection resides */
    Tcl_Command cmd;		/* Tcl command for the projection */
    Tcl_HashTable updateTasks;	/* Procedures to call when the projection
				 * changes.  ONE_WORD_KEYS are clientData's.
				 * Values are procedures of form
				 * void (*updateProc)(ClientData clientData).
				 * The update procedures are called with their
				 * clientData values as arguments when the
				 * projection changes. */
    Tcl_HashTable deleteTasks;	/* Procedures to call when the projection is
				 * deleted.  Entries are added with calls to
				 * Tclgeomap_AddProjDeleteTask.  ONE_WORD_KEYS
				 * are clientData's.  Values are
				 * Tclgeomap_ProjDeleteProcs. */
};
typedef struct Tclgeomap_Proj *Tclgeomap_Proj;

typedef void (Tclgeomap_ProjUpdateProc)(ClientData clientData);
typedef void (Tclgeomap_ProjDeleteProc)(ClientData clientData);

EXTERN Tclgeomap_Proj	Tclgeomap_GetProj _ANSI_ARGS_((Tcl_Interp *interp,
				char *name));
EXTERN CONST char *	Tclgeomap_ProjName _ANSI_ARGS_((Tclgeomap_Proj proj));
EXTERN void		Tclgeomap_AddProjUpdateTask _ANSI_ARGS_((
				Tclgeomap_Proj proj,
				Tclgeomap_ProjUpdateProc updateProc,
				ClientData clientData));
EXTERN void		Tclgeomap_CnxProjUpdateTask _ANSI_ARGS_((Tclgeomap_Proj,
				ClientData clientData));
EXTERN void		Tclgeomap_AddProjDeleteTask _ANSI_ARGS_((
				Tclgeomap_Proj, Tclgeomap_ProjDeleteProc,
				ClientData));
EXTERN void		Tclgeomap_CnxProjDeleteTask _ANSI_ARGS_((
				Tclgeomap_Proj, ClientData));

/*
 * This structures stores a GeoLnArr structure with information needed to
 * manage a GeoLnArr struct  in Tcl.  Pointers to Tclgeomap_LnArr structures
 * can be used as parameters in the procedures declared in this file, and also
 * in * procedures declared in geoLines.h that take pointers to GeoLnArr
 * structures.  Clients should not access members directly.  The structure
 * declaration is visible for to enable inheritance and to ease debugging.
 */

struct Tclgeomap_LnArr {
    struct GeoLnArr geoLnArr;	/* The geolinearray.  See geoLines.h
				 * for contents */
    Tcl_Interp *interp;		/* Interpreter in which the command
				 * corresponding to the geolinearray resides */
    Tcl_Command cmd;		/* Tcl command for the array */
    Tcl_HashTable mapLnArrs;	/* This table stores mapline arrays derived
				 * from geoLnArr. Keys are projections.
				 * Values are MapLnArr's obtained from the
				 * geolinearray with the projection. */
    Tcl_HashTable deleteTasks;	/* Table of deletion procs to call when the
				 * tclgeolinearray is deleted.  Entries to this
				 * table are added with calls to
				 * Tclgeomap_AddLnArrDeleteTask.
				 * ONE_WORD_KEYS are clientData's and values
				 * are Tclgeomap_LnArrDeleteProc's given as
				 * arguments Tclgeomap_AddLnArrDeleteTask.
				 */
};
typedef struct Tclgeomap_LnArr *Tclgeomap_LnArr;

/*
 * Procedure type:
 */

typedef void (Tclgeomap_LnArrDeleteProc)(ClientData clientData);

/*
 * Procedure declarations:
 */

EXTERN Tclgeomap_LnArr	Tclgeomap_AddLnArr _ANSI_ARGS_((Tcl_Interp *, char *,
			    GeoLnArr));
EXTERN void		Tclgeomap_AddLnArrDeleteTask _ANSI_ARGS_((
			    Tclgeomap_LnArr, Tclgeomap_LnArrDeleteProc,
			    ClientData));
EXTERN void		Tclgeomap_CnxLnArrDeleteTask _ANSI_ARGS_((
			    Tclgeomap_LnArr, ClientData));
EXTERN Tclgeomap_LnArr	Tclgeomap_GetLnArr _ANSI_ARGS_((Tcl_Interp *, char *));
EXTERN CONST char *	Tclgeomap_LnArrName _ANSI_ARGS_((Tclgeomap_LnArr));
EXTERN MapLnArr 	Tclgeomap_LnArrToMap _ANSI_ARGS_((Tclgeomap_LnArr,
			    Tclgeomap_Proj));

/*
 * This structure stores information about a named place.  Client
 * applications should not make direct references to fields in this
 * structure.  It is made visible to help with debugging.
 */

struct Tclgeomap_Place
{
    GeoPt geoPt;		/* Latitude and longitude of a place */
    Tcl_Interp *interp;		/* Interpreter in which the command resides */
    Tcl_Command cmd;		/* Tcl command for the place */
    Tcl_HashTable updateTasks;	/* Procedures to call when the place moves.
				 * Entries are added with calls to
				 * Tclgeomap_AddPlaceUpdateTask.  ONE_WORD_KEYS
				 * are clientData's.  Values are
				 * Tclgeomap_PlaceUpdateProc's. */
    Tcl_HashTable deleteTasks;	/* Procedures to call when the place is deleted.
				 * Entries are added with calls to
				 * Tclgeomap_AddPlaceDeleteTask.  ONE_WORD_KEYS
				 * are clientData's.  Values are
				 * Tclgeomap_PlaceDeleteProc's. */
};
typedef struct Tclgeomap_Place *Tclgeomap_Place;

/*
 * Procedure types:
 */

typedef void (Tclgeomap_PlaceUpdateProc)	_ANSI_ARGS_((ClientData));
typedef void (Tclgeomap_PlaceDeleteProc)	_ANSI_ARGS_((ClientData));

/*
 * Global functions:
 */

EXTERN void		Tclgeomap_AddPlaceUpdateTask _ANSI_ARGS_((
				Tclgeomap_Place, Tclgeomap_PlaceUpdateProc,
				ClientData));
EXTERN void		Tclgeomap_CnxPlaceUpdateTask _ANSI_ARGS_((
				Tclgeomap_Place, ClientData));
EXTERN void		Tclgeomap_AddPlaceDeleteTask _ANSI_ARGS_((
				Tclgeomap_Place, Tclgeomap_PlaceDeleteProc,
				ClientData));
EXTERN void		Tclgeomap_CnxPlaceDeleteTask _ANSI_ARGS_((
				Tclgeomap_Place, ClientData));
EXTERN Tclgeomap_Place	Tclgeomap_GetPlace _ANSI_ARGS_((Tcl_Interp *,
				CONST char *));
EXTERN GeoPt		Tclgeomap_PlaceLoc _ANSI_ARGS_((Tclgeomap_Place));
EXTERN CONST char *	Tclgeomap_PlaceName _ANSI_ARGS_((Tclgeomap_Place));

/*
 * The following declaration exports the Tclgeomap interface.
 */

EXTERN int	Tclgeomap_Init _ANSI_ARGS_((Tcl_Interp *));
EXTERN Tcl_Obj *Tclgeomap_JulDayToList _ANSI_ARGS_((struct GeoTime_Jul jul));
EXTERN void	Tclgeomap_AppendTime _ANSI_ARGS_((Tcl_Obj *list,
	    struct GeoTime_Jul jul));

#endif


syntax highlighted by Code2HTML, v. 0.9.1