@( 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 : = Jednotlive kody se zadavaji v tomto poradi : 1. kod pro 2. kod pro 3. kod pro 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 : = V tomto pripade se logicky vyraz koduje takto : 1. kod pro 2. kod pro 3. kod pro 4. kod pro pozor ! opacne poradi ! 5. kod pro 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 : , ,. Po zpracovani podminek vypada zasobnik takto : ! ! ! ! ! ! +-------------+ Nyni program vybere ze zasobniku horni dva vysledky a a na ne aplikuje logicky operator zadany v PARBLK jako prvni, tj. . Takto ziskany vysledek logicke operace ulozi do zasobniku : ! ! ! ! +--------------+ Nyni program opet vybere ze zasobniku horni dva vysledky, tj. a a na ne aplikuje dalsi logicky operator z PARBLK, tj. . 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.