• jll29 4 hours ago

    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!)

    • christophilus 4 hours ago

      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.

    • BSDobelix 4 hours ago
      • ZoomZoomZoom an hour ago

        Not to be confused with another lc, which is a highly configurable "multi-dimensional"[1] file lister focused on flexibility and configurability, written in Nim.

        https://github.com/c-blake/lc

        Key features:

        - Multi-level sorting by combinations of attributes like size, time, and file type, with user-defined precedence

        - Configurable file kind sorting order

        - Value-dependent coloring for file attributes such as timestamps, permissions, or sizes.

        - Abbreviations: Automatically shorten filenames, user/group names or symlink targets.

        - File type classification: Integrates libmagic for file type inspection.

        - Hyperlink support

        - Per-directory configs: custom behaviors for specific directories using local tweak files (.lc).

        - Lightweight (~900 lines of code) with only author's CLI library "cligen" and Nim's stdlib as dependencies.

        and more.

        [1]: https://github.com/c-blake/lc#vector-typemulti-dimensionalit...

        • hk__2 5 hours ago

          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 5 hours ago

            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 4 hours ago
              • lewiscollard 3 hours ago

                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.

                • hk__2 an hour ago

                  Thank you for the PR!

          • Rucadi 3 hours ago

            Hacked pretty fast a version with json support, not pretty but just as a concept: https://github.com/Rucadi/lc

            • choffee 34 minutes ago

              I give you the file called ":

              • oguz-ismail 14 minutes ago

                What's the point of JSON output anyway? UNIX filenames can contain arbitrary sequences of bytes except NUL and /, they can't be represented as JSON strings.

            • oguz-ismail 5 hours ago

              No colorful text, no emojis, no Unicode decorations. Nice.

              • _benj 4 hours ago

                No rust either?

                • buserror an hour ago

                  The day is still young. Wait for it, there'll be one (or 3) soon.

                  With 865 dependencies pulled in by cargo :-)

                  • PittleyDunkin 2 hours ago

                    Next we gotta jettison capital letters to really trim the cruft

                    • pjmlp an hour ago

                      Old news, now it is all about RIIZ.

                  • boxed 4 hours ago

                    The categories being "files" and "directories"? So just two categories?

                    • tyingq 4 hours ago

                      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");