diff j/system/main/stdlib.ijs @ 0:e0bbaa717f41 draft default tip

lol J
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Mon, 25 Nov 2013 11:56:30 -0500
parents
children
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/j/system/main/stdlib.ijs
@@ -0,0 +1,2007 @@
+18!:4 <'z'
+3 : 0 ''
+
+notdef=. 0: ~: 4!:0 @ <
+jpathsep=: '/'&(('\' I.@:= ])})
+winpathsep=: '\'&(('/' I.@:= ])})
+PATHJSEP_j_=: '/'                 
+IF64=: 16={:$3!:3[2
+'IFUNIX IFWIN IFWINCE'=: 5 6 7 = 9!:12''
+IFGTK=: IFJHS=: 0
+IFJ6=: 0     
+IFWINE=: IFWIN > 0-:2!:5'_'   
+if. IFUNIX do.
+  UNAME=: (2!:0 'uname')-.10{a.
+else.
+  UNAME=: 'Win'
+end.
+)
+jcwdpath=: (1!:43@(0&$),])@jpathsep@((*@# # '/'"_),])
+jsystemdefs=: 3 : 0
+0!:0 <jpath '~system/defs/',y,'_',(tolower UNAME),(IF64#'_64'),'.ijs'
+)
+18!:4 <'z'
+'TAB LF FF CR DEL EAV'=: 9 10 12 13 127 255{a.
+LF2=: LF,LF
+CRLF=: CR,LF
+EMPTY=: i.0 0
+Debug=: 0
+'noun adverb conjunction verb monad dyad'=: 0 1 2 3 3 4
+apply=: 128!:2
+def=: :
+define=: : 0
+do=: ".
+drop=: }.
+each=: &.>
+echo=: 0 0&$ @ (1!:2&2)
+exit=: 2!:55
+every=: &>
+getenv=: 2!:5
+inv=: inverse=: ^:_1
+items=: "_1
+fetch=: {::
+leaf=: L:0
+nameclass=: nc=: 4!:0
+namelist=: 4!:1
+on=: @:
+pick=: >@{
+rows=: "1
+stdout=: 1!:2&4
+stderr=: 1!:2&5
+stdin=: 1!:1@3: :. stdout
+sign=: *
+sort=: /:~ : /:
+take=: {.
+assert=: 0 0 $ 13!:8^:((0 e. ])`(12"_))
+bind=: 2 : 'x@(y"_)'
+boxopen=: <^:(L.=0:)
+boxxopen=: <^:(L.<*@#)
+clear=: 3 : 0
+". 'do_',(' '-.~y),'_ '' (#~ -.@(4!:55)) (4!:1) 0 1 2 3'''
+)
+cutLF=: 3 : 'if. L. y do. y else. a: -.~ <;._2 y,LF end.'
+cutopen=: 3 : 0
+y cutopen~ (' ',LF) {~ LF e. ,y
+:
+if. L. y do. y return. end.
+if. 1 < #$y do. <"_1 y return. end.
+(<'') -.~ (y e.x) <;._2 y=. y,1{.x
+)
+datatype=: 3 : 0
+n=. 1 2 4 8 16 32 64 128 1024 2048 4096 8192 16384 32768 65536 131072
+t=. '/boolean/literal/integer/floating/complex/boxed/extended/rational'
+t=. t,'/sparse boolean/sparse literal/sparse integer/sparse floating'
+t=. t,'/sparse complex/sparse boxed/symbol/unicode'
+(n i. 3!:0 y) pick <;._1 t
+)
+empty=: EMPTY"_
+erase=: [: 4!:55 ;: ::]
+expand=: # inverse
+H=. '0123456789ABCDEF'
+h=. '0123456789abcdef'
+dfh=: 16 #. 16 | (H,h) i. ]
+hfd=: h {~ 16 #.^:_1 ]
+isutf8=: 1:@(7&u:) :: 0:
+list=: 3 : 0
+w=. {.wcsize''
+w list y
+:
+if. 0=#y do. i.0 0 return. end.
+if. 2>#$y=. >y do.
+  d=. (' ',LF) {~ LF e. y=. toJ ": y
+  y=. [;._2 y, d #~ d ~: {: y
+end.
+y=. y-. ' '{.~ c=. {:$ y=. (": y),.' '
+(- 1>. <. x % c) ;\ <"1 y
+)
+nl=: 3 : 0
+'' nl y
+:
+if. 0 e. #y do. y=. 0 1 2 3 end.
+
+if. 1 4 8 e.~ 3!:0 y do.
+  nms=. (4!:1 y) -. ;: 'x y x. y.'
+else.
+  nms=. cutopen_z_ y
+end.
+
+if. 0 e. #nms do. return. end.
+
+if. #t=. x -. ' ' do.
+  'n s'=. '~*' e. t
+  t=. t -. '~*'
+  b=. t&E. &> nms
+  if. s do. b=. +./"1 b
+  else. b=. {."1 b end.
+  nms=. nms #~ n ~: b
+end.
+)
+names=: list_z_ @ nl
+Note=: 3 : '0 0 $ 0 : 0' : [
+script=: [: 3 : '0!:0 y [ 4!:55<''y''' jpath_z_ &.: >
+scriptd=: [: 3 : '0!:1 y [ 4!:55<''y''' jpath_z_ &.: >
+sminfo=: 3 : 0
+if. IFGTK do. mbinfo_jgtk_ y else. smoutput >_1{.boxopen y end.
+)
+smoutput=: 0 0 $ 1!:2&2
+tmoutput=: 0 0 $ 1!:2&4
+split=: {. ,&< }.
+table=: 1 : 0~
+:
+(((#~LF-.@e.])5!:5<'u');,.y),.({.;}.)":x,y u/x
+)
+timex=: 6!:2
+timespacex=: 6!:2 , 7!:2@]
+tolower=: 3 : 0
+x=. I. 26 > n=. ((65+i.26){a.) i. t=. ,y
+($y) $ ((x{n) { (97+i.26){a.) x}t
+)
+
+toupper=: 3 : 0
+x=. I. 26 > n=. ((97+i.26){a.) i. t=. ,y
+($y) $ ((x{n) { (65+i.26){a.) x}t
+)
+t=. <;._1 '/invalid name/not defined/noun/adverb/conjunction/verb/unknown'
+type=: {&t@(2&+)@(4!:0)&boxopen
+ucp=: 7&u:
+ucpcount=: # @ (7&u:)
+utf8=: 8&u:
+uucp=: u:@(7&u:)
+3 : 0''
+h=. 9!:12''
+subs=. 2 : 'x I. @(e.&y)@]} ]'
+toJ=: (LF subs CR) @: (#~ -.@(CRLF&E.@,))
+toCRLF=: 2&}. @: ; @: (((CR&,)&.>)@<;.1@(LF&,)@toJ)
+if. h=5 do.
+  toHOST=: ]
+else.
+  toHOST=: toCRLF
+end.
+1
+)
+18!:4 <'z'
+
+coclass=: 18!:4 @ boxxopen
+cocreate=: 18!:3
+cocurrent=: 18!:4 @ boxxopen
+codestroy=: coerase @ coname
+coerase=: 18!:55
+cofullname=: 3 : 0
+y=. ,> y
+if. #y do.
+  if. ('_' = {: y) +: 1 e. '__' E. y do.
+    y,'_',(>18!:5''),'_'
+  end.
+end.
+)
+coinsert=: 3 : 0
+n=. ;: :: ] y
+p=. ; (, 18!:2) @ < each n
+p=. ~. (18!:2 coname''), p
+(p /: p = <,'z') 18!:2 coname''
+)
+coname=: 18!:5
+conames=: list_z_ @ conl
+conew=: 3 : 0
+c=. <y
+obj=. cocreate''
+coinsert__obj c
+COCREATOR__obj=: coname''
+obj
+:
+w=. conew y
+create__w x
+w
+)
+conl=: 18!:1 @ (, 0 1"_ #~ # = 0:)
+copath=: 18!:2 & boxxopen
+coreset=: 3 : 0
+if. IFGTK do.
+  a=. <'jgtkide'
+  exc=. locEdits__a,locTerm__a,locFif__a,locFiw__a
+else.
+  exc=. ''
+end.
+0 0$coerase (conl 1) -. exc
+)
+cocurrent 'z'
+cofind=: 3 : 0
+r=. (<,>y) (4 : 'try. x e. nl__y $0 catch. 0 end.'"0 # ]) 18!:1]0 1
+if. 0=#r do. i.0 2 end.
+)
+cofindv=: 3 : 0
+lcs=. cofind y
+if. #lcs do.
+  lcs ,. ". each (<y,'_') ,each lcs ,each '_'
+end.
+)
+coinfo=: 3 : 0
+ref=. boxxopen y
+if. 0 e. $ref do. i.0 4 return. end.
+if. 0=4!:0 <'COCREATOR__ref'
+do. c=. COCREATOR__ref else. c=. a: end.
+(conouns ref),ref,c,< ;:inverse copath ref
+)
+conouns=: 3 : 0 "0
+n=. nl 0
+t=. n#~ (<y)-:&> ".each n
+< ;: inverse t
+)
+conounsx=: 3 : 0
+r=. ''
+if. #y do.
+  s=. #y=. boxxopen y
+  loc=. conl 0
+  for_i. loc do. r=. r,conouns__i y end.
+  r=. (r~:a:) # (y$~#r),.r,.s#loc
+end.
+/:~~.r
+)
+copathnl=: 3 : 0
+'' copathnl y
+:
+r=. ''
+t=. (coname''),copath coname''
+for_i. t -. <,'z' do.
+  r=. r,x nl__i y
+end.
+/:~~.r
+)
+copathnlx=: 3 : 0
+'' copathnlx y
+:
+r=. ''
+t=. (coname''),copath coname''
+for_i. t=. t -. <,'z' do.
+  r=. r,<x nl__i y
+end.
+n=. ~.;r
+n,.|:( n&e. &> r) #each t
+)
+coselect_result=: 3 : 0
+'r x s'=. y
+if. r do.
+  runimmx0_jijs_ '18!:4 <''',s,''''
+end.
+empty''
+)
+costate=: 3 : 0
+r=. ,: ;:'refs id creator path'
+if. #n=. conl 1 do. r,coinfo &> n /: 0 ".&> n end.
+)
+cocurrent 'z'
+cd=: 15!:0
+memr=: 15!:1
+memw=: 15!:2
+mema=: 15!:3
+memf=: 15!:4
+cdf=: 15!:5
+cder=: 15!:10
+cderx=: 15!:11
+gh=. 15!:8
+fh=. 15!:9
+symget=: 15!:6
+symset=: 15!:7
+cdcb=: 15!:13
+JB01=: 1
+JCHAR=: 2
+JSTR=: _1,JCHAR
+JINT=: 4
+JPTR=: JINT
+JFL=: 8
+JCMPX=: 16
+JBOXED=: 32
+JTYPES=: JB01,JCHAR,JINT,JPTR,JFL,JCMPX,JBOXED
+JSIZES=: >IF64{1 1 4 4 8 16 4;1 1 8 8 8 16 8
+ic=: 3!:4
+fc=: 3!:5
+endian=: |.^:('a'={.2 ic a.i.'a')
+AND=: $:/ : (17 b.)
+OR=: $:/ : (23 b.)
+XOR=: $:/ : (22 b.)
+cocurrent 'z'
+3 : 0 ''
+if. -. (UNAME-:'Darwin')+.(UNAME-:'SunOS') do. DLL_PATH=: '' return. end.
+llp=. 2!:5 'LD_LIBRARY_PATH',~'DY'#~UNAME-:'Darwin'
+if. 0 -: llp do. llp=. '' end.
+def_path=. ':/usr/local/lib:/usr/lib:/usr/lib/ccs/lib:/etc/lib:/lib'
+DLL_PATH=: a: -.~ <;._1 ':',llp,def_path
+)
+find_dll=: 3 : 0
+DLL_PATH find_dll y
+:
+if. UNAME-:'Linux' do. ('find_dll decommitted') 13!:8 ] 24 end.  
+if. -.IFUNIX do. y return. end.
+y=. ,y
+if. (UNAME-:'Darwin') do. ext=. '.dylib*' else. ext=. '.so*' end.
+for_dir. x do.
+  l=. (>dir), '/lib', y, ext
+  if. # fns=. \:~ 1!: 0 l do.
+    (>dir), '/', > (<0 0) { fns
+    return.
+  end.
+end.
+('could not locate dll ',y) 13!:8 ] 24
+)
+break=: 3 : 0
+class=. >(0=#y){y;'default'
+p=. 9!:46''
+q=. (>:p i: '/'){.p
+fs=. (<q),each {."1[1!:0<q,'*.',class
+fs=. fs-.<p 
+for_f. fs do.
+  v=. 2<.>:a.i.1!:11 f,<0 1
+  (v{a.) 1!:12 f,<0 
+end.
+i.0 0
+)
+setbreak=: 3 : 0
+p=. jpath '~break/'
+1!:5 ::] <p
+f=. p,(":2!:6''),'.',y
+({.a.) 1!:12 f;0 
+9!:47 f
+f
+)
+cocurrent 'z'
+calendar=: 3 : 0
+0 calendar y
+:
+a=. ((j<100)*(-100&|){.6!:0'')+j=. {.y
+b=. (a-x)+-/<.4 100 400%~<:a
+r=. 28+3,(~:/0=4 100 400|a),10$5$3 2
+r=. (-7|b+0,+/\}:r)|."0 1 r(]&:>:*"1>/)i.42
+m=. (<:}.y),i.12*1=#y
+h=. 'JanFebMarAprMayJunJulAugSepOctNovDec'
+h=. ((x*3)|.' Su Mo Tu We Th Fr Sa'),:"1~_3(_12&{.)\h
+<"2 m{h,"2[12 6 21 ($,) r{' ',3":1+i.31 1
+)
+getdate=: 3 : 0
+0 getdate y
+:
+r=. ''
+opt=. x
+chr=. [: -. [: *./ e.&'0123456789 '
+dat=. ' ' (I. y e.',-/:') } y
+
+if. chr dat do.
+  opt=. 0
+  dat=. a: -.~ <;._1 ' ',dat
+  if. 1=#dat do. r return. end.
+  typ=. chr &> dat
+  dat=. (2{.typ{dat),{:dat
+  mth=. 3{.>1{dat
+  uc=. 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+  lc=. 'abcdefghijklmnopqrstuvwxyz'
+  mth=. (lc,a.) {~ mth i.~ uc,a.
+  mos=. _3[\'janfebmaraprmayjunjulaugsepoctnovdec'
+  mth=. <": >:mos i. mth
+  dat=. ;' ',each mth 1 } dat
+end.
+
+dat=. ". :: (''"_) dat
+if. 0 e. #dat do. return. end.
+
+if. 3 ~: #dat do. r return. end.
+
+if. 31 < {.dat do. 'y m d'=. dat
+else. ((opt|.'d m '),' y')=. dat
+end.
+
+if. y<100 do.
+  y=. y + (-100&|) {. 6!:0''
+end.
+
+(#~ valdate) y,m,d
+)
+isotimestamp=: 3 : 0
+r=. }: $y
+t=. _6 [\ , 6 {."1 y
+d=. '--b::' 4 7 10 13 16 }"1 [ 4 3 3 3 3 3 ": <.t
+d=. d ,. }."1 [ 0j3 ": ,. 1 | {:"1 t
+c=. {: $d
+d=. ,d
+d=. '0' (I. d=' ')} d
+d=. ' ' (I. d='b')} d
+(r,c) $ d
+)
+todate=: 3 : 0
+0 todate y
+:
+s=. $y
+a=. 657377.75 +, y
+d=. <. a - 36524.25 * c=. <. a % 36524.25
+d=. <.1.75 + d - 365.25 * y=. <. (d+0.75) % 365.25
+r=. (1+12|m+2) ,: <. 0.41+d-30.6* m=. <. (d-0.59) % 30.6
+r=. s $ |: ((c*100)+y+m >: 10) ,r
+if. x do. r=. 100 #. r end.
+r
+)
+todayno=: 3 : 0
+0 todayno y
+:
+a=. y
+if. x do. a=. 0 100 100 #: a end.
+a=. ((*/r=. }: $a) , {:$a) $,a
+'y m d'=. <"_1 |: a
+y=. 0 100 #: y - m <: 2
+n=. +/ |: <. 36524.25 365.25 *"1 y
+n=. n + <. 0.41 + 0 30.6 #. (12 | m-3),"0 d
+0 >. r $ n - 657378
+)
+tsdiff=: 4 : 0
+r=. -/"2 d=. _6 (_3&([\)) \ ,x,"1 y
+if. #i=. i#i.#i=. 0 > 2{"1 r do.
+  j=. (-/0=4 100 400 |/ (<i;1;0){d)* 2=m=. (<i;1;1){d
+  j=. _1,.j + m{0 31 28 31 30 31 30 31 31 30 31 30 31
+  n=. <i;1 2
+  r=. (j + n{r) n } r
+end.
+r +/ . % 1 12 365
+)
+tsrep=: 3 : 0
+0 tsrep y
+:
+if. x do.
+  r=. $y
+  'w n t'=. |: 0 86400 1000 #: ,y
+  w=. w + 657377.75
+  d=. <. w - 36524.25 * c=. <. w % 36524.25
+  d=. <.1.75 + d - 365.25 * w=. <. (d+0.75) % 365.25
+  s=. (1+12|m+2) ,: <. 0.41+d-30.6* m=. <. (d-0.59) % 30.6
+  s=. |: ((c*100)+w+m >: 10) ,s
+  r $ s,. (_3{. &> t%1000) +"1 [ 0 60 60 #: n
+else.
+  a=. ((*/r=. }: $y) , {:$y) $, y
+  'w m d'=. <"_1 |: 3{."1 a
+  w=. 0 100 #: w - m <: 2
+  n=. +/ |: <. 36524.25 365.25 *"1 w
+  n=. n + <. 0.41 + 0 30.6 #. (12 | m-3),"0 d
+  s=. 3600000 60000 1000 +/ .*"1 [ 3}."1 a
+  r $ s+86400000 * n - 657378
+end.
+)
+timestamp=: 3 : 0
+if. 0 = #y do. w=. 6!:0'' else. w=. y end.
+r=. }: $ w
+t=. 2 1 0 3 4 5 {"1 [ _6 [\ , 6 {."1 <. w
+d=. '+++::' 2 6 11 14 17 }"1 [ 2 4 5 3 3 3 ": t
+mth=. _3[\'   JanFebMarAprMayJunJulAugSepOctNovDec'
+d=. ,((1 {"1 t) { mth) 3 4 5 }"1 d
+d=. '0' (I. d=' ') } d
+d=. ' ' (I. d='+') } d
+(r,20) $ d
+)
+
+tstamp=: timestamp
+valdate=: 3 : 0
+s=. }:$y
+'w m d'=. t=. |:((*/s),3)$,y
+b=. *./(t=<.t),(_1 0 0<t),12>:m
+day=. (13|m){0 31 28 31 30 31 30 31 31 30 31 30 31
+day=. day+(m=2)*-/0=4 100 400|/w
+s$b*d<:day
+)
+weekday=: 7 | 3 + todayno
+weeknumber=: 3 : 0
+yr=. {.y
+sd=. 1 ((i.~weekday){]) ((<:yr),.12,.29+i.3),yr,.1,.1+i.4
+wk=. >.7%~>: y -&todayno sd
+if. wk >weeksinyear yr do.
+  (>:yr),1
+elseif. wk=0 do.
+  (,weeksinyear)<:yr
+elseif. do.
+  yr,wk
+end.
+)
+weeksinyear=: 3 : '52+ +./"1 [ 4=weekday(1 1,:12 31),"0 1/~ y'
+cocurrent 'z'
+dbr=: 13!:0
+dbs=: 13!:1
+dbsq=: 13!:2
+dbss=: 13!:3
+dbrun=: 13!:4
+dbnxt=: 13!:5
+dbret=: 13!:6
+dbjmp=: 13!:7
+dbsig=: 13!:8
+dbrr=: 13!:9
+dbrrx=: 13!:10
+dberr=: 13!:11
+dberm=: 13!:12
+dbstk=: 13!:13
+dblxq=: 13!:14
+dblxs=: 13!:15
+dbtrace=: 13!:16
+dbq=: 13!:17
+dbst=: 13!:18
+dbctx=: 3 3&$: : (4 : 0)
+if. -.13!:17'' do. 0 0$'' return. end.
+try.
+  'before after'=. 2{. <. , x, 3 3
+catch.
+  'before after'=. 3 3
+end.
+if. 0= #d=. 13!:13'' do. 0 0$'' return. end.
+if. '*' -.@e. sus=. >{:"1 d do. 0 0$'' return. end.
+'name ln nc def src'=. 0 2 3 4 5{(sus i. '*'){d
+dyad=. {: ':'&e.;._2 ] 13!:12''
+if. (_2{.def) -: LF,')' do.
+  def=. }.def [ def0=. {.def=. }:<;._2 def,LF
+else.
+  def=. ,<def [ def0=: ''
+end.
+if. def e.~ <,':' do.
+  if. dyad do.
+    def=. def}.~ >: def i. <,':'
+  else.
+    def=. def{.~ def i. <,':'
+  end.
+end.
+min=. 0>.ln-before [ max=. (<:#def)<.ln+after
+ctx=. '[',"1 (":,.range) ,"1 ('] ') ,"1 >def{~range=. min + i. >:max-min
+> (<'@@ ', name, '[', (dyad#':'), (":ln) ,'] *', (nc{' acv'),' @@ ', src), def0, <"1 ctx
+)
+dbg=: 13!:0
+dblocals=: _1&$: : (4 : 0)
+stk=. }. 13!:13''
+if. 0=#y do. y=. a: else. y=. (y e. i.#stk) # y end.
+loc=. (<y ; 0 7) { stk
+if. -. x-:_1 do.
+  t=. ;: ::] x
+  f=. ({."1 e. t"_) # ]
+  ({."1 loc) ,. f &.> {:"1 loc
+end.
+)
+dbstack=: 3 : 0
+hdr=. ;:'name en ln nc args locals susp'
+stk=. }. 13!:13''
+if. #y do.
+  if. 2=3!:0 y do.
+    stk=. stk #~ (<y)={."1 stk
+  else.
+    stk=. ((#stk)<.,y){.stk
+  end.
+end.
+stk=. 1 1 1 1 0 0 1 1 1 #"1 stk
+stk=. hdr, ": &.> stk
+wds=. ({:@$@":@,.)"1 |: stk
+len=. 20 >.<.-:({.wcsize'') - +/8, 4 {. wds
+tc=. (len+1)&<.@$ {.!.'.' ({.~ len&<.@$)
+tc@": each stk
+)
+dbstop=: 3 : 0
+if. 0 e. #y -. ' ' do. 13!:3'' return. end.
+t=. 13!:2''
+if. #t do. t=. <;._2 t, ';' -. {:t end.
+t=. ~. t, (;: ^: (L.=0:) y) ,&.> <' *:*'
+13!:3 ; t ,&.> ';'
+)
+dbstops=: 3 : 0
+13!:3 ; (;: ^: (L.=0:) y) ,&.> <' *:*;'
+)
+dbstopme=: 3 : 0
+if. y do.
+  if. 0 e. $c=. }. 13!:13'' do. return. end.
+  c=. (> {. {. c), ' *:*'
+  t=. 13!:2''
+  if. #t do. t=. <;._2 t, ';' -. {:t end.
+  t=. ~. t, <c
+  13!:3 }: ; t ,&.> ';'
+end.
+)
+dbstopnext=: 3 : 0
+if. y do.
+  if. 0 e. $c=. }. 13!:13'' do. return. end.
+  'd n a'=. 0 2 6 { {. c
+  c=. d,' ',(':'#~2=#a),":n+1
+  t=. 13!:2''
+  if. #t do. t=. <;._2 t, ';' -. {:t end.
+  t=. ~. t, <c
+  13!:3 }: ; t ,&.> ';'
+end.
+)
+dbview=: 3 : 0
+if. _1 = 4!:0 <'jdbview_jdbview_' do.
+  'require'~'~system/util/dbview.ijs'
+end.
+jdbview_jdbview_ }. 13!:13''
+)
+cocurrent 'z'
+dir=: 3 : 0
+'n' dir y
+:
+ps=. '/'
+y=. jpath y,(0=#y)#'*'
+y=. y,((':',ps) e.~ {:y)#'*'
+if. 0=#dr=. 1!:0 y do. empty'' return. end.
+fls=. 'd' ~: 4{"1>4{"1 dr
+if. (1=#dr) *. 0={.fls do.
+  r=. x dir y,ps,'*'
+  if. #r do. r return. end.
+end.
+if. fmt=. 2=3!:0 x do. opt=. 2 1
+else. opt=. 2{.x end.
+if. 0={:opt do. fls=. 1#~#dr=. fls#dr end.
+if. 0=#dr do. empty'' return. end.
+nms=. {."1 dr
+nms=. nms ,&.> fls{ps;''
+if. IFWIN do.
+  nms=. tolower &.> nms
+end.
+ndx=. /: (":,.fls),.>nms
+if. 0=opt do.
+  list >ndx{nms
+elseif. 1=opt do.
+  path=. (+./\.y=ps)#y
+  path&,&.>ndx{nms
+elseif. fmt<2=opt do.
+  ndx{nms,.}."1 dr
+elseif. fmt do.
+  'nms ts size'=. |:3{."1 dr
+  if. IFWIN do.
+    nms=. tolower L:0 nms
+  end.
+  ds=. '   <dir>    ' ((-.fls)#i.#fls) } 12 ":,.size
+  mth=. _3[\'   JanFebMarAprMayJunJulAugSepOctNovDec'
+  f=. > @ ([: _2&{. [: '0'&, ": )&.>
+  'y m d h n s'=. f&> ,<"1 |: 100|ts
+  m=. (1{"1 ts){mth
+  time=. d,.'-',.m,.'-',.y,.' ',.h,.':',.n,.':',.s
+  dat=. (>nms),.ds,.' ',.time
+  dat /: fls,. /:/: >(3|'dns'i.x){ts;nms;size
+elseif. 1 do.
+  'invalid left argument'
+end.
+)
+dircompare=: 3 : 0
+0 dircompare y
+:
+if. 0=#y do.
+  '''long dirtree timestamps'' dircompare dir1;dir2'
+  return.
+end.
+
+opt=. 3 {. x
+res=. opt dircompares y
+if. 0 = L. res do. return. end.
+
+ps=. '/'
+'a b c'=. res
+
+'x y'=. jpath each cutopen y
+x=. x, ps #~ (*#x) *. ps~:_1{.x
+y=. y, ps #~ (*#y) *. ps~:_1{.y
+
+r=. 'comparing  ',x,'  and  ',y,LF
+
+if. #a do.
+  r=. r,LF,'not in  ',y,':',LF,,(list a),.LF
+end.
+
+if. #b do.
+  r=. r,LF,'not in  ',x,':',LF,,(list b),.LF
+end.
+
+if. +/ # &> c do.
+  'cf cd'=. c
+  r=. r,LF,'not same in both:',LF,,(list cf),.LF
+  if. {.opt do.
+    r=. r,LF,;(,&(LF2)) &.> cd
+  end.
+
+end.
+
+if. 0=#;res do. r=. r,'no difference',LF end.
+
+}:r
+)
+dircompares=: 3 : 0
+0 dircompares y
+:
+ps=. '/'
+opt=. 3{. x
+'x y'=. jpath each cutopen y
+x=. x, ps #~ (*#x) *. ps~:_1{.x
+y=. y, ps #~ (*#y) *. ps~:_1{.y
+
+if. 1{opt do.
+  dx=. dirtree x [ dy=. dirtree y
+else.
+  dx=. 2 0 dir x [ dy=. 2 0 dir y
+end.
+
+if. dx -: dy do. 'no difference' return. end.
+if. 0 e. #dx do. 'first directory is empty' return. end.
+if. 0 e. #dy do. 'second directory is empty' return. end.
+
+f=. #~ [: +./\. =&ps
+sx=. f x
+sy=. f y
+fx=. {."1 dx
+fy=. {."1 dy
+
+if. 1{opt do.
+  fx=. (#sx)}.&.>fx
+  fy=. (#sy)}.&.>fy
+  dx=. fx 0 }"0 1 dx
+  dy=. fy 0 }"0 1 dy
+end.
+
+r=. <fx -. fy
+r=. r , <fy -. fx
+
+dx=. (fx e. fy)#dx
+dy=. (fy e. fx)#dy
+
+if. #j=. dx -. dy do.
+  j=. {."1 j
+  cmp=. <@fcompare"1 (sx&,&.>j),.sy&,&.>j
+
+  if. 0=2{opt do.
+    f=. 'no difference'&-: @ (_13&{.)
+    msk=. -. f &> cmp
+    j=. msk#j
+    cmp=. msk#cmp
+  end.
+
+  r=. r,< j;<cmp
+else.
+  r=. r,a:
+end.
+
+r
+)
+dirfind=: 4 : 0
+f=. [: 1&e. x&E.
+g=. #~ [: -. [: +./\. =&'/'
+d=. {."1 dirtree y
+m=. f@g &> d
+if. 1 e. m do. ; (m # d) ,each LF else. 0 0$'' end.
+)
+dirpath=: 3 : 0
+0 dirpath y
+:
+r=. ''
+t=. jpath y
+ps=. '/'
+if. #t do. t=. t, ps -. {:t end.
+dirs=. <t
+ifdir=. 'd'&= @ (4&{"1) @ > @ (4&{"1)
+subdir=. ifdir # ]
+while. #dirs do.
+  fpath=. (>{.dirs) &,
+  dirs=. }.dirs
+  dat=. 1!:0 fpath '*'
+  if. #dat do.
+    dat=. subdir dat
+    if. #dat do.
+      r=. r, fpath each /:~ {."1 dat
+      dirs=. (fpath @ (,&ps) each {."1 dat),dirs
+    end.
+  end.
+end.
+if. x do.
+  f=. 1!:0 @ (,&(ps,'*'))
+  g=. 0:`(0: e. ifdir)
+  h=. g @. (*@#) @ f
+  r=. r #~ h &> r
+end.
+if. #t do. r=. r,<}:t end.
+if. IFWIN do.
+  r=. tolower each r
+end.
+/:~ r
+)
+dirss=: 4 : 0
+if. (2=#x) *. 1=L. x do.
+  x dirssrplc y return.
+end.
+
+sub=. ' '&(I.@(e.&(TAB,CRLF))@]})
+fls=. {."1 dirtree y
+if. 0 e. #fls do.
+  'no files in directory: ',y return.
+end.
+fnd=. ''
+while. #fls do.
+  dat=. 1!:1 <fl=. >{.fls
+  fls=. }.fls
+  ndx=. I. x E. dat
+  if. rws=. #ndx do.
+    dat=. (20$' '),dat,30$' '
+    dat=. (rws,50)$sub(,ndx+/i.50){dat
+    fnd=. fnd,LF2,fl,' (',(":#ndx),')'
+    fnd=. fnd,,LF,.dat
+  end.
+end.
+if. #fnd do. 2}.fnd else. 'not found: ',x end.
+)
+dirssrplc=: 4 : 0
+fls=. {."1 dirtree y
+if. 0 e. #fls do.
+  'no files found' return.
+end.
+r=. (x&fssrplc) each fls
+b=. r ~: <'no match found'
+j=. >b # fls , each ': '&, each r
+}: , j ,. LF
+)
+dirtree=: 3 : 0
+0 dirtree y
+:
+if. 0=4!:0 <'DirTreeX_j_' do.
+  ex=. boxxopen DirTreeX_j_
+else.
+  ex=. ''
+end.
+r=. i.0 3
+ps=. '/'
+y=. jpath y
+y=. y #~ (+./\ *. +./\.) y~:' '
+y=. y,(0=#y)#'*'
+if. ps={:y do. y=. y,'*' end.
+if. -. '*' e. y do.
+  if. 1 = #j=. 1!:0 y do.
+    select. 'hd' = 1 4 { >4{,j
+    case. 0 1 do. x dirtree y,ps,'*' return.
+    case. 1 1 do. i.0 3 return.
+    end.
+  end.
+end.
+ts=. 100"_ #. 6: {. 0: >. <. - # {. 1980"_
+'path ext'=. (b#y);(-.b=. +./\.y=ps)#y
+if. #dl=. 1!:0 y do.
+  att=. > 4{"1 dl
+  fl=. (('h' ~: 1{"1 att) *. 'd' ~: 4{"1 att)#dl
+  if. #fl do.
+    r=. r,(path&,&.>{."1 fl),.1 2{"1 fl
+  end.
+end.
+if. #dl=. 1!:0 path,'*' do.
+  att=. > 4{"1 dl
+  dr=. {."1 (('h' ~: 1{"1 att) *. 'd' = 4{"1 att) # dl
+  dr=. dr -. ex
+  if. #dr do.
+    r=. r,;x&dirtree@(path&,@,&(ps,ext)) &.> dr
+  end.
+end.
+r=. r #~ (ts x) <: ts &> 1{"1 r
+if. IFWIN *. #r do.
+  (tolower L:0 {."1 r) 0 }"0 1 r
+end.
+)
+dirused=: [: (# , +/ @ ; @ (2: {"1 ])) 0&dirtree
+cocurrent 'z'
+
+fboxname=: <@jpath_j_@(8 u: >) ::]
+fexists=: #~ fexist
+f2utf8=: ]
+fappend=: 4 : 0
+(,x) (#@[ [ 1!:3) :: _1: fboxname y
+)
+fappends=: 4 : 0
+(fputs x) (#@[ [ 1!:3) :: _1: fboxname y
+)
+fapplylines=: 1 : 0
+0 u fapplylines y
+:
+y=. > fboxname y
+s=. 1!:4 <y
+if. s = _1 do. return. end.
+p=. 0
+dat=. ''
+while. p < s do.
+  b=. 1e6 <. s-p
+  dat=. dat, 1!:11 y;p,b
+  p=. p + b
+  if. p = s do.
+    len=. #dat=. dat, LF -. {:dat
+  elseif. (#dat) < len=. 1 + dat i:LF do.
+    'file not in LF-delimited lines' 13!:8[3
+  end.
+  if. x do.
+    u ;.2 len {. dat
+  else.
+    u ;._2 CR -.~ len {. dat
+  end.
+  dat=. len }. dat
+end.
+)
+fcopynew=: 4 : 0
+dat=. fread each boxopen y
+if. (<_1) e. dat do. _1 return. end.
+dat=. ; dat
+if. dat -: fread :: 0: x do. 0,#dat else.
+  if. _1=dat fwrite x do. _1 else. 1,#dat end.
+end.
+)
+fdir=: 1!:0@fboxname
+ferase=: (1!:55 :: _1:) @ (fboxname &>) @ boxopen
+fexist=: (1:@(1!:4) :: 0:) @ (fboxname &>) @ boxopen
+fgets=: 3 : 0
+y=. (-(26{a.)={:y) }. y
+if. 0=#y do. '' return. end.
+y,LF -. {:y=. toJ y
+)
+fmakex=: (] 1!:7~ 'x' 2 5 8} 1!:7) @ fboxname
+fpathcreate=: 3 : 0
+if. 0=#y do. 1 return. end.
+p=. (,'/'-.{:) jpathsep y
+if. # 1!:0 }: p do. 1 return. end.
+for_n. I. p='/' do.  1!:5 :: 0: < n{.p end.
+)
+fpathname=: +./\.@:=&'/' (# ; -.@[ # ]) ]
+fread=: 3 : 0
+if. 1 = #y=. boxopen y do.
+  1!:1 :: _1: fboxname y
+else.
+  1!:11 :: _1: (fboxname {.y),{:y
+end.
+:
+x freads y
+)
+freadblock=: 3 : 0
+'f p'=. y
+f=. > fboxname f
+s=. 1!:4 <f
+if. s = _1 do. return. end.
+if. (s = 0) +. p >: s do. '';p return. end.
+if. 1e6 < s-p do.
+  dat=. 1!:11 f;p,1e6
+  len=. 1 + dat i: LF
+  if. len > #dat do.
+    'file not in LF-delimited lines' 13!:8[3
+  end.
+  p=. p + len
+  dat=. len {. dat
+else.
+  dat=. 1!:11 f;p,s-p
+  dat=. dat, LF -. {: dat
+  p=. s
+end.
+(toJ dat);p
+)
+freadr=: 3 : 0
+'f s'=. 2{.boxopen y
+f=. fboxname f
+max=. 1!:4 :: _1: f
+if. max -: _1 do. return. end.
+pos=. 0
+step=. 10000
+whilst. blk = cls
+do.
+  blk=. step<.max-pos
+  if. 0=blk do. 'file not organized in records' return. end.
+  dat=. 1!:11 f,<pos,blk
+  cls=. <./dat i.CRLF
+  pos=. pos+step
+end.
+len=. cls+pos-step
+dat=. 1!:11 f,<len,2<.max-len
+dlm=. +/CRLF e. dat
+wid=. len+dlm
+s=. wid*s,0 #~ 0=#s
+dat=. 1!:11 f,<s
+dat=. (-wid)[\dat
+(-dlm)}."1 dat
+)
+freads=: 3 : 0
+'' freads y
+:
+dat=. fread y
+if. (dat -: _1) +. 0=#dat do. return. end.
+dat=. fgets dat
+if. 'b'e.x do. dat=. <;._2 dat
+elseif. 'm'e.x do. dat=. ];._2 dat
+end.
+)
+frename=: 4 : 0
+x=. > fboxname x
+y=. > fboxname y
+if. x -: y do. return. end.
+if. IFUNIX do.
+  2!:0 'mv "',y,'" "',x,'"'
+else.
+  'kernel32 MoveFileW i *w *w' 15!:0 (uucp y);uucp x
+end.
+)
+freplace=: 4 : 0
+y=. boxopen y
+dat=. ,x
+f=. #@[ [ 1!:12
+dat f :: _1: (fboxname {.y),{:y
+)
+fsize=: (1!:4 :: _1:) @ (fboxname &>) @ boxopen
+fss=: 4 : 0
+y=. fboxname y
+size=. 1!:4 :: _1: y
+if. size -: _1 do. return. end.
+blk=. (#x) >. 100000 <. size
+r=. i.pos=. 0
+while. pos < size do.
+  dat=. 1!:11 y,<pos,blk <. size-pos
+  r=. r,pos+I. x E. dat
+  pos=. pos+blk+1-#x
+end.
+r
+)
+fssrplc=: fstringreplace
+fstamp=: (1: >@{ , @ (1!:0) @ fboxname) :: _1:
+fputs=: 3 : 0
+dat=. ":y
+if. 0 e. $dat do.
+  ''
+else.
+  if. 1>:#$dat do.
+    toHOST dat,(-.({:dat) e. CRLF) # LF
+  else.
+    ,dat,"1 toHOST LF
+  end.
+end.
+)
+ftype=: 3 : 0
+d=. (}: ^: ('/'={:)) ucp y
+d=. 1!:0 fboxname d
+if. #d do.
+  >: 'd' = 4 { > 4 { ,d
+else.
+  0
+end.
+)
+fview=: 3 : 0
+if. 3 ~: nc <'textview_z_' do.
+  sminfo 'textview not available.' return.
+end.
+txt=. freads y
+if. txt -: _1 do.
+  sminfo 'file not found: ',,>y return.
+end.
+textview txt
+)
+fwrite=: 4 : 0
+(,x) (#@[ [ 1!:2) :: _1: fboxname y
+)
+fwritenew=: 4 : 0
+dat=. ,x
+if. dat -: fread y do. 0 return. end.
+dat fwrite y
+)
+fwrites=: 4 : 0
+(fputs x) (#@[ [ 1!:2) :: _1: fboxname y
+)
+ftostring=: fputs
+fstring=: fgets
+cocurrent 'z'
+install=: 3 : 0
+require 'pacman'
+if. -. checkaccess_jpacman_ '' do. return. end.
+'update' jpkg ''
+select. y
+case. 'gtkide' do.
+  getgtkbin 0
+  'install' jpkg 'base library ide/gtk gui/gtk'
+case. 'all' do.
+  getgtkbin 0
+  'install' jpkg 'all'
+end.
+)
+getgtkbin=: 3 : 0
+if. UNAME -: 'Linux' do. return. end.
+if. (0={.y,0) *. 0 < #1!:0 jpath '~install/gtk/lib' do. return. end.
+require 'pacman'
+smoutput 'Installing gtk binaries...'
+z=. (IFWIN pick 'mac';'win'),(IF64 pick '32';'64'),'.zip'
+z=. 'http://www.jsoftware.com/download/gtk',z
+'rc p'=. httpget_jpacman_ z
+if. rc do.
+  smoutput 'unable to download: ',z return.
+end.
+d=. jpath '~install'
+if. IFWIN do.
+  unzip_jpacman_ p;d
+else.
+  hostcmd_jpacman_ 'unzip ',(dquote p),' -d ',dquote d
+  ('INSTALLPATH';jpath '~install/gtk') dirss jpath '~install/gtk/etc'
+end.
+if. #1!:0 jpath '~install/gtk/lib' do.
+  m=. 'Finished install of gtk binaries.'
+else.
+  m=. 'Unable to install gtk binaries.',LF
+  m=. m,'check that you have write permission for: ',LF,jpath '~install/gtk'
+end.
+smoutput m
+)
+cocurrent 'z'
+cuts=: 2 : 0
+if. n=1 do. [: u (#@[ + E. i. 1:) {. ]
+elseif. n=_1 do. [: u (E. i. 1:) {. ]
+elseif. n= 2 do. [: u (E. i. 1:) }. ]
+elseif. 1 do. [: u (#@[ + E. i. 1:) }. ]
+end.
+)
+cut=: ' '&$: :([: -.&a: <;._2@,~)
+deb=: #~ (+. 1: |. (> </\))@(' '&~:)
+debc=: #~"1 [: (+. (1: |. (> </\))) ' '&(+./ .~:)
+delstring=: 4 : ';(x E.r) <@((#x)&}.) ;.1 r=. x,y'
+detab=: ' ' I.@(=&TAB@])} ]
+dlb=: }.~ =&' ' i. 0:
+dltb=: #~ [: (+./\ *. +./\.) ' '&~:
+dtb=: #~ [: +./\. ' '&~:
+joinstring=: ''&$: : (#@[ }. <@[ ;@,. ])
+ljust=: (|.~ +/@(*./\)@(' '&=))"1
+rjust=: (|.~ -@(+/)@(*./\.)@(' '&=))"1
+splitstring=: #@[ }.each [ (E. <;.1 ]) ,
+ss=: I. @ E.
+dropto=: ] cuts 2
+dropafter=: ] cuts 1
+taketo=: ] cuts _1
+takeafter=: ] cuts _2
+charsub=: 4 : 0
+'f t'=. |: _2 ]\ x
+l=. f i."1 0 y
+x=. l { t,'?'
+c=. l = #f
+c } x ,: y
+)
+chopstring=: 3 : 0
+(' ';'""') chopstring y
+:
+dat=. y
+'fd sd'=. 2{. boxopen x
+assert. 1 = #fd
+if. =/sd do. sd=. (-<:#sd)}.sd   
+else. 
+  s=. {.('|'=fd){ '|`'  
+  dat=. dat rplc ({.sd);s;({:sd);s
+  sd=. s
+end.
+dat=. dat,fd
+b=. dat e. fd
+c=. dat e. sd
+d=. ~:/\ c                       
+fmsk=. b > d                     
+smsk=. (> (0 , }:)) c            
+smsk=. -. smsk +. c *. 1|.fmsk   
+y=. smsk#y,fd   
+fmsk=. 0:^:(,@1: -: ]) smsk#fmsk
+fmsk <;._2 y  
+)
+dltbs=: LF&$: : (4 : 0)
+txt=. ({.x), y
+a=. txt ~: ' '
+b=. (a # txt) e. x
+c=. b +. }. b, 1
+d=. ~: /\ a #^:_1 c ~: }: 0, c
+}. (a >: d) # txt
+)
+dquote=: ('"'&,@(,&'"'))@ (#~ >:@(=&'"'))
+dtbs=: 3 : 0
+CRLF dtbs y
+:
+txt=. y , {.x
+blk=. txt ~: ' '
+ndx=. +/\ blk
+b=. blk < }. (txt e. x), 0
+msk=. blk >: ndx e. b # ndx
+}: msk # txt
+)
+rplc=: stringreplace~
+fstringreplace=: 4 : 0
+nf=. 'no match found'
+y=. boxopen y
+try. size=. 1!:4 y catch. nf return. end.
+if. size=0 do. nf return. end.
+old=. freads y
+new=. x stringreplace old
+if. old -: new do. nf return. end.
+new fwrites y
+cnt=. +/ (0 pick x) E. old
+(":cnt),' replacement',((1~:cnt)#'s'),' made'
+)
+quote=: (''''&,@(,&''''))@ (#~ >:@(=&''''))
+nos=. i.@#@] e. #@[ ({~^:a:&0@(,&_1)@(]I.+) { _1,~]) I.@E.
+splitnostring=: #@[ }.each [ (nos f. <;.1 ]) ,
+stringreplace=: 4 : 0
+
+txt=. ,y
+t=. _2 [\ ,x
+old=. {."1 t
+new=. {:"1 t
+oldlen=. # &> old
+newlen=. # &> new
+
+if. *./ 1 = oldlen do.
+  
+  hit=. (;old) i. txt
+  ndx=. I. hit < #old
+  
+  if. 0 e. $ndx do. txt return. end.
+  
+  cnt=. 1
+  exp=. hit { newlen,1
+  hnx=. ndx { hit
+  bgn=. ndx + +/\ 0, (}: hnx) { newlen - 1
+  
+else.
+  
+  
+  hit=. old I. @ E. each <txt
+  cnt=. # &> hit
+  
+  if. 0 = +/ cnt do. txt return. end.
+  
+  bgn=. set=. ''
+  
+  pick=. > @ {
+  diff=. }. - }:
+  
+  for_i. I. 0 < cnt do.
+    ln=. i pick oldlen
+    cx=. (i pick hit) -. set, ,bgn -/ i.ln
+    while. 0 e. b=. 1, <:/\ ln <: diff cx do. cx=. b#cx end.
+    hit=. (<cx) i} hit
+    bgn=. bgn, cx
+    set=. set, ,cx +/ i.ln
+  end.
+  
+  cnt=. # &> hit
+  msk=. 0 < cnt
+  exp=. (#txt) $ 1
+  del=. newlen - oldlen
+  
+  if. #add=. I. msk *. del > 0 do.
+    exp=. (>: (add{cnt) # add{del) (;add{hit) } exp
+  end.
+  
+  if. #sub=. I. msk *. del < 0 do.
+    sbx=. ; (;sub{hit) + each (sub{cnt) # i. each sub{del
+    exp=. 0 sbx } exp
+  end.
+  
+  hit=. ; hit
+  ind=. /: (#hit) $ 1 2 3
+  hnx=. (/: ind { hit) { ind    
+  bgn=. (hnx { hit) + +/\ 0, }: hnx { cnt # del
+  
+end.
+
+ind=. ; bgn + each hnx { cnt # i.each newlen
+rep=. ; hnx { cnt # new
+rep ind} exp # txt
+)
+cutpara=: 3 : 0
+txt=. topara y
+txt=. txt,LF -. {:txt
+b=. (}.b,0) < b=. txt=LF
+b <;._2 txt
+)
+foldtext=: 4 : 0
+if. 0 e. $y do. '' return. end.
+y=. ; x&foldpara each cutpara y
+y }.~ - (LF ~: |.y) i. 1
+)
+foldpara=: 4 : 0
+if. 0=#y do. LF return. end.
+r=. ''
+x1=. >: x
+txt=. y
+while.
+  ind=. ' ' i.~ |. x1{.txt
+  s=. txt {.~ ndx=. x1 - >: x1 | ind
+  s=. (+./\.s ~: ' ') # s
+  r=. r, s, LF
+  #txt=. (ndx + ind<x1) }. txt
+do. end.
+r
+)
+topara=: 3 : 0
+if. 0=#y do. '' return. end.
+b=. y=LF
+c=. b +. y=' '
+b=. b > (1,}:b) +. }.c,0
+' ' (I. b) } y
+)
+
+cocurrent <'j'
+Alpha=: a. {~ , (a.i.'Aa') +/ i.26
+Num=: a. {~ (a.i.'0') + i.10
+AlphaNum=: Alpha,Num
+Boxes=: ((16+i.11) { a.),:'+++++++++|-'
+ScriptExt=: '.ijs'
+ProjExt=: '.jproj'
+
+extnone=: {.~ i:&'.'
+extproj=: , (ProjExt #~ '.'&e. < 0 < #)
+extsrc=: , ('.ijs' #~ '.'&e. < 0 < #)
+
+addfname=: , (e.&'/\' i: 1:) }. ]
+boxdraw=: 3 : '9!:7 y { Boxes'
+hostcmd=: [: 2!:0 '(' , ,&' || true)'
+fpath=: [: }: +./\.@:=&'/' # ]
+maxrecent=: 3 : '(RecentMax <. #r) {. r=. ~.y'
+pack=: [: (,. ".&.>) ;: ::]
+pdef=: 3 : '0 0$({."1 y)=: {:"1 y'
+seldir=: #~ '-d'&-:"1 @ (1 4&{"1) @ > @ (4&{"1)
+spath=: #~ [: *./\. '/'&~:
+termLF=: , (0 < #) # LF -. {:
+termsep=: , (0 < #) # '/' -. {:
+tolist=: }.@;@:(LF&,each)
+remsep=: }.~ [: - '/' = {:
+
+path2proj=: ,'/',ProjExt ,~ spath
+3 : 0''
+if. IFUNIX do.
+  filecase=: ]
+  isroot=: '/' = {.
+else.
+  filecase=: tolower
+  isroot=: ':' = {.@}.
+end.
+0
+)
+dirtreex=: 3 : 0
+'' dirtreex y
+:
+y=. jpath y
+p=. (+./\. y = '/') # y
+d=. 1!:0 y,('/' = {:y) # '*'
+if. 0 = #d do. '' return. end.
+a=. > 4 {"1 d
+m=. 'd' = 4 {"1 a
+f=. (<p) ,each {."1 d
+if. 1 e. m do.
+  f=. f, ; dirtreex each (m#f) ,each <'/','*'
+end.
+if. #x do.
+  f #~ (1 e. x E. ])&> f
+end.
+)
+getfolderdefs=: 3 : 0
+p=. (, '/' , ProjExt ,~ spath) each subdirtree y
+t=. p #~ #@(1!:0)&> p
+t;<fpath each (1+#y) }. each (-#ProjExt) }. each t
+)
+isconfigfile=: 3 : 0
+'p f'=. fpathname y
+x=. f i: '.'
+(p -: jpath '~config/') *. '.cfg'-:x}.f
+)
+isdir=: 3 : 0
+d=. 1!:0 y
+if. 1 ~: #d do. 0 return. end.
+'d' = 4 { 4 pick ,d
+)
+istempname=: 3 : 0
+x=. y i: '.'
+*./ ('.ijs'-:x}.y),(x{.y) e. Num
+)
+istempscript=: 3 : 0
+'p f'=. fpathname y
+(p -: jpath '~temp/') *. istempname f
+)
+jshowconsole=: 3 : 0
+if. -.IFWIN do. 'only supported in windows' return. end.
+t=. {.>'kernel32.dll GetConsoleWindow x'cd''
+'user32.dll ShowWindow n x i'cd t;(0-:y){5 0
+i.0 0
+)
+mkdir=: 3 : 0
+a=. termsep y
+if. #1!:0 }:a do. 1 return. end.
+for_n. I. a='/' do.
+  1!:5 :: 0: < n{.a
+end.
+)
+newtempscript=: 3 : 0
+x=. ScriptExt
+p=. jpath '~temp/'
+d=. 1!:0 p,'*',x
+a=. (-#x) }. each {."1 d
+a=. a #~ (*./ .e.&'0123456789') &> a
+a=. 0, {.@:(0&".) &> a
+p, x ,~ ": {. (i. >: #a) -. a
+)
+nounrep=: 2 }. [: ; [: nounrep1 each ;:
+nounrep1=: LF2 , ] , '=: ' , [: nounrep2 ".
+nounrep2=: 3 : 0
+if. 0 = #y do. '''''' return. end.
+select. 3!:0 y
+fcase. 32 do.
+  y=. ; y ,each LF
+case. 2 do.
+  if. LF e. y do.
+    y=. y, LF -. {:y
+    '0 : 0', LF, ; <;.2 y,')'
+  else.
+    quote y
+  end.
+case. do.
+  ": y
+end.
+)
+octal=: 3 : 0
+t=. ,y
+x=. a. i. t
+n=. x e. 9 10 13
+m=. n < 32 > x
+if. (isutf8 t) > 1 e. m do. t return. end.
+r=. t ,"0 1 [ 3 # EAV
+if. #m=. I. m +. x>126 do.
+  s=. '\',.}.1 ": 8 (#.^:_1) 255,m{x
+  r=. s m} r
+end.
+EAV -.~ ,r
+)
+rmdir=: 3 : 0
+r=. 1;'not a directory: ',":y
+if. 0=#y do. r return. end.
+d=. 1!:0 y
+if. 1 ~: #d do. r return. end.
+if. 'd' ~: 4 { 4 pick {. d do. r return. end.
+if. IFWIN do.
+  shell_jtask_ 'rmdir ',y,' /S /Q'
+else.
+  hostcmd_j_ 'rm -rf --preserve-root ',y
+end.
+(#1!:0 y);''
+)
+scripts=: 3 : 0
+if. 0=#y do.
+  list 0{"1 Public
+elseif. 'v'e.y do.
+  dir=. Public
+  a=. >0{"1 dir
+  b=. >1{"1 dir
+  a /:~ a,.' ',.b
+elseif. 1 do.
+  'invalid argument to scripts: ',,":y
+end.
+)
+setfolder=: 3 : 0
+if. 0=#y do.
+  Folder=: FolderTree=: FolderIds=: '' return.
+end.
+assert. (<y) e. {."1 UserFolders
+Folder=: y
+'FolderTree FolderIds'=: getfolderdefs jpath '~',y
+if. 3=nc <'snapshot_tree_jp_' do.
+  snapshot_tree_jp_ FolderTree
+end.
+EMPTY
+)
+subdirtree=: 3 : 0
+if. 0=#1!:0 y do. '' return. end.
+r=. ''
+dir=. <y,'/'
+while. #dir do.
+  fpath=. (>{.dir) &,
+  dir=. }.dir
+  dat=. seldir 1!:0 fpath '*'
+  if. #dat do.
+    dat=. fpath each {."1 dat
+    r=. r,dat
+    dir=. (dat ,each '/'),dir
+  end.
+end.
+sort filecase each r
+)
+unixshell=: 3 : 0
+f=. jpath '~temp/shell.sh'
+t=. jpath '~temp/shell.txt'
+e=. jpath '~temp/shell.err'
+('#!/bin/sh',LF,y,LF) fwrite f
+'rwx------' 1!:7 <f
+hostcmd '"',f,'" > "',t,'" 2> "',e,'"'
+r=. (fread t);fread e
+ferase f;t;e
+r
+)
+unixshellx=: 3 : 0
+'res err'=. unixshell y
+if. #err do.
+  smoutput 'Shell command error: ',LF,LF,err
+end.
+res
+)
+htmlhelp=: 3 : 0
+f=. jpath '~addons/docs/help/',y
+if. fexist ({.~ i:&'#') f do.
+  browse 'file://',f
+else.
+  f=. 'http://www.jsoftware.com/docs/help',}.(i.&'/'{.]) 9!:14''
+  browse f,'/',y
+end.
+)
+browseref=: 3 : 0
+htmlhelp 'dictionary/',y
+)
+dquote=: 3 : 0
+if. '"' = {.y do. y else. '"',y,'"' end.
+)
+browse=: 3 : 0
+cmd=. dlb@dtb y
+isURL=. 1 e. '://'&E.
+if. IFJHS do.
+  cmd=. '/' (I. cmd='\') } cmd
+  if. -. isURL cmd do.
+    if. -.fexist cmd do. EMPTY return. end.
+    cmd=. 'file://',cmd
+  end.
+  redirecturl_jijxm_=: (' ';'%20') stringreplace cmd
+  EMPTY return.
+end.
+browser=. Browser_j_
+if. IFWIN do.
+  ShellExecute=. 'shell32 ShellExecuteW > i x *w *w *w *w i'&cd
+  SW_SHOWNORMAL=. 1
+  NULL=. <0
+  cmd=. '/' (I. cmd='\') } cmd
+  if. -. isURL cmd do.
+    if. -.fexist cmd do. EMPTY return. end.
+    cmd=. 'file://',cmd
+  end.
+  if. 0 = #browser do.
+    r=. ShellExecute 0;(uucp 'open');(uucp cmd);NULL;NULL;SW_SHOWNORMAL
+  else.
+    r=. ShellExecute 0;(uucp 'open');(uucp browser);(uucp dquote cmd);NULL;SW_SHOWNORMAL
+  end.
+  if. r<33 do. sminfo 'browse error:',browser,' ',cmd,LF2,1{::cderx'' end.
+  EMPTY return.
+end.
+if. 0 = #browser do.
+  browser=. dfltbrowser''
+end.
+browser=. dquote (browser;Browser_nox_j_){::~ nox=. IFUNIX *. (0;'') e.~ <2!:5 'DISPLAY'
+cmd=. '/' (I. cmd='\') } cmd
+if. -. isURL cmd do.
+  cmd=. 'file://',cmd
+end.
+cmd=. browser,' ',dquote cmd
+try.
+  2!:1 cmd, (0=nox)#' >/dev/null 2>&1 &'
+catch.
+  msg=. 'Could not run the browser with the command:',LF2
+  msg=. msg, cmd,LF2
+  if. IFGTK do.
+    msg=. msg, 'You can change the browser definition in Edit|Configure|Base',LF2
+  end.
+  sminfo 'Run Browser';msg
+end.
+EMPTY
+)
+dfltbrowser=: verb define
+select. UNAME
+case. 'Win' do. ''
+case. 'Darwin' do. 'open'
+case. do.
+  try.
+    2!:0'which google-chrome'
+    'google-chrome' return. catch. end.
+  try.
+    2!:0'which chromium-browser'
+    'chromium-browser' return. catch. end.
+  try.
+    2!:0'which firefox'
+    'firefox' return. catch. end.
+  try.
+    2!:0'which konqueror'
+    'konqueror' return. catch. end.
+  try.
+    2!:0'which netscape'
+    'netscape' return. catch. end.
+  '' return.
+end.
+)
+Folder=: ''
+FolderTree=: FolderIds=: 0
+
+Cwh=: 79 24
+jpath=: 3 : 0
+nam=. jpathsep y
+if. '~' ~: {. nam do. return. end.
+fld=. SystemFolders, UserFolders
+ind=. nam i. '/'
+tag=. }. ind {. nam
+if. 0=#tag do.       
+  tag=. 'home'
+  nam=. '~home',}.nam
+  ind=. nam i. '/'
+end.
+if. tag -: 'addons' do.
+  bal=. 8 }. nam
+end.
+par=. '.' = {. tag
+if. par do.
+  len=. ('.' = tag) i. 0
+  tag=. len }. tag
+end.
+ndx=. ({."1 fld) i. <tag
+if. ndx < # fld do.
+  bal=. ind }. nam
+  pfx=. 1 pick ndx { fld
+  if. '~' = {.pfx do.
+    pfx=. jpath pfx
+  end.
+  if. par do.
+    pfx=. ((#pfx) | (+/\. pfx='/') i: len) {. pfx
+  end.
+  nam=. pfx,bal
+end.
+nam
+)
+tofoldername=: 3 : 0
+if. 0=#y do. '' return. end.
+folders=. UserFolders,SystemFolders
+pds=. {."1 folders
+pps=. termsep each {:"1 folders
+ndx=. \: # &> pps
+pds=. ndx{pds
+pps=. ndx{pps
+res=. filecase each boxxopen y
+len=. # &> pps
+for_i. i.#res do.
+  nam=. i pick res
+  if. '~' = {. nam,'~' do. continue. end.
+  msk=. pps = len {. each <nam,'/'
+  if. 1 e. msk do.
+    ndx=. ((i. >./) msk # len) { I. msk
+    nam=. ('~', > ndx { pds),(<: ndx { len) }. nam
+    res=. (<nam) i } res
+  end.
+end.
+pps=. }: each pps
+ndx=. 1 + pps i: &> '/'
+msk=. ndx < len
+pps=. msk # ndx {.each pps
+pds=. msk # pds
+len=. # &> pps
+for_i. i.#res do.
+  nam=. i pick res
+  if. '~' = {. nam,'~' do. continue. end.
+  if. '/' = {. nam do. continue. end.
+  msk=. pps = len {. each <nam
+  if. 1 e. msk do.
+    ndx=. ((i. >./) msk # len) { I. msk
+    nam=. ('~.', > ndx { pds),(<: ndx { len) }. nam
+    res=. (<nam) i } res
+  end.
+end.
+if. L. y do. res else. >res end.
+)
+Loaded=: ''
+Public=: i. 0 2
+UserFolders=: i. 0 2
+Ignore=: ;: 'colib convert coutil dates debug dir dll files libpath strings text'
+buildpublic=: 3 : 0
+dat=. deb toJ y
+dat=. a: -.~ <;._2 dat, LF
+ndx=. dat i. &> ' '
+short=. ndx {.each dat
+long=. ndx }. each dat
+long=. extsrc@jpathsep@deb each long
+msk=. (<'system','/') = 7 {. each long
+long=. (msk{'';'~') ,each long
+Public=: sort ~. Public,~ short,.long
+empty''
+)
+cutnames=: 3 : 0
+if. LF e. y do.
+  txt=. y, LF
+  nms=. (txt = LF) <;._2 txt
+else.
+  txt=. y, ' '
+  msk=. txt = '"'
+  com=. (txt = ' ') > ~: /\ msk
+  msk=. (msk *. ~:/\msk) < msk <: 1 |. msk
+  nms=. (msk # com) <;._2 msk # txt
+end.
+nms -. a:
+)
+3 : 0''
+if. 0=9!:24'' do.
+  exist=: fexist
+else.
+  exist=: 0:
+end.
+1
+)
+fullname=: 3 : 0
+p=. '/'
+d=. jpath y
+if. </ d i. ':',p do.
+elseif. (2{.d) -: 2#p do.
+elseif. p ~: 1{.d do.
+  jcwdpath d
+elseif. IFWIN do.
+  (2{.jcwdpath''),d
+end.
+)
+getscripts=: 3 : 0
+if. 0=#y do. '' return. end.
+if. 0=L.y do.
+  if. fexist y do.
+    y=. <y
+  else.
+    y=. cutnames y
+  end.
+end.
+y=. y -. Ignore, IFJHS#;:'plot viewmat'   
+if. 0=#y do. '' return. end.
+ndx=. ({."1 Public) i. y
+ind=. I. ndx < # Public
+y=. ((ind { ndx) { 1 {"1 Public) ind } y
+ind=. (i.#y) -. ind
+if. #ind do.
+  sel=. ind { y
+  msk=. -. '.' e. &> sel
+  cnt=. +/ &> sel e. each <'/\'
+  ndx=. ind #~ msk *. cnt=1
+  y=. (addfname each ndx { y) ndx } y
+  ndx=. ind #~ msk *. cnt > 0
+  sel=. (<'~addons/') ,each (ndx{y) ,each <'.ijs'
+  smsk=. (1:@(1!:4) ::0:)@<@jpath &> sel
+  y=. (smsk#sel) (smsk#ndx) } y
+end.
+fullname each jpath each y
+)
+getpath=: ([: +./\. =&'/') # ]
+recentmax=: 3 : '({.~ RecentMax <. #) ~.y'
+recentfiles_add_j_=: 3 : 0
+RecentFiles_j_=: recentmax (<jpath y),RecentFiles_j_
+recentsave''
+)
+recentproj_add=: 3 : 0
+RecentProjects_j_=: recentmax (<jpath y),RecentProjects_j_
+recentsave''
+)
+recentsave=: 3 : 0
+n=. 'Folder RecentDirmatch RecentFif RecentFiles RecentProjects'
+r=. 'NB. gtkide recent',LF2,nounrep n
+r fwritenew jpath '~config/recent.dat'
+)
+xedit=: 0&$: : (4 : 0)
+'file row'=. 2{.(boxopen y),<0
+if. IFJHS do.         
+  xmr ::0: file
+  EMPTY return.
+end.
+editor=. (Editor_j_;Editor_nox_j_){::~ nox=. IFUNIX *. (0;'') e.~ <2!:5 'DISPLAY'
+if. 0=#editor do. EMPTY return. end.
+cmd=. editor stringreplace~ '%f';(dquote >@fboxname file);'%l';(":>:row)
+try.
+  if. IFUNIX do.
+    if. x do.
+      2!:1 cmd
+    else.
+      2!:1 cmd, (0=nox+.(1 -.@e. 'term' E. editor)*.(1 e. '/vi' E. editor)+.'vi'-:2{.editor)#' &'
+    end.
+  else.
+    (x{0 _1) fork_jtask_ cmd
+  end.
+catch.
+  msg=. '|Could not run the editor:',cmd,LF
+  msg=. msg,'|You can change the Editor definition in Edit|Configure|Base'
+  smoutput msg
+end.
+EMPTY
+)
+cocurrent 'z'
+jpath=: jpath_j_
+load=: 3 : 0
+0 load y
+:
+fls=. getscripts_j_ y
+fn=. ('script',x#'d')~
+for_fl. fls do.
+  if. Displayload_j_ do. smoutput > fl end.
+  if. -. fexist fl do.
+    smoutput 'not found: ',>fl
+  end.
+  fn fl
+  Loaded_j_=: ~. Loaded_j_,fl
+end.
+empty''
+)
+
+loadd=: 1&load
+require=: 3 : 0
+fls=. Loaded_j_ -.~ getscripts_j_ y
+if. # fls do. load fls else. empty'' end.
+)
+scripts=: scripts_j_
+show=: 3 : 0
+y=. y,(0=#y)#0 1 2 3
+if. (3!:0 y) e. 2 32 do. y=. cutopen y
+else. y=. (4!:1 y) -. (,'y');,'y.' end.
+wid=. {.wcsize''
+sub=. '.'&(I. @(e.&(9 10 12 13 127 254 255{a.))@]})
+j=. '((1<#$t)#(":$t),''$''),":,t'
+j=. 'if. L. t=. ".y do. 5!:5 <y return. end.';j
+j=. 'if. 0~:4!:0 <y do. 5!:5 <y return. end.';j
+a=. (,&'=: ',sub @ (3 : j)) each y
+; ((wid <. #&> a) {.each a) ,each LF
+)
+xedit=: xedit_j_
+wcsize=: 3 : 0
+if. (-.IFGTK+.IFJHS) *. UNAME-:'Linux' do.
+  |.@".@(-.&LF)@(2!:0) :: (Cwh_j_"_) '/bin/stty size 2>/dev/null'
+else.
+  Cwh_j_
+end.
+)
+coclass 'jcompare'
+
+MAXPFX=: 100        
+MAXLCS=: *: MAXPFX  
+cin=: e. ,
+fmt0=: 'p<0 [>q<] >' & (8!:0)
+fmt1=: 'p<1 [>q<] >' & (8!:0)
+lcs=: * * 1 + >./\@:(_1&|.)@:(>./\"1@:(_1&|."1))
+mindx=: }.@{.@/:~@(+/"1 ,. ])
+remltws=: 3 : 0
+y=. y, LF
+dat=. <;._2 y
+msk=. CR = {: &> dat
+dat=. (-msk) }. each dat
+fn=. #~ ([: (+./\ *. +./\.) -.@(e.&(' ',TAB)))
+dat=. fn each dat
+dat=. dat ,each msk{'';CR
+}: ; dat ,each LF
+)
+comp=: 4 : 0
+
+sep=. ((LF cin x) +. LF cin y) { CRLF
+if. 2=#$x do. x=. <@dtb"1 x
+else. x=. <;._2 x,sep -. {:x end.
+if. 2=#$y do. y=. <@dtb"1 y
+else. y=. <;._2 y,sep -. {:y end.
+if. x -: y do. 'no difference' return. end.
+XY=: x,y
+AX=: X=: XY i. x
+AY=: Y=: XY i. y
+NX=: i.#x
+NY=: i.#y
+SX=: SY=: ''
+while. compend'' do. complcs'' end.
+sx=. /:~ SX
+sy=. /:~ SY
+x=. (fmt0 sx) ,each (sx { AX) { XY
+y=. (fmt1 sy) ,each (sy { AY) { XY
+r=. (x,y) /: (sx,.0),sy,.1
+}: ; r ,each LF
+)
+fcomp=: 4 : 0
+'p j n'=. 3 {. x
+'ifws ifsep'=. 2 2 #: j
+'x y'=. _2 {. ,&p each cutopen y
+if. L. n do.
+  'nx ny'=. n
+else.
+  nx=. x [ ny=. y
+end.
+f=. 1!:1 :: _1:
+tx=. f x=. fboxname x
+if. tx -: _1 do. 'unable to read ',nx return. end.
+ty=. f y=. fboxname y
+if. ty -: _1 do. 'unable to read ',ny return. end.
+tx=. f2utf8 tx
+ty=. f2utf8 ty
+if. ifsep do.
+  tx=. toJ tx
+  ty=. toJ ty
+end.
+if. ifws do.
+  tx=. remltws tx
+  ty=. remltws ty
+end.
+f=. _3&{.@('0'&,@(":@]))
+mth=. _3[\'   JanFebMarAprMayJunJulAugSepOctNovDec'
+'a m d h n s'=. 6{.1 pick dx=. ,1!:0 x
+fx=. (4":d),' ',(m{mth),'  ::' 0 3 6 9};f &.> 100|a,h,n,s
+'a m d h n s'=. 6{.1 pick dy=. ,1!:0 y
+fy=. (4":d),' ',(m{mth),'  ::' 0 3 6 9};f &.> 100|a,h,n,s
+'nx ny'=. <"1>nx;ny
+r=. 'comparing:',LF
+r=. r,nx,fx,'  ',(":2 pick dx),LF
+r=. r,ny,fy,'  ',(":2 pick dy),LF
+r,tx compare ty
+)
+
+compend=: 3 : 0
+old=. 0 0
+len=. (#X),#Y
+
+while. -. len -: old do.
+  old=. len
+  t=. <./len
+  m=. 0 i.~ (t {. X) = t {. Y
+  X=: m }. X
+  Y=: m }. Y
+  t=. m - t
+  n=. - +/ *./\. (t {. X) = t {. Y
+  X=: n }. X
+  Y=: n }. Y
+  NX=: m }. n }. NX
+  NY=: m }. n }. NY
+  m=. X e. Y
+  if. 0 e. m do.
+    SX=: SX,(-.m)#NX
+    X=: m # X
+    NX=: m # NX
+  end.
+  m=. Y e. X
+  if. 0 e. m do.
+    SY=: SY,(-.m)#NY
+    Y=: m # Y
+    NY=: m # NY
+  end.
+  len=. (#X),#Y
+end.
+if. -. 0 e. len do. 1 return. end.
+SX=: SX,NX
+SY=: SY,NY
+0
+)
+complcs=: 3 : 0
+lx=. #X
+ly=. #Y
+if. MAXLCS < lx * ly do.
+  select. MAXPFX < lx,ly
+  case. 0 1 do.
+    ly=. <. MAXLCS % lx
+  case. 1 0 do.
+    lx=. <. MAXLCS % ly
+  case. do.
+    lx=. ly=. MAXPFX
+  end.
+end.
+a=. lx {. X
+b=. ly {. Y
+m=. ((b =/ a),.0),0
+cm=. lcs ^:_ m
+len=. >./ ,cm
+rc=. 1 + mindx ($cm) #: I. len = ,cm
+cm=. , rc {. cm
+msk=. (1+i.len) =/ cm
+ndx=. <@I."1 msk
+pos=. ; (<rc) #: each ndx
+pos=. (+/"1 pos),.pos
+pos=. ((# &> ndx) # i.len),.pos
+pos=. /:~ pos
+'ib ia'=. |: 2 }."1 (~:{."1 pos)#pos
+n=. 1 + {: ia
+SX=: SX,(<<<ia) { n {. NX
+X=: n }. X
+NX=: n }. NX
+n=. 1 + {: ib
+SY=: SY,(<<<ib) { n {. NY
+Y=: n }. Y
+NY=: n }. NY
+0
+)
+compare=: 4 : 0
+if. x -: y do. 'no difference' return. end.
+if. 0=#x do. 'empty left argument' return. end.
+if. 0=#y do. 'empty right argument' return. end.
+a=. conew 'jcompare'
+r=. x comp__a y
+coerase a
+r
+)
+fcompare=: 3 : 0
+('';0) fcomp y
+:
+(x;0) fcomp y
+)
+fcompares=: 3 : 0
+('';1) fcomp y
+:
+(x;1) fcomp y
+)
+compare_z_=: compare_jcompare_
+fcompare_z_=: fcompare_jcompare_
+fcompares_z_=: fcompares_jcompare_
+
+cocurrent <'base'
\ No newline at end of file