unit uengShaderFileTypes; {$mode objfpc}{$H+} {$I uengShaderFile.inc} interface uses Classes, SysUtils {$IFDEF USE_BITSPACE_UTILS} , uutlSerialization, uutlCommon {$ENDIF} ; type //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$IFDEF USE_BITSPACE_UTILS} IengShaderFileWriter = uutlSerialization.IutlFileWriter; IengShaderFileReader = uutlSerialization.IutlFileReader; TengShaderFileReader = uutlSerialization.TutlSimpleFileReader; TengShaderFileWriter = uutlSerialization.TutlSimpleFileWriter; TIntfObjNoRefCount = uutlCommon.TutlInterfaceNoRefCount; {$ENDIF} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TengShaderFileLoadFlag = ( lfLazyInclude // include files will only be loaded when needed (this will store a reference to the passed IengShaderFileReader) ); TengShaderFileLoadFlags = set of TengShaderFileLoadFlag; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// EengShaderPart = class(Exception) public Line: Integer; Col: Integer; Filename: String; constructor Create(const aMsg: String; const aLine, aCol: Integer; const aFilename: String); overload; end; EengShaderPartInternal = class(EengShaderPart); EengExpression = class(EengShaderPart); EengInvalidToken = class(EengShaderPartInternal) constructor Create(const aClassName: String; const aToken: String; const aLine, aCol: Integer; const aFilename: String); overload; end; EengUnexpectedToken = class(EengShaderPart) constructor Create(const aToken, aExpected: String; const aLine, aCol: Integer; const aFilename: String); overload; end; EengInvalidParamter = class(EengShaderPart) constructor Create(const aParam, aExpected: String; const aLine, aCol: Integer; const aFilename: String); overload; end; EengInvalidParamterCount = class(EengShaderPart) constructor Create(const aToken: String; const aExpected, aLine, aCol: Integer; const aFilename: String); overload; constructor Create(const aToken: String; const aExpectedMin, aExpectedMax, aLine, aCol: Integer; const aFilename: String); overload; end; EengInvalidIdentifier = class(EengShaderPart) constructor Create(const aIdentifier: String; const aLine, aCol: Integer; const aFilename: String); overload; end; EengOutOfRange = class(EengShaderPartInternal) constructor Create(const aMin, aMax, aIndex, aLine, aCol: Integer; const aFilename: String); overload; end; implementation //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //EengShaderPart//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor EengShaderPart.Create(const aMsg: String; const aLine, aCol: Integer; const aFilename: String); begin inherited Create(Format('%s (file: %s; line: %d; col: %d): %s', [ClassName, ExtractFileName(aFilename), aLine+1, aCol, aMsg])); Line := aLine; Col := aCol; Filename := aFilename; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //EengInvalidToken////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor EengInvalidToken.Create(const aClassName: String; const aToken: String; const aLine, aCol: Integer; const aFilename: String); begin inherited Create('invalid token: ' + aClassName + ' <> '+ aToken, aLine, aCol, aFilename); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //EengUnexpectedToken/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor EengUnexpectedToken.Create(const aToken, aExpected: String; const aLine, aCol: Integer; const aFilename: String); var s: String; begin s := 'unexpected token: ' + aToken; if (aExpected <> '') then s := s + '(expected ' + aExpected + ')'; inherited Create(s, aLine, aCol, aFilename); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //EengInvalidParamter/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor EengInvalidParamter.Create(const aParam, aExpected: String; const aLine, aCol: Integer; const aFilename: String); var s: String; begin s := 'invalid parameter: ' + aParam; if (aExpected <> '') then s := s + '(expected ' + aExpected + ')'; inherited Create(s, aLine, aCol, aFilename); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //EengInvalidParamterCount////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor EengInvalidParamterCount.Create(const aToken: String; const aExpected, aLine, aCol: Integer; const aFilename: String); begin inherited Create('invalid parameter count in ' + aToken + '(expected ' + IntToStr(aExpected) + ' parameter)', aLine, aCol, aFilename); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor EengInvalidParamterCount.Create(const aToken: String; const aExpectedMin, aExpectedMax, aLine, aCol: Integer; const aFilename: String); var s: String; begin s := 'invalid parameter count in ' + aToken + '(expected '; if (aExpectedMax < 0) then s := s + ' at least '+ IntToStr(aExpectedMin) else s := s + IntToStr(aExpectedMin) + ' to ' + IntToStr(aExpectedMax); s := s + ' parameter)'; inherited Create(s, aLine, aCol, aFilename); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //EengInvalidIdentifier///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor EengInvalidIdentifier.Create(const aIdentifier: String; const aLine, aCol: Integer; const aFilename: String); begin inherited Create('invalid identifier: ' + aIdentifier, aLine, aCol, aFilename); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //EengOutOfRange//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor EengOutOfRange.Create(const aMin, aMax, aIndex, aLine, aCol: Integer; const aFilename: String); begin inherited Create(format('index (%d) out of range (%d:%d)', [aIndex, aMin, aMax]), aLine, aCol, aFilename); end; end.