Update library source to V2.

This commit is contained in:
David Brown 2016-06-16 14:56:42 +01:00
parent 4245c6e8b3
commit 7bdc53145e
46 changed files with 3141 additions and 3349 deletions

View file

@ -20,7 +20,7 @@ email Patrick.Hunziker@unibas.ch
MODULE MultiArrayRiders; (** Patrick Hunziker, Basel, **) MODULE MultiArrayRiders; (** Patrick Hunziker, Basel, **)
(** Implements an array rider access mechanism for multidimensional arrays of arbitrary (** Implements an array rider access mechanism for multidimensional arrays of arbitrary
dimensions defined in MultiArrays*) dimensions defined in MultiArrays*)
IMPORT MultiArrays, Out:= Console, Input := Kernel; IMPORT MultiArrays, Out := Console, Input := Platform;
CONST (** behaviour of array rider at end of array line; CONST (** behaviour of array rider at end of array line;
not yet completely implemented. not yet completely implemented.
The seemingly more exotic variants are especially useful in image processing *) The seemingly more exotic variants are especially useful in image processing *)

View file

@ -40,7 +40,7 @@ Patrick Hunziker,Basel.
email Patrick.Hunziker@unibas.ch email Patrick.Hunziker@unibas.ch
*) *)
(** Version 0.9, 19.1.2001 *) (** Version 0.9, 19.1.2001 *)
IMPORT Out:= Console, Input:= Kernel; (* Import only needed for Demo purposes *) IMPORT Out := Console, Input := Platform; (* Import only needed for Demo purposes *)
TYPE TYPE
SIntPtr* = POINTER TO ARRAY OF SHORTINT; SIntPtr* = POINTER TO ARRAY OF SHORTINT;

View file

@ -1,6 +1,6 @@
MODULE crt; MODULE crt;
IMPORT vt100, Unix, Console, IMPORT vt100, Platform, Console,
Strings; (* strings to remove later ? *) Strings; (* strings to remove later ? *)
CONST CONST
@ -28,11 +28,6 @@ CONST
(* Add-in for blinking *) (* Add-in for blinking *)
Blink* = 128; Blink* = 128;
TYPE
PFdSet = POINTER TO Unix.FdSet;
VAR tmpstr : ARRAY 23 OF CHAR;
PROCEDURE EraseDisplay*; PROCEDURE EraseDisplay*;
BEGIN BEGIN
vt100.ED(2); vt100.ED(2);
@ -58,16 +53,8 @@ VAR tmpstr : ARRAY 23 OF CHAR;
vt100.DECTCEMh; vt100.DECTCEMh;
END cursoron; END cursoron;
PROCEDURE Delay*( ms : INTEGER); PROCEDURE Delay*(ms: INTEGER);
VAR i : LONGINT; BEGIN Platform.Delay(ms) END Delay;
tv : Unix.Timeval;
pfd : PFdSet;
BEGIN
tv.sec := 0;
tv.usec := ms * 1000;
pfd := NIL;
i := Unix.Select(0, pfd^, pfd^, pfd^, tv);
END Delay;
PROCEDURE GotoXY* (x, y: INTEGER); PROCEDURE GotoXY* (x, y: INTEGER);
BEGIN BEGIN

View file

