Copyright (C) 1992, Digital Equipment Corporation
All rights reserved.
See the file COPYRIGHT for a full description.
Last modified on Tue Jun 20 21:06:58 PDT 1995 by heydon
MODULE TextImpl;
IMPORT ExternalProc;
FROM ExternalProc IMPORT Closure, Bind;
IMPORT JunoScope;
IMPORT JunoArgs;
IMPORT Text, Atom, Fmt;
VAR (*CONST*)
TextAtom := Atom.FromText("Text");
Cat := Atom.FromText("Cat");
Length := Atom.FromText("Length");
Sub := Atom.FromText("Sub");
GetChar := Atom.FromText("GetChar");
FromChar := Atom.FromText("FromChar");
FromNum := Atom.FromText("FromNum");
FindCh := Atom.FromText("FindChar");
FindChR := Atom.FromText("FindCharR");
PROCEDURE New(): JunoScope.Mod =
VAR
scp := JunoScope.New(NIL, size := 6);
res := NEW(JunoScope.Mod, public_scp := scp, scp := scp);
BEGIN
ExternalProc.SetupBind(TextAtom, scp);
Bind(Cat, NEW(Closure, invoke := CatProc), in := 2, out := 1);
Bind(Length, NEW(Closure, invoke := LengthProc), in := 1, out := 1);
Bind(Sub, NEW(Closure, invoke := SubProc), in := 3, out := 1);
Bind(GetChar, NEW(Closure, invoke := GetCharProc), in := 2, out := 1);
Bind(FromChar, NEW(Closure, invoke := FromCharProc), in := 1, out := 1);
Bind(FromNum, NEW(Closure, invoke := FromNumProc), in := 2, out := 1);
Bind(FindCh, NEW(Closure, invoke := FindChProc), in := 2, out := 1);
Bind(FindChR, NEW(Closure, invoke := FindChRProc), in := 2, out := 1);
RETURN res
END New;
PROCEDURE CatProc(<*UNUSED*> cl: Closure): BOOLEAN =
VAR
err := FALSE;
t := JunoArgs.ReadText(2, err);
u := JunoArgs.ReadText(1, err);
BEGIN
IF err THEN RETURN FALSE END;
JunoArgs.WriteText(3, Text.Cat(t, u));
RETURN TRUE
END CatProc;
PROCEDURE LengthProc(<*UNUSED*> cl: Closure): BOOLEAN =
VAR err := FALSE; t := JunoArgs.ReadText(1, err); BEGIN
IF err THEN RETURN FALSE END;
JunoArgs.WriteInt(2, Text.Length(t));
RETURN TRUE
END LengthProc;
PROCEDURE SubProc(<*UNUSED*> cl: Closure): BOOLEAN =
VAR
err := FALSE;
t := JunoArgs.ReadText(3, err);
i := JunoArgs.ReadInt(2, err);
n := JunoArgs.ReadInt(1, err);
BEGIN
IF NOT err AND i >= 0 AND n >=0 THEN
JunoArgs.WriteText(4, Text.Sub(t, i, n));
RETURN TRUE
END;
RETURN FALSE
END SubProc;
PROCEDURE GetCharProc(<*UNUSED*> cl: Closure): BOOLEAN =
VAR
err := FALSE;
t := JunoArgs.ReadText(2, err);
n := JunoArgs.ReadInt(1, err);
BEGIN
IF NOT err AND n >= 0 AND n < Text.Length(t) THEN
JunoArgs.WriteInt(3, ORD(Text.GetChar(t, n)));
RETURN TRUE
END;
RETURN FALSE
END GetCharProc;
PROCEDURE FromCharProc(<*UNUSED*> cl: Closure): BOOLEAN =
VAR err := FALSE; ch := JunoArgs.ReadInt(1, err); BEGIN
IF NOT err AND ch >= 0 AND ch < 256 THEN
JunoArgs.WriteText(2, Text.FromChar(VAL(ch, CHAR)));
RETURN TRUE
END;
RETURN FALSE
END FromCharProc;
PROCEDURE FromNumProc(<*UNUSED*> cl: Closure): BOOLEAN =
VAR
err := FALSE;
v := JunoArgs.ReadReal(2, err);
pr := JunoArgs.ReadInt(1, err);
BEGIN
IF NOT err AND pr >= 0 THEN
JunoArgs.WriteText(3, Fmt.Real(FLOAT(v, REAL), prec := pr));
RETURN TRUE
END;
RETURN FALSE
END FromNumProc;
PROCEDURE FindChProc(<*UNUSED*> cl: Closure): BOOLEAN =
VAR
err := FALSE;
t := JunoArgs.ReadText(2, err);
ch := JunoArgs.ReadInt(1, err);
BEGIN
IF NOT err AND ch >= 0 AND ch < 256 THEN
JunoArgs.WriteInt(3, Text.FindChar(t, VAL(ch, CHAR)));
RETURN TRUE
END;
RETURN FALSE
END FindChProc;
PROCEDURE FindChRProc(<*UNUSED*> cl: Closure): BOOLEAN =
VAR
err := FALSE;
t := JunoArgs.ReadText(2, err);
ch := JunoArgs.ReadInt(1, err);
BEGIN
IF NOT err AND ch >= 0 AND ch < 256 THEN
JunoArgs.WriteInt(3, Text.FindCharR(t, VAL(ch, CHAR)));
RETURN TRUE
END;
RETURN FALSE
END FindChRProc;
BEGIN
END TextImpl.