home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ARM Club 3
/
TheARMClub_PDCD3.iso
/
programs
/
comms_networking
/
hearsay
/
!Hearsay
/
Libraries
/
NewsBase
(
.txt
)
< prev
next >
Wrap
RISC OS BBC BASIC V Source
|
1996-12-17
|
25KB
|
915 lines
> NewsBase library
Chris Rutter, 1995
broadcast_startup_message
ael("broadcast_startup_message")
debugmode%
debug_message("Broadcasting NewsBase startup message...")
mpad(0)
wbk2%!16=&feed10
wbk2%!20=0
wbk2%!24=0.54*100
"Wimp_SendMessage",17,wbk2%,0
mpad(0)
wbk2%!16=NewsBase_Command%
wbk2%!20=0
wbk2%!24=0.54*100
"Wimp_SendMessage",17,wbk2%,0
broadcast_shutdown_message
ael("broadcast_shutdown_message")
debugmode%
debug_message("Sending NewsBase shutdown message...")
mpad(0)
wbk2%!16=NewsBase_Command%
wbk2%!20=10
"Wimp_SendMessage",17,wbk2%,newsbase_task%
Cinitialised_functions%=initialised_functions%
(&ffffffff
newsbase_receivemessage
ael("newsbase_receivemessage")
debugmode%
verbose
debug_message("Incoming newsbase message...["+
(block%!20)+"]")
newsbase_message%,main%,status%
#'newsbase_message%=block%!20
&ffff
$4main%=newsbase_message%-(newsbase_message%
%#status%=newsbase_message%-main%
main%
0 :
newsbase_startupreply
10 :
newsbase_shutdown
100 :
newsbase_loggroup
200 :
newsbase_logarticle
220 :
newsbase_articlearrived
400 :
newsbase_loguser
newsbase_updatemessage
ael("newsbase_updatemessage")
block%!20
debugmode%
debug_message("Group "+
ct(block%+32)+" created")
debugmode%
debug_message("Group "+
ct(block%+32)+" deleted")
4,5,6
debugmode%
debug_message("User added/deleted/modified...")
initialise_userscan
notify(
ct(block%+32))
newsbase_startupreply
status%=0
(initialised_functions%
8) <> 342
D6 initialised_functions%=initialised_functions%
E newsbase_version%=block%!24
newsbase_task%=block%!4
debugmode%
debug_message("Newsbase acknowledged startup, version="+
(newsbase_version%/100))
initialise_userscan
change_user("postmaster")
newsbase
(initialised_functions%
8)=8
newsbase_shutdown
ael("newsbase_shutdown")
debugmode%
debug_message("Newsbase is shutting down...")
UCinitialised_functions%=initialised_functions%
(&ffffffff
initialise_userscan
ael("initialise_userscan")
debugmode%
debug_message("Scanning for users...")
npad(0)
wbk2%!20=400
wbk2%!24=0
wbk2%!28=wbk2%!24
$(wbk2%+&20)=""
"Wimp_SendMessage",17,wbk2%,newsbase_task%
active_users%=0
users_writeto%=0
users_scanning%=
newsbase_loguser
ael("newsbase_loguser")
users_scanning%
user$
user$=
ct(block%+&20)
user$<>""
debugmode%
debug_message("Received information about user "+user$+", flags="+
hexadecimal(block%!28))
(users_writeto%+
(user$)+1)>heap_size%(
heap_from_anchor(anchor_users%))
pS
debugmode%
debug_message("Not enough space in users heap, increasing...")
dummy%
resize_heap(
heap_from_anchor(anchor_users%),heap_size%(
heap_from_anchor(anchor_users%))+
(user$)+5)
t. $((!anchor_users%)+users_writeto%)=user$
u users_writeto%+=
(user$)+1
active_users%+=1
debugmode%
debug_message("Finished users scan")
users_scanning%=
enumerate_users
active_users%>0
users_scanning%=
debug_message("")
debug_message("Cached users list:")
read%,user%
read%=!anchor_users%
user%=1
active_users%
debug_message(" "+
ct(read%))
read%+=
ct(read%))+1
user%
enumerate_newslist
newslist_groups%>0
newslist_scanning%=
debug_message("")
debug_message("Cached newslist:")
read%,item%
read%=!anchor_newslist%
item%=0
newslist_groups%-1
debug_message(" "+
ct(read%)+": folding="+
(group_expanded%?item%))
read%+=
ct(read%))+1
item%
enumerate_articles
group%,read%,item%
debug_message("")
group%=0
group_expanded%?group%=2
debug_message("Group "+
(group%)+" cached article list: ["+
group_received(group%))+" articles]")
) read%=!(
group_anchor_full(group%))
item%=1
!((!anchor_newslistinfo%)+(group%*24)+8)
debug_message(" "+
ct(read%))
read%+=
ct(read%))+1
item%
prepare_usersmenu
ael("prepare_usersmenu")
debugmode%
verbose
debug_message("Preparing menu of users...")
(initialised_functions%
8)=0
broadcast_startup_message
active_users%=0
menu_users%,menu_users_pointer%,user%,user_text%
#menu_users%=!anchor_menu_users%
$menu_users%="Users"
menu_users_longest%=5
menu_users%?12=7
menu_users%?13=2
menu_users%?14=7
menu_users%?15=0
menu_users%!20=44
menu_users%!24=0
&menu_users_pointer%=menu_users%+28
user_text%=0
active_users%>0
user%=1
active_users%
menu_users_pointer%!0=0
user%=active_users%
menu_users_pointer%!0=1<<7
menu_users_pointer%!4=-1
C menu_users_pointer%!8=(7<<24)
(3<<12)
(1<<4)
(1<<8)
8 menu_users_pointer%!12=(!anchor_users%)+user_text%
\ menu_users_pointer%!16=(!anchor_users%)+user_text%+
ct((!anchor_users%)+user_text%))
@ menu_users_pointer%!20=
ct((!anchor_users%)+user_text%))
ct((!anchor_users%)+user_text%))>menu_users_longest%
menu_users_longest%=
ct((!anchor_users%)+user_text%))
menu_users_pointer%+=24
7 user_text%+=
ct((!anchor_users%)+user_text%))+1
user%
/ menu_users%!16=(menu_users_longest%*16)+14
menu_users_pointer%!0=1<<7
menu_users_pointer%!4=-1
C menu_users_pointer%!8=(7<<24)
(3<<12)
(1<<4)
(1<<22)
) $(menu_users_pointer%+12)="No users"
change_user(user$)
ael("change_user")
debugmode%
debug_message("Changing user to "+user$+"...")
npad(0)
wbk2%!20=20
wbk2%!24=0
wbk2%!28=0
$(wbk2%+32)=user$
$(wbk2%+32+
(user$)+1)=""
"Wimp_SendMessage",17,wbk2%,newsbase_task%
set_icon(newspane_window%,newspane_user%,user$)
set_icon(newspane_window%,newspane_status%,"Changed user to "+user$+"...")
current_user$=user$
(initialised_functions%
8)=8
initiate_newslist_scan
open_window(news_window%)
initiate_newslist_scan
ael("initiate_newslist_scan")
debugmode%
debug_message("Scanning for groups...")
npad(0)
wbk2%!20=100
wbk2%!&18=0
$(wbk2%+&20)="*"
"Wimp_SendMessage",17,wbk2%,newsbase_task%
newslist_scanning%=
newslist_writeto%=0
newslist_textwriteto%=0
newslist_groups%=0
#newslist_unread$=
msg("Unread")
set_icon(newspane_window%,newspane_status%,
msg("ReadingGroups"))
newsbase_loggroup
debugmode%
ael("newsbase_loggroup")
group$
group$=
ct(block%+&24)
newslist_scanning%
(block%!24<>0
block%!28<>0
group$<>"")
status%=0
debugmode%
verbose
debug_message("Received information about group "+group$)
newslist_groups%+=1
(newslist_groups%
10)=0
set_icon(newspane_window%,newspane_status%,
msg("ReadingGroups")+" ("+
(newslist_groups%)+" "+
msg("Groups")+")")
check_heap_limits(anchor_newslistinfo%,newslist_groups%*24,60)
check_heap_limits(anchor_newslist%,newslist_writeto%+
(group$)+1,60)
check_heap_limits(anchor_newslisttext%,newslist_textwriteto%+
(group$)+30,30)
5 $((!anchor_newslist%)+newslist_writeto%)=group$
$wbk3%=
(block%!32)
h $((!anchor_newslisttext%)+newslist_textwriteto%)=group$+" ("+(
ct(wbk3%))+" "+newslist_unread$+")"
A !((!anchor_newslistinfo%)+(newslist_groups%*24))=block%!&18
C !((!anchor_newslistinfo%)+(newslist_groups%*24)+4)=block%!&1C
C !((!anchor_newslistinfo%)+(newslist_groups%*24)+8)=block%!&20
$(block%+36+
ct(wbk3%))+1)="L0"
< !((!anchor_newslistinfo%)+(newslist_groups%*24)+12)=0
< !((!anchor_newslistinfo%)+(newslist_groups%*24)+12)=1
$ newslist_writeto%+=
(group$)+1
P newslist_textwriteto%+=
(group$)+2+
ct(wbk3%))+1+
(newslist_unread$)+1+1
debugmode%
debug_message("Received end of list")
resize_heap(
heap_from_anchor(anchor_groupanchor%),newslist_groups%*16)
newslist_scanning%=
set_icon(newspane_window%,newspane_status%,
(newslist_groups%)+
msg("GroupsRead"))
newspane_status_timeout%=
create_newslist_window
debugmode%
wipe_news_window
ael("wipe_news_window")
wbk%
wbk%=wbk2%
"Wimp_WhichIcon",news_window%,wbk2%,0,0
!wbk%<>-1
wbk4%!0=news_window%
wbk4%!4=!wbk%
"Wimp_DeleteIcon",,wbk4%
wbk%+=4
create_newslist_window
set_article_window_extent
newslist_groups%>0
"Wimp_ForceRedraw",news_window%,-1<<29,-1<<29,1<<29,1<<29
expand_group(group%,group$)
ael("expand_group")
newslist_scanning%)
article_scanning%)
debugmode%
debug_message("Expanding group "+group$+"...[{group%}]")
set_newsgroup_subject_cache(group%,
claim_heap_commented(8192,group$+" full subject cache"))
set_newsgroup_display_cache(group%,
claim_heap_commented(8192,group$+" display cache"))
set_newsgroup_newsinfo_cache(group%,
claim_heap_commented(8192,group$+" news info cache"))
group_expanded%?group%=1
article_scanning%=
article_writeto_full%=0
article_writeto_display%=0
85 anchor_articles_full%=
group_anchor_full(group%)
9; anchor_articles_display%=
group_anchor_display(group%)
:5 anchor_articles_info%=
group_anchor_info(group%)
cached_articles_full%=0
cached_articles_display%=0
article_group%=group%
>E article_heap_full%=
heap_from_anchor(
group_anchor_full(group%))
?K article_heap_display%=
heap_from_anchor(
group_anchor_display(group%))
@E article_heap_info%=
heap_from_anchor(
group_anchor_info(group%))
article_groupname$=group$
npad(0)
wbk2%!20=200
wbk2%!24=0
wbk2%!28=0
$(wbk2%+32)=group$
"Wimp_SendMessage",17,wbk2%,newsbase_task%
collapse_group(group%,group$)
ael("collapse_group")
debugmode%
debug_message("Collapsing group {group$}...[{group%}]")
group_expanded%?group%=2
enumerate_groupanchors
group_expanded%?group%=0
delete_heap(
heap_from_anchor(
group_anchor_info(group%)))
delete_heap(
heap_from_anchor(
group_anchor_display(group%)))
delete_heap(
heap_from_anchor(
group_anchor_full(group%)))
set_newsgroup_subject_cache(group%,0)
set_newsgroup_display_cache(group%,0)
set_newsgroup_newsinfo_cache(group%,0)
create_newslist_window
compact_heaps
debugmode%
debug_message("{error$}.collapse_group: illegal delete request (group={group%},{group$})")
newsbase_logarticle
debugmode%
ael("newsbase_logarticle")
status%<>0
newsbase_logarticle_end:
article_scanning%
article$
d, !wbk3%=(block%+&20+
ct(block%+32))+1)
block%!4=!wbk3%
block%!24<>0
article$=
ct(!wbk3%)
h( block%!0=!anchor_articles_display%
i? ?((!anchor_articles_display%)+article_writeto_display%)=0
(article_checkpresence%)=0
(article_writeto_display%+
(article$)+1)>heap_size%(article_heap_display%)
resize_heap(article_heap_display%,heap_size%(article_heap_display%)+
(article$)+2048)
nG $((!anchor_articles_display%)+article_writeto_display%)=article$
o. article_writeto_display%+=
(article$)+1
p" cached_articles_display%+=1
cached_articles_display%*4>heap_size%(article_heap_info%)
resize_heap(article_heap_info%,cached_articles_display%*4+256)
sJ !(!anchor_articles_info%+(cached_articles_display%-1)*4)=block%!&18
(article_writeto_full%+
(article$)+1)>heap_size%(article_heap_full%)
resize_heap(article_heap_full%,heap_size%(article_heap_full%)+
(article$)+2048)
x@ $((!anchor_articles_full%)+article_writeto_full%)=article$
y* article_writeto_full%+=
(article$)+1
cached_articles_full%+=1
(cached_articles_full%
30)=0
set_icon(newspane_window%,newspane_status%,"<ReceivingArticleList> ({cached_articles_full%} <Articles>)")
newsbase_logarticle_end
debugmode%
newsbase_logarticle_end
ael("newsbase_logarticle_end")
debugmode%
debug_message("Finished article scan")
debugmode%
verbose
debug_message("article group is {article_group%}")
article_scanning%=
$group_expanded%?article_group%=2
=?((!anchor_articles_display%)+article_writeto_display%)=0
7?((!anchor_articles_full%)+article_writeto_full%)=0
resize_heap(article_heap_full%,article_writeto_full%+2)
resize_heap(article_heap_display%,article_writeto_display%+2)
resize_heap(article_heap_info%,cached_articles_display%*4)
cached_articles_full%>0
set_icon(newspane_window%,newspane_status%,"{cached_articles_full%} <ArticlesRead>")
set_icon(newspane_window%,newspane_status%,"{article_groupname$} <NoArticles>")
newspane_status_timeout%=
J!((!anchor_newslistinfo%)+(article_group%*24)+8)=cached_articles_full%
N!((!anchor_newslistinfo%)+(article_group%*24)+16)=cached_articles_display%
cached_articles_full%=0
% group_expanded%?article_group%=0
delete_heap(
heap_from_anchor(
group_anchor_info(article_group%)))
delete_heap(
heap_from_anchor(
group_anchor_display(article_group%)))
delete_heap(
heap_from_anchor(
group_anchor_full(article_group%)))
4 !((!anchor_groupanchor%)+(article_group%*16))=0
6 !((!anchor_groupanchor%)+(article_group%*16)+4)=0
6 !((!anchor_groupanchor%)+(article_group%*16)+8)=0
create_newslist_window
compact_heaps
compile_newsbase_stubs
code%,pass%
Wanchor_newslist_workspace%=
claim_heap_commented(48,"Newslist displayer workspace")
code% 1280:memory_needed%+=1280
pass%=0
P%=code%
[ Opt pass%
.stack
Equd 0
.poll_redraw%
Str r13,stack
Adr r13,full_stack
StmFd r13!,{r0-r12,r14}
Ldr r1,wimp_block
! Swi "Wimp_RedrawWindow"
.poll_redraw_loop
Teq r0,#0
BEq poll_redraw_exit
Ldr r0,[r1]
;Teq r0,#viewer_window%
Teq r0,#1
# BEq create_viewer_window%
% BNe create_newslist_window%
.poll_redraw_return_point
Ldr r1,wimp_block
! Swi "Wimp_GetRectangle"
B poll_redraw_loop
.poll_redraw_exit
LdmFd r13!,{r0-r12,r14}
Ldr r13,stack
Mov Pc,r14
.create_newslist_window%
" Ldr r0,[r1,#24] ;scrolly
Ldr r2,[r1,#16] ;maxy
& Ldr r3,[r1,#40] ;redraw maxy
Sub r2,r2,r0
Sub r3,r3,r0
! Sub r4,r3,r2 ;max limit
& Ldr r2,[r1,#32] ;redraw miny
% Sub r3,r3,r2 ;redraw height
% Sub r3,r4,r3 ;minimum limit
Add r4,r4,#44
Sub r3,r3,#44
Adr r0,newslist_info
LdmIa r0,{r8-r12}
Ldr r11,[r11]
Ldr r12,[r12]
.newslist_create
Mov r6,#0 ;item number
Sub r5,r6,#64 ;y
.newslist_create_loop
& Bl newslist_get_item_length
Mov r7,r0 ;length
Cmp r5,r4
BGt newslist_plotskip
Cmp r5,r3
BLt newslist_plotskip
Str r10,[r11,#0]
Mov r0,#4
Str r0,[r11,#4]
Sub r0,r5,#44
Str r0,[r11,#8]
Mov r0,#800
Str r0,[r11,#12]
Str r5,[r11,#16]
Ldr r0,newslist_flags
Str r0,[r11,#20]
Str r12,[r11,#24]
" Ldr r0,newslist_expanded
LdrB r1,[r0,r6]
Teq r1,#0
StrEq r9,[r11,#28]
AddNe r0,r9,#8
StrNe r0,[r11,#28]
$ BNe newslist_directorystub
Str r7,[r11,#32]
Add r1,r11,#4
Swi "Wimp_PlotIcon"
Add r12,r12,r7
Sub r5,r5,#44
.newslist_increment_item
Add r6,r6,#1
Teq r6,r8
" BNe newslist_create_loop
& B poll_redraw_return_point
.newslist_plotskip
Add r12,r12,r7
Sub r5,r5,#44
" Ldr r0,newslist_expanded
;Sub r0,r0,#1
LdrB r1,[r0,r6]
Teq r1,#2
* BEq newslist_create_article_list
% B newslist_increment_item
.newslist_get_item_length
Mov r0,#0
".newslist_get_item_length_loop
LdrB r1,[r12,r0]
Cmp r1,#32
Add r0,r0,#1
MovLt Pc,r14
+ B newslist_get_item_length_loop
.newslist_directorystub
Str r7,[r11,#32]
Add r12,r12,r7
Add r1,r11,#4
Swi "Wimp_PlotIcon"
Sub r5,r5,#44
!.newslist_create_article_list
StmFd r13!,{r9,r12}
' Ldr r12,newslist_groupanchors
Ldr r12,[r12]
Add r12,r12,r6,Lsl#4
Ldr r12,[r12,#4]
5 Ldr r12,[r12] ;pointer to strings of titles
" Adr r9,newslist_textfile
&.newslist_create_article_list_loop
& Bl newslist_get_item_length
Mov r7,r0 ;length
Cmp r0,#1
9 BLe newslist_create_article_list_increment_item
Cmp r5,r3
!3 BLt newslist_create_article_list_plotskip
Cmp r5,r4
#3 BGt newslist_create_article_list_plotskip
Str r10,[r11,#0]
Mov r0,#44
Str r0,[r11,#4]
Sub r0,r5,#44
Str r0,[r11,#8]
Mov r0,#844
Str r0,[r11,#12]
Str r5,[r11,#16]
Ldr r0,newslist_flags
Str r0,[r11,#20]
Str r12,[r11,#24]
LdrB r0,[r12,#0]
Teq r0,#
("R")
12 BNe newslist_create_article_list_skip_Re
LdrB r0,[r12,#1]
LdrB r1,[r12,#2]
LdrB r2,[r12,#3]
Teq r0,#
("e")
TeqEq r1,#
(":")
TeqEq r2,#
(" ")
AddEq r0,r12,#4
StrEq r0,[r11,#24]
:).newslist_create_article_list_skip_Re
Str r9,[r11,#28]
Str r7,[r11,#32]
Add r1,r11,#4
Swi "Wimp_PlotIcon"
?*.newslist_create_article_list_plotskip
Sub r5,r5,#44
Add r12,r12,r7
B0.newslist_create_article_list_increment_item
Cmp r7,#1
D/ BGt newslist_create_article_list_loop
LdmFd r13!,{r9,r12}
F% B newslist_increment_item
.wimp_block
Equd block%
.newslist_info
Equd 0
K Equd newslist_directory
Equd news_window%
M( Equd anchor_newslist_workspace%
N" Equd anchor_newslisttext%
.newslist_flags
PC Equd 1
(1<<4)
(1<<8)
(7<<24)
(3<<12)
(1<<28)
.newslist_minextent
Equd -(1<<29)
.newslist_maxextent
Equd 1<<29
.newslist_groupanchors
V! Equd anchor_groupanchor%
.newslist_expanded
Equd group_expanded%
.newslist_article_info
Z" Equd anchor_newslistinfo%
.newslist_textfile
Equs "Ssmall_fff"
Equb 0
Align
.newslist_directory
Equs "Sgroup"
Equb 0
Align
Equs "Sgroupopen"
Equb 0
Align
fP Equs " "
gP Equs " "
hP Equs " "
iP Equs " "
jP Equs " "
kP Equs " "
Align
.full_stack
.article_checkpresence%
StmFd r13!,{r14}
Ldr r0,wimp_block
Ldr r10,[r0,#0] ;heap
s) Ldr r11,[r0,#4] ;string to test
.article_checkpresence_loop
Bl article_teq
Teq r0,#1
BEq article_found
Bl article_length
Add r10,r10,r1
LdrB r0,[r10]
Cmp r0,#32
|( BGe article_checkpresence_loop
Ldr r0,wimp_block
Mov r1,#0
Str r1,[r0]
Mov r0,#0
LdmFd r13!,{Pc}
.article_found
Ldr r0,wimp_block
Str r10,[r0]
Mov r0,#1
LdmFd r13!,{Pc}
.article_teq
Mov r9,#0
.article_teq_loop
LdrB r0,[r10,r9]
LdrB r1,[r11,r9]
Cmp r0,#32
MovLt r0,#0
Cmp r1,#32
MovLt r1,#0
Teq r0,r1
BNe article_teq_false
Add r9,r9,#1
Teq r0,#0
BNe article_teq_loop
.article_teq_true
Mov r0,#1
Mov Pc,r14
.article_teq_false
LdrB r0,[r11,#0]
LdrB r1,[r11,#1]
LdrB r2,[r11,#2]
LdrB r3,[r11,#3]
Teq r0,#
("R")
TeqEq r1,#
("e")
TeqEq r2,#
(":")
TeqEq r3,#
(" ")
MovNe r0,#0
MovNe Pc,r14
StmFd r13!,{r14}
Add r11,r11,#4
Bl article_teq
Sub r11,r11,#4
LdmFd r13!,{Pc}
.article_length
Mov r1,#0
.article_length_loop
LdrB r0,[r10,r1]
Add r1,r1,#1
Cmp r0,#32
! BGe article_length_loop
Mov Pc,r14
.create_viewer_window%
Adr r0,viewer_anchor
Ldr r0,[r0]
.viewer_anchor
Equd viewer_anchor
pass%
group_anchor_full(group%)
*=!((!anchor_groupanchor%)+(group%*16))
group_anchor_display(group%)
,=!((!anchor_groupanchor%)+(group%*16)+4)
group_anchor_info(group%)
,=!((!anchor_groupanchor%)+(group%*16)+8)
group_received(group%)
-=!((!anchor_newslistinfo%)+(group%*24)+8)
group_received_display(group%)
.=!((!anchor_newslistinfo%)+(group%*24)+16)
news_window_click
group%
!block%=news_window%
"Wimp_GetWindowState",,block%
*window%=(block%!16-block%!24)-mouse_y%
icon%=(window%-64)
debugmode%
debug_message("Click on news item "+
(icon%))
*group%=
group_from_window_index(icon%)
group%
article%
0 article%=
article_from_window_index(icon%)
. group%=
ingroup_from_window_index(icon%)
button%
4 :
open_article(group%,article%)
-1 :
invalid
button%
:
article_scanning%)
newslist_scanning%)
$
group_expanded%?group%
H
0 :
expand_group(group%,
ct_text(!anchor_newslist%,group%))
J
2 :
collapse_group(group%,
ct_text(!anchor_newslist%,group%))
group_from_window_index(icon%)
group%,min%,max%,answer%,index%
group%=0
group_expanded%?group%=2
min%=index%+1
1 max%=index%+
group_received_display(group%)
icon%>=min%
icon%<=max%
answer%=-2
icon%=index%
answer%=group%
index%=max%+1
icon%=index%
answer%=group%
index%+=1
group%
answer%>=newslist_groups%
answer%=-1
answer%<-2
answer%=-1
=answer%
ingroup_from_window_index(icon%)
group%,min%,max%,answer%,index%
group%=0
group_expanded%?group%=2
min%=index%+1
1 max%=index%+
group_received_display(group%)
icon%>=min%
icon%<=max%
answer%=group%
icon%=index%
answer%=group%
index%=max%+1
icon%=index%
answer%=group%
index%+=1
group%
answer%>=newslist_groups%
answer%=-1
answer%<-2
answer%=-1
=answer%
article_from_window_index(icon%)
group%,min%,max%,answer%,index%
answer%=-1
group%=0
group_expanded%?group%=2
min%=index%+1
1 max%=index%+
group_received_display(group%)
icon%>=min%
icon%<=max%
index%=icon%-min%
< answer%=!((!(
group_anchor_info(group%)))+(index%*4))
icon%=index%
answer%=-1
index%=max%+1
index%+=1
group%
=answer%
articles_in_window
group%,answer%
newslist_groups%=0
answer%=0
group%=0
group_expanded%?group%=2
)0 answer%+=
group_received_display(group%)+1
group%<=newslist_groups%
answer%+=1
group%
=answer%
set_article_extent
wbk%!0=0
2)wbk%!4=-(24+(
articles_in_window*44))
wbk%!8=1040
wbk%!12=0
"Wimp_SetExtent",news_window%,wbk%
set_article_window_extent
!wbk2%=news_window%
set_article_extent
"Wimp_GetWindowState",,wbk2%
"Wimp_OpenWindow",,wbk2%
open_article(group%,article%)
group$
A-group$=
ct_text(!anchor_newslist%,group%)
debugmode%
debug_message("Opening article "+
(article%)+" in group "+group$)
npad(0)
wbk2%!20=220
wbk2%!24=article%
wbk2%!28=0
$(wbk2%+32)=group$
?(wbk2%+32+
(group$)+1)=0
"Wimp_SendMessage",17,wbk2%,newsbase_task%
newsbase_articlearrived
article at block%+32
status%=0
viewer_opendocument(
ct(block%+32))
set_newsgroup_subject_cache(group%,anchor%)
U3!((!anchor_groupanchor%)+(group%*16)+0)=anchor%
set_newsgroup_display_cache(group%,anchor%)
Y3!((!anchor_groupanchor%)+(group%*16)+4)=anchor%
set_newsgroup_newsinfo_cache(group%,anchor%)
]3!((!anchor_groupanchor%)+(group%*16)+8)=anchor%