(* Modula-2 R10 Test File for Vim Syntax Colouring *) 

(* --------------------------------------------------
 * THIS FILE IS LICENSED UNDER THE VIM LICENSE
 * see https://github.com/vim/vim/blob/master/LICENSE
 * -------------------------------------------------- *)

DEFINITION MODULE Foobar; (*!m2r10*)

IMPORT UNSAFE ALIAS BYTE, WORD, ADDRESS;

CONST MaxFoo = 1.0;

TYPE Foo = ALIAS OF Bar;

(* predefined constants *)
NIL FALSE TRUE

(* predefined types *)
BOOLEAN CHAR UNICHAR OCTET CARDINAL LONGCARD INTEGER LONGINT REAL LONGREAL

(* predefined procedures *)
APPEND INSERT REMOVE SORT SORTNEW

(* predefined functions *)
CHR ORD ODD ABS SGN MIN MAX LOG2 POW2 ENTIER PRED SUCC PTR CAPACITY COUNT LENGTH

(* predefined macros *)
NOP TMIN TMAX TSIZE TLIMIT

(* unsafe builtins *)
UNSAFE

(* unsafe builtin types *)
BYTE WORD LONGWORD ADDRESS OCTETSEQ

(* unsafe builtin procedures *)
ADD SUB DEC INC SETBIT HALT

(* unsafe builtin functions *)
ADR CAST BIT SHL SHR BWNOT BWAND BWOR

(* non-portable language extensions *)
ASSEMBLER ASM REG

(* user defined identifiers *)
foobar Foobar FooBar foo_bar foo0


(* string literals *)
str := "foo 'bar' baz";
str := 'foo "bar" baz';

(* numeric literals *)
0b0110'0011'0110'0000, 0u0A, 0x0123, 0xCAFE'D00D
1'000'000.00, 1.23, 1.23e+10, 1.234'567'890e-1'000


(* language defined pragmas *)
<*MSG=INFO:"foobar"*> <*ENCODING="UTF8"*> <*INLINE*> <*NOINLINE*> <*FFI="C"*>

(* implementation defined pragmas *)
<*GM2.Foobar|W=Bazbam*>


(* single line comment *)
! foo bar baz bam boo 

(* block comments with emphasis *)
(* copyright (c) 2016 Modula-2 Foundation.
   authors B.Kowarsch and R.Sutcliffe
   license see LICENSE *)

(* pre-conditions: foo bar baz bam boo doodle wah.
   post-conditions: foodle babble bozo bim bam dang.
   error-conditions: dada jingle jungle boggle dee boo. *)

(* (* *) *)

(* bindings *)
PROCEDURE [+] sum ( a, b : BCD ) : BCD;

PROCEDURE [MOD] modulus ( n, m : INT64 ) : INT64;

PROCEDURE [RETAIN] Retain ( foo : Foo );

PROCEDURE [LENGTH] length ( str : String ) : LONGCARD;


(* procedures *)
PROCEDURE NewFooWithBar ( VAR foo: Foo; bar : INTEGER );
BEGIN
  NEW(foo);
  foo^.bar := bar;
  RETURN
END NewFooWithBar;

END END;

(* functions *)
PROCEDURE bar ( foo : Foo ) : INTEGER;
BEGIN
  IF foo = NIL THEN
    UNSAFE.HALT
  ELSE
    RETURN foo^.bar
  END (* IF *)
END bar;


(* technical debt *)
TO DO ( 1234, Weight.Major ) (* foo *)
  "redesign foo", 2d;
  "replace foo", 2d;
  "test new foo", 1d
END (* TO DO *);

PROCEDURE SetBaba <*DEPRECATED*> ( n : CARDINAL );

  
(* disabled code *)
?<
WHILE foo = bar DO
  baz(bam, boo)
END (* WHILE *);
>?


(* illegal characters *)
`  ~  $  %  ?  _

(* illegal identifiers *)

_bar  _bar_baz  _bar_baz__bam  _bar_baz__bam_boo

bar_  bar_baz_  bar_baz__bam_  bar_baz__bam_boo_

__bar  __bar_baz  __bar_baz__bam  __bar_baz__bam_boo

bar__  bar_baz__  bar_baz__bam__  bar_baz__bam_boo__

bar__baz  __bar_baz__  __bar__baz__  __


(* module end *)
END Foobar.
