DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

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

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦d3f934870⟧ TextFile

    Length: 7680 (0x1e00)
    Types: TextFile
    Names: »let7txt«

Derivation

└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ.  Detaljer om "HC8000" projekt.
    └─⟦0364f57e3⟧ 
        └─⟦this⟧ »let7txt« 

TextFile

let7=set 1
scope day let7
let7=algol list.no
CD 82-09-16

fpparametre:
lw.60 (liniebredde)
min.1 (det minimale antal tegn før deletegnet <->)

begin

<*Program til skærmstyret tekstjustering af almindelig tekst
indeholdende orddelingstegnet <->. Justeringen foretages ved
linieombrydning inden for en paragraf, der er defineret som
tekst efterfulgt af <nl><nl>, <nl><sp> eller <nl><.>, hvor
sidste mulighed omtales senere.

Linieombrydningen styres af fpparametrene <lw> og <min>,
hvor <lw> angiver det maksimale antal tegn pr. linie, og
<min> angiver det minimale antal tegn foran orddelingstegnet
<->, hvis tekstjusteringen kræver orddelinger.

Det ord der skal deles udskrives på skærmen som f.eks:

konstant i o n p o l i t a nerinde
        9 8 7 6 5 4 3 2 1 0
 =

og der svares med et tal svarende til orddelingens
placering. Svares med et negativt tal f.eks.-2 deles ordet
ved 2 og værdien af <min> gøres stor, således at resten af
tekstjusteringen foretages uden orddelinger.

Paragrafafslutningen <nl><.> gør det muligt at ændre værdien
af <min> i teksten, hvis der f.eks. er indsat et stykke
tekst i en i forvejen indsat tekst. Værdien af <min> ændres
til x ved at skrive .min.x først på en linie.

Eksempel 1:

Området tekst1 indeholder en ujusteret tekst der skal
justeres og lægges i området tekst2:

          tekst2=let7 tekst1

Da hverken <lw> eller <min> er angivet ved kaldet fås
standardværdierne 60 og 2.

Eksempel 2:

tekst2 indeholder følgende:

          justeret tekst
          .min.2
          ujusteret tekst
          .min.99
          justeret tekst

Den ujusterede tekst justeret og hele den justerede tekst
lægges i tekst1:

          tekst1=let7 tekst2 min.99                    *>

  integer i,j,linelength,lw,pointer,old,new,newsema,
  oldsema,reduce,delpointer,wl,spl,mode,minchar;
  boolean specchar, normchar;

  real array field raf;
  integer array I,J(1:255);
  long array IFILE,OFILE(1:3);
  zone zi,zo(128,1,stderror);

  procedure error(num); value num; integer num;
  begin
    write(out,<:error :>,num);
    goto FIN; 
  end;


  procedure wordwindow;
  begin
    integer j,j1,k;
    connectcuri(<:c:>);
    k:=if I(1)=32 then 2 else 1;
    for j:=k step 1 until i-1 do 
    begin
      if j=k then write(out,"sp",1);
      if j<=delpointer and j>k and delpointer-j<=9
      then write(out,"sp",1);
      write(out,false add I(j),1); 
    end;
    write(out,"nl",1);
    k:=delpointer-k;
    for j:=k step -1 until 0 do 
    begin
      if j<=9 then write(out,<<d>,j,"sp",1) else
      write(out,"sp",1); 
      if j=10 then write(out,"sp",1);
    end;
    if k>9 then k:=9;
    j1:=readil(<::>,-k,k);
    if j1<0 then 
    begin
      j1:=-j1; minchar:=99; 
    end;
    delpointer:=delpointer-j1;
    if delpointer>2 then J(delpointer):=1;
  end;

  integer procedure speclength;
  begin
    integer newsema,oldsema,reduce,j;
    oldsema:=0; newsema:=0; reduce:=0;
    for j:=1 step 1 until i-1 do 
    begin
      if I(j)=35 or I(j)=36 then 
      begin
        newsema:= if I(j)=35 then newsema-1 else newsema+1;
        if abs(newsema) > abs(oldsema) then reduce:=reduce+1
        else reduce:=reduce+2;
        oldsema:=newsema; 
      end;
      if j>1 then 
      begin
        if I(j)<>35 and I(j)<>36 and I(j-1)<>35
        and I(j-1)<>36 then
        oldsema:=newsema:=0; 
      end;;
    end;
    speclength:=spl:=i-1-reduce; 
  end;

  procedure move; 
  begin
    integer j;
    for j:=2 step 1 until i-1 do 
    begin
      I(j-1):=I(j); J(j-1):=J(j); 
    end; 
  end;

  procedure ww;
  begin
    integer j;
    for j:=1 step 1 until i-1 do 
    begin
      if J(j)>1 then 
      write(zo,<:-:>,"nl",1);
      write(zo,false add I(j),1); 
    end;
  end;

  procedure clear;
  begin
    cleararray(I); cleararray(J); 
    normchar:=false; specchar:=false;
  end;

  procedure writeword;
  begin
    integer j;
    if linelength>= lw then 
    begin
      move; linelength:=0; i:=i-1; write(zo,"nl",1); 
    end;
    linelength:=if specchar then linelength+speclength
    else linelength+i-1;
    if linelength<=lw then 
    begin
      ww;
      clear;
      I(1):=32; i:=2; 
    end else 
    begin
      if specchar then 
      begin
        I(1):=10; ww;
        clear; I(1):=32; i:=2; specchar:=false;
        linelength:=spl-1;
      end else 
      begin
        j:=i-1-(linelength-lw);
        if j=0 then j:=1 else 
        begin
          delpointer:=j;
          if j>minchar and J(j)=0 then wordwindow; 
        end;
        for j:=j step -1 until 1 do 
        begin
          if j>0 then 
          begin
            if J(j)>0 or j=1 then 
            begin
              if j=1 and I(1)<>32 then else
              if J(j)>0 then J(j):=2 else I(1):=10;
              ww;
              linelength:=i-j;
              if j=1 then linelength:=linelength-1;
              clear;
              I(1):=32; i:=2;
              goto LBL2; 
            end;
          end;
        end;
        if j=0 then error(3); 
      end;
