From ffffdcc08917438cb11c4207966c750551c94b11 Mon Sep 17 00:00:00 2001 From: "benjamin.franksen" <benjamin.franksen@helmholtz-berlin.de> Date: Thu, 31 Jul 2014 15:11:40 +0000 Subject: [PATCH] use enum prim_type_tag instead of char* in struct seqChan --- src/seq/seqPvt.h | 2 +- src/seq/seq_main.c | 87 +++++++++++++++----------------------------- src/seq/seq_qry.c | 2 +- src/seq/seq_snc.h | 3 +- src/snc/gen_tables.c | 2 +- 5 files changed, 35 insertions(+), 61 deletions(-) diff --git a/src/seq/seqPvt.h b/src/seq/seqPvt.h index 282a6817..2848bf60 100644 --- a/src/seq/seqPvt.h +++ b/src/seq/seqPvt.h @@ -105,7 +105,7 @@ struct channel struct pv_type { - const char *typeStr; + enum prim_type_tag tag; pvType putType; pvType getType; size_t size; diff --git a/src/seq/seq_main.c b/src/seq/seq_main.c index 63ee5e38..0f063f3b 100644 --- a/src/seq/seq_main.c +++ b/src/seq/seq_main.c @@ -17,7 +17,32 @@ in the file LICENSE that is included with this distribution. static boolean init_sprog(PROG *sp, seqProgram *seqProg); static boolean init_sscb(PROG *sp, SSCB *ss, seqSS *seqSS); static boolean init_chan(PROG *sp, CHAN *ch, seqChan *seqChan); -static PVTYPE *find_type(const char *userType); + +/* + * types for DB put/get, element size based on user variable type. + * pvTypeTIME_* types for gets/monitors return status, severity, and time stamp + * in addition to the value. + */ +static PVTYPE pv_type_map[] = +{ + { P_CHAR, pvTypeCHAR, pvTypeTIME_CHAR, sizeof(char) }, + { P_UCHAR, pvTypeCHAR, pvTypeTIME_CHAR, sizeof(unsigned char) }, + { P_SHORT, pvTypeSHORT, pvTypeTIME_SHORT, sizeof(short) }, + { P_USHORT, pvTypeSHORT, pvTypeTIME_SHORT, sizeof(unsigned short) }, + { P_INT, pvTypeLONG, pvTypeTIME_LONG, sizeof(int) }, + { P_UINT, pvTypeLONG, pvTypeTIME_LONG, sizeof(unsigned int) }, + { P_LONG, pvTypeLONG, pvTypeTIME_LONG, sizeof(long) }, + { P_ULONG, pvTypeLONG, pvTypeTIME_LONG, sizeof(unsigned long) }, + { P_INT8T, pvTypeCHAR, pvTypeTIME_CHAR, sizeof(epicsInt8) }, + { P_UINT8T, pvTypeCHAR, pvTypeTIME_CHAR, sizeof(epicsUInt8) }, + { P_INT16T, pvTypeSHORT, pvTypeTIME_SHORT, sizeof(epicsInt16) }, + { P_UINT16T, pvTypeSHORT, pvTypeTIME_SHORT, sizeof(epicsUInt16) }, + { P_INT32T, pvTypeLONG, pvTypeTIME_LONG, sizeof(epicsInt32) }, + { P_UINT32T, pvTypeLONG, pvTypeTIME_LONG, sizeof(epicsUInt32) }, + { P_FLOAT, pvTypeFLOAT, pvTypeTIME_FLOAT, sizeof(float) }, + { P_DOUBLE, pvTypeDOUBLE, pvTypeTIME_DOUBLE, sizeof(double) }, + { P_STRING, pvTypeSTRING, pvTypeTIME_STRING, sizeof(string) }, +}; /* * seq: Run a state program. @@ -354,20 +379,15 @@ static boolean init_chan(PROG *sp, CHAN *ch, seqChan *seqChan) ch->eventNum = seqChan->eventNum; /* Fill in request type info */ - ch->type = find_type(seqChan->varType); - if (!ch->type->size) - { - errlogSevPrintf(errlogFatal, "init_chan: unknown type %s for assigned variable: %s\n", - seqChan->varType, seqChan->varName); - return FALSE; - } + ch->type = pv_type_map + seqChan->varType; + assert(seqChan->varType == ch->type->tag); DEBUG(" varname=%s, count=%u\n" " syncedTo=%u, monitored=%u, eventNum=%u\n", ch->varName, ch->count, ch->syncedTo, ch->monitored, ch->eventNum); - DEBUG(" type=%p: typeStr=%s, putType=%d, getType=%d, size=%d\n", - ch->type, ch->type->typeStr, + DEBUG(" type=%p: tag=%s, putType=%d, getType=%d, size=%d\n", + ch->type, prim_type_tag_name[ch->type->tag], ch->type->putType, ch->type->getType, ch->type->size); if (seqChan->chName) /* skip anonymous PVs */ @@ -443,53 +463,6 @@ static boolean init_chan(PROG *sp, CHAN *ch, seqChan *seqChan) return TRUE; } -/* - * find_type() -- returns types for DB put/get, element size based on user variable type. - * Mapping is determined by the following pv_type_map[] array. - * pvTypeTIME_* types for gets/monitors return status, severity, and time stamp - * in addition to the value. - */ -static PVTYPE pv_type_map[] = -{ - { "char", pvTypeCHAR, pvTypeTIME_CHAR, sizeof(char) }, - { "short", pvTypeSHORT, pvTypeTIME_SHORT, sizeof(short) }, - { "int", pvTypeLONG, pvTypeTIME_LONG, sizeof(int) }, - { "long", pvTypeLONG, pvTypeTIME_LONG, sizeof(long) }, - { "unsigned char", pvTypeCHAR, pvTypeTIME_CHAR, sizeof(unsigned char) }, - { "unsigned short", pvTypeSHORT, pvTypeTIME_SHORT, sizeof(unsigned short) }, - { "unsigned int", pvTypeLONG, pvTypeTIME_LONG, sizeof(unsigned int) }, - { "unsigned long", pvTypeLONG, pvTypeTIME_LONG, sizeof(unsigned long) }, - { "float", pvTypeFLOAT, pvTypeTIME_FLOAT, sizeof(float) }, - { "double", pvTypeDOUBLE, pvTypeTIME_DOUBLE, sizeof(double) }, - { "string", pvTypeSTRING, pvTypeTIME_STRING, sizeof(string) }, - - { "epicsInt8", pvTypeCHAR, pvTypeTIME_CHAR, sizeof(epicsInt8) }, - { "epicsUInt8", pvTypeCHAR, pvTypeTIME_CHAR, sizeof(epicsUInt8) }, - { "epicsInt16", pvTypeSHORT, pvTypeTIME_SHORT, sizeof(epicsInt16) }, - { "epicsUInt16", pvTypeSHORT, pvTypeTIME_SHORT, sizeof(epicsUInt16) }, - { "epicsInt32", pvTypeLONG, pvTypeTIME_LONG, sizeof(epicsInt32) }, - { "epicsUInt32", pvTypeLONG, pvTypeTIME_LONG, sizeof(epicsUInt32) }, - - { NULL, pvTypeERROR, pvTypeERROR, 0 } -}; - -static PVTYPE *find_type(const char *userType) -{ - PVTYPE *pt; - - /* TODO: select pvType according to sizeof int/long/etc */ - assert(sizeof(char)==1); - assert(sizeof(unsigned char)==1); - assert(sizeof(short)==2); - assert(sizeof(unsigned short)==2); - assert(sizeof(int)==4); - assert(sizeof(unsigned int)==4); - for (pt = pv_type_map; pt->typeStr; pt++) - if (strcmp(userType, pt->typeStr) == 0) - break; - return pt; -} - /* Free all allocated memory in a program structure */ void seq_free(PROG *sp) { diff --git a/src/seq/seq_qry.c b/src/seq/seq_qry.c index 0f7d0cb6..c162dc13 100644 --- a/src/seq/seq_qry.c +++ b/src/seq/seq_qry.c @@ -170,7 +170,7 @@ epicsShareFunc void seqChanShow(epicsThreadId tid, const char *str) } printf("\n#%d of %d:\n", nch, sp->numChans); printf(" Variable name: \"%s\"\n", ch->varName); - printf(" type = %s\n", ch->type->typeStr); + printf(" type = %s\n", prim_type_name[ch->type->tag]); printf(" count = %u\n", ch->count); printf(" Value ="); printValue(printf, valPtr(ch,ss), ch->count, ch->type->putType); diff --git a/src/seq/seq_snc.h b/src/seq/seq_snc.h index 94e1b663..0e6987c7 100644 --- a/src/seq/seq_snc.h +++ b/src/seq/seq_snc.h @@ -28,6 +28,7 @@ in the file LICENSE that is included with this distribution. #define INCLseqsnch #include "seqCom.h" +#include "seq_prim_types.h" typedef epicsUInt32 seqMask; /* for event masks and options */ @@ -81,7 +82,7 @@ struct seqChan const char *chName; /* assigned channel name */ size_t offset; /* offset to value */ const char *varName; /* variable name, including subscripts*/ - const char *varType; /* variable type, e.g. "int" */ + enum prim_type_tag varType; /* variable (base) type */ unsigned count; /* element count for arrays */ unsigned eventNum; /* event number for this channel */ EV_ID efId; /* event flag id if synced */ diff --git a/src/snc/gen_tables.c b/src/snc/gen_tables.c index b5f39d57..3d0fc8a9 100644 --- a/src/snc/gen_tables.c +++ b/src/snc/gen_tables.c @@ -161,7 +161,7 @@ static void gen_channel(Chan *cp, uint num_event_flags, int opt_reent) gen_code("\"%s%s\", ", vp->name, elem_str); /* variable type */ assert(base_type(vp->type)->tag == T_PRIM); - gen_code("\"%s\", ", prim_type_name[base_type(vp->type)->val.prim]); + gen_code("%s, ", prim_type_tag_name[base_type(vp->type)->val.prim]); /* count, for requests */ gen_code("%d, ", cp->count); /* event number */ -- GitLab