changelog shortlog tags branches changeset files revisions annotate raw help

Mercurial > hg > plan9front / rc/bin/newt

changeset 6213: 6923bb0c35e2
parent: 0f0c70e54e5e
author: cinap_lenrek@felloff.net
date: Wed, 08 Nov 2017 00:34:08 +0100
permissions: -rwxr-xr-x
description: pc64: set ts flag before schedinit()
1 #!/bin/rc
2 # NEWT, their six-year-old daughter, yells from the back...
3 # use with nntpfs
4 rfork en
5 ramfs
6 argv0=$0
7 if(~ $#editor 0)
8  editor=hold
9 if(~ $#pager 0)
10  pager=cat
11 group=alt/test
12 maxposts=30
13 mnt=/mnt/news
14 if(~ $#newtname 0)
15  newtname=newt@dont-email.me
16 fn e{
17  {
18  echo From: $"newtname
19  echo Newsgroups: `{echo $group | sed 's/\//\./g'}
20  echo Subject: $"subject
21  echo
22  } >/tmp/post
23  eval $editor /tmp/post
24  yn send
25  if(~ $yn y)
26  cat /tmp/post >$mnt/$group/post
27 }
28 fn f { du -a $* | sed 's/^.* //g' }
29 fn fmtd{
30  date=`{cat}
31  if(! ~ $date(1) [0-9]*)
32  date=`{nshift $date}
33  da=$date(1)
34  if(~ $da [0-9])
35  da=0^$da
36  switch($date(2)){
37  case Jan; mo=1
38  case Feb; mo=2
39  case Mar; mo=3
40  case Apr; mo=4
41  case May; mo=5
42  case Jun; mo=6
43  case Jul; mo=7
44  case Aug; mo=8
45  case Sep; mo=9
46  case Oct; mo=10
47  case Nov; mo=11
48  case Dec; mo=12
49  }
50  if(! ~ $date(3) `{date | awk '{print $6;}'})
51  ti=$date(3)
52  if not
53  ti=`{echo $date(4) | awk '{print substr($0,0,5);}'}
54  if(! ~ $#mo 0 && ! ~ $#da 0 && ! ~ $#ti 0)
55  echo $mo/$da $ti
56  if not
57  echo nil
58 }
59 fn geth{
60  for(i in $*){
61  from=`{awk -F ' ' '{print $3;}' $rposts($i)^/xover >[2]/dev/null}
62  if(! ~ $#from 0 && ! ~ $#from 1){
63  nfrom=`{
64  for(i in $from){
65  if(~ $i *@*)
66  echo $i | sed 's/(<|>)//g'
67  }
68  }
69  if(! ~ $#nfrom 0)
70  from=$nfrom
71  }
72  if(~ $#from 0)
73  from=nil
74  date=`{awk -F ' ' '{print $4;}' $rposts($i)^/xover >[2]/dev/null | fmtd}
75  if(~ $#date 0)
76  date=nil
77  subject=`{awk -F ' ' '{print substr($2,0,50);}' $rposts($i)^/xover >[2]/dev/null}
78  if(~ $#subject 0)
79  subject=nil
80  # unicode 00a0 divides message number from headline.
81  # command input ignores everything after unicode 00a0.
82  # these lines may be selected and sent to the prompt.
83  echo ' '$"i' '$"date' '$"from' '$"subject
84  }
85 }
86 fn getposts{ ls | grep -e '^[0-9]+$' | sort -n | tail -$maxposts }
87 fn getr{
88  switch($*){
89  case ,; echo $posts
90  case ,*; seq 1 `{echo $* | sed 's/,//g'}
91  case *,; seq `{echo $* | sed 's/,//g'} $posts($#posts)
92  case *,*; seq `{echo $* | sed 's/,/ /g'}
93  case *; echo $*
94  }
95 }
96 fn h{ sed -n $1^p /tmp/h }
97 fn k{
98  kmnt=`{echo $mnt | sed 's/\//\\\//g'}
99  f $mnt/$* |
100  grep -v -e '\/([0-9]+|article|body|header|post|xover)$' |
101  sed 's/^'$"kmnt'\// g /g' |
102  sort |
103  eval $pager
104 }
105 fn nshift{ shift; echo $* }
106 fn printhelp{
107 echo 'Commands are of the form [<range>] <command> [args]
108 <range> := <addr> | <addr>','<addr>
109 <command> :=
110 b print the next ten headers
111 e enter message
112 g ... go to specified group
113 h print message headline (,h for all)
114 help print this help message
115 k ... list sub-groups under specified group
116 kf ... grep $home/lib/newsgroups for regexp
117 p print message with minimal headers
118 P print message with full headers
119 q quit
120 r reply to message
121 y synchronize message list with server
122 " print message in quoted form, suitable for reply
123 |cmd pipe message body to a command
124 ||cmd pipe raw message to a command
125 !cmd run a command
126 ? print debug information'
127 }
128 fn np{
129  if(test $1 -le $#rposts && test -f $mnt/$group/$rposts($1)^/body){
130  { # don't stutter
131  grep -e '(^From|^Newsgroups|^Subject|^Date)' $rposts($1)^/header
132  echo
133  cat $rposts($1)^/body
134  } >/tmp/p
135  eval $pager /tmp/p
136  }
137  echo
138  go=1
139  r=$1
140  post=$1
141  prompt=$group/$1
142 }
143 fn P{
144  if(test $1 -le $#rposts && test -f $mnt/$group/$rposts($1)^/article)
145  eval $pager $rposts($1)^/article
146  echo
147  go=1
148  r=$1
149  post=$1
150  prompt=$group/$1
151 }
152 fn r{
153  if(test $1 -le $#rposts && test -f $mnt/$group/$rposts($1)^/header){
154  subject=`{grep -e '^Subject: ' $mnt/$group/$rposts($1)^/header | sed 's/^Subject: //g'}
155  if(! ~ $subject RE:* Re:* re:*)
156  subject=(Re: $subject)
157  e
158  }
159  if not
160  echo !message missing
161 }
162 fn y{
163  go=()
164  r=$post
165  if(! ~ $q 1){
166  rposts=`{getposts}
167  posts=`{seq 1 $#rposts}
168  post=$posts(1)
169  prompt=$post
170  geth $posts >/tmp/h
171  echo $#posts messages
172  }
173 }
174 fn yn{
175  echo
176  echo -n $* ' (y, n) '
177  yn=`{read}
178  switch($yn){
179  case y n
180  ;
181  case *
182  yn
183  }
184 }
185 fn '"' {{p $1 | sed 1d | sed 's/^/> /g' | sed 's/^> >/>>/g' | sed '$d'; echo}}
186 fn usage{
187  echo usage: $argv0 '[ -f newsgroup ] [ -m mountpoint ] [ -p maxposts ]' >[1=2]
188  exit usage
189 }
190 while(~ $1 -*){
191  switch($1){
192  case -f
193  group=`{echo $2 | sed 's/\./\//g'}
194  shift
195  case -m
196  mnt=$2
197  shift
198  case -p
199  maxposts=$2
200  shift
201  case *
202  usage
203  }
204  shift
205 }
206 if(! ~ $#* 0)
207  usage
208 prompt=$group
209 if(! test -d $mnt/$group){
210  echo !$mnt/$group does not exist >[1=2]
211  exit
212 }
213 builtin cd $mnt/$group
214 y
215 while(){
216  echo -n $"prompt': '
217  # command input ignores everything after unicode 00a0.
218  rcmd=`{read | sed 's/[ ].*$//g' | sed 's/^([0-9]+)?(,)?([0-9]+)?/& /g'}
219  switch($rcmd){
220  case ,* [0-9]*
221  r=`{getr $rcmd(1)}
222  cmd=`{nshift $rcmd}
223  if(~ $#cmd 0)
224  cmd=p
225  case *
226  r=$post
227  cmd=$rcmd
228  }
229  switch($cmd){
230  case b
231  r=`{seq $r(1) `{echo $r(1)^+10|bc}}
232  if(test $r($#r) -gt $posts($#posts))
233  r=`{seq $r(1) $posts($#posts)}
234  if(! ~ $#r 0 && test $r(1) -le $posts($#posts)){
235  sed -n $r(1)^,$r($#r)^p /tmp/h
236  post=$r($#r)
237  prompt=$post
238  }
239  if not
240  echo !address
241  case e
242  subject=() e
243  case g' '*
244  ngroup=`{nshift $cmd | sed 's/\./\//g'}
245  if(test -d $mnt/$ngroup){
246  if(grep -s -e '^[0-9]+$' <{ls -p $mnt/$ngroup}){
247  group=$ngroup
248  builtin cd $mnt/$group
249  y
250  }
251  if not
252  echo !$ngroup contains no messages
253  }
254  if not
255  echo !$ngroup does not exist
256  case h
257  {
258  for(i in $r)
259  h $i
260  } | eval $pager
261  post=$r($#r)
262  prompt=$post
263  case help
264  printhelp
265  case k
266  k $group
267  case k' '*
268  k `{nshift $cmd | sed 's/\./\//g'}
269  case kf' '*
270  grep -e `{nshift $cmd} $home/lib/newsgroups |
271  sed 's/^/ g /g' |
272  eval $pager
273  case p
274  for(i in $r)
275  np $i
276  case P
277  for(i in $r)
278  P $i
279  case q
280  q=1 y # BUP STOP
281  exit
282  case r
283  for(i in $r)
284  r $i
285  post=$r($#r)
286  prompt=$post
287  case y
288  y
289  case '"'
290  for(i in $r)
291  '"' $i
292  post=$r($#r)
293  prompt=$post
294  case '||'*
295  cmd=`{echo $"cmd | sed 's/^\|\|//g'}
296  cat $mnt/$group/^$rposts($post)^/article | eval $cmd
297  case '|'*
298  cmd=`{echo $"cmd | sed 's/^\|//g'}
299  cat $mnt/$group/^$rposts($post)^/body | eval $cmd
300  case '!'*
301  eval `{echo $"cmd | sed 's/^\!//g'}
302  case '?'
303  echo editor: $editor
304  echo pager: $pager
305  echo mnt: $mnt
306  echo group: $group
307  echo maxposts: $maxposts
308  echo '#go': $#go
309  echo rposts: $rposts
310  echo 'rposts(r):' $rposts($r)
311  echo posts: $posts
312  echo post: $post
313  echo r: $r
314  case *
315  if(~ $post $posts(1) && ~ $#go 0)
316  np $post
317  if not if(! ~ $post $posts($#posts)){
318  post=`{echo $post^+1 | bc}
319  if(test $post -gt $posts($#posts))
320  post=$posts($#posts)
321  np $post
322  }
323  }
324 }