Skip to content

Commit 17475b5

Browse files
committed
pass as table of chars instead of bytes
1 parent 54b3fe0 commit 17475b5

1 file changed

Lines changed: 26 additions & 13 deletions

File tree

luaApp/src/rec/luascriptRecord.cpp

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@
6161
# define dbLinkIsVolatile(lnk) ((lnk)->type == CA_LINK)
6262
#endif
6363

64+
enum TableOutput
65+
{
66+
Integers,
67+
Characters,
68+
Numbers
69+
};
70+
6471
/* Lua variable names for numeric and string fields */
6572
static const char NUM_NAMES[NUM_ARGS][2] = {"A","B","C","D","E","F","G","H","I","J"};
6673
static const char STR_NAMES[STR_ARGS][3] = {"AA","BB","CC","DD","EE","FF","GG","HH","II","JJ"};
@@ -132,7 +139,7 @@ static void logError(luascriptRecord* record)
132139

133140
errlogPrintf("Calling %s resulted in error: %s\n", record->call, err.c_str());
134141

135-
memcpy(record->err, err.c_str(), len(record->err));
142+
strcpy(record->err, err.c_str());
136143
db_post_events(record, &record->err, DBE_VALUE);
137144
}
138145

@@ -314,19 +321,25 @@ static long loadNumbers(luascriptRecord* record)
314321
* the stack.
315322
*/
316323
template <typename T>
317-
static int createTable(lua_State* state, DBLINK* field, short field_type, long* elements, bool integers)
324+
static int createTable(lua_State* state, DBLINK* field, short field_type, long* elements, TableOutput output_type)
318325
{
319326
T *data = new T[*elements];
320327
int status = dbGetLink(field, field_type, data, 0, elements);
321328

322329
if (status) { return status; }
323330

324331
lua_createtable(state, *elements, 0);
325-
332+
326333
for (int elem = 0; elem < *elements; elem += 1)
327334
{
328-
if (integers) { lua_pushinteger(state, data[elem]); }
329-
else { lua_pushnumber(state, data[elem]); }
335+
if (output_type == Integers) { lua_pushinteger(state, data[elem]); }
336+
else if (output_type == Characters)
337+
{
338+
char char_out[2] = { '\0' };
339+
char_out[0] = data[elem];
340+
lua_pushstring(state, char_out);
341+
}
342+
else { lua_pushnumber(state, data[elem]); }
330343

331344
lua_rawseti(state, -2, elem + 1);
332345
}
@@ -472,35 +485,35 @@ static long loadStrings(luascriptRecord* record)
472485
}
473486

474487
case DBF_CHAR:
475-
status = createTable<epicsInt8>(state, field, field_type, &elements, true);
488+
status = createTable<epicsInt8>(state, field, field_type, &elements, Characters);
476489
break;
477490

478491
case DBF_UCHAR:
479-
status = createTable<epicsUInt8>(state, field, field_type, &elements, true);
492+
status = createTable<epicsUInt8>(state, field, field_type, &elements, Integers);
480493
break;
481494

482495
case DBF_SHORT:
483-
status = createTable<epicsInt16>(state, field, field_type, &elements, true);
496+
status = createTable<epicsInt16>(state, field, field_type, &elements, Integers);
484497
break;
485498

486499
case DBF_USHORT:
487-
status = createTable<epicsUInt16>(state, field, field_type, &elements, true);
500+
status = createTable<epicsUInt16>(state, field, field_type, &elements, Integers);
488501
break;
489502

490503
case DBF_LONG:
491-
status = createTable<epicsInt32>(state, field, field_type, &elements, true);
504+
status = createTable<epicsInt32>(state, field, field_type, &elements, Integers);
492505
break;
493506

494507
case DBF_ULONG:
495-
status = createTable<epicsUInt32>(state, field, field_type, &elements, true);
508+
status = createTable<epicsUInt32>(state, field, field_type, &elements, Integers);
496509
break;
497510

498511
case DBF_FLOAT:
499-
status = createTable<epicsFloat32>(state, field, field_type, &elements, false);
512+
status = createTable<epicsFloat32>(state, field, field_type, &elements, Numbers);
500513
break;
501514

502515
case DBF_DOUBLE:
503-
status = createTable<epicsFloat64>(state, field, field_type, &elements, false);
516+
status = createTable<epicsFloat64>(state, field, field_type, &elements, Numbers);
504517
break;
505518

506519
default:

0 commit comments

Comments
 (0)