4 ms·
Unix-jun72: Restoration of 1st Edition UNIX kernel sources
- tedunangst 17y agoWow, for an operating system written in C, that's a lot of assembly! (Apparently, unix was actually re written in C a little later.) Interesting to see the implementation of something like printf though: http://code.google.com/p/unix-jun72/source/browse/trunk/src/lib/printf.c http://code.google.com/p/unix-jun72/source/browse/trunk/src/...
- rjurney 17y agoOooh look at the gotos
- dgrant 17y agoWhy'd they use the goto instead of a while/for?
- philwelch 17y agoSeems like they're trying to accommodate the default "fallthrough" behavior of the switch without using break, either because break hadn't been invented or because they explicitly wanted to bypass the code below the switch block. EDIT: On further inspection, the code below the switch block is meant to behave like a "default" block. I bet this is before they invented "default".
- philwelch 17y agoInteresting. They were explicitly addressing the stack to iterate through arguments, yet the prototype lists nine arguments in addition to the fmt string. Is that function actually variadic? If so, why explicitly list x1 through x9 as arguments?
- enf 17y agoI think what's going on here is that the local variables in a function are directly adjacent in memory to the arguments, so if it wasn't declared to have that many arguments, the local variables would start at the same location in memory as the first undeclared argument and the undeclared arguments would get clobbered.
- philwelch 17y agoAs it is now, you push all your function arguments to the stack before you push your locals. If you call printf(a1, a2, ... , an), it pushes n arguments, then the instruction pointer, then your locals. No clobbering necessary. Maybe 1972-era C pushed arguments to the stack according to the signature defined in the function definition rather than the function call? (i.e. printf would have 10 pushes no matter how many arguments you actually passed to it). If it pushed according to the function signature, you'd waste memory and have a hard limit to how many arguments you could pass. And you'd waste push instructions. So I don't know why it's written the way it is, but corrupting your locals doesn't seem like a likely explanation. Maybe they're trying to mollify the compiler?
- abecedarius 17y ago1970s C did not have prototypes.
- philwelch 17y agoI meant the function signature as defined in the function definition. Hmm I'll fix that.
- abecedarius 17y agoI think the x2,...x9 were declared just as "documentation". Really early C didn't have any types that would get passed as anything but a single word on the stack, IIRC. (as I was going to add before getting noprocrast-blocked)
- makmanalp 17y ago>auto adx[], x, c; I see several curious things here: - They use auto :) - They don't declare type, since (I think) things are implicitly int. - They prefer using adx[] instead of *adx, I think this goes with the auto.
- vinutheraj 17y ago"The software retains the copyright of the original authors and is currently licensed under the Caldera ancient UNIX license." - as mentioned in the homepage, yet the code license information on the right side says GNU General Public License v2. Is this because google only allows a limited number of licenses on code.google.com ?
- cmelbye 17y agoThat's probably an accurate assumption. Happens a lot on Google Code hosting projects due to a lack of available licenses to choose from.
- deleted 17y ago[deleted]