Files
pcas/src/db/dbl.c
1994-07-15 16:44:23 +00:00

223 lines
5.7 KiB
C

/* dbl.c
* dbl is a simple unix tool dumps various record names in a database
*
* Original Author: Ben-chin Cha
* Date: 5-12-93
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, the Regents of the University of California,
* and the University of Chicago Board of Governors.
*
* This software was produced under U.S. Government contracts:
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
* and (W-31-109-ENG-38) at Argonne National Laboratory.
*
* Initial development by:
* The Controls and Automation Group (AT-8)
* Ground Test Accelerator
* Accelerator Technology Division
* Los Alamos National Laboratory
*
* Co-developed with
* The Controls and Computing Group
* Accelerator Systems Division
* Advanced Photon Source
* Argonne National Laboratory
*
* Modification Log:
* -----------------
* .01 mm-dd-yy xxx Comment
*/
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <limits.h>
#include <cvtFast.h>
#include <dbStaticLib.h>
#define MAX_TYPE 50
#define MAX_DEV_NUM 1000
#define MAX_DEV_NAME_SIZE 30
#define MAX_REC_NAME_SIZE 15
int DBL_OPTION;
int NUM_DEV_ITEMS,NUM_LIST_ITEMS;
char dbType[MAX_TYPE][MAX_REC_NAME_SIZE];
int rc_type[MAX_DEV_NUM];
char pvName[MAX_DEV_NUM][MAX_DEV_NAME_SIZE+1];
char dbl_option[MAX_REC_NAME_SIZE];
char dbl_search[MAX_DEV_NAME_SIZE];
int dbl_dbGetRecNames();
main(argc,argv)
int argc;
char **argv;
{
int i;
dbl_option[0] = '\0';
dbl_search[0] = '\0';
if (argc == 1) {
printf("USAGE: dbl <any.database> [option] [subString]\n\n");
return(0);
}
if (argc >= 3) strcpy(dbl_option,argv[2]);
if (argc == 4) strcpy(dbl_search,argv[3]);
if (strcmp(argv[1],"help") == 0 || strcmp(argv[1],"-help") == 0
|| strcmp(argv[1],"-h") == 0)
{
printf("\nUSAGE: dbl <any.database> [option] [subString]\n\n");
printf("dbl - An EPICS database list utility, can be used to dump \n");
printf(" the process variable names for the specified database\n\n");
printf("where option can be set as following\n\n");
printf(" 1 dumps device type and the process variable name in the database\n");
printf(" 2 dumps database process variable names which contains the \"subString\" \n");
printf(" ( where \"subString\" can be any alphabetic string )\n");
printf(" ai dumps database process variable names which are \"ai\" type \n");
printf(" -1 dumps the header file for currently supported record types\n");
exit(0);
}
NUM_LIST_ITEMS = read_database(argv[1]);
}
int read_database(filename)
char *filename;
{
DBBASE *pdbbase;
DBENTRY *pdbentry;
int i,ntype;
long status;
char fname[80];
char *str;
FILE *fp;
fp = fopen(filename,"r");
if (!fp) {
printf("ERROR: Database file '%s' not found\n\n",filename);
return(0);
}
/* load data base record name to pvName */
str = pvName[0];
bzero(str,1000*31);
pdbbase=dbAllocBase();
pdbentry=dbAllocEntry(pdbbase);
status=dbRead(pdbbase,fp);
if(status) errMessage(status,"dbRead");
fclose(fp);
if (strcmp(dbl_option,"-1") == 0)
ntype = dbl_dbGetRecTypes(pdbbase);
else {
if (strlen(dbl_option) > 1) DBL_OPTION = 2;
else if (strcmp(dbl_option,"1") == 0) DBL_OPTION = 1;
else if (strcmp(dbl_option,"2") == 0) DBL_OPTION = 3;
else DBL_OPTION = 0;
switch (DBL_OPTION) {
case 0: /* dump pv name only */
NUM_LIST_ITEMS = dbl_dbGetRecNames(pdbbase,NULL);
for (i=0;i<NUM_LIST_ITEMS;i++)
printf("%s\n",pvName[i]);
break;
case 1: /* dump type & pv name */
NUM_LIST_ITEMS = dbl_dbGetRecNames(pdbbase,NULL);
for (i=0;i<NUM_LIST_ITEMS;i++)
printf("%s\t\t %s\n",dbType[rc_type[i]],pvName[i]);
break;
case 2: /* dump pv name of matched type */
NUM_LIST_ITEMS = dbl_dbGetRecNames(pdbbase,dbl_option);
for (i=0;i<NUM_LIST_ITEMS;i++)
printf("%s\n",pvName[i]);
break;
case 3: /* dump pv name of matched string */
NUM_LIST_ITEMS = dbl_dbGetRecNames(pdbbase,NULL);
for (i=0;i<NUM_LIST_ITEMS;i++) {
if (strstr(pvName[i],dbl_search))
printf("%s\n",pvName[i]);
}
break;
}
}
dbFreeBase(pdbbase);
NUM_DEV_ITEMS = NUM_LIST_ITEMS;
return(NUM_DEV_ITEMS);
}
int dbl_dbGetRecNames(pdbbase,precdesname)
DBBASE *pdbbase;
char *precdesname;
{
DBENTRY dbentry;
DBENTRY *pdbentry=&dbentry;
long status;
int i=0,num=0;
dbInitEntry(pdbbase,pdbentry);
if(!precdesname)
status = dbFirstRecdes(pdbentry);
else
status = dbFindRecdes(pdbentry,precdesname);
if(status) {printf("No record description\n"); return(0);}
while(!status) {
strcpy(dbType[i], dbGetRecdesName(pdbentry));
status = dbFirstRecord(pdbentry);
while(!status) {
strcpy(pvName[num],dbGetRecordName(pdbentry));
rc_type[num] = i;
num++;
status = dbNextRecord(pdbentry);
}
if(precdesname) break;
i++;
status = dbNextRecdes(pdbentry);
}
dbFinishEntry(pdbentry);
return(num);
}
int dbl_dbGetRecTypes(pdbbase)
DBBASE *pdbbase;
{
DBENTRY dbentry;
DBENTRY *pdbentry=&dbentry;
long status;
int i=0,num=0;
dbInitEntry(pdbbase,pdbentry);
status = dbFirstRecdes(pdbentry);
if(status) {printf("No record description\n"); return(0);}
while(!status) {
strcpy(dbType[i], dbGetRecdesName(pdbentry));
i++;
status = dbNextRecdes(pdbentry);
}
dbFinishEntry(pdbentry);
num = i;
printf("int NUM_REC_TYPE = %d;\n",num);
printf("char *dbType[] = {\n");
for (i=0;i<num-1;i++) printf("\t\"%s\",\n",dbType[i]);
printf("\t\"%s\"\n",dbType[num-1]);
printf("\t};\n\n");
return(i);
}