From 12ab69402a5e606d00e2cb99b6a1b1559b7d2131 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 25 Feb 2021 13:19:41 -0600 Subject: [PATCH] Improve the message from a DBD field-count mismatch --- .../database/src/tools/dbdToRecordtypeH.pl | 62 ++++++++++++------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/modules/database/src/tools/dbdToRecordtypeH.pl b/modules/database/src/tools/dbdToRecordtypeH.pl index dad767124..76bae7fbf 100644 --- a/modules/database/src/tools/dbdToRecordtypeH.pl +++ b/modules/database/src/tools/dbdToRecordtypeH.pl @@ -111,31 +111,47 @@ if ($opt_D) { # Output dependencies only, to stdout sub oldtables { # Output compatible with R3.14.x + + my @fields = $rtyp->fields; + my $no_fields = scalar @fields; + + print OUTFILE << "__EOF__"; +#include +#include +#ifdef __cplusplus +extern "C" { +#endif +static int ${rn}RecordSizeOffset(dbRecordType *prt) +{ + ${rn}Record *prec = 0; + + if (prt->no_fields != ${no_fields}) { + cantProceed("IOC build or installation error:\\n" + " The ${rn}Record defined in the DBD file has %d fields,\\n" + " but the record support code was built with ${no_fields}.\\n", + prt->no_fields); + } +__EOF__ + print OUTFILE - "#include \n" . - "#include \n" . - "#ifdef __cplusplus\n" . - "extern \"C\" {\n" . - "#endif\n" . - "static int ${rn}RecordSizeOffset(dbRecordType *prt)\n" . - "{\n" . - " ${rn}Record *prec = 0;\n\n" . - " assert(prt->no_fields == " . scalar($rtyp->fields) . ");\n" . join("\n", map { - " prt->papFldDes[${rn}Record" . $_->name . "]->size = " . - "sizeof(prec->" . $_->C_name . ");" - } $rtyp->fields) . "\n" . - join("\n", map { - " prt->papFldDes[${rn}Record" . $_->name . "]->offset = (unsigned short)(" . - "(char *)&prec->" . $_->C_name . " - (char *)prec);" - } $rtyp->fields) . "\n" . - " prt->rec_size = sizeof(*prec);\n" . - " return 0;\n" . - "}\n" . - "epicsExportRegistrar(${rn}RecordSizeOffset);\n\n" . - "#ifdef __cplusplus\n" . - "}\n" . - "#endif\n"; + my $fn = $_->name; + my $cn = $_->C_name; + " prt->papFldDes[${rn}Record${fn}]->size = " . + "sizeof(prec->${cn});\n" . + " prt->papFldDes[${rn}Record${fn}]->offset = " . + "(unsigned short)((char *)&prec->${cn} - (char *)prec);" + } @fields), << "__EOF__"; + + prt->rec_size = sizeof(*prec); + return 0; +} +epicsExportRegistrar(${rn}RecordSizeOffset); + +#ifdef __cplusplus +} +#endif +__EOF__ } sub newtables {