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

⟦fc36fd94e⟧ TextFile

    Length: 43776 (0xab00)
    Types: TextFile
    Names: »accosumtxt«

Derivation

└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ.  Detaljer om "HC8000" projekt.
    └─⟦0364f57e3⟧ 
        └─⟦baac87bee⟧ »gi« 
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
    └─⟦4334b4c0b⟧ 
        └─⟦baac87bee⟧ »gi« 
            └─⟦this⟧ 

TextFile


;       account sum           * page 1    2 04 80, 10.49;  

(
accosum = set 1

accosum = algol

if ok.no
mode warning.yes

if warning.yes
(mode 0.yes
message accosum not ok
lookup accosum)
if 0.no
scope project accosum

copy message.no 33.1

acc = set 1

acc = copy message.no 33.1

if ok.no
(mode 0.yes
message accountjob not ok
lookup accountjob)
acc = indate
lookup acc
end
)

\f



;       account sum           * page 2    2 04 80, 10.49;  

;  a c c o u n t - s u m .
;  ***********************
begin comment

Acco sum.
_________

A program for summation of account records 
from the operating system boss 2.

Updated jan 1977, Willy Weng.

Syntax of call:
_______________

_                             *
_                (  <file>   )
<out> = acco_sum <           >
_                (  <param>  )

<out>        ::= <bs name>

_                (  <mt name> <file nos>  )
<file>       ::= <                        >
_                (  <bs name>             )

<bs name>    ::= <text>
<mt name>    ::= <text>

_                                2
_                (              )
<file nos>   ::= <  .<file no>  >
_                (              )
_                                0

<file no>    ::= <integer>

_                (  <bool param>      )
<param>      ::= <  <user selection>  >
_                (  <int param>       )

_                (  test   )     (  yes  )
<bool param> ::= <  print  >  .  <       >
_                (  kbon   )     (  no   )
_                (  clear  )

_                (  page   )
_                (  paper  )
_                (  users  )
<int param>  ::= <  pris   >  .  <integer>
_                (  first  )
_                (  segm   )
_                (  proj   )

_                                                          1
_                                         (               )
<user selection>::= user  .  <user name>  <  . <project>  >
_                                         (               )
_                                                          0

<user name>    ::= <text>
<project>      ::= <integer>

The value proj.all of <int param> is also allowed.

;  

\f



comment account sum           * page 3    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

comment

Semantic of Call:
_________________

The three parameters <file>, <out> and <param> specify the
input, output and the mode of the program.

*

<file>

The format of the input files are given in  Søren Lauesen:
BOSS 2, Instatallation and Mantenance,  RCSL31-D313,  ISBN 
87 7557 015 7, chapter six.
Only backing storage or magnetic tape files can be used in
the same call. In the magtape case first and last file  on
each tape can be specified (default value 1, infinity). It
is assumed that each tape file is written by save  (RCSL31-
D335)  and that it consist of one entry with the name  ac-
count ffile (This requirement is met by the magnetic tapes  
made by the routine account job. The operator can tell you 
which tapes and which files to use if you want some old pe-
riod).

*

<out>

The output file must be a  backing  storage  area.  If it 
don't exist it will be created with scope  temp.  (Caution: 
If  you use print.yes a temporary file will disappeear  af-
ter convert.)

*

<param>

The function of the program can  be  modified  in  various 
ways, especialy selection of the users, projects  and  day
interval to contribute to the summation.

The faur boolean parameters has defoult value no. The func-
tion of value yes are:
test : test output
print: convert output file
kbon : output of each account record
clear: clear of input file

The default value and the meaning of  the  integer  parame-
page :       1, no of first page in output
paper:       0, paper format for convert
users:     120, size of internal table of user statistics
pris :     112, price index, jan 1973 = 112
first:       0, first date to be used in summation
last :  999999, last date to be used in summation
segm :       9, segments per block in magtape save
proj : <empty>, the projects to contribute to the sum, 
_               value all is alloved, equivalent to
_               proj.51 proj.52 proj.53 proj.3002, 
_               proj.6001 proj.6002 proj.7001 proj.8001

;  

\f



comment account sum           * page 4    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

comment
The parameter user can be used to specify which  users  to 
be used in the summation. If no project no i  present  the
user name is used in all projects.

If no user selection (parameter user or proj) are used all
account records in the day interval are used.

Wage Regulation Index.
______________________

The acco_sum program use the 'wage regulation index'
(reguleringspristal)  with  base january 1971 = 100
to compute a 'price'. By means of the  fp-parameter
pris the actual value of the index can be  assigned.

However, the base of the official  wage  regulation
index has been changed to  january 1975 = 100.  The
relation between a 1971-index and a 1975-index come
from the january 1975 value of the 1971-index. This
value is 147, so

index(base 1971) := index(base 1975) * 1.47.

To assist  you  in  selecting the correct  index  a
table of the value of the wage regulation index for
january is given:

Year   Base 71   Base 75

1971     100       ...
1972     106       ...
1973     114       ...
1974     129       ...
1975     147       100
1976     160       109
1977     173       118
*

As the job file of the routine accountjob  is  unac-
cessible when boss is running, it is in  this  case
unattractiv to use the fp-parameter  pris  to  vary
the regulation index. So another way  to assign  it
exist. The program acco_sum looks after an entry na-
med 'accoprice' and if it exist the value of tail(8)
(the one just after date and time) is used as index
(with base 1975, i.e. the value of tail(8) is multi-
plied by 1.47 before used  in  price  computations).
This can also be used by ordinary users. Use fp-com-
mands like 

acco_price = set ip 0 0 0 <index, base 1975>
<output>   = acco_sum <param>

;  

\f



comment account sum           * page 5    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

integer procedure iso_date(date);  
_________________________________

value   date;  
integer date;  

comment convert a date in form ddmmyy to form yymmdd;  