LBL2: 
    end;
  end;


  raf:=0;
  cleararray(IFILE); readinfp(IFILE.raf,1);
  open(zi,4,IFILE,0);
  cleararray(OFILE); readlsfp(OFILE.raf);
  open(zo,4,OFILE,0);
  clear;
  i:= 1; linelength:= 0; old:= 0;
  readifp(<:lw:>,lw,60);
  readifp(<:min:>,minchar,2);
  minchar:= if minchar<2 then 2 else minchar+1;
  if lw<minchar+2 then lw:=minchar+2;
  specchar:=normchar:=false;


  for i:= i while old<>25 do
  begin
    readchar(zi,new);
    if i>1 then 
    begin
      if old=45 and new=10 and i>2 then 
      begin
        if -,((i=3 and I(1)=32) or I(i-2)=45) then 
        begin
          i:=i-1; J(i):=1; goto LBL; 
        end; 
      end;
      if old=10 and (new=10 or new=32 or new=12 or new=46 or new=25) then
      begin
        if J(i)=1 then 
        begin
          J(i):=0; I(i):=45; i:=i+1; writeword; 
        end;
        linelength:=0; i:=1; write(zo,"nl",1);
        goto LBL0; 
      end;
      if new=10 or (new=32 and normchar)  or (new=25 and i>1) then 
      begin
        if J(i)=1 then 
        J(i):=0;
        writeword; goto LBL; 
      end; 
      goto LBL1;
    end;
LBL0:
    if i=1 then 
    begin
      if new=10 or new=12 then 
      begin
        write(zo,false add new,1); goto LBL; 
      end;
      if new=46 then 
      begin
        old:=new; readchar(zi,new);
        if new=77 or new=109 then 
        begin
          for i:=i while new<>46 do readchar(zi,new);
          read(zi,minchar); 
          minchar:=if minchar<2 then 2 else minchar+1;
        end else 
        begin
          write(zo,false add old,1); write(zo,false add new,1);
          for i:=i while new<>10 do 
          begin
            readchar(zi,new); write(zo,false add new,1); 
          end;
        end;
        goto LBL;
      end; 
    end;
LBL1:
    I(i):=new; i:=i+1;
    if new=35 or new=36 then specchar:=true;
    if new<>32 then normchar:=true;
LBL:
    old:=new;
  end;
FIN:write(zo,"em",1);
  close(zi,true); close(zo,true);
end
▶EOF◀