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