DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦2695d6e33⟧ TextFile

    Length: 20480 (0x5000)
    Types: TextFile
    Names: »KATALOG.PAS«

Derivation

└─⟦27a1d1812⟧ Bits:30002681 RC-Katalog over EDB-bøger og programmer
    └─ ⟦this⟧ »KATALOG.PAS« 

TextFile

program katalog;

type  regs = record
              ax,bx,cx,dx,bp,si,di,ds,es,flags:integer;
      end;

      produkt=record
              opl: array(.1..10.) of string(.30.);
              nr:integer;
              mark:array(.1..7.) of boolean;
      end;
      prodptr=^produkt;
      streng = string(.30.);
      
var i,j,m,n,p,sortnummer,nummer,antallinier,antalpost,niveau:integer;
post:produkt;
postptr:array(.1..410.) of prodptr;
f:file of produkt;
g:file of string(.255.);
typer:array(.0..9.) of string(.10.);
aktive,maskemgd:array(.1..7.) of integer;      
maske,listetekst:array(.1..7.) of string(.30.);
ch,check:char;      
udvid,med,pr:boolean;
u,e:text;
tom:string(.20.);
st:string(.3.);
reg:regs;

      
procedure L_detach;
begin
  reg.cx:=$9f;
  swint(224,reg);
end;

function L_cattach:integer;
begin
  reg.cx:=$a1;
  swint(224,reg);
  L_cattach:=reg.ax;  
end;


procedure printer;
begin
   close(u);
   if pr then
   begin
      assign(u,'con:');
      L_detach;
   end
   else
      if L_cattach<>$0 then
      begin
         writeln(clrhom);
         gotoxy(10,10);write('PRINTER OPTAGET AF ANDEN PROCES. IKKE TILORDNET. ');
         gotoxy(1,23);write(rvson,' TRYK RETUR ',rvsoff);
         pr:=not pr;
         assign(u,'con:');
         read(ch);
      end
      else
        assign(u,'lst:');
   rewrite(u);
   pr:=not pr;
end;

function findvaerdi(s:streng):integer;
var i,v,p:integer;
begin
   i:=0;
   repeat
     repeat
        i:=i+1;
     until (s(.i.) in (.'0'..'9'.)) or (i=len(s));
     val(copy(s,i,len(s)-i),v,p);
     if p<>0 then
        findvaerdi:=v
     else
        findvaerdi:=0;
  until (p=0) or (v>9);     
end;

   

procedure strquicksort(v:integer);
var gloplys:string(.30.);
    gammel,w:integer;

   procedure sort(v,l,r:integer);
   var i,j:integer;
   x,w:prodptr;
   begin
      i:=l;
      j:=r;
      x:=postptr(.(l+r) div 2.);
      repeat
         while postptr(.i.)^.opl(.v.)<x^.opl(.v.) do i:=i+1;
         while x^.opl(.v.)<postptr(.j.)^.opl(.v.) do j:=j-1;
         if i<=j then
         begin
            w:=postptr(.i.);
            postptr(.i.):=postptr(.j.);
            postptr(.j.):=w;
            i:=i+1;
            j:=j-1;
         end;
      until i>j;
      if l<j then sort(v,l,j);
      if i<r then sort(v,i,r);
   end;
begin
   sort(v,1,antalpost);
   w:=1;
   gloplys:=postptr(.1.)^.opl(.v.);
   gammel:=1;
   repeat
      w:=w+1;
      if postptr(.w.)^.opl(.v.)<>gloplys then
      begin
         sort(1,gammel,w-1);
         gammel:=w;
         gloplys:=postptr(.w.)^.opl(.v.);
      end;
   until w=antalpost;
   sort(1,gammel,w);      
end;


procedure nrquicksort(v:integer);
var gloplys:integer;
    gammel,w:integer;

   procedure sort(v,l,r:integer);
   var i,j:integer;
   x,w:prodptr;
   begin
      i:=l;
      j:=r;
      x:=postptr(.(l+r) div 2.);
      repeat
         while findvaerdi(postptr(.i.)^.opl(.v.))<findvaerdi(x^.opl(.v.)) do i:=i+1;
         while findvaerdi(x^.opl(.v.))<findvaerdi(postptr(.j.)^.opl(.v.)) do j:=j-1;
         if i<=j then
         begin
            w:=postptr(.i.);
            postptr(.i.):=postptr(.j.);
            postptr(.j.):=w;
            i:=i+1;
            j:=j-1;
         end;
      until i>j;
      if l<j then sort(v,l,j);
      if i<r then sort(v,i,r);
   end;
