picolisp

Unnamed repository; edit this file to name it for gitweb.
git clone https://logand.com/git/picolisp.git/
Log | Files | Refs | README | LICENSE

commit 61095adc010303389ca8d3a95067a7ae1212b11c
parent 07981be86c04fb29aee9426ce2341b366d7a105e
Author: Alexander Burger <abu@software-lab.de>
Date:   Thu, 23 May 2013 11:00:05 +0200

Close files upon explicit coroutine stop
Diffstat:
Mlib/map | 104++++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc64/flow.l | 19++++++++++++++++++-
Msrc64/io.l | 57++++++++++++++++++++++++---------------------------------
Msrc64/tags | 290++++++++++++++++++++++++++++++++++++++++---------------------------------------
4 files changed, 240 insertions(+), 230 deletions(-)

diff --git a/lib/map b/lib/map @@ -1,5 +1,5 @@ -! (2867 . "@src64/flow.l") -$ (2969 . "@src64/flow.l") +! (2884 . "@src64/flow.l") +$ (2986 . "@src64/flow.l") % (2572 . "@src64/big.l") & (2807 . "@src64/big.l") * (2389 . "@src64/big.l") @@ -29,7 +29,7 @@ adr (596 . "@src64/main.l") alarm (477 . "@src64/main.l") all (788 . "@src64/sym.l") and (1624 . "@src64/flow.l") -any (3999 . "@src64/io.l") +any (3990 . "@src64/io.l") append (1339 . "@src64/subr.l") apply (713 . "@src64/apply.l") arg (2613 . "@src64/main.l") @@ -46,7 +46,7 @@ bool (1724 . "@src64/flow.l") box (828 . "@src64/flow.l") box? (1131 . "@src64/sym.l") by (1669 . "@src64/apply.l") -bye (3417 . "@src64/flow.l") +bye (3434 . "@src64/flow.l") bytes (2973 . "@src64/subr.l") caaaar (271 . "@src64/subr.l") caaadr (288 . "@src64/subr.l") @@ -62,7 +62,7 @@ caddar (409 . "@src64/subr.l") cadddr (435 . "@src64/subr.l") caddr (156 . "@src64/subr.l") cadr (45 . "@src64/subr.l") -call (3069 . "@src64/flow.l") +call (3086 . "@src64/flow.l") car (5 . "@src64/subr.l") case (1965 . "@src64/flow.l") catch (2467 . "@src64/flow.l") @@ -83,12 +83,12 @@ cdddr (245 . "@src64/subr.l") cddr (79 . "@src64/subr.l") cdr (17 . "@src64/subr.l") chain (1142 . "@src64/subr.l") -char (3481 . "@src64/io.l") +char (3472 . "@src64/io.l") chop (1228 . "@src64/sym.l") circ (817 . "@src64/subr.l") circ? (2403 . "@src64/subr.l") clip (1800 . "@src64/subr.l") -close (4412 . "@src64/io.l") +close (4403 . "@src64/io.l") cmd (3223 . "@src64/main.l") cnt (1413 . "@src64/apply.l") co (2548 . "@src64/flow.l") @@ -99,7 +99,7 @@ cond (1919 . "@src64/flow.l") connect (227 . "@src64/net.l") cons (747 . "@src64/subr.l") copy (1226 . "@src64/subr.l") -ctl (4285 . "@src64/io.l") +ctl (4276 . "@src64/io.l") ctty (3018 . "@src64/main.l") cut (1931 . "@src64/sym.l") date (2727 . "@src64/main.l") @@ -115,15 +115,15 @@ diff (2590 . "@src64/subr.l") dir (3153 . "@src64/main.l") dm (545 . "@src64/flow.l") do (2141 . "@src64/flow.l") -e (2930 . "@src64/flow.l") -echo (4443 . "@src64/io.l") +e (2947 . "@src64/flow.l") +echo (4434 . "@src64/io.l") env (608 . "@src64/main.l") -eof (3558 . "@src64/io.l") -eol (3549 . "@src64/io.l") -err (4265 . "@src64/io.l") +eof (3549 . "@src64/io.l") +eol (3540 . "@src64/io.l") +err (4256 . "@src64/io.l") errno (1613 . "@src64/main.l") eval (175 . "@src64/flow.l") -ext (5177 . "@src64/io.l") +ext (5168 . "@src64/io.l") ext? (1166 . "@src64/sym.l") extern (1032 . "@src64/sym.l") extra (1269 . "@src64/flow.l") @@ -138,13 +138,13 @@ find (1322 . "@src64/apply.l") fish (1613 . "@src64/apply.l") flg? (2446 . "@src64/subr.l") flip (1700 . "@src64/subr.l") -flush (5152 . "@src64/io.l") +flush (5143 . "@src64/io.l") fold (3521 . "@src64/sym.l") for (2230 . "@src64/flow.l") -fork (3243 . "@src64/flow.l") +fork (3260 . "@src64/flow.l") format (2089 . "@src64/big.l") free (1960 . "@src64/db.l") -from (3577 . "@src64/io.l") +from (3568 . "@src64/io.l") full (1076 . "@src64/subr.l") fun? (750 . "@src64/sym.l") gc (436 . "@src64/gc.l") @@ -157,38 +157,38 @@ gt0 (2718 . "@src64/big.l") hash (2976 . "@src64/big.l") head (1821 . "@src64/subr.l") heap (523 . "@src64/main.l") -hear (3262 . "@src64/io.l") +hear (3253 . "@src64/io.l") host (193 . "@src64/net.l") id (1028 . "@src64/db.l") idx (2171 . "@src64/sym.l") if (1805 . "@src64/flow.l") if2 (1824 . "@src64/flow.l") ifn (1865 . "@src64/flow.l") -in (4225 . "@src64/io.l") +in (4216 . "@src64/io.l") inc (2256 . "@src64/big.l") index (2638 . "@src64/subr.l") info (3055 . "@src64/main.l") intern (1007 . "@src64/sym.l") -ipid (3188 . "@src64/flow.l") +ipid (3205 . "@src64/flow.l") isa (967 . "@src64/flow.l") job (1429 . "@src64/flow.l") journal (971 . "@src64/db.l") -key (3410 . "@src64/io.l") -kill (3220 . "@src64/flow.l") +key (3401 . "@src64/io.l") +kill (3237 . "@src64/flow.l") last (2045 . "@src64/subr.l") le0 (2693 . "@src64/big.l") length (2742 . "@src64/subr.l") let (1479 . "@src64/flow.l") let? (1540 . "@src64/flow.l") lieu (1157 . "@src64/db.l") -line (3733 . "@src64/io.l") -lines (3886 . "@src64/io.l") +line (3724 . "@src64/io.l") +lines (3877 . "@src64/io.l") link (1173 . "@src64/subr.l") lisp (2282 . "@src64/main.l") list (888 . "@src64/subr.l") listen (160 . "@src64/net.l") lit (150 . "@src64/flow.l") -load (4202 . "@src64/io.l") +load (4193 . "@src64/io.l") lock (1185 . "@src64/db.l") loop (2173 . "@src64/flow.l") low? (3387 . "@src64/sym.l") @@ -238,30 +238,30 @@ offset (2678 . "@src64/subr.l") on (1717 . "@src64/sym.l") onOff (1747 . "@src64/sym.l") one (1780 . "@src64/sym.l") -open (4369 . "@src64/io.l") -opid (3204 . "@src64/flow.l") +open (4360 . "@src64/io.l") +opid (3221 . "@src64/flow.l") opt (3344 . "@src64/main.l") or (1640 . "@src64/flow.l") -out (4245 . "@src64/io.l") +out (4236 . "@src64/io.l") pack (1279 . "@src64/sym.l") pair (2395 . "@src64/subr.l") pass (754 . "@src64/apply.l") pat? (736 . "@src64/sym.l") -path (1251 . "@src64/io.l") -peek (3465 . "@src64/io.l") +path (1270 . "@src64/io.l") +peek (3456 . "@src64/io.l") pick (1369 . "@src64/apply.l") -pipe (4306 . "@src64/io.l") -poll (3354 . "@src64/io.l") +pipe (4297 . "@src64/io.l") +poll (3345 . "@src64/io.l") pool (651 . "@src64/db.l") pop (1907 . "@src64/sym.l") port (5 . "@src64/net.l") -pr (5260 . "@src64/io.l") +pr (5251 . "@src64/io.l") pre? (1545 . "@src64/sym.l") -prin (5076 . "@src64/io.l") -prinl (5090 . "@src64/io.l") -print (5116 . "@src64/io.l") -println (5147 . "@src64/io.l") -printsp (5132 . "@src64/io.l") +prin (5067 . "@src64/io.l") +prinl (5081 . "@src64/io.l") +print (5107 . "@src64/io.l") +println (5138 . "@src64/io.l") +printsp (5123 . "@src64/io.l") prior (2714 . "@src64/subr.l") prog (1760 . "@src64/flow.l") prog1 (1768 . "@src64/flow.l") @@ -281,12 +281,12 @@ rand (3003 . "@src64/big.l") range (998 . "@src64/subr.l") rank (3049 . "@src64/subr.l") raw (455 . "@src64/main.l") -rd (5194 . "@src64/io.l") -read (2674 . "@src64/io.l") +rd (5185 . "@src64/io.l") +read (2665 . "@src64/io.l") replace (1500 . "@src64/subr.l") rest (2642 . "@src64/main.l") reverse (1679 . "@src64/subr.l") -rewind (5160 . "@src64/io.l") +rewind (5151 . "@src64/io.l") rollback (1803 . "@src64/db.l") rot (849 . "@src64/subr.l") run (306 . "@src64/flow.l") @@ -299,33 +299,33 @@ set (1616 . "@src64/sym.l") setq (1649 . "@src64/sym.l") sigio (493 . "@src64/main.l") size (2809 . "@src64/subr.l") -skip (3535 . "@src64/io.l") +skip (3526 . "@src64/io.l") sort (3978 . "@src64/subr.l") sp? (727 . "@src64/sym.l") -space (5094 . "@src64/io.l") +space (5085 . "@src64/io.l") split (1593 . "@src64/subr.l") stack (552 . "@src64/main.l") state (2009 . "@src64/flow.l") stem (1990 . "@src64/subr.l") -str (4053 . "@src64/io.l") +str (4044 . "@src64/io.l") str? (1145 . "@src64/sym.l") strip (1577 . "@src64/subr.l") struct (2073 . "@src64/main.l") sub? (1578 . "@src64/sym.l") sum (1460 . "@src64/apply.l") super (1225 . "@src64/flow.l") -sym (4039 . "@src64/io.l") +sym (4030 . "@src64/io.l") sym? (2435 . "@src64/subr.l") symbols (942 . "@src64/sym.l") -sync (3222 . "@src64/io.l") +sync (3213 . "@src64/io.l") sys (855 . "@src64/main.l") t (1751 . "@src64/flow.l") tail (1912 . "@src64/subr.l") -tell (3294 . "@src64/io.l") +tell (3285 . "@src64/io.l") text (1407 . "@src64/sym.l") throw (2493 . "@src64/flow.l") -tick (3156 . "@src64/flow.l") -till (3644 . "@src64/io.l") +tick (3173 . "@src64/flow.l") +till (3635 . "@src64/io.l") time (2860 . "@src64/main.l") touch (1181 . "@src64/sym.l") trail (707 . "@src64/main.l") @@ -343,16 +343,16 @@ use (1573 . "@src64/flow.l") usec (2964 . "@src64/main.l") val (1597 . "@src64/sym.l") version (3358 . "@src64/main.l") -wait (3184 . "@src64/io.l") +wait (3175 . "@src64/io.l") when (1884 . "@src64/flow.l") while (2061 . "@src64/flow.l") wipe (3262 . "@src64/sym.l") with (1332 . "@src64/flow.l") -wr (5277 . "@src64/io.l") +wr (5268 . "@src64/io.l") xchg (1672 . "@src64/sym.l") xor (1701 . "@src64/flow.l") x| (2887 . "@src64/big.l") -yield (2722 . "@src64/flow.l") +yield (2726 . "@src64/flow.l") yoke (1197 . "@src64/subr.l") zap (1195 . "@src64/sym.l") zero (1765 . "@src64/sym.l") diff --git a/src64/flow.l b/src64/flow.l @@ -1,4 +1,4 @@ -# 19may13abu +# 23may13abu # (c) Software Lab. Alexander Burger (code 'redefMsgEC) @@ -2704,6 +2704,10 @@ if z # Stopped last coroutine? ld (StkLimit) 0 # Yes: Clear stack limit end + ld C (X (pack -II "-(EnvMid-EnvInFrames)")) # Open input frames + call closeCoFilesC + ld C (X (pack -II "-(EnvMid-EnvOutFrames)")) # Open output frames + call closeCoFilesC ld E TSym # Return T end pop X @@ -2863,6 +2867,19 @@ ld X (X) # Next frame loop +(code 'closeCoFilesC 0) + do + null C + while nz + null (C II) # 'pid'? + if nz # Yes + cc close((C I)) # Close 'fd' + call waitFileC # Wait for pipe process if necessary + end + ld C (C) + loop + ret + # (! . exe) -> any (code 'doBreak 2) ld E (E CDR) # exe diff --git a/src64/io.l b/src64/io.l @@ -1,4 +1,4 @@ -# 06feb13abu +# 23may13abu # (c) Software Lab. Alexander Burger # Close file descriptor @@ -139,7 +139,7 @@ ret # Close input file -(code 'closeInFileA) +(code 'closeInFileA 0) shl A 3 # Vector index cmp A (InFDs) # 'fd' < 'InFDs'? if lt # Yes @@ -161,7 +161,7 @@ ret # Close output file -(code 'closeOutFileA) +(code 'closeOutFileA 0) shl A 3 # Vector index cmp A (OutFDs) # 'fd' < 'OutFDs'? if lt # Yes @@ -181,6 +181,25 @@ end ret +# Wait for pipe process if necessary +(code 'waitFileC 0) + cmp (C II) 1 # 'pid' > 1? + if gt # Yes + do + cc waitpid((C II) 0 0) # Wait for pipe process + nul4 # OK? + while s # No + call errno_A + cmp A EINTR # Interrupted? + jne closeErrX + null (Signal) # Signal? + if nz # Yes + call sighandler0 + end + loop + end + ret + # Interruptible read (code 'slowZ_F) ld (Z I) 0 # Clear 'ix' @@ -1874,21 +1893,7 @@ cc close((C I)) # Close 'fd' ld A (C I) # Close input file call closeInFileA - cmp (C II) 1 # 'pid' > 1? - if gt # Yes - do - cc waitpid((C II) 0 0) # Wait for pipe process - nul4 # OK? - while s # No - call errno_A - cmp A EINTR # Interrupted? - jne closeErrX - null (Signal) # Signal? - if nz # Yes - call sighandler0 - end - loop - end + call waitFileC # Wait for pipe process if necessary else ld A (InFile) # Current InFile? null A @@ -1927,21 +1932,7 @@ cc close((C I)) # Close 'fd' ld A (C I) # Close input file call closeOutFileA - cmp (C II) 1 # 'pid' > 1? - if gt # Yes - do - cc waitpid((C II) 0 0) # Wait for pipe process - nul4 # OK? - while s # No - call errno_A - cmp A EINTR # Interrupted? - jne closeErrX - null (Signal) # Signal? - if nz # Yes - call sighandler0 - end - loop - end + call waitFileC # Wait for pipe process if necessary end ld (PutB) (C III) # Retrieve 'put' ld C (C) # Get link diff --git a/src64/tags b/src64/tags @@ -585,7 +585,7 @@ sys/x86-64.linux.defs.l,1959 doHash2976,70791 doRand3003,71394 -./io.l,2921 +./io.l,2942 closeAX5,75 unLockFileAC15,253 wrLockFileC23,487 @@ -598,130 +598,131 @@ sys/x86-64.linux.defs.l,1959 initInFileCA_A67,1523 initOutFileA_A106,2476 closeInFileA142,3345 -closeOutFileA164,3830 -slowZ_F185,4281 -slowNbC_FA207,4748 -rdBytesCEX_F247,5696 -rdBytesNbCEX_F268,6160 -wrBytesCEX_F317,7454 -clsChildY347,8254 -wrChildCXY358,8506 -flushA_F397,9611 -flushAll417,10021 -stdinByte_A431,10332 -getBinaryZ_FB453,10688 -byteNumBCX_CX469,11058 -binReadZ_FE525,12587 -prByteCEXY686,16842 -prCntCE709,17368 -prTellEZ728,17735 -prE734,17890 -binPrintEZ736,17959 -putTellBZ1002,25715 -tellBegZ_Z1010,25905 -tellEndAZ1017,26057 -unsync1064,27164 -rdHear_FE1081,27585 -symByteCX_FACX1094,27931 -symCharCX_FACX1115,28370 -bufStringE_SZ1148,29322 -pathStringE_SZ1178,29976 -doPath1251,31929 -charSymACX_CX1263,32199 -byteSymBCX_CX1298,33123 -currFdX_C1340,34239 -currFd_C1344,34351 -rdOpenEXY1361,34724 -wrOpenEXY1502,39130 -erOpenEXY1635,43305 -ctOpenEXY1677,44324 -getStdin_A1731,45738 -getParse_A1802,47578 -pushInFilesY1825,48048 -pushOutFilesY1849,48588 -pushErrFilesY1860,48883 -pushCtlFilesY1865,48987 -popInFiles1870,49091 -popOutFiles1921,50312 -popErrFiles1961,51337 -popCtlFiles1968,51540 -getChar_A1982,51931 -skipC_A2014,52802 -testEscA_F2057,53723 -anonymousX_FE2091,54476 -rdAtomBY_E2124,55339 -rdList_E2176,56766 -readA_E2314,60298 -readC_E2498,64615 -tokenCE_E2528,65206 -doRead2674,68743 -inReadyC_F2712,69583 -fdSetCL_X2724,69864 -fdRdSetCZL2736,70098 -fdWrSetCZL2743,70240 -rdSetCL_F2750,70389 -wrSetCL_F2755,70505 -rdSetRdyCL_F2760,70628 -waitFdCEX_A2782,71089 -doWait3184,84515 -doSync3222,85238 -doHear3262,86178 -doTell3294,86872 -fdSetC_Y3343,87960 -doPoll3354,88194 -doKey3410,89565 -doPeek3465,91004 -doChar3481,91282 -doSkip3535,92227 -doEol3549,92574 -doEof3558,92740 -doFrom3577,93097 -doTill3644,94766 -eolA_F3718,96715 -doLine3733,97019 -doLines3886,101059 -parseBCE_E3927,101960 -doAny3999,103615 -doSym4039,104553 -doStr4053,104812 -loadBEX_E4106,105938 -doLoad4202,108288 -doIn4225,108700 -doOut4245,109030 -doErr4265,109364 -doCtl4285,109699 -doPipe4306,110054 -doOpen4369,111600 -doClose4412,112580 -doEcho4443,113171 -putStdoutB4656,118695 -newline4699,119677 -space4703,119719 -outNumE4708,119783 -outWordA4715,119911 -prExtNmX4727,120149 -outOctA4735,120343 -outAoA4748,120611 -outStringS4760,120859 -outStringC4762,120929 -outNameE4772,121068 -prNameX4780,121185 -printE_E4790,121340 -printE4799,121476 -prinE_E5012,127092 -prinE5021,127228 -doPrin5076,128490 -doPrinl5090,128760 -doSpace5094,128828 -doPrint5116,129227 -doPrintsp5132,129522 -doPrintln5147,129811 -doFlush5152,129899 -doRewind5160,130036 -doExt5177,130426 -doRd5194,130765 -doPr5260,132545 -doWr5277,132877 +closeOutFileA164,3832 +waitFileC185,4301 +slowZ_F204,4701 +slowNbC_FA226,5168 +rdBytesCEX_F266,6116 +rdBytesNbCEX_F287,6580 +wrBytesCEX_F336,7874 +clsChildY366,8674 +wrChildCXY377,8926 +flushA_F416,10031 +flushAll436,10441 +stdinByte_A450,10752 +getBinaryZ_FB472,11108 +byteNumBCX_CX488,11478 +binReadZ_FE544,13007 +prByteCEXY705,17262 +prCntCE728,17788 +prTellEZ747,18155 +prE753,18310 +binPrintEZ755,18379 +putTellBZ1021,26135 +tellBegZ_Z1029,26325 +tellEndAZ1036,26477 +unsync1083,27584 +rdHear_FE1100,28005 +symByteCX_FACX1113,28351 +symCharCX_FACX1134,28790 +bufStringE_SZ1167,29742 +pathStringE_SZ1197,30396 +doPath1270,32349 +charSymACX_CX1282,32619 +byteSymBCX_CX1317,33543 +currFdX_C1359,34659 +currFd_C1363,34771 +rdOpenEXY1380,35144 +wrOpenEXY1521,39550 +erOpenEXY1654,43725 +ctOpenEXY1696,44744 +getStdin_A1750,46158 +getParse_A1821,47998 +pushInFilesY1844,48468 +pushOutFilesY1868,49008 +pushErrFilesY1879,49303 +pushCtlFilesY1884,49407 +popInFiles1889,49511 +popOutFiles1926,50395 +popErrFiles1952,51083 +popCtlFiles1959,51286 +getChar_A1973,51677 +skipC_A2005,52548 +testEscA_F2048,53469 +anonymousX_FE2082,54222 +rdAtomBY_E2115,55085 +rdList_E2167,56512 +readA_E2305,60044 +readC_E2489,64361 +tokenCE_E2519,64952 +doRead2665,68489 +inReadyC_F2703,69329 +fdSetCL_X2715,69610 +fdRdSetCZL2727,69844 +fdWrSetCZL2734,69986 +rdSetCL_F2741,70135 +wrSetCL_F2746,70251 +rdSetRdyCL_F2751,70374 +waitFdCEX_A2773,70835 +doWait3175,84261 +doSync3213,84984 +doHear3253,85924 +doTell3285,86618 +fdSetC_Y3334,87706 +doPoll3345,87940 +doKey3401,89311 +doPeek3456,90750 +doChar3472,91028 +doSkip3526,91973 +doEol3540,92320 +doEof3549,92486 +doFrom3568,92843 +doTill3635,94512 +eolA_F3709,96461 +doLine3724,96765 +doLines3877,100805 +parseBCE_E3918,101706 +doAny3990,103361 +doSym4030,104299 +doStr4044,104558 +loadBEX_E4097,105684 +doLoad4193,108034 +doIn4216,108446 +doOut4236,108776 +doErr4256,109110 +doCtl4276,109445 +doPipe4297,109800 +doOpen4360,111346 +doClose4403,112326 +doEcho4434,112917 +putStdoutB4647,118441 +newline4690,119423 +space4694,119465 +outNumE4699,119529 +outWordA4706,119657 +prExtNmX4718,119895 +outOctA4726,120089 +outAoA4739,120357 +outStringS4751,120605 +outStringC4753,120675 +outNameE4763,120814 +prNameX4771,120931 +printE_E4781,121086 +printE4790,121222 +prinE_E5003,126838 +prinE5012,126974 +doPrin5067,128236 +doPrinl5081,128506 +doSpace5085,128574 +doPrint5107,128973 +doPrintsp5123,129268 +doPrintln5138,129557 +doFlush5143,129645 +doRewind5151,129782 +doExt5168,130172 +doRd5185,130511 +doPr5251,132291 +doWr5268,132623 ./apply.l,445 applyXYZ_E4,51 @@ -1039,7 +1040,7 @@ sys/x86-64.linux.defs.l,1959 consNumEA_E1024,23492 consNumEC_E1042,23868 -./flow.l,1632 +./flow.l,1658 redefMsgEC4,51 putSrcEC_E25,589 redefineCE109,3406 @@ -1107,24 +1108,25 @@ sys/x86-64.linux.defs.l,1959 doFinally2524,58583 doCo2548,59123 resumeCoroutine2573,59938 -doYield2722,65031 -cutLocalCX2843,68511 -joinLocalCX2856,68741 -doBreak2867,68923 -brkLoadE_E2875,69075 -doE2930,70675 -doTrace2969,71441 -traceCY3041,73356 -doCall3069,73844 -doTick3156,76036 -doIpid3188,77033 -doOpid3204,77321 -doKill3220,77616 -doFork3243,78051 -forkLispX_FE3256,78272 -doBye3417,82832 -byeE3429,83004 -finishE3441,83315 +doYield2726,65261 +cutLocalCX2847,68741 +joinLocalCX2860,68971 +closeCoFilesC2870,69134 +doBreak2884,69397 +brkLoadE_E2892,69549 +doE2947,71149 +doTrace2986,71915 +traceCY3058,73830 +doCall3086,74318 +doTick3173,76510 +doIpid3205,77507 +doOpid3221,77795 +doKill3237,78090 +doFork3260,78525 +forkLispX_FE3273,78746 +doBye3434,83306 +byeE3446,83478 +finishE3458,83789 ./subr.l,2147 doCar5,71