@( Exc )   SORLIB   popis knihovny                            
@03-05-86
                                            




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                             %
%          %%%     %%%    %%%%    %       %%%   %%%%          %
%         %   %   %   %   %   %   %        %    %   %         %
%         %       %   %   %   %   %        %    %   %         %
%          %%%    %   %   %%%%    %        %    %%%%          %
%             %   %   %   % %     %        %    %   %         %
%         %   %   %   %   %  %    %        %    %   %         %
%          %%%     %%%    %   %   %%%%%   %%%   %%%%          %
%                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                                                       




                           ( Exc )                         


                     Verze :   1.01    (4-86)





      
    K n i h o v n a   f u n k c i   p r o   s o r t o v a n i
    *********************************************************



Konfigurace hardware    :                 TNS stul           


Medium                  :                 Disketa            


Operacni system         :                 CPM                


Programovaci jazyk      :                 Assembler          



Knihovna SORLIB obsahuje moduly, ktere umoznuji sortovani
az 32 vstupnich souboru a vytvoreni vystupniho souboru set-
rideneho podle zvoleneho klice. Zaroven umoznuje provadet
vybery vet, ktere splnuji zvolenou podminku. Funkce lze
volat z jazyku  FORTRAN, COBOL a ASSEMBLER.

Obsah
*****




1. Uvod						str.3

2. Podprogram SORSUB				str.4

	2.1  Vyznam jednotlivych parametru	str.4
	2.2  Blok parametru PARBLK		str.5
	2.3  Zadavani vyberovych podminek	str.8

3. Podprogram SORMSG				str.11

4. Podprogram SORCNT				str.11

5. Uzivatelske podprogramy XIT1 a XIT2		str.12

6. Linkovani knihovny SORLIB			str.13

7. Priklad pouziti				str.14

1.	Uvod
	====

Od ctenare tohoto navodu se ocekava znalost navodu k programu
SORT. Pripadnym zajemcum o knihovnu SORLIB doporucujeme 
nejprve se seznamit s cinnosti a funkcemi programu SORT.
Jednotlive pojmy popsane v prirucce k programu SORT budou
sice v tomto navodu pouzivany, ale nebudou podrobne vysvetlo-
vany.

Dale se od ctenare ocekava pomerne slusna znalost jazyka, ze
ktereho budou funkce volany ( tj. FORTRANu, COBOLu nebo
ASSEMBLERu ).

Krome vlastni knihovny SORLIB jsou v tomto navodu popsany
i moduly  NOERR.REL, NOREPORT.REL, NOCOL.REL a NOSEL.REL,
ktere se v nekterych pripadech linkuji spolu s knihovnou SORLIB
s cilem usetrit misto v operacni pameti.

V knihovne SORLIB se nachazeji tyto funkce :

	SORSUB		sortovaci podprogram
	SORMSG		vypis chybovych hlaseni
	SORCNT		vraci informace o probehlem sortovani

Dalsi dve funkce XIT1 a XIT2 si muze vytvorit uzivatel pro
nektere specialni akce ( vkladani a ruseni vet apod. ).



2.	Podprogram SORSUB
	=================

Z jazyka FORTRAN se podprogram SORSUB vola nasledujicim
zpusobem :


	CALL SORSUB ( PARBLK,WORK,IWLEN,ISTAT,COLTAB)



Z jazyka COBOL se podprogram SORSUB vola :


	CALL 'SORSUB' USING PARBLK,WORK,IWLEN,ISTAT,COLTAB


Z assembleru se vola s timto obsahem registru :

	HL : adresa PARBLK
	DE : adresa pracovni oblasti
	BC : adresa bloku pointeru :
		- pointer na IWLEN
		- pointer na udaj ISTAT
		- pointer na COLTAB

Navratova hodnota ISTAT se vraci v registrech HL.





2.1	Vyznam jednotlivych parametru :
	-------------------------------

