lc: List files in categories (and columns) – from Coherent Unix clone
13 comments
·January 10, 2025jll29
christophilus
I think it’s fine. The code is clear enough and easy enough to maintain. There’s nothing wrong with a good top-down flow through a long function in my opinion. Especially when you’re dealing with a small, focused tool like this.
hk__2
If the author sees this: please copy/paste the manual in your README instead of including an image with text on it. You’ll help blind people and search engines.
lewiscollard
Not author, but lc was posted on HN some years ago and at the time I was like "oh, I should really port over the original man page some day". After which I half did it, then forgot about it. I'm commenting here to commit myself to actually finishing that!
oguz-ismail
There's a man page here <https://github.com/gspu/Coherent/blob/a00b86ea22c66625cf1838...>
lewiscollard
There's also one in this PR now :) Saying I'm going to do something is more likely to get it done than just thinking about it! https://github.com/gdm85/lc/pull/1/files
But, yes, that is the manual page I converted from (actually I grabbed it from the tarballs linked in the README - should be the same thing). My entire experience of troff would fit on the inside of a Rizla packet with some space to spare, but looking at the original I think it was using some special macro package that doesn't exist on modern systems. So I re-wrote it to use `-man` macros as best I could, but also included the original man page source for anyone that thinks they can do a better job in future.
Rucadi
Hacked pretty fast a version with json support, not pretty but just as a concept: https://github.com/Rucadi/lc
BSDobelix
BTW, one can download Coherent as a VM:
https://www.icl1900.co.uk/unix4fun/coherent/ftp/vms/
Additional Information:
boxed
The categories being "files" and "directories"? So just two categories?
tyingq
if (dflag) prtype(dirs, "Directories"); if (fflag) prtype(files, "Files"); if (lflag) prtype(links, "Symlinks"); if (cflag) prtype(chars, "Character special files"); if (bflag) prtype(blocks, "Block special files"); if (pflag) prtype(pipes, "Pipes"); if (mflag) prtype(mults, "Multiplexed files");
null
Nice to read an older piece of clean C code once in a while. Gives me that cozy retro feel and fond childhood memories.
Beautifying the output sounds like a good idea, perhaps something like this should be an option of standard ls?
What strikes me is that the code (which is very idiomatic of C code) is very expressive at the function level, but most of it happens inside the few functions, and the function bodies are much less readable for those who don't write C ls clones all day. The main function is very long because it handles command line switches, that boilerplate could be moved to a function or library.
The file lc.1 (UNIX man pasge) is missing, as has already. been pointed out.
• simple/compact: single file
• small: 446 lines of C code
• flat/monolithic: lots of global variables, no separation between functionality and I/O, no separation between command and library API that does the core part of the work.
(Just posting what was on my mind, not my intention to attack this fine work!)