|
61 | 61 | # define dbLinkIsVolatile(lnk) ((lnk)->type == CA_LINK) |
62 | 62 | #endif |
63 | 63 |
|
| 64 | +enum TableOutput |
| 65 | +{ |
| 66 | + Integers, |
| 67 | + Characters, |
| 68 | + Numbers |
| 69 | +}; |
| 70 | + |
64 | 71 | /* Lua variable names for numeric and string fields */ |
65 | 72 | static const char NUM_NAMES[NUM_ARGS][2] = {"A","B","C","D","E","F","G","H","I","J"}; |
66 | 73 | 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) |
132 | 139 |
|
133 | 140 | errlogPrintf("Calling %s resulted in error: %s\n", record->call, err.c_str()); |
134 | 141 |
|
135 | | - memcpy(record->err, err.c_str(), len(record->err)); |
| 142 | + strcpy(record->err, err.c_str()); |
136 | 143 | db_post_events(record, &record->err, DBE_VALUE); |
137 | 144 | } |
138 | 145 |
|
@@ -314,19 +321,25 @@ static long loadNumbers(luascriptRecord* record) |
314 | 321 | * the stack. |
315 | 322 | */ |
316 | 323 | 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) |
318 | 325 | { |
319 | 326 | T *data = new T[*elements]; |
320 | 327 | int status = dbGetLink(field, field_type, data, 0, elements); |
321 | 328 |
|
322 | 329 | if (status) { return status; } |
323 | 330 |
|
324 | 331 | lua_createtable(state, *elements, 0); |
325 | | - |
| 332 | + |
326 | 333 | for (int elem = 0; elem < *elements; elem += 1) |
327 | 334 | { |
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]); } |
330 | 343 |
|
331 | 344 | lua_rawseti(state, -2, elem + 1); |
332 | 345 | } |
@@ -472,35 +485,35 @@ static long loadStrings(luascriptRecord* record) |
472 | 485 | } |
473 | 486 |
|
474 | 487 | case DBF_CHAR: |
475 | | - status = createTable<epicsInt8>(state, field, field_type, &elements, true); |
| 488 | + status = createTable<epicsInt8>(state, field, field_type, &elements, Characters); |
476 | 489 | break; |
477 | 490 |
|
478 | 491 | case DBF_UCHAR: |
479 | | - status = createTable<epicsUInt8>(state, field, field_type, &elements, true); |
| 492 | + status = createTable<epicsUInt8>(state, field, field_type, &elements, Integers); |
480 | 493 | break; |
481 | 494 |
|
482 | 495 | case DBF_SHORT: |
483 | | - status = createTable<epicsInt16>(state, field, field_type, &elements, true); |
| 496 | + status = createTable<epicsInt16>(state, field, field_type, &elements, Integers); |
484 | 497 | break; |
485 | 498 |
|
486 | 499 | case DBF_USHORT: |
487 | | - status = createTable<epicsUInt16>(state, field, field_type, &elements, true); |
| 500 | + status = createTable<epicsUInt16>(state, field, field_type, &elements, Integers); |
488 | 501 | break; |
489 | 502 |
|
490 | 503 | case DBF_LONG: |
491 | | - status = createTable<epicsInt32>(state, field, field_type, &elements, true); |
| 504 | + status = createTable<epicsInt32>(state, field, field_type, &elements, Integers); |
492 | 505 | break; |
493 | 506 |
|
494 | 507 | case DBF_ULONG: |
495 | | - status = createTable<epicsUInt32>(state, field, field_type, &elements, true); |
| 508 | + status = createTable<epicsUInt32>(state, field, field_type, &elements, Integers); |
496 | 509 | break; |
497 | 510 |
|
498 | 511 | case DBF_FLOAT: |
499 | | - status = createTable<epicsFloat32>(state, field, field_type, &elements, false); |
| 512 | + status = createTable<epicsFloat32>(state, field, field_type, &elements, Numbers); |
500 | 513 | break; |
501 | 514 |
|
502 | 515 | case DBF_DOUBLE: |
503 | | - status = createTable<epicsFloat64>(state, field, field_type, &elements, false); |
| 516 | + status = createTable<epicsFloat64>(state, field, field_type, &elements, Numbers); |
504 | 517 | break; |
505 | 518 |
|
506 | 519 | default: |
|
0 commit comments