• Keine Ergebnisse gefunden

xxx-com-File vorhandene Run-Time-Library 8 KByte

Im Dokument Einführung in PASCAL (Seite 54-58)

S

ollen mehrere kurze Programme auf einer Diskette gespeichert werden, stößt man schnell an die Grenze der verfügbaren Speicher-Kapazität. Der Turbo-Pas- cal-Compiler bietet mit der H-Option die Möglichkeit, Pro­

gramme ohne die Run-Time-Library zu compilieren und sie dann als sogenannte Chain-Files aufzurufen. Von dieser Möglichkeit, Platz zu sparen, macht das vorliegende Pro­

gramm Gebrauch.

Die Benutzer-Programme werden speicherplatzsparend als xxx.chn-Files direkt auf die Filer-Diskette compiliert, ins Inhaltsverzeichnis (Inhalt.fil) eingelesen und dann von Filer aus aufgerufen. Um wieder zu Filer zurückkehren zu können, sollten die Benutzer-Programme mit der Prozedur »Ende«

(siehe Listing) abgeschlossen werden.

Die Auswahl der einzelnen Funktionen von Filer erfolgt mit den Cursor-Tasten »Pfeil nach oben«, »..nach unten«, »..rechts und links«. Die jeweilige Funktion beziehungsweise die Benutzer-Programme werden invers als Leuchtfeld darge­

stellt. Durch Drücken der Home-Taste wird die angezeigte Funktion (Benutzer-Programm) ausgeführt.

»Programm« führt die Benutzer-Programme aus, »Neuauf­

nahme« liest ein auf der Diskette vorliegendes xxx.chn- Programm in das Inhaltsverzeichnis ein, »Löschen, Umbe­

nennen und CP/M« erklären sich von allein und bedürfen somit keiner weiteren Erläuterung.

Ob groß, ob klein . •.

Alle vom Programm geforderten Eingaben können beliebig als Klein- oder Großbuchstaben erfolgen. Durch Drücken der ESC-Taste können alle laufenden Routinen abgebrochen werden.

Das Quellprogramm besteht aus filer.pas und lib.inc. In lib.inc können Anpassungen an verschiedene Terminals vor­

genommen werden. Die Erläuterungen sind in das Programm-Usting eingefügt. Das lauffähige Programm besteht aus filer.com. Das File inhalt.fil wird beim ersten Programm-Lauf automatisch erzeugt.

(M.Schlösser/ev)

program f i l e r ;

(X W ritte n bv M.A. Schlösser X)

(X R h e in s tr. 20 X)

(X 6100 Damsta d t X)

(X T e l: 86151 - 2 25 38 X)