@ -1,5 +1,8 @@
(* $Id: C.Mod,v 1.9 1999/10/03 11:46:01 ooc-devel Exp $ *) (* $Id: C.Mod,v 1.9 1999/10/03 11:46:01 ooc-devel Exp $ *)
MODULE oocC; MODULE oocC;
(* ILP32 model *)
(* Basic data types for interfacing to C code. (* Basic data types for interfacing to C code.
Copyright (C) 1997-1998 Michael van Acken Copyright (C) 1997-1998 Michael van Acken
@ -18,8 +21,7 @@ MODULE oocC;
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*) *)
IMPORT IMPORT SYSTEM;
SYSTEM;
(* (*
These types are intended to be equivalent to their C counterparts. These types are intended to be equivalent to their C counterparts.
@ -28,31 +30,25 @@ Unix they should be fairly safe.
*) *)
TYPE TYPE
char* = CHAR; char* = CHAR; (* 8 bits *)
signedchar* = SHORTINT; (* signed char *) signedchar* = SHORTINT; (* 8 bits *)
shortint* = INTEGER; (* short int *) shortint* = RECORD a,b: SYSTEM.BYTE END; (* 16 bits *)
int* = LONGINT; int* = LONGINT; (* 32 bits *)
set* = SET; (* unsigned int, used as set *) set* = LONGINT; (* 32 bits *)
longint* = LONGINT; (* long int *) longint* = LONGINT; (* 32 bits on ILP32 (64 bits is 'long long') *)
(*longset* = SYSTEM.SET64; *) (* unsigned long, used as set *) (*longset* = SET; n/a *) (* 64 bit SET *)
longset* = SET; address* = LONGINT; (* 32 bits *)
address* = LONGINT; float* = REAL; (* 32 bits *)
float* = REAL; double* = LONGREAL; (* 64 bits *)
double* = LONGREAL;
enum1* = int; enum1* = int;
(*
enum2* = int; enum2* = int;
enum4* = int; enum4* = int;
(* if your C compiler uses short enumerations, you'll have to replace the
declarations above with
enum1* = SHORTINT;
enum2* = INTEGER;
enum4* = LONGINT;
*) *)
FILE* = address; (* this is acually a replacement for `FILE*', i.e., for a pointer type *) FILE* = address; (* this is acually a replacement for `FILE*', i.e., for a pointer type *)
sizet* = longint; sizet* = longint; (* 32 bits in i686 *)
uidt* = int; uidt* = int;
gidt* = int; gidt* = int;

View file

@ -1,5 +1,8 @@
(* $Id: C.Mod,v 1.9 1999/10/03 11:46:01 ooc-devel Exp $ *) (* $Id: C.Mod,v 1.9 1999/10/03 11:46:01 ooc-devel Exp $ *)
MODULE oocC; MODULE oocC;
(* LP64 model *)
(* Basic data types for interfacing to C code. (* Basic data types for interfacing to C code.
Copyright (C) 1997-1998 Michael van Acken Copyright (C) 1997-1998 Michael van Acken
@ -18,8 +21,7 @@ MODULE oocC;
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*) *)
IMPORT IMPORT SYSTEM;
SYSTEM;
(* (*
These types are intended to be equivalent to their C counterparts. These types are intended to be equivalent to their C counterparts.
@ -28,26 +30,21 @@ Unix they should be fairly safe.
*) *)
TYPE TYPE
char* = CHAR; char* = CHAR; (* 8 bits *)
signedchar* = SHORTINT; (* signed char *) signedchar* = SHORTINT; (* 8 bits *)
shortint* = RECORD a,b : SYSTEM.BYTE END; (* 2 bytes on x64_64 *) (* short int *) shortint* = RECORD a,b: SYSTEM.BYTE END; (* 16 bits *)
int* = INTEGER; int* = INTEGER; (* 32 bits *)
set* = INTEGER;(*SET;*) (* unsigned int, used as set *) set* = INTEGER; (* 32 bits *)
longint* = LONGINT; (* long int *) longint* = INTEGER; (* 32 bits *)
longset* = SET; (*SYSTEM.SET64; *) (* unsigned long, used as set *) longset* = SET; (* 64 bits *)
address* = LONGINT; (*SYSTEM.ADDRESS;*) address* = LONGINT; (* 64 bits *)
float* = REAL; float* = REAL; (* 32 bits *)
double* = LONGREAL; double* = LONGREAL; (* 64 bits *)
enum1* = int; enum1* = int;
(*
enum2* = int; enum2* = int;
enum4* = int; enum4* = int;
(* if your C compiler uses short enumerations, you'll have to replace the
declarations above with
enum1* = SHORTINT;
enum2* = INTEGER;
enum4* = LONGINT;
*) *)
FILE* = address; (* this is acually a replacement for `FILE*', i.e., for a pointer type *) FILE* = address; (* this is acually a replacement for `FILE*', i.e., for a pointer type *)
@ -63,7 +60,7 @@ TYPE (* some commonly used C array types *)
TYPE (* C string type, assignment compatible with character arrays and TYPE (* C string type, assignment compatible with character arrays and
string constants *) string constants *)
string* = POINTER (*[CSTRING]*) TO ARRAY OF char; string* = POINTER TO ARRAY OF char;
TYPE TYPE
Proc* = PROCEDURE; Proc* = PROCEDURE;

View file

@ -1,5 +1,8 @@
(* $Id: C.Mod,v 1.9 1999/10/03 11:46:01 ooc-devel Exp $ *) (* $Id: C.Mod,v 1.9 1999/10/03 11:46:01 ooc-devel Exp $ *)
MODULE oocC; MODULE oocC;
(* LP64 model *)
(* Basic data types for interfacing to C code. (* Basic data types for interfacing to C code.
Copyright (C) 1997-1998 Michael van Acken Copyright (C) 1997-1998 Michael van Acken
@ -18,8 +21,7 @@ MODULE oocC;
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*) *)
IMPORT IMPORT SYSTEM;
SYSTEM;
(* (*
These types are intended to be equivalent to their C counterparts. These types are intended to be equivalent to their C counterparts.
@ -28,26 +30,21 @@ Unix they should be fairly safe.
*) *)
TYPE TYPE
char* = CHAR; char* = CHAR; (* 8 bits *)
signedchar* = SHORTINT; (* signed char *) signedchar* = SHORTINT; (* 8 bits *)
shortint* = RECORD a,b : SYSTEM.BYTE END; (* 2 bytes on x64_64 *) (* short int *) shortint* = RECORD a,b: SYSTEM.BYTE END; (* 16 bits *)
int* = INTEGER; int* = INTEGER; (* 32 bits *)
set* = INTEGER;(*SET;*) (* unsigned int, used as set *) set* = INTEGER; (* 32 bits *)
longint* = LONGINT; (* long int *) longint* = LONGINT; (* 64 bits *)
longset* = SET; (*SYSTEM.SET64; *) (* unsigned long, used as set *) longset* = SET; (* 64 bits *)
address* = LONGINT; (*SYSTEM.ADDRESS;*) address* = LONGINT; (* 64 bits *)
float* = REAL; float* = REAL; (* 32 bits *)
double* = LONGREAL; double* = LONGREAL; (* 64 bits *)
enum1* = int; enum1* = int;
(*
enum2* = int; enum2* = int;
enum4* = int; enum4* = int;
(* if your C compiler uses short enumerations, you'll have to replace the
declarations above with
enum1* = SHORTINT;
enum2* = INTEGER;
enum4* = LONGINT;
*) *)
FILE* = address; (* this is acually a replacement for `FILE*', i.e., for a pointer type *) FILE* = address; (* this is acually a replacement for `FILE*', i.e., for a pointer type *)
@ -63,7 +60,7 @@ TYPE (* some commonly used C array types *)
TYPE (* C string type, assignment compatible with character arrays and TYPE (* C string type, assignment compatible with character arrays and
string constants *) string constants *)
string* = POINTER (*[CSTRING]*) TO ARRAY OF char; string* = POINTER TO ARRAY OF char;
TYPE TYPE
Proc* = PROCEDURE; Proc* = PROCEDURE;

View file

@ -162,6 +162,7 @@ BEGIN
ELSE ELSE
RETURN strWrongFormat; RETURN strWrongFormat;
END; END;
ELSE (* Ignore unrecognised class *)
END; END;
prev:=class; INC(index) prev:=class; INC(index)
END; END;

View file

@ -231,6 +231,7 @@ BEGIN
IF decExp THEN DEC(nexp) END; IF decExp THEN DEC(nexp) END;
END END
| Conv.invalid, Conv.terminator: EXIT | Conv.invalid, Conv.terminator: EXIT
ELSE (* Ignore unrecognised class *)
END; END;
prev:=class; INC(index) prev:=class; INC(index)
END; END;
@ -285,6 +286,7 @@ BEGIN
IF decExp THEN DEC(nexp) END; IF decExp THEN DEC(nexp) END;
END END
| Conv.invalid, Conv.terminator: EXIT | Conv.invalid, Conv.terminator: EXIT
ELSE (* Ignore unrecognised class *)
END; END;
prev:=class; INC(index) prev:=class; INC(index)
END; END;

View file

@ -182,6 +182,7 @@ BEGIN
IF decExp THEN DEC(nexp) END; IF decExp THEN DEC(nexp) END;
END END
| Conv.invalid, Conv.terminator: EXIT | Conv.invalid, Conv.terminator: EXIT
ELSE (* Ignore unrecognised class *)
END; END;
prev:=class; INC(index) prev:=class; INC(index)
END; END;
@ -254,6 +255,7 @@ BEGIN
IF decExp THEN DEC(nexp) END; IF decExp THEN DEC(nexp) END;
END END
| Conv.invalid, Conv.terminator: EXIT | Conv.invalid, Conv.terminator: EXIT
ELSE (* Ignore unrecognised class *)
END; END;
prev:=class; INC(index) prev:=class; INC(index)
END; END;

View file

@ -1,51 +1,43 @@
MODULE oocRts; (* module is written from scratch by noch to wrap around Unix.Mod and Args.Mod and provide compatibility for some ooc libraries *) MODULE oocRts; (* module is written from scratch by noch to wrap around Unix.Mod and Args.Mod and provide compatibility for some ooc libraries *)
IMPORT Args, Unix, Files, Strings := oocStrings(*, Console*); IMPORT Args, Platform, Files, Strings := oocStrings(*, Console*);
CONST CONST
pathSeperator* = "/"; pathSeperator* = "/";
VAR i : INTEGER; VAR
b : BOOLEAN; i: INTEGER;
str0 : ARRAY 128 OF CHAR; b: BOOLEAN;
str0: ARRAY 128 OF CHAR;
PROCEDURE System* (command : ARRAY OF CHAR) : INTEGER; PROCEDURE System* (command : ARRAY OF CHAR) : INTEGER;
(* Executes `command' as a shell command. Result is the value returned by (* Executes `command' as a shell command. Result is the value returned by
the libc `system' function. *) the libc `system' function. *)
BEGIN BEGIN RETURN Platform.System(command) END System;
RETURN Unix.System(command)
END System;
PROCEDURE GetEnv* (VAR var: ARRAY OF CHAR; name: ARRAY OF CHAR): BOOLEAN; PROCEDURE GetEnv* (VAR var: ARRAY OF CHAR; name: ARRAY OF CHAR): BOOLEAN;
(* If an environment variable `name' exists, copy its value into `var' and (* If an environment variable `name' exists, copy its value into `var' and
return TRUE. Otherwise return FALSE. *) return TRUE. Otherwise return FALSE. *)
BEGIN BEGIN RETURN Platform.getEnv(name, var) END GetEnv;
RETURN Args.getEnv(name, var);
END GetEnv;
PROCEDURE GetUserHome* (VAR home: ARRAY OF CHAR; user: ARRAY OF CHAR); PROCEDURE GetUserHome* (VAR home: ARRAY OF CHAR; user: ARRAY OF CHAR);
(* Get the user's home directory path (stored in /etc/passwd) (* Get the user's home directory path (stored in /etc/passwd)
or the current user's home directory if user="". *) or the current user's home directory if user="". *)
VAR VAR
f : Files.File; f : Files.File;
r : Files.Rider; r : Files.Rider;
str, str1 : ARRAY 1024 OF CHAR; str, str1 : ARRAY 1024 OF CHAR;
found, found1 : BOOLEAN; found, found1 : BOOLEAN;
p, p1, p2 : INTEGER; p, p1, p2 : INTEGER;
BEGIN BEGIN
f := Files.Old("/etc/passwd"); f := Files.Old("/etc/passwd");
Files.Set(r, f, 0); Files.Set(r, f, 0);
REPEAT REPEAT
Files.ReadLine(r, str); Files.ReadLine(r, str);
(* Console.String(str); Console.Ln;*)
(* Console.String(str); Console.Ln;*)
Strings.Extract(str, 0, SHORT(LEN(user)-1), str1); Strings.Extract(str, 0, SHORT(LEN(user)-1), str1);
(* Console.String(str1); Console.Ln;*) (* Console.String(str1); Console.Ln;*)
found := Strings.Equal(user, str1)
IF Strings.Equal(user, str1) THEN found := TRUE END;
UNTIL found OR r.eof; UNTIL found OR r.eof;
IF found THEN IF found THEN
@ -62,17 +54,14 @@ REPEAT
found1 := GetEnv(home, "HOME"); found1 := GetEnv(home, "HOME");
(*Console.String("not found"); Console.Ln; Console.String (home); Console.Ln;*) (*Console.String("not found"); Console.Ln; Console.String (home); Console.Ln;*)
END END
END GetUserHome; END GetUserHome;
BEGIN BEGIN
(* test *) (* test *)
(* (*
i := System("ls"); i := System("ls");
b := GetEnv(str0, "HOME"); b := GetEnv(str0, "HOME");
IF b THEN Console.String(str0); Console.Ln END; IF b THEN Console.String(str0); Console.Ln END;
GetUserHome(str0, "noch");
GetUserHome(str0, "noch"); *)
*)
END oocRts. END oocRts.

View file

@ -1,110 +1,15 @@
MODULE oocSysClock; MODULE oocSysClock;
IMPORT Unix; IMPORT SYSTEM, Platform;
CONST PROCEDURE CanGetClock*(): BOOLEAN; BEGIN RETURN TRUE END CanGetClock;
maxSecondParts* = 999; (* Most systems have just millisecond accuracy *)
zoneMin* = -780; (* time zone minimum minutes *)
zoneMax* = 720; (* time zone maximum minutes *)
localTime* = MIN(INTEGER); (* time zone is inactive & time is local *)
unknownZone* = localTime+1; (* time zone is unknown *)
(* daylight savings mode values *)
unknown* = -1; (* current daylight savings status is unknown *)
inactive* = 0; (* daylight savings adjustments are not in effect *)
active* = 1; (* daylight savings adjustments are being used *)
TYPE
(* The DateTime type is a system-independent time format whose fields
are defined as follows:
year > 0
month = 1 .. 12
day = 1 .. 31
hour = 0 .. 23
minute = 0 .. 59
second = 0 .. 59
fractions = 0 .. maxSecondParts
zone = -780 .. 720
*)
DateTime* =
RECORD
year*: INTEGER;
month*: SHORTINT;
day*: SHORTINT;
hour*: SHORTINT;
minute*: SHORTINT;
second*: SHORTINT;
summerTimeFlag*: SHORTINT; (* daylight savings mode (see above) *)
fractions*: INTEGER; (* parts of a second in milliseconds *)
zone*: INTEGER; (* Time zone differential factor which
is the number of minutes to add to
local time to obtain UTC or is set
to localTime when time zones are
inactive. *)
END;
PROCEDURE CanGetClock*(): BOOLEAN;
(* Returns TRUE if a system clock can be read; FALSE otherwise. *)
VAR timeval: Unix.Timeval; timezone: Unix.Timezone;
l : LONGINT;
BEGIN
l := Unix.Gettimeofday(timeval, timezone);
IF l = 0 THEN RETURN TRUE ELSE RETURN FALSE END
END CanGetClock;
(*
PROCEDURE CanSetClock*(): BOOLEAN;
(* Returns TRUE if a system clock can be set; FALSE otherwise. *)
*)
(*
PROCEDURE IsValidDateTime* (d: DateTime): BOOLEAN;
(* Returns TRUE if the value of `d' represents a valid date and time;
FALSE otherwise. *)
*)
(*
PROCEDURE SetClock* (userData: DateTime);
(* If possible, sets the system clock to the values of `userData'. *)
*)
(*
PROCEDURE MakeLocalTime * (VAR c: DateTime);
(* Fill in the daylight savings mode and time zone for calendar date `c'.
The fields `zone' and `summerTimeFlag' given in `c' are ignored, assuming
that the rest of the record describes a local time.
Note 1: On most Unix systems the time zone information is only available for
dates falling within approx. 1 Jan 1902 to 31 Dec 2037. Outside this range
the field `zone' will be set to the unspecified `localTime' value (see
above), and `summerTimeFlag' will be set to `unknown'.
Note 2: The time zone information might not be fully accurate for past (and
future) years that apply different DST rules than the current year.
Usually the current set of rules is used for _all_ years between 1902 and
2037.
Note 3: With DST there is one hour in the year that happens twice: the
hour after which the clock is turned back for a full hour. It is undefined
which time zone will be selected for dates refering to this hour, i.e.
whether DST or normal time zone will be chosen. *)
*)
PROCEDURE GetTimeOfDay* (VAR sec, usec: LONGINT): LONGINT; PROCEDURE GetTimeOfDay* (VAR sec, usec: LONGINT): LONGINT;
(* PRIVAT. Don't use this. Take Time.GetTime instead. (* PRIVAT. Don't use this. Take Time.GetTime instead.
Equivalent to the C function `gettimeofday'. The return value is `0' on Equivalent to the C function `gettimeofday'. The return value is `0' on
success and `-1' on failure; in the latter case `sec' and `usec' are set to success and `-1' on failure; in the latter case `sec' and `usec' are set to
zero. *) zero. *)
VAR timeval: Unix.Timeval; timezone: Unix.Timezone;
l : LONGINT;
BEGIN BEGIN
l := Unix.Gettimeofday (timeval, timezone); Platform.GetTimeOfDay(sec, usec); RETURN 0;
IF l = 0 THEN
sec := timeval.sec;
usec := timeval.usec;
ELSE
sec := 0;
usec := 0;
END;
RETURN l;
END GetTimeOfDay; END GetTimeOfDay;
END oocSysClock. END oocSysClock.

View file

@ -0,0 +1,23 @@
MODULE oocwrapperlibc;
IMPORT SYSTEM, Platform;
PROCEDURE -includeStdio() "#include <stdio.h>";
PROCEDURE system*(cmd : ARRAY OF CHAR);
VAR r: INTEGER;
BEGIN
r := Platform.System(cmd)
END system;
PROCEDURE -sprntf(s, t0, t1, t2: ARRAY OF CHAR): INTEGER
"sprintf((char*)s, (char*)t0, (char*)t1, (char*)t2)";
PROCEDURE sprintf*(VAR s: ARRAY OF CHAR; template0: ARRAY OF CHAR; template1: ARRAY OF CHAR; template2: ARRAY OF CHAR);
VAR r : INTEGER;
BEGIN
r := sprntf(s, template0, template1, template2);
END sprintf;
END oocwrapperlibc.

View file

@ -124,7 +124,7 @@ VAR
positive: BOOLEAN; positive: BOOLEAN;
prev, class: Conv.ScanClass; prev, class: Conv.ScanClass;
PROCEDURE LessOrEqual (VAR high: ARRAY OF CHAR; start, end: INTEGER): BOOLEAN; PROCEDURE LessOrEqual (VAR high: ARRAY OF CHAR; start, end: INTEGER): BOOLEAN;
VAR VAR
i: INTEGER; i: INTEGER;
BEGIN (* pre: index-start = maxDigits *) BEGIN (* pre: index-start = maxDigits *)
@ -176,6 +176,7 @@ BEGIN
ELSE ELSE
RETURN strWrongFormat; RETURN strWrongFormat;
END; END;
ELSE (* Ignore unrecognised class *)
END; END;
prev:=class; INC(index) prev:=class; INC(index)
END; END;

View file

@ -8,6 +8,7 @@ CONST
XPROTOCOL* = 11; (* current protocol version *) XPROTOCOL* = 11; (* current protocol version *)
XPROTOCOLREVISION* = 0; (* current minor version *) XPROTOCOLREVISION* = 0; (* current minor version *)
TYPE TYPE
ulongmask* = C.longset; ulongmask* = C.longset;
(*uintmask* = C.set;*) (*uintmask* = C.set;*)
@ -1950,6 +1951,13 @@ TYPE
XErrorHandler* = PROCEDURE (display: DisplayPtr; errorevent: XErrorEventPtr): C.int; XErrorHandler* = PROCEDURE (display: DisplayPtr; errorevent: XErrorEventPtr): C.int;
XIOErrorHandler* = PROCEDURE (display: DisplayPtr); XIOErrorHandler* = PROCEDURE (display: DisplayPtr);
XConnectionWatchProc* = PROCEDURE (dpy: DisplayPtr; clientdate: XPointer; fd: C.int; opening: Bool; watchdata: XPointerPtr1d); XConnectionWatchProc* = PROCEDURE (dpy: DisplayPtr; clientdate: XPointer; fd: C.int; opening: Bool; watchdata: XPointerPtr1d);
PROCEDURE -aincludexlib "#include <X11/Xlib.h>";
PROCEDURE -aincludexutil "#include <X11/Xutil.h>";
PROCEDURE -aincludexresource "#include <X11/Xresource.h>";
(* (*
PROCEDURE XLoadQueryFont* ( PROCEDURE XLoadQueryFont* (
display: DisplayPtr; display: DisplayPtr;
@ -1987,7 +1995,7 @@ PROCEDURE -XCreateImage* (
height: C.int; height: C.int;
bitmapPad: C.int; bitmapPad: C.int;
bytesPerLine: C.int): XImagePtr bytesPerLine: C.int): XImagePtr
"(long)XCreateImage(display, visual, depth, format, offset, data, width, height, bitmapPad, bytesPerLine)"; "(oocX11_XImagePtr)XCreateImage((struct _XDisplay*)display, (Visual*)visual, depth, format, offset, (char*)data, width, height, bitmapPad, bytesPerLine)";
(* (*
PROCEDURE XInitImage* ( PROCEDURE XInitImage* (
image: XImagePtr): Status; image: XImagePtr): Status;
@ -2017,8 +2025,7 @@ PROCEDURE XGetSubImage* (
* X function declarations. * X function declarations.
*) *)
*) *)
PROCEDURE -XOpenDisplay* (name: ARRAY OF C.char): DisplayPtr PROCEDURE -XOpenDisplay* (name: ARRAY OF C.char): DisplayPtr "(oocX11_DisplayPtr)XOpenDisplay((char*)name)";
"(long)XOpenDisplay(name)";
PROCEDURE OpenDisplay* (name: ARRAY OF C.char): DisplayPtr; PROCEDURE OpenDisplay* (name: ARRAY OF C.char): DisplayPtr;
BEGIN BEGIN
@ -2101,7 +2108,7 @@ PROCEDURE -XCreateGC* (
d: Drawable; d: Drawable;
valueMask: ulongmask; valueMask: ulongmask;
VAR values: XGCValues): GC VAR values: XGCValues): GC
"(long)XCreateGC(display, d, valueMask, values)"; "(oocX11_GC)XCreateGC((struct _XDisplay*)display, d, valueMask, (XGCValues *)values)";
(* (*
PROCEDURE XGContextFromGC* ( PROCEDURE XGContextFromGC* (
gc: GC): GContext; gc: GC): GContext;
@ -2140,7 +2147,7 @@ PROCEDURE -XCreateSimpleWindow* (
borderWidth: C.int; borderWidth: C.int;
border: C.longint; border: C.longint;
background: C.longint): Window background: C.longint): Window
"(long)XCreateSimpleWindow(display, parent, x, y, width, height, borderWidth, border, background)"; "(long)XCreateSimpleWindow((struct _XDisplay*)display, parent, x, y, width, height, borderWidth, border, background)";
(* (*
PROCEDURE XGetSelectionOwner* ( PROCEDURE XGetSelectionOwner* (
display: DisplayPtr; display: DisplayPtr;
@ -2240,7 +2247,7 @@ PROCEDURE XEHeadOfExtensionList* (
PROCEDURE -XRootWindow* ( PROCEDURE -XRootWindow* (
display: DisplayPtr; display: DisplayPtr;
screen: C.int): Window screen: C.int): Window
"(long)XRootWindow(display, screen)"; "(long)XRootWindow((struct _XDisplay*)display, screen)";
(* (*
PROCEDURE XDefaultRootWindow* ( PROCEDURE XDefaultRootWindow* (
display: DisplayPtr): Window; display: DisplayPtr): Window;
@ -2250,7 +2257,7 @@ PROCEDURE XRootWindowOfScreen* (
PROCEDURE -XDefaultVisual* ( PROCEDURE -XDefaultVisual* (
display: DisplayPtr; display: DisplayPtr;
screen: C.int): VisualPtr screen: C.int): VisualPtr
"(long)XDefaultVisual(display, screen)"; "(oocX11_VisualPtr)XDefaultVisual((struct _XDisplay*)display, screen)";
(* (*
PROCEDURE XDefaultVisualOfScreen* ( PROCEDURE XDefaultVisualOfScreen* (
screen: ScreenPtr): VisualPtr; screen: ScreenPtr): VisualPtr;
@ -2263,12 +2270,12 @@ PROCEDURE XDefaultGCOfScreen* (
PROCEDURE -XBlackPixel* ( PROCEDURE -XBlackPixel* (
display: DisplayPtr; display: DisplayPtr;
screen: C.int): C.longint screen: C.int): C.longint
"(long)XBlackPixel(display, screen)"; "(long)XBlackPixel((struct _XDisplay*)display, screen)";
PROCEDURE -XWhitePixel* ( PROCEDURE -XWhitePixel* (
display: DisplayPtr; display: DisplayPtr;
screen: C.int): C.longint screen: C.int): C.longint
"(long)XWhitePixel(display, screen)"; "(long)XWhitePixel((struct _XDisplay*)display, screen)";
(* (*
PROCEDURE XAllPlanes* (): C.longint; PROCEDURE XAllPlanes* (): C.longint;
PROCEDURE XBlackPixelOfScreen* ( PROCEDURE XBlackPixelOfScreen* (
@ -2296,7 +2303,7 @@ PROCEDURE XScreenOfDisplay* (
*) *)
PROCEDURE -XDefaultScreenOfDisplay* ( PROCEDURE -XDefaultScreenOfDisplay* (
display: DisplayPtr): ScreenPtr display: DisplayPtr): ScreenPtr
"(long)XDefaultScreen(display)"; "(long)XDefaultScreen((struct _XDisplay*)display)";
(* (*
PROCEDURE XEventMaskOfScreen* ( PROCEDURE XEventMaskOfScreen* (
screen: ScreenPtr): C.longint; screen: ScreenPtr): C.longint;
@ -2523,7 +2530,7 @@ PROCEDURE XClearWindow* (
PROCEDURE -XCloseDisplay* ( PROCEDURE -XCloseDisplay* (
display: DisplayPtr) display: DisplayPtr)
"XCloseDisplay(display)"; "XCloseDisplay((struct _XDisplay*)display)";
(* (*
@ -2577,7 +2584,7 @@ PROCEDURE XDefaultDepthOfScreen* (
*) *)
PROCEDURE -XDefaultScreen* ( PROCEDURE -XDefaultScreen* (
display: DisplayPtr): C.int display: DisplayPtr): C.int
"(int)XDefaultScreen(display)"; "(int)XDefaultScreen((struct _XDisplay*)display)";
(* (*
PROCEDURE XDefineCursor* ( PROCEDURE XDefineCursor* (
display: DisplayPtr; display: DisplayPtr;
@ -2591,11 +2598,11 @@ PROCEDURE XDeleteProperty* (
PROCEDURE -XDestroyWindow* ( PROCEDURE -XDestroyWindow* (
display: DisplayPtr; display: DisplayPtr;
w: Window) w: Window)
"XDestroyWindow(display, w)"; "XDestroyWindow((struct _XDisplay*)display, w)";
PROCEDURE -XDestroyImage* (image : XImagePtr) PROCEDURE -XDestroyImage* (image : XImagePtr)
"XDestroyImage(image)"; "XDestroyImage((struct _XDisplay*)image)";
(* (*
PROCEDURE XDestroySubwindows* ( PROCEDURE XDestroySubwindows* (
@ -2614,7 +2621,7 @@ PROCEDURE XDisplayCells* (
PROCEDURE -XDisplayHeight* ( PROCEDURE -XDisplayHeight* (
display: DisplayPtr; display: DisplayPtr;
screen: C.int): C.int screen: C.int): C.int
"(int)XDisplayHeight(display, screen)"; "(int)XDisplayHeight((struct _XDisplay*)display, screen)";
(* (*
PROCEDURE XDisplayHeightMM* ( PROCEDURE XDisplayHeightMM* (
display: DisplayPtr; display: DisplayPtr;
@ -2630,7 +2637,7 @@ PROCEDURE XDisplayPlanes* (
PROCEDURE -XDisplayWidth* ( PROCEDURE -XDisplayWidth* (
display: DisplayPtr; display: DisplayPtr;
screennumber: C.int): C.int screennumber: C.int): C.int
"(int)XDisplayWidth(display, screen)"; "(int)XDisplayWidth((struct _XDisplay*)display, screen)";
(* (*
PROCEDURE XDisplayWidthMM* ( PROCEDURE XDisplayWidthMM* (
display: DisplayPtr; display: DisplayPtr;
@ -2690,7 +2697,7 @@ PROCEDURE -XDrawPoint* (
gc: GC; gc: GC;
x: C.int; x: C.int;
y: C.int) y: C.int)
"XDrawPoint(display, d, gc, x, y)"; "XDrawPoint((struct _XDisplay*)display, d, (struct _XGC*)gc, x, y)";
(* (*
PROCEDURE XDrawPoints* ( PROCEDURE XDrawPoints* (
display: DisplayPtr; display: DisplayPtr;
@ -2758,7 +2765,7 @@ PROCEDURE XEnableAccessControl* (
PROCEDURE -XEventsQueued* ( PROCEDURE -XEventsQueued* (
display: DisplayPtr; display: DisplayPtr;
mode: C.int): C.int mode: C.int): C.int
"(int)XEventsQueued(display, mode)"; "(int)XEventsQueued((struct _XDisplay*)display, mode)";
(* (*
PROCEDURE XFetchName* ( PROCEDURE XFetchName* (
display: DisplayPtr; display: DisplayPtr;
@ -2797,7 +2804,7 @@ PROCEDURE -XFillRectangle* (
y: C.int; y: C.int;
width: C.int; width: C.int;
height: C.int) height: C.int)
"XFillRectangle(display, d, gc, x, y, width, height)"; "XFillRectangle((struct _XDisplay*)display, d, (struct _XGC*)gc, x, y, width, height)";
(* (*
PROCEDURE XFillRectangles* ( PROCEDURE XFillRectangles* (
display: DisplayPtr; display: DisplayPtr;
@ -2808,7 +2815,7 @@ PROCEDURE XFillRectangles* (
*) *)
PROCEDURE -XFlush* ( PROCEDURE -XFlush* (
display: DisplayPtr) display: DisplayPtr)
"XFlush(display)"; "XFlush((struct _XDisplay*)display)";
(* (*
PROCEDURE XForceScreenSaver* ( PROCEDURE XForceScreenSaver* (
display: DisplayPtr; display: DisplayPtr;
@ -3016,13 +3023,13 @@ PROCEDURE XMapSubwindows* (
PROCEDURE -XMapWindow* ( PROCEDURE -XMapWindow* (
display: DisplayPtr; display: DisplayPtr;
w: Window) w: Window)
"XMapWindow(display, w)"; "XMapWindow((struct _XDisplay*)display, w)";
PROCEDURE -XMaskEvent* ( PROCEDURE -XMaskEvent* (
display: DisplayPtr; display: DisplayPtr;
mask: ulongmask; mask: ulongmask;
VAR event: XEvent) VAR event: XEvent)
"XMaskEvent(display, mask, event)"; "XMaskEvent((struct _XDisplay*)display, mask, (union _XEvent*)event)";
(* (*
PROCEDURE XMaxCmapsOfScreen* ( PROCEDURE XMaxCmapsOfScreen* (
@ -3045,7 +3052,7 @@ PROCEDURE XMoveWindow* (
PROCEDURE -XNextEvent* ( PROCEDURE -XNextEvent* (
display: DisplayPtr; display: DisplayPtr;
VAR event: XEvent) VAR event: XEvent)
"XNextEvent(display, event)"; "XNextEvent((struct _XDisplay*)display, (union _XEvent*)event)";
(* (*
PROCEDURE XNoOp* ( PROCEDURE XNoOp* (
display: DisplayPtr); display: DisplayPtr);
@ -3091,7 +3098,7 @@ PROCEDURE -XPutImage* (
dstY: C.int; dstY: C.int;
width: C.int; width: C.int;
height: C.int) height: C.int)
"XPutImage(display, d, gc, image, srcX, srcY, dstX, dstY, width, height)"; "XPutImage((struct _XDisplay*)display, d, (struct _XGC*)gc, (struct _XImage*)image, srcX, srcY, dstX, dstY, width, height)";
(* (*
PROCEDURE XQLength* ( PROCEDURE XQLength* (
display: DisplayPtr): C.int; display: DisplayPtr): C.int;
@ -3254,7 +3261,7 @@ PROCEDURE -XSelectInput* (
display: DisplayPtr; display: DisplayPtr;
window: Window; window: Window;
eventMask: ulongmask) eventMask: ulongmask)
"XSelectInput(display, window, eventMask)"; "XSelectInput((struct _XDisplay*)display, window, (long)eventMask)";
(* (*
PROCEDURE XSendEvent* ( PROCEDURE XSendEvent* (
display: DisplayPtr; display: DisplayPtr;
@ -3441,7 +3448,7 @@ PROCEDURE -XStoreName* (
display: DisplayPtr; display: DisplayPtr;
window: Window; window: Window;
name: ARRAY OF C.char) name: ARRAY OF C.char)
"XStoreName(display, window, name)"; "XStoreName((struct _XDisplay*)display, window, (char*)name)";
(* (*
PROCEDURE XStoreNamedColor* ( PROCEDURE XStoreNamedColor* (
display: DisplayPtr; display: DisplayPtr;

View file

@ -34,6 +34,12 @@ VAR
map: POINTER TO ARRAY OF ARRAY OF SET; map: POINTER TO ARRAY OF ARRAY OF SET;
PROCEDURE -aincludexlib "#include <X11/Xlib.h>";
PROCEDURE -aincludexutil "#include <X11/Xutil.h>";
PROCEDURE -aincludexresource "#include <X11/Xresource.h>";
PROCEDURE Error (msg: ARRAY OF CHAR); PROCEDURE Error (msg: ARRAY OF CHAR);
BEGIN BEGIN
Out.String ("Error: "); Out.String ("Error: ");
@ -70,6 +76,7 @@ PROCEDURE Dot* (x, y, mode: INTEGER);
X11.XDrawPoint (display, window, fg, x, H-1-y) X11.XDrawPoint (display, window, fg, x, H-1-y)
| erase: | erase:
X11.XDrawPoint (display, window, bg, x, H-1-y) X11.XDrawPoint (display, window, bg, x, H-1-y)
ELSE
END; END;
X11.XFlush (display); X11.XFlush (display);
END END
@ -137,42 +144,41 @@ PROCEDURE Open*;
VAR VAR
screen: C.int; screen: C.int;
parent: X11.Window; parent: X11.Window;
bgColor, fgColor: C.longint; bgColor: C.longint;
fgColor: C.longint;
gcValue: X11.XGCValues; gcValue: X11.XGCValues;
event: X11.XEvent; event: X11.XEvent;
x, y: INTEGER; x, y: INTEGER;
tmpstr : string; tmpstr: string;
(*tmpint : INTEGER;*)
scrn : C.int; scrn : C.int;
vis : X11.VisualPtr; vis : X11.VisualPtr;
BEGIN BEGIN
IF ~initialized THEN IF ~initialized THEN
initialized := TRUE; initialized := TRUE;
tmpstr[0] := 0X; tmpstr[0] := 0X;
(*display := X11.XOpenDisplay (NIL);*) (*display := X11.XOpenDisplay (NIL);*)
display := X11.XOpenDisplay (tmpstr); display := X11.XOpenDisplay(tmpstr);
(*display := X11.OpenDisplay (NIL);*) (*display := X11.OpenDisplay (NIL);*)
IF (display = NIL) THEN IF (display = NIL) THEN
Error ("Couldn't open display") Error("Couldn't open display")
ELSE ELSE
screen := X11.XDefaultScreen (display); screen := X11.XDefaultScreen(display);
X := 0; Y := 0; X := 0; Y := 0;
W := SHORT (X11.XDisplayWidth (display, screen)); W := SHORT (X11.XDisplayWidth (display, screen));
H := SHORT (X11.XDisplayHeight (display, screen)); H := SHORT (X11.XDisplayHeight(display, screen));
(* adjust ratio W:H to 3:4 [for no paritcular reason] *) (* adjust ratio W:H to 3:4 [for no paritcular reason] *)
IF (W > 3*H DIV 4) THEN IF (W > 3*H DIV 4) THEN
W := 3*H DIV 4 W := 3*H DIV 4
END; END;
parent := X11.XRootWindow (display, screen); parent := X11.XRootWindow(display, screen);
fgColor := X11.XBlackPixel (display, screen); fgColor := X11.XBlackPixel(display, screen);
bgColor := X11.XWhitePixel (display, screen); bgColor := X11.XWhitePixel(display, screen);
window := X11.XCreateSimpleWindow (display, parent, 0, 0, window := X11.XCreateSimpleWindow(display, parent, 0, 0,
W, H, 0, 0, bgColor); W, H, 0, 0, bgColor);
X11.XStoreName (display, window, "XYplane"); X11.XStoreName(display, window, "XYplane");
X11.XSelectInput (display, window, X11.KeyPressMask+X11.ExposureMask); X11.XSelectInput(display, window, X11.KeyPressMask+X11.ExposureMask);
X11.XMapWindow (display, window); X11.XMapWindow(display, window);
X11.XFlush (display); X11.XFlush (display);
(*tmpint := W + ((*sizeSet*)32-1); (*tmpint := W + ((*sizeSet*)32-1);
tmpint := tmpint DIV 32(*sizeSet*);*) tmpint := tmpint DIV 32(*sizeSet*);*)
@ -184,16 +190,16 @@ PROCEDURE Open*;
END END
END; END;
scrn := X11.XDefaultScreen (display); scrn := X11.XDefaultScreen(display);
vis := X11.XDefaultVisual (display, scrn); vis := X11.XDefaultVisual(display, scrn);
image := X11.XCreateImage (display, image := X11.XCreateImage (display,
(*X11.XDefaultVisual (display, X11.XDefaultScreen (display)),*) (*X11.XDefaultVisual (display, X11.XDefaultScreen (display)),*)
vis, vis,
(*1, X11.XYBitmap, 0, SYSTEM.ADR (map^), W, H, sizeSet, 0);*) (*1, X11.XYBitmap, 0, SYSTEM.ADR (map^), W, H, sizeSet, 0);*)
1, X11.ZPixmap, 0, SYSTEM.ADR (map^), W, H, (*sizeSet*)32, 0); 1, X11.ZPixmap, 0, SYSTEM.VAL(C.address,SYSTEM.ADR(map^)), W, H, (*sizeSet*)32, 0);
(* wait until the window manager gives its ok to draw things *) (* wait until the window manager gives its ok to draw things *)
X11.XMaskEvent (display, X11.ExposureMask, event); X11.XMaskEvent(display, X11.ExposureMask, event);
(* create graphic context to draw resp. erase a point *) (* create graphic context to draw resp. erase a point *)
gcValue. foreground := fgColor; gcValue. foreground := fgColor;
@ -208,7 +214,7 @@ PROCEDURE Open*;
END END
END Open; END Open;
PROCEDURE Close*; PROCEDURE Close*;
BEGIN BEGIN
(* X11.XDestroyImage(image); (* X11.XDestroyImage(image);

View file

@ -359,7 +359,7 @@ PROCEDURE -XLookupString* (
VAR keysymReturn: X.KeySym; VAR keysymReturn: X.KeySym;
(*VAR statusInOut(*[NILCOMPAT]*): XComposeStatus): C.int*) (*VAR statusInOut(*[NILCOMPAT]*): XComposeStatus): C.int*)
VAR statusInOut(*[NILCOMPAT]*): C.longint): C.int VAR statusInOut(*[NILCOMPAT]*): C.longint): C.int
"(int)XLookupString(eventStruct, bufferReturn, bytesBuffer, keysymReturn, statusInOut)"; "(int)XLookupString((XKeyEvent*)eventStruct, bufferReturn, bytesBuffer, (KeySym*)keysymReturn, (XComposeStatus*)statusInOut)";
(* (*
PROCEDURE XMatchVisualInfo* ( PROCEDURE XMatchVisualInfo* (
display: X.DisplayPtr; display: X.DisplayPtr;

View file

@ -1105,6 +1105,7 @@ MODULE ethBTrees; (** portable *) (* ejz, *)
CASE T.class OF CASE T.class OF
LInt: WriteLIntPage(T, p(LIntPage)) LInt: WriteLIntPage(T, p(LIntPage))
|Str: WriteStrPage(T, p(StrPage)) |Str: WriteStrPage(T, p(StrPage))
ELSE
END END
END; END;
p := p.next p := p.next

View file

@ -3,7 +3,7 @@ Refer to the "General ETH Oberon System Source License" contract available at: h
MODULE ethRandomNumbers; (** portable *) MODULE ethRandomNumbers; (** portable *)
(* Random Number Generator, page 12 *) (* Random Number Generator, page 12 *)
IMPORT Math := oocOakMath, Oberon := Kernel, SYSTEM; IMPORT Math := oocOakMath, Oberon := Platform, SYSTEM;
VAR Z, t, d: LONGINT; VAR Z, t, d: LONGINT;

View file

@ -10,7 +10,7 @@ Implemented by Bernd Moesli, Seminar for Applied Mathematics,
Swiss Federal Institute of Technology Zrich. Swiss Federal Institute of Technology Zrich.
*) *)
IMPORT SYSTEM; IMPORT SYSTEM, Platform, Configuration;
(* Bernd Moesli (* Bernd Moesli
Seminar for Applied Mathematics Seminar for Applied Mathematics
@ -33,6 +33,7 @@ IMPORT SYSTEM;
7.11.1995 jt: dynamic endianess test 7.11.1995 jt: dynamic endianess test
22.01.97 pjm: NaN stuff (using quiet NaNs only to avoid traps) 22.01.97 pjm: NaN stuff (using quiet NaNs only to avoid traps)
05.01.98 prk: NaN with INF support 05.01.98 prk: NaN with INF support
17.02.16 dcb: Adapt for 32 bit INTEGER and 64 bit LONGINT.
*) *)
VAR VAR
@ -45,55 +46,109 @@ VAR
(** Returns the shifted binary exponent (0 <= e < 256). *) (** Returns the shifted binary exponent (0 <= e < 256). *)
PROCEDURE Expo* (x: REAL): LONGINT; PROCEDURE Expo* (x: REAL): LONGINT;
BEGIN BEGIN
RETURN ASH(SYSTEM.VAL(LONGINT, x), -23) MOD 256 IF SIZE(INTEGER) = 4 THEN
RETURN SHORT(ASH(SYSTEM.VAL(INTEGER, x), -23)) MOD 256
ELSIF SIZE(LONGINT) = 4 THEN
RETURN SHORT(ASH(SYSTEM.VAL(LONGINT, x), -23)) MOD 256
ELSE Platform.Halt(-15);
END
END Expo; END Expo;
(** Returns the shifted binary exponent (0 <= e < 2048). *) (** Returns the shifted binary exponent (0 <= e < 2048). *)
PROCEDURE ExpoL* (x: LONGREAL): LONGINT; PROCEDURE ExpoL* (x: LONGREAL): LONGINT;
VAR i: LONGINT; VAR i: LONGINT;
BEGIN BEGIN
IF SIZE(LONGINT) = 8 THEN
RETURN ASH(SYSTEM.VAL(LONGINT, x), -50) MOD 256
ELSE
SYSTEM.GET(SYSTEM.ADR(x) + H, i); RETURN ASH(i, -20) MOD 2048 SYSTEM.GET(SYSTEM.ADR(x) + H, i); RETURN ASH(i, -20) MOD 2048
END
END ExpoL; END ExpoL;
(** Sets the shifted binary exponent. *) (** Sets the shifted binary exponent. *)
PROCEDURE SetExpo* (e: LONGINT; VAR x: REAL); PROCEDURE SetExpo* (e: INTEGER; VAR x: REAL);
VAR i: LONGINT; VAR i: INTEGER; l: LONGINT;
BEGIN BEGIN
IF SIZE(LONGINT) = 4 THEN
SYSTEM.GET(SYSTEM.ADR(x), l);
l := ASH(ASH(ASH(l, -31), 8) + e MOD 256, 23) + l MOD ASH(1, 23);
SYSTEM.PUT(SYSTEM.ADR(x), l)
ELSIF SIZE(INTEGER) = 4 THEN
SYSTEM.GET(SYSTEM.ADR(x), i); SYSTEM.GET(SYSTEM.ADR(x), i);
i:= ASH(ASH(ASH(i, -31), 8) + e MOD 256, 23) + i MOD ASH(1, 23); i := SHORT(ASH(ASH(ASH(i, -31), 8) + e MOD 256, 23) + i MOD ASH(1, 23));
SYSTEM.PUT(SYSTEM.ADR(x), i) SYSTEM.PUT(SYSTEM.ADR(x), i)
ELSE Platform.Halt(-15)
END
END SetExpo; END SetExpo;
(** Sets the shifted binary exponent. *) (** Sets the shifted binary exponent. *)
PROCEDURE SetExpoL* (e: LONGINT; VAR x: LONGREAL); PROCEDURE SetExpoL* (e: LONGINT; VAR x: LONGREAL);
VAR i: LONGINT; VAR i: INTEGER; l: LONGINT;
BEGIN BEGIN
IF SIZE(LONGINT) = 4 THEN
SYSTEM.GET(SYSTEM.ADR(x) + H, l);
l := ASH(ASH(ASH(l, -31), 11) + e MOD 2048, 20) + l MOD ASH(1, 20);
SYSTEM.PUT(SYSTEM.ADR(x) + H, l)
ELSIF SIZE(INTEGER) = 4 THEN
SYSTEM.GET(SYSTEM.ADR(x) + H, i); SYSTEM.GET(SYSTEM.ADR(x) + H, i);
i:= ASH(ASH(ASH(i, -31), 11) + e MOD 2048, 20) + i MOD ASH(1, 20); i := SHORT(ASH(ASH(ASH(i, -31), 11) + e MOD 2048, 20) + i MOD ASH(1, 20));
SYSTEM.PUT(SYSTEM.ADR(x) + H, i) SYSTEM.PUT(SYSTEM.ADR(x) + H, i)
ELSE Platform.Halt(-15)
END
END SetExpoL; END SetExpoL;
(** Convert hexadecimal to REAL. *) (** Convert hexadecimal to REAL. *)
PROCEDURE Real* (h: LONGINT): REAL; PROCEDURE Real* (h: LONGINT): REAL;
VAR x: REAL; VAR x: REAL;
BEGIN SYSTEM.PUT(SYSTEM.ADR(x), h); RETURN x BEGIN
IF SIZE(LONGINT) = 4 THEN
SYSTEM.PUT(SYSTEM.ADR(x), h)
ELSIF SIZE(INTEGER) = 4 THEN
SYSTEM.PUT(SYSTEM.ADR(x), SYSTEM.VAL(INTEGER, h))
ELSE Platform.Halt(-15)
END;
RETURN x
END Real; END Real;
(** Convert hexadecimal to LONGREAL. h and l are the high and low parts.*) (** Convert hexadecimal to LONGREAL. h and l are the high and low parts.*)
PROCEDURE RealL* (h, l: LONGINT): LONGREAL; PROCEDURE RealL* (h, l: LONGINT): LONGREAL;
VAR x: LONGREAL; VAR x: LONGREAL;
BEGIN SYSTEM.PUT(SYSTEM.ADR(x) + H, h); SYSTEM.PUT(SYSTEM.ADR(x) + L, l); RETURN x BEGIN
IF SIZE(LONGINT) = 4 THEN
SYSTEM.PUT(SYSTEM.ADR(x) + H, h);
SYSTEM.PUT(SYSTEM.ADR(x) + L, l)
ELSIF SIZE(INTEGER) = 4 THEN
SYSTEM.PUT(SYSTEM.ADR(x) + H, SYSTEM.VAL(INTEGER, h));
SYSTEM.PUT(SYSTEM.ADR(x) + L, SYSTEM.VAL(INTEGER, l))
ELSE Platform.Halt(-15)
END;
RETURN x
END RealL; END RealL;
(** Convert REAL to hexadecimal. *) (** Convert REAL to hexadecimal. *)
PROCEDURE Int* (x: REAL): LONGINT; PROCEDURE Int* (x: REAL): LONGINT;
VAR i: LONGINT; VAR i: INTEGER; l: LONGINT;
BEGIN SYSTEM.PUT(SYSTEM.ADR(i), x); RETURN i BEGIN
IF SIZE(LONGINT) = 4 THEN
SYSTEM.PUT(SYSTEM.ADR(l), x); RETURN l
ELSIF SIZE(INTEGER) = 4 THEN
SYSTEM.PUT(SYSTEM.ADR(i), x); RETURN i
ELSE Platform.Halt(-15)
END
END Int; END Int;
(** Convert LONGREAL to hexadecimal. h and l are the high and low parts. *) (** Convert LONGREAL to hexadecimal. h and l are the high and low parts. *)
PROCEDURE IntL* (x: LONGREAL; VAR h, l: LONGINT); PROCEDURE IntL* (x: LONGREAL; VAR h, l: LONGINT);
BEGIN SYSTEM.GET(SYSTEM.ADR(x) + H, h); SYSTEM.GET(SYSTEM.ADR(x) + L, l) VAR i: INTEGER;
BEGIN
IF SIZE(LONGINT) = 4 THEN
SYSTEM.GET(SYSTEM.ADR(x) + H, h);
SYSTEM.GET(SYSTEM.ADR(x) + L, l)
ELSIF SIZE(INTEGER) = 4 THEN
SYSTEM.GET(SYSTEM.ADR(x) + H, i); h := i;
SYSTEM.GET(SYSTEM.ADR(x) + L, i); l := i
ELSE Platform.Halt(-15)
END
END IntL; END IntL;
(** Returns 10^e (e <= 308, 308 < e delivers IEEE-code +INF). *) (** Returns 10^e (e <= 308, 308 < e delivers IEEE-code +INF). *)
@ -112,8 +167,9 @@ END Ten;
(** Returns the NaN code (0 <= c < 8399608) or -1 if not NaN/Infinite. *) (** Returns the NaN code (0 <= c < 8399608) or -1 if not NaN/Infinite. *)
PROCEDURE NaNCode* (x: REAL): LONGINT; PROCEDURE NaNCode* (x: REAL): LONGINT;
VAR e: LONGINT;
BEGIN BEGIN
IF ASH(SYSTEM.VAL(LONGINT, x), -23) MOD 256 = 255 THEN (* Infinite or NaN *) IF Expo(x) = 255 THEN (* Infinite or NaN *)
RETURN SYSTEM.VAL(LONGINT, x) MOD 800000H (* lowest 23 bits *) RETURN SYSTEM.VAL(LONGINT, x) MOD 800000H (* lowest 23 bits *)
ELSE ELSE
RETURN -1 RETURN -1
@ -123,7 +179,7 @@ END NaNCode;
(** Returns the NaN code (0 <= h < 1048576, MIN(LONGINT) <= l <= MAX(LONGINT)) or (-1,-1) if not NaN/Infinite. *) (** Returns the NaN code (0 <= h < 1048576, MIN(LONGINT) <= l <= MAX(LONGINT)) or (-1,-1) if not NaN/Infinite. *)
PROCEDURE NaNCodeL* (x: LONGREAL; VAR h, l: LONGINT); PROCEDURE NaNCodeL* (x: LONGREAL; VAR h, l: LONGINT);
BEGIN BEGIN
SYSTEM.GET(SYSTEM.ADR(x) + H, h); SYSTEM.GET(SYSTEM.ADR(x) + L, l); IntL(x, h, l);
IF ASH(h, -20) MOD 2048 = 2047 THEN (* Infinite or NaN *) IF ASH(h, -20) MOD 2048 = 2047 THEN (* Infinite or NaN *)
h := h MOD 100000H (* lowest 20 bits *) h := h MOD 100000H (* lowest 20 bits *)
ELSE ELSE
@ -131,37 +187,6 @@ BEGIN
END END
END NaNCodeL; END NaNCodeL;
(** Returns TRUE iff x is NaN/Infinite. *)
PROCEDURE IsNaN* (x: REAL): BOOLEAN;
BEGIN
RETURN ASH(SYSTEM.VAL(LONGINT, x), -23) MOD 256 = 255
END IsNaN;
(** Returns TRUE iff x is NaN/Infinite. *)
PROCEDURE IsNaNL* (x: LONGREAL): BOOLEAN;
VAR h: LONGINT;
BEGIN
SYSTEM.GET(SYSTEM.ADR(x) + H, h);
RETURN ASH(h, -20) MOD 2048 = 2047
END IsNaNL;
(** Returns NaN with specified code (0 <= l < 8399608). *)
PROCEDURE NaN* (l: LONGINT): REAL;
VAR x: REAL;
BEGIN
SYSTEM.PUT(SYSTEM.ADR(x), (l MOD 800000H) + 7F800000H);
RETURN x
END NaN;
(** Returns NaN with specified code (0 <= h < 1048576, MIN(LONGINT) <= l <= MAX(LONGINT)). *)
PROCEDURE NaNL* (h, l: LONGINT): LONGREAL;
VAR x: LONGREAL;
BEGIN
h := (h MOD 100000H) + 7FF00000H;
SYSTEM.PUT(SYSTEM.ADR(x) + H, h);
SYSTEM.PUT(SYSTEM.ADR(x) + L, l);
RETURN x
END NaNL;
(* (*
PROCEDURE fcr(): SET; PROCEDURE fcr(): SET;
CODE {SYSTEM.i386, SYSTEM.FPU} CODE {SYSTEM.i386, SYSTEM.FPU}
@ -192,33 +217,29 @@ BEGIN
IF Kernel.copro THEN setfcr(s) END IF Kernel.copro THEN setfcr(s) END
END SetFCR; END SetFCR;
*) *)
PROCEDURE RealX (h, l: LONGINT; adr: LONGINT); PROCEDURE RealX (h, l: LONGINT; adr: LONGINT);
BEGIN SYSTEM.PUT(adr + H, h); SYSTEM.PUT(adr + L, l); BEGIN
IF SIZE(LONGINT) = 4 THEN
SYSTEM.PUT(adr + H, h); SYSTEM.PUT(adr + L, l);
ELSIF SIZE(INTEGER) = 4 THEN
SYSTEM.PUT(adr + H, SYSTEM.VAL(INTEGER, h));
SYSTEM.PUT(adr + L, SYSTEM.VAL(INTEGER, l));
ELSE Platform.Halt(-15)
END
END RealX; END RealX;
PROCEDURE InitHL;
VAR (*i: LONGINT; dmy: INTEGER;*) littleEndian: BOOLEAN;
BEGIN BEGIN
(*DefaultFCR := (FCR() - {0,2,3,10,11}) + {0..5,8,9}; RealX(03FF00000H, 000000000H, SYSTEM.ADR(tene[0]));
SetFCR(DefaultFCR); RealX(040240000H, 000000000H, SYSTEM.ADR(tene[1])); (* 1 *)
RealX(040590000H, 000000000H, SYSTEM.ADR(tene[2])); (* 2 *)
dmy := 1; i := SYSTEM.ADR(dmy); RealX(0408F4000H, 000000000H, SYSTEM.ADR(tene[3])); (* 3 *)
SYSTEM.GET(i, littleEndian); (* indirection via i avoids warning on SUN cc -O *)*) RealX(040C38800H, 000000000H, SYSTEM.ADR(tene[4])); (* 4 *)
littleEndian := TRUE; (* endianness will be set for each architecture -- noch *) RealX(040F86A00H, 000000000H, SYSTEM.ADR(tene[5])); (* 5 *)
IF littleEndian THEN H := 4; L := 0 ELSE H := 0; L := 4 END RealX(0412E8480H, 000000000H, SYSTEM.ADR(tene[6])); (* 6 *)
END InitHL; RealX(0416312D0H, 000000000H, SYSTEM.ADR(tene[7])); (* 7 *)
RealX(04197D784H, 000000000H, SYSTEM.ADR(tene[8])); (* 8 *)
BEGIN InitHL; RealX(041CDCD65H, 000000000H, SYSTEM.ADR(tene[9])); (* 9 *)
RealX(03FF00000H, 0, SYSTEM.ADR(tene[0]));
RealX(040240000H, 0, SYSTEM.ADR(tene[1])); (* 1 *)
RealX(040590000H, 0, SYSTEM.ADR(tene[2])); (* 2 *)
RealX(0408F4000H, 0, SYSTEM.ADR(tene[3])); (* 3 *)
RealX(040C38800H, 0, SYSTEM.ADR(tene[4])); (* 4 *)
RealX(040F86A00H, 0, SYSTEM.ADR(tene[5])); (* 5 *)
RealX(0412E8480H, 0, SYSTEM.ADR(tene[6])); (* 6 *)
RealX(0416312D0H, 0, SYSTEM.ADR(tene[7])); (* 7 *)
RealX(04197D784H, 0, SYSTEM.ADR(tene[8])); (* 8 *)
RealX(041CDCD65H, 0, SYSTEM.ADR(tene[9])); (* 9 *)
RealX(04202A05FH, 020000000H, SYSTEM.ADR(tene[10])); (* 10 *) RealX(04202A05FH, 020000000H, SYSTEM.ADR(tene[10])); (* 10 *)
RealX(042374876H, 0E8000000H, SYSTEM.ADR(tene[11])); (* 11 *) RealX(042374876H, 0E8000000H, SYSTEM.ADR(tene[11])); (* 11 *)
RealX(0426D1A94H, 0A2000000H, SYSTEM.ADR(tene[12])); (* 12 *) RealX(0426D1A94H, 0A2000000H, SYSTEM.ADR(tene[12])); (* 12 *)
@ -231,20 +252,20 @@ BEGIN InitHL;
RealX(043E158E4H, 060913D00H, SYSTEM.ADR(tene[19])); (* 19 *) RealX(043E158E4H, 060913D00H, SYSTEM.ADR(tene[19])); (* 19 *)
RealX(04415AF1DH, 078B58C40H, SYSTEM.ADR(tene[20])); (* 20 *) RealX(04415AF1DH, 078B58C40H, SYSTEM.ADR(tene[20])); (* 20 *)
RealX(0444B1AE4H, 0D6E2EF50H, SYSTEM.ADR(tene[21])); (* 21 *) RealX(0444B1AE4H, 0D6E2EF50H, SYSTEM.ADR(tene[21])); (* 21 *)
RealX(04480F0CFH, 064DD592H, SYSTEM.ADR(tene[22])); (* 22 *) RealX(04480F0CFH, 0064DD592H, SYSTEM.ADR(tene[22])); (* 22 *)
RealX(031FA18H, 02C40C60DH, SYSTEM.ADR(ten[0])); (* -307 *) RealX(00031FA18H, 02C40C60DH, SYSTEM.ADR(ten[0])); (* -307 *)
RealX(04F7CAD2H, 03DE82D7BH, SYSTEM.ADR(ten[1])); (* -284 *) RealX(004F7CAD2H, 03DE82D7BH, SYSTEM.ADR(ten[1])); (* -284 *)
RealX(09BF7D22H, 08322BAF5H, SYSTEM.ADR(ten[2])); (* -261 *) RealX(009BF7D22H, 08322BAF5H, SYSTEM.ADR(ten[2])); (* -261 *)
RealX(0E84D669H, 05B193BF8H, SYSTEM.ADR(ten[3])); (* -238 *) RealX(00E84D669H, 05B193BF8H, SYSTEM.ADR(ten[3])); (* -238 *)
RealX(0134B9408H, 0EEFEA839H, SYSTEM.ADR(ten[4])); (* -215 *) RealX(0134B9408H, 0EEFEA839H, SYSTEM.ADR(ten[4])); (* -215 *)
RealX(018123FF0H, 06EEA847AH, SYSTEM.ADR(ten[5])); (* -192 *) RealX(018123FF0H, 06EEA847AH, SYSTEM.ADR(ten[5])); (* -192 *)
RealX(01CD82742H, 091C6065BH, SYSTEM.ADR(ten[6])); (* -169 *) RealX(01CD82742H, 091C6065BH, SYSTEM.ADR(ten[6])); (* -169 *)
RealX(0219FF779H, 0FD329CB9H, SYSTEM.ADR(ten[7])); (* -146 *) RealX(0219FF779H, 0FD329CB9H, SYSTEM.ADR(ten[7])); (* -146 *)
RealX(02665275EH, 0D8D8F36CH, SYSTEM.ADR(ten[8])); (* -123 *) RealX(02665275EH, 0D8D8F36CH, SYSTEM.ADR(ten[8])); (* -123 *)
RealX(02B2BFF2EH, 0E48E0530H, SYSTEM.ADR(ten[9])); (* -100 *) RealX(02B2BFF2EH, 0E48E0530H, SYSTEM.ADR(ten[9])); (* -100 *)
RealX(02FF286D8H, 0EC190DCH, SYSTEM.ADR(ten[10])); (* -77 *) RealX(02FF286D8H, 00EC190DCH, SYSTEM.ADR(ten[10])); (* -77 *)
RealX(034B8851AH, 0B548EA4H, SYSTEM.ADR(ten[11])); (* -54 *) RealX(034B8851AH, 00B548EA4H, SYSTEM.ADR(ten[11])); (* -54 *)
RealX(0398039D6H, 065896880H, SYSTEM.ADR(ten[12])); (* -31 *) RealX(0398039D6H, 065896880H, SYSTEM.ADR(ten[12])); (* -31 *)
RealX(03E45798EH, 0E2308C3AH, SYSTEM.ADR(ten[13])); (* -8 *) RealX(03E45798EH, 0E2308C3AH, SYSTEM.ADR(ten[13])); (* -8 *)
RealX(0430C6BF5H, 026340000H, SYSTEM.ADR(ten[14])); (* 15 *) RealX(0430C6BF5H, 026340000H, SYSTEM.ADR(ten[14])); (* 15 *)
@ -252,7 +273,7 @@ BEGIN InitHL;
RealX(04C98E45EH, 01DF3B015H, SYSTEM.ADR(ten[16])); (* 61 *) RealX(04C98E45EH, 01DF3B015H, SYSTEM.ADR(ten[16])); (* 61 *)
RealX(0516078E1H, 011C3556DH, SYSTEM.ADR(ten[17])); (* 84 *) RealX(0516078E1H, 011C3556DH, SYSTEM.ADR(ten[17])); (* 84 *)
RealX(05625CCFEH, 03D35D80EH, SYSTEM.ADR(ten[18])); (* 107 *) RealX(05625CCFEH, 03D35D80EH, SYSTEM.ADR(ten[18])); (* 107 *)
RealX(05AECDA62H, 055B2D9EH, SYSTEM.ADR(ten[19])); (* 130 *) RealX(05AECDA62H, 0055B2D9EH, SYSTEM.ADR(ten[19])); (* 130 *)
RealX(05FB317E5H, 0EF3AB327H, SYSTEM.ADR(ten[20])); (* 153 *) RealX(05FB317E5H, 0EF3AB327H, SYSTEM.ADR(ten[20])); (* 153 *)
RealX(064794514H, 05230B378H, SYSTEM.ADR(ten[21])); (* 176 *) RealX(064794514H, 05230B378H, SYSTEM.ADR(ten[21])); (* 176 *)
RealX(06940B8E0H, 0ACAC4EAFH, SYSTEM.ADR(ten[22])); (* 199 *) RealX(06940B8E0H, 0ACAC4EAFH, SYSTEM.ADR(ten[22])); (* 199 *)

View file

@ -6,7 +6,7 @@ MODULE ethStrings; (** portable *) (* ejz, *)
(** Strings is a utility module that provides procedures to manipulate strings. (** Strings is a utility module that provides procedures to manipulate strings.
Note: All strings MUST be 0X terminated. *) Note: All strings MUST be 0X terminated. *)
IMPORT Oberon, Texts, Dates := ethDates, Reals := ethReals; IMPORT Texts, Dates := ethDates, Reals := ethReals;
CONST CONST
CR* = 0DX; (** the Oberon end of line character *) CR* = 0DX; (** the Oberon end of line character *)

View file

@ -486,6 +486,7 @@ BEGIN
ELSE ELSE
res := DataError res := DataError
END END
ELSE
END; END;
IF res = Ok THEN IF res = Ok THEN
Files.Close(Files.Base(dst)); Files.Close(Files.Base(dst));

View file

@ -257,6 +257,7 @@ PROCEDURE SetDataType(VAR stream: Stream);
VAR VAR
n, ascii, bin: LONGINT; n, ascii, bin: LONGINT;
BEGIN BEGIN
n := 0; ascii := 0; bin := 0;
WHILE n < 7 DO INC(bin, LONG(stream.lnode[n].freqOrCode)); INC(n) END; WHILE n < 7 DO INC(bin, LONG(stream.lnode[n].freqOrCode)); INC(n) END;
WHILE n < 128 DO INC(ascii, LONG(stream.lnode[n].freqOrCode)); INC(n) END; WHILE n < 128 DO INC(ascii, LONG(stream.lnode[n].freqOrCode)); INC(n) END;
WHILE n < Literals DO INC(bin, LONG(stream.lnode[n].freqOrCode)); INC(n) END; WHILE n < Literals DO INC(bin, LONG(stream.lnode[n].freqOrCode)); INC(n) END;

View file

@ -777,6 +777,7 @@ MODULE ethZlibInflate; (** eos **)
s.block.state := BlkBad; s.res.code := DataError; s.block.state := BlkBad; s.res.code := DataError;
Flush(s); Flush(s);
EXIT EXIT
ELSE
END END
| BlkLens: (* read length of uncompressed block *) | BlkLens: (* read length of uncompressed block *)
@ -890,6 +891,7 @@ MODULE ethZlibInflate; (** eos **)
| 18: (* repeat code length 0 for 11-138 times, using another 7 bits *) | 18: (* repeat code length 0 for 11-138 times, using another 7 bits *)
IF ~Need(s, node.bits+7) THEN EXIT END; IF ~Need(s, node.bits+7) THEN EXIT END;
Dump(s, node.bits); cnt := 11 + s.buf MOD 128; Dump(s, 7); len := 0 Dump(s, node.bits); cnt := 11 + s.buf MOD 128; Dump(s, 7); len := 0
ELSE
END; END;
IF s.block.index + cnt > s.block.nlit + s.block.ndist THEN IF s.block.index + cnt > s.block.nlit + s.block.ndist THEN
SetMsg(s.res, "invalid bit length repeat"); SetMsg(s.res, "invalid bit length repeat");
@ -1125,6 +1127,7 @@ MODULE ethZlibInflate; (** eos **)
| InfBad: (* error in stream *) | InfBad: (* error in stream *)
stream.res.code := DataError; stream.res.code := DataError;
EXIT EXIT
ELSE
END END
END END
END END

View file

@ -520,6 +520,7 @@ MODULE ulmConstStrings;
| Streams.fromStart: realpos := cnt; | Streams.fromStart: realpos := cnt;
| Streams.fromPos: realpos := s.pos + cnt; | Streams.fromPos: realpos := s.pos + cnt;
| Streams.fromEnd: realpos := s.string.length + cnt; | Streams.fromEnd: realpos := s.string.length + cnt;
ELSE
END; END;
IF (realpos < 0) OR (realpos > s.string.length) THEN IF (realpos < 0) OR (realpos > s.string.length) THEN
RETURN FALSE RETURN FALSE

View file

@ -375,6 +375,7 @@ MODULE ulmEvents;
ptr := ptr.next; ptr := ptr.next;
END; END;
psys.currentPriority := oldPriority; psys.currentPriority := oldPriority;
ELSE (* Explicitly ignore unhandled even type reactions *)
END; END;
END CallHandlers; END CallHandlers;

View file

@ -647,6 +647,7 @@ MODULE ulmPersistentObjects;
ELSE ELSE
form := incrF; form := incrF;
END; END;
ELSE
END; END;
IF mode DIV 4 MOD 2 > 0 THEN IF mode DIV 4 MOD 2 > 0 THEN
INC(form, sizeF); INC(form, sizeF);

View file

@ -193,6 +193,7 @@ MODULE ulmPrint;
| 6: arglen[index] := LEN(p7); | 6: arglen[index] := LEN(p7);
| 7: arglen[index] := LEN(p8); | 7: arglen[index] := LEN(p8);
| 8: arglen[index] := LEN(p9); | 8: arglen[index] := LEN(p9);
ELSE
END; END;
INC(index); INC(index);
END; END;
@ -210,6 +211,7 @@ MODULE ulmPrint;
| 6: RETURN p7[at] | 6: RETURN p7[at]
| 7: RETURN p8[at] | 7: RETURN p8[at]
| 8: RETURN p9[at] | 8: RETURN p9[at]
ELSE
END; END;
END Access; END Access;
@ -634,6 +636,7 @@ MODULE ulmPrint;
ndigits := 1; ndigits := 1;
END; END;
| "g": ndigits := SHORT(scale); | "g": ndigits := SHORT(scale);
ELSE
END; END;
Reals.Digits(mantissa, 10, digits, neg, Reals.Digits(mantissa, 10, digits, neg,
(* force = *) format # "g", ndigits); (* force = *) format # "g", ndigits);
@ -654,6 +657,7 @@ MODULE ulmPrint;
END; END;
Print(decpt, (* withexp = *) FALSE, 0); Print(decpt, (* withexp = *) FALSE, 0);
END; END;
ELSE
END; END;
RETURN TRUE RETURN TRUE
ELSE ELSE

View file

@ -185,6 +185,7 @@ MODULE ulmResources;
| communicationResumed: disc.stopped := FALSE; | communicationResumed: disc.stopped := FALSE;
| communicationStopped: disc.stopped := TRUE; | communicationStopped: disc.stopped := TRUE;
| terminated: disc.stopped := FALSE; disc.state := terminated; | terminated: disc.stopped := FALSE; disc.state := terminated;
ELSE (* Explicitly ignore unhandled values of change *)
END; END;
GenEvent(resource, change); GenEvent(resource, change);

View file

@ -1,9 +1,9 @@
MODULE ulmSYSTEM; MODULE ulmSYSTEM;
IMPORT SYSTEM, Unix, Sys := ulmSys; IMPORT SYSTEM, Platform, Sys := ulmSys;
TYPE pchar = POINTER TO ARRAY 1 OF CHAR; TYPE pchar = POINTER TO ARRAY 1 OF CHAR;
pstring = POINTER TO ARRAY 1024 OF CHAR; pstring = POINTER TO ARRAY 1024 OF CHAR;
pstatus = POINTER TO Unix.Status; (* pstatus = POINTER TO Platform.Status; *)
TYPE bytearray* = ARRAY SIZE(LONGINT) OF SYSTEM.BYTE; (* need this because voc does not convert implicitly LONGINT to ARRAY OF BYTE; -- noch *) TYPE bytearray* = ARRAY SIZE(LONGINT) OF SYSTEM.BYTE; (* need this because voc does not convert implicitly LONGINT to ARRAY OF BYTE; -- noch *)
pbytearray* = POINTER TO bytearray; pbytearray* = POINTER TO bytearray;
@ -52,16 +52,16 @@ TYPE pchar = POINTER TO ARRAY 1 OF CHAR;
PROCEDURE UNIXCALL*(syscall: LONGINT; VAR d0, d1: LONGINT; (* in ulm version both LONGINT and INTEGER are 4 byte size *) PROCEDURE UNIXCALL*(syscall: LONGINT; VAR d0, d1: LONGINT; (* in ulm version both LONGINT and INTEGER are 4 byte size *)
arg1, arg2, arg3: LONGINT) : BOOLEAN; arg1, arg2, arg3: LONGINT) : BOOLEAN;
VAR VAR
n : LONGINT; n: LONGINT;
ch : CHAR; ch: CHAR;
pch : pchar; pch: pchar;
pstr : pstring; pstr: pstring;
pst : pstatus; h: Platform.FileHandle;
(* pst : pstatus; *)
BEGIN BEGIN
IF syscall = Sys.read THEN IF syscall = Sys.read THEN
d0 := Unix.Read(SHORT(arg1), arg2, arg3); RETURN Platform.Read(arg1, arg2, arg3, n) = 0;
IF d0 >= 0 THEN RETURN TRUE ELSE RETURN FALSE END
(*NEW(pch); (*NEW(pch);
pch := SYSTEM.VAL(pchar, arg2); pch := SYSTEM.VAL(pchar, arg2);
ch := pch^[0]; ch := pch^[0];
@ -75,8 +75,7 @@ TYPE pchar = POINTER TO ARRAY 1 OF CHAR;
END; END;
*) *)
ELSIF syscall = Sys.write THEN ELSIF syscall = Sys.write THEN
d0 := Unix.Write(SHORT(arg1), arg2, arg3); RETURN Platform.Write(arg1, arg2, arg3) = 0;
IF d0 >= 0 THEN RETURN TRUE ELSE RETURN FALSE END
(*NEW(pch); (*NEW(pch);
pch := SYSTEM.VAL(pchar, arg2); pch := SYSTEM.VAL(pchar, arg2);
n := Write(SYSTEM.VAL(LONGINT, pch), 1); n := Write(SYSTEM.VAL(LONGINT, pch), 1);
@ -84,35 +83,40 @@ TYPE pchar = POINTER TO ARRAY 1 OF CHAR;
*) *)
ELSIF syscall = Sys.open THEN ELSIF syscall = Sys.open THEN
pstr := SYSTEM.VAL(pstring, arg1); pstr := SYSTEM.VAL(pstring, arg1);
d0 := Unix.Open(pstr^, SHORT(arg3), arg2); IF SYSTEM.VAL(SET, arg3) * {0,1} # {} THEN
IF d0 >= 0 THEN RETURN TRUE ELSE RETURN FALSE END RETURN Platform.OldRW(pstr^, d0) = 0
ELSE
RETURN Platform.OldRO(pstr^, d0) = 0
END
ELSIF syscall = Sys.close THEN ELSIF syscall = Sys.close THEN
d0 := Unix.Close(SHORT(arg1)); RETURN Platform.Close(arg1) = 0
IF d0 = 0 THEN RETURN TRUE ELSE RETURN FALSE END
ELSIF syscall = Sys.lseek THEN ELSIF syscall = Sys.lseek THEN
d0 := Unix.Lseek(SHORT(arg1), arg2, SHORT(arg3)); RETURN Platform.Seek(arg1, arg2, SYSTEM.VAL(INTEGER, arg3)) = 0
IF d0 >= 0 THEN RETURN TRUE ELSE RETURN FALSE END (*
ELSIF syscall = Sys.ioctl THEN ELSIF syscall = Sys.ioctl THEN
d0 := Unix.Ioctl(SHORT(arg1), SHORT(arg2), arg3); d0 := Platform.Ioctl(arg1, arg2, arg3);
RETURN d0 >= 0; RETURN d0 >= 0;
ELSIF syscall = Sys.fcntl THEN ELSIF syscall = Sys.fcntl THEN
d0 := Unix.Fcntl (SHORT(arg1), SHORT(arg2), arg3); d0 := Platform.Fcntl (arg1, arg2, arg3);
RETURN d0 >= 0; RETURN d0 >= 0;
ELSIF syscall = Sys.dup THEN ELSIF syscall = Sys.dup THEN
d0 := Unix.Dup(SHORT(arg1)); d0 := Platform.Dup(arg1);
RETURN d0 > 0; RETURN d0 > 0;
ELSIF syscall = Sys.pipe THEN ELSIF syscall = Sys.pipe THEN
d0 := Unix.Pipe(arg1); d0 := Platform.Pipe(arg1);
RETURN d0 >= 0; RETURN d0 >= 0;
ELSIF syscall = Sys.newstat THEN ELSIF syscall = Sys.newstat THEN
pst := SYSTEM.VAL(pstatus, arg2); pst := SYSTEM.VAL(pstatus, arg2);
pstr := SYSTEM.VAL(pstring, arg1); pstr := SYSTEM.VAL(pstring, arg1);
d0 := Unix.Stat(pstr^, pst^); d0 := Platform.Stat(pstr^, pst^);
RETURN d0 >= 0 RETURN d0 >= 0
ELSIF syscall = Sys.newfstat THEN ELSIF syscall = Sys.newfstat THEN
pst := SYSTEM.VAL(pstatus, arg2); pst := SYSTEM.VAL(pstatus, arg2);
d0 := Unix.Fstat(SHORT(arg1), pst^); d0 := Platform.Fstat(arg1, pst^);
RETURN d0 >= 0; RETURN d0 >= 0;
*)
ELSE
HALT(99);
END END
END UNIXCALL; END UNIXCALL;

View file

@ -403,6 +403,7 @@ MODULE ulmScales;
(* abs - abs or rel - rel *) (* abs - abs or rel - rel *)
restype := relative; restype := relative;
END; END;
ELSE
END; END;
ASSERT(ok); (* invalid operation *) ASSERT(ok); (* invalid operation *)
END; END; END; END;

View file

@ -115,6 +115,7 @@ MODULE ulmStreamConditions;
| write: IF Streams.OutputWillBeBuffered(condition.stream) THEN | write: IF Streams.OutputWillBeBuffered(condition.stream) THEN
RETURN TRUE RETURN TRUE
END; END;
ELSE
END; END;
msg.operation := condition.operation; msg.operation := condition.operation;
msg.errors := errors; msg.errors := errors;

View file

@ -632,6 +632,7 @@ MODULE ulmStreams;
| linebuf: nbuf := 1; | linebuf: nbuf := 1;
| onebuf: nbuf := 1; | onebuf: nbuf := 1;
| bufpool: nbuf := s.bufpool.maxbuf; | bufpool: nbuf := s.bufpool.maxbuf;
ELSE (* Explicitly ignore unhandled values of s.bufmode *)
END; END;
END GetBufferPoolSize; END GetBufferPoolSize;

View file

@ -336,7 +336,7 @@ MODULE ulmSysConversions;
(* C type *) (* C type *)
CASE type2 OF CASE type2 OF
| "a": size2 := 8; INCL(flags, unsigned); (* char* *) | "a": size2 := SIZE(Address); INCL(flags, unsigned); (* char* *)
| "c": size2 := 1; (* /* signed */ char *) | "c": size2 := 1; (* /* signed */ char *)
| "C": size2 := 1; INCL(flags, unsigned); (* unsigned char *) | "C": size2 := 1; INCL(flags, unsigned); (* unsigned char *)
| "s": size2 := 2; (* short int *) | "s": size2 := 2; (* short int *)

View file

@ -123,6 +123,7 @@ MODULE ulmSysIO;
a0, a1 : LONGINT; (* just to match UNIXCALL interface *) a0, a1 : LONGINT; (* just to match UNIXCALL interface *)
BEGIN BEGIN
interrupted := FALSE; interrupted := FALSE;
a0 := 0; a1 := 0; (* Initialised to disable compiler warning. *)
LOOP LOOP
IF ulmSYSTEM.UNIXCALL(Sys.close, d0, d1, fd, a0, a1) THEN IF ulmSYSTEM.UNIXCALL(Sys.close, d0, d1, fd, a0, a1) THEN
(*IF ulmSYSTEM.UNIXCALL(Sys.close, d0, d1, fd) THEN*) (*IF ulmSYSTEM.UNIXCALL(Sys.close, d0, d1, fd) THEN*)
@ -294,6 +295,7 @@ MODULE ulmSysIO;
d0, d1: LONGINT; d0, d1: LONGINT;
a0, a1: LONGINT; a0, a1: LONGINT;
BEGIN BEGIN
a0 := 0; a1 := 0; (* Initialised to disable compiler warning. *)
IF ulmSYSTEM.UNIXCALL(Sys.dup, d0, d1, fd, a0, a1) THEN IF ulmSYSTEM.UNIXCALL(Sys.dup, d0, d1, fd, a0, a1) THEN
newfd := d0; newfd := d0;
RETURN TRUE RETURN TRUE
@ -310,6 +312,7 @@ MODULE ulmSysIO;
fd2: File; fd2: File;
interrupted: BOOLEAN; interrupted: BOOLEAN;
BEGIN BEGIN
a0 := 0; a1 := 0; (* Initialised to disable compiler warning. *)
fd2 := newfd; fd2 := newfd;
(* handmade close to avoid unnecessary events *) (* handmade close to avoid unnecessary events *)
IF ~ulmSYSTEM.UNIXCALL(Sys.close, d0, d1, newfd, a0, a1) THEN END; IF ~ulmSYSTEM.UNIXCALL(Sys.close, d0, d1, newfd, a0, a1) THEN END;
@ -331,6 +334,7 @@ MODULE ulmSysIO;
a0, a1: LONGINT; a0, a1: LONGINT;
fds : ARRAY 2 OF (*File*)INTEGER; (* it needs int pipefd[2], and int is 4 bytes long on x86_64 -- noch *) fds : ARRAY 2 OF (*File*)INTEGER; (* it needs int pipefd[2], and int is 4 bytes long on x86_64 -- noch *)
BEGIN BEGIN
a0 := 0; a1 := 0; (* Initialised to disable compiler warning. *)
IF ulmSYSTEM.UNIXCALL(Sys.pipe, d0, d1, SYS.ADR (fds), a0, a1) THEN IF ulmSYSTEM.UNIXCALL(Sys.pipe, d0, d1, SYS.ADR (fds), a0, a1) THEN
readfd := fds[0]; writefd := fds[1]; readfd := fds[0]; writefd := fds[1];
RETURN TRUE RETURN TRUE

View file

@ -92,136 +92,98 @@ MODULE ulmSysStat;
rwx* = prot; rwx* = prot;
TYPE TYPE
StatRec* = (* result of stat(2) and fstat(2) *) StatRec* = RECORD (* result of stat(2) and fstat(2) *)
RECORD device*: SysTypes.Device; (* ID of device containing a directory entry
device*: SysTypes.Device; (* ID of device containing for this file *)
a directory entry for this file *)
inode*: SysTypes.Inode; (* inode number *) inode*: SysTypes.Inode; (* inode number *)
nlinks*: LONGINT(*INTEGER*); (* number of links *)
mode*: SET; (* file mode; see mknod(2) *) mode*: SET; (* file mode; see mknod(2) *)
uid*: INTEGER; (* user id of the file's owner *)
gid*: INTEGER; (* group id of the file's group *)
rdev*: SysTypes.Device; (* ID of device
this entry is defined only for
character special or block
special files
*)
size*: SysTypes.Offset; (* file size in bytes *)
blksize*: LONGINT; (* preferred blocksize *)
blocks*: LONGINT; (* # of blocks allocated *)
atime*: SysTypes.Time; (* time of last access *)
mtime*: SysTypes.Time; (* time of last data modification *)
ctime*: SysTypes.Time; (* time of last file status change *)
END;
(* StatRec* = (* result of stat(2) and fstat(2) *)
RECORD
device*: SysTypes.Device; (* ID of device containing
a directory entry for this file *)
inode*: SysTypes.Inode; (* inode number *)
nlinks*: LONGINT; (* number of links *) nlinks*: LONGINT; (* number of links *)
mode*: INTEGER(*SET*); (* file mode; see mknod(2) *) uid*: LONGINT; (* user id of the file's owner *)
uid*: INTEGER; (* user id of the file's owner *) gid*: LONGINT; (* group id of the file's group *)
gid*: INTEGER; (* group id of the file's group *) rdev*: SysTypes.Device; (* ID of device. this entry is defined only for
pad0: INTEGER; character special or block special files *)
rdev*: SysTypes.Device; (* ID of device
this entry is defined only for
character special or block
special files
*)
size*: SysTypes.Offset; (* file size in bytes *) size*: SysTypes.Offset; (* file size in bytes *)
(* Blocks and blksize are not available on all platforms.
blksize*: LONGINT; (* preferred blocksize *) blksize*: LONGINT; (* preferred blocksize *)
blocks*: LONGINT; (* # of blocks allocated *) blocks*: LONGINT; (* # of blocks allocated *)
*)
atime*: SysTypes.Time; (* time of last access *) atime*: SysTypes.Time; (* time of last access *)
atimences* : LONGINT;
mtime*: SysTypes.Time; (* time of last data modification *) mtime*: SysTypes.Time; (* time of last data modification *)
mtimensec* : LONGINT;
ctime*: SysTypes.Time; (* time of last file status change *) ctime*: SysTypes.Time; (* time of last file status change *)
ctimensec* : LONGINT;
unused0*, unused1*, unused2*: LONGINT;
END; END;
*)
(* Linux kernel struct stat (2.2.17)
struct stat {
unsigned short st_dev;
unsigned short __pad1;
unsigned long st_ino;
unsigned short st_mode;
unsigned short st_nlink;
unsigned short st_uid;
unsigned short st_gid;
unsigned short st_rdev;
unsigned short __pad2;
unsigned long st_size;
unsigned long st_blksize;
unsigned long st_blocks;
unsigned long st_atime;
unsigned long __unused1;
unsigned long st_mtime;
unsigned long __unused2;
unsigned long st_ctime;
unsigned long __unused3;
unsigned long __unused4;
unsigned long __unused5;
};
*)
CONST
statbufsize = 144(*64*); (* see <sys/stat.h> *) (* sizeof struct stat gives us 144 on x86_64 and 88 or x86; -- noch *)
TYPE
UnixStatRec = ARRAY statbufsize OF SYS.BYTE;
CONST
statbufconv =
(*"is=dev/-s=pad1/ll=ino/Ss=mode/4*is=nlink+uid+gid+rdev/-s=pad2/ll=size/2*ll=blksize,blocks/il=atime/-l/il=mtime/-l/il=ctime/3*-l";*)
"lL=dev/lL=ino/lL=nlink/Su=mode/2*iu=uid+gid/-i=pad0/lL=rdev/ll=size/2*ll=blksize,blocks/lL=atime/-l/lL=mtime/-l/lL=ctime/3*-l"; (* noch *)
VAR
statbuffmt: SysConversions.Format;
PROCEDURE Stat*(path: ARRAY OF CHAR; VAR buf: StatRec; PROCEDURE -Aincludesysstat '#include <sys/stat.h>';
errors: RelatedEvents.Object) : BOOLEAN; PROCEDURE -Aerrno '#include <errno.h>';
VAR
d0, d1, d2: LONGINT; PROCEDURE -structstats "struct stat s";
origbuf: UnixStatRec; PROCEDURE -statdev(): LONGINT "(LONGINT)s.st_dev";
PROCEDURE -statino(): LONGINT "(LONGINT)s.st_ino";
PROCEDURE -statmode(): LONGINT "(LONGINT)s.st_mode";
PROCEDURE -statnlink(): LONGINT "(LONGINT)s.st_nlink";
PROCEDURE -statuid(): LONGINT "(LONGINT)s.st_uid";
PROCEDURE -statgid(): LONGINT "(LONGINT)s.st_gid";
PROCEDURE -statrdev(): LONGINT "(LONGINT)s.st_rdev";
PROCEDURE -statsize(): LONGINT "(LONGINT)s.st_size";
PROCEDURE -statatime(): LONGINT "(LONGINT)s.st_atime";
PROCEDURE -statmtime(): LONGINT "(LONGINT)s.st_mtime";
PROCEDURE -statctime(): LONGINT "(LONGINT)s.st_ctime";
(* Blocks and blksize are not available on all platforms.
PROCEDURE -statblksize(): LONGINT "(LONGINT)s.st_blksize";
PROCEDURE -statblocks(): LONGINT "(LONGINT)s.st_blocks";
*)
PROCEDURE -fstat(fd: LONGINT): INTEGER "fstat(fd, &s)";
PROCEDURE -stat (n: ARRAY OF CHAR): INTEGER "stat((char*)n, &s)";
PROCEDURE -err(): INTEGER "errno";
PROCEDURE Stat*(path: ARRAY OF CHAR; VAR buf: StatRec; errors: RelatedEvents.Object): BOOLEAN;
BEGIN BEGIN
IF uSYS.UNIXCALL(Sys.newstat, d0, d1, SYS.ADR(path), SYS.ADR(origbuf), d2) THEN structstats;
SysConversions.ByFmtFromC(origbuf, buf, statbuffmt); IF stat(path) < 0 THEN SysErrors.Raise(errors, err(), Sys.newstat, path); RETURN FALSE END;
RETURN TRUE buf.device := SYS.VAL(SysTypes.Device, statdev());
ELSE buf.inode := SYS.VAL(SysTypes.Inode, statino());
SysErrors.Raise(errors, d0, Sys.newstat, path); buf.mode := SYS.VAL(SET, statmode());
RETURN FALSE buf.nlinks := statnlink();
END; buf.uid := statuid();
buf.gid := statgid();
buf.rdev := SYS.VAL(SysTypes.Device, statrdev());
buf.size := SYS.VAL(SysTypes.Offset, statsize());
(* Blocks and blksize are not available on all platforms.
buf.blksize := statblksize();
buf.blocks := statblocks();
*)
buf.atime := SYS.VAL(SysTypes.Time, statatime());
buf.mtime := SYS.VAL(SysTypes.Time, statmtime());
buf.ctime := SYS.VAL(SysTypes.Time, statctime());
RETURN TRUE;
END Stat; END Stat;
(* commented temporarily, it is used only in FTPUnixDirLister module *) (*
PROCEDURE Lstat*(path: ARRAY OF CHAR; VAR buf: StatRec; PROCEDURE Fstat*(fd: SysTypes.File; VAR buf: StatRec; errors: RelatedEvents.Object): BOOLEAN;
errors: RelatedEvents.Object) : BOOLEAN;
VAR
d0, d1: INTEGER;
origbuf: UnixStatRec;
BEGIN BEGIN
IF SYS.UNIXCALL(Sys.newlstat, d0, d1, SYS.ADR(path), SYS.ADR(origbuf)) THEN structstats;
SysConversions.ByFmtFromC(origbuf, buf, statbuffmt); IF fstat(SYS.VAL(LONGINT, fd)) < 0 THEN SysErrors.Raise(errors, err(), Sys.newfstat, ""); RETURN FALSE END;
RETURN TRUE buf.device := SYS.VAL(SysTypes.Device, statdev());
ELSE buf.inode := SYS.VAL(SysTypes.Inode, statino());
SysErrors.Raise(errors, d0, Sys.newlstat, path); buf.mode := SYS.VAL(SET, statmode());
RETURN FALSE buf.nlinks := statnlink();
END; buf.uid := statuid();
END Lstat; buf.gid := statgid();
*) buf.rdev := SYS.VAL(SysTypes.Device, statrdev());
PROCEDURE Fstat*(fd: SysTypes.File; VAR buf: StatRec; buf.size := SYS.VAL(SysTypes.Offset, statsize());
errors: RelatedEvents.Object) : BOOLEAN; (* Blocks and blksize are not available on all platforms.
VAR buf.blksize := statblksize();
d0, d1, d2: LONGINT; buf.blocks := statblocks();
origbuf: UnixStatRec; *)
BEGIN buf.atime := SYS.VAL(SysTypes.Time, statatime());
IF uSYS.UNIXCALL(Sys.newfstat, d0, d1, fd, SYS.ADR(origbuf), d2) THEN buf.mtime := SYS.VAL(SysTypes.Time, statmtime());
SysConversions.ByFmtFromC(origbuf, buf, statbuffmt); buf.ctime := SYS.VAL(SysTypes.Time, statctime());
RETURN TRUE RETURN TRUE;
ELSE
SysErrors.Raise(errors, d0, Sys.newfstat, "");
RETURN FALSE
END;
END Fstat; END Fstat;
BEGIN
SysConversions.Compile(statbuffmt, statbufconv);
END ulmSysStat. END ulmSysStat.

View file

@ -351,6 +351,7 @@ MODULE ulmTCrypt; (* Michael Szczuka *)
IF ((SetBits + 1) MOD 2) = 1 THEN IF ((SetBits + 1) MOD 2) = 1 THEN
x := x + {M-1}; x := x + {M-1};
END; END;
ELSE
END; END;
END CreateCCM; END CreateCCM;
@ -823,6 +824,7 @@ MODULE ulmTCrypt; (* Michael Szczuka *)
ELSE ELSE
CreateCCM(p.koeff, reg); CreateCCM(p.koeff, reg);
END; END;
ELSE
END; END;
p := proot; p := proot;

View file

@ -229,6 +229,7 @@ MODULE ulmTexts;
| Streams.fromStart: pos := count; | Streams.fromStart: pos := count;
| Streams.fromPos: pos := count + s.pos; | Streams.fromPos: pos := count + s.pos;
| Streams.fromEnd: pos := count + s.len; | Streams.fromEnd: pos := count + s.len;
ELSE
END; END;
IF (pos >= 0) & (pos <= s.len) THEN IF (pos >= 0) & (pos <= s.len) THEN
s.pos := pos; s.pos := pos;

View file

@ -200,6 +200,7 @@ MODULE ulmTimes;
| epochUnit: value := measure.timeval.epoch; | epochUnit: value := measure.timeval.epoch;
| secondUnit: value := measure.timeval.second; | secondUnit: value := measure.timeval.second;
| usecUnit: value := measure.timeval.usec; | usecUnit: value := measure.timeval.usec;
ELSE
END; END;
END; END; END; END;
END InternalGetValue; END InternalGetValue;
@ -212,6 +213,7 @@ MODULE ulmTimes;
| epochUnit: measure.timeval.epoch := value; | epochUnit: measure.timeval.epoch := value;
| secondUnit: measure.timeval.second := value; | secondUnit: measure.timeval.second := value;
| usecUnit: measure.timeval.usec := value; | usecUnit: measure.timeval.usec := value;
ELSE
END; END;
Normalize(measure.timeval); Normalize(measure.timeval);
END; END; END; END;
@ -274,6 +276,7 @@ MODULE ulmTimes;
CASE op OF CASE op OF
| Scales.add: Add(op1.timeval, op2.timeval, result.timeval); | Scales.add: Add(op1.timeval, op2.timeval, result.timeval);
| Scales.sub: Sub(op1.timeval, op2.timeval, result.timeval); | Scales.sub: Sub(op1.timeval, op2.timeval, result.timeval);
ELSE
END; END;
END; END;
END; END; END; END;
@ -293,7 +296,8 @@ MODULE ulmTimes;
END ReturnVal; END ReturnVal;
BEGIN BEGIN
WITH op1: ReferenceTime DO WITH op2: ReferenceTime DO WITH op1: ReferenceTime DO
WITH op2: ReferenceTime DO
IF op1.timeval.epoch # op2.timeval.epoch THEN IF op1.timeval.epoch # op2.timeval.epoch THEN
RETURN ReturnVal(op1.timeval.epoch, op2.timeval.epoch) RETURN ReturnVal(op1.timeval.epoch, op2.timeval.epoch)
ELSIF op1.timeval.second # op2.timeval.second THEN ELSIF op1.timeval.second # op2.timeval.second THEN
@ -301,7 +305,9 @@ MODULE ulmTimes;
ELSE ELSE
RETURN ReturnVal(op1.timeval.usec, op2.timeval.usec) RETURN ReturnVal(op1.timeval.usec, op2.timeval.usec)
END; END;
END; END; END;
END;
RETURN 0;
END Compare; END Compare;
(* ========= initialization procedures ========================== *) (* ========= initialization procedures ========================== *)

View file

@ -50,7 +50,7 @@ MODULE ulmTypes;
IMPORT SYS := SYSTEM; IMPORT SYS := SYSTEM;
TYPE TYPE
Address* = (*SYS.PTR*) LONGINT (*SYS.ADDRESS*); Address* = LONGINT (*SYS.ADDRESS*);
(* ulm compiler can accept (* ulm compiler can accept
VAR p : SYSTEM.ADDRESS; // SYSTEM.PTR in ETH and V4 versions VAR p : SYSTEM.ADDRESS; // SYSTEM.PTR in ETH and V4 versions
... ...
@ -58,18 +58,16 @@ MODULE ulmTypes;
and this is how it is used in ulm oberon system library, and this is how it is used in ulm oberon system library,
while SYSTEM.ADR returns LONGINT in ETH and V4 versions. while SYSTEM.ADR returns LONGINT in ETH and V4 versions.
Thus I leave it as LONGINT for now, before coming up with better solution -- noch *) Thus I leave it as LONGINT for now, before coming up with better solution -- noch *)
UntracedAddress* = POINTER[1] TO UntracedAddressDesc; (*SYS.UNTRACEDADDRESS;*) UntracedAddress* = POINTER[1] TO UntracedAddressDesc; (*SYS.UNTRACEDADDRESS;*)
UntracedAddressDesc* = RECORD[1] END; UntracedAddressDesc* = RECORD[1] END;
intarr64 = ARRAY 8 OF SYS.BYTE; (* to emulate int16 on x86_64; -- noch *)
intarr16 = ARRAY 2 OF SYS.BYTE;
Count* = LONGINT; Count* = LONGINT;
Size* = Count; Size* = Count;
Byte* = SYS.BYTE; Byte* = SYS.BYTE;
IntAddress* = LONGINT; IntAddress* = LONGINT;
Int8* = SHORTINT; Int8* = SHORTINT;
Int16* = intarr16(*INTEGER*); (* we don't have 16 bit integer in x86_64 version of voc *) Int16* = INTEGER; (* No real 16 bit integer type *)
Int32* = INTEGER; Int32* = INTEGER;
Real32* = REAL; Real32* = REAL;
Real64* = LONGREAL; Real64* = LONGREAL;
@ -93,21 +91,17 @@ MODULE ulmTypes;
PROCEDURE ToInt8*(int: LONGINT) : Int8; PROCEDURE ToInt8*(int: LONGINT) : Int8;
BEGIN BEGIN
RETURN SHORT(SHORT(int)) RETURN SYS.VAL(SHORTINT, int)
END ToInt8; END ToInt8;
PROCEDURE ToInt16*(int: LONGINT; VAR int16: Int16)(* : Int16*); PROCEDURE ToInt16*(int: LONGINT) : Int16;
VAR longintarr : intarr64;
BEGIN BEGIN
(*RETURN SYS.VAL(Int16, int)*) RETURN SYS.VAL(Int16, int)
longintarr := SYS.VAL(intarr64, int);
int16[0] := longintarr[0];
int16[1] := longintarr[1]; (* this will work for little endian -- noch *)
END ToInt16; END ToInt16;
PROCEDURE ToInt32*(int: LONGINT) : Int32; PROCEDURE ToInt32*(int: LONGINT) : Int32;
BEGIN BEGIN
RETURN SHORT(int) RETURN SYS.VAL(INTEGER, int)
END ToInt32; END ToInt32;
PROCEDURE ToReal32*(real: LONGREAL) : Real32; PROCEDURE ToReal32*(real: LONGREAL) : Real32;

View file

@ -3,63 +3,29 @@ MODULE Args; (* jt, 8.12.94 *)
(* command line argument handling for voc (jet backend) *) (* command line argument handling for voc (jet backend) *)
IMPORT SYSTEM; IMPORT Platform;
TYPE TYPE
ArgPtr = POINTER TO ARRAY 1024 OF CHAR; ArgPtr = POINTER TO ARRAY 1024 OF CHAR;
ArgVec = POINTER TO ARRAY 1024 OF ArgPtr; ArgVec = POINTER TO ARRAY 1024 OF ArgPtr;
VAR argc-: INTEGER; argv-: LONGINT; VAR
(*PROCEDURE -includestdlib() "#include <stdlib.h>";*) argc-: LONGINT;
PROCEDURE -externgetenv() "extern char *getenv(const char *name);"; (* took this from stdlib.h*) argv-: LONGINT;
PROCEDURE -Argc(): INTEGER "SYSTEM_argc";
PROCEDURE -Argv(): LONGINT "(long)SYSTEM_argv";
PROCEDURE -getenv(var: ARRAY OF CHAR): ArgPtr
"(Args_ArgPtr)getenv(var)";
PROCEDURE Get*(n: INTEGER; VAR val: ARRAY OF CHAR);
VAR av: ArgVec;
BEGIN
IF n < argc THEN av := SYSTEM.VAL(ArgVec, argv); COPY(av[n]^, val) END
END Get;
PROCEDURE GetInt*(n: INTEGER; VAR val: LONGINT); PROCEDURE Get* (n: INTEGER; VAR val: ARRAY OF CHAR); BEGIN Platform.GetArg(n, val) END Get;
VAR s: ARRAY 64 OF CHAR; k, d, i: LONGINT; PROCEDURE GetInt*(n: INTEGER; VAR val: LONGINT); BEGIN Platform.GetIntArg(n, val) END GetInt;
BEGIN PROCEDURE Pos* (s: ARRAY OF CHAR): INTEGER; BEGIN RETURN Platform.ArgPos(s) END Pos;
s := ""; Get(n, s); i := 0;
IF s[0] = "-" THEN i := 1 END ;
k := 0; d := ORD(s[i]) - ORD("0");
WHILE (d >= 0 ) & (d <= 9) DO k := k*10 + d; INC(i); d := ORD(s[i]) - ORD("0") END ;
IF s[0] = "-" THEN d := -d; DEC(i) END ;
IF i > 0 THEN val := k END
END GetInt;
PROCEDURE Pos*(s: ARRAY OF CHAR): INTEGER; PROCEDURE GetEnv*(var: ARRAY OF CHAR; VAR val: ARRAY OF CHAR);
VAR i: INTEGER; arg: ARRAY 256 OF CHAR; BEGIN Platform.GetEnv(var, val) END GetEnv;
BEGIN
i := 0; Get(i, arg);
WHILE (i < argc) & (s # arg) DO INC(i); Get(i, arg) END ;
RETURN i
END Pos;
PROCEDURE GetEnv*(var: ARRAY OF CHAR; VAR val: ARRAY OF CHAR); PROCEDURE getEnv*(var: ARRAY OF CHAR; VAR val: ARRAY OF CHAR): BOOLEAN;
VAR p: ArgPtr; BEGIN RETURN Platform.getEnv(var, val) END getEnv;
BEGIN
p := getenv(var);
IF p # NIL THEN COPY(p^, val) END
END GetEnv;
PROCEDURE getEnv*(var: ARRAY OF CHAR; VAR val: ARRAY OF CHAR): BOOLEAN;
VAR p: ArgPtr;
BEGIN
p := getenv(var);
IF p # NIL THEN
COPY(p^, val);
RETURN TRUE
ELSE
RETURN FALSE
END
END getEnv;
BEGIN argc := Argc(); argv := Argv() BEGIN
argc := Platform.ArgCount;
argv := Platform.ArgVector;
END Args. END Args.

View file

@ -3,7 +3,7 @@ MODULE Modules; (* jt 6.1.96 *)
(* access to list of modules and commands, based on ETH Oberon *) (* access to list of modules and commands, based on ETH Oberon *)
IMPORT SYSTEM, Console; IMPORT SYSTEM, Console, Heap;
CONST CONST
ModNameLen* = 20; ModNameLen* = 20;
@ -37,10 +37,10 @@ MODULE Modules; (* jt 6.1.96 *)
PROCEDURE -modules*(): Module PROCEDURE -modules*(): Module
"(Modules_Module)SYSTEM_modules"; "(Modules_Module)Heap_modules";
PROCEDURE -setmodules*(m: Module) PROCEDURE -setmodules*(m: Module)
"SYSTEM_modules = m"; "Heap_modules = m";
PROCEDURE Append(VAR a: ARRAY OF CHAR; b: ARRAY OF CHAR); PROCEDURE Append(VAR a: ARRAY OF CHAR; b: ARRAY OF CHAR);

View file

@ -1,6 +1,6 @@
MODULE Printer; (*UNIX version: JT 11.5.90, RC 2.7.93, JS 29.4.94, JT 14.4.95 *) MODULE Printer; (*UNIX version: JT 11.5.90, RC 2.7.93, JS 29.4.94, JT 14.4.95 *)
IMPORT SYSTEM, Files, Unix, Kernel; IMPORT SYSTEM, Files, Platform;
CONST CONST
N = 20; N = 20;
@ -608,9 +608,6 @@ END;
REPEAT ch := s2[j]; s1[i] := ch; INC(i); INC(j) UNTIL ch = 0X REPEAT ch := s2[j]; s1[i] := ch; INC(i); INC(j) UNTIL ch = 0X
END Append; END Append;
PROCEDURE -system(cmd: ARRAY OF CHAR)
"system(cmd)";
PROCEDURE Close*; PROCEDURE Close*;
CONST bufSize = 4*1024; CONST bufSize = 4*1024;
VAR VAR
@ -645,7 +642,7 @@ END;
cmd := "lp -c -s "; cmd := "lp -c -s ";
IF PrinterName # "Pluto" THEN Append(cmd, "-d "); Append(cmd, PrinterName) END ; IF PrinterName # "Pluto" THEN Append(cmd, "-d "); Append(cmd, PrinterName) END ;
Append(cmd, " "); Append(cmd, printFileName); Append(cmd, " "); Append(cmd, printFileName);
system(cmd); i := Platform.System(cmd);
Files.Delete(printFileName, res); Files.Delete(printFileName, res);
END; END;
Files.Set(bodyR, NIL, 0); Files.Set(bodyR, NIL, 0);

View file

@ -2,10 +2,7 @@ MODULE Reals;
(* JT, 5.2.90 / RC 9.12.91 conversion between reals and strings for HP-700, MB 9.12.91, JT for Ofront, 16.3. 95*) (* JT, 5.2.90 / RC 9.12.91 conversion between reals and strings for HP-700, MB 9.12.91, JT for Ofront, 16.3. 95*)
IMPORT S := SYSTEM; IMPORT S := SYSTEM;
(* getting rid of ecvt -- noch
PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT
"(LONGINT)ecvt (x, ndigit, decpt, sign)";
*)
PROCEDURE Ten*(e: INTEGER): REAL; PROCEDURE Ten*(e: INTEGER): REAL;
VAR r, power: LONGREAL; VAR r, power: LONGREAL;
BEGIN r := 1.0; BEGIN r := 1.0;
@ -17,6 +14,7 @@ MODULE Reals;
RETURN SHORT(r) RETURN SHORT(r)
END Ten; END Ten;
PROCEDURE TenL*(e: INTEGER): LONGREAL; PROCEDURE TenL*(e: INTEGER): LONGREAL;
VAR r, power: LONGREAL; VAR r, power: LONGREAL;
BEGIN r := 1.0; BEGIN r := 1.0;
@ -29,166 +27,90 @@ MODULE Reals;
END END
END TenL; END TenL;
PROCEDURE Expo*(x: REAL): INTEGER; PROCEDURE Expo*(x: REAL): INTEGER;
BEGIN BEGIN
RETURN SHORT(ASH(S.VAL(LONGINT, x), -23) MOD 256) RETURN SHORT(ASH(S.VAL(INTEGER, x), -23) MOD 256)
END Expo; END Expo;
PROCEDURE ExpoL*(x: LONGREAL): INTEGER; PROCEDURE ExpoL*(x: LONGREAL): INTEGER;
VAR h: LONGINT; VAR i: INTEGER; l: LONGINT;
BEGIN BEGIN
S.GET(S.ADR(x)+4, h); IF SIZE(INTEGER) = 4 THEN
RETURN SHORT(ASH(h, -20) MOD 2048) S.GET(S.ADR(x)+4, i); (* Fetch top 32 bits *)
RETURN SHORT(ASH(i, -20) MOD 2048)
ELSIF SIZE(LONGINT) = 4 THEN
S.GET(S.ADR(x)+4, l); (* Fetch top 32 bits *)
RETURN SHORT(ASH(l, -20) MOD 2048)
ELSE HALT(98)
END
END ExpoL; END ExpoL;
PROCEDURE SetExpo*(e: INTEGER; VAR x: REAL);
CONST expo = {1..8};
BEGIN
x := S.VAL(REAL, S.VAL(SET, x) - expo + S.VAL(SET, ASH(LONG(e), 23)))
END SetExpo;
PROCEDURE SetExpoL*(e: INTEGER; VAR x: LONGREAL); (* Convert LONGREAL: Write positive integer value of x into array d.
CONST expo = {1..11}; The value is stored backwards, i.e. least significant digit
VAR h: SET; first. n digits are written, with trailing zeros fill.
On entry x has been scaled to the number of digits required. *)
PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR);
VAR i, j, k: LONGINT;
BEGIN BEGIN
S.GET(S.ADR(x)+4, h); IF x < 0 THEN x := -x END;
h := h - expo + S.VAL(SET, ASH(LONG(e), 20)); k := 0;
S.PUT(S.ADR(x)+4, h)
END SetExpoL;
PROCEDURE Reverse0 (VAR str : ARRAY OF CHAR; start, end : INTEGER); IF (SIZE(LONGINT) < 8) & (n > 9) THEN
(* Reverses order of characters in the interval [start..end]. *) (* There are more decimal digits than can be held in a single LONGINT *)
VAR i := ENTIER(x / 1000000000.0D0); (* The 10th and higher digits *)
h : CHAR; j := ENTIER(x - (i * 1000000000.0D0)); (* The low 9 digits *)
BEGIN (* First generate the low 9 digits. *)
WHILE start < end DO IF j < 0 THEN j := 0 END;
h := str[start]; str[start] := str[end]; str[end] := h; WHILE k < 9 DO
INC(start); DEC(end) d[k] := CHR(j MOD 10 + 48); j := j DIV 10; INC(k)
END END;
END Reverse0; (* Fall through to generate the upper digits *)
(* these functions ⇅ necessary to get rid of ecvt -- noch *)
PROCEDURE IntToStr*(int: LONGINT; VAR str: ARRAY OF CHAR);
(* Converts the value of `int' to string form and copies the possibly truncated
result to `str'. *)
VAR
b : ARRAY 21 OF CHAR;
s, e: INTEGER;
maxLength : SHORTINT; (* maximum number of digits representing a LONGINT value *)
BEGIN
IF SIZE(LONGINT) = 4 THEN maxLength := 11 END;
IF SIZE(LONGINT) = 8 THEN maxLength := 20 END;
(* build representation in string 'b' *)
IF int = MIN(LONGINT) THEN (* smallest LONGINT, -int is an overflow *)
IF SIZE(LONGINT) = 4 THEN
b := "-2147483648";
e := 11
ELSE (* SIZE(LONGINT) = 8 *)
b := "-9223372036854775808";
e := 20
END
ELSE ELSE
IF int < 0 THEN (* negative sign *) (* We can generate all the digits in one go. *)
b[0] := "-"; int := -int; s := 1 i := ENTIER(x);
ELSE (* no sign *)
s := 0
END; END;
e := s; (* 's' holds starting position of string *)
REPEAT
b[e] := CHR(int MOD 10+ORD("0"));
int := int DIV 10;
INC(e)
UNTIL int = 0;
b[e] := 0X;
Reverse0(b, s, e-1);
END;
COPY(b, str) (* truncate output if necessary *)
END IntToStr;
PROCEDURE Convert*(x: REAL; n: INTEGER; VAR d: ARRAY OF CHAR);
VAR i, k: LONGINT;
BEGIN IF x < 0 THEN x := -x END;
i := ENTIER(x); k := 0;
WHILE k < n DO WHILE k < n DO
d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k) d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k)
END END
END ConvertL;
PROCEDURE Convert*(x: REAL; n: INTEGER; VAR d: ARRAY OF CHAR);
BEGIN ConvertL(x, n, d)
END Convert; END Convert;
(* experimental, -- noch
PROCEDURE Convert0*(x: REAL; n: INTEGER; VAR d: ARRAY OF CHAR);
VAR i, j, k: LONGINT;
str : ARRAY 32 OF CHAR;
BEGIN
(* IF x = MIN(LONGREAL) THEN x := MAX(LONGREAL) END;*)
IF x < 0 THEN x := -x END;
i := ENTIER(x);
IF i < 0 THEN i := -i END;
IntToStr(i, str);
IF n >= LEN(d) THEN n := SHORT(LEN(d)) - 1 END;
d[n] := 0X;
j := n - 1 ;
IF j < 0 THEN j := 0 END;
k := 0;
REPEAT
d[j] := str[k];
DEC(j);
INC(k);
UNTIL (str[k] = 0X) OR (j < 0);
WHILE j >= 0 DO d[j] := "0"; DEC(j) END ; PROCEDURE ToHex(i: INTEGER): CHAR;
END Convert0;
*)
(* this seem to work -- noch *)
PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR);
VAR i, j, k: LONGINT;
str : ARRAY 32 OF CHAR;
BEGIN BEGIN
(* IF x = MIN(LONGREAL) THEN x := MAX(LONGREAL) END;*) IF i < 10 THEN RETURN CHR(i+48)
IF x < 0 THEN x := -x END; ELSE RETURN CHR(i+55) END
i := ENTIER(x); END ToHex;
IF i < 0 THEN i := -i END;
IntToStr(i, str);
IF n >= LEN(d) THEN n := SHORT(LEN(d)) - 1 END;
d[n] := 0X;
j := n - 1 ;
IF j < 0 THEN j := 0 END;
k := 0;
REPEAT
d[j] := str[k];
DEC(j);
INC(k);
UNTIL (str[k] = 0X) OR (j < 0);
WHILE j >= 0 DO d[j] := "0"; DEC(j) END ; (* Convert Hex *)
END ConvertL; PROCEDURE ConvertH*(y: REAL; VAR d: ARRAY OF CHAR);
(* getting rid of ecvt -- noch TYPE pc4 = POINTER TO ARRAY 4 OF CHAR;
PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR); VAR p: pc4; i: INTEGER;
VAR decpt, sign: INTEGER; i: LONGINT; buf: LONGINT;
BEGIN BEGIN
(*x := x - 0.5; already rounded in ecvt*) p := S.VAL(pc4, S.ADR(y)); i := 0;
buf := ecvt(x, n+2, S.ADR(decpt), S.ADR(sign)); WHILE i<4 DO
i := 0; d[i*2] := ToHex(ORD(p[i]) DIV 16);
WHILE i < decpt DO S.GET(buf + i, d[n - i -1]); INC(i) END ; (* showdef was crashing here on oocLowLReal.sym because of ecvt *) d[i*2+1] := ToHex(ORD(p[i]) MOD 16)
i := n - i - 1;
WHILE i >= 0 DO d[i] := "0"; DEC(i) END ;
END ConvertL;
*)
PROCEDURE Unpack(VAR b, d: ARRAY OF S.BYTE);
VAR i, k: SHORTINT; len: LONGINT;
BEGIN i := 0; len := LEN(b);
WHILE i < len DO
k := SHORT(ORD(S.VAL(CHAR, b[i])) DIV 16);
IF k > 9 THEN d[i*2] := k + 55 ELSE d[i*2] := k + 48 END ;
k := SHORT(ORD(S.VAL(CHAR, b[i])) MOD 16);
IF k > 9 THEN d[i*2+1] := k + 55 ELSE d[i*2+1] := k + 48 END ;
INC(i)
END END
END Unpack;
PROCEDURE ConvertH* (y: REAL; VAR d: ARRAY OF CHAR);
BEGIN Unpack(y, d)
END ConvertH; END ConvertH;
PROCEDURE ConvertHL* (x: LONGREAL; VAR d: ARRAY OF CHAR); (* Convert Hex Long *)
BEGIN Unpack(x, d) PROCEDURE ConvertHL*(y: LONGREAL; VAR d: ARRAY OF CHAR);
TYPE pc8 = POINTER TO ARRAY 8 OF CHAR;
VAR p: pc8; i: INTEGER;
BEGIN
p := S.VAL(pc8, S.ADR(y)); i := 0;
WHILE i<8 DO
d[i*2] := ToHex(ORD(p[i]) DIV 16);
d[i*2+1] := ToHex(ORD(p[i]) MOD 16)
END
END ConvertHL; END ConvertHL;
END Reals. END Reals.

View file

@ -1,6 +1,6 @@
MODULE Sets0; MODULE Sets;
IMPORT Out := Console; IMPORT Texts;
CONST (*size* = 32;*) CONST (*size* = 32;*)
size* = MAX(SET) + 1; size* = MAX(SET) + 1;
@ -114,7 +114,7 @@ BEGIN
i := 0; WHILE i < LEN(s1) DO s := s1[i] * s2[i]; s3[i] := s; INC(i) END i := 0; WHILE i < LEN(s1) DO s := s1[i] * s2[i]; s3[i] := s; INC(i) END
END Intersect; END Intersect;
(*
PROCEDURE Print*(VAR f: Texts.Writer; s: ARRAY OF SET; w, indent: INTEGER); PROCEDURE Print*(VAR f: Texts.Writer; s: ARRAY OF SET; w, indent: INTEGER);
VAR col, i, max: INTEGER; VAR col, i, max: INTEGER;
BEGIN BEGIN
@ -133,27 +133,5 @@ BEGIN
END ; END ;
Texts.Write(f, "}") Texts.Write(f, "}")
END Print; END Print;
*)
PROCEDURE Write*(s: ARRAY OF SET; w, indent: INTEGER); END Sets.
VAR col, i, max: INTEGER;
BEGIN
i := 0; col := indent; max := SHORT(LEN(s)) * size;
Out.Char("{");
WHILE i < max DO
IF In(s, i) THEN
IF col + 4 > w THEN
Out.Ln;
col := 0; WHILE col < indent DO Out.Char(" "); INC(col) END
END ;
Out.Int(i, 3); Out.Char(",");
INC(col, 4)
END ;
INC(i)
END ;
Out.Char("}")
END Write;
END Sets0.

View file

@ -1,9 +1,9 @@
MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91**) (* << RC, MB, JT *) MODULE Texts; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91**) (* << RC, MB, JT *)
IMPORT IMPORT
Files := Files0, Modules, Reals; Files, Modules, Reals;
(*--- insert field e: Elem into Texts.Scanner and change Texts.Scan to set it in case of class=6 *) (*--- insert field e: Elem into Texts.Scanner and change Texts.Scan to set it in case of class=6 *)
(* this module is for bootstrapping voc, use Texts instead *)
CONST CONST
Displaywhite = 15; Displaywhite = 15;
@ -12,7 +12,7 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91*
(**FileMsg.id**) (**FileMsg.id**)
load* = 0; store* = 1; load* = 0; store* = 1;
(**Notifier op**) (**Notifier op**)
replace* = 0; insert* = 1; delete* = 2; replace* = 0; insert* = 1; delete* = 2; unmark* = 3;
(**Scanner.class**) (**Scanner.class**)
Inval* = 0; Name* = 1; String* = 2; Int* = 3; Real* = 4; LongReal* = 5; Char* = 6; Inval* = 0; Name* = 1; String* = 2; Int* = 3; Real* = 4; LongReal* = 5; Char* = 6;
@ -72,8 +72,10 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91*
head: Run head: Run
END; END;
Notifier* = PROCEDURE (T: Text; op: INTEGER; beg, end: LONGINT);
TextDesc* = RECORD TextDesc* = RECORD
len*: LONGINT; len*: LONGINT;
notify*: Notifier;
head, cache: Run; head, cache: Run;
corg: LONGINT corg: LONGINT
END; END;
@ -281,6 +283,7 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91*
len := B.len; v := B.head.next; len := B.len; v := B.head.next;
Merge(T, u, v); Splice(un, v, B.head.prev, T); Merge(T, u, v); Splice(un, v, B.head.prev, T);
INC(T.len, len); B.head.next := B.head; B.head.prev := B.head; B.len := 0; INC(T.len, len); B.head.next := B.head; B.head.prev := B.head; B.len := 0;
IF T.notify # NIL THEN T.notify(T, insert, pos, pos+len) END
END Insert; END Insert;
PROCEDURE Append* (T: Text; B: Buffer); PROCEDURE Append* (T: Text; B: Buffer);
@ -288,6 +291,7 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91*
BEGIN pos := T.len; len := B.len; v := B.head.next; BEGIN pos := T.len; len := B.len; v := B.head.next;
Merge(T, T.head.prev, v); Splice(T.head, v, B.head.prev, T); Merge(T, T.head.prev, v); Splice(T.head, v, B.head.prev, T);
INC(T.len, len); B.head.next := B.head; B.head.prev := B.head; B.len := 0; INC(T.len, len); B.head.next := B.head; B.head.prev := B.head; B.len := 0;
IF T.notify # NIL THEN T.notify(T, insert, pos, pos+len) END
END Append; END Append;
PROCEDURE Delete* (T: Text; beg, end: LONGINT); PROCEDURE Delete* (T: Text; beg, end: LONGINT);
@ -299,6 +303,7 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91*
Splice(del.head, un, v, NIL); Splice(del.head, un, v, NIL);
Merge(T, u, vn); u.next := vn; vn.prev := u; Merge(T, u, vn); u.next := vn; vn.prev := u;
DEC(T.len, end - beg); DEC(T.len, end - beg);
IF T.notify # NIL THEN T.notify(T, delete, beg, end) END
END Delete; END Delete;
PROCEDURE ChangeLooks* (T: Text; beg, end: LONGINT; sel: SET; fnt: FontsFont; col, voff: SHORTINT); PROCEDURE ChangeLooks* (T: Text; beg, end: LONGINT; sel: SET; fnt: FontsFont; col, voff: SHORTINT);
@ -313,6 +318,7 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91*
IF u.next = un THEN u := un; un := un.next ELSE u.next := un; un.prev := u END IF u.next = un THEN u := un; un := un.next ELSE u.next := un; un.prev := u END
END; END;
Merge(T, u, un); u.next := un; un.prev := u; Merge(T, u, un); u.next := un; un.prev := u;
IF T.notify # NIL THEN T.notify(T, replace, beg, end) END
END ChangeLooks; END ChangeLooks;
@ -327,23 +333,7 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91*
Files.Set(R.rider, u(Piece).file, u(Piece).org + R.off) Files.Set(R.rider, u(Piece).file, u(Piece).org + R.off)
END END
END OpenReader; END OpenReader;
(*
PROCEDURE Read* (VAR R: Reader; VAR ch: CHAR);
VAR u: Run;
BEGIN u := R.run; R.fnt := u.fnt; R.col := u.col; R.voff := u.voff; INC(R.off);
IF u IS Piece THEN Files.Read(R.rider, ch); R.elem := NIL;
IF (ch = 0AX) & u(Piece).ascii THEN ch := CR END (* << LF to CR *)
ELSIF u IS Elem THEN ch := ElemChar; R.elem := u(Elem)
ELSE ch := 0X; R.elem := NIL; R.eot := TRUE
END;
IF R.off = u.len THEN INC(R.org, u.len); u := u.next;
IF u IS Piece THEN
WITH u: Piece DO Files.Set(R.rider, u.file, u.org) END
END;
R.run := u; R.off := 0
END
END Read;
*)
PROCEDURE Read* (VAR R: Reader; VAR ch: CHAR); PROCEDURE Read* (VAR R: Reader; VAR ch: CHAR);
VAR u: Run; pos: LONGINT; nextch: CHAR; VAR u: Run; pos: LONGINT; nextch: CHAR;
BEGIN u := R.run; R.fnt := u.fnt; R.col := u.col; R.voff := u.voff; INC(R.off); BEGIN u := R.run; R.fnt := u.fnt; R.col := u.col; R.voff := u.voff; INC(R.off);
@ -364,7 +354,6 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91*
END END
END Read; END Read;
PROCEDURE ReadElem* (VAR R: Reader); PROCEDURE ReadElem* (VAR R: Reader);
VAR u, un: Run; VAR u, un: Run;
BEGIN u := R.run; BEGIN u := R.run;
@ -557,11 +546,18 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91*
END WriteString; END WriteString;
PROCEDURE WriteInt* (VAR W: Writer; x, n: LONGINT); PROCEDURE WriteInt* (VAR W: Writer; x, n: LONGINT);
VAR i: INTEGER; x0: LONGINT; VAR
a: ARRAY 11 OF CHAR; i: INTEGER; x0: LONGINT;
a: ARRAY 22 OF CHAR;
BEGIN i := 0; BEGIN i := 0;
IF x < 0 THEN IF x < 0 THEN
IF x = MIN(LONGINT) THEN WriteString(W, " -2147483648"); RETURN IF x = MIN(LONGINT) THEN
IF SIZE(LONGINT) = 4 THEN
WriteString(W, " -2147483648")
ELSE
WriteString(W, " -9223372036854775808")
END;
RETURN
ELSE DEC(n); x0 := -x ELSE DEC(n); x0 := -x
END END
ELSE x0 := x ELSE x0 := x
@ -576,7 +572,7 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91*
PROCEDURE WriteHex* (VAR W: Writer; x: LONGINT); PROCEDURE WriteHex* (VAR W: Writer; x: LONGINT);
VAR i: INTEGER; y: LONGINT; VAR i: INTEGER; y: LONGINT;
a: ARRAY 10 OF CHAR; a: ARRAY 20 OF CHAR;
BEGIN i := 0; Write(W, " "); BEGIN i := 0; Write(W, " ");
REPEAT y := x MOD 10H; REPEAT y := x MOD 10H;
IF y < 10 THEN a[i] := CHR(y + 30H) ELSE a[i] := CHR(y + 37H) END; IF y < 10 THEN a[i] := CHR(y + 30H) ELSE a[i] := CHR(y + 37H) END;
@ -680,14 +676,22 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91*
REPEAT Write(W, " "); DEC(n) UNTIL n <= maxD; REPEAT Write(W, " "); DEC(n) UNTIL n <= maxD;
(*there are 2 <= n <= maxD digits to be written*) (*there are 2 <= n <= maxD digits to be written*)
IF x < 0 THEN Write(W, "-"); x := -x ELSE Write(W, " ") END; IF x < 0 THEN Write(W, "-"); x := -x ELSE Write(W, " ") END;
(* Scale e to be an exponent of 10 rather than 2 *)
e := SHORT(LONG(e - 1023) * 77 DIV 256); e := SHORT(LONG(e - 1023) * 77 DIV 256);
IF e >= 0 THEN x := x / Reals.TenL(e) ELSE x := Reals.TenL(-e) * x END ; IF e >= 0 THEN x := x / Reals.TenL(e) ELSE x := Reals.TenL(-e) * x END ;
IF x >= 10.0D0 THEN x := 0.1D0 * x; INC(e) END ; IF x >= 10.0D0 THEN x := 0.1D0 * x; INC(e) END;
(* Scale x to the number of digits requested *)
x0 := Reals.TenL(n-1); x := x0*x + 0.5D0; x0 := Reals.TenL(n-1); x := x0*x + 0.5D0;
IF x >= 10.0D0*x0 THEN x := 0.1D0 * x; INC(e) END ; IF x >= 10.0D0*x0 THEN x := 0.1D0 * x; INC(e) END ;
(* Generate the mantissa digits of x *)
Reals.ConvertL(x, n, d); Reals.ConvertL(x, n, d);
DEC(n); Write(W, d[n]); Write(W, "."); DEC(n); Write(W, d[n]); Write(W, ".");
REPEAT DEC(n); Write(W, d[n]) UNTIL n = 0; REPEAT DEC(n); Write(W, d[n]) UNTIL n = 0;
Write(W, "D"); Write(W, "D");
IF e < 0 THEN Write(W, "-"); e := -e ELSE Write(W, "+") END; IF e < 0 THEN Write(W, "-"); e := -e ELSE Write(W, "+") END;
Write(W, CHR(e DIV 100 + 30H)); e := e MOD 100; Write(W, CHR(e DIV 100 + 30H)); e := e MOD 100;
@ -865,6 +869,7 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91*
u := u.next u := u.next
END; END;
r := msg.r; r := msg.r;
IF T.notify # NIL THEN T.notify(T, unmark, 0, 0) END
END Store; END Store;
PROCEDURE Close* (T: Text; name: ARRAY OF CHAR); PROCEDURE Close* (T: Text; name: ARRAY OF CHAR);
@ -877,4 +882,4 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91*
END Close; END Close;
BEGIN del := NIL; NEW(FontsDefault); FontsDefault.name := "Syntax10.Scn.Fnt" BEGIN del := NIL; NEW(FontsDefault); FontsDefault.name := "Syntax10.Scn.Fnt"
END Texts0. END Texts.