| (* Copyright (C) 2008 Free Software Foundation, Inc. *) |
| (* This file is part of GNU Modula-2. |
| |
| GNU Modula-2 is free software; you can redistribute it and/or modify it under |
| the terms of the GNU General Public License as published by the Free |
| Software Foundation; either version 2, or (at your option) any later |
| version. |
| |
| GNU Modula-2 is distributed in the hope that it will be useful, but WITHOUT ANY |
| WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| for more details. |
| |
| You should have received a copy of the GNU General Public License along |
| with gm2; see the file COPYING. If not, write to the Free Software |
| Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *) |
| |
| MODULE libexcept ; |
| |
| |
| FROM libc IMPORT exit, write, exit, printf ; |
| FROM ASCII IMPORT nul, nl ; |
| FROM SYSTEM IMPORT ADR, THROW ; |
| FROM M2RTS IMPORT Length ; |
| FROM NumberIO IMPORT CardToStr ; |
| FROM RTExceptions IMPORT IsInExceptionState ; |
| |
| |
| PROCEDURE Assert (c: BOOLEAN; line: CARDINAL; column: CARDINAL; |
| message: ARRAY OF CHAR) ; |
| VAR |
| r: INTEGER ; |
| a: ARRAY [0..10] OF CHAR ; |
| BEGIN |
| IF NOT c |
| THEN |
| r := write(2, ADR(__FILE__), Length(__FILE__)) ; |
| r := write(2, ADR(": "), Length(":")) ; |
| CardToStr(line, 0, a) ; |
| r := write(2, ADR(a), Length(a)) ; |
| r := write(2, ADR(": "), Length(":")) ; |
| CardToStr(column, 0, a) ; |
| r := write(2, ADR(a), Length(a)) ; |
| r := write(2, ADR(": "), Length(":")) ; |
| r := write(2, ADR(message), Length(message)) ; |
| a[0] := nl ; |
| a[1] := nul ; |
| r := write(2, ADR(a), Length(a)) ; |
| e := 1 |
| END |
| END Assert ; |
| |
| VAR |
| e, r: INTEGER ; |
| BEGIN |
| Assert(NOT IsInExceptionState(), __LINE__, __COLUMN__, "should not be in the exception state") ; |
| THROW(1) ; |
| exit(1) |
| EXCEPT |
| Assert(IsInExceptionState(), __LINE__, __COLUMN__, "should be in the exception state") ; |
| r := printf("correctly in exception handler, about to exit with code %d\n", e) ; |
| exit(e) |
| END libexcept. |