begin
   write(clrhom);
   gotoxy(5,10);
   write('ET ØJEBLIK - LISTE SORTERES EFTER ',RVSON,' PRIS ',RVSOFF,' (LANGSOM)');
   sort(v,1,antalpost);
   w:=1;
   gloplys:=findvaerdi(postptr(.1.)^.opl(.v.));
   gammel:=1;
   repeat
      w:=w+1;
      if findvaerdi(postptr(.w.)^.opl(.v.))<>gloplys then
      begin
         sort(1,gammel,w-1);
         gammel:=w;
         gloplys:=findvaerdi(postptr(.w.)^.opl(.v.));
      end;
   until w=antalpost;
   sort(1,gammel,w);      
end;

procedure quicksort(v:integer);
begin
   if v=4 then 
      nrquicksort(v)
   else
      strquicksort(v);
end;



procedure init;
begin
    typer(.0.):='retur ';
    typer(.1.):='TITEL  ';
    typer(.2.):='FORF. ';
    typer(.3.):='FORLAG ';
    typer(.4.):='PRIS   ';
    typer(.5.):='TLF   ';
    typer(.6.):='FAG    ';
    typer(.7.):='KLAS. ';
    typer(.8.):='BOG/SW ';
    typer(.9.):='SPROG ';
    tom:='                    ';
    for i:=2 to 7 do aktive(.i.):=0;
    for i:=1 to 7 do listetekst(.i.):='';
    udvid:=false;
    pr:=true;
    printer;
    niveau:=1;
    sortnummer:=0;
    maske(.1.):='';
end;

         
procedure indlaes;
begin
   assign(f,'katdata.dat');
   reset(f);
   i:=0;
   while not eof(f) do 
   begin
      i:=i+1;
      read(f,post);
      allocate(postptr(.i.),340);
      postptr(.i.)^:=post;
   end;
   antalpost:=i;
   aktive(.1.):=i;
   close(f);
end;
   

procedure maskeliste;
var typelist:array(.1..410.) of string(.30.);
    k:integer;
begin
   write(clrhom);
   gotoxy(10,10);
   write('ET ØJEBLIK ');
   for j:=1 to 410 do typelist(.j.):='';
   if nummer<>sortnummer then quicksort(nummer);
   writeln;
   k:=0;
   for j:=1 to antalpost do
   begin
      med:=false;
      n:=0;
      if postptr(.j.)^.mark(.niveau-1.) then
      begin
         repeat
            n:=n+1;
            if postptr(.j.)^.opl(.nummer.)=typelist(.n.) then
            med:=true;
         until (med) or (n>=k);    
         if not med then 
         begin
            k:=k+1;
            typelist(.k.):=postptr(.j.)^.opl(.nummer.);
         end;
      end;
   end;
   write(clrhom);
   for n:=1 to k do 
   begin
      if ((n mod 40)=1) and(n<>1) then 
      begin
         gotoxy(1,23);write(rvson,'TRYK RETUR FOR DE NÆSTE :',rvsoff);
         read(ch);
         write(clrhom);
      end;
      if not(odd((n-1) div 20)) then
         gotoxy(1,((n-1) mod 20)+1)
      else
         gotoxy(41,((n-1) mod 20)+1);
      writeln(n,' : ',typelist(.n.));
   end;
   gotoxy(1,23);write(rvson,'Indtast nummeret på ønskede maske, RETUR hvis ingen : ',rvsoff);
   repeat
       gotoxy(54,23);write(clreos);
       read(st);
       val(st,n,p);
   until (p=0) ;
   if (n=0) or (st='') then
   begin
      check:='O';
      if not udvid then niveau:=niveau-1;
   end
   else
      maske(.niveau.):=typelist(.n.);
   if nummer<>sortnummer then quicksort(sortnummer);