PARBLK 	blok parametru obsahujici jmena souboru, klice apod.
	podrobny popis obsahu jednotlivych bytu v tomto bloku
	je v samostatne casti

WORK	adresa pracovni oblasti

IWLEN	delka pracovni oblasti

ISTAT	16-bitova navratova promenna (  je-li navrat uspesny,
	obsahuje nulu, doslo-li k chybe, obsahuje kod chyby )

COLTAB	tabulka 256 bytu, ktera urcuje poradi znaku pro tri-
	deni. Tato tabulka bude pouzita pouze tehdy, je-li 
	v PARBLK nastaven parametr ALT.

2.2	Blok parametru PARBLK
	---------------------

Vyznam jednotlivych bytu je v nasledujici tabulce. Vsechny
dvoubytove ciselne udaje se ukladaji zpusobem nizsi rad do
prvniho bytu.



offset	delka	popis
(poradi)(byte)
---------------------------------------------------------------
0	2	(maximalni) delka vety ve vstupnim souboru
2	2	delka vety ve vystupnim souboru ( kdyz nula,
		pak stejna jako vstupni)
4	4	rezerva - neni nutne vyplnovat
8	1	typ vstupniho souboru  (pozn.1)
9	1	indikace konce vstupniho souboru (pozn.2)
10	12	jmeno vystupniho souboru ve formatu FCB(pozn.5)
22	2	ma-li byt provedena vymena diskety (/C), pak
		je nutne nastavit 15. bit 
24	1	typ vystupniho souboru ( pozn.1)
25	1	indikace konce vystupniho souboru (pozn.3)
26	1	pracovni disk (pozn.4)
27	1	pro R-vystup nenulove, jinak 0
28	1	pro KR-vystup nenulove, jinak 0
29	1	pro TAGSORT nenulove, jinak 0
30	1	rezerva ( neni nutne vyplnovat)
31	1	K-vystup nenulove, jinak 0
32	1	KP-vystup nenulove, jinak 0
33	1	P-vystup nenulove, jinak 0
34	1	pro volani XIT1 nenulove, jinak 0
35	1	pro volani XIT2 nenulove, jinak 0
36	1	uroven chybovych hlaseni 0 az 5
37	1	rezerva (neni nutne vyplnovat)
38	2	pocet vstupnich sortovanych souboru 0 az 32.
		Nula povolena jen tehdy, je-li nenulovy
		pocet spojovanych souboru

Pro kazdy sortovany soubor :
----------
*	12	jmeno souboru ve formatu FCB ( pozn.5)
*	2	rezerva (neni nutne vyplnovat)
*	2	pocatecni zaznam ( kdyz 0, pak pocatek souboru)
*	2	posledni cteny zaznam ( kdyz 0, pak do konce
		souboru )
----------
?	2	FFFF hexa - indikace konce udaju, tykajicich se
		vstupnich sortovanych souboru
?	2	pocet spojovanych souboru ( 0 az 32 , nula
		povolena tehdy, je-li nenulovy pocet sortova-
		nych souboru

Pro kazdy spojovany soubor :
-----------
*	12	jmeno souboru ve formatu FCB (pozn.5)
*	6	rezerva (neni nutne vyplnovat)
-----------
?	2	FFFF hexa - indikace konce udaju, tykajicich se
		vstupnich spojovanych souboru
?	2	pocet klicu
Pro kazdy klic :
------------
*	2	zacatek pole (pozicni zadani) nebo cislo
		pole (u poli oddelenych carkami )
*	2	konec pole (pozicni zadani) nebo max.delka 
		pole ( u poli oddelenych carkami )
*	2	typ pole a dalsi atributy pozn.6)
------------
?	2	FFFF hexa - indikace konce udaju tykajicich se
		klicu
?	2	0 - nejsou zadany vybery, 1 az 32 - jsou
		zadany vybery
? 	?	blok popisujici vyberove podminky popsany
		v dalsi casti
