Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-03 - decus/20-0078/libsim/dbsort.sim
There is 1 other file named dbsort.sim in the archive. Click here to see a list.
OPTIONS(/external);
EXTERNAL REF (Infile) PROCEDURE findinfile;
EXTERNAL REF (Outfile) PROCEDURE findoutfile;
EXTERNAL TEXT PROCEDURE conc,front,scanto,upcase,
frontstrip,rest,checkextension,getitem;
EXTERNAL CHARACTER PROCEDURE fetchar,findtrigger;
EXTERNAL LONG REAL PROCEDURE scanreal;
EXTERNAL PROCEDURE split,arrtxt;
EXTERNAL INTEGER PROCEDURE checkreal,checkint,scanint,ilog,
maxint,search,splita,hash,arrlgd;
EXTERNAL BOOLEAN PROCEDURE menu,puttext;
EXTERNAL CLASS safeio;
EXTERNAL CLASS simdbm,dbmset;
dbmset CLASS dbsort;
BEGIN
  INTEGER k,m,n;
  BOOLEAN errorflag;
  TEXT t,u,v;

  COMMENT Procedure RECSORT will sort the contents
  of the lrecord array in ASCENDING order.
  Author: Algorithm 271 CACM 11-65, 5-66.
  Modified by: Mats Ohlin, FOA 1, S-104 50 STOCKHOM 80, SWEDEN.
  Date: 75-09-19
  ;
  PROCEDURE recsort (arr,n,key);
  REF (record) ARRAY arr;   INTEGER n,key;
  BEGIN   INTEGER i,k,q,m,p;   TEXT t,x;
    REF (record) rt,rx;
    INTEGER ARRAY ut,lz [1:Ln(Abs(n)+2)/0.69314718];

    OPTIONS(/A);
    IF arr[1].avalues[key] > arr[n].avalues[key] THEN
    BEGIN
      rt:- arr[1];
      OPTIONS(/-A);   arr[1]:- arr[n];   arr[n]:- rt
    END test and swap;

    i:= m := 1;
    WHILE m > 0 DO
    BEGIN
      IF n-i > 1 THEN
      BEGIN
	p:= (n+i)//2;    t:- arr[p].avalues[key];   rt:- arr[p];
	arr[p]:- arr[i];
	q:= n;   k:= i;
	FOR k:= k+1 WHILE k <= q DO
	BEGIN
	  IF arr[k].avalues[key] > t THEN
	  BEGIN
	    WHILE q >= k DO
	    BEGIN
	      IF arr[q].avalues[key] < t THEN
	      BEGIN
		rx:- arr[k];   arr[k]:- arr[q];
		arr[q]:- rx;   q:= q-1;
		GO TO l;
	      END;
	      q:= q-1;
	    END Q;
	  END;
	  l:
	END K;
	arr[i]:- arr[q];
	arr[q]:- rt;
	IF 2*q>i+n THEN
	BEGIN
	  lz[m]:= i;   ut[m]:= q-1;   i:= q+1;
	END
	ELSE
	BEGIN
	  lz[m]:= q+1;   ut[m]:= n;   n:= q-1;
	END;
	m:= m+1;
      END
      ELSE
      BEGIN
	IF (IF i < n THEN arr[i].avalues[key] > arr[n].avalues[key] ELSE
	FALSE) THEN
	BEGIN
	  rx:- arr[i];   arr[i]:- arr[n];   arr[n]:- rx
	END;
	m:= m-1;
	IF m > 0 THEN
	BEGIN   i:= lz[m];   n:= ut[m]   END;
      END
    END m > 0 loop;
  END recsort IN ASCENDING ORDER;

  PROCEDURE scan(ra,p);
!  g} igenom alla poster i arrayen ra (slutmarkering = NONE)
och anropa proceduren P f`r varje post
--------------------------------------------------------;
  REF (record) ARRAY ra; PROCEDURE p;
  BEGIN INTEGER k; REF (record) r;
    r:-ra(1); k:=1;
    WHILE r =/= NONE DO
    BEGIN p(r); k:=k+1; r:-ra(k); END;
  END of scan;

  INTEGER PROCEDURE rec_array(rtyp,sortfield,ra,owner,setname);
  VALUE rtyp,sortfield,setname;
  TEXT rtyp,sortfield,setname;
  REF (record) ARRAY ra; REF (record) owner;
  ! ________________________________________
  scan all records of type rtyp
  store references to them in ra,
  sort ra on the attribute sortfield
  ------------------------------------------;
  BEGIN INTEGER k,n,m,max,sortpos; REF (rspec) rs;

    PROCEDURE rsave(r); REF (record) r;
    BEGIN ! save record in array ra;
      IF r == NONE THEN
      BEGIN
	Outtext("Felaktigt set f`r posten: "); outline(owner.getkey);
      END ELSE
      BEGIN
	max:=max+1; ra(max):-r;
      END;
    END rsave;

    PROCEDURE errorstop(t,u); VALUE u; TEXT t,u;
    BEGIN
      Outtext(t); outline(u);
      errorflag:=TRUE; GOTO fin;
    END;

    max:=0; ra(1):-NONE;
! verifiera att angiven posttyp och sorteringsf{lt motsvaras
av storheter definierade i databasens specifikation
----------------------------------------------------------;
    rs:-getrecordspec(rtyp);
    IF rs == NONE THEN
    errorstop(rtyp,": Record type undefined !");
    n:=loctext(sortfield,rs.anames);
    IF n = 0 THEN errorstop(sortfield,": Undefined sort field !");
    IF owner == NONE THEN doforeach(rtyp,rsave) ELSE
    BEGIN
      mapset(owner,setname,rsave);
    END;
    IF max > 1 THEN recsort(ra,max,n);
    ra(max+1):-NONE;
    fin:
    rec_array:=max;
  END of rec_array;

END;