IMPLEMENTATION MODULE GtkDemo ; FROM DemoImpl IMPORT DoLinks, DoListBox, DoFlowBox, DoExpander, DoCss; FROM DemosBasic IMPORT DoSpinner, DoPanes, DoOverlay; FROM SYSTEM IMPORT ADDRESS; TYPE Demo = RECORD name: ARRAY [0..47] OF CHAR; build: BuildProc; END; VAR demos: ARRAY [0..255] OF Demo; n: CARDINAL; PROCEDURE Copy (VAR dst: ARRAY OF CHAR; src: ARRAY OF CHAR); VAR i: CARDINAL; BEGIN i := 0; WHILE (i < HIGH(dst)) AND (i <= HIGH(src)) AND (src[i] # 0C) DO dst[i] := src[i]; INC(i) END; dst[i] := 0C END Copy; PROCEDURE Equal (a, b: ARRAY OF CHAR) : BOOLEAN; VAR i: CARDINAL; BEGIN i := 0; WHILE (a[i] # 0C) AND (b[i] # 0C) DO IF a[i] # b[i] THEN RETURN FALSE END; INC(i) END; RETURN a[i] = b[i] END Equal; PROCEDURE Register (name: ARRAY OF CHAR; build: BuildProc); BEGIN IF n <= HIGH(demos) THEN Copy(demos[n].name, name); demos[n].build := build; INC(n) END END Register; PROCEDURE Count () : CARDINAL; BEGIN RETURN n END Count; PROCEDURE NameOf (i: CARDINAL; VAR name: ARRAY OF CHAR); BEGIN IF i < n THEN Copy(name, demos[i].name) ELSE name[0] := 0C END END NameOf; PROCEDURE BuildByName (name: ARRAY OF CHAR; doWidget: ADDRESS) : ADDRESS; VAR i: CARDINAL; BEGIN i := 0; WHILE i < n DO IF Equal(demos[i].name, name) THEN RETURN demos[i].build(doWidget) END; INC(i) END; RETURN NIL END BuildByName; PROCEDURE IsPorted (name: ARRAY OF CHAR) : BOOLEAN; VAR i: CARDINAL; BEGIN i := 0; WHILE i < n DO IF Equal(demos[i].name, name) THEN RETURN TRUE END; INC(i) END; RETURN FALSE END IsPorted; BEGIN n := 0; Register("links", DoLinks); Register("listbox", DoListBox); Register("flowbox", DoFlowBox); Register("expander", DoExpander); Register("css_basics", DoCss); Register("spinner", DoSpinner); Register("panes", DoPanes); Register("overlay", DoOverlay) END GtkDemo.