From 7aad5f93e4e68c02cc005ceab5110bd2deffcb79 Mon Sep 17 00:00:00 2001 From: ilovb Date: Fri, 16 May 2014 19:36:39 +0400 Subject: [PATCH 1/7] Support of the Component Pascal language http://en.wikipedia.org/wiki/Component_Pascal --- lib/linguist/languages.yml | 13 +++ samples/Component Pascal/Example.cp | 130 ++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 samples/Component Pascal/Example.cp diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 7350bb2a..ea50a4af 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -211,6 +211,11 @@ Befunge: extensions: - .befunge +Component Pascal Document: + type: programming + extensions: + - .odc + BlitzBasic: type: programming aliases: @@ -429,6 +434,14 @@ Common Lisp: - clisp - ecl +Component Pascal: + type: programming + ace_mode: Pascal + color: "#b0ce4e" + extensions: + - .cp + - .cps + Coq: type: programming extensions: diff --git a/samples/Component Pascal/Example.cp b/samples/Component Pascal/Example.cp new file mode 100644 index 00000000..5bace2c4 --- /dev/null +++ b/samples/Component Pascal/Example.cp @@ -0,0 +1,130 @@ +MODULE ObxControls; +(** + project = "BlackBox" + organization = "www.oberon.ch" + contributors = "Oberon microsystems" + version = "System/Rsrc/About" + copyright = "System/Rsrc/About" + license = "Docu/BB-License" + changes = "" + issues = "" + +**) + +IMPORT Dialog, Ports, Properties, Views; + +CONST beginner = 0; advanced = 1; expert = 2; guru = 3; (* user classes *) + +TYPE + View = POINTER TO RECORD (Views.View) + size: INTEGER (* border size in mm *) + END; + +VAR + data*: RECORD + class*: INTEGER; (* current user class *) + list*: Dialog.List; (* list of currently available sizes, derived from class *) + width*: INTEGER (* width of next view to be opened. Derived from + class, or entered through a text entry field *) + END; + + predef: ARRAY 6 OF INTEGER; (* table of predefined sizes *) + + +PROCEDURE SetList; +BEGIN + IF data.class = beginner THEN + data.list.SetLen(1); + data.list.SetItem(0, "default") + ELSIF data.class = advanced THEN + data.list.SetLen(4); + data.list.SetItem(0, "default"); + data.list.SetItem(1, "small"); + data.list.SetItem(2, "medium"); + data.list.SetItem(3, "large"); + ELSE + data.list.SetLen(6); + data.list.SetItem(0, "default"); + data.list.SetItem(1, "small"); + data.list.SetItem(2, "medium"); + data.list.SetItem(3, "large"); + data.list.SetItem(4, "tiny"); + data.list.SetItem(5, "huge"); + END +END SetList; + +(* View *) + +PROCEDURE (v: View) CopyFromSimpleView (source: Views.View); +BEGIN + v.size := source(View).size +END CopyFromSimpleView; + +PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER); +BEGIN (* fill view with a red square of size v.size *) + IF v.size = 0 THEN v.size := predef[0] END; (* lazy initialization of size *) + f.DrawRect(0, 0, v.size, v.size, Ports.fill, Ports.red) +END Restore; + +PROCEDURE (v: View) HandlePropMsg (VAR msg: Views.PropMessage); +BEGIN + WITH msg: Properties.SizePref DO + IF v.size = 0 THEN v.size := predef[0] END; (* lazy initialization of size *) + msg.w := v.size; msg.h := v.size (* tell environment about desired width and height *) + ELSE (* ignore other messages *) + END +END HandlePropMsg; + +(* notifiers *) + +PROCEDURE ClassNotify* (op, from, to: INTEGER); +BEGIN (* react to change in data.class *) + IF op = Dialog.changed THEN + IF (to = beginner) OR (to = advanced) & (data.list.index > 3) THEN + (* if class is reduced, make sure that selection contains legal elements *) + data.list.index := 0; data.width := predef[0]; (* modify interactor *) + Dialog.Update(data) (* redraw controls where necessary *) + END; + SetList; + Dialog.UpdateList(data.list) (* reconstruct list box contents *) + END +END ClassNotify; + +PROCEDURE ListNotify* (op, from, to: INTEGER); +BEGIN (* reacto to change in data.list (index to was selected) *) + IF op = Dialog.changed THEN + data.width := predef[to]; (* modify interactor *) + Dialog.Update(data) (* redraw controls where necessary *) + END +END ListNotify; + +(* guards *) + +PROCEDURE ListGuard* (VAR par: Dialog.Par); +BEGIN (* disable list box for a beginner *) + par.disabled := data.class = beginner +END ListGuard; + +PROCEDURE WidthGuard* (VAR par: Dialog.Par); +BEGIN (* make text entry field read-only if user is not guru *) + par.readOnly := data.class # guru +END WidthGuard; + +(* commands *) + +PROCEDURE Open*; + VAR v: View; +BEGIN + NEW(v); (* create and initialize a new view *) + v.size := data.width * Ports.mm; (* define view's size in function of class *) + Views.OpenAux(v, "Example") (* open the view in a window *) +END Open; + +BEGIN (* initialization of global variables *) + predef[0] := 40; predef[1] := 30; predef[2] := 50; (* predefined sizes *) + predef[3] := 70; predef[4] := 20; predef[5] := 100; + data.class := beginner; (* default values *) + data.list.index := 0; + data.width := predef[0]; + SetList +END ObxControls. From 4b6f05b4d12b827075d4721f4cf7dc8717b5f2bb Mon Sep 17 00:00:00 2001 From: ilovb Date: Fri, 16 May 2014 22:17:05 +0400 Subject: [PATCH 2/7] remove ace mode --- lib/linguist/languages.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index ea50a4af..e0c6ad86 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -436,7 +436,6 @@ Common Lisp: Component Pascal: type: programming - ace_mode: Pascal color: "#b0ce4e" extensions: - .cp From 8e6efc3a7de95bb6807393b42713aa2ff28c0d29 Mon Sep 17 00:00:00 2001 From: ilovb Date: Fri, 16 May 2014 22:39:18 +0400 Subject: [PATCH 3/7] remove Component Pascal Document --- lib/linguist/languages.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index e0c6ad86..192be4ff 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -211,11 +211,6 @@ Befunge: extensions: - .befunge -Component Pascal Document: - type: programming - extensions: - - .odc - BlitzBasic: type: programming aliases: From c2b53db96d1d3862d029d673880c8100ad2794bd Mon Sep 17 00:00:00 2001 From: ilovb Date: Fri, 16 May 2014 23:08:28 +0400 Subject: [PATCH 4/7] remove Component Pascal examples --- samples/Component Pascal/Example.cp | 130 ---------------------------- 1 file changed, 130 deletions(-) delete mode 100644 samples/Component Pascal/Example.cp diff --git a/samples/Component Pascal/Example.cp b/samples/Component Pascal/Example.cp deleted file mode 100644 index 5bace2c4..00000000 --- a/samples/Component Pascal/Example.cp +++ /dev/null @@ -1,130 +0,0 @@ -MODULE ObxControls; -(** - project = "BlackBox" - organization = "www.oberon.ch" - contributors = "Oberon microsystems" - version = "System/Rsrc/About" - copyright = "System/Rsrc/About" - license = "Docu/BB-License" - changes = "" - issues = "" - -**) - -IMPORT Dialog, Ports, Properties, Views; - -CONST beginner = 0; advanced = 1; expert = 2; guru = 3; (* user classes *) - -TYPE - View = POINTER TO RECORD (Views.View) - size: INTEGER (* border size in mm *) - END; - -VAR - data*: RECORD - class*: INTEGER; (* current user class *) - list*: Dialog.List; (* list of currently available sizes, derived from class *) - width*: INTEGER (* width of next view to be opened. Derived from - class, or entered through a text entry field *) - END; - - predef: ARRAY 6 OF INTEGER; (* table of predefined sizes *) - - -PROCEDURE SetList; -BEGIN - IF data.class = beginner THEN - data.list.SetLen(1); - data.list.SetItem(0, "default") - ELSIF data.class = advanced THEN - data.list.SetLen(4); - data.list.SetItem(0, "default"); - data.list.SetItem(1, "small"); - data.list.SetItem(2, "medium"); - data.list.SetItem(3, "large"); - ELSE - data.list.SetLen(6); - data.list.SetItem(0, "default"); - data.list.SetItem(1, "small"); - data.list.SetItem(2, "medium"); - data.list.SetItem(3, "large"); - data.list.SetItem(4, "tiny"); - data.list.SetItem(5, "huge"); - END -END SetList; - -(* View *) - -PROCEDURE (v: View) CopyFromSimpleView (source: Views.View); -BEGIN - v.size := source(View).size -END CopyFromSimpleView; - -PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER); -BEGIN (* fill view with a red square of size v.size *) - IF v.size = 0 THEN v.size := predef[0] END; (* lazy initialization of size *) - f.DrawRect(0, 0, v.size, v.size, Ports.fill, Ports.red) -END Restore; - -PROCEDURE (v: View) HandlePropMsg (VAR msg: Views.PropMessage); -BEGIN - WITH msg: Properties.SizePref DO - IF v.size = 0 THEN v.size := predef[0] END; (* lazy initialization of size *) - msg.w := v.size; msg.h := v.size (* tell environment about desired width and height *) - ELSE (* ignore other messages *) - END -END HandlePropMsg; - -(* notifiers *) - -PROCEDURE ClassNotify* (op, from, to: INTEGER); -BEGIN (* react to change in data.class *) - IF op = Dialog.changed THEN - IF (to = beginner) OR (to = advanced) & (data.list.index > 3) THEN - (* if class is reduced, make sure that selection contains legal elements *) - data.list.index := 0; data.width := predef[0]; (* modify interactor *) - Dialog.Update(data) (* redraw controls where necessary *) - END; - SetList; - Dialog.UpdateList(data.list) (* reconstruct list box contents *) - END -END ClassNotify; - -PROCEDURE ListNotify* (op, from, to: INTEGER); -BEGIN (* reacto to change in data.list (index to was selected) *) - IF op = Dialog.changed THEN - data.width := predef[to]; (* modify interactor *) - Dialog.Update(data) (* redraw controls where necessary *) - END -END ListNotify; - -(* guards *) - -PROCEDURE ListGuard* (VAR par: Dialog.Par); -BEGIN (* disable list box for a beginner *) - par.disabled := data.class = beginner -END ListGuard; - -PROCEDURE WidthGuard* (VAR par: Dialog.Par); -BEGIN (* make text entry field read-only if user is not guru *) - par.readOnly := data.class # guru -END WidthGuard; - -(* commands *) - -PROCEDURE Open*; - VAR v: View; -BEGIN - NEW(v); (* create and initialize a new view *) - v.size := data.width * Ports.mm; (* define view's size in function of class *) - Views.OpenAux(v, "Example") (* open the view in a window *) -END Open; - -BEGIN (* initialization of global variables *) - predef[0] := 40; predef[1] := 30; predef[2] := 50; (* predefined sizes *) - predef[3] := 70; predef[4] := 20; predef[5] := 100; - data.class := beginner; (* default values *) - data.list.index := 0; - data.width := predef[0]; - SetList -END ObxControls. From cf358077095d3d50c8b359f386960c1c1e554bc0 Mon Sep 17 00:00:00 2001 From: ilovb Date: Fri, 16 May 2014 23:29:52 +0400 Subject: [PATCH 5/7] add lexer for Component Pascal --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 192be4ff..ad3668e2 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -431,6 +431,7 @@ Common Lisp: Component Pascal: type: programming + lexer: Delphi color: "#b0ce4e" extensions: - .cp From 0d0e2195323a6917b230cc880270dcde5772b979 Mon Sep 17 00:00:00 2001 From: ilovb Date: Fri, 16 May 2014 23:47:27 +0400 Subject: [PATCH 6/7] add example for Component Pascal --- samples/Component Pascal/Example.cp | 130 ++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 samples/Component Pascal/Example.cp diff --git a/samples/Component Pascal/Example.cp b/samples/Component Pascal/Example.cp new file mode 100644 index 00000000..5bace2c4 --- /dev/null +++ b/samples/Component Pascal/Example.cp @@ -0,0 +1,130 @@ +MODULE ObxControls; +(** + project = "BlackBox" + organization = "www.oberon.ch" + contributors = "Oberon microsystems" + version = "System/Rsrc/About" + copyright = "System/Rsrc/About" + license = "Docu/BB-License" + changes = "" + issues = "" + +**) + +IMPORT Dialog, Ports, Properties, Views; + +CONST beginner = 0; advanced = 1; expert = 2; guru = 3; (* user classes *) + +TYPE + View = POINTER TO RECORD (Views.View) + size: INTEGER (* border size in mm *) + END; + +VAR + data*: RECORD + class*: INTEGER; (* current user class *) + list*: Dialog.List; (* list of currently available sizes, derived from class *) + width*: INTEGER (* width of next view to be opened. Derived from + class, or entered through a text entry field *) + END; + + predef: ARRAY 6 OF INTEGER; (* table of predefined sizes *) + + +PROCEDURE SetList; +BEGIN + IF data.class = beginner THEN + data.list.SetLen(1); + data.list.SetItem(0, "default") + ELSIF data.class = advanced THEN + data.list.SetLen(4); + data.list.SetItem(0, "default"); + data.list.SetItem(1, "small"); + data.list.SetItem(2, "medium"); + data.list.SetItem(3, "large"); + ELSE + data.list.SetLen(6); + data.list.SetItem(0, "default"); + data.list.SetItem(1, "small"); + data.list.SetItem(2, "medium"); + data.list.SetItem(3, "large"); + data.list.SetItem(4, "tiny"); + data.list.SetItem(5, "huge"); + END +END SetList; + +(* View *) + +PROCEDURE (v: View) CopyFromSimpleView (source: Views.View); +BEGIN + v.size := source(View).size +END CopyFromSimpleView; + +PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER); +BEGIN (* fill view with a red square of size v.size *) + IF v.size = 0 THEN v.size := predef[0] END; (* lazy initialization of size *) + f.DrawRect(0, 0, v.size, v.size, Ports.fill, Ports.red) +END Restore; + +PROCEDURE (v: View) HandlePropMsg (VAR msg: Views.PropMessage); +BEGIN + WITH msg: Properties.SizePref DO + IF v.size = 0 THEN v.size := predef[0] END; (* lazy initialization of size *) + msg.w := v.size; msg.h := v.size (* tell environment about desired width and height *) + ELSE (* ignore other messages *) + END +END HandlePropMsg; + +(* notifiers *) + +PROCEDURE ClassNotify* (op, from, to: INTEGER); +BEGIN (* react to change in data.class *) + IF op = Dialog.changed THEN + IF (to = beginner) OR (to = advanced) & (data.list.index > 3) THEN + (* if class is reduced, make sure that selection contains legal elements *) + data.list.index := 0; data.width := predef[0]; (* modify interactor *) + Dialog.Update(data) (* redraw controls where necessary *) + END; + SetList; + Dialog.UpdateList(data.list) (* reconstruct list box contents *) + END +END ClassNotify; + +PROCEDURE ListNotify* (op, from, to: INTEGER); +BEGIN (* reacto to change in data.list (index to was selected) *) + IF op = Dialog.changed THEN + data.width := predef[to]; (* modify interactor *) + Dialog.Update(data) (* redraw controls where necessary *) + END +END ListNotify; + +(* guards *) + +PROCEDURE ListGuard* (VAR par: Dialog.Par); +BEGIN (* disable list box for a beginner *) + par.disabled := data.class = beginner +END ListGuard; + +PROCEDURE WidthGuard* (VAR par: Dialog.Par); +BEGIN (* make text entry field read-only if user is not guru *) + par.readOnly := data.class # guru +END WidthGuard; + +(* commands *) + +PROCEDURE Open*; + VAR v: View; +BEGIN + NEW(v); (* create and initialize a new view *) + v.size := data.width * Ports.mm; (* define view's size in function of class *) + Views.OpenAux(v, "Example") (* open the view in a window *) +END Open; + +BEGIN (* initialization of global variables *) + predef[0] := 40; predef[1] := 30; predef[2] := 50; (* predefined sizes *) + predef[3] := 70; predef[4] := 20; predef[5] := 100; + data.class := beginner; (* default values *) + data.list.index := 0; + data.width := predef[0]; + SetList +END ObxControls. From ac2723abe3ded684d79d935b53dc84b6859cd4fa Mon Sep 17 00:00:00 2001 From: ilovb Date: Sat, 17 May 2014 00:02:34 +0400 Subject: [PATCH 7/7] example 2 for Component Pascal --- samples/Component Pascal/Example2.cps | 71 +++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 samples/Component Pascal/Example2.cps diff --git a/samples/Component Pascal/Example2.cps b/samples/Component Pascal/Example2.cps new file mode 100644 index 00000000..4c4b3930 --- /dev/null +++ b/samples/Component Pascal/Example2.cps @@ -0,0 +1,71 @@ +MODULE ObxFact; +(** + project = "BlackBox" + organization = "www.oberon.ch" + contributors = "Oberon microsystems" + version = "System/Rsrc/About" + copyright = "System/Rsrc/About" + license = "Docu/BB-License" + changes = "" + issues = "" + +**) + +IMPORT + Stores, Models, TextModels, TextControllers, Integers; + +PROCEDURE Read(r: TextModels.Reader; VAR x: Integers.Integer); + VAR i, len, beg: INTEGER; ch: CHAR; buf: POINTER TO ARRAY OF CHAR; +BEGIN + r.ReadChar(ch); + WHILE ~r.eot & (ch <= " ") DO r.ReadChar(ch) END; + ASSERT(~r.eot & (((ch >= "0") & (ch <= "9")) OR (ch = "-"))); + beg := r.Pos() - 1; len := 0; + REPEAT INC(len); r.ReadChar(ch) UNTIL r.eot OR (ch < "0") OR (ch > "9"); + NEW(buf, len + 1); + i := 0; r.SetPos(beg); + REPEAT r.ReadChar(buf[i]); INC(i) UNTIL i = len; + buf[i] := 0X; + Integers.ConvertFromString(buf^, x) +END Read; + +PROCEDURE Write(w: TextModels.Writer; x: Integers.Integer); + VAR i: INTEGER; +BEGIN + IF Integers.Sign(x) < 0 THEN w.WriteChar("-") END; + i := Integers.Digits10Of(x); + IF i # 0 THEN + REPEAT DEC(i); w.WriteChar(Integers.ThisDigit10(x, i)) UNTIL i = 0 + ELSE w.WriteChar("0") + END +END Write; + +PROCEDURE Compute*; + VAR beg, end, i, n: INTEGER; ch: CHAR; + s: Stores.Operation; + r: TextModels.Reader; w: TextModels.Writer; attr: TextModels.Attributes; + c: TextControllers.Controller; + x: Integers.Integer; +BEGIN + c := TextControllers.Focus(); + IF (c # NIL) & c.HasSelection() THEN + c.GetSelection(beg, end); + r := c.text.NewReader(NIL); r.SetPos(beg); r.ReadChar(ch); + WHILE ~r.eot & (beg < end) & (ch <= " ") DO r.ReadChar(ch); INC(beg) END; + IF ~r.eot & (beg < end) THEN + r.ReadPrev; Read(r, x); + end := r.Pos(); r.ReadPrev; attr :=r.attr; + IF (Integers.Sign(x) > 0) & (Integers.Compare(x, Integers.Long(MAX(LONGINT))) <= 0) THEN + n := SHORT(Integers.Short(x)); i := 2; x := Integers.Long(1); + WHILE i <= n DO x := Integers.Product(x, Integers.Long(i)); INC(i) END; + Models.BeginScript(c.text, "computation", s); + c.text.Delete(beg, end); + w := c.text.NewWriter(NIL); w.SetPos(beg); w.SetAttr(attr); + Write(w, x); + Models.EndScript(c.text, s) + END + END + END +END Compute; + +END ObxFact. \ No newline at end of file