| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375 |
- unit LibDelphi;
- interface
- uses
- Windows, SysUtils;
- function fprintf(stream: Pointer; format: Pointer; arguments: Pointer): Integer; cdecl;
- function sprintf(buffer: Pointer; format: Pointer; arguments: Pointer): Integer; cdecl;
- function fputs(s: Pointer; stream: Pointer): Integer; cdecl;
- function fputc(c: Integer; stream: Pointer): Integer; cdecl;
- function isprint(c: Integer): Integer; cdecl;
- procedure memset(a: Pointer; b: Integer; c: Cardinal); cdecl;
- function memcpy(dest: Pointer; const src: Pointer; count: Cardinal): Pointer; cdecl;
- function _ftol: Integer; cdecl;
- function malloc(s: Longint): Pointer; cdecl;
- procedure free(p: Pointer); cdecl;
- function _ltolower(ch: Integer): Integer; cdecl;
- function _ltoupper(ch: Integer): Integer; cdecl;
- function _ltowlower(ch: Integer): Integer; cdecl;
- function _ltowupper(ch: Integer): Integer; cdecl;
- function strcpy(dest: Pointer; src: Pointer): Pointer; cdecl;
- function sprintfsec(buffer: Pointer; format: Pointer; arguments: Pointer): Integer;
- var
- __turboFloat: LongBool = False;
- _streams: Integer;
- implementation
- {PODD}
- function fputc(c: Integer; stream: Pointer): Integer; cdecl;
- var
- m: array[0..1] of Char;
- n: Cardinal;
- o: Cardinal;
- begin
- if c=13 then
- begin
- m[0]:=#13;
- m[1]:=#10;
- n:=2;
- end
- else
- begin
- m[0]:=Char(c);
- n:=1;
- end;
- WriteFile(Cardinal(stream),m[0],n,o,nil);
- Result:=c;
- end;
- function isprint(c: Integer): Integer; cdecl;
- begin
- if (c<32) or (127<=c) then
- Result:=0
- else
- Result:=1;
- end;
- function fputs(s: Pointer; stream: Pointer): Integer; cdecl;
- var
- m: Integer;
- n: Pointer;
- o: Cardinal;
- begin
- m:=0;
- n:=s;
- while PByte(n)^<>0 do
- begin
- Inc(m);
- Inc(PByte(n));
- end;
- WriteFile(Cardinal(stream),s^,Cardinal(m),o,nil);
- Result:=1;
- end;
- function sprintf(buffer: Pointer; format: Pointer; arguments: Pointer): Integer; cdecl;
- begin
- sprintfsec(buffer,format,@arguments);
- end;
- function fprintf(stream: Pointer; format: Pointer; arguments: Pointer): Integer; cdecl;
- var
- m: Integer;
- n: Pointer;
- o: Cardinal;
- begin
- m:=sprintfsec(nil,format,@arguments);
- GetMem(n,m);
- sprintfsec(n,format,@arguments);
- WriteFile(Cardinal(stream),n^,Cardinal(m),o,nil);
- FreeMem(n);
- end;
- function strcpy(dest: Pointer; src: Pointer): Pointer; cdecl;
- var
- ma,mb: PByte;
- n: Integer;
- begin
- ma:=src;
- mb:=dest;
- while True do
- begin
- n:=ma^;
- mb^:=n;
- if n=0 then break;
- Inc(ma);
- Inc(mb);
- end;
- Result:=dest;
- end;
- function _ltolower(ch: Integer): Integer; cdecl;
- begin
- raise Exception.Create('LibDelphi - call to _ltolower - should presumably not occur');
- end;
- function _ltoupper(ch: Integer): Integer; cdecl;
- begin
- raise Exception.Create('LibDelphi - call to _ltoupper - should presumably not occur');
- end;
- function _ltowlower(ch: Integer): Integer; cdecl;
- begin
- raise Exception.Create('LibDelphi - call to _ltowlower - should presumably not occur');
- end;
- function _ltowupper(ch: Integer): Integer; cdecl;
- begin
- raise Exception.Create('LibDelphi - call to _ltowupper - should presumably not occur');
- end;
- function sprintfsec(buffer: Pointer; format: Pointer; arguments: Pointer): Integer;
- var
- Modifier: Integer;
- Width: Integer;
- m,ma: PByte;
- mb: Boolean;
- n: PByte;
- o: PByte;
- r: PByte;
- procedure Append(const p: String);
- var
- q: Integer;
- begin
- if Width>Length(p) then
- begin
- if buffer<>nil then
- begin
- for q:=0 to Width-Length(p)-1 do
- begin
- o^:=Ord('0');
- Inc(o);
- end;
- end
- else
- Inc(o,Width-Length(p));
- end;
- if buffer<>nil then CopyMemory(o,PChar(p),Length(p));
- Inc(o,Length(p));
- end;
- begin
- m:=format;
- n:=arguments;
- o:=buffer;
- while True do
- begin
- if m^=0 then break;
- if m^=Ord('%') then
- begin
- ma:=m;
- mb:=True;
- Inc(m);
- Width:=-1;
- Modifier:=0;
- {flags}
- case m^ of
- Ord('-'): mb:=False;
- Ord('+'): mb:=False;
- Ord(' '): mb:=False;
- Ord('#'): mb:=False;
- end;
- if mb then
- begin
- {width}
- case m^ of
- Ord('1')..Ord('9'):
- begin
- Width:=0;
- while True do
- begin
- if (m^<Ord('0')) or (Ord('9')<m^) then break;
- Width:=Width*10+m^-Ord('0');
- Inc(m);
- end;
- end;
- Ord('0'): mb:=False;
- Ord('*'): mb:=False;
- end;
- end;
- if mb then
- begin
- {prec}
- case m^ of
- Ord('.'): mb:=False;
- end;
- end;
- if mb then
- begin
- {modifier}
- case m^ of
- Ord('F'): mb:=False;
- Ord('N'): mb:=False;
- Ord('h'): mb:=False;
- Ord('l'):
- begin
- Modifier:=4;
- Inc(m);
- end;
- Ord('L'): mb:=False;
- end;
- end;
- if mb then
- begin
- {type}
- case m^ of
- Ord('d'):
- begin
- case Modifier of
- 0:
- begin
- Append(IntToStr(PInteger(n)^));
- Inc(m);
- Inc(n,SizeOf(Integer));
- end;
- else
- mb:=False;
- end;
- end;
- Ord('i'): mb:=False;
- Ord('o'): mb:=False;
- Ord('u'):
- begin
- case Modifier of
- 0,4:
- begin
- Append(IntToStr(PCardinal(n)^));
- Inc(m);
- Inc(n,SizeOf(Cardinal));
- end;
- else
- mb:=False;
- end;
- end;
- Ord('x'):
- begin
- case Modifier of
- 0,4:
- begin
- Append(IntToHex(PCardinal(n)^,8));
- Inc(m);
- Inc(n,SizeOf(Cardinal));
- end;
- else
- mb:=False;
- end;
- end;
- Ord('X'): mb:=False;
- Ord('f'): mb:=False;
- Ord('e'): mb:=False;
- Ord('g'):
- begin
- case Modifier of
- 0:
- begin
- Append(FloatToStr(PSingle(n)^));
- Inc(m);
- Inc(n,SizeOf(Single));
- end;
- else
- mb:=False;
- end;
- end;
- Ord('E'): mb:=False;
- Ord('G'): mb:=False;
- Ord('c'): mb:=False;
- Ord('s'):
- begin
- r:=PPointer(n)^;
- while r^<>0 do
- begin
- if buffer<>nil then o^:=r^;
- Inc(o);
- Inc(r);
- end;
- Inc(n,SizeOf(Pointer));
- Inc(m);
- end;
- Ord('%'): mb:=False;
- Ord('n'): mb:=False;
- Ord('p'): mb:=False;
- else
- raise Exception.Create('LibDelphi');
- end;
- end;
- if mb=False then
- begin
- m:=ma;
- if buffer<>nil then o^:=m^;
- Inc(o);
- Inc(m);
- end;
- end
- else if m^=10 then
- begin
- if buffer<>nil then o^:=13;
- Inc(o);
- if buffer<>nil then o^:=10;
- Inc(o);
- Inc(m);
- end
- else
- begin
- if buffer<>nil then o^:=m^;
- Inc(o);
- Inc(m);
- end;
- end;
- if buffer<>nil then o^:=0;
- Inc(o);
- Result:=(Cardinal(o)-Cardinal(buffer));
- end;
- procedure free(p: Pointer); cdecl;
- var
- m: TMemoryManager;
- begin
- GetMemoryManager(m);
- m.FreeMem(p);
- end;
- function malloc(s: Longint): Pointer; cdecl;
- var
- m: TMemoryManager;
- begin
- GetMemoryManager(m);
- Result:=m.GetMem(s);
- end;
- function _ftol: Integer; cdecl;
- var
- f: double;
- begin
- asm
- lea eax, f // BC++ passes floats on the FPU stack
- fstp qword ptr [eax] // Delphi passes floats on the CPU stack
- end;
- Result := Trunc(f);
- end;
- function memcpy(dest: Pointer; const src: Pointer; count: Cardinal): Pointer; cdecl;
- begin
- CopyMemory(dest,src,count);
- Result:=dest;
- end;
- procedure memset(a: Pointer; b: Integer; c: Cardinal); cdecl;
- begin
- FillMemory(a,c,b);
- end;
- end.
|