// A L T O E X E C U T I V E // Internal Exec Commands (2) - Rename.bcpl // Copyright Xerox Corporation 1979 // This program is loaded with the command // processor and implements some of the various internal // functions of the command processor. // E. McCreight // last edited by R. Johnsson, September 21, 1979 12:11 PM get "sysdefs.d" get "altofilesys.d" get "disks.d" get "streams.d" get "time.d" get "COMSTRUCT.bcpl" external [ Rename RenameFile LogIn QUERY ] let QUERY(ISTREAM, DSTREAM) be [ static [ FNCount ] let CiteName(MYDE, Y) = valof [ FNCount = FNCount+1 resultis PRETTYWRITE(lv (MYDE>>MYDE.S)) ] let LQ = vec size QS/16 let FNQ = vec size QS/16 INITQ(LQ) INITQ(FNQ) STREAMTOQR(ISTREAM, LQ) XFERQWHILE(GETQR, PUTQR, LQ, PUTQF, FNQ, IsCommandChar) FNCount = 0 INITDIRBLK(SORTED) MAPDIR(FNQ, CiteName, true) unless FNCount gr 0 do WRITE("No files.") WRITE($*N) EMPTYOUTQ(LQ) EMPTYOUTQ(FNQ) ] and ReadDN(Q) = valof [ let D = 0 if ISEMPTYQ(Q) then resultis D let TermChar = GETQF(Q) until (TermChar ge $0 & TermChar le $9) do [ if ISEMPTYQ(Q) then resultis D TermChar = GETQF(Q) ] while (TermChar ge $0 & TermChar le $9) do [ D = 10*D+TermChar-$0 if ISEMPTYQ(Q) then resultis D TermChar = GETQF(Q) ] PUTQF(Q, TermChar) resultis D ] and LogIn(IStream, DStream) be [ static [ IDStream PSB ] let SToOs(S, OSString) be [ let MaxChars = 2*(OSString!(-1))-1 if S>>STRING.length gr MaxChars then S>>STRING.length = MaxChars CONCATENATE(OSString, S) ] let PutAStar(S, char) be [ Puts(IDStream, (ISFILECHAR(char)? $**, char)) SetupFstream(S, PSB, 0, 0) ] let S = vec 200 GetStringFromKbd(S, UserName, "User Name: ", false) SToOs(S, UserName) let PStream = vec lFS let PSBuf = vec 2 PSB = PSBuf InitializeFstream(PStream, charItem, PutAStar) SetupFstream(PStream, PSB, 0, 0) IDStream = DStream let UPS = vec 200 WRITE("*NPassword: ") ReadString(UPS, "*N ", keys, PStream) if UPS!0 gr 0 then [ EvalParam(UPS, $P, -1, S) SToOs(S, UserPassword) ] WRITE($*N) ] and GetStringFromKbd(String, Preload, Prompt, RemoveBlanks) be [ let TQ = vec size QS/16 INITQ(TQ) GetQFromKbd(TQ, Preload, Prompt, RemoveBlanks) QFTOSTRING(TQ, String) EMPTYOUTQ(TQ) ] and GetQFromKbd(TQ, Preload, Prompt, RemoveBlanks) be [ let FQ = vec size QS/16 INITQ(FQ) STRINGTOQR(Preload, FQ) EMPTYOUTQ(TQ) unless EDITCHARS(TQ, FQ, Prompt, true, "*N ", true) do [ WRITE($*N) return ] WRITE($*N) GETQR(TQ) // Remove carriage return if RemoveBlanks then until ISEMPTYQ(TQ) do [ let C = GETQR(TQ) if C ne $*S then [ PUTQR(TQ, C) break ] ] ] and Rename(IStream, DStream) be [ let FN = vec 200 let Sw = vec 100 SetupReadParam(FN, 0, IStream, Sw) let OldFN = vec 129 let NewFN = vec 129 GetTwoFileNames(OldFN, NewFN) let didit = false test EqualStrings(OldFN,NewFN) ifso [ let fn = vec size LD.name/16; Zero(fn,size LD.name/16) let dirname = vec 129 SplitFileName(NewFN, dirname, fn) let dirS = MyOpenFile( (dirname>>STRING.length eq 0? "SysDir", dirname), ksTypeReadWrite, wordItem, verLatest) if dirS ne 0 then [ let pos = FindFdEntry(dirS,fn) if pos ne -1 then [ pos = pos + lDV let posH = pos ls 0 ? 1, 0 SetFilePos(dirS,posH,pos lshift 1) for i = 0 to (fn>>STRING.length-1)/2 do Puts(dirS,fn!i) didit = true let file = MyOpenFile(OldFN, ksTypeReadOnly) if file ne 0 then [ let buf = vec 256 ReadLeaderPage(file,buf) MoveBlock(lv buf>>LD.name,fn,size LD.name/16) WriteLeaderPage(file,buf) Closes(file) ] ] Closes(dirS) ] ] ifnot [ didit = RenameFile(OldFN,NewFN,verLatest,@lvSysErr,CZ) ] WRITE(FORMATN("*300<S>*301 <S>renamed to *300<S>*301*n", OldFN, didit? "", "could not be ", NewFN)) if didit then WIPEDIRBLK() ] and EqualStrings(S1, S2) = valof [ let lS1 = S1>>STRING.length let lS2 = S2>>STRING.length if lS1 ne lS2 then resultis false for i=1 to lS1 do [ let c1 = Capitalize(S1>>STRING.char↑i) let c2 = Capitalize(S2>>STRING.char↑i) if c1 ne c2 then resultis false ] resultis true ] and CopyString(ToString, FromString) be [ MoveBlock(ToString, FromString, (FromString>>STRING.length rshift 1)+1) ] and GetTwoFileNames(FromName, ToName) be [ GetName(FromName, "from: ") GetName(ToName, "to: ") if ToName!0 eq "←"!0 then [ CopyString(ToName, FromName) GetName(FromName, "from: ") ] ] and GetName(Name, Prompt) be [ Name>>STRING.length = 0 ReadParam($P, -1, Name) if Name>>STRING.length eq 0 then GetStringFromKbd(Name, "", Prompt, true) ]