Annotation of 43BSD/contrib/rn/HACKERSGUIDE, revision 1.1.1.1

1.1       root        1: Hacking Notes
                      2: 
                      3: If you aren't interested in mucking with the innards of rn, don't read this.
                      4: 
                      5: In the interests of both space and time optimization, things are done inside
                      6: rn that don't always conform to the highest ideals of programming.  To the
                      7: extent I felt it was practical, I've tried to conform to good programming
                      8: practice, but you must realize that my goal was to make a better mousetrap,
                      9: so certain conscious tradeoffs were made in the design of rn right from the
                     10: start.  In particular, if you want to hack on rn (and I wouldn't blame you,
                     11: it's fun), beware of the following:
                     12:   
                     13:   * buf and cmd_buf are reused all over the place.  11-squishing is a good
                     14:     term for it.  No, I'm on a Vax now, but I've been there.
                     15: 
                     16:   * The article header is parsed on the fly, while it is being displayed.
                     17:     In fact, practically everything is done on the fly within the article
                     18:     display loop, and there are plenty of state variables.  The header
                     19:     is never explicitly stored in memory; rather, pointers are kept into
                     20:     the file.  The information required to backup pages is not stored in
                     21:     memory, except for 1 buffer's worth.  The information required to do
                     22:     the delayed mark as unread (M) is not stored in memory either.
                     23: 
                     24:   * Lots of contortions are gone through to avoid using static memory, or
                     25:     allocating unnecessary memory, or losing track of allocated memory,
                     26:     while at the same time allowing .newsrc lines and header lines to be
                     27:     ANY length up to the amount of memory you have.  Rn spends a great deal
                     28:     of effort being lazy.  Do not use a static buffer when you can use
                     29:     growstr().
                     30: 
                     31:   * Lots of contortions are gone through to try to do things when people
                     32:     aren't waiting, or have only been waiting a very short time.  Guessing
                     33:     the next article to be opened and opening it, searching ahead for the
                     34:     next article with the same subject, delaying the look up of the number
                     35:     of articles in a newsgroup, writing the rest of the page while the
                     36:     reader is examining the header, cacheing up subjects while the user
                     37:     is reading, checkpointing the .newsrc only while the reader is in the
                     38:     middle of an interesting article, are some of the strategies employed.
                     39:   
                     40:   * There are plenty of goto's.  Most of them involve going back to reprompt,
                     41:     to reask for input, or to just plain do the unstructured things people
                     42:     want to do when they are glaring at a terminal.  If they bother you
                     43:     too much, just think of rn as a big state machine.  If they don't bother
                     44:     you at all, I don't want you hacking on rn.
                     45: 
                     46:   * Put all includes at the front of the file, before the first function,
                     47:     or makedepend will not work right.  I could relax this, but makedepend
                     48:     would take about 5 times longer to run.
                     49: 
                     50: In general then, feel free to hack on rn.  Just don't broadcast untested
                     51: patches to the net.  Remember that there are people with limited address
                     52: spaces and limited cpu cycles.  If you add a wonderful new feature and
                     53: want to publish a patch, put #ifdef's around it so that people who don't
                     54: want it or can't afford it can work around it.  THIS MEANS YOU.  We don't
                     55: need 57 varieties of mutually incompatible and incomprehensible rn floating
                     56: about the net.  Consider telling me about your patch so that I can consider
                     57: including it in the standard version.  A COMPLETE PATCH TAKES INTO ACCOUNT
                     58: SYSTEM DEPENDENCIES AS DETERMINED BY THE CONFIGURE SCRIPT.
                     59: 
                     60: * Don't use ints where rn uses typedefs, in particular, for article numbers.
                     61: * Don't use %d anywhere that someone might need a %ld.  (Just because YOU
                     62:     typedefed it as an int doesn't mean someone else won't need a long.)
                     63: * Don't use %D, that's archaic.
                     64: * Put FLUSHes after printf()s, fputs()es and putchar('\n')s for our poor
                     65:     brethern and sistern without line buffering.
                     66: * Declare the type of every function.  Use void, even if your C compiler
                     67:     doesn't.
                     68: * Follow the style that rn already uses!  This is my pet peeve.  Well, one of
                     69:     them, anyway.  I follow other people's strange styles when modifying
                     70:     their programs, so I'd be much obliged if you did likewise.
                     71: * Use lint.
                     72: * Use RCS.  Start a new branch, like 4.3.[2-9].  (I will use 4.3.1 myself.)
                     73: * Be structured wherever it doesn't interfere with practicality.
                     74: * Long live paranoid programming.  The rest of the program is out to get you.
                     75:     The world is out to destroy the program, not to mention the .newsrc.
                     76:     And then there's always bitrot...
                     77: * Stop reading this lugubrious trash and start thinking for yourself.
                     78: * Thank you and good night.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.