Artifact
c330dd97be2caa84ff6aa9b2d70b2a915d638896:
- File
n2o.fs
— part of check-in
[581eb4c544]
at
2019-07-04 21:50:35
on branch trunk
— Start implementing commands in GUI mode
(user:
bernd
size: 23657)
0000: 5c 20 6e 65 74 32 6f 20 63 6f 6d 6d 61 6e 64 20 \ net2o command
0010: 6c 69 6e 65 20 69 6e 74 65 72 66 61 63 65 0a 0a line interface..
0020: 5c 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 \ Copyright (C)
0030: 32 30 31 35 2d 32 30 31 39 20 20 20 42 65 72 6e 2015-2019 Bern
0040: 64 20 50 61 79 73 61 6e 0a 0a 5c 20 54 68 69 73 d Paysan..\ This
0050: 20 70 72 6f 67 72 61 6d 20 69 73 20 66 72 65 65 program is free
0060: 20 73 6f 66 74 77 61 72 65 3a 20 79 6f 75 20 63 software: you c
0070: 61 6e 20 72 65 64 69 73 74 72 69 62 75 74 65 20 an redistribute
0080: 69 74 20 61 6e 64 2f 6f 72 20 6d 6f 64 69 66 79 it and/or modify
0090: 0a 5c 20 69 74 20 75 6e 64 65 72 20 74 68 65 20 .\ it under the
00a0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 47 4e 55 terms of the GNU
00b0: 20 41 66 66 65 72 6f 20 47 65 6e 65 72 61 6c 20 Affero General
00c0: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 61 Public License a
00d0: 73 20 70 75 62 6c 69 73 68 65 64 20 62 79 0a 5c s published by.\
00e0: 20 74 68 65 20 46 72 65 65 20 53 6f 66 74 77 61 the Free Softwa
00f0: 72 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20 65 re Foundation, e
0100: 69 74 68 65 72 20 76 65 72 73 69 6f 6e 20 33 20 ither version 3
0110: 6f 66 20 74 68 65 20 4c 69 63 65 6e 73 65 2c 20 of the License,
0120: 6f 72 0a 5c 20 28 61 74 20 79 6f 75 72 20 6f 70 or.\ (at your op
0130: 74 69 6f 6e 29 20 61 6e 79 20 6c 61 74 65 72 20 tion) any later
0140: 76 65 72 73 69 6f 6e 2e 0a 0a 5c 20 54 68 69 73 version...\ This
0150: 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74 program is dist
0160: 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68 ributed in the h
0170: 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c ope that it will
0180: 20 62 65 20 75 73 65 66 75 6c 2c 0a 5c 20 62 75 be useful,.\ bu
0190: 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20 57 41 t WITHOUT ANY WA
01a0: 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 74 20 RRANTY; without
01b0: 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65 64 even the implied
01c0: 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 5c 20 4d warranty of.\ M
01d0: 45 52 43 48 41 4e 54 41 42 49 4c 49 54 59 20 6f ERCHANTABILITY o
01e0: 72 20 46 49 54 4e 45 53 53 20 46 4f 52 20 41 20 r FITNESS FOR A
01f0: 50 41 52 54 49 43 55 4c 41 52 20 50 55 52 50 4f PARTICULAR PURPO
0200: 53 45 2e 20 20 53 65 65 20 74 68 65 0a 5c 20 47 SE. See the.\ G
0210: 4e 55 20 41 66 66 65 72 6f 20 47 65 6e 65 72 61 NU Affero Genera
0220: 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 l Public License
0230: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c for more detail
0240: 73 2e 0a 0a 5c 20 59 6f 75 20 73 68 6f 75 6c 64 s...\ You should
0250: 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 61 have received a
0260: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e 55 copy of the GNU
0270: 20 41 66 66 65 72 6f 20 47 65 6e 65 72 61 6c 20 Affero General
0280: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 0a 5c Public License.\
0290: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 69 73 along with this
02a0: 20 70 72 6f 67 72 61 6d 2e 20 20 49 66 20 6e 6f program. If no
02b0: 74 2c 20 73 65 65 20 3c 68 74 74 70 3a 2f 2f 77 t, see <http://w
02c0: 77 77 2e 67 6e 75 2e 6f 72 67 2f 6c 69 63 65 6e ww.gnu.org/licen
02d0: 73 65 73 2f 3e 2e 0a 0a 72 65 71 75 69 72 65 20 ses/>...require
02e0: 6e 65 74 32 6f 2e 66 73 0a 0a 56 61 72 69 61 62 net2o.fs..Variab
02f0: 6c 65 20 6b 65 79 2d 72 65 61 64 69 6e 0a 0a 3a le key-readin..:
0300: 20 71 72 2d 6d 65 20 28 20 2d 2d 20 29 20 70 6b qr-me ( -- ) pk
0310: 40 20 71 72 3a 6f 77 6e 6b 65 79 23 20 2e 6b 65 @ qr:ownkey# .ke
0320: 79 71 72 20 3b 0a 3a 20 71 72 2d 6e 69 63 6b 73 yqr ;.: qr-nicks
0330: 20 28 20 2d 2d 20 29 0a 20 20 20 20 5b 3a 20 6e ( -- ). [: n
0340: 69 63 6b 2d 6b 65 79 20 3f 64 75 70 2d 49 46 20 ick-key ?dup-IF
0350: 20 3e 6f 20 6b 65 2d 70 6b 20 24 40 0a 09 20 20 >o ke-pk $@..
0360: 20 20 71 72 3a 6f 77 6e 6b 65 79 23 20 71 72 3a qr:ownkey# qr:
0370: 6b 65 79 23 20 6b 65 2d 73 6b 20 73 65 63 40 20 key# ke-sk sec@
0380: 6e 69 70 20 73 65 6c 65 63 74 20 6f 3e 0a 09 20 nip select o>..
0390: 20 20 20 2e 6b 65 79 71 72 20 20 54 48 45 4e 20 .keyqr THEN
03a0: 3b 5d 20 40 61 72 67 2d 6c 6f 6f 70 20 3b 0a 0a ;] @arg-loop ;..
03b0: 3a 20 6f 75 74 2d 6e 69 63 6b 73 20 28 20 2d 2d : out-nicks ( --
03c0: 20 29 0a 20 20 20 20 5b 3a 20 6e 69 63 6b 2d 6b ). [: nick-k
03d0: 65 79 20 3f 64 75 70 2d 49 46 20 20 6f 75 74 2d ey ?dup-IF out-
03e0: 6b 65 79 20 20 54 48 45 4e 20 3b 5d 20 40 61 72 key THEN ;] @ar
03f0: 67 2d 6c 6f 6f 70 20 3b 0a 0a 24 32 30 20 76 61 g-loop ;..$20 va
0400: 6c 75 65 20 68 61 73 68 2d 73 69 7a 65 23 0a 0a lue hash-size#..
0410: 3a 20 68 61 73 68 2d 66 69 6c 65 20 28 20 61 64 : hash-file ( ad
0420: 64 72 20 75 20 2d 2d 20 68 61 73 68 20 75 27 20 dr u -- hash u'
0430: 29 0a 20 20 20 20 63 3a 30 6b 65 79 20 73 6c 75 ). c:0key slu
0440: 72 70 2d 66 69 6c 65 20 32 64 75 70 20 63 3a 68 rp-file 2dup c:h
0450: 61 73 68 20 64 72 6f 70 20 66 72 65 65 20 74 68 ash drop free th
0460: 72 6f 77 20 70 61 64 20 63 3a 6b 65 79 3e 0a 20 row pad c:key>.
0470: 20 20 20 70 61 64 20 68 61 73 68 2d 73 69 7a 65 pad hash-size
0480: 23 20 3b 0a 0a 3a 20 68 61 73 68 2d 66 69 6c 65 # ;..: hash-file
0490: 2d 62 6c 6f 63 6b 73 20 28 20 61 64 64 72 20 75 -blocks ( addr u
04a0: 20 2d 2d 20 29 0a 20 20 20 20 73 6c 75 72 70 2d -- ). slurp-
04b0: 66 69 6c 65 20 6f 76 65 72 20 7b 20 73 74 61 72 file over { star
04c0: 74 20 7d 20 62 6f 75 6e 64 73 20 3f 44 4f 0a 09 t } bounds ?DO..
04d0: 63 3a 30 6b 65 79 20 49 20 64 75 70 20 24 34 30 c:0key I dup $40
04e0: 30 20 2b 20 49 27 20 75 6d 69 6e 20 6f 76 65 72 0 + I' umin over
04f0: 20 2d 20 63 3a 68 61 73 68 0a 09 70 61 64 20 63 - c:hash..pad c
0500: 3a 6b 65 79 3e 0a 09 49 20 73 74 61 72 74 20 2d :key>..I start -
0510: 20 24 34 30 30 20 2f 20 68 65 78 2e 20 70 61 64 $400 / hex. pad
0520: 20 68 61 73 68 2d 73 69 7a 65 23 20 2e 38 35 69 hash-size# .85i
0530: 6e 66 6f 20 63 72 0a 20 20 20 20 24 34 30 30 20 nfo cr. $400
0540: 2b 4c 4f 4f 50 0a 20 20 20 20 73 74 61 72 74 20 +LOOP. start
0550: 66 72 65 65 20 74 68 72 6f 77 20 3b 0a 0a 3a 20 free throw ;..:
0560: 64 6f 2d 6b 65 79 69 6e 20 28 20 61 64 64 72 20 do-keyin ( addr
0570: 75 20 2d 2d 20 29 0a 20 20 20 20 6b 65 79 2d 72 u -- ). key-r
0580: 65 61 64 69 6e 20 24 73 6c 75 72 70 2d 66 69 6c eadin $slurp-fil
0590: 65 20 20 36 34 23 2d 31 20 6b 65 79 2d 72 65 61 e 64#-1 key-rea
05a0: 64 2d 6f 66 66 73 65 74 20 36 34 21 0a 20 20 20 d-offset 64!.
05b0: 20 6b 65 79 2d 72 65 61 64 69 6e 20 24 40 20 64 key-readin $@ d
05c0: 6f 2d 6b 65 79 20 3b 0a 0a 3a 20 6b 65 79 73 3e o-key ;..: keys>
05d0: 73 65 61 72 63 68 20 28 20 2d 2d 20 29 0a 20 20 search ( -- ).
05e0: 20 20 73 65 61 72 63 68 2d 6b 65 79 5b 5d 20 24 search-key[] $
05f0: 5b 5d 6f 66 66 20 5b 3a 20 64 75 70 20 35 20 6d []off [: dup 5 m
0600: 6f 64 20 49 46 0a 09 20 20 20 20 2e 22 20 6b 65 od IF.. ." ke
0610: 79 73 20 69 6e 20 6d 75 6c 74 69 70 6c 65 73 20 ys in multiples
0620: 6f 66 20 35 20 62 61 73 65 38 35 20 63 68 61 72 of 5 base85 char
0630: 61 63 74 65 72 73 2c 20 70 6c 65 61 73 65 2c 20 acters, please,
0640: 69 67 6e 6f 72 69 6e 67 20 27 22 0a 09 20 20 20 ignoring '"..
0650: 20 74 79 70 65 20 2e 22 20 27 22 20 63 72 0a 09 type ." '" cr..
0660: 45 4c 53 45 20 20 62 61 73 65 38 35 3e 24 20 73 ELSE base85>$ s
0670: 65 61 72 63 68 2d 6b 65 79 5b 5d 20 24 2b 5b 5d earch-key[] $+[]
0680: 21 20 20 54 48 45 4e 20 3b 5d 20 61 72 67 2d 6c ! THEN ;] arg-l
0690: 6f 6f 70 20 3b 0a 0a 3a 20 6e 69 63 6b 73 3e 73 oop ;..: nicks>s
06a0: 65 61 72 63 68 20 28 20 2d 2d 20 29 0a 20 20 20 earch ( -- ).
06b0: 20 73 65 61 72 63 68 2d 6b 65 79 5b 5d 20 24 5b search-key[] $[
06c0: 5d 6f 66 66 0a 20 20 20 20 5b 3a 20 6e 69 63 6b ]off. [: nick
06d0: 3e 70 6b 20 64 75 70 20 30 3d 20 21 21 6e 6f 2d >pk dup 0= !!no-
06e0: 6e 69 63 6b 21 21 20 73 65 61 72 63 68 2d 6b 65 nick!! search-ke
06f0: 79 5b 5d 20 24 2b 5b 5d 21 20 3b 5d 20 40 61 72 y[] $+[]! ;] @ar
0700: 67 2d 6c 6f 6f 70 20 3b 0a 0a 3a 20 68 61 6e 64 g-loop ;..: hand
0710: 6c 65 2d 63 68 61 74 20 28 20 2d 2d 20 29 0a 20 le-chat ( -- ).
0720: 20 20 20 63 68 61 74 2d 63 6f 6e 6e 65 63 74 73 chat-connects
0730: 20 3f 77 61 69 74 2d 63 68 61 74 20 64 6f 2d 63 ?wait-chat do-c
0740: 68 61 74 20 3b 0a 0a 5c 20 63 6f 6d 6d 61 6e 64 hat ;..\ command
0750: 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e s for the comman
0760: 64 20 6c 69 6e 65 20 75 73 65 72 20 69 6e 74 65 d line user inte
0770: 72 66 61 63 65 0a 0a 56 61 72 69 61 62 6c 65 20 rface..Variable
0780: 6f 6c 64 2d 72 65 63 73 0a 56 61 72 69 61 62 6c old-recs.Variabl
0790: 65 20 6f 6c 64 2d 6f 72 64 65 72 0a 0a 3a 20 73 e old-order..: s
07a0: 65 74 2d 6e 65 74 32 6f 2d 63 6d 64 73 20 28 20 et-net2o-cmds (
07b0: 2d 2d 20 29 0a 20 20 20 20 67 65 74 2d 72 65 63 -- ). get-rec
07c0: 6f 67 6e 69 7a 65 72 73 20 6f 6c 64 2d 72 65 63 ognizers old-rec
07d0: 73 20 73 65 74 2d 73 74 61 63 6b 0a 20 20 20 20 s set-stack.
07e0: 67 65 74 2d 6f 72 64 65 72 20 6f 6c 64 2d 6f 72 get-order old-or
07f0: 64 65 72 20 73 65 74 2d 73 74 61 63 6b 0a 20 20 der set-stack.
0800: 20 20 5b 27 5d 20 6e 32 6f 20 3e 62 6f 64 79 20 ['] n2o >body
0810: 31 20 73 65 74 2d 6f 72 64 65 72 0a 20 20 20 20 1 set-order.
0820: 5b 27 5d 20 72 65 63 2d 77 6f 72 64 20 31 20 73 ['] rec-word 1 s
0830: 65 74 2d 72 65 63 6f 67 6e 69 7a 65 72 73 20 3b et-recognizers ;
0840: 0a 3a 20 72 65 73 65 74 2d 6e 65 74 32 6f 2d 63 .: reset-net2o-c
0850: 6d 64 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 6f mds ( -- ). o
0860: 6c 64 2d 72 65 63 73 20 67 65 74 2d 73 74 61 63 ld-recs get-stac
0870: 6b 20 3f 64 75 70 2d 49 46 20 20 73 65 74 2d 72 k ?dup-IF set-r
0880: 65 63 6f 67 6e 69 7a 65 72 73 20 20 54 48 45 4e ecognizers THEN
0890: 0a 20 20 20 20 6f 6c 64 2d 6f 72 64 65 72 20 67 . old-order g
08a0: 65 74 2d 73 74 61 63 6b 20 3f 64 75 70 2d 49 46 et-stack ?dup-IF
08b0: 20 20 73 65 74 2d 6f 72 64 65 72 20 64 65 66 69 set-order defi
08c0: 6e 69 74 69 6f 6e 73 20 20 54 48 45 4e 20 3b 0a nitions THEN ;.
08d0: 0a 3a 20 64 6f 2d 6e 65 74 32 6f 2d 63 6d 64 73 .: do-net2o-cmds
08e0: 20 28 20 78 74 20 2d 2d 20 29 0a 20 20 20 20 73 ( xt -- ). s
08f0: 65 74 2d 6e 65 74 32 6f 2d 63 6d 64 73 20 63 61 et-net2o-cmds ca
0900: 74 63 68 20 72 65 73 65 74 2d 6e 65 74 32 6f 2d tch reset-net2o-
0910: 63 6d 64 73 20 74 68 72 6f 77 20 3b 0a 0a 3a 20 cmds throw ;..:
0920: 28 6e 32 6f 2d 71 75 69 74 29 20 28 20 2d 2d 20 (n2o-quit) ( --
0930: 29 0a 20 20 20 20 5c 20 65 78 69 74 73 20 6f 6e ). \ exits on
0940: 6c 79 20 74 68 72 6f 75 67 68 20 54 48 52 4f 57 ly through THROW
0950: 20 65 74 63 2e 0a 20 20 20 20 42 45 47 49 4e 0a etc.. BEGIN.
0960: 09 2e 73 74 61 74 75 73 20 63 72 20 72 65 66 69 ..status cr refi
0970: 6c 6c 20 20 57 48 49 4c 45 0a 09 20 20 20 20 69 ll WHILE.. i
0980: 6e 74 65 72 70 72 65 74 20 70 72 6f 6d 70 74 0a nterpret prompt.
0990: 20 20 20 20 52 45 50 45 41 54 20 20 2d 35 36 20 REPEAT -56
09a0: 74 68 72 6f 77 20 3b 0a 0a 3a 20 6e 32 6f 2d 71 throw ;..: n2o-q
09b0: 75 69 74 20 28 20 2d 2d 20 29 0a 20 20 20 20 63 uit ( -- ). c
09c0: 6c 65 61 72 2d 74 69 62 73 74 61 63 6b 0a 20 20 lear-tibstack.
09d0: 20 20 42 45 47 49 4e 0a 09 5b 63 6f 6d 70 69 6c BEGIN..[compil
09e0: 65 5d 20 5b 20 20 5b 27 5d 20 28 6e 32 6f 2d 71 e] [ ['] (n2o-q
09f0: 75 69 74 29 20 63 61 74 63 68 20 64 75 70 20 23 uit) catch dup #
0a00: 2d 35 36 20 3c 3e 20 61 6e 64 20 64 75 70 0a 20 -56 <> and dup.
0a10: 20 20 20 57 48 49 4c 45 0a 09 20 20 20 20 3c 23 WHILE.. <#
0a20: 20 5c 20 72 65 73 65 74 20 68 6f 6c 64 20 61 72 \ reset hold ar
0a30: 65 61 2c 20 6f 72 20 77 65 20 6d 61 79 20 67 65 ea, or we may ge
0a40: 74 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 0a t another error.
0a50: 09 20 20 20 20 44 6f 45 72 72 6f 72 0a 09 20 20 . DoError..
0a60: 20 20 5c 20 73 74 61 63 6b 20 64 65 70 74 68 73 \ stack depths
0a70: 20 6d 61 79 20 62 65 20 61 72 62 69 74 72 61 72 may be arbitrar
0a80: 79 20 73 74 69 6c 6c 20 28 6f 72 20 61 67 61 69 y still (or agai
0a90: 6e 29 2c 20 73 6f 20 63 6c 65 61 72 20 74 68 65 n), so clear the
0aa0: 6d 0a 09 20 20 20 20 63 6c 65 61 72 73 74 61 63 m.. clearstac
0ab0: 6b 73 0a 09 20 20 20 20 63 6c 65 61 72 2d 74 69 ks.. clear-ti
0ac0: 62 73 74 61 63 6b 0a 20 20 20 20 52 45 50 45 41 bstack. REPEA
0ad0: 54 0a 20 20 20 20 64 72 6f 70 20 63 6c 65 61 72 T. drop clear
0ae0: 2d 74 69 62 73 74 61 63 6b 20 23 2d 35 36 20 74 -tibstack #-56 t
0af0: 68 72 6f 77 20 3b 0a 0a 3a 20 6e 32 6f 2d 63 6d hrow ;..: n2o-cm
0b00: 64 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 69 6e ds ( -- ). in
0b10: 69 74 2d 63 6c 69 65 6e 74 20 77 6f 72 64 2d 61 it-client word-a
0b20: 72 67 73 20 5b 27 5d 20 6e 32 6f 2d 71 75 69 74 rgs ['] n2o-quit
0b30: 20 5b 27 5d 20 64 6f 2d 6e 65 74 32 6f 2d 63 6d ['] do-net2o-cm
0b40: 64 73 20 63 61 74 63 68 0a 20 20 20 20 64 75 70 ds catch. dup
0b50: 20 23 2d 35 36 20 3d 20 73 77 61 70 20 23 2d 32 #-56 = swap #-2
0b60: 38 20 3d 20 6f 72 20 49 46 20 20 64 72 6f 70 20 8 = or IF drop
0b70: 73 75 62 6d 65 20 62 79 65 20 20 45 4c 53 45 20 subme bye ELSE
0b80: 20 74 68 72 6f 77 20 20 54 48 45 4e 20 3b 0a 0a throw THEN ;..
0b90: 3a 20 2e 75 73 61 67 65 20 28 20 61 64 64 72 20 : .usage ( addr
0ba0: 75 20 2d 2d 20 61 64 64 72 20 75 20 29 0a 20 20 u -- addr u ).
0bb0: 20 20 73 6f 75 72 63 65 20 37 20 2f 73 74 72 69 source 7 /stri
0bc0: 6e 67 20 74 79 70 65 20 63 72 20 3b 0a 0a 3a 20 ng type cr ;..:
0bd0: 3f 63 72 20 28 20 2d 2d 20 29 20 73 63 72 69 70 ?cr ( -- ) scrip
0be0: 74 3f 20 30 3d 20 49 46 20 20 63 72 20 20 54 48 t? 0= IF cr TH
0bf0: 45 4e 20 3b 0a 0a 73 63 6f 70 65 7b 20 6e 32 6f EN ;..scope{ n2o
0c00: 0a 0a 3a 20 68 65 6c 70 20 28 20 2d 2d 20 29 0a ..: help ( -- ).
0c10: 20 20 20 20 5c 55 20 68 65 6c 70 20 5b 63 6d 64 \U help [cmd
0c20: 31 20 2e 2e 20 63 6d 64 6e 5d 0a 20 20 20 20 5c 1 .. cmdn]. \
0c30: 47 20 68 65 6c 70 3a 20 70 72 69 6e 74 20 63 6f G help: print co
0c40: 6d 6d 61 6e 64 73 20 6f 72 20 64 65 74 61 69 6c mmands or detail
0c50: 73 20 61 62 6f 75 74 20 73 70 65 63 69 66 69 65 s about specifie
0c60: 64 20 63 6f 6d 6d 61 6e 64 0a 20 20 20 20 3f 63 d command. ?c
0c70: 72 20 3f 6e 65 78 74 61 72 67 20 49 46 0a 09 42 r ?nextarg IF..B
0c80: 45 47 49 4e 0a 09 20 20 20 20 32 64 75 70 20 6f EGIN.. 2dup o
0c90: 76 65 72 20 63 40 20 27 2d 27 20 3d 20 49 46 0a ver c@ '-' = IF.
0ca0: 09 09 2e 22 20 3d 3d 3d 20 4f 70 74 69 6f 6e 73 ..." === Options
0cb0: 20 3d 3d 3d 22 20 63 72 0a 09 09 5b 3a 20 2e 22 ===" cr...[: ."
0cc0: 20 20 20 20 20 5c 4f 20 22 20 74 79 70 65 20 3b \O " type ;
0cd0: 5d 0a 09 20 20 20 20 45 4c 53 45 0a 09 09 2e 22 ].. ELSE...."
0ce0: 20 3d 3d 3d 20 43 6f 6d 6d 61 6e 64 73 20 3d 3d === Commands ==
0cf0: 3d 22 20 63 72 0a 09 09 5b 3a 20 2e 22 20 20 20 =" cr...[: ."
0d00: 20 20 5c 55 20 22 20 74 79 70 65 20 3b 5d 0a 09 \U " type ;]..
0d10: 20 20 20 20 54 48 45 4e 20 20 24 74 6d 70 20 5b THEN $tmp [
0d20: 27 5d 20 2e 75 73 61 67 65 20 73 65 61 72 63 68 '] .usage search
0d30: 2d 68 65 6c 70 0a 09 20 20 20 20 2e 22 20 3d 3d -help.. ." ==
0d40: 3d 20 44 65 74 61 69 6c 73 20 3d 3d 3d 22 20 63 = Details ===" c
0d50: 72 0a 09 20 20 20 20 5b 3a 20 2e 22 20 20 20 20 r.. [: ."
0d60: 20 5c 47 20 22 20 74 79 70 65 20 27 3a 27 20 65 \G " type ':' e
0d70: 6d 69 74 20 3b 5d 20 24 74 6d 70 20 5b 27 5d 20 mit ;] $tmp [']
0d80: 2e 63 6d 64 20 73 65 61 72 63 68 2d 68 65 6c 70 .cmd search-help
0d90: 0a 09 3f 6e 65 78 74 61 72 67 20 30 3d 20 55 4e ..?nextarg 0= UN
0da0: 54 49 4c 0a 20 20 20 20 45 4c 53 45 0a 09 2e 22 TIL. ELSE..."
0db0: 20 3d 3d 3d 20 4f 70 74 69 6f 6e 73 20 28 70 72 === Options (pr
0dc0: 65 63 65 65 64 20 63 6f 6d 6d 61 6e 64 73 29 20 eceed commands)
0dd0: 3d 3d 3d 22 20 63 72 0a 09 73 22 20 20 20 20 20 ===" cr..s"
0de0: 5c 4f 20 22 20 5b 27 5d 20 2e 75 73 61 67 65 20 \O " ['] .usage
0df0: 73 65 61 72 63 68 2d 68 65 6c 70 0a 09 2e 22 20 search-help..."
0e00: 3d 3d 3d 20 43 6f 6d 6d 61 6e 64 73 20 3d 3d 3d === Commands ===
0e10: 22 20 63 72 0a 09 73 22 20 20 20 20 20 5c 55 20 " cr..s" \U
0e20: 22 20 5b 27 5d 20 2e 75 73 61 67 65 20 73 65 61 " ['] .usage sea
0e30: 72 63 68 2d 68 65 6c 70 0a 20 20 20 20 54 48 45 rch-help. THE
0e40: 4e 20 3b 0a 0a 7d 73 63 6f 70 65 0a 0a 3a 20 6e N ;..}scope..: n
0e50: 65 78 74 2d 63 6d 64 20 28 20 2d 2d 20 29 0a 20 ext-cmd ( -- ).
0e60: 20 20 20 3f 6e 65 78 74 61 72 67 20 30 3d 20 49 ?nextarg 0= I
0e70: 46 20 20 6e 32 6f 3a 68 65 6c 70 20 20 45 58 49 F n2o:help EXI
0e80: 54 20 20 54 48 45 4e 0a 20 20 20 20 32 64 75 70 T THEN. 2dup
0e90: 20 5b 27 5d 20 6e 32 6f 20 3e 62 6f 64 79 20 73 ['] n2o >body s
0ea0: 65 61 72 63 68 2d 77 6f 72 64 6c 69 73 74 0a 20 earch-wordlist.
0eb0: 20 20 20 49 46 20 20 6e 69 70 20 6e 69 70 20 65 IF nip nip e
0ec0: 78 65 63 75 74 65 20 20 45 4c 53 45 0a 09 5b 3a xecute ELSE..[:
0ed0: 20 3c 65 72 72 3e 20 2e 22 20 6e 32 6f 20 63 6f <err> ." n2o co
0ee0: 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a mmand not found:
0ef0: 20 22 20 6d 61 72 6b 2d 73 74 61 72 74 20 74 79 " mark-start ty
0f00: 70 65 20 6d 61 72 6b 2d 65 6e 64 0a 09 20 20 20 pe mark-end..
0f10: 20 3c 64 65 66 61 75 6c 74 3e 20 63 72 20 3b 5d <default> cr ;]
0f20: 20 64 6f 2d 64 65 62 75 67 0a 09 5b 27 5d 20 32 do-debug..['] 2
0f30: 64 72 6f 70 20 61 72 67 2d 6c 6f 6f 70 20 6e 32 drop arg-loop n2
0f40: 6f 3a 68 65 6c 70 0a 20 20 20 20 54 48 45 4e 20 o:help. THEN
0f50: 3b 0a 0a 44 65 66 65 72 20 72 75 6e 2d 67 75 69 ;..Defer run-gui
0f60: 0a 3a 6e 6f 6e 61 6d 65 20 2e 22 20 67 75 69 20 .:noname ." gui
0f70: 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 22 not implemented"
0f80: 20 63 72 20 3b 20 69 73 20 72 75 6e 2d 67 75 69 cr ; is run-gui
0f90: 0a 44 65 66 65 72 20 72 75 6e 2d 73 63 61 6e 2d .Defer run-scan-
0fa0: 71 72 0a 3a 6e 6f 6e 61 6d 65 20 2e 22 20 73 63 qr.:noname ." sc
0fb0: 61 6e 2d 71 75 72 20 6e 6f 74 20 69 6d 70 6c 65 an-qur not imple
0fc0: 6d 65 6e 74 65 64 22 20 63 72 20 3b 20 69 73 20 mented" cr ; is
0fd0: 72 75 6e 2d 73 63 61 6e 2d 71 72 0a 0a 24 56 61 run-scan-qr..$Va
0fe0: 72 69 61 62 6c 65 20 67 75 69 2e 66 73 24 0a 22 riable gui.fs$."
0ff0: 67 75 69 2e 66 73 22 20 6f 70 65 6e 2d 66 70 61 gui.fs" open-fpa
1000: 74 68 2d 66 69 6c 65 20 30 3d 20 5b 49 46 5d 20 th-file 0= [IF]
1010: 72 6f 74 20 63 6c 6f 73 65 2d 66 69 6c 65 20 74 rot close-file t
1020: 68 72 6f 77 20 67 75 69 2e 66 73 24 20 24 21 20 hrow gui.fs$ $!
1030: 5b 54 48 45 4e 5d 0a 24 56 61 72 69 61 62 6c 65 [THEN].$Variable
1040: 20 71 72 73 63 61 6e 2e 66 73 24 0a 22 71 72 73 qrscan.fs$."qrs
1050: 63 61 6e 2e 66 73 22 20 6f 70 65 6e 2d 66 70 61 can.fs" open-fpa
1060: 74 68 2d 66 69 6c 65 20 30 3d 20 5b 49 46 5d 20 th-file 0= [IF]
1070: 72 6f 74 20 63 6c 6f 73 65 2d 66 69 6c 65 20 74 rot close-file t
1080: 68 72 6f 77 20 71 72 73 63 61 6e 2e 66 73 24 20 hrow qrscan.fs$
1090: 24 21 20 5b 54 48 45 4e 5d 0a 24 56 61 72 69 61 $! [THEN].$Varia
10a0: 62 6c 65 20 70 61 72 73 65 72 2e 66 73 24 0a 22 ble parser.fs$."
10b0: 6a 73 6f 6e 2f 70 61 72 73 65 72 2e 66 73 22 20 json/parser.fs"
10c0: 6f 70 65 6e 2d 66 70 61 74 68 2d 66 69 6c 65 20 open-fpath-file
10d0: 30 3d 20 5b 49 46 5d 20 72 6f 74 20 63 6c 6f 73 0= [IF] rot clos
10e0: 65 2d 66 69 6c 65 20 74 68 72 6f 77 20 70 61 72 e-file throw par
10f0: 73 65 72 2e 66 73 24 20 24 21 20 5b 54 48 45 4e ser.fs$ $! [THEN
1100: 5d 0a 0a 73 63 6f 70 65 3a 20 69 6d 70 6f 72 74 ]..scope: import
1110: 65 72 0a 3a 20 67 2b 20 70 61 72 73 65 72 2e 66 er.: g+ parser.f
1120: 73 24 20 24 40 20 72 65 71 75 69 72 65 64 0a 20 s$ $@ required.
1130: 20 20 20 3f 6e 65 78 74 61 72 67 20 30 3d 20 49 ?nextarg 0= I
1140: 46 20 20 22 2e 22 20 20 54 48 45 4e 20 20 22 67 F "." THEN "g
1150: 2b 2d 69 6d 70 6f 72 74 22 20 65 76 61 6c 75 61 +-import" evalua
1160: 74 65 20 3b 0a 7d 73 63 6f 70 65 0a 0a 73 63 6f te ;.}scope..sco
1170: 70 65 7b 20 6e 32 6f 0a 0a 3a 20 6b 65 79 69 6e pe{ n2o..: keyin
1180: 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 6b ( -- ). \U k
1190: 65 79 69 6e 7c 69 6e 6b 65 79 20 66 69 6c 65 31 eyin|inkey file1
11a0: 20 2e 2e 20 66 69 6c 65 6e 0a 20 20 20 20 5c 47 .. filen. \G
11b0: 20 6b 65 79 69 6e 3a 20 72 65 61 64 20 61 20 2e keyin: read a .
11c0: 6e 32 6f 20 6b 65 79 20 66 69 6c 65 20 69 6e 0a n2o key file in.
11d0: 20 20 20 20 3f 67 65 74 2d 6d 65 20 20 6b 65 79 ?get-me key
11e0: 3e 64 65 66 61 75 6c 74 0a 20 20 20 20 42 45 47 >default. BEG
11f0: 49 4e 20 20 3f 6e 65 78 74 61 72 67 20 57 48 49 IN ?nextarg WHI
1200: 4c 45 0a 09 20 20 20 20 69 6d 70 6f 72 74 23 6d LE.. import#m
1210: 61 6e 75 61 6c 20 69 6d 70 6f 72 74 2d 74 79 70 anual import-typ
1220: 65 20 21 20 20 64 6f 2d 6b 65 79 69 6e 20 20 6c e ! do-keyin l
1230: 61 73 74 2d 6b 65 79 20 2e 3f 70 65 72 6d 0a 20 ast-key .?perm.
1240: 20 20 20 52 45 50 45 41 54 20 20 73 61 76 65 2d REPEAT save-
1250: 70 75 62 6b 65 79 73 20 3b 0a 3a 20 6b 65 79 6f pubkeys ;.: keyo
1260: 75 74 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 ut ( -- ). \U
1270: 20 6b 65 79 6f 75 74 7c 6f 75 74 6b 65 79 20 5b keyout|outkey [
1280: 40 75 73 65 72 31 20 2e 2e 20 40 75 73 65 72 6e @user1 .. @usern
1290: 5d 0a 20 20 20 20 5c 47 20 6b 65 79 6f 75 74 3a ]. \G keyout:
12a0: 20 6f 75 74 70 75 74 20 70 75 62 6b 65 79 20 6f output pubkey o
12b0: 66 20 79 6f 75 72 20 69 64 65 6e 74 69 74 79 0a f your identity.
12c0: 20 20 20 20 5c 47 20 6b 65 79 6f 75 74 3a 20 6f \G keyout: o
12d0: 70 74 69 6f 6e 61 6c 3a 20 6f 75 74 70 75 74 20 ptional: output
12e0: 70 75 62 6b 65 79 73 20 6f 66 20 6f 74 68 65 72 pubkeys of other
12f0: 20 75 73 65 72 73 0a 20 20 20 20 3f 67 65 74 2d users. ?get-
1300: 6d 65 20 3f 70 65 65 6b 61 72 67 20 49 46 20 20 me ?peekarg IF
1310: 32 64 72 6f 70 20 6f 75 74 2d 6e 69 63 6b 73 20 2drop out-nicks
1320: 20 45 4c 53 45 20 20 6f 75 74 2d 6d 65 20 20 54 ELSE out-me T
1330: 48 45 4e 20 3b 0a 3a 20 6b 65 79 67 65 6e 20 28 HEN ;.: keygen (
1340: 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 6b 65 79 -- ). \U key
1350: 67 65 6e 7c 67 65 6e 6b 65 79 20 6e 69 63 6b 0a gen|genkey nick.
1360: 20 20 20 20 5c 47 20 6b 65 79 67 65 6e 3a 20 67 \G keygen: g
1370: 65 6e 65 72 61 74 65 20 61 20 6e 65 77 20 6b 65 enerate a new ke
1380: 79 70 61 69 72 0a 20 20 20 20 67 65 6e 2d 6b 65 ypair. gen-ke
1390: 79 73 2d 64 69 72 20 3f 6e 65 78 74 61 72 67 20 ys-dir ?nextarg
13a0: 30 3d 20 49 46 20 20 67 65 74 2d 6e 69 63 6b 20 0= IF get-nick
13b0: 20 54 48 45 4e 0a 20 20 20 20 6e 65 77 2d 6b 65 THEN. new-ke
13c0: 79 20 3f 63 72 20 2e 6b 65 79 73 20 3f 72 73 6b y ?cr .keys ?rsk
13d0: 20 3b 0a 3a 20 6b 65 79 6c 69 73 74 20 28 20 2d ;.: keylist ( -
13e0: 2d 20 29 0a 20 20 20 20 5c 55 20 6b 65 79 6c 69 - ). \U keyli
13f0: 73 74 7c 6c 69 73 74 6b 65 79 0a 20 20 20 20 5c st|listkey. \
1400: 47 20 6b 65 79 6c 69 73 74 3a 20 6c 69 73 74 20 G keylist: list
1410: 61 6c 6c 20 6b 6e 6f 77 6e 20 6b 65 79 73 0a 20 all known keys.
1420: 20 20 20 3f 67 65 74 2d 6d 65 20 3f 63 72 20 6c ?get-me ?cr l
1430: 69 73 74 2d 6b 65 79 73 20 2e 22 20 3d 3d 3d 20 ist-keys ." ===
1440: 67 72 6f 75 70 73 20 3d 3d 3d 22 20 63 72 20 2e groups ===" cr .
1450: 67 72 6f 75 70 73 20 3b 0a 0a 3a 20 6b 65 79 71 groups ;..: keyq
1460: 72 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 r ( -- ). \U
1470: 6b 65 79 71 72 7c 71 72 6b 65 79 20 5b 40 75 73 keyqr|qrkey [@us
1480: 65 72 31 20 2e 2e 20 40 75 73 65 72 6e 5d 0a 20 er1 .. @usern].
1490: 20 20 20 5c 47 20 6b 65 79 71 72 3a 20 70 72 69 \G keyqr: pri
14a0: 6e 74 20 71 72 20 6f 66 20 6f 77 6e 20 6b 65 79 nt qr of own key
14b0: 20 28 64 65 66 61 75 6c 74 29 20 6f 72 20 73 65 (default) or se
14c0: 6c 65 63 74 65 64 20 75 73 65 72 27 73 20 71 72 lected user's qr
14d0: 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20 69 6e 69 . ?get-me ini
14e0: 74 2d 63 6c 69 65 6e 74 20 61 6e 6e 6f 75 6e 63 t-client announc
14f0: 65 2d 6d 65 0a 20 20 20 20 3f 70 65 65 6b 61 72 e-me. ?peekar
1500: 67 20 49 46 20 20 32 64 72 6f 70 20 71 72 2d 6e g IF 2drop qr-n
1510: 69 63 6b 73 20 20 45 4c 53 45 20 20 71 72 2d 6d icks ELSE qr-m
1520: 65 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 6b 65 79 e THEN ;..: key
1530: 73 63 61 6e 20 28 20 2d 2d 20 29 0a 20 20 20 20 scan ( -- ).
1540: 5c 55 20 6b 65 79 73 63 61 6e 7c 73 63 61 6e 6b \U keyscan|scank
1550: 65 79 7c 73 63 61 6e 71 72 7c 71 72 73 63 61 6e ey|scanqr|qrscan
1560: 0a 20 20 20 20 5c 47 20 6b 65 79 73 63 61 6e 3a . \G keyscan:
1570: 20 73 63 61 6e 20 61 20 6b 65 79 20 69 6e 20 63 scan a key in c
1580: 6f 6c 6f 72 20 51 52 20 66 6f 72 6d 0a 20 20 20 olor QR form.
1590: 20 3f 2e 6e 65 74 32 6f 2d 63 6f 6e 66 69 67 0a ?.net2o-config.
15a0: 20 20 20 20 72 65 73 65 74 2d 6e 65 74 32 6f 2d reset-net2o-
15b0: 63 6d 64 73 0a 20 20 20 20 71 72 73 63 61 6e 2e cmds. qrscan.
15c0: 66 73 24 20 24 40 20 64 75 70 20 49 46 20 20 72 fs$ $@ dup IF r
15d0: 65 71 75 69 72 65 64 20 20 45 4c 53 45 20 20 6e equired ELSE n
15e0: 6f 2d 66 69 6c 65 23 20 74 68 72 6f 77 20 20 54 o-file# throw T
15f0: 48 45 4e 20 20 72 75 6e 2d 73 63 61 6e 2d 71 72 HEN run-scan-qr
1600: 20 3b 0a 0a 3a 20 6b 65 79 73 65 61 72 63 68 20 ;..: keysearch
1610: 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 6b 65 ( -- ). \U ke
1620: 79 73 65 61 72 63 68 7c 73 65 61 72 63 68 6b 65 ysearch|searchke
1630: 79 20 38 35 73 74 72 69 6e 67 31 20 2e 2e 20 38 y 85string1 .. 8
1640: 35 73 74 72 69 6e 67 6e 0a 20 20 20 20 5c 47 20 5stringn. \G
1650: 6b 65 79 73 65 61 72 63 68 3a 20 73 65 61 72 63 keysearch: searc
1660: 68 20 66 6f 72 20 6b 65 79 73 20 70 72 65 66 69 h for keys prefi
1670: 78 65 64 20 77 69 74 68 20 62 61 73 65 38 35 20 xed with base85
1680: 73 74 72 69 6e 67 73 2c 0a 20 20 20 20 5c 47 20 strings,. \G
1690: 6b 65 79 73 65 61 72 63 68 3a 20 61 6e 64 20 69 keysearch: and i
16a0: 6d 70 6f 72 74 20 74 68 65 6d 20 69 6e 74 6f 20 mport them into
16b0: 74 68 65 20 6b 65 79 20 63 68 61 69 6e 0a 20 20 the key chain.
16c0: 20 20 3f 67 65 74 2d 6d 65 20 69 6e 69 74 2d 63 ?get-me init-c
16d0: 6c 69 65 6e 74 0a 20 20 20 20 6b 65 79 73 3e 73 lient. keys>s
16e0: 65 61 72 63 68 20 73 65 61 72 63 68 2d 6b 65 79 earch search-key
16f0: 73 20 69 6e 73 65 72 74 2d 6b 65 79 73 20 73 61 s insert-keys sa
1700: 76 65 2d 70 75 62 6b 65 79 73 0a 20 20 20 20 3f ve-pubkeys. ?
1710: 63 72 20 6b 65 79 6c 69 73 74 20 3b 0a 0a 3a 20 cr keylist ;..:
1720: 77 68 6f 61 6d 69 20 28 20 2d 2d 20 29 0a 20 20 whoami ( -- ).
1730: 20 20 5c 55 20 77 68 6f 61 6d 69 0a 20 20 20 20 \U whoami.
1740: 5c 47 20 77 68 6f 61 6d 69 3a 20 70 72 69 6e 74 \G whoami: print
1750: 20 79 6f 75 72 20 6f 77 6e 20 6b 65 79 0a 20 20 your own key.
1760: 20 20 3f 67 65 74 2d 6d 65 20 70 6b 40 20 6b 65 ?get-me pk@ ke
1770: 79 3e 6f 20 2e 2e 6b 65 79 2d 6c 69 73 74 20 3b y>o ..key-list ;
1780: 0a 0a 3a 20 70 65 72 6d 20 28 20 2d 2d 20 29 0a ..: perm ( -- ).
1790: 20 20 20 20 5c 55 20 70 65 72 6d 20 40 75 73 65 \U perm @use
17a0: 72 31 20 2e 2e 20 40 75 73 65 72 6e 20 70 65 72 r1 .. @usern per
17b0: 6d 69 73 73 69 6f 6e 73 20 2e 2e 0a 20 20 20 20 missions ...
17c0: 5c 47 20 70 65 72 6d 3a 20 43 68 61 6e 67 65 20 \G perm: Change
17d0: 6f 72 20 73 65 74 20 70 65 72 6d 69 73 73 69 6f or set permissio
17e0: 6e 73 2e 20 70 65 72 6d 69 73 73 69 6f 6e 20 73 ns. permission s
17f0: 74 61 72 74 73 20 77 69 74 68 0a 20 20 20 20 5c tarts with. \
1800: 47 20 70 65 72 6d 3a 20 2b 20 66 6f 72 20 61 64 G perm: + for ad
1810: 64 69 6e 67 20 70 65 72 6d 69 73 73 69 6f 6e 73 ding permissions
1820: 0a 20 20 20 20 5c 47 20 70 65 72 6d 3a 20 2d 20 . \G perm: -
1830: 66 6f 72 20 74 61 6b 69 6e 67 20 61 77 61 79 20 for taking away
1840: 70 65 72 6d 69 73 73 69 6f 6e 73 0a 20 20 20 20 permissions.
1850: 5c 47 20 70 65 72 6d 3a 20 3d 20 73 65 74 73 20 \G perm: = sets
1860: 64 65 66 61 75 6c 74 73 2c 20 61 64 64 20 6f 72 defaults, add or
1870: 20 73 75 62 74 72 61 63 74 20 70 65 72 6d 69 73 subtract permis
1880: 73 69 6f 6e 73 20 61 66 74 65 72 77 61 72 64 73 sions afterwards
1890: 0a 20 20 20 20 5c 47 20 70 65 72 6d 3a 20 6e 6f . \G perm: no
18a0: 20 70 72 65 66 69 78 20 66 6f 72 20 73 65 74 74 prefix for sett
18b0: 69 6e 67 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 ing permissions
18c0: 65 78 61 63 74 6c 79 0a 20 20 20 20 5c 47 20 70 exactly. \G p
18d0: 65 72 6d 3a 20 63 20 6f 6e 6e 65 63 74 20 20 2d erm: c onnect -
18e0: 20 61 6c 6c 6f 77 73 20 63 6f 6e 6e 65 63 74 69 allows connecti
18f0: 6f 6e 73 0a 20 20 20 20 5c 47 20 70 65 72 6d 3a ons. \G perm:
1900: 20 62 20 6c 6f 63 6b 65 64 20 20 2d 20 64 65 6e b locked - den
1910: 69 65 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a ies connections.
1920: 20 20 20 20 5c 47 20 70 65 72 6d 3a 20 64 20 68 \G perm: d h
1930: 74 20 20 20 20 20 20 2d 20 44 48 54 20 72 65 61 t - DHT rea
1940: 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 0a 20 d/write access.
1950: 20 20 20 5c 47 20 70 65 72 6d 3a 20 6d 20 73 67 \G perm: m sg
1960: 20 20 20 20 20 20 2d 20 63 61 6e 20 73 65 6e 64 - can send
1970: 20 6d 65 73 73 61 67 65 73 0a 20 20 20 20 5c 47 messages. \G
1980: 20 70 65 72 6d 3a 20 72 20 65 61 64 20 20 20 20 perm: r ead
1990: 20 2d 20 61 6c 6c 6f 77 20 74 6f 20 72 65 61 64 - allow to read
19a0: 20 66 69 6c 65 73 0a 20 20 20 20 5c 47 20 70 65 files. \G pe
19b0: 72 6d 3a 20 77 20 72 69 74 65 20 20 20 20 2d 20 rm: w rite -
19c0: 61 6c 6c 6f 77 20 74 6f 20 77 72 69 74 65 20 66 allow to write f
19d0: 69 6c 65 73 0a 20 20 20 20 5c 47 20 70 65 72 6d iles. \G perm
19e0: 3a 20 6e 20 61 6d 65 20 20 20 20 20 2d 20 61 6c : n ame - al
19f0: 6c 6f 77 20 74 6f 20 61 63 63 65 73 73 20 66 69 low to access fi
1a00: 6c 65 20 62 79 20 6e 61 6d 65 0a 20 20 20 20 5c le by name. \
1a10: 47 20 70 65 72 6d 3a 20 68 20 61 73 68 20 20 20 G perm: h ash
1a20: 20 20 2d 20 61 6c 6c 6f 77 20 74 6f 20 61 63 63 - allow to acc
1a30: 65 73 73 20 66 69 6c 65 20 62 79 20 68 61 73 68 ess file by hash
1a40: 0a 20 20 20 20 5c 47 20 70 65 72 6d 3a 20 73 20 . \G perm: s
1a50: 6f 63 6b 65 74 20 20 20 2d 20 61 6c 6c 6f 77 20 ocket - allow
1a60: 74 6f 20 61 63 63 65 73 73 20 73 6f 63 6b 65 74 to access socket
1a70: 73 20 28 56 50 4e 29 0a 20 20 20 20 5c 47 20 70 s (VPN). \G p
1a80: 65 72 6d 3a 20 74 20 65 72 6d 69 6e 61 6c 20 2d erm: t erminal -
1a90: 20 61 6c 6c 6f 77 20 74 6f 20 61 63 63 65 73 73 allow to access
1aa0: 20 74 65 72 6d 69 6e 61 6c 0a 20 20 20 20 5c 47 terminal. \G
1ab0: 20 70 65 72 6d 3a 20 76 20 74 65 72 6d 73 65 72 perm: v termser
1ac0: 56 65 72 20 2d 20 61 6c 6c 6f 77 20 74 6f 20 61 Ver - allow to a
1ad0: 63 63 65 73 73 20 74 65 72 6d 73 65 72 76 65 72 ccess termserver
1ae0: 0a 20 20 20 20 5c 47 20 70 65 72 6d 3a 20 79 20 . \G perm: y
1af0: 73 59 6e 63 20 20 20 20 2d 20 61 6c 6c 6f 77 20 sYnc - allow
1b00: 74 6f 20 73 79 6e 63 0a 20 20 20 20 5c 47 20 70 to sync. \G p
1b10: 65 72 6d 3a 20 69 20 6e 64 69 72 65 63 74 20 2d erm: i ndirect -
1b20: 20 64 65 6e 79 20 64 69 72 65 63 74 20 63 6f 6e deny direct con
1b30: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 3f 67 65 74 nection. ?get
1b40: 2d 6d 65 0a 20 20 20 20 42 45 47 49 4e 20 20 63 -me. BEGIN c
1b50: 68 61 74 2d 6b 65 79 73 20 24 5b 5d 6f 66 66 20 hat-keys $[]off
1b60: 20 40 6e 69 63 6b 73 3e 63 68 61 74 20 3f 6e 65 @nicks>chat ?ne
1b70: 78 74 61 72 67 20 57 48 49 4c 45 20 20 3e 70 65 xtarg WHILE >pe
1b80: 72 6d 0a 09 20 20 20 20 63 68 61 74 2d 6b 65 79 rm.. chat-key
1b90: 73 20 5b 3a 20 6b 65 79 7c 20 6b 65 79 2d 65 78 s [: key| key-ex
1ba0: 69 73 74 3f 20 3f 64 75 70 2d 49 46 20 2e 61 70 ist? ?dup-IF .ap
1bb0: 70 6c 79 2d 70 65 72 6d 69 73 73 69 6f 6e 20 54 ply-permission T
1bc0: 48 45 4e 20 3b 5d 0a 09 20 20 20 20 24 5b 5d 6d HEN ;].. $[]m
1bd0: 61 70 20 32 64 72 6f 70 20 20 52 45 50 45 41 54 ap 2drop REPEAT
1be0: 0a 20 20 20 20 73 61 76 65 2d 6b 65 79 73 20 3b . save-keys ;
1bf0: 0a 0a 3a 20 67 72 6f 75 70 20 28 20 2d 2d 20 29 ..: group ( -- )
1c00: 0a 20 20 20 20 5c 55 20 67 72 6f 75 70 20 40 75 . \U group @u
1c10: 73 65 72 31 20 2e 2e 20 40 75 73 65 72 6e 20 5b ser1 .. @usern [
1c20: 2b 2d 5d 67 72 6f 75 70 31 20 2e 2e 20 5b 2b 2d +-]group1 .. [+-
1c30: 5d 67 72 6f 75 70 6e 20 2e 2e 0a 20 20 20 20 5c ]groupn ... \
1c40: 47 20 67 72 6f 75 70 3a 20 53 65 74 2c 20 61 64 G group: Set, ad
1c50: 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 67 72 d or remove a gr
1c60: 6f 75 70 20 66 72 6f 6d 20 61 20 73 65 74 20 6f oup from a set o
1c70: 66 20 75 73 65 72 73 0a 20 20 20 20 3f 67 65 74 f users. ?get
1c80: 2d 6d 65 0a 20 20 20 20 42 45 47 49 4e 20 20 63 -me. BEGIN c
1c90: 68 61 74 2d 6b 65 79 73 20 24 5b 5d 6f 66 66 20 hat-keys $[]off
1ca0: 20 40 6e 69 63 6b 73 3e 63 68 61 74 0a 09 42 45 @nicks>chat..BE
1cb0: 47 49 4e 20 20 3f 6e 65 78 74 61 72 67 20 20 57 GIN ?nextarg W
1cc0: 48 49 4c 45 20 20 6f 76 65 72 20 63 40 20 27 40 HILE over c@ '@
1cd0: 27 20 3c 3e 20 20 57 48 49 4c 45 0a 09 09 20 20 ' <> WHILE...
1ce0: 20 20 63 68 61 74 2d 6b 65 79 73 20 5b 3a 20 6b chat-keys [: k
1cf0: 65 79 7c 20 6b 65 79 2d 65 78 69 73 74 3f 20 3f ey| key-exist? ?
1d00: 64 75 70 2d 49 46 0a 09 09 09 20 20 3e 6f 20 32 dup-IF.... >o 2
1d10: 64 75 70 20 61 70 70 6c 79 2d 67 72 6f 75 70 20 dup apply-group
1d20: 6f 3e 20 20 54 48 45 4e 20 3b 5d 0a 09 09 20 20 o> THEN ;]...
1d30: 20 20 24 5b 5d 6d 61 70 20 32 64 72 6f 70 20 20 $[]map 2drop
1d40: 52 45 50 45 41 54 20 20 32 64 72 6f 70 20 20 54 REPEAT 2drop T
1d50: 48 45 4e 0a 20 20 20 20 3f 6e 65 78 74 61 72 67 HEN. ?nextarg
1d60: 20 30 3d 20 55 4e 54 49 4c 0a 20 20 20 20 73 61 0= UNTIL. sa
1d70: 76 65 2d 6b 65 79 73 20 3b 0a 0a 3a 20 63 68 67 ve-keys ;..: chg
1d80: 72 6f 75 70 20 28 20 2d 2d 20 29 0a 20 20 20 20 roup ( -- ).
1d90: 5c 55 20 63 68 67 72 6f 75 70 20 67 72 6f 75 70 \U chgroup group
1da0: 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 20 20 20 permissions.
1db0: 20 5c 47 20 63 68 67 72 6f 75 70 3a 20 41 64 64 \G chgroup: Add
1dc0: 20 6f 72 20 63 68 61 6e 67 65 20 61 20 67 72 6f or change a gro
1dd0: 75 70 0a 20 20 20 20 3f 6e 65 78 74 61 72 67 20 up. ?nextarg
1de0: 49 46 20 20 32 64 75 70 20 3e 67 72 6f 75 70 2d IF 2dup >group-
1df0: 69 64 20 20 64 75 70 20 30 3c 20 49 46 20 20 64 id dup 0< IF d
1e00: 72 6f 70 0a 09 20 20 20 20 5b 3a 20 23 30 2e 20 rop.. [: #0.
1e10: 7b 20 64 5e 20 73 6c 6f 74 20 7d 20 73 6c 6f 74 { d^ slot } slot
1e20: 20 32 20 63 65 6c 6c 73 20 74 79 70 65 20 74 79 2 cells type ty
1e30: 70 65 20 3b 5d 20 24 74 6d 70 20 67 72 6f 75 70 pe ;] $tmp group
1e40: 73 5b 5d 20 24 2b 5b 5d 21 0a 09 20 20 20 20 67 s[] $+[]!.. g
1e50: 72 6f 75 70 73 5b 5d 20 24 5b 5d 23 20 31 2d 20 roups[] $[]# 1-
1e60: 3e 72 20 20 45 4c 53 45 20 20 3e 72 20 32 64 72 >r ELSE >r 2dr
1e70: 6f 70 20 20 54 48 45 4e 0a 09 3f 6e 65 78 74 61 op THEN..?nexta
1e80: 72 67 20 49 46 0a 09 20 20 20 20 3e 70 65 72 6d rg IF.. >perm
1e90: 20 72 40 20 67 72 6f 75 70 73 5b 5d 20 24 5b 5d r@ groups[] $[]
1ea0: 40 20 64 72 6f 70 20 32 21 0a 09 20 20 20 20 77 @ drop 2!.. w
1eb0: 72 69 74 65 2d 67 72 6f 75 70 73 20 2e 67 72 6f rite-groups .gro
1ec0: 75 70 73 0a 09 54 48 45 4e 20 20 72 64 72 6f 70 ups..THEN rdrop
1ed0: 0a 20 20 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 6d . THEN ;..: m
1ee0: 76 67 72 6f 75 70 20 28 20 2d 2d 20 29 0a 20 20 vgroup ( -- ).
1ef0: 20 20 5c 55 20 6d 76 67 72 6f 75 70 20 6f 6c 64 \U mvgroup old
1f00: 6e 61 6d 65 31 20 6e 65 77 6e 61 6d 65 31 20 2e name1 newname1 .
1f10: 2e 20 6f 6c 64 6e 61 6d 65 6e 20 6e 65 77 6e 61 . oldnamen newna
1f20: 6d 65 6e 0a 20 20 20 20 5c 47 20 6d 76 67 72 6f men. \G mvgro
1f30: 75 70 3a 20 43 68 61 6e 67 65 20 67 72 6f 75 70 up: Change group
1f40: 27 73 20 6e 61 6d 65 0a 20 20 20 20 42 45 47 49 's name. BEGI
1f50: 4e 20 20 3f 6e 65 78 74 61 72 67 20 20 57 48 49 N ?nextarg WHI
1f60: 4c 45 0a 09 20 20 20 20 3e 67 72 6f 75 70 2d 69 LE.. >group-i
1f70: 64 20 64 75 70 20 30 3c 20 21 21 6e 6f 2d 67 72 d dup 0< !!no-gr
1f80: 6f 75 70 21 21 20 3e 72 20 3f 6e 65 78 74 61 72 oup!! >r ?nextar
1f90: 67 20 20 57 48 49 4c 45 0a 09 09 32 20 63 65 6c g WHILE...2 cel
1fa0: 6c 73 20 72 40 20 67 72 6f 75 70 73 5b 5d 20 24 ls r@ groups[] $
1fb0: 5b 5d 20 24 21 6c 65 6e 0a 09 09 72 3e 20 67 72 [] $!len...r> gr
1fc0: 6f 75 70 73 5b 5d 20 24 5b 5d 2b 21 20 20 52 45 oups[] $[]+! RE
1fd0: 50 45 41 54 20 20 72 64 72 6f 70 20 20 54 48 45 PEAT rdrop THE
1fe0: 4e 0a 20 20 20 20 77 72 69 74 65 2d 67 72 6f 75 N. write-grou
1ff0: 70 73 20 2e 67 72 6f 75 70 73 20 3b 0a 0a 3a 20 ps .groups ;..:
2000: 70 61 73 73 77 64 20 28 20 2d 2d 20 29 0a 20 20 passwd ( -- ).
2010: 20 20 5c 55 20 70 61 73 73 77 64 20 5b 70 77 2d \U passwd [pw-
2020: 6c 65 76 65 6c 5d 0a 20 20 20 20 5c 47 20 70 61 level]. \G pa
2030: 73 73 77 64 3a 20 43 68 61 6e 67 65 20 74 68 65 sswd: Change the
2040: 20 70 61 73 73 77 6f 72 64 20 66 6f 72 20 74 68 password for th
2050: 65 20 73 65 6c 65 63 74 65 64 20 73 65 63 72 65 e selected secre
2060: 74 20 6b 65 79 0a 20 20 20 20 3f 67 65 74 2d 6d t key. ?get-m
2070: 65 20 2b 6e 65 77 70 68 72 61 73 65 20 6b 65 79 e +newphrase key
2080: 3e 64 65 66 61 75 6c 74 0a 20 20 20 20 70 6b 40 >default. pk@
2090: 20 6b 65 79 7c 20 6b 65 79 2d 65 78 69 73 74 3f key| key-exist?
20a0: 20 3f 64 75 70 2d 49 46 20 20 3e 6f 20 3e 73 74 ?dup-IF >o >st
20b0: 6f 72 65 6b 65 79 20 40 20 6b 65 2d 73 74 6f 72 orekey @ ke-stor
20c0: 65 6b 65 79 20 21 0a 09 3f 6e 65 78 74 61 72 67 ekey !..?nextarg
20d0: 20 49 46 20 20 3e 6e 75 6d 62 65 72 20 64 72 6f IF >number dro
20e0: 70 20 30 20 6d 61 78 20 63 6f 6e 66 69 67 3a 70 p 0 max config:p
20f0: 77 2d 6d 61 78 6c 65 76 65 6c 23 20 40 20 6d 69 w-maxlevel# @ mi
2100: 6e 20 20 6b 65 2d 70 77 6c 65 76 65 6c 20 21 20 n ke-pwlevel !
2110: 20 54 48 45 4e 20 20 6f 3e 0a 09 73 61 76 65 2d THEN o>..save-
2120: 6b 65 79 73 0a 20 20 20 20 54 48 45 4e 20 3b 0a keys. THEN ;.
2130: 0a 3a 20 6e 69 63 6b 20 28 20 2d 2d 20 29 0a 20 .: nick ( -- ).
2140: 20 20 20 5c 55 20 6e 69 63 6b 20 6e 65 77 6e 69 \U nick newni
2150: 63 6b 0a 20 20 20 20 5c 47 20 6e 69 63 6b 3a 20 ck. \G nick:
2160: 43 68 61 6e 67 65 20 79 6f 75 72 20 6e 69 63 6b Change your nick
2170: 20 74 6f 20 3c 6e 65 77 6e 69 63 6b 3e 0a 20 20 to <newnick>.
2180: 20 20 3f 67 65 74 2d 6d 65 20 3f 6e 65 78 74 61 ?get-me ?nexta
2190: 72 67 20 49 46 20 20 70 6b 40 20 6b 65 79 7c 20 rg IF pk@ key|
21a0: 6b 65 79 2d 65 78 69 73 74 3f 20 3f 64 75 70 2d key-exist? ?dup-
21b0: 49 46 0a 09 20 20 20 20 3e 6f 20 6b 65 2d 6e 69 IF.. >o ke-ni
21c0: 63 6b 20 24 21 20 6b 65 79 2d 73 69 67 6e 20 6f ck $! key-sign o
21d0: 3e 20 73 61 76 65 2d 6b 65 79 73 20 6b 65 79 6c > save-keys keyl
21e0: 69 73 74 0a 09 45 4c 53 45 20 20 32 64 72 6f 70 ist..ELSE 2drop
21f0: 20 20 54 48 45 4e 20 20 54 48 45 4e 20 3b 0a 0a THEN THEN ;..
2200: 3a 20 70 65 74 20 28 20 2d 2d 20 29 0a 20 20 20 : pet ( -- ).
2210: 20 5c 55 20 70 65 74 20 6e 69 63 6b 31 7c 70 65 \U pet nick1|pe
2220: 74 31 20 70 65 74 6e 65 77 31 20 2e 2e 20 6e 69 t1 petnew1 .. ni
2230: 63 6b 6e 7c 70 65 74 6e 20 70 65 74 6e 65 77 6e ckn|petn petnewn
2240: 0a 20 20 20 20 5c 47 20 70 65 74 3a 20 41 64 64 . \G pet: Add
2250: 20 61 20 6e 65 77 20 70 65 74 6e 61 6d 65 20 74 a new petname t
2260: 6f 20 65 78 69 73 74 69 6e 67 20 3c 6e 69 63 6b o existing <nick
2270: 3e 20 6f 72 20 3c 70 65 74 3e 0a 20 20 20 20 3f > or <pet>. ?
2280: 67 65 74 2d 6d 65 0a 20 20 20 20 5b 3a 20 6e 69 get-me. [: ni
2290: 63 6b 2d 6b 65 79 20 64 75 70 20 30 3d 20 49 46 ck-key dup 0= IF
22a0: 20 20 64 72 6f 70 20 45 58 49 54 20 20 54 48 45 drop EXIT THE
22b0: 4e 0a 20 20 20 20 20 20 3e 6f 20 3f 6e 65 78 74 N. >o ?next
22c0: 61 72 67 20 49 46 20 20 6b 65 2d 70 65 74 73 5b arg IF ke-pets[
22d0: 5d 20 24 2b 5b 5d 21 20 70 65 74 21 20 20 54 48 ] $+[]! pet! TH
22e0: 45 4e 20 20 6f 3e 20 3b 5d 20 61 72 67 2d 6c 6f EN o> ;] arg-lo
22f0: 6f 70 0a 20 20 20 20 73 61 76 65 2d 6b 65 79 73 op. save-keys
2300: 20 6b 65 79 6c 69 73 74 20 3b 0a 0a 3a 20 70 65 keylist ;..: pe
2310: 74 2d 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 t- ( -- ). \U
2320: 20 70 65 74 2d 20 70 65 74 31 20 2e 2e 20 70 65 pet- pet1 .. pe
2330: 74 6e 0a 20 20 20 20 5c 47 20 70 65 74 2d 3a 20 tn. \G pet-:
2340: 72 65 6d 6f 76 65 20 70 65 74 20 6e 61 6d 65 0a remove pet name.
2350: 20 20 20 20 3f 67 65 74 2d 6d 65 0a 20 20 20 20 ?get-me.
2360: 5b 3a 20 32 64 75 70 20 6e 69 63 6b 2d 6b 65 79 [: 2dup nick-key
2370: 20 64 75 70 20 30 3d 20 49 46 20 20 64 72 6f 70 dup 0= IF drop
2380: 20 32 64 72 6f 70 20 20 45 58 49 54 20 20 54 48 2drop EXIT TH
2390: 45 4e 0a 20 20 20 20 20 20 3e 6f 20 6b 65 2d 70 EN. >o ke-p
23a0: 65 74 73 5b 5d 20 5b 3a 20 32 6f 76 65 72 20 73 ets[] [: 2over s
23b0: 74 72 3d 20 30 3d 20 3b 5d 20 24 5b 5d 66 69 6c tr= 0= ;] $[]fil
23c0: 74 65 72 20 32 64 72 6f 70 20 6f 20 6f 3e 0a 20 ter 2drop o o>.
23d0: 20 20 20 20 20 6c 61 73 74 23 20 63 65 6c 6c 2b last# cell+
23e0: 20 64 65 6c 24 63 65 6c 6c 0a 20 20 20 20 20 20 del$cell.
23f0: 6c 61 73 74 23 20 63 65 6c 6c 2b 20 24 40 6c 65 last# cell+ $@le
2400: 6e 20 30 3d 20 49 46 20 20 6c 61 73 74 23 20 62 n 0= IF last# b
2410: 75 63 6b 65 74 2d 6f 66 66 20 20 54 48 45 4e 20 ucket-off THEN
2420: 3b 5d 20 61 72 67 2d 6c 6f 6f 70 0a 20 20 20 20 ;] arg-loop.
2430: 73 61 76 65 2d 6b 65 79 73 20 3f 63 72 20 6b 65 save-keys ?cr ke
2440: 79 6c 69 73 74 20 3b 0a 0a 73 79 6e 6f 6e 79 6d ylist ;..synonym
2450: 20 69 6e 6b 65 79 20 6b 65 79 69 6e 0a 73 79 6e inkey keyin.syn
2460: 6f 6e 79 6d 20 6f 75 74 6b 65 79 20 6b 65 79 6f onym outkey keyo
2470: 75 74 0a 73 79 6e 6f 6e 79 6d 20 67 65 6e 6b 65 ut.synonym genke
2480: 79 20 6b 65 79 67 65 6e 0a 73 79 6e 6f 6e 79 6d y keygen.synonym
2490: 20 6c 69 73 74 6b 65 79 20 6b 65 79 6c 69 73 74 listkey keylist
24a0: 0a 73 79 6e 6f 6e 79 6d 20 71 72 6b 65 79 20 6b .synonym qrkey k
24b0: 65 79 71 72 0a 73 79 6e 6f 6e 79 6d 20 73 65 61 eyqr.synonym sea
24c0: 72 63 68 6b 65 79 20 6b 65 79 73 65 61 72 63 68 rchkey keysearch
24d0: 0a 73 79 6e 6f 6e 79 6d 20 73 63 61 6e 6b 65 79 .synonym scankey
24e0: 20 6b 65 79 73 63 61 6e 0a 73 79 6e 6f 6e 79 6d keyscan.synonym
24f0: 20 71 72 73 63 61 6e 20 6b 65 79 73 63 61 6e 0a qrscan keyscan.
2500: 73 79 6e 6f 6e 79 6d 20 73 63 61 6e 71 72 20 6b synonym scanqr k
2510: 65 79 73 63 61 6e 0a 0a 5c 20 65 6e 63 72 79 70 eyscan..\ encryp
2520: 74 69 6f 6e 20 73 75 62 63 6f 6d 6d 61 6e 64 73 tion subcommands
2530: 0a 0a 3a 20 2d 74 68 72 65 65 66 69 73 68 20 28 ..: -threefish (
2540: 20 2d 2d 20 29 0a 20 20 20 20 5c 4f 20 2d 74 68 -- ). \O -th
2550: 72 65 65 66 69 73 68 0a 20 20 20 20 5c 47 20 2d reefish. \G -
2560: 74 68 72 65 65 66 69 73 68 3a 20 75 73 65 20 74 threefish: use t
2570: 68 72 65 65 66 69 73 68 20 65 6e 63 72 79 70 74 hreefish encrypt
2580: 69 6f 6e 20 66 6f 72 20 76 61 75 6c 74 73 0a 20 ion for vaults.
2590: 20 20 20 65 6e 63 2d 74 68 72 65 65 66 69 73 68 enc-threefish
25a0: 20 6e 65 78 74 2d 63 6d 64 20 3b 0a 3a 20 2d 6b next-cmd ;.: -k
25b0: 65 63 63 61 6b 20 28 20 2d 2d 20 29 0a 20 20 20 eccak ( -- ).
25c0: 20 5c 4f 20 2d 6b 65 63 63 61 6b 0a 20 20 20 20 \O -keccak.
25d0: 5c 47 20 2d 6b 65 63 63 61 6b 3a 20 75 73 65 20 \G -keccak: use
25e0: 6b 65 63 63 61 6b 20 65 6e 63 72 79 70 74 69 6f keccak encryptio
25f0: 6e 20 66 6f 72 20 76 61 75 6c 74 73 0a 20 20 20 n for vaults.
2600: 20 65 6e 63 2d 6b 65 63 63 61 6b 20 6e 65 78 74 enc-keccak next
2610: 2d 63 6d 64 20 3b 0a 0a 3a 20 65 6e 63 20 28 20 -cmd ;..: enc (
2620: 2d 2d 20 29 0a 20 20 20 20 5c 55 20 65 6e 63 20 -- ). \U enc
2630: 40 75 73 65 72 31 20 2e 2e 20 40 75 73 65 72 6e @user1 .. @usern
2640: 20 66 69 6c 65 31 20 2e 2e 20 66 69 6c 65 6e 0a file1 .. filen.
2650: 20 20 20 20 5c 47 20 65 6e 63 3a 20 65 6e 63 72 \G enc: encr
2660: 79 70 74 20 66 69 6c 65 73 20 66 6f 72 20 74 68 ypt files for th
2670: 65 20 6c 69 73 74 65 64 20 75 73 65 72 73 0a 20 e listed users.
2680: 20 20 20 3f 67 65 74 2d 6d 65 20 61 72 67 73 3e ?get-me args>
2690: 6b 65 79 6c 69 73 74 0a 20 20 20 20 5b 3a 20 6b keylist. [: k
26a0: 65 79 2d 6c 69 73 74 20 65 6e 63 72 79 70 74 2d ey-list encrypt-
26b0: 66 69 6c 65 20 3b 5d 20 61 72 67 2d 6c 6f 6f 70 file ;] arg-loop
26c0: 20 3b 0a 3a 20 64 65 63 20 28 20 2d 2d 20 29 0a ;.: dec ( -- ).
26d0: 20 20 20 20 5c 55 20 64 65 63 20 66 69 6c 65 31 \U dec file1
26e0: 20 2e 2e 20 66 69 6c 65 6e 0a 20 20 20 20 5c 47 .. filen. \G
26f0: 20 64 65 63 3a 20 64 65 63 72 79 70 74 20 66 69 dec: decrypt fi
2700: 6c 65 73 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20 les. ?get-me
2710: 5b 3a 20 64 65 63 72 79 70 74 2d 66 69 6c 65 20 [: decrypt-file
2720: 3b 5d 20 61 72 67 2d 6c 6f 6f 70 20 3b 0a 3a 20 ;] arg-loop ;.:
2730: 63 61 74 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c cat ( -- ). \
2740: 55 20 63 61 74 20 66 69 6c 65 31 20 2e 2e 20 66 U cat file1 .. f
2750: 69 6c 65 6e 0a 20 20 20 20 5c 47 20 63 61 74 3a ilen. \G cat:
2760: 20 63 61 74 20 65 6e 63 72 79 70 74 65 64 20 66 cat encrypted f
2770: 69 6c 65 73 20 74 6f 20 73 74 64 6f 75 74 0a 20 iles to stdout.
2780: 20 20 20 3f 63 72 20 76 61 75 6c 74 3e 6f 75 74 ?cr vault>out
2790: 20 64 65 63 20 76 61 75 6c 74 3e 66 69 6c 65 20 dec vault>file
27a0: 3b 0a 0a 5c 20 68 61 73 68 2b 73 69 67 6e 61 74 ;..\ hash+signat
27b0: 75 72 65 0a 0a 30 20 77 61 72 6e 69 6e 67 73 20 ure..0 warnings
27c0: 21 40 20 5c 20 74 68 65 73 65 20 6f 70 74 69 6f !@ \ these optio
27d0: 6e 73 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6e 75 6d ns look like num
27e0: 62 65 72 73 2c 20 64 6f 6e 27 74 20 77 61 72 6e bers, don't warn
27f0: 0a 3a 20 2d 32 35 36 20 28 20 2d 2d 20 29 0a 20 .: -256 ( -- ).
2800: 20 20 20 5c 4f 20 2d 32 35 36 0a 20 20 20 20 5c \O -256. \
2810: 47 20 2d 32 35 36 3a 20 73 65 74 20 68 61 73 68 G -256: set hash
2820: 20 6f 75 74 70 75 74 20 74 6f 20 32 35 36 20 62 output to 256 b
2830: 69 74 73 20 28 64 65 66 61 75 6c 74 29 0a 20 20 its (default).
2840: 20 20 24 32 30 20 74 6f 20 68 61 73 68 2d 73 69 $20 to hash-si
2850: 7a 65 23 20 6e 65 78 74 2d 63 6d 64 20 3b 0a 0a ze# next-cmd ;..
2860: 3a 20 2d 35 31 32 20 28 20 2d 2d 20 29 0a 20 20 : -512 ( -- ).
2870: 20 20 5c 4f 20 2d 35 31 32 0a 20 20 20 20 5c 47 \O -512. \G
2880: 20 2d 35 31 32 3a 20 73 65 74 20 68 61 73 68 20 -512: set hash
2890: 6f 75 74 70 75 74 20 74 6f 20 35 31 32 20 62 69 output to 512 bi
28a0: 74 73 0a 20 20 20 20 24 34 30 20 74 6f 20 68 61 ts. $40 to ha
28b0: 73 68 2d 73 69 7a 65 23 20 6e 65 78 74 2d 63 6d sh-size# next-cm
28c0: 64 20 3b 0a 77 61 72 6e 69 6e 67 73 20 21 0a 0a d ;.warnings !..
28d0: 3a 20 68 61 73 68 20 28 20 2d 2d 20 29 0a 20 20 : hash ( -- ).
28e0: 20 20 5c 55 20 68 61 73 68 20 66 69 6c 65 31 20 \U hash file1
28f0: 2e 2e 20 66 69 6c 65 6e 0a 20 20 20 20 5c 47 20 .. filen. \G
2900: 68 61 73 68 3a 20 68 61 73 68 20 74 68 65 20 66 hash: hash the f
2910: 69 6c 65 73 20 61 6e 64 20 70 72 69 6e 74 20 69 iles and print i
2920: 74 20 62 61 73 65 38 35 0a 20 20 20 20 5c 47 20 t base85. \G
2930: 68 61 73 68 3a 20 75 73 65 20 2d 32 35 36 20 6f hash: use -256 o
2940: 72 20 2d 35 31 32 20 74 6f 20 73 65 6c 65 63 74 r -512 to select
2950: 20 68 61 73 68 20 73 69 7a 65 0a 20 20 20 20 5c hash size. \
2960: 47 20 68 61 73 68 3a 20 75 73 65 20 2d 74 68 72 G hash: use -thr
2970: 65 65 66 69 73 68 20 6f 72 20 2d 6b 65 63 63 61 eefish or -kecca
2980: 6b 20 74 6f 20 73 65 6c 65 63 74 20 68 61 73 68 k to select hash
2990: 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20 20 20 3f algorithm. ?
29a0: 63 72 20 65 6e 63 2d 6d 6f 64 65 20 40 20 38 20 cr enc-mode @ 8
29b0: 72 73 68 69 66 74 20 24 46 46 20 61 6e 64 20 3e rshift $FF and >
29c0: 63 72 79 70 74 0a 20 20 20 20 5b 3a 20 32 64 75 crypt. [: 2du
29d0: 70 20 68 61 73 68 2d 66 69 6c 65 20 2e 38 35 69 p hash-file .85i
29e0: 6e 66 6f 20 73 70 61 63 65 20 74 79 70 65 20 63 nfo space type c
29f0: 72 20 3b 5d 20 61 72 67 2d 6c 6f 6f 70 20 30 20 r ;] arg-loop 0
2a00: 3e 63 72 79 70 74 20 3b 0a 0a 3a 20 68 61 73 68 >crypt ;..: hash
2a10: 2d 62 6c 6f 63 6b 73 20 28 20 2d 2d 20 29 0a 20 -blocks ( -- ).
2a20: 20 20 20 5c 55 20 68 61 73 68 2d 62 6c 6f 63 6b \U hash-block
2a30: 73 20 66 69 6c 65 31 20 2e 2e 20 66 69 6c 65 6e s file1 .. filen
2a40: 0a 20 20 20 20 5c 47 20 68 61 73 68 3a 20 68 61 . \G hash: ha
2a50: 73 68 20 74 68 65 20 66 69 6c 65 73 20 69 6e 20 sh the files in
2a60: 62 6c 6f 63 6b 73 20 6f 66 20 31 6b 20 61 6e 64 blocks of 1k and
2a70: 20 70 72 69 6e 74 20 69 74 20 62 61 73 65 38 35 print it base85
2a80: 0a 20 20 20 20 5c 47 20 68 61 73 68 3a 20 75 73 . \G hash: us
2a90: 65 20 2d 32 35 36 20 6f 72 20 2d 35 31 32 20 74 e -256 or -512 t
2aa0: 6f 20 73 65 6c 65 63 74 20 68 61 73 68 20 73 69 o select hash si
2ab0: 7a 65 0a 20 20 20 20 5c 47 20 68 61 73 68 3a 20 ze. \G hash:
2ac0: 75 73 65 20 2d 74 68 72 65 65 66 69 73 68 20 6f use -threefish o
2ad0: 72 20 2d 6b 65 63 63 61 6b 20 74 6f 20 73 65 6c r -keccak to sel
2ae0: 65 63 74 20 68 61 73 68 20 61 6c 67 6f 72 69 74 ect hash algorit
2af0: 68 6d 0a 20 20 20 20 3f 63 72 20 65 6e 63 2d 6d hm. ?cr enc-m
2b00: 6f 64 65 20 40 20 38 20 72 73 68 69 66 74 20 24 ode @ 8 rshift $
2b10: 46 46 20 61 6e 64 20 3e 63 72 79 70 74 0a 20 20 FF and >crypt.
2b20: 20 20 5b 3a 20 32 64 75 70 20 74 79 70 65 20 2e [: 2dup type .
2b30: 22 20 3a 22 20 63 72 20 68 61 73 68 2d 66 69 6c " :" cr hash-fil
2b40: 65 2d 62 6c 6f 63 6b 73 20 3b 5d 20 61 72 67 2d e-blocks ;] arg-
2b50: 6c 6f 6f 70 20 30 20 3e 63 72 79 70 74 20 3b 0a loop 0 >crypt ;.
2b60: 0a 3a 20 62 64 69 66 66 32 20 28 20 2d 2d 20 29 .: bdiff2 ( -- )
2b70: 0a 20 20 20 20 5c 55 20 62 64 69 66 66 32 20 66 . \U bdiff2 f
2b80: 69 6c 65 31 20 66 69 6c 65 32 20 2e 2e 20 66 69 ile1 file2 .. fi
2b90: 6c 65 6e 31 20 66 69 6c 65 6e 32 0a 20 20 20 20 len1 filen2.
2ba0: 5c 47 20 62 64 69 66 66 32 3a 20 64 69 66 66 73 \G bdiff2: diffs
2bb0: 20 74 77 6f 20 66 69 6c 65 73 20 62 69 6e 61 72 two files binar
2bc0: 79 20 61 6e 64 20 64 69 73 70 6c 61 79 73 20 61 y and displays a
2bd0: 20 6e 75 6d 65 72 69 63 20 73 75 6d 6d 61 72 79 numeric summary
2be0: 0a 20 20 20 20 5c 47 20 62 64 69 66 66 32 3a 20 . \G bdiff2:
2bf0: 6f 66 20 68 6f 77 20 74 68 65 79 20 64 69 66 66 of how they diff
2c00: 65 72 0a 20 20 20 20 42 45 47 49 4e 20 20 3f 6e er. BEGIN ?n
2c10: 65 78 74 61 72 67 20 20 57 48 49 4c 45 20 20 3f extarg WHILE ?
2c20: 6e 65 78 74 61 72 67 20 20 49 46 0a 09 09 32 6f nextarg IF...2o
2c30: 76 65 72 20 74 79 70 65 20 2e 22 20 2e 2e 22 20 ver type ." .."
2c40: 32 64 75 70 20 74 79 70 65 20 2e 22 20 3a 20 22 2dup type ." : "
2c50: 0a 09 09 62 64 65 6c 74 61 20 32 64 72 6f 70 20 ...bdelta 2drop
2c60: 62 66 69 6c 65 31 24 20 62 64 65 6c 74 61 24 20 bfile1$ bdelta$
2c70: 63 6f 6c 6f 72 2d 62 70 61 74 63 68 23 20 63 72 color-bpatch# cr
2c80: 0a 09 20 20 20 20 45 4c 53 45 20 20 32 64 72 6f .. ELSE 2dro
2c90: 70 20 20 54 48 45 4e 0a 20 20 20 20 52 45 50 45 p THEN. REPE
2ca0: 41 54 20 3b 0a 0a 3a 20 64 69 66 66 32 20 28 20 AT ;..: diff2 (
2cb0: 2d 2d 20 29 0a 20 20 20 20 5c 55 20 64 69 66 66 -- ). \U diff
2cc0: 32 20 66 69 6c 65 31 20 66 69 6c 65 32 20 2e 2e 2 file1 file2 ..
2cd0: 20 66 69 6c 65 6e 31 20 66 69 6c 65 6e 32 0a 20 filen1 filen2.
2ce0: 20 20 20 5c 47 20 64 69 66 66 32 3a 20 64 69 66 \G diff2: dif
2cf0: 66 73 20 74 77 6f 20 74 65 78 74 20 66 69 6c 65 fs two text file
2d00: 73 20 61 6e 64 20 64 69 73 70 6c 61 79 73 20 61 s and displays a
2d10: 20 6e 75 6d 65 72 69 63 20 73 75 6d 6d 61 72 79 numeric summary
2d20: 0a 20 20 20 20 5c 47 20 64 69 66 66 32 3a 20 6f . \G diff2: o
2d30: 66 20 68 6f 77 20 74 68 65 79 20 64 69 66 66 65 f how they diffe
2d40: 72 0a 20 20 20 20 42 45 47 49 4e 20 20 3f 6e 65 r. BEGIN ?ne
2d50: 78 74 61 72 67 20 20 57 48 49 4c 45 20 20 3f 6e xtarg WHILE ?n
2d60: 65 78 74 61 72 67 20 20 49 46 0a 09 09 2e 22 20 extarg IF...."
2d70: 2d 2d 2d 20 22 20 32 6f 76 65 72 20 74 79 70 65 --- " 2over type
2d80: 20 63 72 20 2e 22 20 2b 2b 2b 20 22 20 32 64 75 cr ." +++ " 2du
2d90: 70 20 74 79 70 65 20 2e 22 20 3a 22 20 63 72 0a p type ." :" cr.
2da0: 09 09 62 64 65 6c 74 61 20 32 64 72 6f 70 20 62 ..bdelta 2drop b
2db0: 66 69 6c 65 31 24 20 62 64 65 6c 74 61 24 20 63 file1$ bdelta$ c
2dc0: 6f 6c 6f 72 2d 62 70 61 74 63 68 24 32 20 63 72 olor-bpatch$2 cr
2dd0: 0a 09 20 20 20 20 45 4c 53 45 20 20 32 64 72 6f .. ELSE 2dro
2de0: 70 20 20 54 48 45 4e 0a 20 20 20 20 52 45 50 45 p THEN. REPE
2df0: 41 54 20 3b 0a 0a 3a 20 73 69 67 6e 20 28 20 2d AT ;..: sign ( -
2e00: 2d 20 29 0a 20 20 20 20 5c 55 20 73 69 67 6e 20 - ). \U sign
2e10: 66 69 6c 65 31 20 2e 2e 20 66 69 6c 65 6e 0a 20 file1 .. filen.
2e20: 20 20 20 5c 47 20 73 69 67 6e 3a 20 63 72 65 61 \G sign: crea
2e30: 74 65 20 64 65 74 61 63 68 65 64 20 2e 73 32 6f te detached .s2o
2e40: 20 73 69 67 6e 61 74 75 72 65 73 20 66 6f 72 20 signatures for
2e50: 61 6c 6c 20 66 69 6c 65 73 0a 20 20 20 20 3f 67 all files. ?g
2e60: 65 74 2d 6d 65 20 6e 6f 77 3e 6e 65 76 65 72 0a et-me now>never.
2e70: 20 20 20 20 5b 3a 20 32 64 75 70 20 68 61 73 68 [: 2dup hash
2e80: 2d 66 69 6c 65 20 32 64 72 6f 70 0a 20 20 20 20 -file 2drop.
2e90: 20 20 5b 3a 20 74 79 70 65 20 2e 22 20 2e 73 32 [: type ." .s2
2ea0: 6f 22 20 3b 5d 20 24 74 6d 70 20 77 2f 6f 20 63 o" ;] $tmp w/o c
2eb0: 72 65 61 74 65 2d 66 69 6c 65 20 74 68 72 6f 77 reate-file throw
2ec0: 20 3e 72 0a 20 20 20 20 20 20 5b 3a 20 2e 70 6b >r. [: .pk
2ed0: 20 2e 73 69 67 20 3b 5d 20 24 74 6d 70 20 72 40 .sig ;] $tmp r@
2ee0: 20 77 72 69 74 65 2d 66 69 6c 65 20 72 3e 20 63 write-file r> c
2ef0: 6c 6f 73 65 2d 66 69 6c 65 20 74 68 72 6f 77 20 lose-file throw
2f00: 74 68 72 6f 77 20 3b 5d 0a 20 20 20 20 61 72 67 throw ;]. arg
2f10: 2d 6c 6f 6f 70 20 3b 0a 0a 3a 20 76 65 72 69 66 -loop ;..: verif
2f20: 79 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 y ( -- ). \U
2f30: 76 65 72 69 66 79 20 66 69 6c 65 31 20 2e 2e 20 verify file1 ..
2f40: 66 69 6c 65 6e 0a 20 20 20 20 5c 47 20 76 65 72 filen. \G ver
2f50: 69 66 79 3a 20 63 68 65 63 6b 20 69 6e 74 65 67 ify: check integ
2f60: 72 69 74 79 20 6f 66 20 66 69 6c 65 73 20 76 73 rity of files vs
2f70: 2e 20 64 65 74 61 63 68 65 64 20 73 69 67 6e 61 . detached signa
2f80: 74 75 72 65 0a 20 20 20 20 3f 67 65 74 2d 6d 65 ture. ?get-me
2f90: 20 3f 63 72 0a 20 20 20 20 5b 3a 20 32 64 75 70 ?cr. [: 2dup
2fa0: 20 68 61 73 68 2d 66 69 6c 65 20 32 64 72 6f 70 hash-file 2drop
2fb0: 20 32 64 75 70 20 74 79 70 65 0a 20 20 20 20 20 2dup type.
2fc0: 20 5b 3a 20 74 79 70 65 20 2e 22 20 2e 73 32 6f [: type ." .s2o
2fd0: 22 20 3b 5d 20 24 74 6d 70 20 73 6c 75 72 70 2d " ;] $tmp slurp-
2fe0: 66 69 6c 65 0a 20 20 20 20 20 20 6f 76 65 72 20 file. over
2ff0: 64 61 74 65 2d 73 69 67 3f 20 64 75 70 20 3e 72 date-sig? dup >r
3000: 20 20 65 72 72 6f 72 2d 63 6f 6c 6f 72 20 69 6e error-color in
3010: 66 6f 2d 63 6f 6c 6f 72 20 72 3e 20 73 65 6c 65 fo-color r> sele
3020: 63 74 20 20 61 74 74 72 21 20 2e 63 68 65 63 6b ct attr! .check
3030: 0a 20 20 20 20 20 20 73 70 61 63 65 20 6f 76 65 . space ove
3040: 72 20 6b 65 79 73 69 7a 65 20 2e 6b 65 79 2d 69 r keysize .key-i
3050: 64 20 3c 64 65 66 61 75 6c 74 3e 0a 20 20 20 20 d <default>.
3060: 20 20 64 72 6f 70 20 66 72 65 65 20 74 68 72 6f drop free thro
3070: 77 20 63 72 20 3b 5d 0a 20 20 20 20 61 72 67 2d w cr ;]. arg-
3080: 6c 6f 6f 70 20 3b 0a 0a 5c 20 73 65 6c 65 63 74 loop ;..\ select
3090: 20 63 6f 6e 66 69 67 20 66 69 6c 65 0a 0a 3a 20 config file..:
30a0: 2d 63 6f 6e 66 69 67 20 28 20 2d 2d 20 29 0a 20 -config ( -- ).
30b0: 20 20 20 5c 4f 20 2d 63 6f 6e 66 69 67 20 3c 66 \O -config <f
30c0: 69 6c 65 6e 61 6d 65 3e 0a 20 20 20 20 5c 47 20 ilename>. \G
30d0: 2d 63 6f 6e 66 69 67 3a 20 53 65 74 20 66 69 6c -config: Set fil
30e0: 65 6e 61 6d 65 20 66 6f 72 20 63 6f 6e 66 69 67 ename for config
30f0: 20 66 69 6c 65 0a 20 20 20 20 3f 6e 65 78 74 61 file. ?nexta
3100: 72 67 20 30 3d 20 3f 45 58 49 54 20 20 63 6f 6e rg 0= ?EXIT con
3110: 66 69 67 2d 66 69 6c 65 24 20 24 21 20 6e 65 78 fig-file$ $! nex
3120: 74 2d 63 6d 64 20 3b 0a 0a 3a 20 2d 63 6f 6e 66 t-cmd ;..: -conf
3130: 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 4f 20 2d ( -- ). \O -
3140: 63 6f 6e 66 20 3c 76 61 6c 75 65 3e 3d 3c 74 68 conf <value>=<th
3150: 69 6e 67 3e 0a 20 20 20 20 5c 47 20 2d 63 6f 6e ing>. \G -con
3160: 66 3a 20 53 65 74 20 61 20 63 6f 6e 66 69 67 20 f: Set a config
3170: 76 61 6c 75 65 0a 20 20 20 20 3f 2e 6e 65 74 32 value. ?.net2
3180: 6f 2d 63 6f 6e 66 69 67 20 5c 20 72 65 61 64 20 o-config \ read
3190: 63 6f 6e 66 69 67 20 69 66 20 6e 65 63 65 73 73 config if necess
31a0: 61 72 79 0a 20 20 20 20 3f 6e 65 78 74 61 72 67 ary. ?nextarg
31b0: 20 30 3d 20 3f 45 58 49 54 20 5b 27 5d 20 63 6f 0= ?EXIT ['] co
31c0: 6e 66 69 67 2d 6c 69 6e 65 20 65 78 65 63 75 74 nfig-line execut
31d0: 65 2d 70 61 72 73 69 6e 67 20 6e 65 78 74 2d 63 e-parsing next-c
31e0: 6d 64 20 3b 0a 0a 5c 20 73 65 72 76 65 72 20 6d md ;..\ server m
31f0: 6f 64 65 0a 0a 3a 20 2d 6c 61 78 20 28 20 2d 2d ode..: -lax ( --
3200: 20 29 0a 20 20 20 20 5c 4f 20 2d 6c 61 78 0a 20 ). \O -lax.
3210: 20 20 20 5c 47 20 2d 6c 61 78 3a 20 6f 70 65 6e \G -lax: open
3220: 20 66 6f 72 20 61 6c 6c 20 6b 65 79 73 0a 20 20 for all keys.
3230: 20 20 70 65 72 6d 25 64 65 66 61 75 6c 74 20 74 perm%default t
3240: 6f 20 70 65 72 6d 25 75 6e 6b 6e 6f 77 6e 20 20 o perm%unknown
3250: 6e 65 78 74 2d 63 6d 64 20 3b 0a 0a 3a 20 73 65 next-cmd ;..: se
3260: 72 76 65 72 20 28 20 2d 2d 20 29 0a 20 20 20 20 rver ( -- ).
3270: 5c 55 20 73 65 72 76 65 72 0a 20 20 20 20 3f 67 \U server. ?g
3280: 65 74 2d 6d 65 20 69 6e 69 74 2d 73 65 72 76 65 et-me init-serve
3290: 72 20 61 6e 6e 6f 75 6e 63 65 2d 6d 65 20 73 65 r announce-me se
32a0: 72 76 65 72 2d 6c 6f 6f 70 2d 63 61 74 63 68 20 rver-loop-catch
32b0: 3b 0a 0a 3a 20 72 6f 6f 74 73 65 72 76 65 72 20 ;..: rootserver
32c0: 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 72 6f ( -- ). \U ro
32d0: 6f 74 73 65 72 76 65 72 0a 20 20 20 20 70 65 72 otserver. per
32e0: 6d 25 64 65 66 61 75 6c 74 20 74 6f 20 70 65 72 m%default to per
32f0: 6d 25 75 6e 6b 6e 6f 77 6e 0a 20 20 20 20 5c 20 m%unknown. \
3300: 77 65 6c 6c 20 6b 6e 6f 77 6e 20 30 6b 65 79 20 well known 0key
3310: 6f 66 20 61 20 64 68 74 20 72 6f 6f 74 2c 20 21 of a dht root, !
3320: 21 46 49 58 4d 45 21 21 20 74 6f 20 61 6c 6c 6f !FIXME!! to allo
3330: 77 20 63 68 61 6e 67 69 6e 67 20 74 68 61 74 0a w changing that.
3340: 20 20 20 20 38 35 22 20 34 6d 7a 75 4c 68 75 7b 85" 4mzuLhu{
3350: 37 50 2a 38 68 6b 51 6c 4b 25 24 68 37 44 4a 43 7P*8hkQlK%$h7DJC
3360: 25 58 7d 24 64 7a 45 72 75 36 42 7b 42 64 6c 58 %X}$dzEru6B{BdlX
3370: 22 20 6d 79 2d 30 6b 65 79 20 73 65 63 21 0a 20 " my-0key sec!.
3380: 20 20 20 6e 65 65 64 2d 62 65 61 63 6f 6e 23 20 need-beacon#
3390: 6f 66 66 20 5c 20 61 73 20 44 48 54 20 72 6f 6f off \ as DHT roo
33a0: 74 20 73 65 72 76 65 72 2c 20 77 65 20 64 6f 6e t server, we don
33b0: 27 74 20 6e 65 65 64 20 62 65 61 63 6f 6e 20 68 't need beacon h
33c0: 61 73 68 65 73 0a 20 20 20 20 3f 67 65 74 2d 6d ashes. ?get-m
33d0: 65 20 69 6e 69 74 2d 73 65 72 76 65 72 20 61 64 e init-server ad
33e0: 64 6d 65 2d 6f 77 6e 64 68 74 20 73 65 72 76 65 dme-owndht serve
33f0: 72 2d 6c 6f 6f 70 2d 63 61 74 63 68 20 3b 0a 0a r-loop-catch ;..
3400: 5c 20 64 68 74 20 63 6f 6d 6d 61 6e 64 73 0a 0a \ dht commands..
3410: 3a 20 61 6e 6e 6f 75 6e 63 65 20 28 20 2d 2d 20 : announce ( --
3420: 29 0a 20 20 20 20 5c 55 20 61 6e 6e 6f 75 6e 63 ). \U announc
3430: 65 0a 20 20 20 20 5c 47 20 61 6e 6e 6f 75 6e 63 e. \G announc
3440: 65 3a 20 4f 6e 6c 79 20 61 6e 6e 6f 75 6e 63 65 e: Only announce
3450: 20 49 44 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20 ID. ?get-me
3460: 69 6e 69 74 2d 63 6c 69 65 6e 74 20 61 6e 6e 6f init-client anno
3470: 75 6e 63 65 2d 6d 65 20 3b 0a 0a 3a 20 6c 6f 6f unce-me ;..: loo
3480: 6b 75 70 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c kup ( -- ). \
3490: 55 20 6c 6f 6f 6b 75 70 0a 20 20 20 20 5c 47 20 U lookup. \G
34a0: 6c 6f 6f 6b 75 70 3a 20 71 75 65 72 79 20 44 48 lookup: query DH
34b0: 54 20 66 6f 72 20 61 64 64 72 65 73 73 65 73 0a T for addresses.
34c0: 20 20 20 20 3f 67 65 74 2d 6d 65 20 3f 63 72 20 ?get-me ?cr
34d0: 69 6e 69 74 2d 63 6c 69 65 6e 74 20 6e 69 63 6b init-client nick
34e0: 73 3e 73 65 61 72 63 68 20 73 65 61 72 63 68 2d s>search search-
34f0: 61 64 64 72 73 0a 20 20 20 20 73 65 61 72 63 68 addrs. search
3500: 2d 6b 65 79 5b 5d 20 5b 3a 20 32 64 75 70 20 2e -key[] [: 2dup .
3510: 73 69 6d 70 6c 65 2d 69 64 20 2e 22 20 3a 22 20 simple-id ." :"
3520: 63 72 0a 20 20 20 20 20 20 3e 64 23 69 64 20 3e cr. >d#id >
3530: 6f 20 64 68 74 2d 68 6f 73 74 20 5b 3a 20 2e 68 o dht-host [: .h
3540: 6f 73 74 20 63 72 20 3b 5d 20 24 5b 5d 6d 61 70 ost cr ;] $[]map
3550: 20 6f 3e 20 3b 5d 20 24 5b 5d 6d 61 70 20 3b 0a o> ;] $[]map ;.
3560: 0a 3a 20 70 69 6e 67 20 28 20 2d 2d 20 29 0a 20 .: ping ( -- ).
3570: 20 20 20 5c 55 20 70 69 6e 67 0a 20 20 20 20 5c \U ping. \
3580: 47 20 70 69 6e 67 3a 20 71 75 65 72 79 20 44 48 G ping: query DH
3590: 54 20 61 6e 64 20 73 65 6e 64 20 61 20 70 69 6e T and send a pin
35a0: 67 20 74 6f 20 74 68 65 20 6f 62 73 65 72 76 65 g to the observe
35b0: 64 20 61 64 64 72 65 73 73 65 73 0a 20 20 20 20 d addresses.
35c0: 5c 47 20 70 69 6e 67 3a 20 69 73 20 6e 6f 74 20 \G ping: is not
35d0: 72 65 61 64 79 20 79 65 74 0a 20 20 20 20 3f 67 ready yet. ?g
35e0: 65 74 2d 6d 65 20 69 6e 69 74 2d 63 6c 69 65 6e et-me init-clien
35f0: 74 20 6e 69 63 6b 73 3e 73 65 61 72 63 68 20 73 t nicks>search s
3600: 65 61 72 63 68 2d 61 64 64 72 73 20 70 69 6e 67 earch-addrs ping
3610: 73 5b 5d 20 24 5b 5d 6f 66 66 0a 20 20 20 20 73 s[] $[]off. s
3620: 65 61 72 63 68 2d 6b 65 79 5b 5d 20 5b 3a 20 3e earch-key[] [: >
3630: 64 23 69 64 20 3e 6f 20 64 68 74 2d 68 6f 73 74 d#id >o dht-host
3640: 20 5b 3a 20 70 69 6e 67 73 5b 5d 20 24 2b 5b 5d [: pings[] $+[]
3650: 21 20 3b 5d 20 24 5b 5d 6d 61 70 20 6f 3e 20 3b ! ;] $[]map o> ;
3660: 5d 20 24 5b 5d 6d 61 70 0a 20 20 20 20 70 69 6e ] $[]map. pin
3670: 67 73 5b 5d 20 5b 3a 20 73 65 6e 64 2d 70 69 6e gs[] [: send-pin
3680: 67 20 3b 5d 20 24 5b 5d 6d 61 70 20 20 72 65 63 g ;] $[]map rec
3690: 65 69 76 65 2d 70 69 6e 67 73 20 3b 0a 0a 5c 20 eive-pings ;..\
36a0: 63 68 61 74 20 6d 6f 64 65 0a 0a 3a 20 2d 72 6f chat mode..: -ro
36b0: 6f 74 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 4f ot ( -- ). \O
36c0: 20 2d 72 6f 6f 74 20 3c 61 64 64 72 65 73 73 5b -root <address[
36d0: 3a 70 6f 72 74 5d 3e 0a 20 20 20 20 3f 6e 65 78 :port]>. ?nex
36e0: 74 61 72 67 20 30 3d 20 3f 45 58 49 54 20 27 3a targ 0= ?EXIT ':
36f0: 27 20 24 73 70 6c 69 74 20 64 75 70 20 49 46 20 ' $split dup IF
3700: 20 73 3e 6e 75 6d 62 65 72 20 64 72 6f 70 20 74 s>number drop t
3710: 6f 20 6e 65 74 32 6f 2d 70 6f 72 74 0a 20 20 20 o net2o-port.
3720: 20 45 4c 53 45 20 20 32 64 72 6f 70 20 20 54 48 ELSE 2drop TH
3730: 45 4e 20 20 6e 65 74 32 6f 2d 68 6f 73 74 20 24 EN net2o-host $
3740: 21 20 20 64 68 74 72 6f 6f 74 2d 6f 66 66 0a 20 ! dhtroot-off.
3750: 20 20 20 6e 65 78 74 2d 63 6d 64 20 3b 0a 0a 3a next-cmd ;..:
3760: 20 2d 72 6f 6f 74 6e 69 63 6b 20 28 20 2d 2d 20 -rootnick ( --
3770: 29 0a 20 20 20 20 5c 4f 20 2d 72 6f 6f 74 6e 69 ). \O -rootni
3780: 63 6b 20 3c 6e 69 63 6b 3e 0a 20 20 20 20 3f 6e ck <nick>. ?n
3790: 65 78 74 61 72 67 20 30 3d 20 3f 45 58 49 54 20 extarg 0= ?EXIT
37a0: 20 64 68 74 6e 69 63 6b 20 24 21 20 20 64 68 74 dhtnick $! dht
37b0: 72 6f 6f 74 2d 6f 66 66 20 20 6e 65 78 74 2d 63 root-off next-c
37c0: 6d 64 20 3b 0a 0a 3a 20 2d 70 6f 72 74 20 28 20 md ;..: -port (
37d0: 2d 2d 20 29 0a 20 20 20 20 5c 4f 20 2d 70 6f 72 -- ). \O -por
37e0: 74 20 3c 70 6f 72 74 23 3e 0a 20 20 20 20 5c 47 t <port#>. \G
37f0: 20 2d 70 6f 72 74 3a 20 73 65 74 73 20 70 6f 72 -port: sets por
3800: 74 20 74 6f 20 61 20 66 69 78 65 64 20 6e 75 6d t to a fixed num
3810: 62 65 72 20 66 6f 72 20 72 65 61 63 68 61 62 69 ber for reachabi
3820: 6c 69 74 79 20 66 72 6f 6d 20 6f 75 74 73 69 64 lity from outsid
3830: 65 2c 0a 20 20 20 20 5c 47 20 2d 70 6f 72 74 3a e,. \G -port:
3840: 20 61 6c 6c 6f 77 73 20 74 6f 20 64 65 66 69 6e allows to defin
3850: 65 20 70 6f 72 74 20 66 6f 72 77 61 72 64 69 6e e port forwardin
3860: 67 20 72 75 6c 65 73 20 69 6e 20 74 68 65 20 66 g rules in the f
3870: 69 72 65 77 61 6c 6c 0a 20 20 20 20 5c 47 20 2d irewall. \G -
3880: 70 6f 72 74 3a 20 6f 6e 6c 79 20 66 6f 72 20 63 port: only for c
3890: 6c 69 65 6e 74 3b 20 73 65 72 76 65 72 2d 73 69 lient; server-si
38a0: 64 65 20 70 6f 72 74 20 69 73 20 64 69 66 66 65 de port is diffe
38b0: 72 65 6e 74 0a 20 20 20 20 3f 6e 65 78 74 61 72 rent. ?nextar
38c0: 67 20 30 3d 20 3f 45 58 49 54 20 20 73 3e 6e 75 g 0= ?EXIT s>nu
38d0: 6d 62 65 72 20 64 72 6f 70 20 63 6f 6e 66 69 67 mber drop config
38e0: 3a 70 6f 72 74 23 20 21 0a 20 20 20 20 6e 65 78 :port# !. nex
38f0: 74 2d 63 6d 64 20 3b 0a 0a 3a 20 2d 6f 74 72 20 t-cmd ;..: -otr
3900: 28 20 2d 2d 2d 20 29 0a 20 20 20 20 5c 4f 20 2d ( --- ). \O -
3910: 6f 74 72 0a 20 20 20 20 5c 47 20 2d 6f 74 72 3a otr. \G -otr:
3920: 20 54 75 72 6e 20 6f 66 66 2d 74 68 65 2d 72 65 Turn off-the-re
3930: 63 6f 72 64 73 20 6d 6f 64 65 20 6f 6e 2c 20 73 cords mode on, s
3940: 6f 20 63 68 61 74 73 20 61 72 65 20 6e 6f 74 20 o chats are not
3950: 6c 6f 67 67 65 64 0a 20 20 20 20 6f 74 72 2d 6d logged. otr-m
3960: 6f 64 65 20 6f 6e 20 6e 65 78 74 2d 63 6d 64 20 ode on next-cmd
3970: 3b 0a 0a 3a 20 63 68 61 74 20 28 20 2d 2d 20 29 ;..: chat ( -- )
3980: 0a 20 20 20 20 5c 55 20 63 68 61 74 20 40 75 73 . \U chat @us
3990: 65 72 31 7c 67 72 6f 75 70 31 40 75 73 65 72 31 er1|group1@user1
39a0: 7c 67 72 6f 75 70 31 20 2e 2e 2e 20 40 75 73 65 |group1 ... @use
39b0: 72 6e 7c 67 72 6f 75 70 6e 40 75 73 65 72 6e 7c rn|groupn@usern|
39c0: 67 72 6f 75 70 6e 0a 20 20 20 20 5c 47 20 63 68 groupn. \G ch
39d0: 61 74 3a 20 40 75 73 65 72 3a 20 20 20 20 20 20 at: @user:
39e0: 74 6f 20 63 68 61 74 20 70 72 69 76 61 74 65 6c to chat privatel
39f0: 79 20 77 69 74 68 20 61 20 75 73 65 72 0a 20 20 y with a user.
3a00: 20 20 5c 47 20 63 68 61 74 3a 20 67 72 6f 75 70 \G chat: group
3a10: 40 75 73 65 72 3a 20 74 6f 20 63 68 61 74 20 77 @user: to chat w
3a20: 69 74 68 20 74 68 65 20 63 68 61 74 67 72 6f 75 ith the chatgrou
3a30: 70 20 6d 61 6e 61 67 65 64 20 62 79 20 75 73 65 p managed by use
3a40: 72 0a 20 20 20 20 5c 47 20 63 68 61 74 3a 20 67 r. \G chat: g
3a50: 72 6f 75 70 3a 20 20 20 20 20 20 74 6f 20 73 74 roup: to st
3a60: 61 72 74 20 61 20 67 72 6f 75 70 20 63 68 61 74 art a group chat
3a70: 20 28 70 65 65 72 73 20 6d 61 79 20 63 6f 6e 6e (peers may conn
3a80: 65 63 74 29 0a 20 20 20 20 5c 47 20 63 68 61 74 ect). \G chat
3a90: 3a 20 63 68 61 74 20 77 69 74 68 20 61 6e 20 75 : chat with an u
3aa0: 73 65 72 2c 20 61 20 67 72 6f 75 70 20 6d 61 6e ser, a group man
3ab0: 61 67 65 64 20 62 79 20 61 6e 20 75 73 65 72 2c aged by an user,
3ac0: 20 6f 72 20 73 74 61 72 74 0a 20 20 20 20 5c 47 or start. \G
3ad0: 20 63 68 61 74 3a 20 79 6f 75 72 20 6f 77 6e 20 chat: your own
3ae0: 67 72 6f 75 70 0a 20 20 20 20 61 6e 6e 6f 75 6e group. announ
3af0: 63 65 20 6e 69 63 6b 73 3e 63 68 61 74 20 68 61 ce nicks>chat ha
3b00: 6e 64 6c 65 2d 63 68 61 74 20 3b 0a 0a 3a 20 63 ndle-chat ;..: c
3b10: 68 61 74 6c 6f 67 20 28 20 2d 2d 20 29 0a 20 20 hatlog ( -- ).
3b20: 20 20 5c 55 20 63 68 61 74 6c 6f 67 20 40 75 73 \U chatlog @us
3b30: 65 72 31 7c 67 72 6f 75 70 31 20 2e 2e 20 40 75 er1|group1 .. @u
3b40: 73 65 72 6e 7c 67 72 6f 75 70 6e 20 0a 20 20 20 sern|groupn .
3b50: 20 5c 47 20 63 68 61 74 6c 6f 67 3a 20 64 75 6d \G chatlog: dum
3b60: 70 20 63 68 61 74 20 6c 6f 67 0a 20 20 20 20 3f p chat log. ?
3b70: 67 65 74 2d 6d 65 20 3f 63 72 20 69 6e 69 74 2d get-me ?cr init-
3b80: 63 6c 69 65 6e 74 0a 20 20 20 20 42 45 47 49 4e client. BEGIN
3b90: 20 20 3f 6e 65 78 74 61 72 67 20 20 57 48 49 4c ?nextarg WHIL
3ba0: 45 20 20 2e 22 20 3d 3d 3d 3d 3d 3d 20 43 68 61 E ." ====== Cha
3bb0: 74 20 6c 6f 67 20 66 6f 72 20 22 20 32 64 75 70 t log for " 2dup
3bc0: 20 74 79 70 65 0a 09 20 20 20 20 6f 76 65 72 20 type.. over
3bd0: 63 40 20 27 40 27 20 3d 20 49 46 20 20 31 20 2f c@ '@' = IF 1 /
3be0: 73 74 72 69 6e 67 20 6e 69 63 6b 3e 70 6b 20 6b string nick>pk k
3bf0: 65 79 7c 20 2e 22 20 20 6b 65 79 3a 20 22 20 32 ey| ." key: " 2
3c00: 64 75 70 20 38 35 74 79 70 65 20 20 54 48 45 4e dup 85type THEN
3c10: 0a 09 20 20 20 20 2e 22 20 20 3d 3d 3d 3d 3d 3d .. ." ======
3c20: 22 20 63 72 20 6d 73 67 2d 67 72 6f 75 70 24 20 " cr msg-group$
3c30: 24 21 0a 09 20 20 20 20 6d 73 67 2d 67 72 6f 75 $!.. msg-grou
3c40: 70 24 20 24 40 20 5b 20 2d 31 20 31 20 72 73 68 p$ $@ [ -1 1 rsh
3c50: 69 66 74 20 63 65 6c 6c 2f 20 5d 6c 20 6c 6f 61 ift cell/ ]l loa
3c60: 64 2d 6d 73 67 6e 20 52 45 50 45 41 54 20 3b 0a d-msgn REPEAT ;.
3c70: 0a 3a 20 63 68 61 74 67 72 6f 75 70 20 28 20 2d .: chatgroup ( -
3c80: 2d 20 29 0a 20 20 20 20 5c 55 20 63 68 61 74 67 - ). \U chatg
3c90: 72 6f 75 70 20 6e 61 6d 65 20 5b 69 64 5d 20 40 roup name [id] @
3ca0: 75 73 65 72 31 20 2e 2e 20 40 75 73 65 72 6e 20 user1 .. @usern
3cb0: 5b 61 64 6d 69 6e 20 3c 73 6b 3e 5d 20 5b 2b 70 [admin <sk>] [+p
3cc0: 65 72 6d 5d 0a 20 20 20 20 5c 47 20 63 68 61 74 erm]. \G chat
3cd0: 67 72 6f 75 70 3a 20 64 65 66 69 6e 65 20 61 20 group: define a
3ce0: 63 68 61 74 20 67 72 6f 75 70 0a 20 20 20 20 3f chat group. ?
3cf0: 67 65 74 2d 6d 65 20 3f 6e 65 78 74 61 72 67 20 get-me ?nextarg
3d00: 30 3d 20 3f 45 58 49 54 0a 20 20 20 20 5b 3a 20 0= ?EXIT. [:
3d10: 6d 61 6b 65 2d 67 72 6f 75 70 0a 09 3f 70 65 65 make-group..?pee
3d20: 6b 61 72 67 20 30 3d 20 3f 45 58 49 54 0a 09 6f karg 0= ?EXIT..o
3d30: 76 65 72 20 63 40 20 27 40 27 20 3c 3e 20 49 46 ver c@ '@' <> IF
3d40: 20 20 32 64 72 6f 70 20 3f 6e 65 78 74 61 72 67 2drop ?nextarg
3d50: 20 64 72 6f 70 0a 09 20 20 20 20 32 64 75 70 20 drop.. 2dup
3d60: 73 22 20 3d 22 20 73 74 72 3d 20 49 46 20 20 32 s" =" str= IF 2
3d70: 64 72 6f 70 0a 09 20 20 20 20 45 4c 53 45 20 20 drop.. ELSE
3d80: 62 61 73 65 38 35 3e 24 20 74 6f 20 67 72 6f 75 base85>$ to grou
3d90: 70 73 3a 69 64 24 20 20 54 48 45 4e 0a 09 45 4c ps:id$ THEN..EL
3da0: 53 45 20 20 67 65 6e 2d 61 64 6d 69 6e 2d 6b 65 SE gen-admin-ke
3db0: 79 0a 09 54 48 45 4e 0a 09 42 45 47 49 4e 20 20 y..THEN..BEGIN
3dc0: 3f 40 6e 65 78 74 61 72 67 20 20 57 48 49 4c 45 ?@nextarg WHILE
3dd0: 20 20 6e 69 63 6b 3e 70 6b 20 6b 65 79 7c 20 67 nick>pk key| g
3de0: 72 6f 75 70 73 3a 6d 65 6d 62 65 72 5b 5d 20 24 roups:member[] $
3df0: 2b 5b 5d 21 20 20 52 45 50 45 41 54 0a 09 3f 70 +[]! REPEAT..?p
3e00: 65 65 6b 61 72 67 20 30 3d 20 3f 45 58 49 54 0a eekarg 0= ?EXIT.
3e10: 09 73 22 20 61 64 6d 69 6e 22 20 73 74 72 3d 20 .s" admin" str=
3e20: 49 46 20 20 3f 6e 65 78 74 61 72 67 20 64 72 6f IF ?nextarg dro
3e30: 70 20 32 64 72 6f 70 0a 09 20 20 20 20 3f 6e 65 p 2drop.. ?ne
3e40: 78 74 61 72 67 20 20 49 46 0a 09 09 62 61 73 65 xtarg IF...base
3e50: 38 35 3e 24 20 67 72 6f 75 70 73 3a 61 64 6d 69 85>$ groups:admi
3e60: 6e 20 73 65 63 21 20 61 64 6d 69 6e 3e 70 6b 0a n sec! admin>pk.
3e70: 09 20 20 20 20 54 48 45 4e 0a 09 54 48 45 4e 0a . THEN..THEN.
3e80: 09 3f 70 65 65 6b 61 72 67 20 30 3d 20 3f 45 58 .?peekarg 0= ?EX
3e90: 49 54 0a 09 6f 76 65 72 20 63 40 20 27 2b 27 20 IT..over c@ '+'
3ea0: 3d 20 49 46 20 20 32 64 72 6f 70 20 3f 6e 65 78 = IF 2drop ?nex
3eb0: 74 61 72 67 20 64 72 6f 70 0a 09 20 20 20 20 73 targ drop.. s
3ec0: 3e 75 6e 75 6d 62 65 72 3f 20 64 72 6f 70 20 64 >unumber? drop d
3ed0: 3e 36 34 20 74 6f 20 67 72 6f 75 70 73 3a 70 65 >64 to groups:pe
3ee0: 72 6d 73 23 0a 09 54 48 45 4e 20 3b 5d 20 65 78 rms#..THEN ;] ex
3ef0: 65 63 75 74 65 0a 20 20 20 20 73 61 76 65 2d 63 ecute. save-c
3f00: 68 61 74 67 72 6f 75 70 73 20 2e 63 68 61 74 67 hatgroups .chatg
3f10: 72 6f 75 70 73 20 3b 0a 0a 3a 20 63 68 61 74 67 roups ;..: chatg
3f20: 72 6f 75 70 73 20 28 20 2d 2d 20 29 0a 20 20 20 roups ( -- ).
3f30: 20 5c 55 20 63 68 61 74 67 72 6f 75 70 73 0a 20 \U chatgroups.
3f40: 20 20 20 5c 47 20 63 68 61 74 67 72 6f 75 70 73 \G chatgroups
3f50: 3a 20 6c 69 73 74 20 63 68 61 74 67 72 6f 75 70 : list chatgroup
3f60: 73 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20 2e 63 s. ?get-me .c
3f70: 68 61 74 67 72 6f 75 70 73 20 3b 0a 0a 3a 20 63 hatgroups ;..: c
3f80: 68 61 74 67 72 6f 75 70 2d 20 28 20 2d 2d 20 29 hatgroup- ( -- )
3f90: 0a 20 20 20 20 5c 55 20 63 68 61 74 67 72 6f 75 . \U chatgrou
3fa0: 70 2d 20 67 72 6f 75 70 31 20 2e 2e 20 67 72 6f p- group1 .. gro
3fb0: 75 70 6e 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20 upn. ?get-me
3fc0: 5b 3a 20 67 72 6f 75 70 23 20 23 66 72 65 65 20 [: group# #free
3fd0: 3b 5d 20 61 72 67 2d 6c 6f 6f 70 0a 20 20 20 20 ;] arg-loop.
3fe0: 73 61 76 65 2d 63 68 61 74 67 72 6f 75 70 73 20 save-chatgroups
3ff0: 2e 63 68 61 74 67 72 6f 75 70 73 20 3b 0a 0a 3a .chatgroups ;..:
4000: 20 69 6e 76 69 74 65 20 28 20 2d 2d 20 29 0a 20 invite ( -- ).
4010: 20 20 20 5c 55 20 69 6e 76 69 74 65 20 40 75 73 \U invite @us
4020: 65 72 20 5b 22 49 6e 76 69 74 61 74 69 6f 6e 20 er ["Invitation
4030: 74 65 78 74 22 5d 0a 20 20 20 20 5c 47 20 69 6e text"]. \G in
4040: 76 69 74 65 3a 20 73 65 6e 64 20 6f 72 20 61 63 vite: send or ac
4050: 63 65 70 74 20 61 6e 20 69 6e 76 69 74 61 74 69 cept an invitati
4060: 6f 6e 20 74 6f 20 61 6e 6f 74 68 65 72 20 75 73 on to another us
4070: 65 72 0a 20 20 20 20 61 6e 6e 6f 75 6e 63 65 20 er. announce
4080: 40 6e 69 63 6b 73 3e 63 68 61 74 0a 20 20 20 20 @nicks>chat.
4090: 3f 6e 65 78 74 61 72 67 20 49 46 20 20 63 6f 6e ?nextarg IF con
40a0: 66 69 67 3a 69 6e 76 69 74 65 24 20 24 21 20 20 fig:invite$ $!
40b0: 54 48 45 4e 0a 20 20 20 20 63 68 61 74 2d 6b 65 THEN. chat-ke
40c0: 79 73 20 5b 3a 20 6e 65 74 32 6f 3a 70 6b 6c 6f ys [: net2o:pklo
40d0: 6f 6b 75 70 20 73 65 6e 64 2d 69 6e 76 69 74 61 okup send-invita
40e0: 74 69 6f 6e 20 3b 5d 20 24 5b 5d 6d 61 70 0a 20 tion ;] $[]map.
40f0: 20 20 20 2e 22 20 69 6e 76 69 74 61 74 69 6f 6e ." invitation
4100: 22 20 63 68 61 74 2d 6b 65 79 73 20 24 5b 5d 23 " chat-keys $[]#
4110: 20 31 20 3e 20 49 46 20 2e 22 20 73 22 20 54 48 1 > IF ." s" TH
4120: 45 4e 20 20 2e 22 20 20 73 65 6e 64 22 20 66 6f EN ." send" fo
4130: 72 74 68 3a 63 72 20 3b 20 0a 0a 5c 20 73 63 72 rth:cr ; ..\ scr
4140: 69 70 74 20 6d 6f 64 65 0a 0a 3a 20 63 6d 64 20 ipt mode..: cmd
4150: 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 63 6d ( -- ). \U cm
4160: 64 0a 20 20 20 20 5c 47 20 63 6d 64 3a 20 4f 66 d. \G cmd: Of
4170: 66 65 72 20 61 20 6e 65 74 32 6f 20 63 6f 6d 6d fer a net2o comm
4180: 61 6e 64 20 6c 69 6e 65 20 66 6f 72 20 63 6c 69 and line for cli
4190: 65 6e 74 20 73 74 75 66 66 0a 20 20 20 20 67 65 ent stuff. ge
41a0: 74 2d 6d 65 20 2e 22 20 6e 65 74 32 6f 20 69 6e t-me ." net2o in
41b0: 74 65 72 61 63 74 69 76 65 20 73 68 65 6c 6c 2c teractive shell,
41c0: 20 74 79 70 65 20 27 62 79 65 27 20 74 6f 20 71 type 'bye' to q
41d0: 75 69 74 22 0a 20 20 20 20 30 20 74 6f 20 73 63 uit". 0 to sc
41e0: 72 69 70 74 3f 20 6e 32 6f 2d 63 6d 64 73 20 3b ript? n2o-cmds ;
41f0: 0a 0a 3a 20 73 63 72 69 70 74 20 28 20 2d 2d 20 ..: script ( --
4200: 29 0a 20 20 20 20 5c 55 20 73 63 72 69 70 74 20 ). \U script
4210: 66 69 6c 65 0a 20 20 20 20 5c 47 20 73 63 72 69 file. \G scri
4220: 70 74 3a 20 72 65 61 64 20 61 20 66 69 6c 65 20 pt: read a file
4230: 69 6e 20 73 63 72 69 70 74 20 6d 6f 64 65 0a 20 in script mode.
4240: 20 20 20 3f 6e 65 78 74 61 72 67 20 30 3d 20 49 ?nextarg 0= I
4250: 46 20 20 68 65 6c 70 20 20 45 58 49 54 20 20 54 F help EXIT T
4260: 48 45 4e 0a 20 20 20 20 67 65 74 2d 6d 65 20 69 HEN. get-me i
4270: 6e 69 74 2d 63 6c 69 65 6e 74 20 77 6f 72 64 2d nit-client word-
4280: 61 72 67 73 20 5b 27 5d 20 69 6e 63 6c 75 64 65 args ['] include
4290: 64 20 64 6f 2d 6e 65 74 32 6f 2d 63 6d 64 73 20 d do-net2o-cmds
42a0: 3b 0a 0a 3a 20 73 68 20 28 20 2d 2d 20 29 0a 20 ;..: sh ( -- ).
42b0: 20 20 20 5c 55 20 73 68 20 63 6d 64 0a 20 20 20 \U sh cmd.
42c0: 20 5c 47 20 73 68 3a 20 65 76 61 6c 75 61 74 65 \G sh: evaluate
42d0: 20 72 65 73 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 rest of command
42e0: 20 61 73 20 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e as shell comman
42f0: 64 0a 20 20 20 20 73 6f 75 72 63 65 20 3e 69 6e d. source >in
4300: 20 40 20 2f 73 74 72 69 6e 67 20 73 79 73 74 65 @ /string syste
4310: 6d 20 20 73 6f 75 72 63 65 20 6e 69 70 20 3e 69 m source nip >i
4320: 6e 20 21 20 3b 0a 0a 3a 20 64 65 62 75 67 20 28 n ! ;..: debug (
4330: 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 64 65 62 -- ). \U deb
4340: 75 67 20 5b 2b 7c 2d 3c 73 77 69 74 63 68 3e 5d ug [+|-<switch>]
4350: 0a 20 20 20 20 5c 47 20 64 65 62 75 67 3a 20 73 . \G debug: s
4360: 65 74 20 6f 72 20 63 6c 65 61 72 20 64 65 62 75 et or clear debu
4370: 67 67 69 6e 67 20 73 77 69 74 63 68 65 73 0a 20 gging switches.
4380: 20 20 20 61 6c 73 6f 20 66 6f 72 74 68 0a 20 20 also forth.
4390: 20 20 42 45 47 49 4e 20 20 3f 70 65 65 6b 61 72 BEGIN ?peekar
43a0: 67 20 20 57 48 49 4c 45 20 20 2b 2d 3f 20 20 57 g WHILE +-? W
43b0: 48 49 4c 45 20 20 3f 6e 65 78 74 61 72 67 20 64 HILE ?nextarg d
43c0: 72 6f 70 20 73 65 74 2d 64 65 62 75 67 20 20 52 rop set-debug R
43d0: 45 50 45 41 54 20 20 54 48 45 4e 0a 20 20 20 20 EPEAT THEN.
43e0: 70 72 65 76 69 6f 75 73 20 3b 0a 0a 3a 20 73 65 previous ;..: se
43f0: 65 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 e ( -- ). \U
4400: 73 65 65 20 5b 3a 3a 73 63 6f 70 65 31 5d 20 66 see [::scope1] f
4410: 69 6c 65 31 20 2e 2e 20 5b 3a 3a 73 63 6f 70 65 ile1 .. [::scope
4420: 6e 5d 20 66 69 6c 65 6e 0a 20 20 20 20 5c 47 20 n] filen. \G
4430: 73 65 65 3a 20 64 65 63 6f 6d 69 6c 65 20 61 20 see: decomile a
4440: 66 69 6c 65 2c 20 73 63 6f 70 65 73 20 61 72 65 file, scopes are
4450: 20 61 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 3b a global state;
4460: 0a 20 20 20 20 5c 47 20 73 65 65 3a 20 64 65 66 . \G see: def
4470: 61 75 6c 74 20 73 63 6f 70 65 20 69 73 20 64 65 ault scope is de
4480: 74 65 72 6d 69 6e 65 64 20 62 79 20 66 69 6c 65 termined by file
4490: 20 65 78 74 65 6e 73 69 6f 6e 2c 0a 20 20 20 20 extension,.
44a0: 5c 47 20 73 65 65 3a 20 73 65 74 75 70 20 73 63 \G see: setup sc
44b0: 6f 70 65 20 69 66 20 6e 6f 74 20 64 65 66 69 6e ope if not defin
44c0: 65 64 0a 20 20 20 20 73 65 74 75 70 2d 74 61 62 ed. setup-tab
44d0: 6c 65 20 40 20 73 65 65 3a 74 61 62 6c 65 20 21 le @ see:table !
44e0: 0a 20 20 20 20 5b 3a 20 32 64 75 70 20 73 22 20 . [: 2dup s"
44f0: 3a 3a 22 20 73 74 72 69 6e 67 2d 70 72 65 66 69 ::" string-prefi
4500: 78 3f 20 49 46 0a 09 20 20 20 20 32 20 2f 73 74 x? IF.. 2 /st
4510: 72 69 6e 67 20 5b 3a 20 74 79 70 65 20 2e 22 20 ring [: type ."
4520: 2d 74 61 62 6c 65 22 20 3b 5d 20 24 74 6d 70 20 -table" ;] $tmp
4530: 66 69 6e 64 2d 6e 61 6d 65 0a 09 20 20 20 20 6e find-name.. n
4540: 61 6d 65 3e 69 6e 74 20 65 78 65 63 75 74 65 20 ame>int execute
4550: 40 20 73 65 65 3a 74 61 62 6c 65 20 21 0a 09 45 @ see:table !..E
4560: 4c 53 45 0a 09 20 20 20 20 73 65 65 3a 74 61 62 LSE.. see:tab
4570: 6c 65 20 40 20 3e 72 0a 09 20 20 20 20 2e 22 20 le @ >r.. ."
4580: 3d 3d 3d 3d 3d 20 22 20 32 64 75 70 20 66 6f 72 ===== " 2dup for
4590: 74 68 3a 74 79 70 65 20 2e 22 20 20 3d 3d 3d 3d th:type ." ====
45a0: 3d 22 20 66 6f 72 74 68 3a 63 72 0a 09 20 20 20 =" forth:cr..
45b0: 20 32 64 75 70 20 73 75 66 66 69 78 3e 74 61 62 2dup suffix>tab
45c0: 6c 65 20 73 65 65 3a 74 61 62 6c 65 20 21 0a 09 le see:table !..
45d0: 20 20 20 20 7b 20 7c 20 77 5e 20 63 6f 6e 74 65 { | w^ conte
45e0: 6e 74 20 7d 20 63 6f 6e 74 65 6e 74 20 24 73 6c nt } content $sl
45f0: 75 72 70 2d 66 69 6c 65 0a 09 20 20 20 20 63 6f urp-file.. co
4600: 6e 74 65 6e 74 20 24 40 20 6e 65 74 32 6f 3a 28 ntent $@ net2o:(
4610: 73 65 65 29 20 66 6f 72 74 68 3a 63 72 0a 09 20 see) forth:cr..
4620: 20 20 20 63 6f 6e 74 65 6e 74 20 24 66 72 65 65 content $free
4630: 20 20 72 3e 20 73 65 65 3a 74 61 62 6c 65 20 21 r> see:table !
4640: 0a 09 54 48 45 4e 0a 20 20 20 20 3b 5d 20 61 72 ..THEN. ;] ar
4650: 67 2d 6c 6f 6f 70 20 3b 0a 0a 5c 20 66 69 6c 65 g-loop ;..\ file
4660: 20 63 6f 70 79 0a 0a 3a 20 67 65 74 20 28 20 2d copy..: get ( -
4670: 2d 20 29 0a 20 20 20 20 5c 55 20 67 65 74 20 40 - ). \U get @
4680: 75 73 65 72 20 66 69 6c 65 31 20 2e 2e 20 66 69 user file1 .. fi
4690: 6c 65 6e 0a 20 20 20 20 5c 47 20 67 65 74 3a 20 len. \G get:
46a0: 67 65 74 20 66 69 6c 65 73 20 69 6e 74 6f 20 63 get files into c
46b0: 75 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 urrent directory
46c0: 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20 69 6e 69 . ?get-me ini
46d0: 74 2d 63 6c 69 65 6e 74 0a 20 20 20 20 3f 40 6e t-client. ?@n
46e0: 65 78 74 61 72 67 20 49 46 0a 09 64 76 63 73 2d extarg IF..dvcs-
46f0: 62 75 66 73 23 20 6e 69 63 6b 2d 63 6f 6e 6e 65 bufs# nick-conne
4700: 63 74 20 5b 3a 20 2e 22 20 63 6f 6e 6e 65 63 74 ct [: ." connect
4710: 65 64 22 20 63 72 20 3b 5d 20 64 6f 2d 64 65 62 ed" cr ;] do-deb
4720: 75 67 20 21 74 69 6d 65 0a 09 2b 72 65 73 65 6e ug !time..+resen
4730: 64 20 2b 66 6c 6f 77 2d 63 6f 6e 74 72 6f 6c 0a d +flow-control.
4740: 09 6e 65 74 32 6f 2d 63 6f 64 65 20 65 78 70 65 .net2o-code expe
4750: 63 74 2b 73 6c 75 72 70 0a 09 24 31 30 20 62 6c ct+slurp..$10 bl
4760: 6f 63 6b 73 69 7a 65 21 20 24 41 20 62 6c 6f 63 ocksize! $A bloc
4770: 6b 61 6c 69 67 6e 21 0a 09 42 45 47 49 4e 0a 09 kalign!..BEGIN..
4780: 20 20 20 20 24 31 30 20 5b 3a 20 32 64 75 70 20 $10 [: 2dup
4790: 62 61 73 65 6e 61 6d 65 20 6e 65 74 32 6f 3a 63 basename net2o:c
47a0: 6f 70 79 20 3b 5d 20 61 72 67 2d 6c 6f 6f 70 23 opy ;] arg-loop#
47b0: 0a 09 20 20 20 20 65 6e 64 2d 63 6f 64 65 7c 20 .. end-code|
47c0: 6e 65 74 32 6f 3a 63 6c 6f 73 65 2d 61 6c 6c 20 net2o:close-all
47d0: 2d 6d 61 70 2d 72 65 73 65 6e 64 0a 09 20 20 20 -map-resend..
47e0: 20 3f 70 65 65 6b 61 72 67 20 20 57 48 49 4c 45 ?peekarg WHILE
47f0: 20 20 32 64 72 6f 70 0a 09 09 2b 72 65 73 65 6e 2drop...+resen
4800: 64 20 2b 66 6c 6f 77 2d 63 6f 6e 74 72 6f 6c 0a d +flow-control.
4810: 09 09 6e 65 74 32 6f 2d 63 6f 64 65 20 65 78 70 ..net2o-code exp
4820: 65 63 74 2b 73 6c 75 72 70 20 20 63 6c 6f 73 65 ect+slurp close
4830: 2d 61 6c 6c 20 20 61 63 6b 20 72 65 77 69 6e 64 -all ack rewind
4840: 20 65 6e 64 2d 77 69 74 68 0a 09 09 5b 20 70 72 end-with...[ pr
4850: 65 76 69 6f 75 73 20 5d 0a 09 52 45 50 45 41 54 evious ]..REPEAT
4860: 20 20 34 20 74 6f 20 6d 61 78 2d 74 69 6d 65 6f 4 to max-timeo
4870: 75 74 73 20 64 69 73 63 6f 6e 6e 65 63 74 2d 6d uts disconnect-m
4880: 65 0a 20 20 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 e. THEN ;..:
4890: 67 65 74 23 20 28 20 2d 2d 20 29 0a 20 20 20 20 get# ( -- ).
48a0: 5c 55 20 67 65 74 23 20 40 75 73 65 72 20 68 61 \U get# @user ha
48b0: 73 68 31 20 2e 2e 20 68 61 73 68 6e 0a 20 20 20 sh1 .. hashn.
48c0: 20 5c 47 20 67 65 74 23 3a 20 67 65 74 20 66 69 \G get#: get fi
48d0: 6c 65 73 20 62 79 20 68 61 73 68 20 69 6e 74 6f les by hash into
48e0: 20 68 61 73 68 20 64 69 72 65 63 74 6f 72 79 0a hash directory.
48f0: 20 20 20 20 3f 67 65 74 2d 6d 65 20 69 6e 69 74 ?get-me init
4900: 2d 63 6c 69 65 6e 74 0a 20 20 20 20 3f 40 6e 65 -client. ?@ne
4910: 78 74 61 72 67 20 49 46 0a 09 64 76 63 73 2d 62 xtarg IF..dvcs-b
4920: 75 66 73 23 20 6e 69 63 6b 2d 63 6f 6e 6e 65 63 ufs# nick-connec
4930: 74 20 5b 3a 20 2e 22 20 63 6f 6e 6e 65 63 74 65 t [: ." connecte
4940: 64 22 20 63 72 20 3b 5d 20 64 6f 2d 64 65 62 75 d" cr ;] do-debu
4950: 67 20 21 74 69 6d 65 0a 09 2b 72 65 73 65 6e 64 g !time..+resend
4960: 20 2b 66 6c 6f 77 2d 63 6f 6e 74 72 6f 6c 0a 09 +flow-control..
4970: 6e 65 74 32 6f 2d 63 6f 64 65 20 65 78 70 65 63 net2o-code expec
4980: 74 2b 73 6c 75 72 70 0a 09 24 31 30 20 62 6c 6f t+slurp..$10 blo
4990: 63 6b 73 69 7a 65 21 20 24 41 20 62 6c 6f 63 6b cksize! $A block
49a0: 61 6c 69 67 6e 21 0a 09 42 45 47 49 4e 0a 09 20 align!..BEGIN..
49b0: 20 20 20 24 31 30 20 5b 3a 20 62 61 73 65 38 35 $10 [: base85
49c0: 3e 24 20 6e 65 74 32 6f 3a 63 6f 70 79 23 20 3b >$ net2o:copy# ;
49d0: 5d 20 61 72 67 2d 6c 6f 6f 70 23 0a 09 20 20 20 ] arg-loop#..
49e0: 20 65 6e 64 2d 63 6f 64 65 7c 20 6e 65 74 32 6f end-code| net2o
49f0: 3a 63 6c 6f 73 65 2d 61 6c 6c 20 2d 6d 61 70 2d :close-all -map-
4a00: 72 65 73 65 6e 64 0a 09 20 20 20 20 3f 70 65 65 resend.. ?pee
4a10: 6b 61 72 67 20 20 57 48 49 4c 45 20 20 32 64 72 karg WHILE 2dr
4a20: 6f 70 0a 09 09 2b 72 65 73 65 6e 64 20 2b 66 6c op...+resend +fl
4a30: 6f 77 2d 63 6f 6e 74 72 6f 6c 0a 09 09 6e 65 74 ow-control...net
4a40: 32 6f 2d 63 6f 64 65 20 65 78 70 65 63 74 2b 73 2o-code expect+s
4a50: 6c 75 72 70 20 20 63 6c 6f 73 65 2d 61 6c 6c 20 lurp close-all
4a60: 20 61 63 6b 20 72 65 77 69 6e 64 20 65 6e 64 2d ack rewind end-
4a70: 77 69 74 68 0a 09 09 5b 20 70 72 65 76 69 6f 75 with...[ previou
4a80: 73 20 5d 0a 09 52 45 50 45 41 54 20 20 64 69 73 s ]..REPEAT dis
4a90: 63 6f 6e 6e 65 63 74 2d 6d 65 0a 20 20 20 20 54 connect-me. T
4aa0: 48 45 4e 20 3b 0a 0a 5c 20 64 76 63 73 20 63 6f HEN ;..\ dvcs co
4ab0: 6d 6d 61 6e 64 73 0a 0a 3a 20 69 6e 69 74 20 28 mmands..: init (
4ac0: 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 69 6e 69 -- ). \U ini
4ad0: 74 20 5b 62 72 61 6e 63 68 6e 61 6d 65 23 5d 5b t [branchname#][
4ae0: 6e 61 6d 65 5d 5b 40 6f 77 6e 65 72 5d 0a 20 20 name][@owner].
4af0: 20 20 5c 47 20 69 6e 69 74 3a 20 53 65 74 75 70 \G init: Setup
4b00: 20 61 20 64 76 63 73 20 70 72 6f 6a 65 63 74 20 a dvcs project
4b10: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 in the current f
4b20: 6f 6c 64 65 72 0a 20 20 20 20 5c 47 20 69 6e 69 older. \G ini
4b30: 74 3a 20 54 68 65 20 64 65 66 61 75 6c 74 20 62 t: The default b
4b40: 72 61 6e 63 68 20 6e 61 6d 65 20 69 73 20 22 6d ranch name is "m
4b50: 61 73 74 65 72 22 0a 20 20 20 20 5c 47 20 69 6e aster". \G in
4b60: 69 74 3a 20 54 68 65 20 64 65 66 61 75 6c 74 20 it: The default
4b70: 70 72 6f 6a 65 63 74 20 6e 61 6d 65 20 69 73 20 project name is
4b80: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 74 the directory it
4b90: 20 72 65 73 69 64 65 73 20 69 6e 0a 20 20 20 20 resides in.
4ba0: 3f 67 65 74 2d 6d 65 0a 20 20 20 20 3f 6e 65 78 ?get-me. ?nex
4bb0: 74 61 72 67 20 30 3d 20 49 46 20 20 70 61 64 20 targ 0= IF pad
4bc0: 70 61 74 68 2d 6d 61 78 23 20 67 65 74 2d 64 69 path-max# get-di
4bd0: 72 20 62 61 73 65 6e 61 6d 65 20 20 54 48 45 4e r basename THEN
4be0: 0a 20 20 20 20 64 76 63 73 2d 69 6e 69 74 20 3b . dvcs-init ;
4bf0: 0a 0a 3a 20 61 64 64 20 28 20 2d 2d 20 29 0a 20 ..: add ( -- ).
4c00: 20 20 20 5c 55 20 61 64 64 20 66 69 6c 65 31 20 \U add file1
4c10: 2e 2e 20 66 69 6c 65 6e 0a 20 20 20 20 5c 47 20 .. filen. \G
4c20: 61 64 64 3a 20 61 64 64 20 66 69 6c 65 73 20 74 add: add files t
4c30: 6f 20 74 68 65 20 64 76 63 73 20 70 72 6f 6a 65 o the dvcs proje
4c40: 63 74 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e ct in the curren
4c50: 74 20 66 6f 6c 64 65 72 0a 20 20 20 20 64 76 63 t folder. dvc
4c60: 73 3a 6e 65 77 2d 64 76 63 73 20 3e 6f 20 66 69 s:new-dvcs >o fi
4c70: 6c 65 73 3e 64 76 63 73 0a 20 20 20 20 5b 27 5d les>dvcs. [']
4c80: 20 64 76 63 73 2d 61 64 64 20 61 72 67 2d 6c 6f dvcs-add arg-lo
4c90: 6f 70 20 20 64 76 63 73 3a 64 69 73 70 6f 73 65 op dvcs:dispose
4ca0: 2d 64 76 63 73 20 6f 3e 20 3b 0a 0a 3a 20 72 65 -dvcs o> ;..: re
4cb0: 66 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 f ( -- ). \U
4cc0: 72 65 66 20 66 69 6c 65 31 20 2e 2e 20 66 69 6c ref file1 .. fil
4cd0: 65 6e 0a 20 20 20 20 5c 47 20 72 65 66 3a 20 61 en. \G ref: a
4ce0: 64 64 20 66 69 6c 65 73 20 74 6f 20 74 68 65 20 dd files to the
4cf0: 64 76 63 73 20 70 72 6f 6a 65 63 74 20 69 6e 20 dvcs project in
4d00: 74 68 65 20 63 75 72 72 65 6e 74 20 66 6f 6c 64 the current fold
4d10: 65 72 0a 20 20 20 20 5c 47 20 72 65 66 3a 20 61 er. \G ref: a
4d20: 73 20 72 65 66 65 72 65 6e 63 65 73 0a 20 20 20 s references.
4d30: 20 64 76 63 73 3a 6e 65 77 2d 64 76 63 73 20 3e dvcs:new-dvcs >
4d40: 6f 20 66 69 6c 65 73 3e 64 76 63 73 0a 20 20 20 o files>dvcs.
4d50: 20 5b 27 5d 20 64 76 63 73 2d 72 65 66 20 61 72 ['] dvcs-ref ar
4d60: 67 2d 6c 6f 6f 70 20 20 64 76 63 73 3a 64 69 73 g-loop dvcs:dis
4d70: 70 6f 73 65 2d 64 76 63 73 20 6f 3e 20 3b 0a 0a pose-dvcs o> ;..
4d80: 3a 20 63 69 20 28 20 2d 2d 20 29 0a 20 20 20 20 : ci ( -- ).
4d90: 5c 55 20 63 69 20 22 6d 65 73 73 61 67 65 22 0a \U ci "message".
4da0: 20 20 20 20 5c 47 20 63 69 3a 20 63 68 65 63 6b \G ci: check
4db0: 20 61 64 64 65 64 20 61 6e 64 20 6d 6f 64 69 66 added and modif
4dc0: 69 65 64 20 66 69 6c 65 73 20 69 6e 74 6f 20 74 ied files into t
4dd0: 68 65 20 64 76 63 73 20 70 72 6f 6a 65 63 74 0a he dvcs project.
4de0: 20 20 20 20 3f 67 65 74 2d 6d 65 20 63 69 2d 61 ?get-me ci-a
4df0: 72 67 73 20 64 76 63 73 2d 63 69 20 3b 0a 0a 3a rgs dvcs-ci ;..:
4e00: 20 63 6f 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c co ( -- ). \
4e10: 55 20 63 6f 20 72 65 76 69 73 69 6f 6e 7c 40 62 U co revision|@b
4e20: 72 61 6e 63 68 7c 72 65 76 69 73 69 6f 6e 40 62 ranch|revision@b
4e30: 72 61 6e 63 68 0a 20 20 20 20 5c 47 20 63 6f 3a ranch. \G co:
4e40: 20 63 68 65 63 6b 20 6f 75 74 20 61 20 73 70 65 check out a spe
4e50: 63 69 66 69 63 20 72 65 76 69 73 69 6f 6e 0a 20 cific revision.
4e60: 20 20 20 3f 67 65 74 2d 6d 65 20 3f 6e 65 78 74 ?get-me ?next
4e70: 61 72 67 20 49 46 20 20 64 76 63 73 2d 63 6f 20 arg IF dvcs-co
4e80: 20 54 48 45 4e 0a 3b 0a 0a 3a 20 66 65 74 63 68 THEN.;..: fetch
4e90: 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 66 ( -- ). \U f
4ea0: 65 74 63 68 20 70 72 6f 6a 65 63 74 31 40 75 73 etch project1@us
4eb0: 65 72 31 0a 20 20 20 20 5c 47 20 66 65 74 63 68 er1. \G fetch
4ec0: 3a 20 67 65 74 20 74 68 65 20 75 70 64 61 74 65 : get the update
4ed0: 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 75 73 65 s from other use
4ee0: 72 73 20 28 6c 61 74 65 72 20 70 6f 73 73 69 62 rs (later possib
4ef0: 6c 65 20 6d 75 6c 74 69 70 6c 65 29 0a 20 20 20 le multiple).
4f00: 20 5c 47 20 66 65 74 63 68 3a 20 53 69 6d 69 6c \G fetch: Simil
4f10: 61 72 20 73 79 6e 74 61 78 20 61 73 20 66 6f 72 ar syntax as for
4f20: 20 63 68 61 74 73 0a 20 20 20 20 3f 67 65 74 2d chats. ?get-
4f30: 6d 65 20 69 6e 69 74 2d 63 6c 69 65 6e 74 20 6e me init-client n
4f40: 69 63 6b 73 3e 63 68 61 74 20 68 61 6e 64 6c 65 icks>chat handle
4f50: 2d 66 65 74 63 68 20 3b 0a 0a 3a 20 75 70 20 28 -fetch ;..: up (
4f60: 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 75 70 0a -- ). \U up.
4f70: 20 20 20 20 5c 47 20 75 70 3a 20 63 68 65 63 6b \G up: check
4f80: 20 6f 75 74 20 6c 61 73 74 20 72 65 76 69 73 69 out last revisi
4f90: 6f 6e 20 6f 66 20 63 75 72 72 65 6e 74 20 62 72 on of current br
4fa0: 61 6e 63 68 0a 20 20 20 20 3f 67 65 74 2d 6d 65 anch. ?get-me
4fb0: 20 64 76 63 73 2d 75 70 20 3b 0a 0a 3a 20 70 75 dvcs-up ;..: pu
4fc0: 6c 6c 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 ll ( -- ). \U
4fd0: 20 70 75 6c 6c 20 70 72 6f 6a 65 63 74 31 40 75 pull project1@u
4fe0: 73 65 72 31 0a 20 20 20 20 5c 47 20 70 75 6c 6c ser1. \G pull
4ff0: 3a 20 67 65 74 20 74 68 65 20 75 70 64 61 74 65 : get the update
5000: 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 75 73 65 s from other use
5010: 72 73 20 28 70 6f 73 73 69 62 6c 65 20 6d 75 6c rs (possible mul
5020: 74 69 70 6c 65 29 0a 20 20 20 20 5c 47 20 70 75 tiple). \G pu
5030: 6c 6c 3a 20 61 6e 64 20 63 68 65 63 6b 6f 75 74 ll: and checkout
5040: 20 74 68 65 20 6c 61 73 74 20 72 65 76 69 73 69 the last revisi
5050: 6f 6e 20 28 66 65 74 63 68 2b 75 70 29 2e 0a 20 on (fetch+up)..
5060: 20 20 20 5c 47 20 70 75 6c 6c 3a 20 53 69 6d 69 \G pull: Simi
5070: 6c 61 72 20 73 79 6e 74 61 78 20 61 73 20 66 6f lar syntax as fo
5080: 72 20 63 68 61 74 73 0a 20 20 20 20 3f 67 65 74 r chats. ?get
5090: 2d 6d 65 20 69 6e 69 74 2d 63 6c 69 65 6e 74 20 -me init-client
50a0: 6e 69 63 6b 73 3e 63 68 61 74 20 68 61 6e 64 6c nicks>chat handl
50b0: 65 2d 66 65 74 63 68 20 64 76 63 73 2d 75 70 20 e-fetch dvcs-up
50c0: 3b 0a 0a 3a 20 63 6c 6f 6e 65 20 28 20 2d 2d 20 ;..: clone ( --
50d0: 29 0a 20 20 20 20 5c 55 20 63 6c 6f 6e 65 20 70 ). \U clone p
50e0: 72 6f 6a 65 63 74 31 40 75 73 65 72 31 0a 20 20 roject1@user1.
50f0: 20 20 5c 47 20 63 72 65 61 74 65 20 64 69 63 74 \G create dict
5100: 69 6f 6e 61 72 79 2c 20 69 6e 69 74 20 72 65 70 ionary, init rep
5110: 6f 73 69 74 6f 72 79 20 61 6e 64 20 70 75 6c 6c ository and pull
5120: 20 70 72 6f 6a 65 63 74 0a 20 20 20 20 3f 67 65 project. ?ge
5130: 74 2d 6d 65 20 69 6e 69 74 2d 63 6c 69 65 6e 74 t-me init-client
5140: 20 6e 69 63 6b 73 3e 63 68 61 74 20 68 61 6e 64 nicks>chat hand
5150: 6c 65 2d 63 6c 6f 6e 65 20 3b 0a 0a 3a 20 72 65 le-clone ;..: re
5160: 76 65 72 74 20 28 20 2d 2d 20 29 0a 20 20 20 20 vert ( -- ).
5170: 5c 55 20 72 65 76 65 72 74 0a 20 20 20 20 5c 47 \U revert. \G
5180: 20 72 65 76 65 72 74 3a 20 72 65 76 65 72 74 20 revert: revert
5190: 63 68 61 6e 67 65 73 0a 20 20 20 20 3f 67 65 74 changes. ?get
51a0: 2d 6d 65 20 64 76 63 73 2d 72 65 76 65 72 74 20 -me dvcs-revert
51b0: 3b 0a 0a 3a 20 66 6f 72 6b 20 28 20 2d 2d 20 29 ;..: fork ( -- )
51c0: 0a 20 20 20 20 5c 55 20 66 6f 72 6b 20 62 72 61 . \U fork bra
51d0: 6e 63 68 0a 20 20 20 20 5c 47 20 66 6f 72 6b 3a nch. \G fork:
51e0: 20 63 72 65 61 74 65 20 61 20 62 72 61 6e 63 68 create a branch
51f0: 2c 20 6e 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d , not yet implem
5200: 65 6e 74 65 64 0a 20 20 20 20 21 21 46 49 58 4d ented. !!FIXM
5210: 45 21 21 0a 3b 0a 0a 3a 20 73 6e 61 70 20 28 20 E!!.;..: snap (
5220: 2d 2d 20 29 0a 20 20 20 20 5c 55 20 73 6e 61 70 -- ). \U snap
5230: 0a 20 20 20 20 5c 47 20 73 6e 61 70 3a 20 63 72 . \G snap: cr
5240: 65 61 74 65 20 61 20 73 6e 61 70 73 68 6f 74 20 eate a snapshot
5250: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 of the current r
5260: 65 76 69 73 69 6f 6e 0a 20 20 20 20 63 69 2d 61 evision. ci-a
5270: 72 67 73 20 64 76 63 73 2d 73 6e 61 70 20 3b 0a rgs dvcs-snap ;.
5280: 0a 3a 20 64 69 66 66 20 28 20 2d 2d 20 29 0a 20 .: diff ( -- ).
5290: 20 20 20 5c 55 20 64 69 66 66 0a 20 20 20 20 5c \U diff. \
52a0: 47 20 64 69 66 66 3a 20 64 69 66 66 20 62 65 74 G diff: diff bet
52b0: 77 65 65 6e 20 6c 61 73 74 20 63 68 65 63 6b 69 ween last checki
52c0: 6e 20 73 74 61 74 65 20 61 6e 64 20 63 75 72 72 n state and curr
52d0: 65 6e 74 20 73 74 61 74 65 0a 20 20 20 20 3f 67 ent state. ?g
52e0: 65 74 2d 6d 65 20 3f 63 72 20 64 76 63 73 2d 64 et-me ?cr dvcs-d
52f0: 69 66 66 20 3b 0a 0a 3a 20 6c 6f 67 20 28 20 2d iff ;..: log ( -
5300: 2d 20 29 0a 20 20 20 20 5c 55 20 6c 6f 67 0a 20 - ). \U log.
5310: 20 20 20 5c 47 20 6c 6f 67 3a 20 70 72 69 6e 74 \G log: print
5320: 20 6f 75 74 20 6c 6f 67 20 6f 66 20 63 75 72 72 out log of curr
5330: 65 6e 74 20 62 72 61 6e 63 68 0a 20 20 20 20 3f ent branch. ?
5340: 67 65 74 2d 6d 65 20 3f 63 72 20 2e 64 76 63 73 get-me ?cr .dvcs
5350: 2d 6c 6f 67 20 3b 0a 0a 5c 20 6d 61 6e 61 67 65 -log ;..\ manage
5360: 20 79 6f 75 72 20 68 61 73 68 20 6f 62 6a 65 63 your hash objec
5370: 74 73 20 64 69 72 65 63 74 6c 79 20 28 6e 6f 20 ts directly (no
5380: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 29 0a list available).
5390: 0a 3a 20 61 64 64 23 20 28 20 2d 2d 20 29 0a 20 .: add# ( -- ).
53a0: 20 20 20 5c 55 20 61 64 64 23 20 66 69 6c 65 31 \U add# file1
53b0: 20 2e 2e 20 66 69 6c 65 6e 0a 20 20 20 20 5c 47 .. filen. \G
53c0: 20 61 64 64 23 3a 20 61 64 64 20 66 69 6c 65 73 add#: add files
53d0: 20 74 6f 20 68 61 73 68 20 73 74 6f 72 61 67 65 to hash storage
53e0: 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20 5b 27 5d . ?get-me [']
53f0: 20 68 61 73 68 2d 61 64 64 20 61 72 67 2d 6c 6f hash-add arg-lo
5400: 6f 70 20 3b 0a 0a 3a 20 6f 75 74 23 20 28 20 2d op ;..: out# ( -
5410: 2d 20 29 0a 20 20 20 20 5c 55 20 6f 75 74 23 20 - ). \U out#
5420: 68 61 73 68 31 20 2e 2e 20 68 61 73 68 6e 0a 20 hash1 .. hashn.
5430: 20 20 20 5c 47 20 6f 75 74 23 3a 20 67 65 74 20 \G out#: get
5440: 66 69 6c 65 73 20 6f 75 74 20 6f 66 20 68 61 73 files out of has
5450: 68 20 73 74 6f 72 61 67 65 20 69 6e 20 63 6c 65 h storage in cle
5460: 61 72 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20 5b ar. ?get-me [
5470: 27 5d 20 68 61 73 68 2d 6f 75 74 20 61 72 67 2d '] hash-out arg-
5480: 6c 6f 6f 70 20 3b 0a 0a 5c 20 6f 74 68 65 72 73 loop ;..\ others
5490: 0a 0a 3a 20 62 79 65 20 28 20 2d 2d 20 29 0a 20 ..: bye ( -- ).
54a0: 20 20 20 5c 55 20 62 79 65 0a 20 20 20 20 5c 47 \U bye. \G
54b0: 20 62 79 65 3a 20 71 75 69 74 20 63 6f 6d 6d 61 bye: quit comma
54c0: 6e 64 20 6d 6f 64 65 20 61 6e 64 20 74 65 72 6d nd mode and term
54d0: 69 6e 61 74 65 20 70 72 6f 67 72 61 6d 0a 20 20 inate program.
54e0: 20 20 73 75 62 6d 65 20 64 68 74 2d 64 69 73 63 subme dht-disc
54f0: 6f 6e 6e 65 63 74 20 62 79 65 20 3b 0a 0a 3a 20 onnect bye ;..:
5500: 2d 62 77 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c -bw ( -- ). \
5510: 4f 20 2d 62 77 0a 20 20 20 20 5c 47 20 2d 62 77 O -bw. \G -bw
5520: 3a 20 64 69 73 61 62 6c 65 20 63 6f 6c 6f 72 20 : disable color
5530: 63 6f 64 65 73 0a 20 20 20 20 5b 27 5d 20 64 72 codes. ['] dr
5540: 6f 70 20 69 73 20 61 74 74 72 21 20 20 6e 65 78 op is attr! nex
5550: 74 2d 63 6d 64 20 3b 0a 0a 3a 20 2d 79 65 73 20 t-cmd ;..: -yes
5560: 28 20 2d 2d 20 29 0a 20 20 20 20 5c 4f 20 2d 79 ( -- ). \O -y
5570: 65 73 0a 20 20 20 20 5c 47 20 2d 79 65 73 3a 20 es. \G -yes:
5580: 73 61 79 20 79 65 73 20 74 6f 20 65 76 65 72 79 say yes to every
5590: 20 71 75 65 73 74 69 6f 6e 0a 20 20 20 20 74 72 question. tr
55a0: 75 65 20 74 6f 20 3f 79 65 73 20 20 6e 65 78 74 ue to ?yes next
55b0: 2d 63 6d 64 20 3b 0a 0a 3a 20 2d 62 61 63 6b 74 -cmd ;..: -backt
55c0: 72 61 63 65 20 28 20 2d 2d 20 29 0a 20 20 20 20 race ( -- ).
55d0: 5c 4f 20 2d 62 61 63 6b 74 72 61 63 65 0a 20 20 \O -backtrace.
55e0: 20 20 5c 47 20 2d 62 61 63 6b 74 72 61 63 65 3a \G -backtrace:
55f0: 20 50 72 6f 76 69 64 65 20 66 75 6c 6c 20 65 72 Provide full er
5600: 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 20 3b 0a ror reporting ;.
5610: 20 20 20 20 5b 20 77 68 61 74 27 73 20 44 6f 45 [ what's DoE
5620: 72 72 6f 72 20 5d 6c 20 69 73 20 44 6f 45 72 72 rror ]l is DoErr
5630: 6f 72 20 6e 65 78 74 2d 63 6d 64 20 3b 0a 0a 27 or next-cmd ;..'
5640: 20 2f 63 68 61 74 3a 2f 76 65 72 73 69 6f 6e 20 /chat:/version
5650: 61 6c 69 61 73 20 76 65 72 73 69 6f 6e 0a 20 20 alias version.
5660: 20 20 5c 55 20 76 65 72 73 69 6f 6e 0a 20 20 20 \U version.
5670: 20 5c 47 20 76 65 72 73 69 6f 6e 3a 20 70 72 69 \G version: pri
5680: 6e 74 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e nt version strin
5690: 67 0a 0a 3a 20 72 6e 67 20 28 20 2d 2d 20 29 0a g..: rng ( -- ).
56a0: 20 20 20 20 5c 55 20 72 6e 67 0a 20 20 20 20 5c \U rng. \
56b0: 47 20 72 6e 67 3a 20 63 68 65 63 6b 20 72 6e 67 G rng: check rng
56c0: 20 61 6e 64 20 67 69 76 65 20 61 20 33 32 20 62 and give a 32 b
56d0: 79 74 65 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 yte random value
56e0: 0a 20 20 20 20 3f 63 68 65 63 6b 2d 72 6e 67 20 . ?check-rng
56f0: 24 32 30 20 72 6e 67 24 20 38 35 74 79 70 65 20 $20 rng$ 85type
5700: 63 72 0a 20 20 20 20 63 68 65 63 6b 2d 6f 6c 64 cr. check-old
5710: 24 20 24 40 20 5b 27 5d 20 2e 72 6e 67 73 74 61 $ $@ ['] .rngsta
5720: 74 20 73 74 64 65 72 72 20 6f 75 74 66 69 6c 65 t stderr outfile
5730: 2d 65 78 65 63 75 74 65 20 20 63 68 65 63 6b 2d -execute check-
5740: 6f 6c 64 24 20 24 66 72 65 65 20 3b 0a 0a 3a 20 old$ $free ;..:
5750: 69 6d 70 6f 72 74 20 28 20 2d 2d 20 29 0a 20 20 import ( -- ).
5760: 20 20 5c 55 20 69 6d 70 6f 72 74 20 67 2b 7c 2e \U import g+|.
5770: 2e 2e 20 5b 64 69 72 65 63 74 6f 72 79 5d 0a 20 .. [directory].
5780: 20 20 20 3f 6e 65 78 74 61 72 67 20 49 46 0a 09 ?nextarg IF..
5790: 5b 27 5d 20 69 6d 70 6f 72 74 65 72 20 3e 62 6f ['] importer >bo
57a0: 64 79 20 66 69 6e 64 2d 6e 61 6d 65 2d 69 6e 20 dy find-name-in
57b0: 3f 64 75 70 2d 49 46 0a 09 20 20 20 20 6e 61 6d ?dup-IF.. nam
57c0: 65 3e 69 6e 74 20 65 78 65 63 75 74 65 20 20 45 e>int execute E
57d0: 58 49 54 20 20 54 48 45 4e 20 20 54 48 45 4e 0a XIT THEN THEN.
57e0: 20 20 20 20 2e 22 20 75 6e 6b 6e 6f 77 6e 20 69 ." unknown i
57f0: 6d 70 6f 72 74 22 20 3b 0a 0a 3a 20 67 75 69 20 mport" ;..: gui
5800: 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 67 75 ( -- ). \U gu
5810: 69 0a 20 20 20 20 5c 47 20 67 75 69 3a 20 73 74 i. \G gui: st
5820: 61 72 74 20 6e 65 74 32 6f 27 73 20 67 72 61 70 art net2o's grap
5830: 68 69 63 61 6c 20 75 73 65 72 20 69 6e 74 65 72 hical user inter
5840: 66 61 63 65 0a 20 20 20 20 3f 2e 6e 65 74 32 6f face. ?.net2o
5850: 2d 63 6f 6e 66 69 67 0a 20 20 20 20 72 65 73 65 -config. rese
5860: 74 2d 6e 65 74 32 6f 2d 63 6d 64 73 0a 20 20 20 t-net2o-cmds.
5870: 20 67 75 69 2e 66 73 24 20 24 40 20 64 75 70 20 gui.fs$ $@ dup
5880: 49 46 20 20 72 65 71 75 69 72 65 64 20 20 45 4c IF required EL
5890: 53 45 20 20 6e 6f 2d 66 69 6c 65 23 20 74 68 72 SE no-file# thr
58a0: 6f 77 20 20 54 48 45 4e 20 20 72 75 6e 2d 67 75 ow THEN run-gu
58b0: 69 20 3b 0a 7d 73 63 6f 70 65 0a 0a 5c 20 75 73 i ;.}scope..\ us
58c0: 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 68 69 e a different hi
58d0: 73 74 6f 72 79 20 66 69 6c 65 20 66 6f 72 20 6e story file for n
58e0: 65 74 32 6f 0a 0a 3a 20 6e 32 6f 2d 68 69 73 74 et2o..: n2o-hist
58f0: 6f 72 79 20 28 20 2d 2d 20 29 0a 20 20 20 20 68 ory ( -- ). h
5900: 69 73 74 6f 72 79 20 3f 64 75 70 2d 49 46 20 20 istory ?dup-IF
5910: 63 6c 6f 73 65 2d 66 69 6c 65 20 74 68 72 6f 77 close-file throw
5920: 20 20 54 48 45 4e 0a 20 20 20 20 22 68 69 73 74 THEN. "hist
5930: 6f 72 79 22 20 2e 6e 65 74 32 6f 2f 20 67 65 74 ory" .net2o/ get
5940: 2d 68 69 73 74 6f 72 79 20 3b 0a 0a 6e 32 6f 2d -history ;..n2o-
5950: 68 69 73 74 6f 72 79 0a 0a 5c 20 75 73 65 72 20 history..\ user
5960: 66 72 69 65 6e 64 6c 79 2c 20 62 75 74 20 77 61 friendly, but wa
5970: 79 20 6c 65 73 73 20 69 6e 66 6f 72 6d 61 74 69 y less informati
5980: 76 65 20 64 6f 65 72 72 6f 72 0a 0a 3a 20 3f 73 ve doerror..: ?s
5990: 65 74 2d 64 65 62 75 67 20 28 20 2d 2d 20 29 0a et-debug ( -- ).
59a0: 20 20 20 20 64 65 62 75 67 67 69 6e 67 2d 6d 65 debugging-me
59b0: 74 68 6f 64 20 30 3d 20 49 46 0a 09 5b 3a 20 5b thod 0= IF..[: [
59c0: 3a 20 3c 65 72 72 3e 20 2e 65 72 72 6f 72 2d 73 : <err> .error-s
59d0: 74 72 69 6e 67 20 3c 64 65 66 61 75 6c 74 3e 20 tring <default>
59e0: 63 72 20 3b 5d 20 64 6f 2d 64 65 62 75 67 20 3b cr ;] do-debug ;
59f0: 5d 20 69 73 20 44 6f 45 72 72 6f 72 0a 20 20 20 ] is DoError.
5a00: 20 45 4c 53 45 0a 09 5b 20 77 68 61 74 27 73 20 ELSE..[ what's
5a10: 44 6f 45 72 72 6f 72 20 5d 4c 20 69 73 20 44 6f DoError ]L is Do
5a20: 45 72 72 6f 72 0a 20 20 20 20 54 48 45 4e 20 3b Error. THEN ;
5a30: 0a 3f 73 65 74 2d 64 65 62 75 67 0a 0a 3a 6e 6f .?set-debug..:no
5a40: 6e 61 6d 65 20 64 65 66 65 72 73 20 27 63 6f 6c name defers 'col
5a50: 64 20 3f 73 65 74 2d 64 65 62 75 67 20 6e 32 6f d ?set-debug n2o
5a60: 2d 68 69 73 74 6f 72 79 20 3b 20 69 73 20 27 63 -history ; is 'c
5a70: 6f 6c 64 0a 0a 5c 20 61 6c 6c 6f 77 20 69 73 73 old..\ allow iss
5a80: 75 69 6e 67 20 63 6f 6d 6d 61 6e 64 73 20 64 75 uing commands du
5a90: 72 69 6e 67 20 63 68 61 74 0a 0a 73 63 6f 70 65 ring chat..scope
5aa0: 7b 20 2f 63 68 61 74 0a 3a 6e 6f 6e 61 6d 65 20 { /chat.:noname
5ab0: 5b 3a 20 77 6f 72 64 2d 61 72 67 73 20 5b 27 5d [: word-args [']
5ac0: 20 65 76 61 6c 75 61 74 65 20 64 6f 2d 6e 65 74 evaluate do-net
5ad0: 32 6f 2d 63 6d 64 73 20 3b 5d 20 63 61 74 63 68 2o-cmds ;] catch
5ae0: 0a 20 20 20 20 3f 64 75 70 2d 49 46 20 20 3c 65 . ?dup-IF <e
5af0: 72 72 3e 20 2e 22 20 65 72 72 6f 72 3a 20 22 20 rr> ." error: "
5b00: 65 72 72 6f 72 24 20 74 79 70 65 20 63 72 20 3c error$ type cr <
5b10: 64 65 66 61 75 6c 74 3e 20 20 54 48 45 4e 20 3b default> THEN ;
5b20: 20 69 73 20 2f 6e 32 6f 0a 7d 73 63 6f 70 65 0a is /n2o.}scope.
5b30: 0a 3a 20 73 74 61 72 74 2d 6e 32 6f 20 28 20 2d .: start-n2o ( -
5b40: 2d 20 29 0a 20 20 20 20 5b 49 46 44 45 46 5d 20 - ). [IFDEF]
5b50: 63 6f 76 2b 20 6c 6f 61 64 2d 63 6f 76 20 5b 54 cov+ load-cov [T
5b60: 48 45 4e 5d 0a 20 20 20 20 63 6d 64 2d 61 72 67 HEN]. cmd-arg
5b70: 73 20 2b 2b 64 65 62 75 67 20 25 64 72 6f 70 72 s ++debug %dropr
5b80: 61 74 65 20 25 64 72 6f 70 72 61 74 65 20 5c 20 ate %droprate \
5b90: 72 65 61 64 20 69 6e 20 61 6c 6c 20 64 65 62 75 read in all debu
5ba0: 67 67 69 6e 67 20 73 74 75 66 66 0a 20 20 20 20 gging stuff.
5bb0: 70 72 6f 66 69 6c 65 28 20 69 6e 69 74 2d 74 69 profile( init-ti
5bc0: 6d 65 72 20 29 0a 20 20 20 20 61 72 67 63 20 40 mer ). argc @
5bd0: 20 31 20 3e 20 49 46 20 6e 65 78 74 2d 63 6d 64 1 > IF next-cmd
5be0: 20 45 4c 53 45 20 6e 32 6f 3a 68 65 6c 70 20 54 ELSE n2o:help T
5bf0: 48 45 4e 0a 20 20 20 20 5b 49 46 44 45 46 5d 20 HEN. [IFDEF]
5c00: 63 6f 76 2b 20 73 61 76 65 2d 63 6f 76 20 61 6e cov+ save-cov an
5c10: 6e 6f 74 61 74 65 2d 63 6f 76 20 63 6f 76 25 20 notate-cov cov%
5c20: 5b 54 48 45 4e 5d 0a 20 20 20 20 70 72 6f 66 69 [THEN]. profi
5c30: 6c 65 28 20 2e 74 69 6d 65 73 20 29 0a 20 20 20 le( .times ).
5c40: 20 6e 32 6f 3a 62 79 65 20 3b 0a 0a 27 20 73 74 n2o:bye ;..' st
5c50: 61 72 74 2d 6e 32 6f 20 69 73 20 70 72 6f 63 65 art-n2o is proce
5c60: 73 73 2d 61 72 67 73 0a 0a ss-args..