?	1	FF hexa - indikace konce bloku vyberovych
		podminek




Poznamka 1 : typ souboru
		
	Dekadicky obsah bytu	Typ souboru
	1			CR
	2			FIX
	64			VAR
	128			REL

	Obsahuje-li prislusny byte nulu, bude soubor chapan
	jako FIX


Poznamka 2 :   indikace ukonceni souboru (vstup)

	Dekadicky obsah bytu	Typ ukonceni
	1			NOS
	2			NOZ
	4			FF
	
	Obsahuje-li prislusny byte nulu, bude za konec souboru
	povazovan znak 1A.



Poznamka 3 :    Indikace ukonceni souboru (vystup)

	Obsahuje-li byte nulu, bude posledni sektor popsan
	do konce znaky 1A, obsahuje-li 2, bude ukonceni
	typu FF.




Poznamka 4 :	Cislo disku

	Lze zadat bud binarne ( 0-vybrany disk, 1=A, 2=B atd.)
	nebo znakem ' ' je vybrany disk , 'A', 'B',......



Poznamka 5 :	Jmeno souboru

	1. byte - cislo disku
	2.-9. byte - jmeno doplnene mezerami
	10.-12. byte - typ doplneny mezerami



Poznamka 6 :	Vlastnosti klicoveho pole

	Vsechny parametry, ktere si prejeme zadat pro klicove
	pole, vyhledame v nasledujici tabulce. Cisla u nich
	uvedena secteme a vysledny soucet ulozime do prislus-
	nych 2 bytu v poli PARBLK.

	Pozicni zadani pole			0
	Pole oddelena carkami			1
	- - - - - - - - - - - - - - - - - - - - -
	NUM					2
	UP					8192
	RIG					64
	LOH					4
	MAS					16384
	EBC					20480
	ALT					1024
	TWO					32
	INT					36
	FLO					16
	PAC					128
	DES					256
	ASC					0


	Priklad : pole oddelene carkami, NUM,DES
			1 + 2 + 256  =  259
		  
		  pozicni pole, ASC,UP
			0 + 0 + 8192 = 8192

2.3	Zadavani vyberovych podminek 
	----------------------------

Vyberove podminky se zadavaji jako soucast pole PARBLK. Jed-
notlive podminky se koduji podle nasledujici tabulky :

kod	funkce		nasleduje	
(hexa)	
---------------------------------------------------------------

0	pozicni pole	2 byte zacatek	
			2 byte delka

1	pole oddelena	2 byte cislo pole
	carkami				

2	konstanta	2 byte delka (=n)
			n bytu binarni hodnota

83	<		2 byte testovaci atribut ( viz pozn. 6 
			v casti 2.2)
C3	<=				-   "   -

43	=				-   "   -

A3	<>				-   "   -

63	>=				-   "   -
	
23	>				-   "   -

5	NOT

6	AND

7	OR

8	XOR

09 FF FF  konec bloku


Operatory BT (patri do intervalu) a NB ( nepatri do intervalu )
nemaji specialni kod a musi byt nahrazeny pomoci kombinace
ostatnich relacnich operatoru.

Kazdou vyberovou podminku lze zapsat ve tvaru :

	<podminka> = <operand1> <rel.operator> <operand2>

Jednotlive kody se zadavaji v tomto poradi :

	1. kod pro <operand1>
	2. kod pro <operand2>
	3. kod pro <operator>


Priklad :    SE #7 < "ABC"

	1. kod pro #7 : 01 07 00
	2. kod pro "ABC" : 02 03 00 41 42 43 ( triznakova kons-
				tanta 'A' 'B' 'C' )
	3. kod pro < : 83 00 00
	
	Posledni dva nulove byty znamenaji, ze pri testovani
	nebudou pouzity zadne testovaci atributy.
	Pokud nenasleduje zadna dalsi podminka, bude nasledo-
	vat :
	
	4. kod pro konec : 09 FF FF