(X Stand vom 25. Juni 1985 ¡0

lin e s , in h a rra y a rra y n r, a rra y la e n g e .i file n a m e ,h e lp s trin g p r u e f . f i l e . e x i s t f i l e v a r zch

d e f s tr in g ; in te g e r;

a n y s trin g ; boolean;

f i l e ; ch ar;

(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi

(X Turbo-Pascal Programme können s p e ic h e rp la tz -s p a re n d X) (X m t der H-Option des C ompilers c o m p ilie rt und von X)

(X diesem Programm aus aufg eru fe n werden. X)

(XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX)

type in h a ltre e = re cord

Progname: s t r in g ( . 1 2 . ) ; end;

var d a t e ib u ffe r ; in h a ltre e ; d a te i : f i l e o f in h a ltr e e ; type

d e fS trin g = a rra y ( . 1 . . 3 2 . ) o f s t r in g ( . 1 2 . ) ; d e fs e t = se t o f ch ar;

a n y s trin g = s tr in g ( . 8 0 . ) ; const

b e ll = AG; (X Glocke X)

(X$I f i l e r . l i b X)

procedure i n i t i n h a l t (v a r z ; d e f s tr in g ; va r a n z .re c : in t e g e r ) ; (X l i e s t In h a lts v e rz . von der D is k e tte und X)

(X erzeugt in h a rra y X)

begin a n z .re c := 0;

p ru e f:= e x is t ( ' a s i n h a l t . f i l ' ) ; assign ( d a t e i, ' a : i n h a l t . f i I ' ) ; i f p ru e f then

begin r e s e t ( d a t e i) ;

w h ile n o t e o f ( d a te i) do begin

read (d a te i . d a t e ib u f f e r ) ; Listing, »filer.pas«

a n z .re c := a n z _ re c *l;

z (.a n z _ re c .):= d a te ib u ffe r.p ro g n a m e ;

end; (X w h ile X) Fortsetzung auf Seite 6 8

6 6

i f anz.rec=8 then begin lo u vid e o ;

g o to xyi 1 ,1 2 )¡w r ite ( Neuaufnahme a u fru fe n ' ) ; normvideo:

end; (St i f anz-rec *) end ( f i f p rue f St) e ls e begin

r e w r ite ( d a t e i) ; lo u vid e o ;

g o t o x y iI , 1 2)¡w r ite ('Neuaufnahme a u fru fe n ' ) ; normvideo;

end; (St e ls e *) clo se ( d a t e i) ;

end; (St procedure i n i t i n h a l t SO

procedure h e a d -s trin g (va r z z d e f s tr in g ) ; (St D ient zu r Zuordnung der Daten f ü r den SO

(Sl auszudruckenden a rra y SO

begin

z ( . l . ) ; = 'Programm'; z ( . 2 . ) i “ 'Neuaufnahme'; z ( . 3 . ) ¡ “ 'L ö s c h e n ';

z ( . 4 . ) : = 'Onbenennen'j z ( . 5 . ) : = 'C P /M ';

end; (SS procedure h e a d -s trin g SO

procedure p ro g ra m n -u e b e rsch rift;

begin

g o t o x y ( l, ld ) ; c l r e o l ;

w r it e ( 'PROGRAMME (v o rh : '.a r r a y la e n g e ,' max: 32 ) ' ) ; end;

procedure m s g C z e ile :in te g e r);

begin

g o t o x y iI , z e ile ) ;

w r it e ln ('L e u c h tfe ld m it C ursor-Tasten auf gewünschtes Programm s t e l l e n ') ; w r it e ln ('u n d d ie HOME-Taste d r ü c k e n .') ;

end;

procedure in i t . a r r a y ;

(St S c h re ib t inh a rra v auf D is k e tte SO

begin

assign ( d a t e i , ' i n h a l t . f i l ' ) ; re w rite ( d a t e i) ;

f o r i : = 1 to arraylaenge do begin

d a te ib u f f e r .prognane := i n h a r r a y t . i . ) ; w r it e ( d a t e i. d a t e ib u f f e r ) ;

end; (S( f o r i SO d o s e ( d a t e i) ;

end; (Sl procedure i n i t - a r r a y SO

(MMMmHHHMkMHKStMSiStälHSiStMSiStM)

<X Hauptprogramm F i l e r SO

(S(XSESfS(SfSfXSSfSS()(9ES(Sf3(Sf Sf)f3(3(S(SEXSfSf3(jESSfSfS(XSE)fS(XX9f)f3fS(S(Sf) begin

c lr s c r ;

w r i t e l n ! ' F ile r f ü r Turbo-Pascal Programme u n te r C P /M ');

w r i t e l n ! ' w r itte n by M .A.Schlösser Juni 1 9 8 5 ');

w r it e ln ;

fo r i : = 1 to 79 do w r it e ( ' - ' ) ; i n i t i n h a l t (in h a rra y ,a rra y la e n g e );

h e a d -s trin g ( l in e s ) ; (Sl l i e s t Funktion-Auswahl in das a rra y lin e s 0 s c h re ib -a rra y ( lin e s , 5 , 1 ,5 , 15, 4 ) ;

(St a r r a y / a nz/ x -y p os/ abstand/ w o r te /z e ile SO g o to x y i1 ,7 ); f o r i : = 1 to 79 do w r it e ( ' - ' ) ;

programm-ueber sehr i f t ;

s c h re ib -a rra y (in h a rra y ,a rra y la e n g e ,1 ,1 7 ,1 5 ,4 );

(Si s c h re ib t Benutz e r-P ro g. SO repeat (St u n t il tru e = fa ls e SO m sg(9);

a rra y n r!“ s e le c t ( lin e s , 5 , 1 ,5 , 15, 4 ) ; (St a r r a y / anz/ x - y p os/ a bstand/ w o rte /z e ile it)

c l r ln ( 9 , 1 2 ) ; case a rra y n r o f

1: begin (St Programm SO g o to x y i1 ,9 ) ¡lo u v id e o ;

w r it e ln ('Program m -Ausw ahl');norm video;

msg(18);

arrayn rs= s e le c t (in h a rra y ,a rra y la e n g e ,1 ,1 7 ,1 5 ,4 );

i f a rra y n r <> 0 then begin

a s s ig n l f i le v a r , i n h a r r a y ! . a r r a y n r . ) * '. c h n ') ; . chain ( f i l e v a r ) ;

end (St i f a rra y n r f ) e ls e d r l n ( 9 , l l ) ; end; (If case o f 1 St) 2 : begin (Si Neuaufnahme SO

g o to x y (l,9 );L o w v id e o ;w rite ln ('N e u a u fn a h m e ')¡n o rm v id e o ; w r it e ('D as in s In h a lts v e rz e ic h n is aufzunehmende F i l e m u i ' ) ; w r it e ln ( 'u n t e r xxx.chn auf d e r ') ;

w r it e ln ( 'D is k e tt e v o rlie g e n . D ie Namen-Eingabe ohne F ile -K e n n u n g !');

lin e - e d ito r ('Programm-Namen eingeben',1 , 1 3 , 8 , file n a m e , A ' . . ' z ' . » ;

( f Text-Ausgabe/ x -y p os/ Lange/ v a r ia b le / g ü ltig e Zeichen St) i f filen a m e ö " then

begin

Umw-in.6rossbuchstaben (file n a m e );

h e lp s tr in g !“ file n a m e * '.c h n ';

p ru e f!“ e x is t ( h e lp s tr in g ) ; i f p ru e f then

begin

a rra yla e n g e := a rra yla e n g e *1;

i n h a rra y (. a rra y Iaenge. ) s=f iIenam e:

p ro g ra m n u ie b e rs c h rift;

s c h re ib -a rra y ( in h a r r a y , a r ra y la e n g e ,I,1 7 ,1 5 ,4 );

i n i t - a r r a y ; end e ls e begin

w r it e ( b e l l ) ; gotoxy( 1,13) ; d r e o l ;

w r it e ('D a s F ile --> '. h e l p s t r i n g , '

<— i s t n ic h t a uf D is k e t t e ') ; w r it e ( ' vorhanden. Taste d r ü c k e n .') ; re peat u n t il keypressed;

end; (St e ls e l)

end; (St i f file n a n e <> " it) c l r l n (9 ,1 4 );

end; (St case o f 2 it) 3 : begin (it Löschen it)

g o to x y (l,9 );lo w v id e o ; w r it e ( 'L ö s c h e n '); normvideo;

msg(18);

a rra y n r:“ s e le c t (in h a rra y ,a rra y la e n g e ,1 ,1 7 ,1 5 ,4 );

i f a rra yn r< )8 then begin c l r l n ( 1 0 , l l ) ;

g o to x y i1 ,1 0 )¡w r ite ( ' F i l e in h a r r a y !.a r r a y n r . ) , '< — löschen <j / n ) ' ) ;

re peat read (k b d .z c h );

u n t il upcase(zch) IN ( . ' J ' , ' N ' . ) ; i f upcase(zch) = ' J ' then

begin

assign ( f i l e v a r , i n h a r r a y ( . a r r a y n r . ) * '. c h n ') ; erase ( f i l e v a r ) ;

f o r i : = a rra y n r to a rrayla e ng e do in h a r r a y ! . i . ) ¡= in h a rra y ( . i * l . ) j a rra yla e n g e :“ a rra y la e n g e -1 ; in it_ a r r a y ;

c l r l n f 1 7,2 4);

s c h re itu a rra y (in h a rra y ,a rra y la e n g e ,1 ,1 7 ,1 5 ,4 );

end; (St i f zch = J SO end; (St i f a rra y n r Q 8 SO d r l n ( 9 , l l ) ;

p ro g ra m u u e b e rs c h rif t ;

end; ( f case löschen ¡0 Listing, »filer.pas«

4 : begin (St Umbenennen if) (Fortsetzung)

r»',YsT.'iv>

IQ M RJTEI

6 8

9 o to x y (l,9 );lo w v id e o ; w r it e ('U mbenennen'); normvideo;

msg (1 8 );

a rra y n r;* s e le c t ( in h a rra y ,a rra y la e n g e ,1 ,1 7 ,1 5 ,4 );

i t a rra y n r <> 0 then begin

•f i le_ e xi st := fa ls e ; c l r l n (1 0 ,1 1 );

g o to x y (1 ,1 0 );

w r it e ln ( ' F i l e umbenennen ,in h a r r a y ( .a r r a y n r .) ) ; l in e . e d it o r ('N euer Name

' , l , l l , 8 , f i l e n a m e , ( . ' 0 ' . . ' 9 ' , ' A ' . . ' z ' . ) ) ; UI«w_in_Grossbuchstaben (file n a m e );

f o r i : = 1 to a r r a y ) aenge do

i f file n a m e = in h a rra y ( , i . ) then f i l e _ e x i s t : = tru e ; i f f i l e _ e * i s t then

begin

g o t o x y ( l , l l ) ; c l r e o l ;

w r it e ( b e l l , 'e in F ile ' , file n a m e ," e x i s t i e r t b e r e its . Taste drücken ' ) ;

repeat u n t il keypressed;

end (K i f f i l e - e x i s t X) e ls e begin

assign ( f iI e v a r , in h a r r a y ( , a r r a y n r . H '. c h n ') ; rename ( f il e v a r , f il e n a m e * '. c h n ') j

in h a rra y ( . a r r a y n r . ) ;= file n a m e ; i n i t . a r r a y ;

c l r l n (1 7 ,2 4 );

s c h re ib .a rra y ( in h a rra y ,a rra y la e n g e ,1 ,1 7 ,1 5 ,4 );

end; (X e ls e X) end; (X i f a rra y n r O 0 ¡0 c l r l n (9 ,1 1 );

end; (X case umbenennen SO 5 : begin (X Rückkehr zu CP/M SO

d r s c r ; w r it e <'CP/M - B e trie b s s y s te m ');

w r it e ln ;w r it e 1 n ; h a l t ;

end; (X case CP/N X) end; (Xcase SO

u n t il tru e = fa ls e ; Listing, »filer.pas«

end. (Schluß)

(X L ib r a r y - in d u d e Proceduren SO

fu n c tio n e x is K file n a m e : a n y s tr in g ) ; boolean;

(Si p r ü f t , ob F ile auf D is k e tte vorhanden X) (ü wenn vorhanden w ird e x is t= tru e g e se tzt SO v a r f : f i l e ;

begin (W H O

a s s ig n tf ,file n a m e );

r e s e t ( f ) ;

<X*I+X)

i f IO re s u ltO B then e x is t := fa ls e e ls e e x is t ;= tr u e ;

end; (X fu n c tio n e x is t X)

Drocedure Umw.in.Grossbuchstaben (v a r te x t z a n y s trin g );

(X*V-X) va r i ; in te g e r;

begin

f o r i := 1 to le n g th (te x t) do t e x t ( . i . ) ; = upcase ( t e x t i . i , ) ) ; end; (X procedure Umw-in.Grossbuchstaben X)

procedure s c h re ib -a rra v (v a r name: d e f s tr in g ;

a n z , x s ta r t,y s ta r t,a b s ta n d ,

w o rte .p ro _ Z e ile ; in te g e r ) ; (X s c h re ib t a rra y an vorgegebene S t e lle des B ild s c h irm s X) (X d e fs tr in g muss g lobal d e f in i e r t werden X) (X u nte r anz i s t d ie Länge des A rra ys zu verstehen X) var

i.x ,y ,w o r tz a e h le r : in te g e r;

begin

x;= x s t a r t ; y ; = y s t a r t ; w o rtz a e h le r;* 8 ;

g o t o x y ( x s t a r t , y s t a r t ) s c lr e o l;

f o r i := 1 to anz do begin

g o to x v (x ,y );

w r it e ( n a m e ( .i.) ) ; x ;= x*abstand;

w o rtz a e h le rs s u o rtz a e h le r ♦ 1;

i f w o rtz a e h le r* w o rte _ o ro .z e ile then begin

y := y+1; x ;= x s t a r t ; w o rtz a e h le r:* 0;

g o to x y (x ,y ); c l r e o l ; end;

end; (X f o r i X)

end; (X procedure s c h re ib .a rra v X)

fu n c tio n s e le c t (va r name ; d e f s tr in g ;

a n z , x s t a r t , y s t a r t , abstand,

w o rte -p ro L z e ile ; in t e g e r ) ; in te g e r;

(X Bewegt das L e u c h tfe ld entsprechend der d e fin ie r te n Tasten X) (X w ird d ie ESC-Taste g e d rü c k t, so w ird se le ct= 0 z u r ü c k g e lie fe rt X)

(X ansonsten d ie lf d n r des übergebenen A rra ys X)

const

(X Diese Codes beziehen s ic h auf das Term inal X) (X Basis 108 und müssen a uf andere Te rm ina ls X)

(X angepasst werden. X)

hoch = 0139; (X L e u c h tfe ld 1 Z e ile nach oben X) r u n te r* 1138; (X L e u c h tfe ld 1 Z e ile nach unten X) re c h ts * 0149; (X L e u c h tfe ld 1 Wort nach re c h ts X) lin k s * 013d; (X L e u c h tfe ld 1 Wort nach lin k s X)

b e ll = ' 6 ; (X Glocke X)

esc = 027; (X ESC - Taste X)

home = 0192; (X HOME - Taste X)

var

zch ; c h a r;

x,y ,x m a x ,y m a x ,i,

a rra y n r ; in te g e r;

o n . o ff : boolean;

procedure in v e r s .o n .o ff ; begin

g o to x v ( x ,y ) ;

fo r i ;= 1 to abstand do w r it e ( ' ' ) ; o n . o f f : * n ot ( o n _ o ff ) ; i f o n .o ff then low video;

g o to x y ( x ,y ) ;

w r it e (n a m e (.a rra y n r.));

normvideo;

end; (X procedure in v e r s .o n .o ff X) (X HauptProgramm s e le c to r X) begin

x := x s t a r t ; y ;= y s t a r t ; a r r a y n r :* 1; o n . o f f ; * fa ls e ; xrnax:* w o rte .p ro -z e ile X abstand;

vmax:=( anz d iv w o r t e . o r o . z e ile l+ y s ta r t;

i f anz mod w o r te .p ro .z e ile ) 8 then vmax:=vmax ♦ 1;

tn v e r s .o n .o ff;

repeat repeat read (k b d ,z c h );

u n t il zch IN ( .h o c h ,r u n t e r , r e c h ts ,lin k s ,e s c ,h o n e .);

case zch o f hoch; begin

in v e r s .o n .o ff ; v : = y - l ; i f y < y s ta rt tnen

begin y := y s t a r t ; in v e r s .o n .o ff ; end (X i f X) e ls e begin

a r r a y n r :* a rra y n r - w o rte _ p ro _ z e ile ; in v e r s _ o n .o ff;

end;

end; (X case hoch X) Listing. »Iib.inc«

, A , J, i.

u rn n * r < r ,y n

IQ M R J T E I

69

r u n t e r: begin in v e r s .o n .o ff ;

y:=y+1;

i f y)ynax then begin y := y - 1 ;

in v e rs _ o n .o ff;

end (k i f ¡0 e ls e begin

a r r a v n r :5 a rra v n r ♦ w o rte .p ro .z e i Ie ; i f a rra y n r) anz then

begin

a r r a y n r :5 a rra y n r - w o r te .p r a - z e ile ; y : = y - l ;

end;

in v e r s .o n _ o ff;

end; (k e ls e k) end; (k ru n te r It) re c h ts : begin

in v e r s .o n .o ff : x:= x*a b sta nd ; i f x)x»ax then

begin x := x-a bsta nd ; in v e rs .o n _ o ff;

end e ls e begin

a rra y n r:5 a rra y n r ♦ 1;

i f a rra v n r > anz then begin

a rra v n r:5 anz;

x:= x-a bsta nd ; end;

in v e r s .o n .o ff ; end; <k e ls e k) end; (k re c h ts k) lin k s : begin

in v e r s .o n .o ff ; x:=x-a b sta n d ; i f x f x s t a r t then

begin x := x s t a r t ; in v e r s , o n . o ff;

end e ls e begin

a r r a y n r :5 a rra v n r - 1;

i f a r r a y n r d then begin

a rra v n r:5 1;

x := x s t a r t ; end;

in v e rs _ o n .o ff;

end: <k e ls e k) end; (k lin k s k) esc : begin

inversL.on.off;

a rra v n r:5 0;

zch:= h<xne;

end; <k esc k) end: (k case k) u n t il z c h ^ a n e ;

i f a rra v n rO 0 then in v e r s . o n . o f f ; s e le c t:5 a rra y n r;

end; (It fu n c tio n s e le c t k)

procedure lin e - e d it o r ( t e x t : a n y s trin g ; x s t a r t , y s t a r t ,

e in g fe ld : in te g e r;

va r s tr in g v a r : a n y s trin g ; a d d s trin g : d e fs e t) ;

OS W ird d ie ESC-Taste g e d rü ckt, so w ird e in le e re r S trin g k) (k z u r ü c k g e lie fe r t. Unter e in g fe ld i s t d ie Länge des z u rü ck- k) OS z u lie fe rn d e n S trin g s zu v e rs te h e n . IS) (k W -k )

const OS D iese Codes überprüfen und e v t l . anpassen k) b e ll = A6 ; OS K lin g e lz e ic h e n IS)

Esc 5 127; OS ESC-Taste k>

re tu rn 5 013; <k Return Taste k)

backspc 5 'H ; OS Cursor 1 Zeichen nach lin k s k>

va r x , i ,

za eh le r ; in te g e r;

zch : ch ar;

begin

z a e h le r:5 0 ; s tr in g v a r :5 " ; x := len g th ( t e x t ) *3 ; OS Schreibe Text und s t e l le Cursor a uf k)

0 ! E ing a b efeld k)

gotoxy ( x s t a r t , y s t a r t ) ¡ c l r e o l ; w r it e ( t e x t , ' : ' ) ; f o r i := 1 to e in g fe ld do

w r it e ( ' ' ) ; w r it e ( ' ; ' ) ; g o t o x y ( x ,y s ta r t) ;

OS Erzeugen der auszugebenden V a ria b le n k) repeat <k u n t il re tu rn k)

repeat read (k b d .z c h );

u n t il (zch IN (.b a c k s p c ,re tu rn ,e s c .)) o r <zch IN ( a d d s trin g ) ) ; i f (z a e h le r )= e in g fe ld ) and (n o t(z c h IN (.b a c k s p c ,re tu rn ,e s c .))) then

w r it e ( b e ll) e ls e begin

case zch o f backspc: begin

i f le n g th (s trin g v a r> )0 then begin

d e le te ( s t r in g v a r , Ie n g th ( s tr in g v a r ) , 1 ) ; w r it e (b a c k s p c ,' ' , backspc);

z a e h le r:5 z a e h le r-1 ; end;

end; OS backspc k) Esc: begin

s tr in g v a r :5 " ; zch := r e tu r n ; end; 01 esc k) r e t u r n : :

e ls e

s t r in g v a r : 5 s trin g v a r* z c h ; w r it e (z c h ) ;

z a e h le r:5 za eh le r * 1;

end; (k case k) end; (k e ls e k) u n t il zch 5 re tu r n ;

end; (k procedure lin e - e d it o r k) procedure d r l n ( s t a r t e n d e : in te g e r ) ; (k lö s c h t d ie Z e ile n von S ta rt b is Ende k) v a r i : in te g e r;

begin

f o r i : = s t a r t to Ende do begin

g o t o x y ( l, i) ; d r e o l ; end;

end; (k procedure d r l n k) Listing. »Iib.inc«

(k Ende der L ib r a r y - in d u d e Proceduren k) (Schluß)

(k Die Benutzer-Progranme xxx.chn s o llte n k) (k » i t d ie s e r Procedur abgeschlossen werden, k) (k um nach F i l e r zurückkehren zu können k)

procedure ende;

v a r d i s k f i l e : f i l e ; begin

assign ( d i s k f i l e , 'f i l e r . c o m ') ; ' execute ( d i s k f i l e ) ;

end; Listing, »ende.inc«

70

;OfV\RJTt

Im Dokument Einführung in PASCAL (Seite 54-58)