end;



function igraenser(s:streng;min,max:integer):boolean;
var v:integer;
begin
   v:=findvaerdi(s);
   if (min<v) and (v<max) then igraenser:=true else igraenser:=false;
end;

      
procedure prisgruppe;
var tal:string(.5.);
    min,max:integer;
begin
   repeat
      write(clrhom);
      gotoxy(10,12);write('1) Op til en vis maksimal pris');
      gotoxy(10,13);write('2) Mellem en øvre og en nedre grænse');
      gotoxy(10,14);write('3) Fra en vis mindstepris og opefter');
      gotoxy(10,10);write('Angiv type af prisområde ');
      read(e,ch);
   until ch in (.'1','2','3'.);
   case ch of
   '1':begin
       min:=0;
       gotoxy(10,18);
       write('Maksimal pris : ');
       read(max);
       str(max,tal);
       maske(.niveau.):='max '+tal;
       end;
   '2':begin gotoxy(10,18);write('Minimal pris  : ');read(min);
             gotoxy(10,20);write('Maksimal pris : ');read(max);
             str(min,tal);
             maske(.niveau.):=tal+' - ';
             str(max,tal);
             maske(.niveau.):=maske(.niveau.)+tal;
       end;
   '3':begin 
         gotoxy(10,18);
         write('Minimal pris : ');
         read(min);
         max:=32767;
         str(min,tal);
         maske(.niveau.):='min '+tal;
         end;
   otherwise
   end;
   for i:=1 to antalpost do
   with postptr(.i.)^ do
   begin
      if (mark(.niveau-1.)) and (igraenser(opl(.4.),min,max)) then
      begin
         if not mark(.niveau.) then aktive(.niveau.):=aktive(.niveau.)+1;
         mark(.niveau.):=true
      end;
   end;
end;
         
   
procedure skim;
begin
   check:='A';
   niveau:=niveau+1;
   write(clrhom);
   gotoxy(10,3);
   if udvid then 
     write(rvson,' UDVIDELSE AF DELGRUPPE : ',listetekst(.niveau.),' ',RVSOFF)
   else
     write(rvson,' VALG AF DELGRUPPE ',RVSOFF);
   gotoxy(10,10);writeln('Vælg blandt nedenstående typer');
   for i:=0 to 9 do begin gotoxy(12,11+i);writeln(i,' : ',typer(.i.));end;
   gotoxy(10,23);write(rvson,'Indtast nummer : ',rvsoff);
   repeat
   read(e,ch);
   until ch in (.'0'..'9'.);
   val(ch,nummer,n);
   if nummer=0 then 
   begin 
     if not udvid then niveau:=niveau-1;
   end
   else
   begin
   maskemgd(.niveau.):=nummer;
   write(clrhom,RVSON,' MASKNING PÅ : ',typer(.nummer.),RVSOFF);
   gotoxy(10,10);
   write('Indtast maske (eller RETUR for liste over mulige ) : ');
   readln(maske(.niveau.));
   if maske(.niveau.)='' then 
   begin
      if nummer=4 then
      begin
         writeln('Vælg mellem at få en liste, eller at angive et prisområde');
         write('RETUR = liste, O = område ');
         read(e,check);
         if check in(.'O','o','0'.) then prisgruppe else maskeliste;
      end
      else
         maskeliste;
   end;
   if not( check in (.'O','o','0'.)) then
      for i:=1 to antalpost do
      with postptr(.i.)^ do
      begin
         if (mark(.niveau-1.)) and (pos(maske(.niveau.),opl(.nummer.))<>0) then
         begin
            if not mark(.niveau.) then aktive(.niveau.):=aktive(.niveau.)+1;
            mark(.niveau.):=true
         end;
      end;
   listetekst(.niveau.):=listetekst(.niveau.)+'/'+copy(maske(.niveau.),1,10);
   end;
end;

procedure bagud;
begin
   for i:=1 to antalpost do postptr(.i.)^.mark(.niveau.):=false;
   aktive(.niveau.):=0;
   listetekst(.niveau.):='';
   niveau:=niveau-1;
end;


procedure udskema(x:integer);forward;
         


