| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345 |
- {
- This file is part of the Free Pascal run time library.
- A file in Amiga system run time library.
- Copyright (c) 1998-2003 by Nils Sjoholm
- member of the Amiga RTL 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.
- **********************************************************************}
- {
- History:
- Added DoMethodA, DoSuperMethodA, CoerceMethodA and SetSuperAttrsA.
- I've translated those from amigae. I'm not sure that they are
- correct but it's a start. Now you can try to make some tests
- with mui.
- 30 Jul 2000.
- Added stuff for commodities.
- FreeIEvents
- CxCustom
- CxDebug
- CxFilter
- CxSender
- CxSignal
- CxTranslate
- 19 Aug 2000.
- Rewrote Createport and DeletePort.
- 06 Sep 2000.
- Added two printf, one with pchar and one with string.
- They use array of const so this unit compiles with
- mode objfpc.
- 05 Nov 2002.
- Added the define use_amiga_smartlink
- 13 Jan 2003.
- [email protected]
- }
- {$INLINE ON}
- {$mode objfpc}
- unit amigalib
- deprecated 'Unit will be removed. Functions are moved to exec, intuition, utility and commodities unit.';
- INTERFACE
- uses exec,intuition,utility,commodities,inputevent,amigados;
- // moved to exec, use them from there
- {* Exec support functions from amiga.lib *}
- procedure BeginIO (ioRequest: pIORequest); inline;
- function CreateExtIO (port: pMsgPort; size: Longint): pIORequest; inline;
- procedure DeleteExtIO (ioReq: pIORequest); inline;
- function CreateStdIO (port: pMsgPort): pIOStdReq; inline;
- procedure DeleteStdIO (ioReq: pIOStdReq); inline;
- function CreatePort (name: PChar; pri: longint): pMsgPort; inline;
- procedure DeletePort (port: pMsgPort); inline;
- function CreateTask (name: STRPTR; pri: longint;
- initPC : Pointer;
- stackSize : ULONG): pTask; inline;
- procedure DeleteTask (task: pTask); inline;
- procedure NewList (list: pList); inline;
- // moved to commodities, use them from there
- {* Commodities support functions from amiga.lib *}
- procedure FreeIEvents (events: pInputEvent); inline;
- function CxCustom
- (action: pointer;
- id: longint): pCxObj; inline;
- function CxDebug (id: long): pCxObj; inline;
- function CxFilter (d: STRPTR): pCxObj; inline;
- function CxSender
- (port: pMsgPort;
- id: longint): pCxObj; inline;
- function CxSignal
- (task: pTask;
- sig: byte): pCxObj; inline;
- function CxTranslate (ie: pInputEvent): pCxObj; inline;
- // moved to intuition, use them from there
- function DoMethodA(obj : pObject_; msg : APTR): ulong; inline;
- function DoSuperMethodA(cl : pIClass; obj : pObject_; msg : APTR): ulong; inline;
- function CoerceMethodA(cl : pIClass; obj : pObject_; msg : APTR): ulong; inline;
- function SetSuperAttrsA(cl : pIClass; obj: pObject_; msg : APTR): ulong; inline;
- function DoMethod(obj: PObject_; Params: array of DWord): LongWord; inline;
- // moved to utility, use them from there
- procedure HookEntry;
- procedure HookEntryPas;
- {
- NAME
- printf - print a formatted output line to the standard output.
- SYNOPSIS
- printf(formatstring [,value [,values] ] );
- FUNCTION
- Format the output in accordance with specifications in the format
- string.
- INPUTS
- formatString - a C-language-like NULL-terminated format string,
- with the following supported % options:
- %[flags][width][.limit][length]type
- $ - must follow the arg_pos value, if specified
- flags - only one allowed. '-' specifies left justification.
- width - field width. If the first character is a '0', the
- field is padded with leading 0s.
- . - must precede the field width value, if specified
- limit - maximum number of characters to output from a string.
- (only valid for %s or %b).
- length - size of input data defaults to word (16-bit) for types c,
- d, u and x, 'l' changes this to long (32-bit).
- type - supported types are:
- b - BSTR, data is 32-bit BPTR to byte count followed
- by a byte string. A NULL BPTR is treated as an
- empty string. (V36)
- d - signed decimal
- u - unsigned decimal
- x - hexadecimal with hex digits in uppercase
- X - hexadecimal with hex digits in lowercase
- s - string, a 32-bit pointer to a NULL-terminated
- byte string. A NULL pointer is treated
- as an empty string.
- c - character
- value(s) - numeric variables or addresses of null-terminated strings
- to be added to the format information.
- NOTE
- The global "_stdout" must be defined, and contain a pointer to
- a legal AmigaDOS file handle. Using the standard Amiga startup
- module sets this up. In other cases you will need to define
- stdout, and assign it to some reasonable value (like what the
- dos.library/Output() call returns). This code would set it up:
- ULONG stdout;
- stdout=Output();
- BUGS
- This function will crash if the resulting stream after
- parameter substitution is longer than 140 bytes.
- }
- procedure printf(Fmtstr : pchar; const Args : array of const);
- procedure printf(Fmtstr : string; const Args : array of const);
- IMPLEMENTATION
- {* Exec support functions from amiga.lib *}
- procedure BeginIO (ioRequest: pIORequest); inline;
- begin
- Exec.BeginIO(ioRequest);
- end;
- function CreateExtIO (port: pMsgPort; size: Longint): pIORequest; inline;
- begin
- CreateExtIO := Exec.CreateExtIO(port, size);
- end;
- procedure DeleteExtIO (ioReq: pIORequest); inline;
- begin
- Exec.DeleteExtIO(ioReq);
- end;
- function CreateStdIO (port: pMsgPort): pIOStdReq; inline;
- begin
- CreateStdIO := Exec.CreateStdIO(port)
- end;
- procedure DeleteStdIO (ioReq: pIOStdReq); inline;
- begin
- Exec.DeleteStdIO(ioReq)
- end;
- function Createport(name : PChar; pri : longint): pMsgPort; inline;
- begin
- Createport := Exec.Createport(name, pri);
- end;
- procedure DeletePort (port: pMsgPort); inline;
- begin
- Exec.DeletePort(port);
- end;
- function CreateTask (name: STRPTR; pri: longint; initPC: pointer; stackSize: ULONG): pTask; inline;
- begin
- CreateTask := Exec.CreateTask(name, pri, initPC, stacksize);
- end;
- procedure DeleteTask (task: pTask); inline;
- begin
- Exec.DeleteTask(task)
- end;
- procedure NewList (list: pList); inline;
- begin
- Exec.NewList(list);
- end;
- procedure FreeIEvents (events: pInputEvent); inline;
- begin
- Commodities.FreeIEvents(events);
- end;
- function CxCustom(action: pointer; id: longint): pCxObj; inline;
- begin
- CxCustom := Commodities.CxCustom(action, id)
- end;
- function CxDebug(id: long): pCxObj; inline;
- begin
- CxDebug := Commodities.CxDebug(id)
- end;
- function CxFilter(d: STRPTR): pCxObj; inline;
- begin
- CxFilter := Commodities.CxFilter(d);
- end;
- function CxSender(port: pMsgPort; id: longint): pCxObj; inline;
- begin
- CxSender := Commodities.CxSender(port, id)
- end;
- function CxSignal(task: pTask; sig: byte): pCxObj; inline;
- begin
- CxSignal:= Commodities.CxSignal(task, sig)
- end;
- function CxTranslate (ie: pInputEvent): pCxObj;
- begin
- CxTranslate := Commodities.CxTranslate(ie)
- end;
- function DoMethodA(obj : pObject_; msg : APTR): ulong; inline;
- begin
- DoMethodA := Intuition.DoMethodA(obj, msg);
- end;
- function DoMethod(obj: PObject_; Params: array of DWord): LongWord; inline;
- begin
- DoMethod := Intuition.DoMethodA(obj, @Params);
- end;
- function DoSuperMethodA(cl : pIClass; obj : pObject_; msg : APTR): ulong; inline;
- begin
- DoSuperMethodA := Intuition.DoSuperMethodA(cl, obj, msg);
- end;
- function CoerceMethodA(cl : pIClass; obj : pObject_; msg : APTR): ulong; inline;
- begin
- CoerceMethodA := Intuition.CoerceMethodA(cl, obj, msg);
- end;
- function SetSuperAttrsA(cl : pIClass; obj: pObject_; msg : APTR): ulong; inline;
- begin
- SetSuperAttrsA := Intuition.SetSuperAttrsA(cl, obj, msg);
- end;
- { Do *NOT* change this to nostackframe! }
- { The compiler will build a stackframe with link/unlk. So that will actually correct
- the stackpointer for both Pascal/StdCall and Cdecl functions, so the stackpointer
- will be correct on exit. It also needs no manual RTS. The argument push order is
- also correct for both. (KB) }
- procedure HookEntry; assembler;
- asm
- move.l a1,-(a7) // Msg
- move.l a2,-(a7) // Obj
- move.l a0,-(a7) // PHook
- move.l 12(a0),a0 // h_SubEntry = Offset 12
- jsr (a0) // Call the SubEntry
- end;
- { This is to be used with when the subentry function uses FPC's register calling
- convention, also see the comments above HookEntry. It is advised to actually
- declare Hook functions with cdecl instead of using this function, especially
- when writing code which is platform independent. (KB) }
- procedure HookEntryPas; assembler;
- asm
- move.l a2,-(a7)
- move.l a1,-(a7) // Msg
- move.l a2,a1 // Obj
- // PHook is in a0 already
- move.l 12(a0),a2 // h_SubEntry = Offset 12
- jsr (a2) // Call the SubEntry
- move.l (a7)+,a2
- end;
- procedure printf(Fmtstr : pchar; const Args : array of const);
- var
- i,j : longint;
- argarray : array of longint;
- strarray : array of RawByteString;
- begin
- SetLength(argarray, length(args));
- SetLength(strarray, length(args));
- j:=0;
- for i := low(args) to High(args) do
- begin
- case args[i].vtype of
- vtinteger : argarray[i] := longint(args[i].vinteger);
- vtpchar : argarray[i] := longint(args[i].vpchar);
- vtchar : argarray[i] := longint(args[i].vchar);
- vtpointer : argarray[i] := longint(args[i].vpointer);
- vtstring : begin
- strarray[j]:=RawByteString(args[i].vstring^);
- argarray[i]:=longint(PChar(strarray[j]));
- inc(j);
- end;
- end;
- end;
- VPrintf(Fmtstr,@argarray[0]);
- end;
- procedure printf(Fmtstr : string; const Args : array of const);
- begin
- printf(PChar(RawByteString(Fmtstr)), Args);
- end;
- end.
|