Add code for arrays of strings

This commit is contained in:
Andrew Johnson
2016-08-30 23:03:08 -05:00
parent 5ec0633282
commit d0dcd61b23

View File

@@ -199,12 +199,12 @@ static jlif_result lnkConst_string(jlink *pjlink, const char *val, size_t len) {
IFDEBUG(10)
printf("lnkConst_string(const@%p, \"%.*s\")\n", clink, (int) len, val);
if (len > MAX_STRING_SIZE)
len = MAX_STRING_SIZE;
if (clink->type == s0) {
char *buf = malloc(len + 1);
switch (clink->type) {
char *buf, **vec;
int nElems;
case s0:
buf = malloc(len + 1);
if (!buf)
return jlif_stop;
@@ -214,13 +214,43 @@ static jlif_result lnkConst_string(jlink *pjlink, const char *val, size_t len) {
clink->nElems = 1;
clink->type = sc40;
clink->value.scalar_string = buf;
return jlif_continue;
}
/* FIXME Implement a0 and ac40 */
/* FIXME How to handle ai32 and af64? */
errlogPrintf("lnkConst: Mixed data types in array\n");
break;
return jlif_stop;
case a0:
clink->type = ac40;
/* fall thorough */
case ac40:
if (len > MAX_STRING_SIZE)
len = MAX_STRING_SIZE;
buf = malloc(len + 1);
if (!buf)
return jlif_stop;
strncpy(buf, val, len);
buf[len] = '\0';
nElems = clink->nElems + 1;
vec = realloc(clink->value.pmem, nElems * sizeof(char *));
if (!vec) {
free(buf);
break;
}
vec[clink->nElems++] = buf;
clink->value.pstrings = vec;
break;
case af64:
case ai32:
errlogPrintf("lnkConst: Mixed data types in array\n");
/* fall thorough */
default:
return jlif_stop;
}
return jlif_continue;
}
static jlif_result lnkConst_start_array(jlink *pjlink) {
@@ -298,6 +328,11 @@ static long lnkConst_loadScalar(struct link *plink, short dbrType, void *pbuffer
(clink->value.pdoubles, pbuffer, NULL);
break;
case ac40:
status = dbFastPutConvertRoutine[DBF_STRING][dbrType]
(clink->value.pstrings[0], pbuffer, NULL);
break;
default:
status = S_db_badField;
break;
@@ -359,6 +394,15 @@ static long lnkConst_loadArray(struct link *plink, short dbrType, void *pbuffer,
status = 0;
break;
case ac40:
conv = dbFastPutConvertRoutine[DBF_STRING][dbrType];
for (i = 0; i < nElems; i++) {
conv(clink->value.pstrings[i], pdest, NULL);
pdest += dbrSize;
}
status = 0;
break;
default:
status = S_db_badField;
}