Reject field names that are reserved words.
The list of reserved words is combined from C++ and the DB/DBD file parser. This also requires a small change in the rules for generating the C name from the DBD field name, since the aSub record has a field NOT; now if we find the lower-case version is reserved, we use the original instead. Since the aSubRecord.c file doesn't use prec->not this is back-compatible.
This commit is contained in:
@@ -6,9 +6,9 @@ use Carp;
|
||||
require Exporter;
|
||||
|
||||
@ISA = qw(Exporter);
|
||||
@EXPORT = qw(&pushContext &popContext &dieContext &warnContext &identifier
|
||||
&unquote &escapeCcomment &escapeCstring $RXident $RXname $RXuint $RXint
|
||||
$RXhex $RXoct $RXuintx $RXintx $RXnum $RXdqs $RXsqs $RXstr);
|
||||
@EXPORT = qw(&pushContext &popContext &dieContext &warnContext &is_reserved
|
||||
&identifier &unquote &escapeCcomment &escapeCstring $RXident $RXname
|
||||
$RXuint $RXint $RXhex $RXoct $RXuintx $RXintx $RXnum $RXdqs $RXsqs $RXstr);
|
||||
|
||||
|
||||
our $RXident = qr/ [a-zA-Z] [a-zA-Z0-9_]* /x;
|
||||
@@ -61,6 +61,21 @@ sub unquote (\$) {
|
||||
return $$s;
|
||||
}
|
||||
|
||||
# Reserved words from C++ and the DB/DBD file parser
|
||||
my %reserved = map { $_ => undef } qw(and and_eq asm auto bitand bitor bool
|
||||
break case catch char class compl const const_cast continue default delete
|
||||
do double dynamic_cast else enum explicit export extern false float for
|
||||
friend goto if inline int long mutable namespace new not not_eq operator or
|
||||
or_eq private protected public register reinterpret_cast return short signed
|
||||
sizeof static static_cast struct switch template this throw true try typedef
|
||||
typeid typename union unsigned using virtual void volatile wchar_t while xor
|
||||
xor_eq addpath alias breaktable choice device driver field function grecord
|
||||
include info menu path record recordtype registrar variable);
|
||||
sub is_reserved {
|
||||
my $id = shift;
|
||||
return exists $reserved{$id};
|
||||
}
|
||||
|
||||
sub identifier {
|
||||
my ($id, $what) = @_;
|
||||
unquote $id;
|
||||
@@ -68,6 +83,9 @@ sub identifier {
|
||||
$id =~ m/^$RXident$/o or dieContext("Illegal $what '$id'",
|
||||
"Identifiers are used in C code so must start with a letter, followed",
|
||||
"by letters, digits and/or underscore characters only.");
|
||||
dieContext("Illegal $what '$id'",
|
||||
"Identifier is a C++ reserved word.")
|
||||
if is_reserved($id);
|
||||
return $id;
|
||||
}
|
||||
|
||||
|
||||
@@ -99,9 +99,19 @@ sub check_valid {
|
||||
if (defined($default) and !$this->legal_value($default));
|
||||
}
|
||||
|
||||
# The C structure member name is usually the field name converted to
|
||||
# lower-case. However if that is a reserved word, use the original.
|
||||
sub C_name {
|
||||
my ($this) = @_;
|
||||
my $name = lc $this->name;
|
||||
$name = $this->name
|
||||
if is_reserved($name);
|
||||
return $name;
|
||||
}
|
||||
|
||||
sub toDeclaration {
|
||||
my ($this, $ctype) = @_;
|
||||
my $name = lc $this->name;
|
||||
my $name = $this->C_name;
|
||||
my $result = sprintf " %-19s %-12s", $ctype, "$name;";
|
||||
my $prompt = $this->attribute('prompt');
|
||||
$result .= "/* $prompt */" if defined $prompt;
|
||||
|
||||
@@ -122,13 +122,13 @@ sub oldtables {
|
||||
"{\n" .
|
||||
" ${rn}Record *prec = 0;\n" .
|
||||
join("\n", map {
|
||||
" prt->papFldDes[${rn}Record$_]->size = " .
|
||||
"sizeof(prec->" . lc($_) . ");"
|
||||
} $rtyp->field_names) . "\n" .
|
||||
" prt->papFldDes[${rn}Record" . $_->name . "]->size = " .
|
||||
"sizeof(prec->" . $_->C_name . ");"
|
||||
} $rtyp->fields) . "\n" .
|
||||
join("\n", map {
|
||||
" prt->papFldDes[${rn}Record$_]->offset = " .
|
||||
"(char *)&prec->" . lc($_) . " - (char *)prec;"
|
||||
} $rtyp->field_names) . "\n" .
|
||||
" prt->papFldDes[${rn}Record" . $_->name . "]->offset = " .
|
||||
"(char *)&prec->" . $_->C_name . " - (char *)prec;"
|
||||
} $rtyp->fields) . "\n" .
|
||||
" prt->rec_size = sizeof(*prec);\n" .
|
||||
" return 0;\n" .
|
||||
"}\n" .
|
||||
@@ -154,6 +154,7 @@ sub newtables {
|
||||
"static dbFldDes ${rn}FieldMetaData[] = {\n",
|
||||
join(",\n", map {
|
||||
my $fn = $_->name;
|
||||
my $cn = $_->C_name;
|
||||
" { ${rn}FieldName${fn}," .
|
||||
$_->dbf_type . ',"' .
|
||||
$_->attribute('initial') . '",' .
|
||||
@@ -162,7 +163,7 @@ sub newtables {
|
||||
($_->attribute('interest') || '0') . ',' .
|
||||
($_->attribute('asl') || 'ASL0') . ',' .
|
||||
$n++ . ",\n\t\&${rn}RecordMetaData," .
|
||||
"GEOMETRY_DATA(${rn}Record," . lc($fn) . ') }';
|
||||
"GEOMETRY_DATA(${rn}Record,$cn) }";
|
||||
} $rtyp->fields),
|
||||
"\n};\n\n";
|
||||
print OUTFILE "static const ${rn}FieldIndex ${rn}RecordLinkFieldIndices[] = {\n",
|
||||
|
||||
Reference in New Issue
Block a user