diff --git a/src/seq/seqPvt.h b/src/seq/seqPvt.h index 282a68171189a8c1c24afb8072935fca8303287e..2848bf602480a707718e54f154d326e357036c52 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 63ee5e38fd03e92b6729330d3024a91df7d75e18..0f063f3b0cdd4c904f1483ebc0b370f956b6c8e0 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 0f7d0cb6fe7d5bd653d62b30051d0ee067677d55..c162dc130639233fe439f46c19780d5d2e9ac6a4 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 94e1b6639c6fd86284fe517049aee96a1ca99755..0e6987c72c2cee818a5952564b1aa479930896bc 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 b5f39d576268fba5d4a9cc7f0a44e19e92386e06..3d0fc8a9550bd1d79b5b28af05a0ab749dd621ff 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 */