summary refs log tree commit diff stats
path: root/nim/nsystem.pas
diff options
context:
space:
mode:
Diffstat (limited to 'nim/nsystem.pas')
-rwxr-xr-xnim/nsystem.pas657
1 files changed, 0 insertions, 657 deletions
diff --git a/nim/nsystem.pas b/nim/nsystem.pas
deleted file mode 100755
index 4cdfade93..000000000
--- a/nim/nsystem.pas
+++ /dev/null
@@ -1,657 +0,0 @@
-//
-//
-//           The Nimrod Compiler
-//        (c) Copyright 2008 Andreas Rumpf
-//
-//    See the file "copying.txt", included in this
-//    distribution, for details about the copyright.
-//
-unit nsystem;
-
-// This module provides things that are in Nimrod's system
-// module and not available in Pascal.
-
-interface
-
-{$include 'config.inc'}
-
-uses
-  sysutils
-{$ifdef fpc}
-  , math
-{$endif}
-  ;
-
-type
-  // Generic int like in Nimrod:
-  // well, no, because of FPC's bugs...
-{$ifdef cpu64}
-  int = int64;
-  uint = qword;
-{$else}
-  int = longint;
-  uint = cardinal;
-{$endif}
-
-  TResult = Boolean;
-  EInvalidValue = class(Exception)
-  end;
-
-{$ifndef fpc}
-  EOverflow = class(Exception)
-  end;
-{$endif}
-  EOutOfRange = class(Exception)
-  end;
-  EOS = class(Exception) end;
-
-  float32 = single;
-  float64 = double;
-  PFloat32 = ^float32;
-  PFloat64 = ^float64;
-const
-  Failure = False;
-  Success = True;
-
-  snil = '';
-
-type
-  TStringSeq = array of string;
-  TCharSet = set of Char;
-
-
-type
-  Natural = 0..high(int);
-  Positive = 1..high(int);
-  NObject = object // base type for all objects, cannot use
-  // TObject here, as it would overwrite System.TObject which is
-  // a class in Object pascal. Anyway, pas2mor has no problems
-  // to replace NObject by TObject
-  end;
-  PObject = ^NObject;
-
-  int16 = smallint;
-  int8 = shortint;
-  int32 = longint;
-  uint16 = word;
-  uint32 = longword;
-  uint8 = byte;
-
-  TByteArray = array [0..1024 * 1024] of Byte;
-  PByteArray = ^TByteArray;
-  PByte = ^Byte;
-  cstring = pchar;
-  bool = boolean;
-  PInt32 = ^int32;
-
-{$ifdef bit64clean} // BUGIX: was $ifdef fpc
-  BiggestUInt = QWord;
-  BiggestInt = Int64; // biggest integer type available
-{$else}
-  BiggestUInt = Cardinal; // Delphi's Int64 is broken seriously
-  BiggestInt = Integer;   // ditto
-{$endif}
-  BiggestFloat = Double; // biggest floating point type
-{$ifdef cpu64}
-  TAddress = Int64;
-{$else}
-  TAddress = longint;
-{$endif}
-
-var
-  NaN: float;
-  inf: float;
-  NegInf: float;
-{$ifdef fpc}
-{$else}
-  {$ifopt Q+}
-    {$define Q_on}
-    {$Q-}
-  {$endif}
-  {$ifopt R+}
-    {$define R_on}
-    {$R-}
-  {$endif}
-  const
-    Inf = 1.0/0.0;
-    NegInf = (-1.0) / 0.0;
-  {$ifdef Q_on}
-    {$Q+}
-    {$undef Q_on}
-  {$endif}
-  {$ifdef R_on}
-    {$R+}
-    {$undef R_on}
-  {$endif}
-{$endif}
-
-function toFloat(i: biggestInt): biggestFloat;
-function toInt(r: biggestFloat): biggestInt;
-
-function min(a, b: int): int; overload;
-function max(a, b: int): int; overload;
-{$ifndef fpc} // fpc cannot handle these overloads (bug in 64bit version?)
-// the Nimrod compiler does not use them anyway, so it does not matter
-function max(a, b: real): real; overload;
-function min(a, b: real): real; overload;
-{$endif}
-
-procedure zeroMem(p: Pointer; size: int);
-procedure copyMem(dest, source: Pointer; size: int);
-procedure moveMem(dest, source: Pointer; size: int);
-function equalMem(a, b: Pointer; size: int): Boolean;
-
-function ncopy(s: string; a: int = 1): string; overload;
-function ncopy(s: string; a, b: int): string; overload;
-// will be replaced by "copy"
-
-function newString(len: int): string;
-
-procedure addChar(var s: string; c: Char);
-
-{@ignore}
-function addU(a, b: biggestInt): biggestInt;
-function subU(a, b: biggestInt): biggestInt;
-function mulU(a, b: biggestInt): biggestInt;
-function divU(a, b: biggestInt): biggestInt;
-function modU(a, b: biggestInt): biggestInt;
-function shlU(a, b: biggestInt): biggestInt; overload;
-function shrU(a, b: biggestInt): biggestInt; overload;
-
-function shlU(a, b: Int32): Int32;overload;
-function shrU(a, b: int32): int32;overload;
-
-function ltU(a, b: biggestInt): bool;
-function leU(a, b: biggestInt): bool;
-
-function toU8(a: biggestInt): byte;
-function toU16(a: biggestInt): int16;
-function toU32(a: biggestInt): int32;
-function ze64(a: byte): biggestInt;
-function ze(a: byte): int;
-{@emit}
-
-function alloc(size: int): Pointer;
-function realloc(p: Pointer; newsize: int): Pointer;
-procedure dealloc(p: Pointer);
-
-type
-  TTextFile = record
-    buf: PChar;
-    sysFile: system.textFile;
-  end;
-
-  TBinaryFile = file;
-
-  TFileMode = (fmRead, fmWrite, fmReadWrite, fmReadWriteExisting, fmAppend);
-
-function OpenFile(out f: tTextFile; const filename: string;
-                  mode: TFileMode = fmRead): Boolean; overload;
-function endofFile(var f: tBinaryFile): boolean; overload;
-function endofFile(var f: textFile): boolean; overload;
-
-function readChar(var f: tTextFile): char;
-function readLine(var f: tTextFile): string; overload;
-function readLine(var f: tBinaryFile): string; overload;
-function readLine(var f: textFile): string; overload;
-
-procedure nimWrite(var f: tTextFile; const str: string); overload;
-procedure nimCloseFile(var f: tTextFile); overload;
-
-// binary file handling:
-function OpenFile(var f: tBinaryFile; const filename: string;
-                  mode: TFileMode = fmRead): Boolean; overload;
-procedure nimCloseFile(var f: tBinaryFile); overload;
-
-function ReadBytes(var f: tBinaryFile; out a: array of byte;
-                   start, len: int): int;
-function ReadChars(var f: tBinaryFile; out a: array of char;
-                   start, len: int): int;
-
-function writeBuffer(var f: TBinaryFile; buffer: pointer; len: int): int;
-function readBuffer(var f: tBinaryFile; buffer: pointer; len: int): int;
-overload;
-function readBuffer(var f: tBinaryFile): string; overload;
-function getFilePos(var f: tBinaryFile): int;
-procedure setFilePos(var f: tBinaryFile; pos: int64);
-
-function readFile(const filename: string): string;
-
-procedure nimWrite(var f: tBinaryFile; const str: string); overload;
-
-procedure add(var x: string; const y: string); overload;
-// Pascal version of string appending. Terminating zero is ignored.
-
-procedure add(var s: TStringSeq; const y: string); overload;
-
-function isNil(s: string): bool;
-
-implementation
-
-function isNil(s: string): bool;
-begin
-  result := s = '';
-end;
-
-{@ignore}
-procedure add(var x: string; const y: string);
-// Pascal version of string appending. Terminating zero is ignored.
-var
-  L: int;
-begin
-  L := length(y);
-  if L > 0 then begin
-    if y[L] = #0 then x := x + copy(y, 1, L-1)
-    else x := x + y;
-  end
-end;
-
-procedure add(var s: TStringSeq; const y: string); overload;
-var
-  L: int;
-begin
-  L := length(s);
-  setLength(s, L+1);
-  s[L] := y;
-end;
-{@emit}
-
-function alloc(size: int): Pointer;
-begin
-  getMem(result, size); // use standard allocator
-  FillChar(result^, size, 0);
-end;
-
-function realloc(p: Pointer; newsize: int): Pointer;
-begin
-  reallocMem(p, newsize); // use standard allocator
-  result := p;
-end;
-
-procedure dealloc(p: pointer);
-begin
-  freeMem(p);
-end;
-
-{@ignore}
-function addU(a, b: biggestInt): biggestInt;
-begin
-  result := biggestInt(biggestUInt(a) + biggestUInt(b));
-end;
-
-function subU(a, b: biggestInt): biggestInt;
-begin
-  result := biggestInt(biggestUInt(a) - biggestUInt(b));
-end;
-
-function mulU(a, b: biggestInt): biggestInt;
-begin
-  result := biggestInt(biggestUInt(a) * biggestUInt(b));
-end;
-
-function divU(a, b: biggestInt): biggestInt;
-begin
-  result := biggestInt(biggestUInt(a) div biggestUInt(b));
-end;
-
-function modU(a, b: biggestInt): biggestInt;
-begin
-  result := biggestInt(biggestUInt(a) mod biggestUInt(b));
-end;
-
-function shlU(a, b: biggestInt): biggestInt;
-begin
-  result := biggestInt(biggestUInt(a) shl biggestUInt(b));
-end;
-
-function shrU(a, b: biggestInt): biggestInt;
-begin
-  result := biggestInt(biggestUInt(a) shr biggestUInt(b));
-end;
-
-function shlU(a, b: Int32): Int32;
-begin
-  result := Int32(UInt32(a) shl UInt32(b));
-end;
-
-function shrU(a, b: int32): int32;
-begin
-  result := Int32(UInt32(a) shr UInt32(b));
-end;
-
-function ltU(a, b: biggestInt): bool;
-begin
-  result := biggestUInt(a) < biggestUInt(b);
-end;
-
-function leU(a, b: biggestInt): bool;
-begin
-  result := biggestUInt(a) < biggestUInt(b);
-end;
-
-function toU8(a: biggestInt): byte;
-begin
-  assert(a >= 0);
-  assert(a <= 255);
-  result := a;
-end;
-
-function toU32(a: biggestInt): int32;
-begin
-  result := int32(a and $ffffffff);
-end;
-
-function toU16(a: biggestInt): int16;
-begin
-  result := int16(a and $ffff);  
-end;
-
-function ze64(a: byte): biggestInt;
-begin
-  result := a
-end;
-
-function ze(a: byte): int;
-begin
-  result := a
-end;
-{@emit}
-
-procedure addChar(var s: string; c: Char);
-{@ignore}
-// delphi produces suboptimal code for "s := s + c"
-{$ifndef fpc}
-var
-  len: int;
-{$endif}
-{@emit}
-begin
-{@ignore}
-{$ifdef fpc}
-  s := s + c
-{$else}
-  {$ifopt H+}
-  len := length(s);
-  setLength(s, len + 1);
-  PChar(Pointer(s))[len] := c
-  {$else}
-  s := s + c
-  {$endif}
-{$endif}
-{@emit
-  s &= c
-}
-end;
-
-function newString(len: int): string;
-begin
-  setLength(result, len);
-  if len > 0 then begin
-  {@ignore}
-    fillChar(result[1], length(result), 0);
-  {@emit}
-  end
-end;
-
-function toFloat(i: BiggestInt): BiggestFloat;
-begin
-  result := i // conversion automatically in Pascal
-end;
-
-function toInt(r: BiggestFloat): BiggestInt;
-begin
-  result := round(r);
-end;
-
-procedure zeroMem(p: Pointer; size: int);
-begin
-  fillChar(p^, size, 0);
-end;
-
-procedure copyMem(dest, source: Pointer; size: int);
-begin
-  if size > 0 then
-    move(source^, dest^, size);
-end;
-
-procedure moveMem(dest, source: Pointer; size: int);
-begin
-  if size > 0 then
-    move(source^, dest^, size); // move handles overlapping regions
-end;
-
-function equalMem(a, b: Pointer; size: int): Boolean;
-begin
-  result := compareMem(a, b, size);
-end;
-
-{$ifndef fpc}
-function min(a, b: real): real; overload;
-begin
-  if a < b then result := a else result := b
-end;
-
-function max(a, b: real): real; overload;
-begin
-  if a > b then result := a else result := b
-end;
-{$endif}
-
-function min(a, b: int): int; overload;
-begin
-  if a < b then result := a else result := b
-end;
-
-function max(a, b: int): int; overload;
-begin
-  if a > b then result := a else result := b
-end;
-
-function ncopy(s: string; a, b: int): string;
-begin
-  result := copy(s, a, b-a+1);
-end;
-
-function ncopy(s: string; a: int = 1): string;
-begin
-  result := copy(s, a, length(s))
-end;
-
-
-{$ifopt I+} {$define I_on} {$I-} {$endif}
-function OpenFile(out f: tTextFile; const filename: string;
-                  mode: TFileMode = fmRead): Boolean; overload;
-begin
-  AssignFile(f.sysFile, filename);
-  f.buf := alloc(4096);
-  SetTextBuf(f.sysFile, f.buf^, 4096);
-  case mode of
-    fmRead: Reset(f.sysFile);
-    fmWrite: Rewrite(f.sysFile);
-    fmReadWrite: Reset(f.sysFile);
-    fmAppend: Append(f.sysFile);
-  end;
-  result := (IOResult = 0);
-end;
-
-function readChar(var f: tTextFile): char;
-begin
-  Read(f.sysFile, result);
-end;
-
-procedure nimWrite(var f: tTextFile; const str: string);
-begin
-  system.write(f.sysFile, str)
-end;
-
-function readLine(var f: tTextFile): string;
-begin
-  Readln(f.sysFile, result);
-end;
-
-function endofFile(var f: tBinaryFile): boolean;
-begin
-  result := eof(f)
-end;
-
-function endofFile(var f: textFile): boolean;
-begin
-  result := eof(f)
-end;
-
-procedure nimCloseFile(var f: tTextFile);
-begin
-  closeFile(f.sysFile);
-  dealloc(f.buf)
-end;
-
-procedure nimCloseFile(var f: tBinaryFile);
-begin
-  closeFile(f);
-end;
-
-function OpenFile(var f: TBinaryFile; const filename: string;
-                  mode: TFileMode = fmRead): Boolean;
-begin
-  AssignFile(f, filename);
-  case mode of
-    fmRead: Reset(f, 1);
-    fmWrite: Rewrite(f, 1);
-    fmReadWrite: Reset(f, 1);
-    fmAppend: assert(false);
-  end;
-  result := (IOResult = 0);
-end;
-
-function ReadBytes(var f: tBinaryFile; out a: array of byte;
-                   start, len: int): int;
-begin
-  result := 0;
-  BlockRead(f, a[0], len, result)
-end;
-
-function ReadChars(var f: tBinaryFile; out a: array of char;
-                   start, len: int): int;
-begin
-  result := 0;
-  BlockRead(f, a[0], len, result)
-end;
-
-function readBuffer(var f: tBinaryFile; buffer: pointer; len: int): int;
-begin
-  result := 0;
-  BlockRead(f, buffer^, len, result)
-end;
-
-procedure nimWrite(var f: tBinaryFile; const str: string); overload;
-begin
-  writeBuffer(f, addr(str[1]), length(str));
-end;
-
-function readLine(var f: tBinaryFile): string; overload;
-var
-  c: char;
-begin
-  result := '';
-  while readBuffer(f, addr(c), 1) = 1 do begin
-    case c of
-      #13: begin
-        readBuffer(f, addr(c), 1); // skip #10
-        break;
-      end;
-      #10: break;
-      else begin end
-    end;
-    addChar(result, c);
-  end
-end;
-
-function readLine(var f: textFile): string; overload;
-begin
-  result := '';
-  readln(f, result);
-end;
-
-function readBuffer(var f: tBinaryFile): string; overload;
-const
-  bufSize = 4096;
-var
-  bytesRead, len, cap: int;
-begin
-  // read the file in 4K chunks
-  result := newString(bufSize);
-  cap := bufSize;
-  len := 0;
-  while true do begin
-    bytesRead := readBuffer(f, addr(result[len+1]), bufSize);
-    inc(len, bytesRead);
-    if bytesRead <> bufSize then break;
-    inc(cap, bufSize);
-    setLength(result, cap);
-  end;
-  setLength(result, len);
-end;
-
-function readFile(const filename: string): string;
-var
-  f: tBinaryFile;
-begin
-  if openFile(f, filename) then begin
-    result := readBuffer(f);
-    nimCloseFile(f)
-  end
-  else
-    result := '';
-end;
-
-function writeBuffer(var f: TBinaryFile; buffer: pointer;
-                     len: int): int;
-begin
-  result := 0;
-  BlockWrite(f, buffer^, len, result);
-end;
-
-function getFilePos(var f: tBinaryFile): int;
-begin
-  result := filePos(f);
-end;
-
-procedure setFilePos(var f: tBinaryFile; pos: int64);
-begin
-  Seek(f, pos);
-end;
-
-{$ifdef I_on} {$undef I_on} {$I+} {$endif}
-
-{$ifopt R+} {$R-,Q-} {$define R_on} {$endif}
-var
-  zero: float;
-  Saved8087CW: Word;
-  savedExcMask: TFPUExceptionMask;
-initialization
-{$ifdef cpu64}
-  savedExcMask := SetExceptionMask([exInvalidOp,
-	exDenormalized,
-	exPrecision,
-	exZeroDivide,
-	exOverflow,
-	exUnderflow
-	]);
-{$else}
-  Saved8087CW := Default8087CW;
-  Set8087CW($133f); // Disable all fpu exceptions
-{$endif}
-  zero := 0.0;
-  NaN := 0.0 / zero;
-  inf := 1.0 / zero;
-  NegInf := -inf;
-finalization
-{$ifdef cpu64}
-  SetExceptionMask(savedExcMask); // set back exception mask
-{$else}
-  Set8087CW(Saved8087CW);
-{$endif}
-{$ifdef R_on}
-  {$R+,Q+}
-{$endif}
-end.