5 ms·
Exploring pre-1990 versions of wc(1) (2023)
- tripdout 2y agoThose `goto`s between two different for loops is crazy.
- actionfromafar 2y agoAssembly / machine code thinking.
- amszmidt 2y agoMore like a relic of (actual) "spaghetti code", it was relatively common in really old Lisp code.
- lifthrasiir 2y agoNot that crazy given that it closely mirrors it's state machine structure.
- Joker_vD 2y ago> A word is a maximal string of characters delimited by spaces, tabs or newlines. And then the actual code explicitly filters out and ignores every character larger than 0x7F. Just why.
- jolmg 2y agoProbably because they're not characters. They're just bytes undefined by ASCII.
- ivan_gammel 2y agoBecause they thought that a word is something said in a human language that they can understand.
- Joker_vD 2y agoMi ne pensas ke lingvoj kiuj usas ekskluzive la basan latinan alfabeton estas komprepeneblaj per si mem.
- actionfromafar 2y agoZe riform iz komplit.
- Joker_vD 2y agoThe [z] and [ð] are phonemically different in English, just as [i] and [i:] are, so it'd actually be "Ðe riform is komplijt". American rhotacism prevents us from spelling it "rifoom" as would be proper, unfortunately.
- luismedel 2y agoCool how my native language is Spanish and I can almost-understand 80% of Esperanto.
- Tor3 2y agoASCII is 7 bits (the eight bit would be parity), so that makes perfect sense, in an ASCII world.
- Joker_vD 2y agoSo the character e.g. "B" would have this parity bit set and therefore should be filtered out and not count as a letter, in the ASCII world?
- aap_ 2y agoThere are only 7 bits in ASCII. An 8th can be used for parity when transmitting data but a regular program will never see it. Anything above 0x7F is simply not a character.
- epcoa 2y agoWhat in the hell are you going on about? B is 0x46 which is < 0x7F.
- Joker_vD 2y agoI am going about the parity bit. 0x46 has odd number of bits set (three, to be precise) so for the parity to check out (that is, the number of bits set has to be even), a parity bit needs to be set and the resulting encoding has to be 0xC6, with four bits set.
- Tor3 2y agoThe parity bit is not part of the character. It's external, an error detecting device. To read ASCII you always look at bits 6..0, seven bits. You don't filter away the character because it has the parity bit set, you filter off the parity bit (whether it's set or not).
- icedchai 2y agoAssuming parity is enabled, the parity check is done at a lower level (serial port, TTY driver, etc.) and you'll never see it from the application. I used to mess around with serial ports and terminals a ton in my youth.
- shric 2y agoA fun read on word count optimization can be found in Abrash's Black Book: https://www.jagregory.com/abrash-black-book/#lessons-learned-in-the-pursuit-of-the-ultimate-word-counter https://www.jagregory.com/abrash-black-book/#lessons-learned... You can gloss over the asm if you wish, the tricks that are explained around it are worth it imho.
- Joker_vD 2y agoI wonder if large lookup tables/table-driven state machines are still as good as they used to be. After all, even with all the on-chip caches, the additional memory accesses today seem to be slower than doing some multi-instruction SIMD voodoo.
- LegionMammal978 2y agoAt least the GNU version of wc [0] uses AVX2 for line counting, if available. Though it falls back to a simple character-by-character loop if you ask for a character count [not to be confused with a byte count!] or a word count. [0] https://git.savannah.gnu.org/cgit/coreutils.git/tree/src/wc_avx2.c?h=v9.5 https://git.savannah.gnu.org/cgit/coreutils.git/tree/src/wc_...
- dexen 2y agoThe brevity carried over to Plan 9. Re-posting my older comment (https://news.ycombinator.com/item?id=4023385 https://news.ycombinator.com/item?id=4023385): http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs follows the Unix philosophy. A lot of legacy has been shed. I can count 13 options to ls, 11 options to sed and just 5 to sed. The standard Plan 9 shell, Rc, is described in mere ~500 lines of manpage, while Bash takes whooping ~5400 lines. Oh, and there is no `dll hell' in P9 :-)