123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360 |
- {
- $Id$
- This file is part of the Free Pascal run time library.
- Copyright (c) 1999-2000 by Florian Klaempfl
- member of the Free Pascal development team
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program 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.
- **********************************************************************}
- unit sysutils;
- interface
- {$MODE objfpc}
- { force ansistrings }
- {$H+}
- uses
- {$ifdef linux}
- linux
- {$endif}
- {$ifdef win32}
- dos,windows
- {$endif}
- {$ifdef go32v1}
- go32,dos
- {$endif}
- {$ifdef go32v2}
- go32,dos
- {$endif}
- {$ifdef os2}
- doscalls,dos
- {$endif}
- ;
- type
- { some helpful data types }
- tprocedure = procedure;
- tfilename = string;
- tsyscharset = set of char;
- longrec = packed record
- lo,hi : word;
- end;
- wordrec = packed record
- lo,hi : byte;
- end;
- TMethod = packed record
- Code, Data: Pointer;
- end;
- { exceptions }
- exception = class(TObject)
- private
- fmessage : string;
- fhelpcontext : longint;
- public
- constructor create(const msg : string);
- constructor createfmt(const msg : string; const args : array of const);
- constructor createres(ident : longint);
- { !!!! }
- property helpcontext : longint read fhelpcontext write fhelpcontext;
- property message : string read fmessage write fmessage;
- end;
- exceptclass = class of exception;
- { integer math exceptions }
- EInterror = Class(Exception);
- EDivByZero = Class(EIntError);
- ERangeError = Class(EIntError);
- EIntOverflow = Class(EIntError);
- { General math errors }
- EMathError = Class(Exception);
- EInvalidOp = Class(EMathError);
- EZeroDivide = Class(EMathError);
- EOverflow = Class(EMathError);
- EUnderflow = Class(EMathError);
- { Run-time and I/O Errors }
- EInOutError = class(Exception)
- public
- ErrorCode : Longint;
- end;
- EInvalidPointer = Class(Exception);
- EOutOfMemory = Class(Exception);
- EAccessViolation = Class(Exception);
- EInvalidCast = Class(Exception);
- { String conversion errors }
- EConvertError = class(Exception);
- { Other errors }
- EAbort = Class(Exception);
- EAbstractError = Class(Exception);
- EAssertionFailed = Class(Exception);
- { FileRec/TextRec }
- {$i filerec.inc}
- {$i textrec.inc}
- { Read internationalization settings }
- {$i sysinth.inc}
- { Read date & Time function declarations }
- {$i datih.inc}
- { Read String Handling functions declaration }
- {$i sysstrh.inc}
- { Read pchar handling functions declration }
- {$i syspchh.inc}
- { Read filename handling functions declaration }
- {$i finah.inc}
- { Read other file handling function declarations }
- {$i filutilh.inc}
- { Read disk function declarations }
- {$i diskh.inc}
- implementation
- { Read message string definitions }
- {
- Add a language with IFDEF LANG_NAME
- just befor the final ELSE. This way English will always be the default.
- }
- {$IFDEF LANG_GERMAN}
- {$i strg.inc} // Does not exist yet !!
- {$ELSE}
- {$i stre.inc}
- {$ENDIF}
- { Read filename handling functions implementation }
- {$i fina.inc}
- { Read String Handling functions implementation }
- {$i sysstr.inc}
- { Read other file handling function implementations }
- {$i filutil.inc}
- { Read disk function implementations }
- {$i disk.inc}
- { Read date & Time function implementations }
- {$i dati.inc}
- { Read pchar handling functions implementation }
- {$i syspch.inc}
- constructor exception.create(const msg : string);
- begin
- inherited create;
- fmessage:=msg;
- end;
- constructor exception.createfmt(const msg : string; const args : array of const);
- begin
- inherited create;
- fmessage:=Format(msg,args);
- end;
- constructor exception.createres(ident : longint);
- begin
- inherited create;
- {!!!!!}
- end;
- {$ifopt S+}
- {$define STACKCHECK_WAS_ON}
- {$S-}
- {$endif OPT S }
- Procedure CatchUnhandledException (Obj : TObject; Addr,Frame: Pointer);
- Var
- Message : String;
- begin
- Writeln(stdout,'An unhandled exception occurred at 0x',HexStr(Longint(Addr),8),' :');
- if Obj is exception then
- begin
- Message:=Exception(Obj).Message;
- Writeln(stdout,Message);
- end
- else
- Writeln(stdout,'Exception object ',Obj.ClassName,' is not of class Exception.');
- { to get a nice symify }
- Writeln(stdout,BackTraceStrFunc(Longint(Addr)));
- Dump_Stack(stdout,longint(frame));
- Writeln(stdout,'');
- Halt(217);
- end;
- Var OutOfMemory : EOutOfMemory;
- InValidPointer : EInvalidPointer;
- Procedure RunErrorToExcept (ErrNo : Longint; Address,Frame : Pointer);
- Var E : Exception;
- S : String;
- begin
- Case Errno of
- 1,203 : E:=OutOfMemory;
- 204 : E:=InvalidPointer;
- 2,3,4,5,6,100,101,102,103,105,106 : { I/O errors }
- begin
- Case Errno of
- 2 : S:=SFileNotFound;
- 3 : S:=SInvalidFileName;
- 4 : S:=STooManyOpenFiles;
- 5 : S:=SAccessDenied;
- 6 : S:=SInvalidFileHandle;
- 15 : S:=SInvalidDrive;
- 100 : S:=SEndOfFile;
- 101 : S:=SDiskFull;
- 102 : S:=SFileNotAssigned;
- 103 : S:=SFileNotOpen;
- 104 : S:=SFileNotOpenForInput;
- 105 : S:=SFileNotOpenForOutput;
- 106 : S:=SInvalidInput;
- end;
- E:=EinOutError.Create (S);
- EInoutError(E).ErrorCode:=IOresult; // Clears InOutRes !!
- end;
- // We don't set abstracterrorhandler, but we do it here.
- // Unless the use sets another handler we'll get here anyway...
- 200 : E:=EDivByZero.Create(SDivByZero);
- 201 : E:=ERangeError.Create(SRangeError);
- 205 : E:=EOverflow.Create(SOverflow);
- 206 : E:=EOverflow.Create(SUnderflow);
- 207 : E:=EInvalidOp.Create(SInvalidOp);
- 211 : E:=EAbstractError.Create(SAbstractError);
- 215 : E:=EIntOverflow.Create(SIntOverflow);
- 216 : E:=EAccessViolation.Create(SAccessViolation);
- 219 : E:=EInvalidCast.Create(SInvalidCast);
- 227 : E:=EAssertionFailed.Create(SAssertionFailed);
- else
- E:=Exception.CreateFmt (SUnKnownRunTimeError,[Errno]);
- end;
- Raise E at longint(Address){$ifdef ENHANCEDRAISE},longint(Frame){$endif};
- end;
- Procedure AssertErrorHandler (Const Msg,FN : ShortString;LineNo,TheAddr : Longint);
- Var
- S : String;
- begin
- If Msg='' then
- S:=SAssertionFailed
- else
- S:=Msg;
- Raise EAssertionFailed.Createfmt(SAssertError,[S,Fn,LineNo]); // at Pointer(theAddr);
- end;
- {$ifdef STACKCHECK_WAS_ON}
- {$S+}
- {$endif}
- Procedure InitExceptions;
- {
- Must install uncaught exception handler (ExceptProc)
- and install exceptions for system exceptions or signals.
- (e.g: SIGSEGV -> ESegFault or so.)
- }
- begin
- ExceptProc:=@CatchUnhandledException;
- // Create objects that may have problems when there is no memory.
- OutOfMemory:=EOutOfMemory.Create(SOutOfMemory);
- InvalidPointer:=EInvalidPointer.Create(SInvalidPointer);
- AssertErrorProc:=@AssertErrorHandler;
- ErrorProc:=@RunErrorToExcept;
- end;
- { Initialization code. }
- Initialization
- InitExceptions; { Initialize exceptions. OS independent }
- InitInternational; { Initialize internationalization settings }
- Finalization
- OutOfMemory.Free;
- InValidPointer.Free;
- end.
- {
- $Log$
- Revision 1.46 2000-06-11 07:07:23 peter
- + TSysCharSet
- Revision 1.45 2000/04/24 13:34:29 peter
- * added enhancedraise define
- Revision 1.43 2000/03/30 13:54:15 pierre
- No stack check inside CatchUnhandledException
- Revision 1.42 2000/02/10 22:56:43 florian
- * quick hack for stack trace in the case of an unhandled exception
- Revision 1.41 2000/02/09 16:59:33 peter
- * truncated log
- Revision 1.40 2000/01/16 19:10:25 hajny
- * 'uses Dos' added for OS/2 target
- Revision 1.39 2000/01/07 16:41:44 daniel
- * copyright 2000
- Revision 1.38 1999/12/26 19:30:53 hajny
- * OS/2 target added to the uses clause
- Revision 1.36 1999/11/15 21:49:47 peter
- * exception address fixes
- Revision 1.35 1999/11/06 14:41:31 peter
- * truncated log
- Revision 1.34 1999/10/30 17:39:05 peter
- * memorymanager expanded with allocmem/reallocmem
- Revision 1.33 1999/10/26 12:29:07 peter
- * assert handler must use shortstring
- Revision 1.32 1999/09/15 20:26:30 florian
- * patch from Sebastian Guenther applied: TMethod implementation
- Revision 1.31 1999/08/28 14:53:27 florian
- * bug 471 fixed: run time error 2 is now converted into a file not
- found exception
- Revision 1.30 1999/08/18 11:28:24 michael
- * Fixed reallocmem bug 535
- Revision 1.29 1999/07/27 13:01:12 peter
- + filerec,textrec declarations
- }
|