procedure liste;
var stk,medtaeller,udantal:integer;
    tom:string(.19.);
    sidste:array(.0..410.) of 0..511;
begin
   case niveau of
      1,2,3,4,5:stk:=2;
      6,7:stk:=3;
   otherwise
   end;
   tom:='                   ';
   udantal:=0;
    write(u,clrhom);
         for i:=1 to niveau do
         begin
            writeln(u,listetekst(.i.));
         end;
         writeln(u,'----------------------------------------------------');
        writeln(u);
   i:=0;
   sidste(.0.):=1;
   repeat
   i:=i+1;
   with postptr(.i.)^ do  
   begin
      if mark(.niveau.) then
      begin
         udantal:=udantal+1;
         sidste(.udantal.):=i;
         writeln(u,udantal,' : ',opl(.sortnummer.));
         for j:=1 to 9 do
         begin
            med:=false;
            n:=0;
            repeat
               n:=n+1;
               if (j=maskemgd(.n.)) and (j<>4) then 
               begin 
                  med:=true; 
                  n:=niveau;
               end;
            until n>=niveau;
            if (not med) and (j<>sortnummer) then
               if j=3 then 
                  writeln(u,tom,opl(.j.)+opl(.10.))
               else
                 writeln(u,tom,opl(.j.));
         end;
         if ((udantal mod stk)=0) and (not pr) then
         begin 
           gotoxy(1,23);
           write(rvson,'RETUR = Næste, F = Forrige, S = Stop (evt for beskrivelse)',rvsoff);
           read(e,ch);
           if ch in (.'S','s'.) then i:=antalpost;
           if (ch in (.'F','f'.)) and (udantal>=2*stk) then begin udantal:=udantal-2*stk;i:=sidste(.udantal.);end;
           write(u,clrhom);
           for j:=1 to niveau do
           begin
              writeln(u,listetekst(.j.));
           end;
           writeln(u,'----------------------------------------------------');
         end;
      end;
   end;
until i=antalpost;
if not pr then 
begin 
   if not (ch in (.'S','s'.)) then
   begin
     gotoxy(1,23);
     write(rvson,' TRYK RETUR ',rvsoff);
     read(ch);
   end;
   write(clrhom);
   gotoxy(1,10);
   write('Angiv nummer på post der ønskes beskrivelse af, RETUR hvis ingen');
   read(st);
   if st<>'' then
   begin
      val(st,i,p);
      if p=0 then 
      begin 
         assign(g,'beskriv.dat');
         reset(g);
         medtaeller:=0;
         p:=0;
         repeat
            p:=p+1;
            if postptr(.p.)^.mark(.niveau.) then medtaeller:=medtaeller+1;
         until medtaeller=i;
         udskema(p);
         gotoxy(7,23);
         write(rvson,'  Tryk RETUR',rvsoff);
         read(ch);
         close(g);
      end;
   end;
end;
end;


procedure udskema;
var beskrivelse:string(.255.);
procedure linie(x:integer);
var i:integer;
begin
   write(u,'      ');
   case x of 
     1,5,6:write(u,'▶86◀');
     2,3  :write(u,'▶80◀');
     4,7  :write(u,'▶82◀');
   otherwise
   end;
   for i:=1 to 35 do write(u,'▶88◀');
   case x of
      1:write(u,'▶8a◀');
      2,7:write(u,'▶88◀');
      3,6:write(u,'▶84◀');
      4,5:write(u,'▶87◀');
   otherwise
   end;
   for i:=1 to 35 do write(u,'▶88◀');
   case x of
      1,5,6:writeln(u,'▶85◀');
      2,3  :writeln(u,'▶81◀');
      4,7  :writeln(u,'▶83◀');
   otherwise
   end;   
end;
procedure tekst(n:integer);
begin
     writeln(u,copy('      ▶89◀'+typer(.n.)+postptr(.x.)^.opl(.n.)+tom+tom,1,42),
          copy('▶89◀ '+typer(.n+1.)+postptr(.x.)^.opl(.n+1.)+tom+tom,1,36),'▶89◀');
end;
            

var k,pos,i:integer;

begin
   write(clrhom);
   with postptr(.x.)^ do
   begin
      linie(3);
      tekst(1);linie(5);
