123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 2004 by Marco van de Voort, member of the
- Free Pascal development team
- Implements C types for in header conversions
- 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 ctypes;
- {$inline on}
- interface
- {$ifdef unix}
- uses unixtype;
- {$i aliasctp.inc}
- {$else}
- type
- {$ifndef FPC}
- qword = int64; // Keep h2pas "uses ctypes" headers working with delphi.
- {$endif}
- { the following type definitions are compiler dependant }
- { and system dependant }
- cint8 = shortint; pcint8 = ^cint8;
- cuint8 = byte; pcuint8 = ^cuint8;
- cchar = cint8; pcchar = ^cchar;
- cschar = cint8; pcschar = ^cschar;
- cuchar = cuint8; pcuchar = ^cuchar;
- cint16 = smallint; pcint16 = ^cint16;
- cuint16 = word; pcuint16 = ^cuint16;
- cshort = cint16; pcshort = ^cshort;
- csshort = cint16; pcsshort = ^csshort;
- cushort = cuint16; pcushort = ^cushort;
- cint32 = longint; pcint32 = ^cint32;
- cuint32 = longword; pcuint32 = ^cuint32;
- cint = cint32; pcint = ^cint; { minimum range is : 32-bit }
- csint = cint32; pcsint = ^csint; { minimum range is : 32-bit }
- cuint = cuint32; pcuint = ^cuint; { minimum range is : 32-bit }
- csigned = cint; pcsigned = ^csigned;
- cunsigned = cuint; pcunsigned = ^cunsigned;
- cint64 = int64; pcint64 = ^cint64;
- cuint64 = qword; pcuint64 = ^cuint64;
- clonglong = cint64; pclonglong = ^clonglong;
- cslonglong = cint64; pcslonglong = ^cslonglong;
- culonglong = cuint64; pculonglong = ^culonglong;
- cbool = longbool; pcbool = ^cbool;
- {$if defined(cpu64) and not(defined(win64) and defined(cpux86_64))}
- clong = int64; pclong = ^clong;
- cslong = int64; pcslong = ^cslong;
- culong = qword; pculong = ^culong;
- {$else}
- clong = longint; pclong = ^clong;
- cslong = longint; pcslong = ^cslong;
- culong = cardinal; pculong = ^culong;
- {$endif}
- csize_t = ptruint; pcsize_t = pptruint;
- // Kylix compat types
- u_long = culong;
- u_short = cushort;
- coff_t = clong;
- {$ifndef FPUNONE}
- cfloat = single; pcfloat = ^cfloat;
- cdouble = double; pcdouble = ^cdouble;
- {$endif}
- {$endif}
- {$ifdef defined(win64) or defined(wince)}
- {$define longdouble_is_double}
- {$endif}
- {$if defined(linux) and (defined(cpupowerpc) or defined(cpuarm))}
- {$define longdouble_is_double}
- {$endif}
- {$ifndef FPUNONE}
- {$ifdef longdouble_is_double}
- clongdouble=double;
- {$else}
- {$if defined(cpui386) or defined(cpux86_64)}
- {$define longdouble_assignment_overload_real80}
- clongdouble = packed record
- value:extended;
- {$ifdef defined(cpu64) or defined(darwin)}
- padding:array[0..5] of byte;
- {$else}
- padding:array[0..1] of byte;
- {$endif}
- end;
- {$else}
- {$define longdouble_assignment_overload_real128}
- clongdouble = packed array [0..15] of byte;
- {$endif}
- {$endif}
- Pclongdouble=^clongdouble;
- {$ifdef longdouble_assignment_overload_real80}
- operator := (const v:clongdouble) r:extended;inline;
- operator := (const v:extended) r:clongdouble;inline;
- operator +(const e:Extended;const c:clongdouble) r:extended;inline;
- operator +(const c:clongdouble;const e:Extended) r:extended;inline;
- operator -(const e:Extended;const c:clongdouble) r:extended;inline;
- operator -(const c:clongdouble;const e:Extended) r:extended;inline;
- operator *(const e:Extended;const c:clongdouble) r:extended;inline;
- operator *(const c:clongdouble;const e:Extended) r:extended;inline;
- operator /(const e:Extended;const c:clongdouble) r:extended;inline;
- operator /(const c:clongdouble;const e:Extended) r:extended;inline;
- operator =(const e:Extended;const c:clongdouble) r:boolean;inline;
- operator =(const c:clongdouble;const e:Extended) r:boolean;inline;
- operator <(const e:Extended;const c:clongdouble) r:boolean;inline;
- operator <(const c:clongdouble;const e:Extended) r:boolean;inline;
- operator >(const e:Extended;const c:clongdouble) r:boolean;inline;
- operator >(const c:clongdouble;const e:Extended) r:boolean;inline;
- operator >=(const e:Extended;const c:clongdouble) r:boolean;inline;
- operator >=(const c:clongdouble;const e:Extended) r:boolean;inline;
- operator <=(const e:Extended;const c:clongdouble) r:boolean;inline;
- operator <=(const c:clongdouble;const e:Extended) r:boolean;inline;
- {$endif}
- {$ifdef longdouble_assignment_overload_real128}
- {Non-x86 typically doesn't have extended. To be fixed once this changes.}
- operator := (const v:clongdouble) r:double;inline;
- operator := (const v:double) r:clongdouble;inline;
- {$ifdef dummy}
- operator +(const e:Double;const c:clongdouble) r:Double;inline;
- operator +(const c:clongdouble;const e:Double) r:Double;inline;
- operator -(const e:Double;const c:clongdouble) r:Double;inline;
- operator -(const c:clongdouble;const e:Double) r:Double;inline;
- operator *(const e:Double;const c:clongdouble) r:Double;inline;
- operator *(const c:clongdouble;const e:Double) r:Double;inline;
- operator /(const e:Double;const c:clongdouble) r:Double;inline;
- operator /(const c:clongdouble;const e:Double) r:Double;inline;
- operator =(const e:Double;const c:clongdouble) r:boolean;inline;
- operator =(const c:clongdouble;const e:Double) r:boolean;inline;
- operator <(const e:Double;const c:clongdouble) r:boolean;inline;
- operator <(const c:clongdouble;const e:Double) r:boolean;inline;
- operator >(const e:Double;const c:clongdouble) r:boolean;inline;
- operator >(const c:clongdouble;const e:Double) r:boolean;inline;
- operator >=(const e:Double;const c:clongdouble) r:boolean;inline;
- operator >=(const c:clongdouble;const e:Double) r:boolean;inline;
- operator <=(const e:Double;const c:clongdouble) r:boolean;inline;
- operator <=(const c:clongdouble;const e:Double) r:boolean;inline;
- {$endif dummy}
- {$endif}
- {$endif FPUNONE}
- implementation
- {$ifndef FPUNONE}
- {$ifdef longdouble_assignment_overload_real80}
- operator := (const v:clongdouble) r:extended;
- begin
- r:=v.value;
- end;
- operator := (const v:extended) r:clongdouble;
- begin
- r.value:=v;
- end;
- operator +(const e:Extended;const c:clongdouble) r:extended;inline;
- begin
- r:=e+c.value;
- end;
- operator +(const c:clongdouble;const e:Extended) r:extended;inline;
- begin
- r:=c.value+e;
- end;
- operator -(const e:Extended;const c:clongdouble) r:extended;inline;
- begin
- r:=e-c.value;
- end;
- operator -(const c:clongdouble;const e:Extended) r:extended;inline;
- begin
- r:=c.value-e;
- end;
- operator *(const e:Extended;const c:clongdouble) r:extended;inline;
- begin
- r:=e*c.value;
- end;
- operator *(const c:clongdouble;const e:Extended) r:extended;inline;
- begin
- r:=c.value*e;
- end;
- operator /(const e:Extended;const c:clongdouble) r:extended;inline;
- begin
- r:=e/c.value;
- end;
- operator /(const c:clongdouble;const e:Extended) r:extended;inline;
- begin
- r:=c.value/e;
- end;
- operator =(const e:Extended;const c:clongdouble) r:boolean;inline;
- begin
- r:=e=c.value;
- end;
- operator =(const c:clongdouble;const e:Extended) r:boolean;inline;
- begin
- r:=c.value=e;
- end;
- operator <(const e:Extended;const c:clongdouble) r:boolean;inline;
- begin
- r:=e<c.value;
- end;
- operator <(const c:clongdouble;const e:Extended) r:boolean;inline;
- begin
- r:=c.value<e;
- end;
- operator >(const e:Extended;const c:clongdouble) r:boolean;inline;
- begin
- r:=e>c.value;
- end;
- operator >(const c:clongdouble;const e:Extended) r:boolean;inline;
- begin
- r:=c.value>e;
- end;
- operator >=(const e:Extended;const c:clongdouble) r:boolean;inline;
- begin
- r:=e>=c.value;
- end;
- operator >=(const c:clongdouble;const e:Extended) r:boolean;inline;
- begin
- r:=c.value>=e;
- end;
- operator <=(const e:Extended;const c:clongdouble) r:boolean;inline;
- begin
- r:=e<=c.value;
- end;
- operator <=(const c:clongdouble;const e:Extended) r:boolean;inline;
- begin
- r:=c.value<=e;
- end;
- {$endif}
- {$ifdef longdouble_assignment_overload_real128}
- {$ifdef ENDIAN_LITTLE}
- const r128_mantissa_ofs=0;
- r128_exponent_ofs=14;
- {$else}
- const r128_mantissa_ofs=2;
- r128_exponent_ofs=0;
- {$endif}
- operator := (const v:clongdouble) r:double;
- begin
- qword(r):=(qword(Pword(@v[r128_exponent_ofs])^) shl 52) or
- (Pqword(@v[r128_mantissa_ofs])^ shr 12);
- end;
- operator := (const v:double) r:clongdouble;
- begin
- Pword(@r[r128_exponent_ofs])^:=qword(v) shr 52;
- Pqword(@r[r128_mantissa_ofs])^:=qword(v) shl 12;
- Pcardinal(@r[r128_mantissa_ofs+8])^:=0;
- Pword(@r[r128_mantissa_ofs+12])^:=0;
- end;
- {$ifdef dummy}
- // There is no record with a value field in this case
- operator +(const e:Double;const c:clongdouble) r:Double;inline;
- begin
- r:=e+c.value;
- end;
- operator +(const c:clongdouble;const e:Double) r:Double;inline;
- begin
- r:=c.value+e;
- end;
- operator -(const e:Double;const c:clongdouble) r:Double;inline;
- begin
- r:=e-c.value;
- end;
- operator -(const c:clongdouble;const e:Double) r:Double;inline;
- begin
- r:=c.value-e;
- end;
- operator *(const e:Double;const c:clongdouble) r:Double;inline;
- begin
- r:=e*c.value;
- end;
- operator *(const c:clongdouble;const e:Double) r:Double;inline;
- begin
- r:=c.value*e;
- end;
- operator /(const e:Double;const c:clongdouble) r:Double;inline;
- begin
- r:=e/c.value;
- end;
- operator /(const c:clongdouble;const e:Double) r:Double;inline;
- begin
- r:=c.value/e;
- end;
- operator =(const e:Double;const c:clongdouble) r:boolean;inline;
- begin
- r:=e=c.value;
- end;
- operator =(const c:clongdouble;const e:Double) r:boolean;inline;
- begin
- r:=c.value=e;
- end;
- operator <(const e:Double;const c:clongdouble) r:boolean;inline;
- begin
- r:=e<c.value;
- end;
- operator <(const c:clongdouble;const e:Double) r:boolean;inline;
- begin
- r:=c.value<e;
- end;
- operator >(const e:Double;const c:clongdouble) r:boolean;inline;
- begin
- r:=e>c.value;
- end;
- operator >(const c:clongdouble;const e:Double) r:boolean;inline;
- begin
- r:=c.value>e;
- end;
- operator >=(const e:Double;const c:clongdouble) r:boolean;inline;
- begin
- r:=e>=c.value;
- end;
- operator >=(const c:clongdouble;const e:Double) r:boolean;inline;
- begin
- r:=c.value>=e;
- end;
- operator <=(const e:Double;const c:clongdouble) r:boolean;inline;
- begin
- r:=e<=c.value;
- end;
- operator <=(const c:clongdouble;const e:Double) r:boolean;inline;
- begin
- r:=c.value<=e;
- end;
- {$endif}
- {$endif}
- {$endif FPUNONE}
- end.
|