iso_date:= (date mod    100)        * 100 00 +
_          (date mod 100 00) // 100 *    100 +
_           date //  100 00;  

\f



comment account sum           * page 6    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

integer procedure write_date(zout, date);  
_________________________________________

value    date;  
integer  date;  
zone     zout;  

begin
comment Datoen i date (på formen dag*10000+måned*100+
år mod 100) udskrives på formen
<ugedag> den <dag>.<måned> 19<år>
på zonen zout, der skal være åben og klar til
karakter output.
willy weng, gi, 25 03 74;  

integer år, måned, dag, uge_dag;  

år      := date mod 100;  
måned   := (date//100) mod 100;  
dag     := date//10000;  
uge_dag := (år*365 +
(år - (if (år>3 and måned<3) then 1 else 0))//4 +
(case måned of(
0, 31, 59, 90, 120, 151, 
181, 212, 243, 273, 304, 334)) +
dag) mod 7;  
comment størelsen der tages mod 7 er antallet
af dage siden 0.januar 1900, der var en søndag;  

write_date:= write(zout, case (ugedag + 1) of (
<:søndag:>, <:mandag:>, <:tirsdag:>, 
<:onsdag:>, <:torsdag:>, <:fredag:>, 
<:lørdag:>), <: den:>, << d>, dag, 
<:.:>, case måned of (
<:januar:>, <:februar:>, <:marts:>, 
<:april:>, <:maj:>, <:juni:>, 
<:juli:>, <:august:>, <:september:>, 
<:oktober:>, <:november:>, <:december:>), 
<< dddd>, 1900+år);  
end write_date;  

\f



comment account sum           * page 7    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

integer procedure conv(file, paper);  
____________________________________

value    paper;  
zone     file;  
integer  paper;  

begin

comment 

Convert the file given in the description of the zone
file using paper-type given by the parametre paper.

conv   (integer, return value). The answer from boss
_      on the convert message:
_      0 - convert ok
_      1 - cbufs exceeded
_      2 - file not visible
_      3 - file has login scope
_      4 - temporary resources insufficient
_      5 - file in use

file   (zone, call value). Gives the name of 
_      the file to be converted to printer.

paper  (integer, call value). The paper format used.
_      Value zero gives standard.

In case of error-answer from boss (conv<>0) the
coresponding text will be written on current output.

;  

\f



comment account sum           * page 8    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

integer procedure parent_message(mes);  
______________________________________

integer array mes;  
begin

comment send the message in mes to
the parent, ie. the operating-system 
executing the program;  

integer i, 
_       parent_addr, 
_       mode_kind;  

real    array parent_name(1:2);  

integer array sh_des(1:12);  

zone    parent(1, 1, stderror);  

parent_addr:= system(8, mode_kind, parent_name);  
i          := 1;  
open(parent, mode_kind, string(parent_name(increase(i))), 0);  

get_share(parent, sh_des, 1);  
for i:= 4 step 1 until 11 do
sh_des(i):= mes(i-4);  
set_share(parent, sh_des, 1);  

i:= monitor(16)send_message_to:(parent, 1, sh_des);  
if i=0 then system(9, 0, <:<10>bufclaim:>);  
if mes(0) extract 5 = 0 then
i:= monitor(18)wait_answer_from:(parent, 1, mes);  
parent_message:= i;  

end parent_message;  

\f



comment account sum           * page 9    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

comment variabel declaration of procedure conv;  
integer p;  
integer array zone_des(1:20), 
_             mes_buf (0:7);  

comment bild the message;  
mes_buf(0):= 30 shift 12 add (1 shift 9);  
mes_buf(1):= real <:conv:> shift (-24) extract 24;  
mes_buf(2):= real <:conv:>             extract 24;  
mes_buf(3):= paper;  

get_zone(file, zone_des);  
for p:= 4 step 1 until 7 do
mes_buf(p):= zone_des(p-2);  
comment send the message;  
p:= parent_message(mes_buf);  
if p <> 1 then system(9)run_time_alarm:(p, <:<10>print   :>);  

if mes_buf(0) <> 0 then
write(out, <:<10>convert error :  :>, 
case (mes_buf(0)) of (
<:cbufs exceeded:>, 
<:file not visible:>, 
<:file has login scope:>, 
<:temoprary resources insufficient:>, 
<:file in use:>)) ;  

conv:= mes_buf(0);  

end conv;  

\f



comment account sum           * page 10    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

integer procedure new_acc(z, i);  
________________________________

zone    z;  
integer i;  

begin

comment

Inrec of a new account record of 32 bytes from zone z.
The parameter i is the rest in current block.
The first two double words of
save's segment records are skiped.
In the normal case the length of the rest of 
current block is returned.
In case of error the value -1 is returned as the
value of the procedure.
The global variable mt is used to select bs or mt.
In case of mag-tape the global variable segm is
used in a check of the block-length.

;  

integer field type, length;  

comment TEST: :  
write(out, nl, 1, <:call af new-acc with blockrest =:>, 
<< d>, i);  

type  := 2;  
length:= 4;  

if mt then
begin
if i = 0 then
begin
  i:= in_rec_6(z, 0);  
  comment TEST: :  
  write(out, <:<10>inrec-zero, blockrest =:>, 
  << d>, i);  
  if i >= 8 then
  begin
    i:= in_rec_6(z, 8);  
    if z.type   <> 2
    or z.length > 8 + 4*128*segm then
    begin
      i := -1;  
      if z.type <> 2 then
      write(out, nl, 1, <:forkert record type_:>, z.type)
      else
      write(out, nl, 1, <:brug segm.:>, (z.length - 8)//512);  
    end;  
  end if i>=8;  
end i=0;  
new_acc:= if i < 32 then -1 else in_rec_6(z, 32);  
end mt
else new_acc:= in_rec_6(z, 8*4);  
end new_acc;  

\f



comment account sum           * page 11    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

comment declaration of global variabels;  
_       ________________________________

integer array dummy(1:1),  
_             ffile, lfile(1:10), 
_             selected_project(1:10);  

long    array selected_user(1:20, 1:3);  

real    array file_name(1:10, 1:2),  
_       sel_stat, sel_par1, sel_par2(1:4);  
integer i, date, clock, 
_       paper, page, users,  
_       jobs, logins, tab, 
_       j, to_day, pristal, 
_       first_day, last_day, days, 
_       last_in_day, first_in_day, priv_day, 
_       extrnl_regulation_index, price_base, 
_       no_rec, file_group, file_groups, 
_       segm, max_sel_user, max_sel_proj,  
_       file_no, last_file, first_file, 
_       block_rest, intern_no, max_no,  
_       h1, h2;  

real    plotfaktor, punchfaktor, cardfaktor, 
_       printerfaktor, readerfaktor, sizefaktor, 
_       tempdiscfaktor, stationsfaktor, 
_       jobpoint, pointgrænse1, pointgrænse2, 
_       loadpris, mountpris, loginpris, 
_       pointpris, 
_       pointrabat1, pointrabat2, 
_       operationspris, 
_       sidepris, liniepris, 
_       standardpapir, specialpapir,  
_       faktor, point, jobpris,  
_       selcpu, selpris;  

real    first, last, t, k, now, 
_      total, hours;  

long    prvers;  
boolean test, kbon, print, clear, left,  
_       sp, nl, ff, mt, bs, set_first_in_day,  
_       read_file_names, selection, 
_       selected, not_found, version;  

zone    zout (128*2, 2, stderror);  
boolean field mounts, loads, tempdrum, tempdisc, stations, size;  

integer field kind, project, param1, param2, cputime, papertype, 
_       deviceword1, param3, int_f;  

long    field time, user1, user2;  

array   field user;  

\f



comment account sum           * page 12    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

comment init of cost-variabels;  
_       _______________________

comment modif of special faktor;  
plotfaktor   := 0;  
punchfaktor  := 0.2;  
cardfaktor   := 0;  
readerfaktor := 0.5;  
printerfaktor:= 0.5;  
sizefaktor   := 0.01;  
tempdiscfaktor:= 0.0002;  
stationsfaktor:= 0.05;  

comment point;  
jobpoint     := 3;  
pointgrænse1 := 250;  
pointgrænse2 := 1000;  

comment price-list;  
loadpris   := 5;  
mountpris    := 10;  
loginpris    := 75;  
pointpris    := 0.2;  
pointrabat1  := 0.05;  
pointrabat2  := 0.05;  
operationspris:= 0.05;  
sidepris     := 0.10;  
liniepris    := 0.015;  
standardpapir:= 5;  

specialpapir := 15;  

begin
zone price (1, 1, std_error);  
integer array tail(1:10);  
integer i;  

open(price, 0, <:accoprice:>, 0);  

if monitor(42)look_up_entry:(price, i, tail) = 0 then
begin
comment the entry <:acco_price:> exist and is
assumed to hold the 'wage regulation index' to
be used. Base jan 1975 = 100 is assumed;  
price_base:= 2;  
extrnl_regulation_index:= tail(8);  
comment adjust to base jan 1971 = 100;  
pris_tal:= extrnl_regulation_index * 1.47;  
end
else
begin
price_base:= 1 <* jan 1971 = 100 *>;  
extrnl_regulation_index:= pris_tal:= 112 <* jan73 *>;  
end;  
end;  

\f



comment account sum           * page 13    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

comment init of field variabels;  

project    := 2;  
user       := 2;  
user1      := 6;  
user2      := user1+4;  
kind       := 12;  
time       := 16;  
param1     := 18;  
param2     := 20;  
param3     := 22;  
mounts     := 19;  
loads      := 20;  
cputime    := 22;  
papertype  := 22;  
tempdrum   := 23;  
tempdisc   := 24;  
stations   := 25;  
size       := 26;  
deviceword1:= 28;  

comment get date and time;  
systime(1, 0, now);  
to_day:= systime(2, now, now);  
now   := now/10000;  
prvers:=  2 04 80  10 49;  

comment init of fp-param;  
page  := 1;  
paper := 0;  
test  := false;  
kbon  := false;  
print := false;  
clear := false;  
users := 120;  
first_day:= 0;  
last_day := 999999;  

comment init of file name reading;  
file_group:= file_groups:= 1;  
file_name(file_group, 1):= real <:accou:> add 110 <* n *>;  
file_name(file_group, 2):= real <:tfile:>;  
ffile(file_group):= lfile(file_group):= 0;  
mt:= bs:= false;  
read_file_names:= true;  
segm:= 9;  

\f



comment account sum           * page 14    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

comment init of selection;  
max_sel_user:= 0;  
max_sel_proj:= 0;  
selection   := false;  

comment init of char variabels;  
sp := false add 32;  
nl    := false add 10;  
ff    := false add 12;  

first := 1.6'616;  
last  := -1.6'616;  

comment other init;  
tab   := 26;  
jobs  := 0;  
logins:= 0;  
no_rec:= 0;  
days  := 0;  
hours := 0;  
max_no:= 0;  
priv_day:= 0;  
first_in_day := 0;  
last_in_day  := 0;  
set_first_in_day := true;

\f



comment account sum           * page 15    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

begin
comment reading of fp-param;  
_       ____________________

integer param_no, i, s, sepa, 
_       length, s_save, name_no, 
_       bools, int, total;  

boolean b;  

real    array name, param(1:2);  

procedure alarm(text);  
string    text;  
begin
comment write the alarm-text on current
output;  

i:= 1;  
sepa:= s shift (-12);  
length:= s extract 12;  

write(out, <:<10>***:>, 
string(name(increase(i))), 
<:  :>, text);  
if s<> 0 then
begin
  write(out, 
  <:  (:>, <<d>, param_no, 
  <:, :>, case ((sepa+6)//2) of (
  <:'end of command list':>, 
  <:'end parenthesis':>, 
  <:'begin parenthesis':>, 
  <:'nl':>, 
  <:<60>s<62>:>, 
  <:=:>, 
  <:.:>));  
  i:= 1;  
  if length = 10 then
  write(out, string(param(increase(i))))
  else if length = 4 then
  write(out, <<d>, param(1));  
  write(out, <:):>);  
  param_no:= param_no + 1;  
end if s <> 0;  
end alarm;  

\f



comment account sum           * page 16    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

bools:=         4;  
int  := bools + 8;  
total:= int   + 2;  

system(2, i)program_name:(name);  
param(1):= param(2):= real <::>;  

s_save:= s:= system(4)read_fp_param:(1, param);  
if s shift (-12) = 6 then
begin
comment left side in call;  
integer array tail(1:12);  
left:= true;  
param_no:= 3;  
s_save:= system(4, 2, param);  
i:= 1;  
s_save:= system(4, 2, param);  
system(4, 0, param);  
open(zout, 4, string(param(increase(i))), 0);  
s:= monitor(42)lookup_entry:(zout, i, tail);  
tail(1):= 36;  
for i:= 2 step 1 until 12 do tail(i):= 0;  
if s<> 0 then
s:= monitor(40)create_entry:(zout, i, tail);  
if s<> 0 then
system(9)run_time_alarm:(s, <:<10>create  :>);  
end if s shift (-12) = 6
else
begin
comment no output;  
left:= false;  
s:= 0;  
alarm(<:no output:>);  
system(9)run_time_alarm:(0, <:<10>sorry   :>);  
end if no left side;  
s:= system(4, param_no, param);  
sepa:= s shift (-12);  
if s_save = 0 or (s<>0 and sepa<>4) then
begin
comment no input file;  
param_no:= param_no-1;  
s:= system(4, param_no, param);  
sepa:= s shift (-12);  
end if s_save or;  

\f



comment account sum           * page 17    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

for length:= s extract 12 while sepa >= 4 do
begin
comment read the next pair
of fp-param;  
if sepa = 8 then alarm(<:point:>)
else if sepa <> 4 then
system(9, param_no, <:<10>fperror1:>)
else if length = 4 then alarm(<:integer:>)
else if length <> 10 then
system(9, param_no, <:<10>fperror2:>)
else
begin
  comment name param with
  preceding sp read;  
  name_no:= 0;  

  if param(2) = real <::> then
  for i:= 1 step 1 until total do
  if param(1) = real(case i of (

  <* boolean *>
  <:test:>, <:print:>, <:kbon:>, 
  <:clear:>, 

  <* integer *>
  <:page:>, <:paper:>, <:users:>, 
  <:pris:>, <:first:>, <:last:>, 
  <:segm:>, <:proj:>, 

  <* text *>
  <:user:>, <:proj:>, 

  <::>)) then
  begin
    name_no:= i;  
    i:= total
  end if param(1) = real(case;  

\f



comment account sum           * page 18    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

  if name_no > 0 then
  begin
    comment name recognized;  
    param_no:= param_no + 1;  
    s       := system(4, param_no, param);  
    sepa    := s shift (-12);  
    length  := s extract 12;  

    if   name_no   = 12 <*proj*>
    and  length    = 10 <*<text>*>
    and  param(1)  = real <:all:>
    then name_no  := 14 <*proj.all*>;  

    if sepa <> 8 
    or (if      name_no   <= bools 
    _        then (length <> 10 
    _              or  (param(1) <> real <:yes:> and
    _                   param(1) <> real <:no:>))
    _   else if name_no   <= int
    _        then  length <>  4
    _   else if name_no   <= total
    _        then  length <> 10
    _   else false add system(9, param_no, <:fperror3:>)) 
    then alarm(<:value:>) else
    begin
      comment value type ok;  
      i:= param(1);  
      b:= param(1) = real <:yes:>;  

      case name_no of
      begin
        test  := b;  
        print := b;  
        kbon  := b;  
        clear := b;  

        page  := i;  
        paper := i;  
        users := i;  
        begin
          extrnl_regulation_index:=
          pristal:= i;  
          price_base:= 1 <* jan 71 = 100 *>;  
        end;  
        first_day:=iso_date(i);  
        last_day :=iso_date(i);  
        segm  := i;  

        begin
          comment selection of project;  
          max_sel_proj:= max_sel_proj + 1;  
          selection:= true;  
          selected_project(max_sel_proj):= i;  
        end fp-param proj;  

\f



comment account sum           * page 19    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

        begin
          comment selection of user;  
          max_sel_user:= max_sel_user + 1;  
          selection:= true;  
          for i:= 1, 2 do
          selected_user(max_sel_user, i):= long param(i);  
          s:= system(4, param_no + 1, param);  
          if  s shift (-12) extract 12 = 8 <* point *>
          and s             extract 12 = 4 <* integer *>
          then
          begin
            param_no:= param_no + 1;  
            selected_user(max_sel_user, 3):= param(1);  
          end
          else
          selected_user(max_sel_user, 3):= 0;  
        end fp-param user;  

        if param(1) = real <:all:>
        then 
        begin
          selection:= true;  
          max_sel_proj:= 9;  
          for i:= 1 step 1 until max_sel_proj do
          selected_project(i):= case i of (
          _    51,   52,   53, 3002, 6001, 
          _  6002, 6003, 7001, 8001);  
        end param(1) = <:all:>
        else
        param_no := param_no -1 <* provoke error message *>;  

      end case name_no of;  

      param_no:= param_no + 1;  
    end if value type ok

  end if name_no > 0 

\f



<*       account sum           * page 20    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 *>

  else
  begin
    comment unknown parametre name;  
    if read_file_names then
    begin
      comment read input file names;  
      for i:= 1, 2 do
      file_name(file_group, i):= param(i);  

      if param(1) shift (-32) extract 16
      =  <:mt:>   shift (-32) extract 16
      then
      begin
        mt:= true;  
        ffile(file_group):= 1;  
        lfile(file_group):= 8 388 607;  

        i:= 1;  
        for s:= system(4, param_no + 1, param)
        while s shift (-12) extract 12 = 8 <* point *>
        and   s             extract 12 = 4 <* integer *>
        and i <= 2 do
        begin
          case i of
          begin
            ffile(file_group):= param(1);  
            lfile(file_group):= param(1);  
          end case i of;  
          i:= i + 1;  
          param_no:= param_no + 1;  
        end for s;  
        if bs then alarm(<:mt after bs:>);  
      end mt
      else
      begin
        bs:= true;  
        ffile(file_group):= lfile(file_group):= 0;  
        comment include lookup on input file;  
        if mt then alarm(<:bs after mt:>);  
      end bs;  

      i:= 1;  
      comment TEST: :  
      write(out, nl, 1, if mt then <:mt :> else <:bs :>, 
      << dd>, file_group, ffile(file_group), lfile(file_group), 
      string file_name(file_group, increase(i)));  

      file_groups:= file_group:= file_group + 1;  

      for param_no:= param_no + 1
      while system(4, param_no, param) shift (-12)
      _     extract 12 = 8 <* point *>
      do alarm(<:suffix on file name:>);  
    end read_file_names
    else
    begin
      comment unknown param is not file name;  
      alarm(<:param:>);  
      for param_no:= param_no + 1 while
      (system(4, param_no, param) shift (-12)
      extract 12) = 8 do;  
    end unknown not file;  
  end if unknown;  
end name param read;  

\f



comment account sum           * page 21    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

s:= system(4, param_no, param);  
sepa:= s shift (-12);  
end for length:= s extract 12 ;  
end reading of fp-param;  

if mt and bs then
system(9)run_time_alarm:(0, <:<10>in-files:>);  

if file_groups > 1 then file_groups:= file_groups - 1;  

comment write date, time and version;  
write(z_out, <:<10>Account sum.<10>:>, false add 42, 12, 
<:<10><10>Version:>, 
<< dd dd dd>, prvers/10000, <:, :>, 
<<dd.dd>, (prvers mod 10000) / 100, 
<:, <10>kørt :>);  
write_date(z_out, to_day);  
write(z_out, <: kl.:>, << dd.dd>, now, <:.<10>:>);  

if selection then
begin

if fp_mode(11) then
write(z_out, nl, 2, 
<:Kontering for udvalgte brugere/projekter:>);  

if max_sel_user > 0 then
write(z_out, <:<10><10>Bruger::>);  

for i:= 1 step 1 until max_sel_user do
begin
j:= 1;  
j:= write(z_out, nl, 1, 
string selected_user(i, increase(j)));  
if selected_user(i, 3) = 0 
then write(z_out, sp, 6 - j, <:alle projekter:>)  
else write(z_out, sp, 12 - j, 
_          <<  dd dddd>, selected_user(i, 3));  
end for i;  

if max_sel_proj > 0 then
write(z_out, <:<10><10>Projekt::>);  

for i:= 1 step 1 until max_sel_proj do
write(z_out, nl, 1, <<dd dddd>, selected_project(i));  

write(z_out, nl, 2);  

end selection;  

\f



comment account sum           * page 22    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

if users>0 then
begin
comment array decl block;  
integer array project_cat,  
_             mount, load(1:users);  
integer array stat, 
_             par1, par2 (1:users, 1:4),  
_             device     (1:users, 18:22);  

real    array user_cat   (1:users, 1:2),  
_             cpu, pris  (1:users);  

long    array name(1:2);  
long array field  name_f;  

zone    z(2 * (if mt then (2 + 128*segm) else 128), 
_         2, std_error);  

\f



comment account sum           * page 23    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

for file_group:= 1 step 1 until file_groups do
begin

mt:= file_name(file_group, 1) shift (-32) extract 16
=    <:mt:>                   shift (-32) extract 16;  

first_file:= ffile(file_group);  
last_file := lfile(file_group);  

i:= 1;  
comment TEST: :  
write(out, nl, 1, <:open :>, 
if mt then <:mt:> else <:bs:>, 
<< dd>, file_group, ffile(file_group), lfile(file_group), 
string file_name(file_group, increase(i)));  

i:= 1;  
open(z, if mt then 18 else 4, 
_       string file_name(file_group, increase(i)), 0);  

for   file_no := first_file, file_no + 1
while file_no <= last_file
and   version 
do
begin

  set_position(z, file_no, 0);  
  version:= true;  

  if mt then
  begin
    block_rest:= in_rec_6(z, 13*4);  

    if block_rest <> 48 then
    system(9, block_rest, <:<10>mtdumpl1:>);  

    name_f:=0;  
if fp_mode(10) then
    write(out, nl, 1, z.name_f);  

    for int_f:= 6 step 2 until 12 do
    for j:= -16 step 8 until 0 do
    if   z.int_f shift j extract 8 = 32 <* sp *>
    then z.int_f:= z.int_f shift (j-8) shift (-j+8)
    add           (z.int_f extract (-j));  

    i:= 1;  
    comment TEST: :
    write(out, 
    string pump(z), nl, 1,
    string file_name(file_group, increase(i)), nl, 1);  

    version:= z(5) = real <:vers.:> add 32  
    and       z(2) = file_name(file_group, 1)
    and       z(3) = file_name(file_group, 2);  

    comment TEST: :  
    write(out, <:Dump label :>, 
    if version then <:version:> else <:empty:>);  
  end mt;  

\f



comment account sum           * page 24    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

  if version then
  begin
    if mt then
    begin
      block_rest:= in_rec_6(z, block_rest)
      <* skip rest of dump-lable *>;  
      if block_rest <> 0 then
      system(9, block_rest, <:<10>mtdumpl2:>);  
      if in_rec_6(z, 4*25) <* entry record *> <> 0   
      or z(1) shift (-24) extract 24 <> 1
      or z(3) <> real <:accou:> add 110
      or z(4) <> real <:tfile:>  
      then block_rest:= -1 <* skip file *>;  

      comment TEST: :  
      write(out, nl, 1, <:file name :>, 
      if block_rest <> -1 then <:accountfile:> else <:error:>);  
      if -, version then block_rest:= -1;  
    end mt;  

    for block_rest:= new_acc(z, block_rest)
    while (if block_rest < 0 then false else z.kind <> 99) do
    begin

      k:= z.time //10000;  
      date:= systime(2)convert_time:(k, t);  
      clock:= t;  
      date:= iso_date(date);  

      selected:= first_day <= date and date <= last_day;  

      if selected and selection then
      begin
        selected:= false;  
        for i:= 1 step 1 until max_sel_user do
        if  z.user(1) = real selected_user(i, 1)
        and z.user(2) = real selected_user(i, 2)
        and (selected_user(i, 3) = 0 or
        _    selected_user(i, 3) = z.project)
        then
        begin
          selected:= true;  
          i:= max_sel_user;  
        end for i;  
        if -, selected then
        begin
          for i:= 1 step 1 until max_sel_proj do
          if z.project = selected_project(i) then
          begin
            selected:= true;  
            i:= max_sel_proj;  
          end for i;  
        end -, selected;  
      end selected and selection;  

\f



comment account sum           * page 25    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

      if selected then
      begin
        comment account record in day-interval  
        and selected;  

        no_rec:= no_rec + 1;  

        if priv_day <> date then
        begin
          comment new day;  
          priv_day:= date;  
          days:= days+1;  
          hours:= hours + (last_in_day - first_in_day)/60;  
          set_first_in_day:= true;  
        end new day;  

        last_in_day:= clock//10000*60 + clock mod 10000 // 100;  
if set_first_in_day then
begin
first_in_day     := last_in_day;
set_first_in_day := false;
end;

        if k < first then first:= k;  
        if k > last  then last := k;  

        if kbon then
        begin
          comment write account file log;  
          write(z_out, nl, 2);  
          date:=systime(2, k, t);  clock:=t;  
          i:= 1;  
          if z.kind>3 then
          write(z_out, sp, 9-write(z_out, <<d>, z.kind))
          else
          write(z_out, case z.kind of (<:job      :>, 
          <:logout   :>, <:print    :>));  
          write(z_out, sp, 
          16-write(z_out, string z.user(increase(i))), 
          <<dddddd>, z.project, <:   :>, 
          <<dddddd>, z.project, <:___:>, 
          <<_dd_dd_dd>, date, clock, 
          <<_-dddddd>, z.param1);  
          if z.kind=1 then 
          begin
            write(z_out, << -ddddddd>, entier(z.cputime*0.8192), 
            (z.size extract 12)*512, <:<10>:>, 
            sp, 7, (z.tempdrum extract 12)*4, 
            (z.tempdisc extract 12)*8, z.loads extract 12, 
            z.stations extract 12, z.mounts extract 12, <:    :>);  
            if z.deviceword1 shift (-22) extract 1 = 1 then
            write(z_out, <:  read:>);  
            if z.deviceword1 shift (-21) extract 1 = 1 then
            write(z_out, <:  print:>);  
            if z.deviceword1 shift (-20) extract 1 = 1 then
            write(z_out, <:  card:>);  
            if z.deviceword1 shift (-19) extract 1 = 1 then
            write(z_out, <:  punch:>);  
            if z.deviceword1 shift (-18) extract 1 = 1 then
            write(z_out, <:  plot:>);  
          end else
          begin
            write(z_out, << -ddddddd>, z.param2);  
            if z.kind=3 then
            write(z_out, << -ddddddd>, z.papertype);  
          end;  
        end if kbon;  

\f



comment account sum           * page 26    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

        comment make sums;  

        not_found:= true;  
        intern_no:= 0;  

        for intern_no:= intern_no+1 while intern_no<=max_no and not_found do
        not_found:= (project_cat(intern_no)    <> z.project)
        or          (user_cat   (intern_no, 1) <> z.user(1))
        or          (user_cat   (intern_no, 2) <> z.user(2));  

        if z.kind>3 then z.kind:= 4;  

        if not_found then
        begin
          if test then write(z_out, <:<10>New:>, << ddd>, intern_no);  
          max_no:= intern_no;  
          if max_no>users then
          system(9)run_time_alarm:(max_no, <:<10>users   :>);  

          for i:= 1 step 1 until 4 do
          begin
            stat(intern_no, i):= 0;  
            par1(intern_no, i):= 0;  
            par2(intern_no, i):= 0;  
          end for i:= 1;  

          for i:= 18 step 1 until 22 do
          device(intern_no, i):= 0;  

          mount (intern_no):= 0;  
          load  (intern_no):= 0;  
          cpu   (intern_no):= 0;  
          pris  (intern_no):= 0;  

          project_cat(intern_no):= z.project;  
          for i:= 1, 2 do
          user_cat(intern_no, i):= z.user(i);  

        end if not_found  
        else
        begin
          intern_no:= intern_no-1;  
          if test then
          write(z_out, <:<10>Intern:>, << ddd>, intern_no);  
        end if found;  

        if test then
        begin
          i:= 1;  
          write(z_out, << ddd ddd>, 
          <:<10>:>, string(user_cat(intern_no, increase(i))), 
          project_cat(intern_no), 
          <:<10>:>, stat(intern_no, z.kind), 
          <:<10>:>, par1(intern_no, z.kind), z.param1, 
          <:<10>:>, par2(intern_no, z.kind), z.param2,  
          <:<10>:>, << ddd.ddd>, pris(intern_no));  
        end if test;  

\f



comment account sum           * page 27    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

        stat(intern_no, z.kind):= stat(intern_no, z.kind) + 1;  

        case z.kind of
        begin

          begin
            comment kind 1, finis;  
            jobpris:= (z.loads  extract 12) * loadpris +
            _         (z.mounts extract 12) * mountpris;  
            faktor := 1;  

            cpu  (intern_no):= cpu  (intern_no) + z.cputime*0.8192;  
            load (intern_no):= load (intern_no) + z.loads  extract 12;  
            mount(intern_no):= mount(intern_no) + z.mounts extract 12;  

            jobs := jobs + 1;  

            if (z.size extract 12) > 30 then
            faktor:= faktor + ((z.size extract 12) - 30)*sizefaktor;  

            if (z.tempdisc extract 12)/36 > 1000 then
            faktor:= faktor + ((z.tempdisc extract 12)/36-1000)*
            _                 tempdiscfaktor;  

            faktor:= faktor + (z.stations extract 12)*stationsfaktor;  

            for i:= 18 step 1 until 22 do
            if z.deviceword1 shift (-i) extract 1 = 1 then
            begin
              device(intern_no, i):= device(intern_no, i) + 1;  
              faktor:= faktor + (case (i-17) of 
              (plotfaktor, punchfaktor, cardfaktor,   
              printerfaktor, readerfaktor));  
            end if z.dewiceword1;  

            point  := (jobpoint+z.cputime*0.8192*2)*faktor;  
            jobpris:=  jobpris + point*pointpris;  

            if test then
            write(z_out, nl, 1, <<dddd.dd>, 
            <:faktor :>, faktor, <:, point :>, point, 
            <:, jobpris :>, jobpris);  

            if point > pointgrænse1 then
            jobpris:= jobpris - (point-pointgrænse1)*pointrabat1;  

            if point > pointgrænse2 then
            jobpris:= jobpris - (point-pointgrænse2)*pointrabat2;  

            if test then 
            write(z_out, << dddd.dd>, jobpris);  

            pris(intern_no):= pris(intern_no)+jobpris;  

          end case 1;  

\f



comment account sum           * page 28    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

          begin
            comment kind 2, login;  
            logins:= logins+1;  
            pris(intern_no):= pris(intern_no) +
            _                 z.param1/60 * loginpris +
            _                 z.param2 * operationspris;  
          end case 2, login;  

          begin
            comment kind 3, print;  
            if z.param1//60 > z.param2 then
            z.param2:= z.param1//60;  
            pris(intern_no):= pris(intern_no) +
            _                 (if z.param3 = 0 
            _                  then standardpapir
            _                  else specialpapir) +
            _                 z.param1 * liniepris +
            _                 z.param2 * sidepris;  
          end case 3, print;  

          ;  comment case 4, other: empty;  

        end case z.kind of;  

        if z.kind>1 then
        begin
          par1(intern_no, z.kind):= par1(intern_no, z.kind) + z.param1;  
          par2(intern_no, z.kind):= par2(intern_no, z.kind) + z.param2;  
          if test then write(z_out, nl, 1, <:ny pris:>, pris(intern_no));  
        end if kind > 1;  
      end account-record in day interval  
      and selected;  

    end for block_rest:= new_acc;  
  end if version;  
end for file no;  

close(z, true);  

if clear then
begin
  comment remove file;  
  i := monitor(48)remove_entry:(z, 1, dummy);  
  if i <> 0 then
  write(out, <:<10>remove entry:>, i);  
end if clear;  

end for file_group;  

\f



comment account sum           * page 29    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

comment open-time from the day not completed;  
hours:= hours + (last_in_day - first_in_day)/60;  

comment write front page;  
write(z_out, <:<10>Fra  :>);  
write_date(z_out, systime(2, first, first));  
write(z_out, <: kl.:>, << dd.dd>, first/10000);  
write(z_out, <:<10>til  :>);  
write_date(z_out, systime(2, last, last));  
write(z_out, <: kl.:>, << dd.dd>, last/10000, <:.<10>:>);  

for i:= 0 step 1 until max_sel_proj do
begin
for j:= 1 step 1 until 4 do
sel_stat(j):= sel_par1(j):= sel_par2(j):= 0;  
sel_cpu:= sel_pris:= 0;  

for intern_no:= 1 step 1 until max_no do
if (if i = 0 then true
_   else selected_project(i) = project_cat(intern_no) )
then
begin

  for j:= 1 step 1 until 4 do
  begin
    sel_stat(j):= sel_stat(j) + stat(intern_no, j);  
    sel_par1(j):= sel_par1(j) + par1(intern_no, j);  
    sel_par2(j):= sel_par2(j) + par2(intern_no, j);  
  end for j;  

  if i = 0 <* all *> then
  pris(intern_no):= pris(intern_no)/112*pristal;  

  sel_cpu := sel_cpu  + cpu (intern_no);  
  sel_pris:= sel_pris + pris(intern_no);  

end for intern_no;  

if i = 0 then 
begin

  write(z_out, <:<10>:>, <<dddddd>, 
  <:<10>:>, no_rec, <: records, :>, 
  <:<10>:>,   days, <: dag:>, 
  if days  = 1 then <:, :> else <:e, :>, 
  <:<10>:>,  hours, <: time:>, 
  if hours = 1 then <:, :> else <:r, :>, 
  <:<10>:>,   jobs, <: jobs,   :>);  

\f



comment account sum           * page 30    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

  if entier ( sel_cpu/(60*60) ) > 10 then  
  write(z_out, 
  <<dddddd>, sel_cpu/(60*60), <: cpu timer,   :>)
  else
  write(z_out, 
  <<ddd.dd>, sel_cpu/60, <: cpu minutter,:>);  
  write(z_out, sp, 2, 
  <<ddd.dd>, sel_cpu/(60*60)/hours*100, <: <37>:>, 
  <<dddddd>, 
  <:<10>:>, logins, <: logins, :>, 
  _ sel_par1(2)/60, <: login timer, :>, sp, 2, 
  <<ddd.dd>, sel_par1(2)/60/hours*100,  <: <37>:>, 
  <<dddddd>, 
  <:<10>:>, max_no, <: users.:>);  

  j:= write(z_out, nl, 3, <:Total maskin-pnt.:>,  
  << d>, entier(sel_pris));  
  write(z_out, nl, 1, sp, 12, 
  false add 61, j-15);  
if fp_mode(11) then
  write(z_out, <:<10>Pristal:>,   
  extrnl_regulation_index, 
  case price_base of
  (<: (jan 1971 = 100) :>, <: (jan 1975 = 100) :>));  

end i = 0
else
begin
  comment write project table;  

  if i = 1 then
  write(z_out, nl, 2, 
  sp, 16, <:jobs:>, 
  sp, 19, <:logins:>, 
  nl,  1, <:project:>, 
  sp,  4, <:antal   cpu tid:>, 
  sp,  4, <:antal     tid    opera-:>, 
  sp,  4, <:maskin-pnt.<10>:>,
  sp, 20, <:t   m:>, 
  sp, 15, <:t  m   tioner<10>:>);  

  h1:= entier(sel_cpu/(60*60));  
  h2:= entier(sel_par1(2)/60);  
  if sel_stat(1) > 0 or sel_stat(2) > 0 then
  write(z_out, 
  nl,  1, <<dd dddd>, selected_project(i), 
  sp,  4, <<ddddd>,   sel_stat(1), 
  sp,  2, <<ddd>,     h1, 
  sp,  1, <<zd.dd>,   sel_cpu/60 - h1*60, 
  sp,  3, <<ddddd>,   sel_stat(2),  
  sp,  2, <<dddd>,    h2, 
  sp,  1, <<zd>,      sel_par1(2) - h2*60, 
  sp,  2, <<ddddddd>, sel_par2(2), 
  sp,  4, <<dd ddd ddd>, sel_pris);  

end proj tab;  
end for i;  

\f



comment account sum           * page 31    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

comment write user stat;  
_       _________________

for intern_no:= 1 step 1 until max_no do
begin
comment write next user;  
i:= 1;  
if (intern_no mod 8) = 1 then
begin
  write(z_out, <:<12>account sum:>, 
  sp, 20, 
  <:-:>, <<d>, page, <:-:>, 
  sp, 14, <<dd dd dd>, to_day, 
  <:, :>, <<dd.dd>, now, nl, 3, 
  <:User:>, sp, tab-14, 
  <:Project:>, sp, 3, 
  <:Type<10>:>);  
  page:= page+1;  
end if (intern_no mod;  

write(z_out, sp, 
15-write(z_out, 
<:<10>:>, string (user_cat(intern_no, increase(i)))), 
<<  dd dddd>, project_cat(intern_no), sp, 3);  

for i:= 1 step 1 until 4 do
if stat(intern_no, i) <> 0 then
begin
  write(z_out, case i of
  (<:job    :>, <:logout :>, <:print  :>, <:other  :>), 
  << ddd ddd>, stat(intern_no, i));  
  if i=1 then
  write(z_out, <<ddd ddd ddd>, cpu(intern_no))
  else
  write(z_out, 
  <<ddd ddd ddd>, par1(intern_no, i), 
  par2(intern_no, i));  
  write(z_out, <:<10>:>, sp, tab);  
end for i;  

if load(intern_no) <> 0 then
write(z_out, <:load   :>, 
<< ddd ddd>, load(intern_no), 
nl, 1, sp, tab);  

if mount(intern_no) <> 0 then
write(z_out, <:mount  :>, 
<< ddd ddd>, mount(intern_no), 
nl, 1, sp, tab);  

for j:= 18 step 1 until 22 do
if device(intern_no, j) <> 0 then
write(z_out, case (j-17) of
(<:plot   :>, <:punch  :>, <:card   :>, 
<:printer:>, <:reader :>), 
<< ddd ddd>, device(intern_no, j), 
nl, 1, sp, tab);  

write(z_out, <:m-pt:>, << dd ddd ddd>, pris(intern_no), 
nl, 1, sp, tab);  

end for intern_no;  

\f



comment account sum           * page 32    2 04 80, 10.49
0 1 2 3 4 5 6 7 8 9 ;  

if clear then
begin
comment remove accountfile;  
i:= monitor(48)remove_entry:(z, 1, dummy);  
if i <> 0 then
write(out, <:<10>remove entry:>, i);  
end if clear;  

end array block;  

comment close and print;  
write(z_out, <:<10><10>end account sum <10><25><25>:>);  
close(z_out, true);  
if print then conv(z_out, paper);  

end;  

\f



;       account sum           * page 33    2 04 80, 10.49;  

;  startmark for copy !

;  accountjob
;  **********

job account 51 stations 1 mounts 3 time 10 00 output 200000

o txtxtxtx
lookup accountdump
if ok.no
(accountdump=set 1 disc
scope project accountdump)

lookup accountlog
if ok.no
(accountlog=set 1 disc
scope project accountlog)
o c

o accountdump

head

lookup accounttape
mount accounttape
ring accounttape
save accounttape.last.label.account segm.4 accountfile
if ok.yes
mode 0.yes

load accounttape.last survey.yes
o c
head
mode list.yes

head 

accountlog=accosum clear.no  kbon.no print.yes paper.2 
if 0.yes
clear user accountfile
if 0.no
(scope project accountfile
opcomm accountfile ej saved)

convert accountdump 2
end
finis

;  startmark for copy !

▶EOF◀