From 4417db23fed6c6883ebab50825cec1e4666981c8 Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Mon, 13 Sep 1999 19:33:37 +0000 Subject: [PATCH] new for 3.14 --- src/include/registryDeviceSupport.h | 17 ++ src/include/registryDriverSupport.h | 18 +++ src/include/registryRecordType.h | 28 ++++ src/registry/Makefile | 30 ++++ src/registry/registerRecordDeviceDriver.c | 84 ++++++++++ src/registry/registerRecordDeviceDriver.pl | 176 +++++++++++++++++++++ src/registry/registry.c | 74 +++++++++ src/registry/registry.h | 21 +++ src/registry/registryDeviceSupport.c | 31 ++++ src/registry/registryDeviceSupport.h | 17 ++ src/registry/registryDriverSupport.c | 31 ++++ src/registry/registryDriverSupport.h | 18 +++ src/registry/registryRecordType.c | 30 ++++ src/registry/registryRecordType.h | 28 ++++ 14 files changed, 603 insertions(+) create mode 100644 src/include/registryDeviceSupport.h create mode 100644 src/include/registryDriverSupport.h create mode 100644 src/include/registryRecordType.h create mode 100644 src/registry/Makefile create mode 100644 src/registry/registerRecordDeviceDriver.c create mode 100755 src/registry/registerRecordDeviceDriver.pl create mode 100644 src/registry/registry.c create mode 100644 src/registry/registry.h create mode 100644 src/registry/registryDeviceSupport.c create mode 100644 src/registry/registryDeviceSupport.h create mode 100644 src/registry/registryDriverSupport.c create mode 100644 src/registry/registryDriverSupport.h create mode 100644 src/registry/registryRecordType.c create mode 100644 src/registry/registryRecordType.h diff --git a/src/include/registryDeviceSupport.h b/src/include/registryDeviceSupport.h new file mode 100644 index 000000000..6dbf29c4c --- /dev/null +++ b/src/include/registryDeviceSupport.h @@ -0,0 +1,17 @@ +#ifndef INCregistryDeviceSupporth +#define INCregistryDeviceSupporth + + +#ifdef __cplusplus +extern "C" { +#endif + +int registryDeviceSupportAdd(const char *name,struct dset *pdset); +struct dset *registryDeviceSupportFind(const char *name); + +#ifdef __cplusplus +} +#endif + + +#endif /* INCregistryDeviceSupporth */ diff --git a/src/include/registryDriverSupport.h b/src/include/registryDriverSupport.h new file mode 100644 index 000000000..e0efafd12 --- /dev/null +++ b/src/include/registryDriverSupport.h @@ -0,0 +1,18 @@ +#ifndef INCregistryDriverSupporth +#define INCregistryDriverSupporth + + +#ifdef __cplusplus +extern "C" { +#endif + +/* c interface definitions */ +int registryDriverSupportAdd(const char *name,struct drvet *pdrvet); +struct drvet *registryDriverSupportFind(const char *name); + +#ifdef __cplusplus +} +#endif + + +#endif /* INCregistryDriverSupporth */ diff --git a/src/include/registryRecordType.h b/src/include/registryRecordType.h new file mode 100644 index 000000000..27ec5b383 --- /dev/null +++ b/src/include/registryRecordType.h @@ -0,0 +1,28 @@ +#ifndef INCregistryRecordTypeh +#define INCregistryRecordTypeh + +#include "dbStaticLib.h" + +typedef int (*computeSizeOffset)(dbRecordType *pdbRecordType); + +typedef struct recordTypeLocation { + struct rset *prset; + computeSizeOffset sizeOffset; +}recordTypeLocation; + + +#ifdef __cplusplus +extern "C" { +#endif + +int registryRecordTypeAdd(const char *name,recordTypeLocation *prtl); +recordTypeLocation *registryRecordTypeFind(const char *name); + +/* The following function is generated by registerRecordDeviceDriver/pl */ +int registerRecordDeviceDriver(DBBASE *pdbbase); +#ifdef __cplusplus +} +#endif + + +#endif /* INCregistryRecordTypeh */ diff --git a/src/registry/Makefile b/src/registry/Makefile new file mode 100644 index 000000000..f5385f9b9 --- /dev/null +++ b/src/registry/Makefile @@ -0,0 +1,30 @@ +TOP=../.. +include $(TOP)/configure/CONFIG + +# includes to install from this sub-project +# + +INC += registry.h +INC += registryDeviceSupport.h +INC += registryDriverSupport.h +INC += registryRecordType.h + +# general contents of library on all platforms +# +# system specific lines in RULES.Host figure out +# 1) what object names (.o, .obj,...) to build +# 2) where to find the sources: ., ./os/, ./os/generic, ... +# + +SCRIPTS += registerRecordDeviceDriver.pl + +registryLibrary_SRCS += registry.c +registryLibrary_SRCS += registryRecordType.c +registryLibrary_SRCS += registryDeviceSupport.c +registryLibrary_SRCS += registryDriverSupport.c + +IOC_PROD_vxWorks = registerRecordDeviceDriver.o + +IOC_LIBRARY_vxWorks = registryLibrary + +include $(TOP)/configure/RULES_BUILD diff --git a/src/registry/registerRecordDeviceDriver.c b/src/registry/registerRecordDeviceDriver.c new file mode 100644 index 000000000..afe9b2dcb --- /dev/null +++ b/src/registry/registerRecordDeviceDriver.c @@ -0,0 +1,84 @@ +#include +#include +#include +#include +#include + +#include "recSup.h" +#include "devSup.h" +#include "drvSup.h" +#include "cantProceed.h" +#include "registry.h" +#include "registryRecordType.h" +#include "registryDeviceSupport.h" +#include "registryDriverSupport.h" + +int registerRecordDeviceDriver(DBBASE *pdbbase) +{ + dbRecordType *pdbRecordType; + recordTypeLocation *precordTypeLocation; + struct rset *prset; + computeSizeOffset sizeOffset; + char name[100]; + drvSup *pdrvSup; + + if(!pdbbase) { + printf("pdbbase not specified\n"); + return(0); + } + for(pdbRecordType = (dbRecordType *)ellFirst(&pdbbase->recordTypeList); + pdbRecordType; + pdbRecordType = (dbRecordType *)ellNext(&pdbRecordType->node)) { + if(registryRecordTypeFind(pdbRecordType->name)) continue; + strcpy(name,pdbRecordType->name); + strcat(name,"RSET"); + prset = 0; + prset = registryFind(0,name); + if(!prset) continue; + strcpy(name,pdbRecordType->name); + strcat(name,"RecordSizeOffset"); + sizeOffset = 0; + sizeOffset = (computeSizeOffset) registryFind(0,name); + if(!sizeOffset) continue; + precordTypeLocation = callocMustSucceed(1,sizeof(recordTypeLocation), + "registerRecordDeviceDriver"); + precordTypeLocation->prset = prset; + precordTypeLocation->sizeOffset = sizeOffset; + if(!registryRecordTypeAdd(pdbRecordType->name,precordTypeLocation)) { + errlogPrintf("registryRecordTypeAdd failed for %s\n", + pdbRecordType->name); + continue; + } + sizeOffset(pdbRecordType); + } + for(pdbRecordType = (dbRecordType *)ellFirst(&pdbbase->recordTypeList); + pdbRecordType; + pdbRecordType = (dbRecordType *)ellNext(&pdbRecordType->node)) { + devSup *pdevSup; + struct dset *pdset; + for(pdevSup = (devSup *)ellFirst(&pdbRecordType->devList); + pdevSup; + pdevSup = (devSup *)ellNext(&pdevSup->node)) { + if(registryDeviceSupportFind(pdevSup->name)) continue; + pdset = registryFind(0,pdevSup->name); + if(!pdset) continue; + if(!registryDeviceSupportAdd(pdevSup->name,pdset)) { + errlogPrintf("registryRecordTypeAdd failed for %s\n", + pdevSup->name); + } + } + } + for(pdrvSup = (drvSup *)ellFirst(&pdbbase->drvList); + pdrvSup; + pdrvSup = (drvSup *)ellNext(&pdrvSup->node)) { + struct drvet *pdrvet = 0; + if(registryDriverSupportFind(pdrvSup->name)) continue; + pdrvet = registryFind(0,pdrvSup->name); + if(!pdrvet) continue; + if(!registryDriverSupportAdd(pdrvSup->name,pdrvet)) { + errlogPrintf("registryRecordTypeAdd failed for %s\n", + pdrvSup->name); + } + } + return(0); +} diff --git a/src/registry/registerRecordDeviceDriver.pl b/src/registry/registerRecordDeviceDriver.pl new file mode 100755 index 000000000..9e17a0f0f --- /dev/null +++ b/src/registry/registerRecordDeviceDriver.pl @@ -0,0 +1,176 @@ +eval 'exec perl -S $0 ${1+"$@"}' # -*- Mode: perl -*- + if $running_under_some_shell; # registerRecordDeviceDriver + +$file = $ARGV[0]; +$numberRecordType = 0; +$numberDeviceSupport = 0; +$numberDriverSupport = 0; + +open(INP,"$file") or die "$! opening file"; +while() { + if( /recordtype/) { + /recordtype\s*\(\s*(\w+)/; + $recordType[$numberRecordType++] = $1; + } + if( /device/) { + /device\s*\(\s*(\s*\w+)\W+\w+\W+(\w+)/; + $deviceRecordType[$numberDeviceSupport] = $1; + $deviceSupport[$numberDeviceSupport] = $2; + $numberDeviceSupport++; + } + if( /driver/) { + /driver\s*\(\s*(\w+)/; + $driverSupport[$numberDriverSupport++] = $1; + } +} +close(INP) or die "$! closing file"; +# beginning of generated routine + +print << "END" ; +/*#registerRecordDeviceDriver.c */ +/* THIS IS A GENERATED FILE. DO NOT EDIT */ +#include +#include +#include +#include +#include + +#include "recSup.h" +#include "devSup.h" +#include "drvSup.h" +#include "registryRecordType.h" +#include "registryDeviceSupport.h" +#include "registryDriverSupport.h" + +END + +#definitions for recordtype +if($numberRecordType>0) { + for ($i=0; $i<$numberRecordType; $i++) { + print "extern struct rset $recordType[$i]RSET;\n"; + print "extern int $recordType[$i]RecordSizeOffset(dbRecordType *pdbRecordType);\n"; + #NOTE the followimng caused a compiler error on vxWorks + # print "extern computeSizeOffset $recordType[$i]RecordSizeOffset;\n"; + } + print "\nstatic char *recordTypeNames[$numberRecordType] = {\n"; + for ($i=0; $i<$numberRecordType; $i++) { + print " \"$recordType[$i]\""; + if($i < $numberRecordType-1) { print ",";} + print "\n"; + } + print "};\n\n"; + + print "static recordTypeLocation rtl[$i] = {\n"; + for ($i=0; $i<$numberRecordType; $i++) { + print " {&$recordType[$i]RSET, $recordType[$i]RecordSizeOffset}"; + if($i < $numberRecordType-1) { print ",";} + print "\n"; + } + print "};\n\n"; +} + +#definitions for device +if($numberDeviceSupport>0) { + for ($i=0; $i<$numberDeviceSupport; $i++) { + print "extern struct dset $deviceSupport[$i];\n"; + } + print "\nstatic char *deviceSupportNames[$numberDeviceSupport] = {\n"; + for ($i=0; $i<$numberDeviceSupport; $i++) { + print " \"$deviceSupport[$i]\""; + if($i < $numberDeviceSupport-1) { print ",";} + print "\n"; + } + print "};\n\n"; + + print "static struct dset *devsl[$i] = {\n"; + for ($i=0; $i<$numberDeviceSupport; $i++) { + print " &$deviceSupport[$i]"; + if($i < $numberDeviceSupport-1) { print ",";} + print "\n"; + } + print "};\n\n"; +} + +#definitions for driver +if($numberDriverSupport>0) { + for ($i=0; $i<$numberDriverSupport; $i++) { + print "extern struct drvet $driverSupport[$i];\n"; + } + print "\nstatic char *driverSupportNames[$numberDriverSupport] = {\n"; + for ($i=0; $i<$numberDriverSupport; $i++) { + print " \"$driverSupport[$i]\""; + if($i < $numberDriverSupport-1) { print ",";} + print "\n"; + } + print "};\n\n"; + + print "static struct drvet *drvsl[$i] = {\n"; + for ($i=0; $i<$numberDriverSupport; $i++) { + print " &$driverSupport[$i]"; + if($i < $numberDriverSupport-1) { print ",";} + print "\n"; + } + print "};\n\n"; +} + +#Now actual registration code. + +print << "END" ; +int registerRecordDeviceDriver(DBBASE *pdbbase) +{ + int i; + int result; + static int alreadyCalled = 0; + if(alreadyCalled) { + printf(\"registerRecordDeviceDriver called multiple times\\n\"); + return(-1); + } +END +if($numberRecordType>0) { + print << "END" ; + for(i=0; i< $numberRecordType; i++ ) { + result = registryRecordTypeAdd(recordTypeNames[i],&rtl[i]); + if(result) { + recordTypeLocation *precordTypeLocation; + int (*sizeOffset)(dbRecordType *pdbRecordType); + DBENTRY dbEntry; + + dbInitEntry(pdbbase,&dbEntry); + precordTypeLocation = registryRecordTypeFind(recordTypeNames[i]); + sizeOffset = precordTypeLocation->sizeOffset; + if(dbFindRecordType(&dbEntry,recordTypeNames[i])) { + printf(\"registerRecordDeviceDriver failed %s\\n\", + recordTypeNames[i]); + } else { + sizeOffset(dbEntry.precordType); + } + } else { + printf(\"registerRecordDeviceDriver failed %s\\n\",recordTypeNames[i]); + } + } +END +} +if($numberDeviceSupport>0) { + print << "END" ; + for(i=0; i< $numberDeviceSupport; i++ ) { + result = registryDeviceSupportAdd(deviceSupportNames[i],devsl[i]); + if(!result) + printf(\"registerRecordDeviceDriver failed %s\\n\", + \"deviceSupportNames[i]\"); + } +END +} +if($numberDriverSupport>0) { + print << "END" ; + for(i=0; i< $numberDriverSupport; i++ ) { + result = registryDriverSupportAdd(driverSupportNames[i],drvsl[i]); + if(!result) + printf(\"registerRecordDeviceDriver failed %s\\n\", + \"driverSupportNames[i]\"); + } +END +} +print << "END" ; + return(0); +} +END diff --git a/src/registry/registry.c b/src/registry/registry.c new file mode 100644 index 000000000..9ada011ec --- /dev/null +++ b/src/registry/registry.c @@ -0,0 +1,74 @@ +/*registry.c */ + +/* Author: Marty Kraimer Date: 08JUN99 */ + +/********************COPYRIGHT NOTIFICATION********************************** +This software was developed under a United States Government license +described on the COPYRIGHT_UniversityOfChicago file included as part +of this distribution. +****************************************************************************/ +#include +#include +#include +#include +#include + +#include "dbDefs.h" +#include "cantProceed.h" +#include "osiFindGlobalSymbol.h" +#include "gpHash.h" +#include "registry.h" + +static void *gphPvt = 0; + +static void registryInit(int tableSize) +{ + if(tableSize==0) tableSize = DEFAULT_TABLE_SIZE; + gphInitPvt(&gphPvt,tableSize); + if(!gphPvt) cantProceed("registry why did gphInitPvt fail\n"); +} + +int registrySetTableSize(int size) +{ + if(gphPvt) { + printf("registryInit already called\n"); + return(-1); + } + registryInit(size); + return(0); +} + + +int registryAdd(void *registryID,const char *name,void *data) +{ + GPHENTRY *pentry; + if(!gphPvt) registryInit(0); + pentry = gphAdd(gphPvt,name,registryID); + if(!pentry) return(FALSE); + pentry->userPvt = (void *)data; + return(TRUE); +} + +void *registryFind(void *registryID,const char *name) +{ + GPHENTRY *pentry; + if(name==0) return(0); + if(registryID==0) return(osiFindGlobalSymbol(name)); + if(!gphPvt) registryInit(0); + pentry = gphFind(gphPvt,(char *)name,registryID); + if(!pentry) return(0); + return(pentry->userPvt); +} + +void registryFree() +{ + if(!gphPvt) return; + gphFreeMem(gphPvt); +} + +int registryDump(void) +{ + if(!gphPvt) return(0); + gphDump(gphPvt); + return(0); +} diff --git a/src/registry/registry.h b/src/registry/registry.h new file mode 100644 index 000000000..fbd95dcf1 --- /dev/null +++ b/src/registry/registry.h @@ -0,0 +1,21 @@ +#ifndef INCregistryh +#define INCregistryh + +#ifdef __cplusplus +extern "C" { +#endif + +#define DEFAULT_TABLE_SIZE 1024 + +int registryAdd(void *registryID,const char *name,void *data); +void *registryFind(void *registryID,const char *name); + +int registrySetTableSize(int size); +void registryFree(); +int registryDump(void); + +#ifdef __cplusplus +} +#endif + +#endif /* INCregistryh */ diff --git a/src/registry/registryDeviceSupport.c b/src/registry/registryDeviceSupport.c new file mode 100644 index 000000000..3bab02cfb --- /dev/null +++ b/src/registry/registryDeviceSupport.c @@ -0,0 +1,31 @@ +/* registryDeviceSupport.c */ + +/* Author: Marty Kraimer Date: 08JUN99 */ + +/********************COPYRIGHT NOTIFICATION********************************** +This software was developed under a United States Government license +described on the COPYRIGHT_UniversityOfChicago file included as part +of this distribution. +****************************************************************************/ +#include +#include +#include + +#include "registry.h" +#include "dbBase.h" +#include "devSup.h" +#include "registryDeviceSupport.h" + +const char *deviceSupport = "device support"; +static void *registryID = &deviceSupport; + + +int registryDeviceSupportAdd(const char *name,struct dset *pdset) +{ + return(registryAdd(registryID,name,(void *)pdset)); +} + +struct dset *registryDeviceSupportFind(const char *name) +{ + return((struct dset *)registryFind(registryID,name)); +} diff --git a/src/registry/registryDeviceSupport.h b/src/registry/registryDeviceSupport.h new file mode 100644 index 000000000..6dbf29c4c --- /dev/null +++ b/src/registry/registryDeviceSupport.h @@ -0,0 +1,17 @@ +#ifndef INCregistryDeviceSupporth +#define INCregistryDeviceSupporth + + +#ifdef __cplusplus +extern "C" { +#endif + +int registryDeviceSupportAdd(const char *name,struct dset *pdset); +struct dset *registryDeviceSupportFind(const char *name); + +#ifdef __cplusplus +} +#endif + + +#endif /* INCregistryDeviceSupporth */ diff --git a/src/registry/registryDriverSupport.c b/src/registry/registryDriverSupport.c new file mode 100644 index 000000000..2a933c8fc --- /dev/null +++ b/src/registry/registryDriverSupport.c @@ -0,0 +1,31 @@ +/* registryDriverSupport.c */ + +/* Author: Marty Kraimer Date: 08JUN99 */ + +/********************COPYRIGHT NOTIFICATION********************************** +This software was developed under a United States Government license +described on the COPYRIGHT_UniversityOfChicago file included as part +of this distribution. +****************************************************************************/ +#include +#include +#include + +#include "registry.h" +#include "dbBase.h" +#include "drvSup.h" +#include "registryDriverSupport.h" + +const char *driverSupport = "driver support"; +static void *registryID = &driverSupport; + + +int registryDriverSupportAdd(const char *name,struct drvet *pdrvet) +{ + return(registryAdd(registryID,name,(void *)pdrvet)); +} + +struct drvet *registryDriverSupportFind(const char *name) +{ + return((struct drvet *)registryFind(registryID,name)); +} diff --git a/src/registry/registryDriverSupport.h b/src/registry/registryDriverSupport.h new file mode 100644 index 000000000..e0efafd12 --- /dev/null +++ b/src/registry/registryDriverSupport.h @@ -0,0 +1,18 @@ +#ifndef INCregistryDriverSupporth +#define INCregistryDriverSupporth + + +#ifdef __cplusplus +extern "C" { +#endif + +/* c interface definitions */ +int registryDriverSupportAdd(const char *name,struct drvet *pdrvet); +struct drvet *registryDriverSupportFind(const char *name); + +#ifdef __cplusplus +} +#endif + + +#endif /* INCregistryDriverSupporth */ diff --git a/src/registry/registryRecordType.c b/src/registry/registryRecordType.c new file mode 100644 index 000000000..343e5c697 --- /dev/null +++ b/src/registry/registryRecordType.c @@ -0,0 +1,30 @@ +/* registryRecordType.c */ + +/* Author: Marty Kraimer Date: 08JUN99 */ + +/********************COPYRIGHT NOTIFICATION********************************** +This software was developed under a United States Government license +described on the COPYRIGHT_UniversityOfChicago file included as part +of this distribution. +****************************************************************************/ +#include +#include +#include + +#include "registry.h" +#include "dbBase.h" +#include "registryRecordType.h" + +const char *recordType = "record type"; +static void *registryID = &recordType; + + +int registryRecordTypeAdd(const char *name,recordTypeLocation *prtl) +{ + return(registryAdd(registryID,name,(void *)prtl)); +} + +recordTypeLocation *registryRecordTypeFind(const char *name) +{ + return((recordTypeLocation *)registryFind(registryID,name)); +} diff --git a/src/registry/registryRecordType.h b/src/registry/registryRecordType.h new file mode 100644 index 000000000..27ec5b383 --- /dev/null +++ b/src/registry/registryRecordType.h @@ -0,0 +1,28 @@ +#ifndef INCregistryRecordTypeh +#define INCregistryRecordTypeh + +#include "dbStaticLib.h" + +typedef int (*computeSizeOffset)(dbRecordType *pdbRecordType); + +typedef struct recordTypeLocation { + struct rset *prset; + computeSizeOffset sizeOffset; +}recordTypeLocation; + + +#ifdef __cplusplus +extern "C" { +#endif + +int registryRecordTypeAdd(const char *name,recordTypeLocation *prtl); +recordTypeLocation *registryRecordTypeFind(const char *name); + +/* The following function is generated by registerRecordDeviceDriver/pl */ +int registerRecordDeviceDriver(DBBASE *pdbbase); +#ifdef __cplusplus +} +#endif + + +#endif /* INCregistryRecordTypeh */