Преглед на файлове

synchronized with original

Alexander Shiryaev преди 9 години
родител
ревизия
fa9d9ba195

+ 3 - 3
BlackBox/Po/Files/Edit.Mod.txt

@@ -1,4 +1,4 @@
-MODULE Edit; (*JG 2.11.90 / NW 18.1.92 /30.12.95 / 10.10.10 / NW 10.1.2013*)
+MODULE Edit; (*JG 2.11.90 / NW 28.11.2015*)
   IMPORT Files, Fonts, Texts, Display, Viewers, Oberon, MenuViewers, TextFrames;
 
   CONST CR = 0DX; maxlen = 32;
@@ -139,7 +139,7 @@ MODULE Edit; (*JG 2.11.90 / NW 18.1.92 /30.12.95 / 10.10.10 / NW 10.1.2013*)
     END Forward;
 
   BEGIN V := Oberon.Par.vwr;
-    IF Oberon.Par.frame # V.dsc THEN V := Oberon.MarkedViewer() END;
+    IF Oberon.Par.frame # V.dsc THEN V := Oberon.FocusViewer END;
     IF (V.dsc # NIL) & (V.dsc.next IS TextFrames.Frame) THEN
       Text := V.dsc.next(TextFrames.Frame);
       prevTime := time; Oberon.GetSelection(T, beg, end, time);
@@ -178,7 +178,7 @@ MODULE Edit; (*JG 2.11.90 / NW 18.1.92 /30.12.95 / 10.10.10 / NW 10.1.2013*)
       V: Viewers.Viewer;
       beg, end, time: LONGINT;
   BEGIN
-    V := Oberon.MarkedViewer();
+    V := Oberon.FocusViewer;
     IF (V.dsc # NIL) & (V.dsc.next IS TextFrames.Frame) THEN
       Text := V.dsc.next(TextFrames.Frame);
       Oberon.GetSelection(T, beg, end, time);

+ 2 - 2
BlackBox/Po/Files/Oberon.Mod.txt

@@ -1,4 +1,4 @@
-MODULE Oberon; (*JG 6.9.90 / 23.9.93 / 13.8.94 / NW 14.4.2013 / 22.12.2013*)
+MODULE Oberon; (*JG 6.9.90 / 23.9.93 / 13.8.94 / NW 14.4.2013 / 22.12.2015*)
   IMPORT SYSTEM, Kernel, Files, Modules, Input, Display, Viewers, Fonts, Texts;
 
   CONST (*message ids*)
@@ -307,7 +307,7 @@ MODULE Oberon; (*JG 6.9.90 / 23.9.93 / 13.8.94 / NW 14.4.2013 / 22.12.2013*)
   PROCEDURE GC;
     VAR mod: Modules.Module;
   BEGIN
-    IF (ActCnt = 0) OR (Kernel.allocated >= Kernel.heapLim - Kernel.heapOrg - 10000H) THEN
+    IF (ActCnt <= 0) OR (Kernel.allocated >= Kernel.heapLim - Kernel.heapOrg - 10000H) THEN
       mod := Modules.root; LED(21H);
       WHILE mod # NIL DO
         IF mod.name[0] # 0X THEN Kernel.Mark(mod.ptr) END ;

+ 7 - 7
BlackBox/Po/Files/System.Mod.txt

@@ -1,4 +1,4 @@
-MODULE System; (*JG 3.10.90 / NW 12.10.93 / NW 18.5.2013*)
+MODULE System; (*JG 3.10.90 / NW 12.10.93 / NW 28.11.2015*)
   IMPORT SYSTEM, Kernel, FileDir, Files, Modules,
     Input, Display, Viewers, Fonts, Texts, Oberon, MenuViewers, TextFrames;
 
@@ -68,7 +68,7 @@ MODULE System; (*JG 3.10.90 / NW 12.10.93 / NW 18.5.2013*)
   END Date;
 
   PROCEDURE Collect*;
-  BEGIN Oberon.Collect(1)
+  BEGIN Oberon.Collect(0)
   END Collect;
 
   (* ------------- Toolbox for standard display ---------------*)
@@ -87,10 +87,10 @@ MODULE System; (*JG 3.10.90 / NW 12.10.93 / NW 18.5.2013*)
   END Open;
 
   PROCEDURE Clear*;  (*used to clear Log*)
-    VAR T: Texts.Text; buf: Texts.Buffer;
-  BEGIN
-    IF Oberon.Par.frame = Oberon.Par.vwr.dsc THEN
-      T := Oberon.Par.frame.next(TextFrames.Frame).text; Texts.Delete(T, 0, T.len, buf)
+    VAR T: Texts.Text; F: Display.Frame; buf: Texts.Buffer;
+  BEGIN F := Oberon.Par.frame;
+    IF (F # NIL) & (F.next IS TextFrames.Frame) & (F = Oberon.Par.vwr.dsc) THEN
+      T := F.next(TextFrames.Frame).text; Texts.Delete(T, 0, T.len, buf)
     END
   END Clear;
 
@@ -161,7 +161,7 @@ MODULE System; (*JG 3.10.90 / NW 12.10.93 / NW 18.5.2013*)
     ELSE
       WHILE S.class = Texts.Name DO Free1(S); Texts.Scan(S) END
     END ;
-    Oberon.Collect(1)
+    Oberon.Collect(0)
   END Free;
 
   PROCEDURE FreeFonts*;

+ 57 - 70
BlackBox/Po/Files/TextFrames.Mod.txt

@@ -1,8 +1,8 @@
-MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
+MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 16.11.2015*)
   IMPORT Modules, Input, Display, Viewers, Fonts, Texts, Oberon, MenuViewers;
 
   CONST replace* = 0; insert* = 1; delete* = 2; unmark* = 3; (*message id*)
-    BS = 8X; TAB = 9X; CR = 0DX; DEL = 7FX; FrameColor = 1;
+    BS = 8X; TAB = 9X; CR = 0DX; DEL = 7FX;
 
   TYPE Line = POINTER TO LineDesc;
     LineDesc = RECORD
@@ -34,10 +34,6 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
       trailer: Line
     END;
 
-    (*mark < 0: arrow mark
-      mark = 0: no mark
-      mark > 0: position mark*)
-
     UpdateMsg* = RECORD (Display.FrameMsg)
       id*: INTEGER;
       text*: Texts.Text;
@@ -92,12 +88,11 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
     END
   END UpdateMark;
 
-  PROCEDURE SetChangeMark (F: Frame; col: INTEGER);  (*in corner*)
-    VAR mode: INTEGER;
+  PROCEDURE SetChangeMark (F: Frame; on: BOOLEAN);  (*in corner*)
   BEGIN
     IF F.H > menuH THEN
-      IF col = 0 THEN Display.ReplConst(Display.black, F.X+F.W-12, F.Y+F.H-12, 8, 8, Display.replace)
-      ELSE Display.CopyPattern(Display.white, Display.block, F.X+F.W-12, F.Y+F.H-12, Display.paint)
+      IF on THEN  Display.CopyPattern(Display.white, Display.block, F.X+F.W-12, F.Y+F.H-12, Display.paint)
+      ELSE Display.ReplConst(F.col, F.X+F.W-12, F.Y+F.H-12, 8, 8, Display.replace)
       END
     END
   END SetChangeMark;
@@ -114,8 +109,8 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
 
   PROCEDURE DisplayLine (F: Frame; L: Line;
     VAR R: Texts.Reader; X, Y: INTEGER; len: LONGINT);
-    VAR patadr, NX, Xlim, dx, x, y, w, h: INTEGER;
-  BEGIN NX := F.X + F.W; Xlim := NX - 40;
+    VAR patadr, NX,  dx, x, y, w, h: INTEGER;
+  BEGIN NX := F.X + F.W;
     WHILE (nextCh # CR) & (R.fnt # NIL) DO
       Fonts.GetPat(R.fnt, nextCh, dx, x, y, w, h, patadr);
       IF (X + x + w <= NX) & (h # 0) THEN
@@ -148,10 +143,9 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
 
   PROCEDURE Restore* (F: Frame);
     VAR R: Texts.Reader; L, l: Line; curY, botY: INTEGER;
-  BEGIN (*F.mark = 0*)
-    Display.ReplConst(F.col, F.X, F.Y, F.W, F.H, Display.replace);
+  BEGIN  Display.ReplConst(F.col, F.X, F.Y, F.W, F.H, Display.replace);
     IF F.left >= barW THEN
-      Display.ReplConst(FrameColor, F.X + barW - 1, F.Y, 1, F.H, Display.invert)
+      Display.ReplConst(Display.white, F.X + barW - 1, F.Y, 1, F.H, Display.invert)
     END;
     Validate(F.text, F.org);
     botY := F.Y + F.bot + dsr;
@@ -167,16 +161,15 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
   END Restore;
 
   PROCEDURE Suspend* (F: Frame);
-  BEGIN (*F.mark = 0*) F.trailer.next := F.trailer
+  BEGIN  F.trailer.next := F.trailer
   END Suspend;
 
   PROCEDURE Extend* (F: Frame; newY: INTEGER);
     VAR R: Texts.Reader; L, l: Line;
     org: LONGINT; curY, botY: INTEGER;
-  BEGIN (*F.mark = 0*)
-    Display.ReplConst(F.col, F.X, newY, F.W, F.Y - newY, Display.replace);
+  BEGIN Display.ReplConst(F.col, F.X, newY, F.W, F.Y - newY, Display.replace);
     IF F.left >= barW THEN
-      Display.ReplConst(FrameColor, F.X + barW - 1, newY, 1, F.Y - newY, Display.invert)
+      Display.ReplConst(Display.white, F.X + barW - 1, newY, 1, F.Y - newY, Display.invert)
     END;
     F.H := F.H + F.Y - newY; F.Y := newY;
     IF F.trailer.next = F.trailer THEN Validate(F.text, F.org) END;
@@ -197,8 +190,7 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
 
   PROCEDURE Reduce* (F: Frame; newY: INTEGER);
     VAR L: Line; curY, botY: INTEGER;
-  BEGIN (*F.mark = 0*)
-    F.H := F.H + F.Y - newY; F.Y := newY;
+  BEGIN F.H := F.H + F.Y - newY; F.Y := newY;
     botY := F.Y + F.bot + dsr;
     L := F.trailer; curY := F.Y + F.H - F.top - asr;
     WHILE (L.next # F.trailer) & (curY >= botY) DO
@@ -220,8 +212,7 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
       IF pos < F.org THEN Mark(F, FALSE);
         Display.ReplConst(F.col, F.X + F.left, F.Y, F.W - F.left, F.H, Display.replace);
         botY := F.Y; F.Y := F.Y + F.H; F.H := 0;
-        F.org := pos; F.trailer.next := F.trailer; Extend(F, botY); Mark(F, TRUE);
-        IF F.text.changed THEN SetChangeMark(F, 1) END
+        F.org := pos; F.trailer.next := F.trailer; Extend(F, botY); Mark(F, TRUE)
       ELSIF pos > F.org THEN
         org := F.org; L := F.trailer.next; curY := F.Y + F.H - F.top - asr;
         WHILE (L.next # F.trailer) & (org # pos) DO
@@ -248,11 +239,11 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
           Display.ReplConst(F.col, F.X + F.left, F.Y, F.W - F.left, F.H, Display.replace);
           botY := F.Y; F.Y := F.Y + F.H; F.H := 0;
           F.org := pos; F.trailer.next := F.trailer; Extend(F, botY);
-          Mark(F, TRUE);
-          IF F.text.changed THEN SetChangeMark(F, 1) END
+          Mark(F, TRUE)
         END
       END
-    END
+    END ;
+    SetChangeMark(F, F.text.changed)
   END Show;
 
   PROCEDURE LocateLine (F: Frame; y: INTEGER; VAR loc: Location);
@@ -337,7 +328,7 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
   BEGIN
     IF F.carloc.x < F.W THEN
       IF (F.carloc.y >= 10) & (F.carloc.x + 12 < F.W) THEN
-        Display.CopyPattern(Display.white, Display.hook, F.X + F.carloc.x, F.Y + F.carloc.y - 8, Display.invert)
+        Display.CopyPattern(Display.white, Display.hook, F.X + F.carloc.x, F.Y + F.carloc.y - 10, Display.invert)
       END
     END
   END FlipCaret;
@@ -479,7 +470,7 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
       IF L # F.trailer THEN
         Texts.OpenReader(R, F.text, org); Texts.Read(R, nextCh);
         len := beg - org; wid := Width(R, len);
-        ReplConst(F.col, F, F.X + F.left + wid, curY - dsr, L.wid - wid, lsp, 0);
+        ReplConst(F.col, F, F.X + F.left + wid, curY - dsr, L.wid - wid, lsp, Display.replace);
         DisplayLine(F, L, R, F.X + F.left + wid, curY, len);
         org := org + L.len; L := L.next; curY := curY - lsp;
         WHILE (L # F.trailer) & (org <= end) DO
@@ -506,7 +497,7 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
         botY := F.Y + F.bot + dsr;
         Texts.OpenReader(R, F.text, org); Texts.Read(R, nextCh);
         len := beg - org; wid := Width(R, len);
-        ReplConst (F.col, F, F.X + F.left + wid, curY - dsr, L.wid - wid, lsp, 0);
+        ReplConst (F.col, F, F.X + F.left + wid, curY - dsr, L.wid - wid, lsp, Display.replace);
         DisplayLine(F, L, R, F.X + F.left + wid, curY, len);
         org := org + L.len; curY := curY - lsp;
         Y0 := curY; L0 := L.next;
@@ -565,7 +556,7 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
         Y1 := curY;
         Texts.OpenReader(R, F.text, org0); Texts.Read(R, nextCh);
         len := beg - org0; wid := Width(R, len);
-        ReplConst (F.col, F, F.X + F.left + wid, Y0 - dsr, L0.wid - wid, lsp, 0);
+        ReplConst (F.col, F, F.X + F.left + wid, Y0 - dsr, L0.wid - wid, lsp, Display.replace);
         DisplayLine(F, L0, R, F.X + F.left + wid, Y0, len);
         Y0 := Y0 - lsp;
         IF L # L0.next THEN
@@ -634,14 +625,14 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
       IF F.carloc.pos > F.org THEN
         Texts.Delete(F.text, F.carloc.pos - 1, F.carloc.pos, DelBuf); SetCaret(F, F.carloc.pos - 1)
       END
-    ELSIF ch = 3X THEN (*!c  copy*)
+    ELSIF ch = 3X THEN (* ctrl-c  copy*)
       IF F.hasSel THEN
         NEW(TBuf); Texts.OpenBuf(TBuf); Texts.Save(F.text, F.selbeg.pos, F.selend.pos, TBuf)
       END
-    ELSIF ch = 16X THEN (*!v  paste*)
+    ELSIF ch = 16X THEN (*ctrl-v  paste*)
       NEW(buf); Texts.OpenBuf(buf); Texts.Copy(TBuf, buf); Texts.Insert(F.text, F.carloc.pos, buf);
-      SetCaret(F, F.carloc.pos + buf.len)
-    ELSIF ch = 18X THEN (*!x,  cut*)
+      SetCaret(F, F.carloc.pos + TBuf.len)
+    ELSIF ch = 18X THEN (*ctrl-x,  cut*)
       IF F.hasSel THEN
         NEW(TBuf); Texts.OpenBuf(TBuf); Texts.Delete(F.text, F.selbeg.pos, F.selend.pos, TBuf)
       END
@@ -662,7 +653,7 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
 
   PROCEDURE Modify* (F: Frame; id, dY, Y, H: INTEGER);
   BEGIN
-    Mark(F, FALSE); RemoveMarks(F);
+    Mark(F, FALSE); RemoveMarks(F); SetChangeMark(F,  FALSE);
     IF id = MenuViewers.extend THEN
       IF dY > 0 THEN Display.CopyBlock(F.X, F.Y, F.W, F.H, F.X, F.Y + dY, 0); F.Y := F.Y + dY END;
       Extend(F, Y)
@@ -670,9 +661,7 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
       Reduce(F, Y + dY);
       IF dY > 0 THEN Display.CopyBlock(F.X, F.Y, F.W, F.H, F.X, Y, 0); F.Y := Y END
     END;
-    IF F.H > 0 THEN Mark(F, TRUE);
-      IF F.text.changed THEN SetChangeMark (F, 1) END
-    END
+    IF F.H > 0 THEN Mark(F, TRUE); SetChangeMark(F,  F.text.changed) END
   END Modify;
 
   PROCEDURE Open* (F: Frame; H: Display.Handler; T: Texts.Text; org: LONGINT;
@@ -714,16 +703,13 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
   END GetSelection;
 
   PROCEDURE Update* (F: Frame; VAR M: UpdateMsg);
-  BEGIN (*F.text = M.text*)
+  BEGIN (*F.text = M.text*) SetChangeMark(F, FALSE);
     RemoveMarks(F); Oberon.RemoveMarks(F.X, F.Y, F.W, F.H);
-    IF M.id = unmark THEN SetChangeMark (F, 0)
-    ELSE
-      IF M.id = replace THEN Replace(F, M.beg, M.end)
-      ELSIF M.id = insert THEN Insert(F, M.beg, M.end)
-      ELSIF M.id = delete THEN Delete(F, M.beg, M.end)
-      END ;
-      SetChangeMark(F, 1)
-    END
+    IF M.id = replace THEN Replace(F, M.beg, M.end)
+    ELSIF M.id = insert THEN Insert(F, M.beg, M.end)
+    ELSIF M.id = delete THEN Delete(F, M.beg, M.end)
+    END ;
+    SetChangeMark(F,  F.text.changed)
   END Update;
 
   PROCEDURE Edit* (F: Frame; X, Y: INTEGER; Keys: SET);
@@ -731,7 +717,6 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
       text: Texts.Text;
       buf: Texts.Buffer;
       v: Viewers.Viewer;
-      loc0, loc1: Location;
       beg, end, time, pos: LONGINT;
       keysum: SET;
       fnt: Fonts.Font;
@@ -742,6 +727,7 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
       IF Keys = {2} THEN   (*ML, scroll up*)
         TrackLine(F, X, Y, pos, keysum);
         IF (pos >= 0) & (keysum = {2}) THEN
+          SetChangeMark(F, FALSE);
           RemoveMarks(F); Oberon.RemoveMarks(F.X, F.Y, F.W, F.H);
           Show(F, pos)
         END
@@ -749,22 +735,21 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
         REPEAT Input.Mouse(Keys, X, Y); keysum := keysum + Keys;
           Oberon.DrawMouse(ScrollMarker, X, Y)
         UNTIL Keys = {};
-        IF ~(keysum = {0, 1, 2}) THEN
+        IF keysum # {0, 1, 2} THEN
           IF 0 IN keysum THEN pos := 0
           ELSIF 2 IN keysum THEN pos := F.text.len - 100
           ELSE pos := (F.Y + F.H - Y) * (F.text.len) DIV F.H
           END ;
+          SetChangeMark(F, FALSE);
           RemoveMarks(F); Oberon.RemoveMarks(F.X, F.Y, F.W, F.H);
           Show(F, pos)
         END
       ELSIF Keys = {0} THEN   (*MR, scroll down*)
         TrackLine(F, X, Y, pos, keysum);
         IF keysum = {0} THEN
-          LocateLine(F, Y, loc0); LocateLine(F, F.Y, loc1);
-          pos := F.org - loc1.org + loc0.org;
-          IF pos < 0 THEN pos := 0 END ;
+          SetChangeMark(F, FALSE);
           RemoveMarks(F); Oberon.RemoveMarks(F.X, F.Y, F.W, F.H);
-          Show(F, pos)
+          Show(F, F.org*2 - pos - 100)
         END
       END
     ELSE  (*text area*)
@@ -814,22 +799,24 @@ MODULE TextFrames; (*JG 8.10.90 / NW 10.5.2013 / 15.10.2015*)
   PROCEDURE Handle* (F: Display.Frame; VAR M: Display.FrameMsg);
     VAR F1: Frame; buf: Texts.Buffer;
   BEGIN
-    CASE M OF
-    Oberon.InputMsg:
-      IF M.id = Oberon.track THEN Edit(F(Frame), M.X, M.Y, M.keys)
-      ELSIF M.id = Oberon.consume THEN
-        IF F(Frame).hasCar THEN Write(F(Frame), M.ch, M.fnt, M.col, M.voff) END
-      END |
-    Oberon.ControlMsg:
-      IF M.id = Oberon.defocus THEN Defocus(F(Frame))
-      ELSIF M.id = Oberon.neutralize THEN Neutralize(F(Frame))
-      END |
-    Oberon.SelectionMsg:
-      GetSelection(F(Frame), M.text, M.beg, M.end, M.time) |
-    Oberon.CopyMsg: Copy(F(Frame), F1); M.F := F1 |
-    MenuViewers.ModifyMsg: Modify(F(Frame), M.id, M.dY, M.Y, M.H) |
-    CopyOverMsg: CopyOver(F(Frame), M.text, M.beg, M.end) |
-    UpdateMsg: IF F(Frame).text = M.text THEN Update(F(Frame), M) END
+    CASE F OF Frame:
+      CASE M OF
+      Oberon.InputMsg:
+        IF M.id = Oberon.track THEN Edit(F, M.X, M.Y, M.keys)
+        ELSIF M.id = Oberon.consume THEN
+          IF F.hasCar THEN Write(F, M.ch, M.fnt, M.col, M.voff) END
+        END |
+      Oberon.ControlMsg:
+        IF M.id = Oberon.defocus THEN Defocus(F)
+        ELSIF M.id = Oberon.neutralize THEN Neutralize(F)
+        END |
+      Oberon.SelectionMsg:
+        GetSelection(F, M.text, M.beg, M.end, M.time) |
+      Oberon.CopyMsg: Copy(F, F1); M.F := F1 |
+      MenuViewers.ModifyMsg: Modify(F, M.id, M.dY, M.Y, M.H) |
+      CopyOverMsg: CopyOver(F, M.text, M.beg, M.end) |
+      UpdateMsg: IF F.text = M.text THEN Update(F, M) END
+      END
     END
   END Handle;
 
@@ -870,5 +857,5 @@ BEGIN NEW(TBuf); NEW(DelBuf);
   selH := lsp; markW := lsp DIV 2;
   eolW := lsp DIV 2;
   ScrollMarker.Fade := FlipSM; ScrollMarker.Draw := FlipSM;
-  Texts.OpenWriter(W); Texts.OpenWriter(KW);
+  Texts.OpenWriter(W); Texts.OpenWriter(KW)
 END TextFrames.

BIN
BlackBox/Po/Mod/Edit.odc


BIN
BlackBox/Po/Mod/Oberon2.odc


BIN
BlackBox/Po/Mod/System2.odc


BIN
BlackBox/Po/Mod/TextFrames.odc


+ 1 - 1
README.md

@@ -1,3 +1,3 @@
 [Project Oberon](http://www.inf.ethz.ch/personal/wirth/ProjectOberon/index.html) @ [BlackBox Component Builder](http://www.oberon.ch/blackbox.html)
 
-Alexander V. Shiryaev, 2015
+Alexander V. Shiryaev, 2016