Slozitejsi podminky se vytvareji pomoci logickych operatoru :
	

<vysledek>=<podm1> <log.operator1> <podm2> <log.oper2> <podm3>


V tomto pripade se logicky vyraz koduje takto :


	1. kod pro <podm1>
	2. kod pro <podm2>
	3. kod pro <podm3>
	4. kod pro <log.oper2>    pozor ! opacne poradi !
	5. kod pro <log.oper1>    pozor ! opacne poradi !


Opacne poradi logickych operatoru je dano tim, ze program 
pouziva pro mezivysledky jednotlivych podminek ( .TRUE. ,
.FALSE. ) svuj zvlastni zasobnik, do ktereho jsou udaje
ukladany zpusobem "prvni dovnitr, posledni ven". Vysledky
podminek jsou ukladany do zasobniku v poradi : <vysl1>,
<vysl2>,<vysl3>. Po zpracovani podminek vypada zasobnik takto :


	!   <vysl3>   !
	!   <vysl2>   !
	!   <vysl1>   !
	+-------------+

Nyni program vybere ze zasobniku horni dva vysledky <vysl3>
a <vysl2> a na ne aplikuje logicky operator zadany v PARBLK
jako prvni, tj. <log.oper2>. Takto ziskany vysledek logicke
operace ulozi do zasobniku :


	!   <vysl2,3>  !
	!   <vysl1>    !
	+--------------+

Nyni program opet vybere ze zasobniku horni dva vysledky, tj.
<vysl2,3> a <vysl1> a na ne aplikuje dalsi logicky operator
z PARBLK, tj. <log.oper1> . Vysledek opet ulozi do zasobniku.

Stejnym zpusobem program zpracovava slozite logicke vyrazy.
Je-li obsah PARBLK vycerpan, pak musi v zasobniku zbyt jediny
vysledek, ktery je celkovym vysledkem logickeho vyrazu.


Priklad :  SE  FI 5,11 <> "1250",NUM AND FI 1,3="AAA"

	FI 5,11  :    00 05 00 06 00
	"1250"	 :    02 04 00 31 32 35 30
	<> , NUM :    A3 02 00
	FI 1,3	 :    00 01 00 03 00
	"AAA"	 :    02 03 00 41 41 41
	= 	 :    43 00 00
	AND	 :    06
	konec	 :    09 FF FF

3.	Podprogram SORMSG
	=================

Podprogram SORMSG nema zadne parametry. Tento podprogram
se vola po predchozim vyvolani podprogramu SORSUB tehdy, 
skonci-li podprogram SORSUB chybou. Podprogram SORMSG
vypise tuto chybu na displej v anglictine.





4.	Podprogram SORCNT
	=================

Podprogram SORCNT vraci v predem pripravenem poli informace
o prave probehlem sortovani. Volani podprogramu z FORTRANU
ma tvar :


	DIMENSION IVEK(22)
	:
	volani SORSUB
	:
	CALL SORCNT(IVEK)
	:
	:


Jednotlive prvky vektoru IVEK obsahuji tytu udaje :

index	obsah
--------------------------------------------------------------
1	pocet vet prectenych ze sortovanych vstup.souboru
2	pocet vet,ktere byly vylouceny pro nesplnenou podminku
3	pocet vet zrusenych v XIT1 (sortovane soubory)
4	pocet vet vlozenych v XIT1
5	pocet sortovanych vet
6	pocet vet prectenych z pripojovanych souboru
7	pocet vet, ktere byly vylouceny pro nesplnenou podminku
8	pocet vet zrusenych v XIT1 ( pripojovane soubory )
9	rezervovano
10	pocet vet ,ktere byly pouze pripojeny
11	pocet vet zrusenych v XIT2
12	pocet vet vlozenych v XIT2
13	pocet vet ve vystupnim souboru
14	pocet sektoru (128 byte) ve vstupnim souboru
15	pocet sektoru ve vystupnim souboru
16	pocet sektoru v pracovnim souboru
17	pocet sortovacich behu
18 	pocet spojovacich behu
19	rezervovano
20	nenulove, kdyz byly precteny vety s nedostatecnym 
	poctem poli nebo znaku
