You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

647 lines
30 KiB

  1. unit uengShaderFileTypes;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. Classes, SysUtils
  7. {$IFDEF SHADER_FILE_USE_BITSPACE_UTILS}
  8. , uutlSerialization, uutlCommon, uutlGenerics
  9. {$ELSE}
  10. , uengShaderFileGenerics
  11. {$ENDIF}
  12. ;
  13. type
  14. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  15. {$IFDEF SHADER_FILE_USE_BITSPACE_UTILS}
  16. IengShaderFileWriter = uutlSerialization.IutlFileWriter;
  17. IengShaderFileReader = uutlSerialization.IutlFileReader;
  18. TengShaderFileReader = uutlSerialization.TutlSimpleFileReader;
  19. TengShaderFileWriter = uutlSerialization.TutlSimpleFileWriter;
  20. TIntfObjNoRefCount = uutlCommon.TutlInterfaceNoRefCount;
  21. {$ELSE}
  22. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  23. TIntfObjNoRefCount = class(TObject, IUnknown)
  24. protected
  25. fRefCount : longint;
  26. { implement methods of IUnknown }
  27. function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  28. function _AddRef : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; virtual;
  29. function _Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; virtual;
  30. public
  31. property RefCount: LongInt read fRefCount;
  32. end;
  33. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  34. IengShaderFileReader = interface
  35. ['{3A9C3AE3-CAEE-44C9-85BE-0BCAA5C1BE7A}']
  36. function LoadStream(const aFilename: String; const aStream: TStream): Boolean;
  37. end;
  38. IengShaderFileWriter = interface
  39. ['{3DF84644-9FC4-4A8A-88C2-73F13E72B1ED}']
  40. procedure SaveStream(const aFilename: String; const aStream: TStream);
  41. end;
  42. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  43. TengShaderFileReader = class(TInterfacedObject, IengShaderFileReader)
  44. public
  45. function LoadStream(const aFilename: String; const aStream: TStream): Boolean;
  46. end;
  47. TengShaderFileWriter = class(TInterfacedObject, IengShaderFileWriter)
  48. public
  49. procedure SaveStream(const aFilename: String; const aStream: TStream);
  50. end;
  51. {$ENDIF}
  52. TengShaderPartLogLevel = (
  53. llDebug,
  54. llInfo,
  55. llWarning,
  56. llError,
  57. llThrow
  58. );
  59. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  60. TengShaderCode = class(TStringList)
  61. end;
  62. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  63. TengMetaType = (
  64. metaUnknown,
  65. metaNormal,
  66. metaVersion,
  67. metaExtension,
  68. metaLayout);
  69. TengMetaData = class(TObject)
  70. private
  71. fMetaType: TengMetaType;
  72. fName: String;
  73. fValues: TStringList;
  74. function GetCount: Integer;
  75. function GetValues: TStrings;
  76. public
  77. property MetaType: TengMetaType read fMetaType;
  78. property Name: String read fName;
  79. property Count: Integer read GetCount;
  80. property Values: TStrings read GetValues;
  81. procedure Assign(const aValues: TengMetaData);
  82. constructor Create(const aName: String; const aType: TengMetaType);
  83. destructor Destroy; override;
  84. end;
  85. TengMetaDataList = specialize TutlSimpleList<TengMetaData>;
  86. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  87. //Exceptions////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  88. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  89. EengShaderPart = class(Exception)
  90. protected
  91. function GenerateMessage: String; virtual;
  92. public
  93. Sender: TObject;
  94. Line: Integer;
  95. Col: Integer;
  96. Filename: String;
  97. procedure PrintTrace(const aLines: TStrings);
  98. function PrintTrace: String;
  99. constructor Create(const aSender: TObject); overload;
  100. constructor Create(const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  101. constructor Create(const aMsg: String; const aSender: TObject); overload;
  102. constructor Create(const aMsg: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  103. end;
  104. EengShaderPartInternal = class(EengShaderPart);
  105. EengExpression = class(EengShaderPart);
  106. EengExpressionInternal = class(EengExpression)
  107. ErrorCode: Integer;
  108. constructor Create(const aErrorCode: Integer; const aSender: TObject);
  109. end;
  110. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  111. EengInvalidToken = class(EengShaderPartInternal)
  112. protected
  113. function GenerateMessage: String; override;
  114. public
  115. SenderClassName: String;
  116. Token: String;
  117. constructor Create(const aSenderClassName: String; const aToken: String; const aSender: TObject); overload;
  118. constructor Create(const aSenderClassName: String; const aToken: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  119. end;
  120. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  121. EengUnexpectedToken = class(EengShaderPart)
  122. protected
  123. function GenerateMessage: String; override;
  124. public
  125. Token: String;
  126. Expected: String;
  127. constructor Create(const aToken, aExpected: String; const aSender: TObject); overload;
  128. constructor Create(const aToken, aExpected: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  129. end;
  130. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  131. EengInvalidParamter = class(EengShaderPart)
  132. protected
  133. function GenerateMessage: String; override;
  134. public
  135. Param: String;
  136. Expected: String;
  137. constructor Create(const aParam, aExpected: String; const aSender: TObject); overload;
  138. constructor Create(const aParam, aExpected: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  139. end;
  140. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  141. EengInvalidParamterCount = class(EengShaderPart)
  142. protected
  143. function GenerateMessage: String; override;
  144. public
  145. Token: String;
  146. ExpectedMin: Integer;
  147. ExpectedMax: Integer;
  148. constructor Create(const aToken: String; const aExpected: Integer; const aSender: TObject); overload;
  149. constructor Create(const aToken: String; const aExpectedMin, aExpectedMax: Integer; const aSender: TObject); overload;
  150. constructor Create(const aToken: String; const aExpected, aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  151. constructor Create(const aToken: String; const aExpectedMin, aExpectedMax, aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  152. end;
  153. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  154. EengInvalidIdentifier = class(EengShaderPart)
  155. protected
  156. function GenerateMessage: String; override;
  157. public
  158. Identifier: String;
  159. constructor Create(const aIdentifier: String; const aSender: TObject); overload;
  160. constructor Create(const aIdentifier: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  161. end;
  162. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  163. EengOutOfRange = class(EengShaderPartInternal)
  164. protected
  165. function GenerateMessage: String; override;
  166. public
  167. Min: Integer;
  168. Max: Integer;
  169. Index: Integer;
  170. constructor Create(const aMin, aMax, aIndex: Integer; const aSender: TObject); overload;
  171. constructor Create(const aMin, aMax, aIndex, aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  172. end;
  173. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  174. EengDuplicateIdentifier = class(EengShaderPart)
  175. protected
  176. function GenerateMessage: String; override;
  177. public
  178. Name: String;
  179. New: TObject;
  180. Old: TObject;
  181. constructor Create(const aName: String; const aNew, aOld, aSender: TObject); overload;
  182. constructor Create(const aName: String; const aNew, aOld: TObject; aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  183. end;
  184. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  185. EengUnknownIdentifier = class(EengShaderPart)
  186. protected
  187. function GenerateMessage: String; override;
  188. public
  189. Name: String;
  190. constructor Create(const aName: String; const aSender: TObject); overload;
  191. constructor Create(const aName: String; aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  192. end;
  193. implementation
  194. uses
  195. uengShaderPart;
  196. {$IFNDEF SHADER_FILE_USE_BITSPACE_UTILS}
  197. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  198. //TIntfObjNoRefCount//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  199. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  200. function TIntfObjNoRefCount.QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  201. begin
  202. if getinterface(iid,obj)
  203. then result := S_OK
  204. else result := longint(E_NOINTERFACE);
  205. end;
  206. function TIntfObjNoRefCount._AddRef : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  207. begin
  208. result := InterLockedIncrement(fRefCount);
  209. end;
  210. function TIntfObjNoRefCount._Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  211. begin
  212. result := InterLockedDecrement(fRefCount);
  213. end;
  214. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  215. //TengShaderFileReader//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  216. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  217. function TengShaderFileReader.LoadStream(const aFilename: String; const aStream: TStream): Boolean;
  218. var
  219. fs: TFileStream;
  220. begin
  221. result := FileExists(aFilename);
  222. if result then begin
  223. fs := TFileStream.Create(aFilename, fmOpenRead);
  224. try
  225. aStream.CopyFrom(fs, fs.Size - fs.Position);
  226. finally
  227. FreeAndNil(fs);
  228. end;
  229. end;
  230. end;
  231. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  232. //TengShaderFileWriter//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  233. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  234. procedure TengShaderFileWriter.SaveStream(const aFilename: String; const aStream: TStream);
  235. var
  236. fs: TFileStream;
  237. begin
  238. fs := TFileStream.Create(aFilename, fmCreate);
  239. try
  240. fs.CopyFrom(aStream, aStream.Size - aStream.Position);
  241. finally
  242. FreeAndNil(fs);
  243. end;
  244. end;
  245. {$ENDIF}
  246. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  247. //TengMetaData//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  248. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  249. function TengMetaData.GetCount: Integer;
  250. begin
  251. result := fValues.Count;
  252. end;
  253. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  254. function TengMetaData.GetValues: TStrings;
  255. begin
  256. result := fValues;
  257. end;
  258. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  259. procedure TengMetaData.Assign(const aValues: TengMetaData);
  260. begin
  261. fName := aValues.Name;
  262. fMetaType := aValues.MetaType;
  263. fValues.Clear;
  264. fValues.AddStrings(aValues.Values);
  265. end;
  266. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  267. constructor TengMetaData.Create(const aName: String; const aType: TengMetaType);
  268. begin
  269. inherited Create;
  270. fName := aName;
  271. fMetaType := aType;
  272. fValues := TStringList.Create;
  273. end;
  274. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  275. destructor TengMetaData.Destroy;
  276. begin
  277. FreeAndNil(fValues);
  278. inherited Destroy;
  279. end;
  280. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  281. //EengExpressionInternal////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  282. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  283. constructor EengExpressionInternal.Create(const aErrorCode: Integer; const aSender: TObject);
  284. begin
  285. ErrorCode := aErrorCode;
  286. inherited Create('internal error: ' + IntToStr(ErrorCode), aSender);
  287. end;
  288. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  289. //EengShaderPart////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  290. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  291. function EengShaderPart.GenerateMessage: String;
  292. begin
  293. result := ''; // DUMMY
  294. end;
  295. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  296. procedure EengShaderPart.PrintTrace(const aLines: TStrings);
  297. function GetName(const aPart: TengShaderPart): String;
  298. begin
  299. result := aPart.GetTokenName;
  300. if (result = '')
  301. then result := aPart.ClassName
  302. else result := result + ' (' + aPart.ClassName + ')';
  303. end;
  304. begin
  305. if not Assigned(Sender) or not
  306. (Sender is TengShaderPart) then
  307. exit;
  308. aLines.Add(Message);
  309. (Sender as TengShaderPart).PrintTrace(' ', aLines);
  310. end;
  311. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  312. function EengShaderPart.PrintTrace: String;
  313. var
  314. sl: TStringList;
  315. begin
  316. sl := TStringList.Create;
  317. try
  318. PrintTrace(sl);
  319. result := sl.Text;
  320. finally
  321. FreeAndNil(sl);
  322. end;
  323. end;
  324. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  325. constructor EengShaderPart.Create(const aSender: TObject);
  326. begin
  327. Create(GenerateMessage, aSender);
  328. end;
  329. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  330. constructor EengShaderPart.Create(const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  331. begin
  332. Create(GenerateMessage, aLine, aCol, aFilename, aSender);
  333. end;
  334. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  335. constructor EengShaderPart.Create(const aMsg: String; const aSender: TObject);
  336. begin
  337. Sender := nil;
  338. if Assigned(aSender)
  339. then Create(
  340. aMsg,
  341. (aSender as TengShaderPart).Line,
  342. (aSender as TengShaderPart).Col,
  343. (aSender as TengShaderPart).Filename,
  344. aSender)
  345. else inherited Create(Format('%s: %s', [
  346. ClassName,
  347. aMsg]));
  348. end;
  349. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  350. constructor EengShaderPart.Create(const aMsg: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  351. begin
  352. Sender := aSender;
  353. Line := aLine;
  354. Col := aCol;
  355. Filename := aFilename;
  356. inherited Create(Format('%s (%s %d:%d): %s',[
  357. ClassName,
  358. ExtractFileName(Filename),
  359. Line+1,
  360. Col,
  361. aMsg]))
  362. end;
  363. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  364. //EengInvalidToken//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  365. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  366. function EengInvalidToken.GenerateMessage: String;
  367. begin
  368. result := 'invalid token: ' + SenderClassName + ' <> '+ Token;
  369. end;
  370. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  371. constructor EengInvalidToken.Create(const aSenderClassName: String; const aToken: String; const aSender: TObject);
  372. begin
  373. SenderClassName := aSenderClassName;
  374. Token := aToken;
  375. inherited Create(aSender);
  376. end;
  377. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  378. constructor EengInvalidToken.Create(const aSenderClassName: String; const aToken: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  379. begin
  380. SenderClassName := aSenderClassName;
  381. Token := aToken;
  382. inherited Create(aLine, aCol, aFilename, aSender);
  383. end;
  384. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  385. //EengUnexpectedToken///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  386. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  387. function EengUnexpectedToken.GenerateMessage: String;
  388. begin
  389. result := 'unexpected token: ' + Token;
  390. if (Expected <> '') then
  391. result := result + '(expected ' + Expected + ')';
  392. end;
  393. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  394. constructor EengUnexpectedToken.Create(const aToken, aExpected: String; const aSender: TObject);
  395. begin
  396. Token := aToken;
  397. Expected := aExpected;
  398. inherited Create(aSender);
  399. end;
  400. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  401. constructor EengUnexpectedToken.Create(const aToken, aExpected: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  402. begin
  403. Token := aToken;
  404. Expected := aExpected;
  405. inherited Create(aLine, aCol, aFilename, aSender);
  406. end;
  407. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  408. //EengInvalidParamter///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  409. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  410. function EengInvalidParamter.GenerateMessage: String;
  411. begin
  412. result := 'invalid parameter: ' + Param;
  413. if (Expected <> '') then
  414. result := result + '(expected ' + Expected + ')';
  415. end;
  416. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  417. constructor EengInvalidParamter.Create(const aParam, aExpected: String; const aSender: TObject);
  418. begin
  419. Param := aParam;
  420. Expected := aExpected;
  421. inherited Create(aSender);
  422. end;
  423. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  424. constructor EengInvalidParamter.Create(const aParam, aExpected: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  425. begin
  426. Param := aParam;
  427. Expected := aExpected;
  428. inherited Create(aLine, aCol, aFilename, aSender);
  429. end;
  430. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  431. //EengInvalidParamterCount//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  432. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  433. function EengInvalidParamterCount.GenerateMessage: String;
  434. begin
  435. result := 'invalid parameter count in ' + Token + '(expected ';
  436. if (ExpectedMin = ExpectedMax) then
  437. result := result + IntToStr(ExpectedMin)
  438. else if (ExpectedMax < 0) then
  439. result := result + ' at least ' + IntToStr(ExpectedMin)
  440. else
  441. result := IntToStr(ExpectedMin) + ' to ' + IntToStr(ExpectedMax);
  442. result := result + 'parameter)';
  443. end;
  444. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  445. constructor EengInvalidParamterCount.Create(const aToken: String; const aExpected: Integer; const aSender: TObject);
  446. begin
  447. Token := aToken;
  448. ExpectedMin := aExpected;
  449. ExpectedMax := aExpected;
  450. inherited Create(aSender);
  451. end;
  452. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  453. constructor EengInvalidParamterCount.Create(const aToken: String; const aExpectedMin, aExpectedMax: Integer; const aSender: TObject);
  454. begin
  455. Token := aToken;
  456. ExpectedMin := aExpectedMin;
  457. ExpectedMax := aExpectedMax;
  458. inherited Create(aSender);
  459. end;
  460. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  461. constructor EengInvalidParamterCount.Create(const aToken: String; const aExpected, aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  462. begin
  463. Token := aToken;
  464. ExpectedMin := aExpected;
  465. ExpectedMax := aExpected;
  466. inherited Create(aLine, aCol, aFilename, aSender);
  467. end;
  468. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  469. constructor EengInvalidParamterCount.Create(const aToken: String; const aExpectedMin, aExpectedMax, aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  470. begin
  471. Token := aToken;
  472. ExpectedMin := aExpectedMin;
  473. ExpectedMax := aExpectedMax;
  474. inherited Create(aLine, aCol, aFilename, aSender);
  475. end;
  476. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  477. //EengInvalidIdentifier/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  478. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  479. function EengInvalidIdentifier.GenerateMessage: String;
  480. begin
  481. result := 'invalid identifier: ' + Identifier;
  482. end;
  483. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  484. constructor EengInvalidIdentifier.Create(const aIdentifier: String; const aSender: TObject);
  485. begin
  486. Identifier := aIdentifier;
  487. inherited Create(aSender);
  488. end;
  489. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  490. constructor EengInvalidIdentifier.Create(const aIdentifier: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  491. begin
  492. Identifier := aIdentifier;
  493. inherited Create(aLine, aCol, aFilename, aSender);
  494. end;
  495. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  496. //EengOutOfRange////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  497. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  498. function EengOutOfRange.GenerateMessage: String;
  499. begin
  500. result := format('index (%d) out of range (%d:%d)', [Index, Min, Max])
  501. end;
  502. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  503. constructor EengOutOfRange.Create(const aMin, aMax, aIndex: Integer; const aSender: TObject);
  504. begin
  505. Min := aMin;
  506. Max := aMax;
  507. Index := aIndex;
  508. inherited Create(aSender);
  509. end;
  510. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  511. constructor EengOutOfRange.Create(const aMin, aMax, aIndex, aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  512. begin
  513. Min := aMin;
  514. Max := aMax;
  515. Index := aIndex;
  516. inherited Create(aLine, aCol, aFilename, aSender);
  517. end;
  518. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  519. //EengDuplicateIdentifier///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  520. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  521. function EengDuplicateIdentifier.GenerateMessage: String;
  522. begin
  523. result := 'duplicate identifier: ' + Name;
  524. if (New is TengShaderPart) then
  525. result := result + Format('(%s %d:%d)', [
  526. (New as TengShaderPart).Filename,
  527. (New as TengShaderPart).Line,
  528. (New as TengShaderPart).Col]);
  529. if (Old is TengShaderPart) then
  530. result := result + Format('(previously declared here %s %d:%d)', [
  531. (Old as TengShaderPart).Filename,
  532. (Old as TengShaderPart).Line,
  533. (Old as TengShaderPart).Col]);
  534. end;
  535. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  536. constructor EengDuplicateIdentifier.Create(const aName: String; const aNew, aOld, aSender: TObject);
  537. begin
  538. Name := aName;
  539. New := aNew;
  540. Old := aOld;
  541. inherited Create(aSender);
  542. end;
  543. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  544. constructor EengDuplicateIdentifier.Create(const aName: String; const aNew, aOld: TObject; aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  545. begin
  546. Name := aName;
  547. New := aNew;
  548. Old := aOld;
  549. inherited Create(aLine, aCol, aFilename, aSender);
  550. end;
  551. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  552. //EengUnknownIdentifier/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  553. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  554. function EengUnknownIdentifier.GenerateMessage: String;
  555. begin
  556. result := 'unknown identifier: ' + Name;
  557. end;
  558. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  559. constructor EengUnknownIdentifier.Create(const aName: String; const aSender: TObject);
  560. begin
  561. Name := aName;
  562. inherited Create(aSender);
  563. end;
  564. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  565. constructor EengUnknownIdentifier.Create(const aName: String; aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  566. begin
  567. Name := aName;
  568. inherited Create(aLine, aCol, aFilename, aSender);
  569. end;
  570. end.