1 (* Copyright (C) DooM 2D:Forever Developers
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *)
16 {$INCLUDE a_modes.inc}
19 interface
21 uses
22 Classes,
26 // ////////////////////////////////////////////////////////////////////////// //
27 type
37 // this is base type for all scalars (and arrays)
39 public
40 type
41 TType = (TBool, TChar, TByte, TUByte, TShort, TUShort, TInt, TUInt, TString, TPoint, TSize, TList, TTrigData);
42 // TPoint: pair of Integers
43 // TSize: pair of UShorts
44 // TList: actually, array of records
45 // TTrigData: array of mMaxDim bytes, but internally a record (mRecRef)
46 // arrays of chars are pascal shortstrings (with counter in the first byte)
48 private
49 type
52 private
73 // default value
80 mEBSType: TObject; // either TDynRecord or TDynEBS; nil means "simple type"; nil for `TTrigData` too
82 // for binary parser
85 private
90 procedure parseDefaultValue (); // parse `mDefUnparsed` to `mDefSVal`, `mDefIVal`, `mDefIVal2`, `mDefRecRef`
94 public
112 // won't work for lists
117 public
139 // "value" header record contains TList fields, with name equal to record type
141 private
151 mHeaderRec: TDynRecord; // for "value" records this is header record with data, for "type" records this is header type record
153 private
163 protected
168 public
186 // find field with `TriggerType` type
189 // number of records of the given instance
192 public
207 private
216 private
225 public
232 // return empty string if not found
235 public
244 public
249 private
254 public
264 // creates new header record
267 // creates new header record
270 public
275 implementation
277 uses
278 SysUtils;
281 // ////////////////////////////////////////////////////////////////////////// //
285 // ////////////////////////////////////////////////////////////////////////// //
287 begin
298 begin
305 begin
312 begin
346 var
348 begin
359 begin
362 end
363 else
364 begin
391 // won't work for lists
393 begin
411 begin
421 var
423 begin
425 try
427 finally
434 var
440 begin
442 begin
447 end
448 else
449 begin
455 try
462 finally
474 // default value should be parsed
476 begin
479 begin
481 raise Exception.Create(Format('field ''%s'' in record ''%s'' of record type ''%s'' is not set', [mName, mOwner.mId, mOwner.mName]));
491 // default value should be parsed
493 begin
506 begin
527 begin
536 TEBS.TBitSet: begin result += ' bitset '; if mBitSetUnique then result += 'unique '; result += mEBSTypeName; end;
540 begin
541 if (mType = TType.TPoint) then begin if (mAsT) then result += ' as txy' else result += ' as xy'; end
542 else if (mType = TType.TSize) then begin if (mAsT) then result += ' as twh' else result += ' as wh'; end;
550 begin
554 TType.TChar: if (mMaxDim > 0) then result += formatstrf('Char%d;', [mMaxDim]) else result += 'Char;';
578 var
595 begin
616 // field name
619 // field type
623 // fixed-size array?
625 begin
627 if (lmaxdim < 1) then raise Exception.Create(Format('invalid field ''%s'' array size', [fldname]));
632 begin
634 begin
635 if (fldofs >= 0) then raise Exception.Create(Format('duplicate field ''%s'' offset', [fldname]));
638 continue;
642 begin
648 continue;
652 begin
654 if (Length(fldrecname) <> 0) then raise Exception.Create(Format('field ''%s'' already typed as ''%s''', [fldname, fldrecname]));
656 continue;
660 begin
662 if (Length(fldrecname) <> 0) then raise Exception.Create(Format('field ''%s'' already typed as ''%s''', [fldname, fldrecname]));
665 continue;
669 begin
670 if hasdefStr or hasdefInt or hasdefId then raise Exception.Create(Format('field ''%s'' has duplicate default', [fldname]));
673 begin
678 begin
683 begin
687 else
690 continue;
694 begin
696 continue;
700 begin
702 continue;
705 if (pr.tokType <> pr.TTId) then raise Exception.Create(Format('field ''%s'' has something unexpected in definition', [fldname]));
707 if (Length(fldrecname) <> 0) then raise Exception.Create(Format('field ''%s'' already typed as ''%s''', [fldname, fldrecname]));
714 // create field
729 else raise Exception.Create(Format('field ''%s'' has invalid type ''%s''', [fldname, fldtype]));
731 if (lmaxdim > 0) and (mType <> TType.TChar) and (mType <> TType.TTrigData) then raise Exception.Create(Format('field ''%s'' of type ''%s'' cannot be array', [fldname, fldtype]));
733 begin
734 if (lmaxdim < 1) then raise Exception.Create(Format('field ''%s'' of type ''%s'' cannot be array', [fldname, fldtype]));
735 if (Length(fldrecname) > 0) then raise Exception.Create(Format('field ''%s'' of type ''%s'' cannot have another type', [fldname, fldtype]));
759 var
765 begin
769 begin
771 begin
772 // this must be triggerdata
774 begin
775 raise Exception.Create(Format('record reference type ''%s'' in field ''%s'' cannot be written', [mEBSTypeName, mName]));
777 // write triggerdata
779 if (buf = nil) then raise Exception.Create(Format('record reference type ''%s'' in field ''%s'' cannot be written', [mEBSTypeName, mName]));
780 try
783 begin
788 finally
792 exit;
794 // record reference
802 else raise Exception.Create(Format('record reference type ''%s'' in field ''%s'' cannot be written', [mEBSTypeName, mName]));
804 // find record number
806 begin
808 if (f < 0) then raise Exception.Create(Format('record reference type ''%s'' in field ''%s'' not found in record list', [mEBSTypeName, mName]));
809 if (f > maxv) then raise Exception.Create(Format('record reference type ''%s'' in field ''%s'' has too big index', [mEBSTypeName, mName]));
810 end
811 else
812 begin
819 else raise Exception.Create(Format('record reference type ''%s'' in field ''%s'' cannot be written', [mEBSTypeName, mName]));
821 exit;
830 begin
832 begin
834 end
835 else
836 begin
839 exit;
842 begin
843 if (mMaxDim = 0) then raise Exception.Create(Format('invalid string size definition for field ''%s''', [mName]));
845 begin
846 if (Length(mSVal) <> 1) then raise Exception.Create(Format('invalid string size definition for field ''%s''', [mName]));
848 end
849 else
850 begin
851 if (Length(mSVal) > mMaxDim) then raise Exception.Create(Format('invalid string size definition for field ''%s''', [mName]));
856 exit;
860 begin
861 // triggerdata array was processed earlier
862 if (mMaxDim >= 0) then Exception.Create(Format('byte array in field ''%s'' cannot be written', [mName]));
864 exit;
868 begin
869 if (mMaxDim >= 0) then raise Exception.Create(Format('short array in field ''%s'' cannot be written', [mName]));
871 exit;
875 begin
876 if (mMaxDim >= 0) then raise Exception.Create(Format('int array in field ''%s'' cannot be written', [mName]));
878 exit;
881 begin
885 begin
886 if (mMaxDim >= 0) then raise Exception.Create(Format('pos/size array in field ''%s'' cannot be written', [mName]));
889 exit;
892 begin
893 if (mMaxDim >= 0) then raise Exception.Create(Format('pos/size array in field ''%s'' cannot be written', [mName]));
896 exit;
899 begin
901 exit;
904 begin
906 exit;
914 var
918 begin
924 begin
926 begin
928 end
930 begin
932 end
933 else
934 begin
938 exit;
941 begin
942 //def := mOwner.mOwner;
943 //es := def.findEBSType(mEBSTypeName);
946 if (es = nil) or (not es.mIsEnum) then raise Exception.Create(Format('record enum type ''%s'' for field ''%s'' not found', [mEBSTypeName, mName]));
948 begin
950 begin
953 exit;
956 raise Exception.Create(Format('value %d in record enum type ''%s'' for field ''%s'' not found', [mIVal, mEBSTypeName, mName]));
959 begin
960 //def := mOwner.mOwner;
961 //es := def.findEBSType(mEBSTypeName);
964 if (es = nil) or es.mIsEnum then raise Exception.Create(Format('record bitset type ''%s'' for field ''%s'' not found', [mEBSTypeName, mName]));
965 // none?
967 begin
969 begin
971 begin
974 exit;
977 raise Exception.Create(Format('value %d in record bitset type ''%s'' for field ''%s'' not found', [0, mEBSTypeName, mName]));
979 // not none
983 begin
985 begin
988 begin
990 begin
994 break;
997 if not found then raise Exception.Create(Format('value %d in record bitset type ''%s'' for field ''%s'' not found', [mask, mEBSTypeName, mName]));
1002 exit;
1009 begin
1011 exit;
1014 begin
1015 if (mMaxDim = 0) then raise Exception.Create(Format('invalid string size definition for field ''%s''', [mName]));
1018 exit;
1026 begin
1028 exit;
1031 begin
1034 exit;
1038 begin
1040 exit;
1043 begin
1045 exit;
1048 begin
1050 exit;
1058 var
1065 begin
1069 begin
1070 // this must be triggerdata
1072 begin
1075 // find trigger definition
1077 if (tfld = nil) then raise Exception.Create(Format('triggerdata value for field ''%s'' in record ''%s'' without TriggerType field', [mName, rec.mName]));
1079 if (rc = nil) then raise Exception.Create(Format('triggerdata definition for field ''%s'' in record ''%s'' with type ''%s'' not found', [mName, rec.mName, tfld.mSVal]));
1082 try
1086 finally
1090 exit;
1091 end
1092 else
1093 begin
1094 // not a trigger data
1102 else raise Exception.Create(Format('invalid non-numeric type ''%s'' for field ''%s'' of record ''%s''', [getTypeName(mType), mName, mEBSTypeName]));
1107 exit;
1111 begin
1120 else raise Exception.Create(Format('invalid non-numeric type ''%s'' for field ''%s'' of record ''%s''', [getTypeName(mType), mName, mEBSTypeName]));
1124 if (es = nil) or (es.mIsEnum <> (mEBS = TEBS.TEnum)) then raise Exception.Create(Format('record enum type ''%s'' for field ''%s'' not found', [mEBSTypeName, mName]));
1126 // build enum/bitfield values
1128 begin
1130 if (Length(mSVal) = 0) then raise Exception.Create(Format('record enum type ''%s'' for field ''%s'' has invalid value %d', [mEBSTypeName, mName, mIVal]));
1131 end
1132 else
1133 begin
1134 // special for 'none'
1136 begin
1138 if (Length(mSVal) = 0) then raise Exception.Create(Format('record bitset type ''%s'' for field ''%s'' has invalid value %d', [mEBSTypeName, mName, mIVal]));
1139 end
1140 else
1141 begin
1145 begin
1147 begin
1149 if (Length(s) = 0) then raise Exception.Create(Format('record bitset type ''%s'' for field ''%s'' has invalid value %d', [mEBSTypeName, mName, mask]));
1157 //writeln('ebs <', es.mName, '>: ', mSVal);
1159 exit;
1166 begin
1172 exit;
1175 begin
1177 begin
1179 end
1180 else
1181 begin
1184 try
1189 begin
1194 finally
1199 exit;
1208 begin
1210 exit;
1213 begin
1217 exit;
1220 begin
1224 exit;
1227 begin
1229 exit;
1232 begin
1234 exit;
1245 begin
1247 if (mIVal < min) or (mIVal > max) then raise Exception.Create(Format('invalid %s value for field ''%s''', [getTypeName(mType), mName]));
1251 var
1257 begin
1258 // if this field should contain struct, convert type and parse struct
1262 begin
1263 // ugly hack. sorry.
1265 begin
1268 begin
1269 // '{}'
1272 end
1273 else
1274 begin
1276 // find trigger definition
1278 if (tfld = nil) then raise Exception.Create(Format('triggerdata value for field ''%s'' in record ''%s'' without ''type'' field', [mName, rec.mName]));
1280 if (rc = nil) then raise Exception.Create(Format('triggerdata definition for field ''%s'' in record ''%s'' with type ''%s'' not found', [mName, rec.mName, tfld.mSVal]));
1283 //writeln(rc.definition);
1284 try
1288 finally
1294 exit;
1296 // other record types
1298 begin
1300 begin
1302 end
1303 else
1304 begin
1306 if (rec = nil) then raise Exception.Create(Format('record ''%s'' (%s) value for field ''%s'' not found', [pr.tokStr, mEBSTypeName, mName]));
1312 exit;
1313 end
1315 begin
1316 //rec := mOwner.mOwner.findRecType(mEBSTypeName); // find in mapdef
1319 if (rec = nil) then raise Exception.Create(Format('record type ''%s'' for field ''%s'' not found', [mEBSTypeName, mName]));
1327 exit;
1332 begin
1333 //es := mOwner.mOwner.findEBSType(mEBSTypeName); // find in mapdef
1336 if (es = nil) or (not es.mIsEnum) then raise Exception.Create(Format('record enum type ''%s'' for field ''%s'' not found', [mEBSTypeName, mName]));
1338 if not es.has[tk] then raise Exception.Create(Format('record enum value ''%s'' of type ''%s'' for field ''%s'' not found', [tk, mEBSTypeName, mName]));
1341 //writeln('ENUM ', mEBSName, '; element <', mSVal, '> with value ', mIVal);
1344 exit;
1347 begin
1348 //es := mOwner.mOwner.findEBSType(mEBSTypeName); // find in mapdef
1351 if (es = nil) or es.mIsEnum then raise Exception.Create(Format('record bitset type ''%s'' for field ''%s'' not found', [mEBSTypeName, mName]));
1354 begin
1356 if not es.has[tk] then raise Exception.Create(Format('record bitset value ''%s'' of type ''%s'' for field ''%s'' not found', [tk, mEBSTypeName, mName]));
1360 if mBitSetUnique then raise Exception.Create(Format('record bitset of type ''%s'' for field ''%s'' expects only one value', [tk, mEBSTypeName, mName]));
1361 //pr.expectDelim('|');
1366 exit;
1373 begin
1379 exit;
1382 begin
1383 if (mMaxDim = 0) then raise Exception.Create(Format('invalid string size definition for field ''%s''', [mName]));
1386 begin
1387 // single char
1388 if (Length(mSVal) <> 1) then raise Exception.Create(Format('invalid string size for field ''%s''', [mName]));
1391 end
1392 else
1393 begin
1394 // string
1395 if (Length(mSVal) > mMaxDim) then raise Exception.Create(Format('invalid string size for field ''%s''', [mName]));
1399 exit;
1402 begin
1405 exit;
1408 begin
1411 exit;
1414 begin
1417 exit;
1420 begin
1423 exit;
1426 begin
1429 exit;
1432 begin
1435 exit;
1438 begin
1442 exit;
1446 begin
1450 begin
1451 if (mIVal < 0) or (mIVal > 32767) then raise Exception.Create(Format('invalid %s value for field ''%s''', [getTypeName(mType), mName]));
1455 begin
1456 if (mIVal2 < 0) or (mIVal2 > 32767) then raise Exception.Create(Format('invalid %s value for field ''%s''', [getTypeName(mType), mName]));
1461 exit;
1464 begin
1466 exit;
1469 begin
1471 exit;
1479 // ////////////////////////////////////////////////////////////////////////// //
1481 begin
1482 if (pr = nil) then raise Exception.Create('cannot create record type without type definition');
1496 begin
1507 begin
1518 begin
1521 begin
1530 begin
1536 var
1538 begin
1545 begin
1551 var
1553 begin
1561 var
1564 begin
1572 begin
1585 var
1588 begin
1591 // find record data
1594 if (fld.mType <> fld.TType.TList) then raise Exception.Create(Format('cannot get record of type ''%s'' due to name conflict with ordinary field', [atypename]));
1595 // find by id
1597 begin
1599 begin
1603 // alas
1607 function TDynRecord.findRecordNumByType (const atypename: AnsiString; rc: TDynRecord): Integer;
1608 var
1611 begin
1613 // find record data
1616 if (fld.mType <> fld.TType.TList) then raise Exception.Create(Format('cannot get record of type ''%s'' due to name conflict with ordinary field', [atypename]));
1617 // find by ref
1619 begin
1621 begin
1625 // alas
1630 var
1632 begin
1633 // find record data
1636 begin
1637 // first record
1642 if (fld.mType <> fld.TType.TList) then raise Exception.Create(Format('cannot append record of type ''%s'' due to name conflict with ordinary field', [atypename]));
1643 // append
1650 var
1652 begin
1658 begin
1666 var
1669 begin
1671 begin
1682 // number of records of the given instance
1684 var
1686 begin
1694 var
1697 begin
1699 begin
1702 begin
1704 begin
1708 if isForTrig[tdn] then raise Exception.Create(Format('duplicate trigdata ''%s'' trigtype ''%s''', [mName, tdn]));
1712 end
1713 else
1714 begin
1720 end
1721 else
1722 begin
1727 begin
1730 begin
1731 if (mSize > 0) then raise Exception.Create(Format('duplicate `size` in record ''%s''', [mName]));
1733 if (mSize < 1) then raise Exception.Create(Format('invalid record ''%s'' size: %d', [mName, mSize]));
1735 continue;
1738 begin
1739 if (mBinBlock >= 0) then raise Exception.Create(Format('duplicate `binblock` in record ''%s''', [mName]));
1741 if (mBinBlock < 1) then raise Exception.Create(Format('invalid record ''%s'' binblock: %d', [mName, mBinBlock]));
1742 continue;
1748 // load fields
1750 begin
1752 if hasByName(fld.name) then begin fld.Free(); raise Exception.Create(Format('duplicate field ''%s''', [fld.name])); end;
1753 // append
1756 // done with field
1763 var
1765 begin
1767 begin
1770 end
1771 else
1772 begin
1773 // record
1777 begin
1787 var
1789 begin
1791 begin
1792 // trigger data
1795 begin
1798 begin
1803 end
1804 else
1805 begin
1808 end
1809 else
1810 begin
1811 // record
1818 begin
1828 var
1840 var
1843 begin
1844 //writeln('*** rec: ', rec.mName, '.', rec.mId, ' (', rec.mFields.count, ')');
1846 begin
1848 begin
1850 continue;
1855 if (rt = nil) then raise Exception.Create(Format('record of type ''%s'' with id ''%s'' links to inexistant record of type ''%s'' with id ''%d''', [rec.mName, rec.mId, fld.mEBSTypeName, fld.mRecRefId]));
1856 //writeln(' ', rec.mName, '.', rec.mId, ':', fld.mName, ' -> ', rt.mName, '.', rt.mId, ' (', fld.mEBSTypeName, '.', fld.mRecRefId, ')');
1862 begin
1863 //writeln(' ', fld.mName);
1868 begin
1871 try
1873 begin
1874 // parse map file as sequence of blocks
1878 // parse blocks
1880 begin
1885 //writeln('btype=', btype, '; bsize=', bsize);
1886 if (bsize < 0) or (bsize > $1fffffff) then raise Exception.Create(Format('block of type %d has invalid size %d', [btype, bsize]));
1887 if loaded[btype] then raise Exception.Create(Format('block of type %d already loaded', [btype]));
1889 // find record type for this block
1892 if (rect = nil) then raise Exception.Create(Format('block of type %d has no corresponding record', [btype]));
1893 //writeln('found type ''', rec.mName, ''' for block type ', btype);
1894 if (rec.mSize = 0) or ((bsize mod rec.mSize) <> 0) then raise Exception.Create(Format('block of type %d has invalid number of records', [btype]));
1895 // header?
1897 begin
1898 if (bsize <> mSize) then raise Exception.Create(Format('header block of type %d has invalid number of records', [btype]));
1903 end
1904 else
1905 begin
1906 // create list for this type
1911 begin
1915 begin
1922 //writeln('parsed ''', rec.mId, '''...');
1928 //st.position := st.position+bsize;
1930 // link fields
1932 begin
1936 exit;
1939 // read fields
1941 if (mSize < 1) then raise Exception.Create(Format('cannot read record of type ''%s'' with unknown size', [mName]));
1945 begin
1948 if (fld.mBinOfs >= st.size) then raise Exception.Create(Format('record of type ''%s'' has invalid field ''%s''', [fld.mName]));
1950 //writeln('parsing ''', mName, '.', fld.mName, '''...');
1953 finally
1960 procedure TDynRecord.writeBinTo (st: TStream; trigbufsz: Integer=-1; onlyFields: Boolean=false);
1961 var
1967 //f, c: Integer;
1970 begin
1972 begin
1973 if (mBinBlock < 1) then raise Exception.Create('cannot write binary record without block number');
1976 end
1977 else
1978 begin
1981 try
1986 // write normal fields
1988 begin
1989 // record list?
1993 if (fld.mBinOfs >= bufsz) then raise Exception.Create('binary value offset is outside of the buffer');
1995 //writeln('writing field <', fld.mName, '>');
1999 // write block with normal fields
2001 begin
2002 //writeln('writing header...');
2003 // signature and version
2014 // write other blocks, if any
2016 begin
2017 // calculate blkmax
2020 begin
2021 // record list?
2023 begin
2031 // write blocks
2033 begin
2037 begin
2038 // record list?
2040 begin
2049 // flush block
2051 begin
2062 // write end marker
2067 finally
2075 var
2078 begin
2080 begin
2087 try
2089 begin
2090 // record list?
2092 begin
2095 begin
2097 begin
2103 continue;
2110 finally
2119 var
2122 begin
2123 if (mOwner = nil) then raise Exception.Create(Format('can''t parse record ''%s'' value without owner', [mName]));
2125 // not a header?
2127 begin
2128 // id?
2130 end
2131 else
2132 begin
2136 //writeln('parsing record <', mName, '>');
2139 begin
2141 //writeln('<', mName, '.', pr.tokStr, '>');
2143 // records
2145 begin
2146 // add records with this type (if any)
2149 begin
2152 try
2156 begin
2159 begin
2161 begin
2162 if (Length(rv.mId) > 0) and StrEqu(rv.mId, rec.mId) then raise Exception.Create(Format('duplicate thing ''%s'' in record ''%s''', [fld.mName, mName]));
2168 finally
2171 continue;
2175 // fields
2178 begin
2179 if fld.defined then raise Exception.Create(Format('duplicate field ''%s'' in record ''%s''', [fld.mName, mName]));
2180 if fld.internal then raise Exception.Create(Format('internal field ''%s'' in record ''%s''', [fld.mName, mName]));
2183 continue;
2186 // something is wrong
2190 // fix field defaults
2192 //writeln('done parsing record <', mName, '>');
2196 // ////////////////////////////////////////////////////////////////////////// //
2198 begin
2205 begin
2212 begin
2223 begin
2226 begin
2235 begin
2241 var
2243 begin
2250 var
2252 begin
2256 // fields
2259 begin
2263 begin
2267 end
2268 else
2269 begin
2274 // max field
2281 var
2283 begin
2285 // fields
2287 begin
2294 var
2296 begin
2298 begin
2306 var
2312 begin
2321 begin
2324 begin
2325 if StrEqu(mIds[f], idname) then raise Exception.Create(Format('duplicate field ''%s'' in enum/bitset ''%s''', [idname, mName]));
2327 if StrEqu(mMaxName, idname) then raise Exception.Create(Format('duplicate field ''%s'' in enum/bitset ''%s''', [idname, mName]));
2331 // has value?
2333 begin
2335 begin
2336 if (Length(mMaxName) > 0) then raise Exception.Create(Format('duplicate max field ''%s'' in enum/bitset ''%s''', [idname, mName]));
2339 end
2340 else
2341 begin
2347 // append it?
2349 begin
2350 // fix maxvalue
2352 begin
2359 // next cv
2361 begin
2370 // add max field
2372 begin
2381 // ////////////////////////////////////////////////////////////////////////// //
2383 begin
2392 var
2395 begin
2410 begin
2417 var
2419 begin
2421 begin
2429 var
2431 begin
2433 begin
2441 var
2443 begin
2445 begin
2453 var
2458 // setup header links and type links
2460 var
2462 begin
2465 begin
2470 begin
2472 if (fld.mEBSType = nil) then raise Exception.Create(Format('field ''%s'' of type ''%s'' has no correcponding record definition', [fld.mName, fld.mEBSTypeName]));
2476 begin
2478 if (fld.mEBSType = nil) then raise Exception.Create(Format('field ''%s'' of type ''%s'' has no correcponding enum/bitset', [fld.mName, fld.mEBSTypeName]));
2479 if ((fld.mEBS = TDynField.TEBS.TEnum) <> (fld.mEBSType as TDynEBS).mIsEnum) then raise Exception.Create(Format('field ''%s'' of type ''%s'' enum/bitset type conflict', [fld.mName, fld.mEBSTypeName]));
2485 // setup default values
2487 var
2489 begin
2493 begin
2496 begin
2501 begin
2504 begin
2510 //writeln(eb.definition); writeln;
2511 continue;
2515 begin
2518 begin
2520 begin
2527 //writeln(dr.definition); writeln;
2528 continue;
2532 //writeln(dr.definition); writeln;
2533 if (findRecType(rec.name) <> nil) then begin rec.Free(); raise Exception.Create(Format('duplicate record ''%s''', [rec.name])); end;
2534 if (hdr <> nil) and StrEqu(rec.name, hdr.name) then begin rec.Free(); raise Exception.Create(Format('duplicate record ''%s''', [rec.name])); end;
2537 begin
2538 if (hdr <> nil) then begin rec.Free(); raise Exception.Create(Format('duplicate header record ''%s'' (previous is ''%s'')', [rec.name, hdr.name])); end;
2540 end
2541 else
2542 begin
2547 // put header record to top
2553 // setup header links and type links
2557 // setup default values
2563 // ////////////////////////////////////////////////////////////////////////// //
2565 var
2567 begin
2569 try
2577 begin
2586 var
2588 begin
2590 try
2597 begin
2606 var
2612 begin
2614 result += '// ////////////////////////////////////////////////////////////////////////// //'#10;
2617 result += #10#10'// ////////////////////////////////////////////////////////////////////////// //'#10;
2620 begin
2625 result += #10#10'// ////////////////////////////////////////////////////////////////////////// //'#10;
2631 begin
2635 begin
2641 begin