Можно ли на Delphi для Win32 реализовать аналоги C-функций setjmp/longjmp?
Код | type TJumpRec = record Address : Pointer; { Адрес перехода, выполняемого LongJump. } ДРУГИЕ ДАННЫЕ, СОХРАНЯЕМОГО КОНТЕКСТА end; var JumpRec : TJumpRes;
procedure GetData; ... ... ... function GetByte( var B : Byte ) : Boolean; { TRUE - байт получен, FALSE - данные ЗАКОНЧИЛИСЬ (ОШИБОК ВВОДА-ВЫВОДА [U]НЕ БЫЛО[/U]). } begin ... { Нормальная ситуация - байт получен. } B := ... Result := TRUE; ... { Нормальная ситуация - байт НЕ получен. (Например, достигнут конец файла или файл пустой.) } Result := FALSE; ... { Ненормальная ситуация - ОШИБКА ВВОДА-ВЫВОДА (например, при чтении из файла). } LongJump(JumpRec) { goto JumpRec.Address } end; { GetByte } ... ... ... var B : Byte; label LabelState0, ... , LabelStateN, LabelExitOK, LabelExitERROR; begin { GetData } ... ИНИЦИАЛИЗАЦИЯ в том числе и вызов SetJump(JumpRec,@LabelExitERROR); ... LabelState0: if GetByte(B) then ДЕЙСТВИЯ ПРИ ПОЛУЧЕНИИ БАЙТА ДАННЫХ В СОСТЯНИИ State0, которые заканчиваются возможным переходом в какое-либо другое состояние (State0..StateN) или завершением работы (переход на метку LabelExitOK или на метку LabelExitERROR). else ДЕЙСТВИЯ СРАЗУ ПОСЛЕ ОКОНЧАНИЯ ПОЛУЧЕНИЯ ДАННЫХ (с переходом на метку LabelExitOK или на метку LabelExitERROR). ... ... ... LabelStateN: if GetByte(B) then ДЕЙСТВИЯ ПРИ ПОЛУЧЕНИИ БАЙТА ДАННЫХ В СОСТЯНИИ StateN, которые заканчиваются возможным переходом в какое-либо другое состояние (State0..StateN) или завершением работы (переход на метку LabelExitOK или на метку LabelExitERROR). else ДЕЙСТВИЯ СРАЗУ ПОСЛЕ ОКОНЧАНИЯ ПОЛУЧЕНИЯ ДАННЫХ (с переходом на метку LabelExitOK или на метку LabelExitERROR). ... LabelExitOK: { Нормальное завершение работы GetData. } ... LabelExitERROR: { Ненормальное завершение работы GetData (с какой-либо ошибкой: ОШИБКОЙ ВВОДА-ВЫВОДА или ОШИБКОЙ ВО ВХОДНЫХ ДАННЫХ). } ... end { GetData }
|
|