1 This attempts to document the article lifecycle. 2 3 arts[] is trashed and rebuilt every time a group is entered. 4 This is handled entirely by index_group() 5 6 setup_hard_base() creates an array of 'valid' article numbers in base[] 7 8 read_overview() populates arts[] from overview data (cached or XOVER) 9 Articles are initialised with set_article() 10 Key initial default values are: 11 art->thread = ART_EXPIRED 12 art->status = ART_UNREAD 13 14 read_art_headers() then plugs in any gaps due to new articles not yet in the 15 overview (or reads all the headers if there are no overviews). 16 All articles that are verified as already present (ie loaded by read_overview()) 17 or are newly added will have art->thread set to ART_UNTHREADED 18 valid_artnum() is used to check if base[n] maps to any known arts[].artnum 19 [ After this base[] is reused as the thread base pointer array, which involves 20 a change of type from long to int. This is why the code is full of ugly 21 (int) base[] casts ] 22 23 parse_unread_arts() uses the newsrc bitmask to explicitly set 24 art->status to either ART_UNREAD or ART_READ 25 Therefore anything not in the bitmap will default to ART_UNREAD 26 27 Any articles that still have art->thread set to ART_EXPIRED will 28 have art->status set to ART_READ 29 30 write_overview() rewrites the cached overview data for any 31 articles above the group low watermark where arts->thread != ART_EXPIRED 32 33 build_references() doesn't affect any of this 34 35 make_threads() in essence does: 36 if (arts[i].thread >= 0) 37 arts[i].thread = ART_UNTHREADED; 38 to 'unthread' all the currently threaded & valid arts and calls find_base() 39 40 find_base() will not thread articles with ->thread == ART_EXPIRED 41 It makes no actual changes to ->status or ->thread