include "managr:newadmin.inc"
begin ; ! Convert ADMIN database from human-readable to machine-readable
! RWT February 1990
! The human-readable form is not actually intended for human consumption,
! for this purpose the SHOW or LIST commands in the ADMIN program should
! be used. Instead it is a debugging and rescue aid, and can be used to
! do nasty things the ADMIN program has not yet been taught, such as
! clearing out dead groups and flags.
! The human-readable form contains directory information one per line,
! and nothing else. Each entry looks like this:
! ID Group{+Flag}* Date Prenames Surname
! That is to say, ID is followed by a space and then the name of the
! group to which that directory belongs, followed by any number of flags,
! each preceded by a plus sign. The flags indicate membership of any
! number of classes (such as trusted, lasered, and the set of filestores
! on which the directory exists). Each entry must belong to exactly one
! group, but may belong to any number of classes (even none). The creation
! date, in standard dd/mm/yy form, follows this after a space. There follows
! another space and then the name. The name may contain any number of
! spaces, and whatever follows the last space is taken to be the surname.
! For non-person directories, the prenames should describe the purpose of
! the directory, and the surname should be the ID (not name) of the person
! responsible for its contents.
record (entry fm)name list==nil,pred,this
string (255)line,l,r,x
integer number
string (255)in="admin.dbh",out="admin.db"
on 9 start
selectoutput(1)
write admin file(list)
stop
finish
defineparam("Human readable input",in,0)
defineparam("Machine readable output",out,pamnewgroup)
processparameters(cliparam)
openinput(1,in); selectinput(1)
openoutput(1,out); selectoutput(0)
cycle
this == new(this); this = 0
readline(line)
unless line -> l.(" ").r and length(l)<7 start
no: printstring("Faulty record ignored: "); printline(line)
dispose(this)
continue
finish
toupper(l); this_id = l
->no unless r -> l.(" ").r and l#""
x = l and l = "" unless l -> x.("+").l; l = l."+"
number = 0
admingrouplist == lookup and add(admingrouplist,x,number) unless x=""
this_group = number
while l -> x.("+").l cycle
unless x="" start
adminflaglist == lookup and add(adminflaglist,x,number)
this_flags = this_flags!1<<(number-1)
finish
repeat
->no unless r -> l.(" ").r
this_created = packdate(l)
->no if this_created=0
->no unless r -> l.(" ").r and r#""
l = l." ".x while r -> x.(" ").r
this_sur == heapstring(r)
this_pre == heapstring(l)
this_next == nil
if list==nil then list == this else pred_next == this; pred == this
repeat
end