hodza/BlackBox.Shkola.2014 huggingface dataset:
i21sys/Mod/Bitmaps.odc

MODULE i21sysBitmaps;
(* переименовано для проекта Информатика-21 ФВТ 2008-02-16 *)
(* renamed from ToolsBitmaps provided by Ominc, by FVT 2006-03-01 *)

	IMPORT Files, Converters, Views, Containers, HostBitmaps, WinOle;

	PROCEDURE SaveSingleton*;
		VAR v: Views.View; loc: Files.Locator; n: Files.Name; bmp: Converters.Converter; res: INTEGER;
	BEGIN
		v := Containers.FocusSingleton();
		IF v # NIL THEN
			n := "";
			bmp := Converters.list;
			WHILE (bmp # NIL) & (bmp.fileType # "bmp") DO bmp := bmp.next END;
			Views.Register(HostBitmaps.ViewToBitmap(v, 24), Views.ask, loc, n, bmp, res)
		END
	END SaveSingleton;

	PROCEDURE ExportD* (
		v: Views.View; w, h, x, y: INTEGER; isSingle: BOOLEAN; VAR med: WinOle.STGMEDIUM
	);
	BEGIN
		ASSERT(v # NIL, 20);
		HostBitmaps.ExportDBitmap(HostBitmaps.ViewToBitmap(v, 24), w, h, x, y, isSingle, med)
	END ExportD;

END i21sysBitmaps.

Include into some Menu:
	"Save As Bitmap..." 	""	"i21sysBitmaps.SaveSingleton"	"StdCmds.SingletonGuard"

Include into Config:
	OleData.Register("", "i21sysBitmaps.ExportD", "BITMAP", "", {})
	
---------------------------------------------------------------------	
From: support@oberon.ch (Tech-Support (BlackBox))
To: Blackbox Mailing-List [blackbox@oberon.ch]
Cc: Blackbox Tech-Support [support@oberon.ch]
Bcc: 
Subject: RE: Pasting bitmaps
Time: 2004-04-19 at 07:26
Message: Dear BlackBox user,

two weeks ago, we discussed the problem of pasting a selected BlackBox view
as a bitmap into PowerPoint and similar applications.
In the meantime we've thrown together the small module ToolsBitmaps.
This program may help you to copy and paste selected views via OLE into other applications.
Additionally there is also a command that saves arbitrary views as bitmaps on disk.

We hope this solution satisfies most of your requirements.

Cheers
Marc
Oberon microsystems, Inc.


ToolsBitmaps:

MODULE ToolsBitmaps;

	IMPORT Files, Converters, Views, Containers, HostBitmaps, WinOle;

	PROCEDURE SaveSingleton*;
		VAR v: Views.View; loc: Files.Locator; n: Files.Name; bmp: Converters.Converter; res: INTEGER;
	BEGIN
		v := Containers.FocusSingleton();
		IF v # NIL THEN
			n := "";
			bmp := Converters.list;
			WHILE (bmp # NIL) & (bmp.fileType # "bmp") DO bmp := bmp.next END;
			Views.Register(HostBitmaps.ViewToBitmap(v, 24), Views.ask, loc, n, bmp, res)
		END
	END SaveSingleton;

	PROCEDURE ExportD* (
		v: Views.View; w, h, x, y: INTEGER; isSingle: BOOLEAN; VAR med: WinOle.STGMEDIUM
	);
	BEGIN
		ASSERT(v # NIL, 20);
		HostBitmaps.ExportDBitmap(HostBitmaps.ViewToBitmap(v, 24), w, h, x, y, isSingle, med)
	END ExportD;

END ToolsBitmaps.

Include into some Menu:
	"Save As Bitmap..." 	""	"ToolsBitmaps.SaveSingleton"	"StdCmds.SingletonGuard"

Include into Config:
	OleData.Register("", "ToolsBitmaps.ExportD", "BITMAP", "", {})
i21sys/Mod/Calls.odc

MODULE  i21sysCalls; (**  **)
(* 
2010-10-18 Е.Э.Темиргалеев -- исправления для корректной работы под wine+linux
2008-05-19 .. 
--       BlackBox-Mailing List
*)
	IMPORT  SYSTEM,  WinApi,  HostDialog,  Services, i21sysInfo;
	
	TYPE
		Action = POINTER TO RECORD ( Services.Action )
			fileName: POINTER TO ARRAY OF SHORTCHAR;
		END;
	
		ActionExe = POINTER TO RECORD ( Services.Action )
			fileName: POINTER TO ARRAY OF SHORTCHAR;
		END;
	
	PROCEDURE ( a: Action ) Do;
		VAR
			hwnd: WinApi.HWND;
			lpOperation, lpFile, lpParameters, lpDirectory: WinApi.PtrSTR;
			nShowCmd: INTEGER;
			hinst: WinApi.HINSTANCE;
			win_fileName, win_params, win_workDir: ARRAY [untagged] 5000 OF SHORTCHAR;
	BEGIN
		(* http://habrahabr.ru/blogs/development/88907/ *)
		IF i21sysInfo.platform = i21sysInfo.wine THEN
			win_fileName := "winebrowser " + a.fileName$
		ELSE
			win_fileName := a.fileName$
		END;
		win_params := '';
		win_workDir := '';
		lpOperation := "open";
		lpFile := win_fileName;
		lpParameters := win_params;
		lpDirectory := win_workDir;
		nShowCmd := WinApi.SW_SHOW;
		hinst := WinApi.ShellExecute( hwnd, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd );
		(*
		ErrorOut( hinst );
		Log.Bool( hinst > 32 );  Log.Ln;  (* RETURN hinst > 32; *)
		*)
	END Do;
	
	PROCEDURE ( a: ActionExe ) Do;
		VAR  
	BEGIN
		HostDialog.Start( a.fileName$ )
	END Do;
	
	PROCEDURE Start* ( exeName: ARRAY OF CHAR ); (**     (EXE); , notepad.exe;    ; .  ме    **)
		VAR  a: ActionExe; 
	BEGIN
		NEW( a );
		NEW( a.fileName, LEN( exeName$) + 1 );
		a.fileName^ := SHORT( exeName$ );
		Services.DoLater( a, Services.now ); (*   Action, ..           EXE. *)
	END Start;
	
	PROCEDURE Open* ( fileName: ARRAY OF CHAR ); (**     MS Windows  () ,        ; ,  .WAV    WinAmp,        .WAV;    ; .  ме    **)
		VAR  a: Action;
	BEGIN
		NEW( a );
		NEW( a.fileName, LEN( fileName$) + 1 );
		a.fileName^ := SHORT( fileName$ );
		Services.DoLater( a, Services.now ); (*   Action, ..           EXE. *)
	END Open;
	
END i21sysCalls.

"i21sysCalls.Start('notepad.exe')"

"i21sysCalls.Start('C:\!BlackBox\exe\blackbox15i21base\BlackBox.exe /Use C:\!BlackBox\!projects\!texts\')"

"i21sysCalls.Open('C:\!BlackBox\!projects\!texts\Mathtype\Docu\SDK\docs\APIDoc.htm')"

"i21sysCalls.Open('http://www.inr.ac.ru/~info21/')"

********************************************************************************
 :

MODULE  PrivCallExe;
	IMPORT  Log := StdLog,  WinApi,  SYSTEM;
	
	PROCEDURE Do*;
		VAR  res, uCmdShow: INTEGER;  cmd: ARRAY 1000 OF SHORTCHAR;
			adr: RECORD [union]
				val: INTEGER;
				lpCmdLine: WinApi.PtrSTR
			END;
	BEGIN
		cmd := "c:\Program Files\HIEW.EXE";
		adr.val := SYSTEM.ADR( cmd[0] );
		uCmdShow := 1; (* to start the program in a window *)
		res := WinApi.WinExec ( adr.lpCmdLine, uCmdShow );
	END Do;
	
END  PrivCallExe.

PrivCallExe.Do
i21sys/Mod/Characters.odc

MODULE i21sysCharacters;
(** This module is part of the educational versions of BlackBox 1.5 provided by the project "Informatika-21". 
Its purpose is to extend support in the identifiers of Component Pascal of characters from the Extended ASCII range beyond the Latin-1 subset. The Latin-1 limitation is specified in the Language Report.

This module (together with the imported one) replaces the module National formerly used in the Russian versions of BlackBox and adds a functionality similar to that of Strings, that was previously provided by i21sysConv.

The source of the old National is retained for compatibility reasons; it is in the folder System/Mod/
 **)
(**
	project	= "Информатика-21 / Informatika-21"
	contributors	= "I.N.Goryachev, F.V.Tkachov"
	changes	= "
	- 20111214, F.V.Tkachov, redesign, see comments above
	- 20050519, I.N.Goryachev, the initial version under name National
	- YYYYMMDD, nn, ...
	"
	issues	= "
	- ...
	"

**)
	(* IMPORT x := i21sysLatin1; *)
	IMPORT x := i21sysCyrillic;
	
	VAR
		HostFontsCHARSET-: INTEGER; (* used in HostFonts *)

		charSetName-: ARRAY 64 OF CHAR;
		
		Cap-:	PROCEDURE (ch: CHAR): CHAR;
		ExtendedAsciiOf-:	PROCEDURE (ch: CHAR): CHAR;
		IsCap-:	PROCEDURE (ch: CHAR): BOOLEAN;
		IsDigit-:	PROCEDURE (ch: CHAR): BOOLEAN;
		IsFirstIdentChar-:	PROCEDURE (ch: CHAR): BOOLEAN;
		IsIdentChar-:	PROCEDURE (ch: CHAR): BOOLEAN;
		IsLetter-:	PROCEDURE (ch: CHAR): BOOLEAN;
		Lower-:	PROCEDURE (ch: CHAR): CHAR;
		ToExtendedAscii-:	PROCEDURE (IN in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR);
		ToUnicode-:	PROCEDURE (IN in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR);
		ToUpper-:	PROCEDURE (IN in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR);
		UnicodeOf-:	PROCEDURE (ch: CHAR): CHAR;
		Upper-:	PROCEDURE (ch: CHAR): CHAR;

	PROCEDURE Init;
	BEGIN
		HostFontsCHARSET	:= x.HostFontsCHARSET;
		charSetName	:= x.charSetName$;

		Cap	:= x.Cap;
		ExtendedAsciiOf	:= x.ExtendedAsciiOf;
		IsCap	:= x.IsCap;
		IsDigit	:= x.IsDigit;
		IsFirstIdentChar	:= x.IsFirstIdentChar;
		IsIdentChar	:= x.IsIdentChar;
		IsLetter	:= x.IsLetter;
		Lower	:= x.Lower;
		ToExtendedAscii	:= x.ToExtendedAscii;
		ToUnicode	:= x.ToUnicode;
		ToUpper	:= x.ToUpper;
		UnicodeOf	:= x.UnicodeOf;
		Upper	:= x.Upper;
	END Init;
	
BEGIN
	Init
END i21sysCharacters.

i21sysCharacters3.Do
i21sys/Mod/CompilerTest.odc

МОДУЛЬ  i21sysCompilerTest;  (* info21 2010-04-07; last modified 2010-09-22 *)
	ПОДКЛЮЧИТЬ In, Log;
	
	ПРОЦЕДУРА Do*;
		ПЕРЕМЕННЫЕ  ц: ЦЕЛОЕ;
	НАЧАЛО
		In.Open;  УБЕДИТЬСЯ( In.Done И ~In.Done );
		In.Int( ц );  УБЕДИТЬСЯ( In.Done );  Log.Int( ц );  Log.Ln;
		In.Int( ц );  УБЕДИТЬСЯ( In.Done );  Log.Int( ц );  Log.Ln;
		In.Int( ц );  УБЕДИТЬСЯ( In.Done );  Log.Int( ц );  Log.Ln;
	КОНЕЦ Do;
	
НАЧАЛО
	Log.String('bu-bu-bu');  Log.Ln;
КОНЕЦ  i21sysCompilerTest.Do 4 5 6 dfgh

"i21sysVocabulary.SetLanguage('ru')"            
			"i21sysVocabulary.SetLanguage('')" по умолчанию -- англ
i21sysVocabulary.ConvertFocus

i21sysCompiler.Compile  --должна корректно компилировать при ru

i21sysCompiler.CompileAndReload  --не должна работать с ru  ОК
i21sysCompiler.ConvertCompileAndReload  --должна работать с ru ОК


i21sysCompiler.ToggleIndentChecks
i21sys/Mod/CompilerTest1.odc

МОДУЛЬ  i21sysCompilerTest1;  (* info21 2010-04-07; last modified 2010-09-22 *)
	ПОДКЛЮЧИТЬ In, Log;
	
	ПРОЦЕДУРА Do*;
		ПЕРЕМЕННЫЕ  ц: ЦЕЛОЕ;
	НАЧАЛО
		In.Open;  УБЕДИТЬСЯ( In.Done И ~In.Done );
		In.Int( ц );  УБЕДИТЬСЯ( In.Done );  Log.Int( ц );  Log.Ln;
		In.Int( ц );  УБЕДИТЬСЯ( In.Done );  Log.Int( ц );  Log.Ln;
		In.Int( ц );  УБЕДИТЬСЯ( In.Done );  Log.Int( ц );  Log.Ln;
	КОНЕЦ Do;
	
НАЧАЛО
	Log.String('bu-bu-bu');  Log.Ln;
КОНЕЦ  i21sysCompilerTest1.Do 4 5 6 dfgh

"i21sysEdit.SetLanguage('ru')"            
			"i21sysVocabulary.SetLanguage('')" по умолчанию -- англ
i21sysVocabulary.ConvertFocus

i21sysCompiler.Compile  --должна корректно компилировать при ru

i21sysCompiler.CompileAndReload  --не должна работать с ru  ОК
i21sysCompiler.ConvertCompileAndReload  --должна работать с ru ОК


i21sysCompiler.ToggleIndentChecks
i21sys/Mod/CompilerTestIndent.odc

МОДУЛЬ  i21sysCompilerTestIndent;  (* info21 2010-04-07 *)
	ПОДКЛЮЧИТЬ In, 
		Log;
	
	ПРОЦЕДУРА ч;
		ПЕРЕМЕННЫЕ  ч: ЦЕЛАЯ;
			я: ЦЕЛАЯ;
	НАЧАЛО
	ч:=-0;
		FOR ч := 0 TO 9 DO
		;
 		END;
	КОНЕЦ ч;
	
КОНЕЦ  i21sysCompilerTestIndent.


MODULE x;
	IMPORT  Log := StdLog,  In := i21sysIn,  Math;
	
	PROCEDURE y;
		VAR  z: INTEGER;
	z1: INTEGER;
	BEGIN
 			z := 0;
		z := 0;
		IF  z = 0  THEN 
		z := 0; z := 9;
		ELSE
	 z := 8;		
		END;
	END y;
END x.

i21sysCompiler.Compile

i21sysCompiler.CompileAndReload (не должно работать)
i21sysCompiler.ConvertCompileAndReload (должно)

"i21sysVocabulary.SetLanguage('ru')"   
			"i21sysVocabulary.SetLanguage('')" --только англ.
i21sysVocabulary.ConvertFocus

проверка отступов
включить   DevCPS.IndentChecksOn
выключить DevCPS.IndentChecksOff

отключить на эту компиляцию:
"DevCPS.IndentChecksOff;i21sysCompiler.Compile;DevCPS.IndentChecksOn"


"DevCompiler.CompileThis" DevCPS DevCPP
DevDebug.UnloadThis  i21sysCompiler  DevCompiler  DevCPP DevCPS 



"DevCompiler.CompileThis" i21sysCPS15 i21sysCPP15 <включены в Dev>
i21sys/Mod/Files.odc

MODULE  i21sysFiles;  (* info21 2010-04-07 *)
	IMPORT  Files,  HostFiles;
	
	VAR  glopath: ARRAY 2000 OF CHAR;
	
	
	PROCEDURE Copy* ( f: Files.File;  to: Files.Locator;  OUT new: Files.File;  OUT res: INTEGER );
		CONST  buflen = 100000;
		VAR  rd: Files.Reader;  wr: Files.Writer;  buf: ARRAY buflen OF BYTE;  rem, n: INTEGER;
	BEGIN
		ASSERT( f # NIL, 20 );
		ASSERT( to # NIL, 21 );
		
		rd := f.NewReader( NIL );  ASSERT( rd # NIL );
		new := Files.dir.New( to, Files.dontAsk );  ASSERT( ( new # NIL ) & ( to.res = 0 ) );
		wr := new.NewWriter( NIL );  ASSERT( wr # NIL );
		rem := f.Length();
		WHILE  rem > 0  DO
			n := MIN( rem, buflen );
			rd.ReadBytes( buf, 0, n );
			wr.WriteBytes( buf, 0, n );
			DEC( rem, n );
		END;
		ASSERT( ( rd.Pos() = f.Length() ) & ( rd.Pos() = wr.Pos() ) );
		res := 0;
		ASSERT( res = 0, 126 );
	END Copy;
	
(*
	PROCEDURE Test; (* of Copy *)
		VAR  name: ARRAY 1000 OF CHAR;  from, to: Files.Locator;  f, new: Files.File;  res: INTEGER;
	BEGIN
		from := Files.dir.This('u:\temp');
		
		In.Open;  In.String( name );  ASSERT( In.done );
		f := Files.dir.Old( from, name$, Files.shared );
		
		to := Files.dir.This( 'c:\temp' );
		Copy( f, to, new, res );
		new.Register( name$, '', Files.ask, res );
		ASSERT( res = 0 );
	END Test;                                (* i21sysFiles.Test   "test.djv"  "test.txt" "test.rar" *)
*)	


	PROCEDURE GetDiskLetter* ( loc: Files.Locator;  OUT disk: CHAR );
		VAR  l, i, j: INTEGER;  path: ARRAY 2000 OF CHAR;
	BEGIN
		ASSERT( loc # NIL, 20 );
		disk :=  loc( HostFiles.Locator ).path[0]
	END GetDiskLetter;

	PROCEDURE GetFolderName* ( loc: Files.Locator;  OUT name: ARRAY OF CHAR );
		VAR  l, i, j: INTEGER;  path: ARRAY 2000 OF CHAR;
	BEGIN
		ASSERT( loc # NIL, 20 );
		path := loc( HostFiles.Locator ).path$;
		glopath := path$;
		l := LEN( path$ );
		i := l - 1;
		WHILE ( i >= 0 ) & ~( path[ i ] = '\' ) DO
			DEC( i )
		END;
		IF i > 0 THEN
			INC( i );  j := 0;
			WHILE  i < l  DO
				name[ j ] := path[ i ];
				INC( i );  INC( j )
			END;
			name[ j ] := 0X;
		ELSE
			ASSERT( i = -1 );
			name := "\";
		END;
	END GetFolderName;


END  i21sysFiles.


i21sys/Docu/ru/Files.odc
i21sys/Mod/Hello.odc

MODULE i21sysHello;   (** для проекта Информатика-21 ФВТ 2009-10-05 *)
	IMPORT  StdLog;

	PROCEDURE Do*;
		VAR  
	BEGIN
		StdLog.String('hello!');  StdLog.Ln;
	END Do;
	
END i21sysHello.

i21sysHello.Do
i21sys/Mod/Info.odc

MODULE i21sysInfo;
(* 2010-10-18 Е.Э.Темиргалеев -- выделено из i21sysCalls для корректной работы под wine+linux *)

	IMPORT Dialog, WinApi, HostDialog;

	CONST	(*  Dialog *)
		windows32s* = 11;
		windows95* = 12;
		windowsNT3* = 13;
		windowsNT4* = 14;
		windows2000* = 15;
		windows98* = 16;
		windowsXP* = 17;
		windowsVista* = 18;
		macOS* = 21;
		macOSX* = 22;
		linux* = 30;
		tru64* = 40;
	
	CONST
		wine* = 17.5;

	VAR
		platform*: REAL;	(* REAL, ..  ну      Dialog.windows...  INTEGER  *)

	PROCEDURE Init;
		VAR	h: WinApi.HMODULE; adr: WinApi.FARPROC; res: WinApi.BOOL;
	BEGIN
		(*   1.5-1.6 HostDialog  Dialog.platform;     *)
		platform := Dialog.platform; ASSERT(platform # 0, 100);
		(* http://habrahabr.ru/blogs/development/76131/ *)
		h := WinApi.LoadLibrary("ntdll.dll");
		IF h # WinApi.NULL THEN
			adr := WinApi.GetProcAddress(h, "wine_get_version");
			IF adr # NIL THEN platform := wine END;
			res := WinApi.FreeLibrary(h)
		END
	END Init;

BEGIN
	Init
END i21sysInfo.
i21sys/Mod/Koi8r.odc

MODULE  i21sysKoi8r;  (* info21 2010-04-07; 2011-12-13 *)
	IMPORT  Log := StdLog,  Converters,  Stores,  Files,  Views,  Fonts,  TextModels,  TextMappers,  TextViews,  TextControllers;
	
	VAR  w: TextModels.Writer;  r: TextModels.Reader;  f: TextMappers.Formatter;

	PROCEDURE CP1251* ( koi8r: CHAR ): CHAR;
		VAR  ch: CHAR;
	BEGIN
		CASE koi8r OF
		|03FX: ch := 0B9X;  (* номер *)
		|0BFX: ch := 0A9X;  (* copyright *)
		|"Б": ch := "а"
		|"В": ch := "б"
		|"Ч": ch := "в"
		|"З": ch := "г"
		|"Д": ch := "д"
		|"Е": ch := "е"
		|0A3X: ch := "ё"
		|"Ц": ch := "ж"
		|"Ъ": ch := "з"
		|"Й": ch := "и"
		|"К": ch := "й"
		|"Л": ch := "к"
		|"М": ch := "л"
		|"Н": ch := "м"
		|"О": ch := "н"
		|"П": ch := "о"
		|"Р": ch := "п"
		|"Т": ch := "р"
		|"У": ch := "с"
		|"Ф": ch := "т"
		|"Х": ch := "у"
		|"Ж": ch := "ф"
		|"И": ch := "х"
		|"Г": ch := "ц"
		|"Ю": ch := "ч"
		|"Ы": ch := "ш"
		|"Э": ch := "щ"
		|"Я": ch := "ъ"
		|"Щ": ch := "ы"
		|"Ш": ch := "ь"
		|"Ь": ch := "э"
		|"А": ch := "ю"
		|"С": ch := "я"
		|"б": ch := "А"
		|"в": ch := "Б"
		|"ч": ch := "В"
		|"з": ch := "Г"
		|"д": ch := "Д"
		|"е": ch := "Е"
		|0B3X: ch := "Ё" 
		|"ц": ch := "Ж"
		|"ъ": ch := "З"
		|"й": ch := "И"
		|"к": ch := "Й"
		|"л": ch := "К"
		|"м": ch := "Л"
		|"н": ch := "М"
		|"о": ch := "Н"
		|"п": ch := "О"
		|"р": ch := "П"
		|"т": ch := "Р"
		|"у": ch := "С"
		|"ф": ch := "Т"
		|"х": ch := "У"
		|"ж": ch := "Ф"
		|"и": ch := "Х"
		|"г": ch := "Ц"
		|"ю": ch := "Ч"
		|"ы": ch := "Ш"
		|"э": ch := "Щ"
		|"я": ch := "Ъ"
		|"щ": ch := "Ы"
		|"ш": ch := "Ь"
		|"ь": ch := "Э"
		|"а": ch := "Ю"
		|"с": ch := "Я"
		ELSE
			ch := koi8r
		END;
		RETURN  ch
	END CP1251;
	
	PROCEDURE TranslateFromKoi8r*; (** документ в фокусе в KOI8-R будет переведен в CP1251/Win-1251  результат в новом окне **)
		VAR  c: TextControllers.Controller;  t, t1: TextModels.Model;  v: TextViews.View;
			koi8r: CHAR;  f: Fonts.Typeface;  a: TextModels.Attributes;
	BEGIN
		c := TextControllers.Focus();
		t := c.text;
		t1 := TextModels.CloneOf( t );
		r := t.NewReader( r );  r.SetPos( 0 );
		w := t1.NewWriter( w );  w.SetPos( 0 );
		r.ReadChar( koi8r );
		WHILE ~r.eot DO
			w.WriteChar( CP1251( koi8r ) );
			r.ReadChar( koi8r )
		END;
		(* set font *)
		f := "Verdana";
		a := TextModels.NewTypeface( TextModels.dir.attr, f  );
		t1.SetAttr( 0, t1.Length(), a );
		v := TextViews.dir.New( t1 );
		Views.OpenView( v )
	END TranslateFromKoi8r; 

	PROCEDURE ImportKoi8rText* ( f: Files.File; OUT s: Stores.Store );
		VAR  rd: Stores.Reader;  i, len: INTEGER;  koi8r, ch: SHORTCHAR;
			t: TextModels.Model;  fm: TextMappers.Formatter;
	BEGIN
		len := f.Length();
		rd.ConnectTo( f );
		t := TextModels.dir.New();  fm.ConnectTo( t );
		FOR  i := 0  TO len - 1  DO
			rd.ReadSChar( koi8r );
			ch := SHORT( CP1251( koi8r ) );
			IF  ch = 0AX  THEN
				fm.WritePara
			ELSIF  ch = 0DX  THEN
				fm.WriteLn
			ELSE
				fm.WriteChar( ch )
			END
		END;
		fm.ConnectTo( NIL );
		s := TextViews.dir.New( t )
	END ImportKoi8rText;
	
END  i21sysKoi8r.
i21sys/Mod/Program0.odc

MODULE Program0;
	IMPORT  Log;
	
BEGIN
	Log.String( 'Привет!' );  Log.Ln;
END Program0.

Простейшая программа турбопаскалевского типа. 
Исходный текст программы должен стоять в начале документа. 
После текста программы документ может содержать всё, что угодно.

Компилируется и выполняется такая программа нажатием Ctrl+F9 или, что то же самое, командой меню Dev, Compile and Reload (по-русски: Разработка, Компилировать и перегрузить). 
Попробуйте нажать Ctrl+F9 и посмотрите в Log (Рабочий журнал).

Попробуйте изменить программу (изменить печатаемый текст, внести в программу ошибку и т.п.) и снова нажать Ctrl+F9.

Данный пример имеет целью показать наипростейшую программу в Блэкбоксе. Более реалистичная учебная программа будет иметь чуть более сложный вид и использовать более удобный вывод, а также ввод (см. Program1).

Об отличиях Компонентного Паскаля от старого см. краткую справку.
i21sys/Mod/Program1.odc

MODULE Program1;
	IMPORT  Log := StdLog,  In := i21sysIn,  Math;
	
	VAR n, sum: INTEGER;
	
BEGIN
	(* должен быть задан поток ввода *)
	sum := 0;
	In.Restart; (* встаём в начало входного потока *)
	In.Int( n );  Log.Int( n );  sum := sum + n;
	In.Int( n );  Log.Int( n );  sum := sum + n;
	Log.Ln;
	Log.String('сумма равна ');  Log.Int( sum );  Log.Ln;
END Program1.

Простейшая реалистичная учебная программа турбопаскалевского типа.

Программа компилируется и выполняется нажатием Ctrl+F9.
Компилятор игнорирует текст после завершающей точки модуля в строке END Program1.
Компиляция без выполнения: Ctrl+K (K латинское).

Программа предполагает, что задан поток ввода, из которого она читает два целых числа. 
Поток ввода  это современная замена т.наз. вводу чисел с командной строки в устаревших системах программирования, несущих печать времен, когда пользователь был лишен возможности непосредственного взаимодействия с вычислительной системой. 

Поток ввода нужно задать до вызова программы: нужно выделить мышкой пару чисел в любом месте текста (или даже в другом окне)  например, любую из вот этих пар: 
8 9  или  10 -13 
 и нажать Shift+F1 (через меню: Text, Open Input).

Возможность ввода данных в программу прямо из открытых документов  это пример так называемого документо-ориентированного подхода к организации взаимодействия человек-компьютер, см. подробнее Тексткакинтерфейс.

См. также документ Вводданных(In) или стандартную документацию к модулю i21sysIn (дважды кликнуть по имени модули и вызвать команду меню Info, Документация).
i21sys/Mod/Scanner.odc

MODULE  i21sysScanner;
(**
	project	= "Информатика-21 / Informatika-21"
	contributors	= "F.V.Tkachov"
	changes	= "
	- 20121106, F.V.Tkachov, simplified, all conversions to unicode removed
		vocabularies abstracted to here
	- 20100411, F.V.Tkachov, original version
	- YYYYMMDD, nn, ...
	"
	issues	= "
	- ...
	"

**)
(** 
Сканер словариков типа используемых в i21sysEdit и при работе с нац. ключевыми словами (например i21sys/Rsrc/ru/vocab.odc и т.п.).
**)
	IMPORT  Log := StdLog,  TextMappers,  Files,  Converters,  Views,  TextViews,  DevCommanders;
	
	TYPE
		String* = ARRAY 256 OF CHAR;

	CONST  path0 = "i21sys/Rsrc/";
	
	VAR
		string-: String;
		done-: BOOLEAN;

		path: ARRAY 2000 OF CHAR;
		name: Files.Name;
		sc: TextMappers.Scanner;  ok: BOOLEAN;


	PROCEDURE Open* ( path: ARRAY OF CHAR;  name: Files.Name ); (* path relative to path0 *)
		VAR  loc: Files.Locator;  i: INTEGER;  fullName: Files.Name;
			conv: Converters.Converter;  v: Views.View;
	BEGIN
		string := '';
		done := FALSE;
		loc := Files.dir.This( path0 );  ASSERT( loc.res = 0 );
		loc := loc.This( path$ );
		ok := loc.res = 0;
		IF ~ok THEN  RETURN  END;
		fullName := name + '.odc';
		v := Views.Old( Views.dontAsk, loc, fullName, conv );
		ok := ( v # NIL ) & ( v IS TextViews.View );
		IF ~ok THEN   RETURN  END;
		sc.ConnectTo( v( TextViews.View ).ThisModel() );
		sc.SetOpts( { TextMappers.returnViews } ); (* используем вьюшку для отметки конца списка, поэтому хотим, чтобы sc ее не игнорировал, тогда мы тут засечем ее *)
		done := TRUE;
		path := path$;
		name := name$;
	END Open;
	
	PROCEDURE SkipToNextLine; (* стоим после % *)
		CONST
			stop = {TextMappers.eot, TextMappers.view, TextMappers.line, TextMappers.para};
			startOfLine = {TextMappers.line, TextMappers.para};
	BEGIN
		sc.SetOpts( sc.opts + { TextMappers.returnCtrlChars } ); (* сканер видит концы линий etc. *)
		REPEAT  sc.Scan
		UNTIL ( sc.type IN stop );
		done := ( sc.type IN startOfLine );
		sc.SetOpts( sc.opts - { TextMappers.returnCtrlChars } ); (* сканер не видит концы линий etc. *)
	END SkipToNextLine;
	
	PROCEDURE Next*; (* после очередной литерной цепочки *)
	BEGIN
		string := '';
		sc.Scan();
		(* пропускаем комментарии, пока не прочтем очередную цепочку *)
		WHILE ( sc.type # TextMappers.eot ) & ( sc.type # TextMappers.view )
			& ( sc.type = TextMappers.char ) & ( sc.char = '%' ) DO
			IF ( sc.type = TextMappers.char ) & ( sc.char = '%' ) THEN SkipToNextLine END;
			IF done THEN  sc.Scan()  END;
		END;
		IF done & ( sc.type # TextMappers.eot ) & ( sc.type # TextMappers.view ) THEN
			ASSERT( ( sc.type = TextMappers.string ) 
					OR (( sc.type = TextMappers.char ) & ( sc.char # '%' )) );
			string := sc.string$;
		ELSE
			done := FALSE
		END;
	END Next;
	
END  i21sysScanner.



	PROCEDURE Restart*;
	BEGIN
		string := '';
		IF ok THEN
			sc.SetPos( 0 );  done := TRUE
		ELSE
			done := FALSE
		END;
	END Restart;
i21sys/Mod/ScannerTest.odc

MODULE i21sysScannerTest; (* info21 2010-09-27 *)
	IMPORT  Log := StdLog,  In := i21sysIn,  Math,  S := i21sysScanner;
	
	PROCEDURE Do* ( folder, name: ARRAY OF CHAR );
	BEGIN
		S.Open( folder, name$ );  ASSERT( S.done );
		IF S.done THEN  S.Next END;
		WHILE S.done DO
			Log.String( S.string );  Log.Ln;
			S.Next
		END;
	END Do;
	
	PROCEDURE Do2* ( folder, name: ARRAY OF CHAR );
	BEGIN
		S.Open( folder, name$ );
		IF S.done THEN  S.Next END;
		WHILE S.done DO
			Log.String( S.string );  Log.Tab;  
			S.Next;  ASSERT( S.done );
			Log.String( S.string );  Log.Ln;
			S.Next
		END;
	END Do2;
	
END i21sysScannerTest.

"i21sysScannerTest.Do('','keywords')"
"i21sysScannerTest.Do('ru','vocab')"
"i21sysScannerTest.Do2('ru','vocab')"
"i21sysScannerTest.Do2('ua','vocab')"
"i21sysScannerTest.Do2('Беларусь','vocab')"