writeln(u,copy('      ▶89◀'+typer(.3.)+opl(.3.)+opl(.10.)+tom+tom+tom+tom,1,78),
                 '▶89◀');
      linie(6);
      tekst(4);linie(1);
      tekst(6);linie(1);
      tekst(8);linie(4);
      linie(2);
      antallinier:=0;
      write(u,'      ▶89◀ ');
      pos:=8;
      seek(g,4*(nr));
      for i:=1 to 4 do
      begin
         read(g,beskrivelse);
         k:=0;
         if len(beskrivelse)>0 then
         begin
            m:=0;
            repeat
               m:=m+1;
               pos:=pos+1;
               if ((beskrivelse(.m.)=chr(13)) or (pos=78)) or 
                    (beskrivelse(.m.)=chr(10))  then
               begin
                  while pos<79 do begin pos:=pos+1;write(u,' ');end;
                  write(u,'▶89◀',chr(13)+chr(10),'      ▶89◀ ');
                  antallinier:=antallinier+1;
                  pos:=8;
                  if (beskrivelse(.m.)=chr(13)) and (m<253) then m:=m+1;
                  if (not pr) and (antallinier=11) then
                  begin
                     gotoxy(1,23);
                     write(rvson,'TRYK RETUR FOR RESTEN',rvsoff);
                     read(ch);
                     gotoxy(1,23);write('     ▶89◀                ');
                     gotoxy(8,23);
                  end;
               end   
               else
               if (m<=len(beskrivelse)) then write(u,beskrivelse(.m+k.));
            until m>=len(beskrivelse);
         end;
      end;
      while pos<78 do begin pos:=pos+1;write(u,' ');end;
      writeln(u,'▶89◀');
      linie(7);
      end;
end;
     
procedure beskriv;
var taeller:integer;
    sidste:array(.0..410.) of 0..511;
begin
   assign(g,'beskriv.dat');
   reset(g);
   writeln(u,chr(12));
   taeller:=0;
   i:=0;
   sidste(.0.):=1;
   repeat
   i:=i+1;
   with postptr(.i.)^ do
      if mark(.niveau.) then 
      begin
         taeller:=taeller+1;
         sidste(.taeller.):=i;
         if (pr) and ((taeller mod 2)=1) then 
         begin 
            writeln(u,((taeller-1) div 2):40);
            write(u,chr(12));
            writeln(u,tom+tom+postptr(.i.)^.opl(.sortnummer.):79);
         end;
         udskema(i);
         if not pr then 
         begin 
            gotoxy(7,23);
            write(rvson,'  RETUR = næste, F =Forrige, S = Stop',rvsoff);
            read(e,ch);
         end
         else
            for m:=1 to 17-antallinier do writeln(u);
         writeln(u);
         if ch in (.'S','s'.) then i:=antalpost;
         if (ch in (.'F','f'.)) and (taeller>1) then begin taeller:=taeller-2;i:=sidste(.taeller.);end;
       end;   
   until i=antalpost;
   close(g);
end;


procedure sorter(v:integer);
begin 
   write(clrhom);
   if v=0 then
   begin
      gotoxy(10,3);
      write(rvson,' SORTERING ',rvsoff);
      for i:=1 to 9 do begin gotoxy(10,7+i);writeln(i,' : ',typer(.i.));end;
      gotoxy(10,23);write(rvson,'INDTAST NUMMER DER ØNSKES SORTERET EFTER : ',rvsoff); 
      repeat
         read(e,ch);
      until ch in(.'1'..'9'.);
      v:=ord(ch)-48;
   end;
   if v<>sortnummer then
   begin
      sortnummer:=v;
      write(clrhom);
      gotoxy(10,10);
      write('SORTERER DATA EFTER ',rvson,'  ',typer(.sortnummer.),rvsoff);
      quicksort(sortnummer);
   end;
end;

procedure indhold;
var w,w1,w2,max:integer;
    prik:string(.55.);
    gloplys:string(.30.);
    tryk:boolean;
    side:array(.1..410.) of 0..410;
    oplys:array(.0..410.) of string(.30.);