21	rezervovano
22	rezervovano




5.	Uzivatelske podprogramy XIT1 a XIT2
	===================================


Podprogram XIT1 je volan po kazdem precteni vstupni vety,
podprogram XIT2 je volan po kazdem precteni vystupni vety.
Oba podprogramy maji tento tvar :


	SUBROUTINE XITn (RECORD,BUFFER,FLAG)
	INTEGER FLAG
	LOGICAL RECORD(nn),BUFFER(nn)
	:
	pripadne naplneni pole BUFFER vlozenou vetou
	:
	FLAG=xx
	:
	RETURN
	END

Vstupni parametr :

	RECORD ... prectena veta
	BUFFER ... pole, do ktereho ma byt pripadne vlozena
		   nova veta
	FLAG   ... 1 ... testovani bezne vety
		   8 ... konec souboru
		   5 ... testovani bezne vety z pripojovaneho
			 souboru ( pouze u XIT1)

Vystupni parametr :

	FLAG  .... 0 ... veta bude vypustena
		   1 ... veta bude zachovana
		   2 ... puvodni veta bude nahrazena
			 vetou v poli BUFFER
		   3 ... veta v poli BUFFER bude vlozena
			 do souboru pred vetu RECORD .
			 Pozor ! V tomto pripade bude
			 podprogram XITn  volan se stejnou
			 vetou podruhe a bez osetreni teto
			 situace dojde k zacykleni !!!


Omezeni  :   Je-li vstupni hodnota FLAG=8, smi vystupni hodnota
byt 0, 2 nebo 3. Je-li vstupni hodnota 5, smi byt vystupni
hodnota pouze 0 nebo 1.  U vstupniho sortovaneho souboru smi
byt veta nahrazena nebo vlozena nova veta jedine tehdy, jestli-
ze se nepouzivaji ve vystupnim souboru cisla vet nebo pointery
a jestlize se nepouziva TAGSORT.

6.	Linkovani knihovny SORLIB
	=========================


Jednotlive podprogramy zabiraji operacni pamet podle nasleduji-
ci tabulky :


	SORSUB		11 400 byte
	SORMSG		 2 000 byte
	SORCNT		    25 byte


Pamet je mozne usetrit prilinkovanim techto modulu :


modul	  usetrena pamet	duvod
---------------------------------------------------------------
NOERR	  1100 ( ze SORMSG)	kratsi chybove zpravy
NOREPORT  1000			kratsi informace o chodu
NOCOL	   100			neuvazuje se alternativni 
				poradi pro trideni
NOSEL	   900			nebudou provadeny vybery
	

Prilinkovani techto modulu ( jeste pred knihovnou SORLIB )
zpusobi, ze nektere knihovni funkce budou nahrazeny kratsimi
nebo prazdnymi funkcemi z techto modulu.


Spusteni linkeru pak vypada bud takto :


L80  JMENO,SORLIB/S,JMENO/N/E


nebo

L80 JMENO,NOERR,NOREPORT,NOCOL,NOSEL,SORLIB/S,JMENO/N/E

7.	Priklad pouziti
	===============

Vyuziti knihovny SORLIB si ukazeme na stejnem prikladu,
jaky je uveden v navodu k programu SORT, cast 13.2. Parametry
pro program SORT byly v tomto prikladu nasledujici :


	I=100,CR
	S=CCC.DAT
	D=DDD.DAT
	K=#2,20
	SE=#3>"5000",NUM


Program ve FORTRANu, ktery realizuje pozadovany vyber a tride-
ni, je ulozen na diskete pod nazvem PRIKLAD.FOR.
