You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
214 lines
5.3 KiB
214 lines
5.3 KiB
unit LibDelphi;
|
|
|
|
{$ifdef FPC}
|
|
{$MODE OBJFPC}
|
|
{$endif}
|
|
|
|
interface
|
|
|
|
uses
|
|
SysUtils;
|
|
|
|
type
|
|
va_list = Pointer;
|
|
|
|
{$IFNDEF FPC}
|
|
{$IF CompilerVersion <= 18.5}
|
|
SizeInt = Integer;
|
|
PtrUInt = LongWord;
|
|
{$ELSE}
|
|
SizeInt = NativeInt;
|
|
PtrUInt = NativeUInt;
|
|
{$IFEND}
|
|
{$ENDIF}
|
|
|
|
const
|
|
{$IFDEF MSWINDOWS}
|
|
SRuntimeLib = 'msvcrt.dll';
|
|
{$ELSE}
|
|
SRuntimeLib = 'libc.so';
|
|
{$ENDIF}
|
|
|
|
function fprintf(stream: Pointer; format: Pointer; arguments: va_list): Integer; cdecl; {$ifdef FPC}[public];{$endif}
|
|
function sprintf(buffer: Pointer; format: Pointer; arguments: va_list): Integer; cdecl; {$ifdef FPC}[public];{$endif}
|
|
function snprintf(buffer: Pointer; n: Integer; format: Pointer; arguments: va_list): Integer; cdecl; {$ifdef FPC}[public];{$endif}
|
|
function fputs(s: Pointer; stream: Pointer): Integer; cdecl; external SRuntimeLib;
|
|
function fputc(c: Integer; stream: Pointer): Integer; cdecl; external SRuntimeLib;
|
|
function isprint(c: Integer): Integer; cdecl; external SRuntimeLib;
|
|
procedure memset(a: Pointer; b: Integer; c: SizeInt); cdecl; {$ifdef FPC}[public];{$endif}
|
|
function memcpy(dest: Pointer; const src: Pointer; count: SizeInt): Pointer; cdecl; {$ifdef FPC}[public];{$endif}
|
|
function memcmp(a, b: Pointer; c:SizeInt):Integer; cdecl; {$ifdef FPC}[public];{$endif}
|
|
function malloc(s: Longint): Pointer; cdecl; {$ifdef FPC}[public];{$endif}
|
|
procedure free(p: Pointer); cdecl; {$ifdef FPC}[public];{$endif}
|
|
{$ifndef FPC}
|
|
function _ftol: Integer; cdecl; external SRuntimeLib;
|
|
function _ltolower(ch: Integer): Integer; cdecl; external SRuntimeLib;
|
|
function _ltoupper(ch: Integer): Integer; cdecl; external SRuntimeLib;
|
|
function _ltowlower(ch: Integer): Integer; cdecl; external SRuntimeLib;
|
|
function _ltowupper(ch: Integer): Integer; cdecl; external SRuntimeLib;
|
|
function fwrite(ptr:pointer; size, count:SizeInt; stream:pointer ):SizeInt; cdecl; external SRuntimeLib;
|
|
{$endif}
|
|
function strcpy(dest: Pointer; src: Pointer): Pointer; cdecl; {$ifdef FPC}[public];{$endif}
|
|
|
|
{$ifdef FPC}
|
|
function fwrite(ptr:pointer; size, count:SizeInt; stream:pointer ):SizeInt; cdecl; {$ifdef FPC}[public];{$endif}
|
|
function __udivdi3(a,b:int64):int64; cdecl; [public];
|
|
function {$ifdef CPUX86}_imp__isprint{$else}__imp_isprint{$endif}(c: char): integer; cdecl; [public];
|
|
{$endif}
|
|
|
|
{$ifndef FPC}
|
|
var
|
|
__turboFloat: LongBool = False;
|
|
_streams: Integer;
|
|
|
|
{$else}
|
|
type
|
|
// from mingw - stdio.h
|
|
cIoBuf = record
|
|
_ptr:Pointer;
|
|
_cnt:LongInt;
|
|
_base:Pointer;
|
|
_flag:LongInt;
|
|
_file:LongInt;
|
|
_charbuf:LongInt;
|
|
_bufsiz:LongInt;
|
|
_tmpfname:Pointer;
|
|
end;
|
|
pIoBuf = ^cIoBuf;
|
|
|
|
var
|
|
_imp___iob:array[0..2] of cIoBuf; cvar; // stdin,stdout,stderr
|
|
iob:pIoBuf; cvar;
|
|
{$endif}
|
|
|
|
implementation
|
|
|
|
{$ifndef FPC}
|
|
uses
|
|
Windows;
|
|
{$endif}
|
|
|
|
{$ifdef FPC}
|
|
function __udivdi3(a, b: int64): int64; cdecl;
|
|
begin
|
|
Result:=a div b;
|
|
end;
|
|
function {$ifdef CPUX86}_imp__isprint{$else}__imp_isprint{$endif}(c: char): integer; cdecl;
|
|
begin
|
|
if (c>=#32)and(c<=#127) then
|
|
Result:=1
|
|
else
|
|
Result:=0;
|
|
end;
|
|
{$endif}
|
|
|
|
procedure free(p: Pointer); cdecl;
|
|
begin
|
|
FreeMem(p);
|
|
end;
|
|
|
|
function malloc(s: Longint): Pointer; cdecl;
|
|
begin
|
|
Result := AllocMem(s);
|
|
end;
|
|
|
|
function memcpy(dest: Pointer; const src: Pointer; count: SizeInt): Pointer; cdecl;
|
|
begin
|
|
system.Move(src^,dest^,count);
|
|
Result:=dest;
|
|
end;
|
|
|
|
procedure memset(a: Pointer; b: Integer; c: SizeInt); cdecl;
|
|
begin
|
|
system.FillChar(a^,c,b);
|
|
end;
|
|
|
|
function memcmp(a, b: Pointer; c: SizeInt): Integer; cdecl; {$ifdef FPC}[public];{$endif}
|
|
{$ifndef FPC}
|
|
var
|
|
ma,mb: PByte;
|
|
n: Integer;
|
|
begin
|
|
ma:=a;
|
|
mb:=b;
|
|
n:=0;
|
|
while Cardinal(n)<c do
|
|
begin
|
|
if ma^<>mb^ then
|
|
begin
|
|
if ma^<mb^ then
|
|
Result:=-1
|
|
else
|
|
Result:=1;
|
|
exit;
|
|
end;
|
|
Inc(ma);
|
|
Inc(mb);
|
|
Inc(n);
|
|
end;
|
|
Result:=0;
|
|
{$else}
|
|
begin
|
|
Result:=CompareMemRange(a,b,c);
|
|
{$endif}
|
|
end;
|
|
|
|
function __sprintf(buffer: Pointer; format: Pointer; arguments: Pointer): Integer; cdecl; external SRuntimeLib name 'sprintf';
|
|
|
|
function sprintf(buffer: Pointer; format: Pointer; arguments: Pointer): Integer; cdecl;
|
|
begin
|
|
Result := __sprintf(buffer, format, arguments);
|
|
end;
|
|
|
|
function __snprintf(buffer: Pointer; n: Integer; format: Pointer; arguments: va_list): Integer; cdecl; external SRuntimeLib name '_snprintf';
|
|
|
|
function snprintf(buffer: Pointer; n: Integer; format: Pointer; arguments: va_list): Integer; cdecl;
|
|
begin
|
|
Result := __snprintf(buffer, n, format, arguments);
|
|
end;
|
|
|
|
function fprintf(stream: Pointer; format: Pointer; arguments: va_list): Integer; cdecl;
|
|
var
|
|
m: Integer;
|
|
n: Pointer;
|
|
{$ifndef FPC}
|
|
o: Cardinal;
|
|
{$endif}
|
|
begin
|
|
m:=sprintf(nil,format,@arguments);
|
|
n:=AllocMem(m);
|
|
sprintf(n,format,@arguments);
|
|
{$ifndef FPC}
|
|
WriteFile(Cardinal(stream),n^,Cardinal(m),o,nil);
|
|
{$else}
|
|
FileWrite(pIoBuf(stream)^._file,n^,Cardinal(m));
|
|
{$endif}
|
|
FreeMem(n);
|
|
Result := m;
|
|
end;
|
|
|
|
function strcpy(dest: Pointer; src: Pointer): Pointer; cdecl;
|
|
begin
|
|
Result:=SysUtils.strcopy(PAnsiChar(dest),PAnsiChar(src));
|
|
end;
|
|
|
|
{$ifdef FPC}
|
|
function fwrite(ptr: pointer; size, count: SizeInt; stream: pointer): SizeInt; cdecl;
|
|
begin
|
|
Result:=FileWrite(pIoBuf(stream)^._file,ptr^,size * count);
|
|
end;
|
|
|
|
procedure init_iob;
|
|
begin
|
|
FillChar(_imp___iob[0],sizeof(cIoBuf)*3,0);
|
|
_imp___iob[0]._file:=StdInputHandle;
|
|
_imp___iob[1]._file:=StdOutputHandle;
|
|
_imp___iob[2]._file:=StdErrorHandle;
|
|
iob:=@_imp___iob[0];
|
|
end;
|
|
|
|
initialization
|
|
init_iob;
|
|
{$endif}
|
|
|
|
end.
|