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