Files
cdev-1.7.2n/include/cdevTagTable.h
2022-12-13 12:44:04 +01:00

192 lines
6.1 KiB
C++

//------------------------------------------------------------------------------
// Copyright (c) 1995 Southeastern Universities Research Association,
// Continuous Electron Beam Accelerator Facility
//
// This software was developed under a United States Government license
// described in the NOTICE file included as part of this distribution.
//------------------------------------------------------------------------------
//
// description: cdevTagTable.h
// cdevTagTable class manages tags within the cdev system.
//
// Author: Danjin Wu & Walt Akers
//
// Revision History:
// cdevTagTable.h,v
// Revision 1.12 1997/08/01 19:06:30 akers
// Added addTag and tagExists feature to the library
//
// Revision 1.11 1996/10/25 20:10:02 chen
// add asciiDump
//
// Revision 1.10 1996/08/26 19:14:07 akers
// Adding cdevData.inserttag callback capabilities
//
// Revision 1.9 1996/07/17 13:57:56 chen
// using CDEVTAGTABLE to find tags
//
// Revision 1.8 1995/10/03 19:37:11 chen
// Change back to object instead of pointers
//
// Revision 1.7 1995/09/29 15:25:55 danjin
// declare hash entry as pointer
//
// Revision 1.6 1995/09/28 19:01:48 danjin
// change: declare a ptr to list -> declare a list
//
// Revision 1.5 1995/08/21 18:02:48 danjin
// empty message
//
// Revision 1.3 1995/08/21 16:40:23 danjin
// modify comment
//
// Revision 1.2 1995/08/21 16:38:10 danjin
// modified big partion of this file
//
// Revision 1.1 1995/08/21 15:47:24 danjin
// merge Slist and hash into one for cdev
//
//
//
#ifndef _CDEV_TAG_TABLE_H
#define _CDEV_TAG_TABLE_H
#include <stdlib.h>
#include <cdevSpec.h>
#include <cdevIntHash.h>
#include <cdevStrHash.h>
// *****************************************************************************
// * class cdevTagTableCallback :
// * This class is used by the caller to post a callback to be notified
// * when changes are posted to a cdevTagTable. The class also has
// * a next pointer to allow it to be placed in a linked list within the
// * cdevTagTable...
// *
// * Note: Since this is a abstract base class, the caller must create a
// * class based on this class that has the callback method defined...
// * Also the destructor here is defined as virtual to force the delete
// * mechanism to work its way up the class hierarchy to the top level
// * before calling the destructor...
// *****************************************************************************
class CDEV_CLASS_SPEC cdevTagTableCallback
{
friend class cdevTagTable;
private:
cdevTagTableCallback *next_;
public:
cdevTagTableCallback ( void ) : next_(NULL) {}
virtual ~cdevTagTableCallback (void) {}
virtual void callback (int newTag, char *newName) = 0;
};
struct cdevTagEle {
char *tagName;
int tagId;
};
typedef struct cdevTagEle cdevTagEle;
class CDEV_CLASS_SPEC cdevTagTable
{
public:
cdevTagTable ( void );
~cdevTagTable ( void )
{
freeMemory ();
#ifdef _CDEV_DEBUG
printf("Destroying a cdevTagTable object\n");
#endif
}
int tagC2I (char* ctag, int* tag);
int tagI2C (int tag, char* &ctag);
void insertTag (int tag, char* ctag);
int tagExists (char *ctag);
int tagExists (int tag);
int addTag (char *ctag);
// *************************************************
// * addTagCallback :
// * This method will add a cdevTagTableCallback
// * object to the list of classes that should be
// * notified each time a tag is added to the
// * cdevTagTable.
// *************************************************
void addTagCallback ( cdevTagTableCallback * cb );
// *************************************************
// * delTagCallback :
// * This method will remote a cdevTagTableCallback
// * object that was previously added to the list
// * of callback classes.
// *
// * Note: This method does not actually delete
// * the cdevTagTableCallback object, it
// * merely removes it from the list. It
// * is the responsibility of the owner to
// * delete the object when it is no longer
// * needed.
// *************************************************
void delTagCallback ( cdevTagTableCallback * cb );
// *************************************************
// * readTagTable :
// * This method allows the caller to obtain a list
// * of tag names and integers that are currently
// * stored in this tag table.
// *
// * Note: This method will allocate an array of
// * integers and an array of character
// * string pointers. The strings that
// * are stored in the string array will be
// * the actual strings from within the
// * tag table and should not be deleted...
// *
// * The data allocated becomes the property
// * of the caller and must be deleted when
// * it is no longer needed... the correct
// * syntax to delete these items is...
// *
// * delete tags;
// * delete ctags;
// *
// * This will delete the array, however,
// * it will leave the individual array
// * elements intact.
// *************************************************
int readTagTable ( int * &tags, char ** &ctags, int &ntags );
// *************************************************
// * asciiDump (FILE* fp = stdout);
// * dump information of tag table to a file with two columns
// * left column is tag value, right column is tag string
// *************************************************
void asciiDump (FILE* fp = stdout);
protected:
void freeMemory (void);
void initialize ( void );
// data area
cdevIntHash itagList_;
cdevStrHash stagList_;
cdevTagTableCallback * callbacks_;
int highestTag;
private:
// default tag name if there is no tag file
static char* defaultTags[];
static unsigned int numberDefTags;
static char* defaultTagTableLocation;
static char* tagTableEnv;
// parse tag table file, return 0: failure, return 1: success
// caller free all memory upon success
static int parseTagTable (char* file, char** &tags, int* &tagvalues,
unsigned int &numTags);
};
#endif /* _CDEV_TAG_TABLE_H */