begin
   prik:='.......................................................';
   writeln(u,chr(12));
   writeln(u);
   writeln(u,'            INDHOLDSFORTEGNELSE');
   writeln(u);
   writeln(u);
   quicksort(sortnummer);
   for w:=0 to 410 do oplys(.w.):=' ';
   w:=0;
   w1:=0;
   write(clrhom);
   for i:=1 to antalpost do
   with postptr(.i.)^ do 
   begin
      if mark(.niveau.) then
      begin
         w:=w+1;
         if opl(.sortnummer.)<>gloplys then
         begin
           gloplys:=opl(.sortnummer.);
           for w2:=1 to 30 do
               if gloplys(.w2.)<>' ' then max:=w2;
           writeln(u,tom,copy(copy(gloplys,1,max)+prik,1,55),((w+1) div 2));
           if pr then writeln(u);
           tryk:=false;
           w1:=w1+1;
         end;
         side(.w.):=(w+1) div 2;
         oplys(.w.):=opl(.1.);
         gloplys:=opl(.sortnummer.);
         if (not pr) and (not tryk) and (((w1 mod 20)=0) or (i=antalpost)) then
         begin
             tryk:=true;
             gotoxy(10,23);
             write(rvson,'TRYK RETUR FOR DE NÆSTE',rvsoff);
             read(ch);
             write(clrhom);
         end
         else
             if (pr) and ((w1 mod 25)=0) then writeln(u,chr(12),chr(10));
       end;
   end;
quicksort(1);
w:=0;
if pr then
for i:=1 to antalpost do
with postptr(.i.)^ do
begin
   if mark(.niveau.) then
   begin
      w:=w+1;
      if (w mod 55)=1 then write(u,chr(12),chr(10));
      w1:=0; 
      repeat
         w1:=w1+1;
      until opl(.1.)=oplys(.w1.);
      gloplys:=opl(.1.);
      for w2:=1 to 30 do
         if gloplys(.w2.)<>' ' then max:=w2;
      writeln(u,tom,copy(copy(gloplys,1,max)+prik,1,55),((w1+1) div 2));
   end;
end;
quicksort(sortnummer);
end;
      

procedure hovedmenu;

begin
   assign(e,'kbd:');
   rewrite(e);
   repeat
     write(clrhom);
     gotoxy(10,3); write('L = LISTE OVER NUVÆRENDE GRUPPE');
     gotoxy(10,5); write('B = BESKRIVELSE+LISTE OVER NUVÆRENDE GRUPPE');
     gotoxy(10,7); write('S = SORTERING EFTER BESTEMT POST');
     gotoxy(10,9); write('D = DELGRUPPE EFTER MASKE');
     gotoxy(10,11);write('U = UDVID NUVÆRENDE DELGRUPPE             ',
                          rvson,' NIVEAU : ',niveau,' ',rvsoff);
     gotoxy(10,13);write('T = TILBAGE TIL FOREGÅENDE GRUPPE');
     gotoxy(10,15);write('P = PRINTER TIL ELLER FRA');
     gotoxy(10,17);if pr then write('I = INDHOLDSFORTEGNELSE FOR NUVÆRENDE GRUPPE');
     gotoxy(10,21);write('A = AFSLUT PROGRAMMET');
     gotoxy(10,1);
     if pr then write(rvson,' printer ',rvsoff) else write(rvson,' skærm ',rvsoff);
     gotoxy(30,1);write(rvson,'  ','ANTAL I NUVÆRENDE GRUPPE : ',aktive(.niveau.),'  ',rvsoff);
     gotoxy(10,23);write(rvson,' INDTAST DET ØNSKEDE : ',rvsoff);
     read(e,ch);
     case ch of
        'L','l':liste;
        'B','b':beskriv;
        'S','s':sorter(0);        
        'D','d':skim;
        'U','u':if niveau>1 then begin udvid:=true;niveau:=niveau-1;skim;udvid:=false;end;
        'T','t':if niveau>1 then bagud;
        'I','i':indhold;
        'P','p':printer;
     otherwise
     end;
   until ch in (.'A','a'.);
write(clrhom);
end;
        
begin
   init;
   indlaes;
   sorter(1);
   hovedmenu;
   close(f);
   close(u);
   close(e);
end.
«eof»