So "print directory" or (print something about the) "parent directory" seem more likely to me.
But it sounds like the other commenters have figured out that it's "pack directory".
open ..
loop
read a directory entry into tbuf
if we read 0 bytes (eof presumably), break loop
if tbuf[0] == '\0', go back to start of loop
append tbuf to dir
done
close ..
reopen .. with creat
write the stuff we built up into dir to ..
close ..
exit int dst /*8*/, src /*9*/, c1, df, tbuf[8], dir[BIG];
char dotdot[] = ".. ";
df = open(dotdot, O_RDONLY);
dst = dir - 1;
while (read(df, tbuf, 8) != 0) {
if (tbuf[0] != 0) {
c1 = -8;
src = tbuf - 1;
do {
*++dst = *++src;
} while (++c1 != 0);
}
}
close(df);
df = creat(dotdot);
write(df, dir, dst - dir + 1);
close(df);
exit();
That is, copy any directory entry with a non-zero inode into dir[], and then write that back. Pack Directory.According to https://wiki.tuhs.org/doku.php?id=systems:pdp7_unix ‘..’ was the name of the current directory (i.e. what is now ‘.’), so this operated on the current directory.
"Directory entries may be empty, indicated by an inode number of 0".
So if the pseudo-code is correct, this may be an utility to squeeze out those empty entries.
As for the sys write: my current hypothesis is that .. there is a placeholder for an argument which is written to by the preceding dac .+4. ('"If a program can't rewrite its own code", he asked, "what good is it?"'). But I can't make sense of what it's actually putting there - I'd guess length, but it looks like ~(dir - 2) + 8.
That took me a while. The ‘8’ in ‘tad 8' is the contents of memory location 8, i.e. the destination pointer in the memory copy, so it's ~(dir - 2) + dst. And since -x = ~x + 1 (there being no negation instruction), that works out to the length, dst - dir + 1.
It looks like the code opens dotdot, and then scans through it for something (match for dir?).
The creat call might mean "open for writing", and possibly the flags mean append. It appears dir is appended to the dotdot directory file.
So maybe, add this "dir" entry to dotdot if it isn't there already?
I can't guess what initializes dir; maybe it somehow comes as an argument from the command line or whatever.
c1 = -8;
*9 = tbuf - 1;
do {
*(++(*8)) = *(++(*9));
} while(++c1 != 0);
goto 1b; // b for backwards?
It seems that memory locations 8-15 are auto-indexing[0], so the lac/dac i increments the pointed-at location before use, and isz is "increment and skip next instruction if zero".[0] PDP7 manual, big PDF: http://bitsavers.trailing-edge.com/pdf/dec/pdp7/F-75P_PDP7pr...
I think ‘dotdot’ is what is called ‘dd’ there (the corresponding symbol in ls is still named ‘dd'). I don't think the concept of a parent directory existed yet. Maybe ‘pd’ is something like ‘prepare directory’, constructing the dd/dotdot entry.
I think this is on the right track - it looks like the write call is to the newly created .., with df being used to hold the file descriptor.
I am leaning toward Pete_D's ‘pack directory’ idea.
¹ https://github.com/DoctorWkt/pdp7-unix/blob/e94417092a2980e7...
> Unidentified program.
> Might “pd” stand for “previous directory”?
I know approximately zero PDP-7 assembly, but this looks like it might be “print directory”, equivalent to pwd today? It seems to open its parent “dotdot” directory and write it out.