0000: 2f 2a 20 4a 69 6d 20 2d 20 41 4e 53 49 20 49 2f /* Jim - ANSI I/
0010: 4f 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 20 43 O extension. * C
0020: 6f 70 79 72 69 67 68 74 20 32 30 30 35 20 53 61 opyright 2005 Sa
0030: 6c 76 61 74 6f 72 65 20 53 61 6e 66 69 6c 69 70 lvatore Sanfilip
0040: 70 6f 20 3c 61 6e 74 69 72 65 7a 40 69 6e 76 65 po <antirez@inve
0050: 63 65 2e 6f 72 67 3e 0a 20 2a 0a 20 2a 20 24 49 ce.org>. *. * $I
0060: 64 3a 20 6a 69 6d 2d 61 69 6f 2e 63 2c 76 20 31 d: jim-aio.c,v 1
0070: 2e 37 20 32 30 30 35 2f 30 33 2f 33 31 20 31 32 .7 2005/03/31 12
0080: 3a 32 30 3a 32 31 20 61 6e 74 69 72 65 7a 20 45 :20:21 antirez E
0090: 78 70 20 24 0a 20 2a 0a 20 2a 20 4c 69 63 65 6e xp $. *. * Licen
00a0: 73 65 64 20 75 6e 64 65 72 20 74 68 65 20 41 70 sed under the Ap
00b0: 61 63 68 65 20 4c 69 63 65 6e 73 65 2c 20 56 65 ache License, Ve
00c0: 72 73 69 6f 6e 20 32 2e 30 20 28 74 68 65 20 22 rsion 2.0 (the "
00d0: 4c 69 63 65 6e 73 65 22 29 3b 0a 20 2a 20 79 6f License");. * yo
00e0: 75 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 74 68 u may not use th
00f0: 69 73 20 66 69 6c 65 20 65 78 63 65 70 74 20 69 is file except i
0100: 6e 20 63 6f 6d 70 6c 69 61 6e 63 65 20 77 69 74 n compliance wit
0110: 68 20 74 68 65 20 4c 69 63 65 6e 73 65 2e 0a 20 h the License..
0120: 2a 20 59 6f 75 20 6d 61 79 20 6f 62 74 61 69 6e * You may obtain
0130: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 4c a copy of the L
0140: 69 63 65 6e 73 65 20 61 74 0a 20 2a 0a 20 2a 20 icense at. *. *
0150: 20 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 61 http://www.a
0160: 70 61 63 68 65 2e 6f 72 67 2f 6c 69 63 65 6e 73 pache.org/licens
0170: 65 73 2f 4c 49 43 45 4e 53 45 2d 32 2e 30 0a 20 es/LICENSE-2.0.
0180: 2a 0a 20 2a 20 41 20 63 6f 70 79 20 6f 66 20 74 *. * A copy of t
0190: 68 65 20 6c 69 63 65 6e 73 65 20 69 73 20 61 6c he license is al
01a0: 73 6f 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 so included in t
01b0: 68 65 20 73 6f 75 72 63 65 20 64 69 73 74 72 69 he source distri
01c0: 62 75 74 69 6f 6e 0a 20 2a 20 6f 66 20 4a 69 6d bution. * of Jim
01d0: 2c 20 61 73 20 61 20 54 58 54 20 66 69 6c 65 20 , as a TXT file
01e0: 6e 61 6d 65 20 63 61 6c 6c 65 64 20 4c 49 43 45 name called LICE
01f0: 4e 53 45 2e 0a 20 2a 0a 20 2a 20 55 6e 6c 65 73 NSE.. *. * Unles
0200: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 61 70 s required by ap
0210: 70 6c 69 63 61 62 6c 65 20 6c 61 77 20 6f 72 20 plicable law or
0220: 61 67 72 65 65 64 20 74 6f 20 69 6e 20 77 72 69 agreed to in wri
0230: 74 69 6e 67 2c 20 73 6f 66 74 77 61 72 65 0a 20 ting, software.
0240: 2a 20 64 69 73 74 72 69 62 75 74 65 64 20 75 6e * distributed un
0250: 64 65 72 20 74 68 65 20 4c 69 63 65 6e 73 65 20 der the License
0260: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 6f is distributed o
0270: 6e 20 61 6e 20 22 41 53 20 49 53 22 20 42 41 53 n an "AS IS" BAS
0280: 49 53 2c 0a 20 2a 20 57 49 54 48 4f 55 54 20 57 IS,. * WITHOUT W
0290: 41 52 52 41 4e 54 49 45 53 20 4f 52 20 43 4f 4e ARRANTIES OR CON
02a0: 44 49 54 49 4f 4e 53 20 4f 46 20 41 4e 59 20 4b DITIONS OF ANY K
02b0: 49 4e 44 2c 20 65 69 74 68 65 72 20 65 78 70 72 IND, either expr
02c0: 65 73 73 20 6f 72 20 69 6d 70 6c 69 65 64 2e 0a ess or implied..
02d0: 20 2a 20 53 65 65 20 74 68 65 20 4c 69 63 65 6e * See the Licen
02e0: 73 65 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 se for the speci
02f0: 66 69 63 20 6c 61 6e 67 75 61 67 65 20 67 6f 76 fic language gov
0300: 65 72 6e 69 6e 67 20 70 65 72 6d 69 73 73 69 6f erning permissio
0310: 6e 73 20 61 6e 64 0a 20 2a 20 6c 69 6d 69 74 61 ns and. * limita
0320: 74 69 6f 6e 73 20 75 6e 64 65 72 20 74 68 65 20 tions under the
0330: 4c 69 63 65 6e 73 65 2e 0a 20 2a 2f 0a 0a 23 69 License.. */..#i
0340: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e nclude <stdio.h>
0350: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e .#include <strin
0360: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 g.h>.#include <e
0370: 72 72 6e 6f 2e 68 3e 0a 0a 23 64 65 66 69 6e 65 rrno.h>..#define
0380: 20 4a 49 4d 5f 45 58 54 45 4e 53 49 4f 4e 0a 23 JIM_EXTENSION.#
0390: 69 6e 63 6c 75 64 65 20 22 6a 69 6d 2e 68 22 0a include "jim.h".
03a0: 0a 23 64 65 66 69 6e 65 20 41 49 4f 5f 43 4d 44 .#define AIO_CMD
03b0: 5f 4c 45 4e 20 31 32 38 0a 23 64 65 66 69 6e 65 _LEN 128.#define
03c0: 20 41 49 4f 5f 42 55 46 5f 4c 45 4e 20 31 30 32 AIO_BUF_LEN 102
03d0: 34 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 4..typedef struc
03e0: 74 20 41 69 6f 46 69 6c 65 20 7b 0a 20 20 20 20 t AioFile {.
03f0: 46 49 4c 45 20 2a 66 70 3b 0a 20 20 20 20 69 6e FILE *fp;. in
0400: 74 20 6b 65 65 70 4f 70 65 6e 3b 20 2f 2a 20 49 t keepOpen; /* I
0410: 66 20 73 65 74 2c 20 74 68 65 20 66 69 6c 65 20 f set, the file
0420: 69 73 20 6e 6f 74 20 66 63 6c 6f 73 65 64 20 6f is not fclosed o
0430: 6e 20 63 6c 65 61 6e 75 70 20 28 73 74 64 69 6e n cleanup (stdin
0440: 2c 20 2e 2e 2e 29 20 2a 2f 0a 7d 20 41 69 6f 46 , ...) */.} AioF
0450: 69 6c 65 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 ile;..static voi
0460: 64 20 4a 69 6d 41 69 6f 53 65 74 45 72 72 6f 72 d JimAioSetError
0470: 28 4a 69 6d 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Jim_Interp *int
0480: 65 72 70 29 0a 7b 0a 20 20 20 20 4a 69 6d 5f 53 erp).{. Jim_S
0490: 65 74 52 65 73 75 6c 74 53 74 72 69 6e 67 28 69 etResultString(i
04a0: 6e 74 65 72 70 2c 20 73 74 72 65 72 72 6f 72 28 nterp, strerror(
04b0: 65 72 72 6e 6f 29 2c 20 2d 31 29 3b 0a 7d 0a 0a errno), -1);.}..
04c0: 73 74 61 74 69 63 20 76 6f 69 64 20 4a 69 6d 41 static void JimA
04d0: 69 6f 44 65 6c 50 72 6f 63 28 4a 69 6d 5f 49 6e ioDelProc(Jim_In
04e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 76 6f terp *interp, vo
04f0: 69 64 20 2a 70 72 69 76 44 61 74 61 29 0a 7b 0a id *privData).{.
0500: 20 20 20 20 41 69 6f 46 69 6c 65 20 2a 61 66 20 AioFile *af
0510: 3d 20 70 72 69 76 44 61 74 61 3b 0a 20 20 20 20 = privData;.
0520: 4a 49 4d 5f 4e 4f 54 55 53 45 44 28 69 6e 74 65 JIM_NOTUSED(inte
0530: 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 61 rp);.. if (!a
0540: 66 2d 3e 6b 65 65 70 4f 70 65 6e 29 0a 20 20 20 f->keepOpen).
0550: 20 20 20 20 20 66 63 6c 6f 73 65 28 61 66 2d 3e fclose(af->
0560: 66 70 29 3b 0a 20 20 20 20 4a 69 6d 5f 46 72 65 fp);. Jim_Fre
0570: 65 28 61 66 29 3b 0a 7d 0a 0a 2f 2a 20 43 61 6c e(af);.}../* Cal
0580: 6c 73 20 74 6f 20 5b 61 69 6f 2e 66 69 6c 65 5d ls to [aio.file]
0590: 20 63 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 73 create commands
05a0: 20 74 68 61 74 20 61 72 65 20 69 6d 70 6c 65 6d that are implem
05b0: 65 6e 74 65 64 20 62 79 20 74 68 69 73 0a 20 2a ented by this. *
05c0: 20 43 20 63 6f 6d 6d 61 6e 64 2e 20 2a 2f 0a 73 C command. */.s
05d0: 74 61 74 69 63 20 69 6e 74 20 4a 69 6d 41 69 6f tatic int JimAio
05e0: 48 61 6e 64 6c 65 72 43 6f 6d 6d 61 6e 64 28 4a HandlerCommand(J
05f0: 69 6d 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 im_Interp *inter
0600: 70 2c 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 20 p, int argc,.
0610: 20 20 20 20 20 4a 69 6d 5f 4f 62 6a 20 2a 63 6f Jim_Obj *co
0620: 6e 73 74 20 2a 61 72 67 76 29 0a 7b 0a 20 20 20 nst *argv).{.
0630: 20 41 69 6f 46 69 6c 65 20 2a 61 66 20 3d 20 4a AioFile *af = J
0640: 69 6d 5f 43 6d 64 50 72 69 76 44 61 74 61 28 69 im_CmdPrivData(i
0650: 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 nterp);. int
0660: 6f 70 74 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 option;. cons
0670: 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 73 5b t char *options[
0680: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 22 63 ] = {. "c
0690: 6c 6f 73 65 22 2c 20 22 73 65 65 6b 22 2c 20 22 lose", "seek", "
06a0: 74 65 6c 6c 22 2c 20 22 67 65 74 73 22 2c 20 22 tell", "gets", "
06b0: 70 75 74 73 22 2c 20 22 66 6c 75 73 68 22 2c 20 puts", "flush",
06c0: 4e 55 4c 4c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 NULL. };.
06d0: 65 6e 75 6d 20 7b 4f 50 54 5f 43 4c 4f 53 45 2c enum {OPT_CLOSE,
06e0: 20 4f 50 54 5f 53 45 45 4b 2c 20 4f 50 54 5f 54 OPT_SEEK, OPT_T
06f0: 45 4c 4c 2c 20 4f 50 54 5f 47 45 54 53 2c 20 4f ELL, OPT_GETS, O
0700: 50 54 5f 50 55 54 53 2c 20 4f 50 54 5f 46 4c 55 PT_PUTS, OPT_FLU
0710: 53 48 7d 3b 0a 0a 20 20 20 20 69 66 20 28 61 72 SH};.. if (ar
0720: 67 63 20 3c 20 32 29 20 7b 0a 20 20 20 20 20 20 gc < 2) {.
0730: 20 20 4a 69 6d 5f 57 72 6f 6e 67 4e 75 6d 41 72 Jim_WrongNumAr
0740: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 61 72 gs(interp, 1, ar
0750: 67 76 2c 20 22 6d 65 74 68 6f 64 20 3f 61 72 67 gv, "method ?arg
0760: 73 20 2e 2e 2e 3f 22 29 3b 0a 20 20 20 20 20 20 s ...?");.
0770: 20 20 72 65 74 75 72 6e 20 4a 49 4d 5f 45 52 52 return JIM_ERR
0780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
0790: 4a 69 6d 5f 47 65 74 45 6e 75 6d 28 69 6e 74 65 Jim_GetEnum(inte
07a0: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 6f 70 74 rp, argv[1], opt
07b0: 69 6f 6e 73 2c 20 26 6f 70 74 69 6f 6e 2c 20 22 ions, &option, "
07c0: 41 49 4f 20 6d 65 74 68 6f 64 22 2c 0a 20 20 20 AIO method",.
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4a 49 4d JIM
07e0: 5f 45 52 52 4d 53 47 29 20 21 3d 20 4a 49 4d 5f _ERRMSG) != JIM_
07f0: 4f 4b 29 0a 20 20 20 20 20 20 20 20 72 65 74 75 OK). retu
0800: 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 20 rn JIM_ERR;.
0810: 2f 2a 20 43 4c 4f 53 45 20 2a 2f 0a 20 20 20 20 /* CLOSE */.
0820: 69 66 20 28 6f 70 74 69 6f 6e 20 3d 3d 20 4f 50 if (option == OP
0830: 54 5f 43 4c 4f 53 45 29 20 7b 0a 20 20 20 20 20 T_CLOSE) {.
0840: 20 20 20 69 66 20 28 61 72 67 63 20 21 3d 20 32 if (argc != 2
0850: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ) {.
0860: 4a 69 6d 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Jim_WrongNumArgs
0870: 28 69 6e 74 65 72 70 2c 20 32 2c 20 61 72 67 76 (interp, 2, argv
0880: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 , "");.
0890: 20 20 20 72 65 74 75 72 6e 20 4a 49 4d 5f 45 52 return JIM_ER
08a0: 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 R;. }.
08b0: 20 20 20 20 20 4a 69 6d 5f 44 65 6c 65 74 65 43 Jim_DeleteC
08c0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 4a ommand(interp, J
08d0: 69 6d 5f 47 65 74 53 74 72 69 6e 67 28 61 72 67 im_GetString(arg
08e0: 76 5b 30 5d 2c 20 4e 55 4c 4c 29 29 3b 0a 20 20 v[0], NULL));.
08f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 4a 49 4d return JIM
0900: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 _OK;. } else
0910: 69 66 20 28 6f 70 74 69 6f 6e 20 3d 3d 20 4f 50 if (option == OP
0920: 54 5f 53 45 45 4b 29 20 7b 0a 20 20 20 20 2f 2a T_SEEK) {. /*
0930: 20 53 45 45 4b 20 2a 2f 0a 20 20 20 20 20 20 20 SEEK */.
0940: 20 69 6e 74 20 6f 72 69 67 20 3d 20 53 45 45 4b int orig = SEEK
0950: 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f _SET;. lo
0960: 6e 67 20 6f 66 66 73 65 74 3b 0a 0a 20 20 20 20 ng offset;..
0970: 20 20 20 20 69 66 20 28 61 72 67 63 20 21 3d 20 if (argc !=
0980: 33 20 26 26 20 61 72 67 63 20 21 3d 20 34 29 20 3 && argc != 4)
0990: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4a 69 {. Ji
09a0: 6d 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 m_WrongNumArgs(i
09b0: 6e 74 65 72 70 2c 20 32 2c 20 61 72 67 76 2c 20 nterp, 2, argv,
09c0: 22 6f 66 66 73 65 74 20 3f 6f 72 69 67 69 6e 3f "offset ?origin?
09d0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ");.
09e0: 72 65 74 75 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a return JIM_ERR;.
09f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
0a00: 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 34 29 if (argc == 4)
0a10: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 {. i
0a20: 66 20 28 4a 69 6d 5f 43 6f 6d 70 61 72 65 53 74 f (Jim_CompareSt
0a30: 72 69 6e 67 49 6d 6d 65 64 69 61 74 65 28 69 6e ringImmediate(in
0a40: 74 65 72 70 2c 20 61 72 67 76 5b 33 5d 2c 20 22 terp, argv[3], "
0a50: 73 74 61 72 74 22 29 29 0a 20 20 20 20 20 20 20 start")).
0a60: 20 20 20 20 20 20 20 20 20 6f 72 69 67 20 3d 20 orig =
0a70: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 SEEK_SET;.
0a80: 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 4a else if (J
0a90: 69 6d 5f 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 im_CompareString
0aa0: 49 6d 6d 65 64 69 61 74 65 28 69 6e 74 65 72 70 Immediate(interp
0ab0: 2c 20 61 72 67 76 5b 33 5d 2c 20 22 63 75 72 72 , argv[3], "curr
0ac0: 65 6e 74 22 29 29 0a 20 20 20 20 20 20 20 20 20 ent")).
0ad0: 20 20 20 20 20 20 20 6f 72 69 67 20 3d 20 53 45 orig = SE
0ae0: 45 4b 5f 43 55 52 3b 0a 20 20 20 20 20 20 20 20 EK_CUR;.
0af0: 20 20 20 20 65 6c 73 65 20 69 66 20 28 4a 69 6d else if (Jim
0b00: 5f 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 49 6d _CompareStringIm
0b10: 6d 65 64 69 61 74 65 28 69 6e 74 65 72 70 2c 20 mediate(interp,
0b20: 61 72 67 76 5b 33 5d 2c 20 22 65 6e 64 22 29 29 argv[3], "end"))
0b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
0b40: 20 6f 72 69 67 20 3d 20 53 45 45 4b 5f 45 4e 44 orig = SEEK_END
0b50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c ;. el
0b60: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 se {.
0b70: 20 20 20 20 20 4a 69 6d 5f 53 65 74 52 65 73 75 Jim_SetResu
0b80: 6c 74 28 69 6e 74 65 72 70 2c 20 4a 69 6d 5f 4e lt(interp, Jim_N
0b90: 65 77 45 6d 70 74 79 53 74 72 69 6e 67 4f 62 6a ewEmptyStringObj
0ba0: 28 69 6e 74 65 72 70 29 29 3b 0a 20 20 20 20 20 (interp));.
0bb0: 20 20 20 20 20 20 20 20 20 20 20 4a 69 6d 5f 41 Jim_A
0bc0: 70 70 65 6e 64 53 74 72 69 6e 67 73 28 69 6e 74 ppendStrings(int
0bd0: 65 72 70 2c 20 4a 69 6d 5f 47 65 74 52 65 73 75 erp, Jim_GetResu
0be0: 6c 74 28 69 6e 74 65 72 70 29 2c 0a 20 20 20 20 lt(interp),.
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0c00: 20 20 20 20 22 62 61 64 20 6f 72 69 67 69 6e 20 "bad origin
0c10: 5c 22 22 2c 20 4a 69 6d 5f 47 65 74 53 74 72 69 \"", Jim_GetStri
0c20: 6e 67 28 61 72 67 76 5b 33 5d 2c 20 4e 55 4c 4c ng(argv[3], NULL
0c30: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ),.
0c40: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 6d "\" m
0c50: 75 73 74 20 62 65 3a 20 73 74 61 72 74 2c 20 63 ust be: start, c
0c60: 75 72 72 65 6e 74 2c 20 6f 72 20 65 6e 64 22 2c urrent, or end",
0c70: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 NULL);.
0c80: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 4a return J
0c90: 49 4d 5f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 IM_ERR;.
0ca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a }. }.
0cb0: 20 20 20 20 20 20 20 20 69 66 20 28 4a 69 6d 5f if (Jim_
0cc0: 47 65 74 4c 6f 6e 67 28 69 6e 74 65 72 70 2c 20 GetLong(interp,
0cd0: 61 72 67 76 5b 32 5d 2c 20 26 6f 66 66 73 65 74 argv[2], &offset
0ce0: 29 20 21 3d 20 4a 49 4d 5f 4f 4b 29 0a 20 20 20 ) != JIM_OK).
0cf0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 return
0d00: 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 20 20 20 20 JIM_ERR;.
0d10: 20 69 66 20 28 66 73 65 65 6b 28 61 66 2d 3e 66 if (fseek(af->f
0d20: 70 2c 20 6f 66 66 73 65 74 2c 20 6f 72 69 67 29 p, offset, orig)
0d30: 20 3d 3d 20 2d 31 29 20 7b 0a 20 20 20 20 20 20 == -1) {.
0d40: 20 20 20 20 20 20 4a 69 6d 41 69 6f 53 65 74 45 JimAioSetE
0d50: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 20 20 rror(interp);.
0d60: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e return
0d70: 20 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 20 20 20 JIM_ERR;.
0d80: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 }. retu
0d90: 72 6e 20 4a 49 4d 5f 4f 4b 3b 0a 20 20 20 20 7d rn JIM_OK;. }
0da0: 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f 6e else if (option
0db0: 20 3d 3d 20 4f 50 54 5f 54 45 4c 4c 29 20 7b 0a == OPT_TELL) {.
0dc0: 20 20 20 20 2f 2a 20 54 45 4c 4c 20 2a 2f 0a 20 /* TELL */.
0dd0: 20 20 20 20 20 20 20 6c 6f 6e 67 20 70 6f 73 69 long posi
0de0: 74 69 6f 6e 3b 0a 0a 20 20 20 20 20 20 20 20 69 tion;.. i
0df0: 66 20 28 61 72 67 63 20 21 3d 20 32 29 20 7b 0a f (argc != 2) {.
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 4a 69 6d 5f Jim_
0e10: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
0e20: 65 72 70 2c 20 32 2c 20 61 72 67 76 2c 20 22 22 erp, 2, argv, ""
0e30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 );. r
0e40: 65 74 75 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a 20 eturn JIM_ERR;.
0e50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
0e60: 20 70 6f 73 69 74 69 6f 6e 20 3d 20 66 74 65 6c position = ftel
0e70: 6c 28 61 66 2d 3e 66 70 29 3b 0a 20 20 20 20 20 l(af->fp);.
0e80: 20 20 20 4a 69 6d 5f 53 65 74 52 65 73 75 6c 74 Jim_SetResult
0e90: 28 69 6e 74 65 72 70 2c 20 4a 69 6d 5f 4e 65 77 (interp, Jim_New
0ea0: 49 6e 74 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 IntObj(interp, p
0eb0: 6f 73 69 74 69 6f 6e 29 29 3b 0a 20 20 20 20 20 osition));.
0ec0: 20 20 20 72 65 74 75 72 6e 20 4a 49 4d 5f 4f 4b return JIM_OK
0ed0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
0ee0: 28 6f 70 74 69 6f 6e 20 3d 3d 20 4f 50 54 5f 47 (option == OPT_G
0ef0: 45 54 53 29 20 7b 0a 20 20 20 20 2f 2a 20 47 45 ETS) {. /* GE
0f00: 54 53 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 TS */. ch
0f10: 61 72 20 62 75 66 5b 41 49 4f 5f 42 55 46 5f 4c ar buf[AIO_BUF_L
0f20: 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 4a 69 6d EN];. Jim
0f30: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 _Obj *objPtr;..
0f40: 20 20 20 20 20 20 20 69 66 20 28 61 72 67 63 20 if (argc
0f50: 21 3d 20 32 20 26 26 20 61 72 67 63 20 21 3d 20 != 2 && argc !=
0f60: 33 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 3) {.
0f70: 20 4a 69 6d 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 Jim_WrongNumArg
0f80: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 61 72 67 s(interp, 2, arg
0f90: 76 2c 20 22 3f 76 61 72 4e 61 6d 65 3f 22 29 3b v, "?varName?");
0fa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 . ret
0fb0: 75 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 urn JIM_ERR;.
0fc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f }. o
0fd0: 62 6a 50 74 72 20 3d 20 4a 69 6d 5f 4e 65 77 53 bjPtr = Jim_NewS
0fe0: 74 72 69 6e 67 4f 62 6a 28 69 6e 74 65 72 70 2c tringObj(interp,
0ff0: 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 20 NULL, 0);.
1000: 20 20 20 77 68 69 6c 65 20 28 31 29 20 7b 0a 20 while (1) {.
1010: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d int m
1020: 6f 72 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 ore = 0;.
1030: 20 20 20 20 20 62 75 66 5b 41 49 4f 5f 42 55 46 buf[AIO_BUF
1040: 5f 4c 45 4e 2d 31 5d 20 3d 20 27 5f 27 3b 0a 20 _LEN-1] = '_';.
1050: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 66 if (f
1060: 67 65 74 73 28 62 75 66 2c 20 41 49 4f 5f 42 55 gets(buf, AIO_BU
1070: 46 5f 4c 45 4e 2c 20 61 66 2d 3e 66 70 29 20 3d F_LEN, af->fp) =
1080: 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 20 20 = NULL).
1090: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
10a0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62 if (b
10b0: 75 66 5b 41 49 4f 5f 42 55 46 5f 4c 45 4e 2d 31 uf[AIO_BUF_LEN-1
10c0: 5d 20 3d 3d 20 27 5c 30 27 20 26 26 20 62 75 66 ] == '\0' && buf
10d0: 5b 41 49 4f 5f 42 55 46 5f 4c 45 4e 5d 20 3d 3d [AIO_BUF_LEN] ==
10e0: 20 27 5c 6e 27 29 0a 20 20 20 20 20 20 20 20 20 '\n').
10f0: 20 20 20 20 20 20 20 6d 6f 72 65 20 3d 20 31 3b more = 1;
1100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 . if
1110: 28 6d 6f 72 65 29 20 7b 0a 20 20 20 20 20 20 20 (more) {.
1120: 20 20 20 20 20 20 20 20 20 4a 69 6d 5f 41 70 70 Jim_App
1130: 65 6e 64 53 74 72 69 6e 67 28 69 6e 74 65 72 70 endString(interp
1140: 2c 20 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 41 , objPtr, buf, A
1150: 49 4f 5f 42 55 46 5f 4c 45 4e 2d 31 29 3b 0a 20 IO_BUF_LEN-1);.
1160: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 } els
1170: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 e {.
1180: 20 20 20 20 2f 2a 20 73 74 72 69 70 20 22 5c 6e /* strip "\n
1190: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 " */.
11a0: 20 20 20 20 20 4a 69 6d 5f 41 70 70 65 6e 64 53 Jim_AppendS
11b0: 74 72 69 6e 67 28 69 6e 74 65 72 70 2c 20 6f 62 tring(interp, ob
11c0: 6a 50 74 72 2c 20 62 75 66 2c 20 73 74 72 6c 65 jPtr, buf, strle
11d0: 6e 28 62 75 66 29 2d 31 29 3b 0a 20 20 20 20 20 n(buf)-1);.
11e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
11f0: 20 20 20 20 20 69 66 20 28 21 6d 6f 72 65 29 0a if (!more).
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1210: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d break;. }
1220: 0a 20 20 20 20 20 20 20 20 69 66 20 28 66 65 72 . if (fer
1230: 72 6f 72 28 61 66 2d 3e 66 70 29 29 20 7b 0a 20 ror(af->fp)) {.
1240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 2f /* I/
1250: 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 O error */.
1260: 20 20 20 20 20 20 20 4a 69 6d 5f 49 6e 63 72 52 Jim_IncrR
1270: 65 66 43 6f 75 6e 74 28 6f 62 6a 50 74 72 29 3b efCount(objPtr);
1280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 4a 69 6d . Jim
1290: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 69 6e _DecrRefCount(in
12a0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 terp, objPtr);.
12b0: 20 20 20 20 20 20 20 20 20 20 20 4a 69 6d 41 69 JimAi
12c0: 6f 53 65 74 45 72 72 6f 72 28 69 6e 74 65 72 70 oSetError(interp
12d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 );. r
12e0: 65 74 75 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a 20 eturn JIM_ERR;.
12f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
1300: 20 2f 2a 20 4f 6e 20 45 4f 46 20 72 65 74 75 72 /* On EOF retur
1310: 6e 73 20 2d 31 20 69 66 20 76 61 72 4e 61 6d 65 ns -1 if varName
1320: 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2c 20 was specified,
1330: 6f 72 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 or the empty str
1340: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 ing. */.
1350: 69 66 20 28 66 65 6f 66 28 61 66 2d 3e 66 70 29 if (feof(af->fp)
1360: 20 26 26 20 4a 69 6d 5f 4c 65 6e 67 74 68 28 6f && Jim_Length(o
1370: 62 6a 50 74 72 29 20 3d 3d 20 30 29 20 7b 0a 20 bjPtr) == 0) {.
1380: 20 20 20 20 20 20 20 20 20 20 20 4a 69 6d 5f 49 Jim_I
1390: 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 50 ncrRefCount(objP
13a0: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 tr);.
13b0: 20 4a 69 6d 5f 44 65 63 72 52 65 66 43 6f 75 6e Jim_DecrRefCoun
13c0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
13d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 );. i
13e0: 66 20 28 61 72 67 63 20 3d 3d 20 33 29 0a 20 20 f (argc == 3).
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4a 69 Ji
1400: 6d 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 m_SetResult(inte
1410: 72 70 2c 20 4a 69 6d 5f 4e 65 77 49 6e 74 4f 62 rp, Jim_NewIntOb
1420: 6a 28 69 6e 74 65 72 70 2c 20 2d 31 29 29 3b 0a j(interp, -1));.
1430: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 retu
1440: 72 6e 20 4a 49 4d 5f 4f 4b 3b 0a 20 20 20 20 20 rn JIM_OK;.
1450: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 }. if
1460: 28 61 72 67 63 20 3d 3d 20 33 29 20 7b 0a 20 20 (argc == 3) {.
1470: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f int to
1480: 74 4c 65 6e 3b 0a 0a 20 20 20 20 20 20 20 20 20 tLen;..
1490: 20 20 20 4a 69 6d 5f 47 65 74 53 74 72 69 6e 67 Jim_GetString
14a0: 28 6f 62 6a 50 74 72 2c 20 26 74 6f 74 4c 65 6e (objPtr, &totLen
14b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 );. i
14c0: 66 20 28 4a 69 6d 5f 53 65 74 56 61 72 69 61 62 f (Jim_SetVariab
14d0: 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b le(interp, argv[
14e0: 32 5d 2c 20 6f 62 6a 50 74 72 29 20 21 3d 20 4a 2], objPtr) != J
14f0: 49 4d 5f 4f 4b 29 20 7b 0a 20 20 20 20 20 20 20 IM_OK) {.
1500: 20 20 20 20 20 20 20 20 20 4a 69 6d 5f 49 6e 63 Jim_Inc
1510: 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 50 74 72 rRefCount(objPtr
1520: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 );.
1530: 20 20 20 4a 69 6d 5f 44 65 63 72 52 65 66 43 6f Jim_DecrRefCo
1540: 75 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 unt(interp, objP
1550: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 tr);.
1560: 20 20 20 20 20 72 65 74 75 72 6e 20 4a 49 4d 5f return JIM_
1570: 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 ERR;.
1580: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 4a }. J
1590: 69 6d 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 im_SetResult(int
15a0: 65 72 70 2c 20 4a 69 6d 5f 4e 65 77 49 6e 74 4f erp, Jim_NewIntO
15b0: 62 6a 28 69 6e 74 65 72 70 2c 20 74 6f 74 4c 65 bj(interp, totLe
15c0: 6e 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 n));. } e
15d0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 lse {.
15e0: 20 20 4a 69 6d 5f 53 65 74 52 65 73 75 6c 74 28 Jim_SetResult(
15f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
1600: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
1610: 20 20 20 72 65 74 75 72 6e 20 4a 49 4d 5f 4f 4b return JIM_OK
1620: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
1630: 28 6f 70 74 69 6f 6e 20 3d 3d 20 4f 50 54 5f 50 (option == OPT_P
1640: 55 54 53 29 20 7b 0a 20 20 20 20 2f 2a 20 50 55 UTS) {. /* PU
1650: 54 53 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e TS */. un
1660: 73 69 67 6e 65 64 20 69 6e 74 20 77 6c 65 6e 3b signed int wlen;
1670: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 . const c
1680: 68 61 72 20 2a 77 64 61 74 61 3b 0a 0a 20 20 20 har *wdata;..
1690: 20 20 20 20 20 69 66 20 28 61 72 67 63 20 21 3d if (argc !=
16a0: 20 33 20 26 26 20 28 61 72 67 63 20 21 3d 20 34 3 && (argc != 4
16b0: 20 7c 7c 20 21 4a 69 6d 5f 43 6f 6d 70 61 72 65 || !Jim_Compare
16c0: 53 74 72 69 6e 67 49 6d 6d 65 64 69 61 74 65 28 StringImmediate(
16d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
16e0: 20 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c interp,
16f0: 20 61 72 67 76 5b 32 5d 2c 20 22 2d 6e 6f 6e 65 argv[2], "-none
1700: 77 6c 69 6e 65 22 29 29 29 20 7b 0a 20 20 20 20 wline"))) {.
1710: 20 20 20 20 20 20 20 20 4a 69 6d 5f 57 72 6f 6e Jim_Wron
1720: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
1730: 20 32 2c 20 61 72 67 76 2c 20 22 3f 2d 6e 6f 6e 2, argv, "?-non
1740: 65 77 6c 69 6e 65 3f 20 73 74 72 69 6e 67 22 29 ewline? string")
1750: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 ;. re
1760: 74 75 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a 20 20 turn JIM_ERR;.
1770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
1780: 77 64 61 74 61 20 3d 20 4a 69 6d 5f 47 65 74 53 wdata = Jim_GetS
1790: 74 72 69 6e 67 28 61 72 67 76 5b 32 2b 28 61 72 tring(argv[2+(ar
17a0: 67 63 3d 3d 34 29 5d 2c 20 26 77 6c 65 6e 29 3b gc==4)], &wlen);
17b0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 66 77 72 . if (fwr
17c0: 69 74 65 28 77 64 61 74 61 2c 20 31 2c 20 77 6c ite(wdata, 1, wl
17d0: 65 6e 2c 20 61 66 2d 3e 66 70 29 20 21 3d 20 77 en, af->fp) != w
17e0: 6c 65 6e 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 len ||.
17f0: 20 20 20 28 61 72 67 63 20 3d 3d 20 33 20 26 26 (argc == 3 &&
1800: 20 66 77 72 69 74 65 28 22 5c 6e 22 2c 20 31 2c fwrite("\n", 1,
1810: 20 31 2c 20 61 66 2d 3e 66 70 29 20 21 3d 20 31 1, af->fp) != 1
1820: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 )) {.
1830: 20 4a 69 6d 41 69 6f 53 65 74 45 72 72 6f 72 28 JimAioSetError(
1840: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 20 interp);.
1850: 20 20 20 20 20 72 65 74 75 72 6e 20 4a 49 4d 5f return JIM_
1860: 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 ERR;. }.
1870: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 4a 49 return JI
1880: 4d 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 M_OK;. } else
1890: 20 69 66 20 28 6f 70 74 69 6f 6e 20 20 3d 3d 20 if (option ==
18a0: 4f 50 54 5f 46 4c 55 53 48 29 20 7b 0a 20 20 20 OPT_FLUSH) {.
18b0: 20 2f 2a 20 46 4c 55 53 48 20 2a 2f 0a 20 20 20 /* FLUSH */.
18c0: 20 20 20 20 20 69 66 20 28 61 72 67 63 20 21 3d if (argc !=
18d0: 20 32 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2) {.
18e0: 20 20 4a 69 6d 5f 57 72 6f 6e 67 4e 75 6d 41 72 Jim_WrongNumAr
18f0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 61 72 gs(interp, 2, ar
1900: 67 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20 gv, "");.
1910: 20 20 20 20 20 72 65 74 75 72 6e 20 4a 49 4d 5f return JIM_
1920: 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 ERR;. }.
1930: 20 20 20 20 20 20 20 69 66 20 28 66 66 6c 75 73 if (fflus
1940: 68 28 61 66 2d 3e 66 70 29 20 3d 3d 20 45 4f 46 h(af->fp) == EOF
1950: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ) {.
1960: 4a 69 6d 41 69 6f 53 65 74 45 72 72 6f 72 28 69 JimAioSetError(i
1970: 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 20 20 nterp);.
1980: 20 20 20 20 72 65 74 75 72 6e 20 4a 49 4d 5f 45 return JIM_E
1990: 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 RR;. }.
19a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 4a 49 4d return JIM
19b0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 _OK;. }. r
19c0: 65 74 75 72 6e 20 4a 49 4d 5f 4f 4b 3b 0a 7d 0a eturn JIM_OK;.}.
19d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 4a 69 6d 41 .static int JimA
19e0: 69 6f 4f 70 65 6e 43 6f 6d 6d 61 6e 64 28 4a 69 ioOpenCommand(Ji
19f0: 6d 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 m_Interp *interp
1a00: 2c 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 20 , int argc, .
1a10: 20 20 20 20 20 4a 69 6d 5f 4f 62 6a 20 2a 63 6f Jim_Obj *co
1a20: 6e 73 74 20 2a 61 72 67 76 29 0a 7b 0a 20 20 20 nst *argv).{.
1a30: 20 46 49 4c 45 20 2a 66 70 3b 0a 20 20 20 20 41 FILE *fp;. A
1a40: 69 6f 46 69 6c 65 20 2a 61 66 3b 0a 20 20 20 20 ioFile *af;.
1a50: 63 68 61 72 20 62 75 66 5b 41 49 4f 5f 43 4d 44 char buf[AIO_CMD
1a60: 5f 4c 45 4e 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 _LEN];. const
1a70: 20 63 68 61 72 20 2a 6d 6f 64 65 20 3d 20 22 72 char *mode = "r
1a80: 22 3b 0a 20 20 20 20 4a 69 6d 5f 4f 62 6a 20 2a ";. Jim_Obj *
1a90: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 6c 6f 6e 67 objPtr;. long
1aa0: 20 66 69 6c 65 49 64 3b 0a 20 20 20 20 63 6f 6e fileId;. con
1ab0: 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 73 st char *options
1ac0: 5b 5d 20 3d 20 7b 22 69 6e 70 75 74 22 2c 20 22 [] = {"input", "
1ad0: 6f 75 74 70 75 74 22 2c 20 22 65 72 72 6f 72 22 output", "error"
1ae0: 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 7b 4f 50 54 };. enum {OPT
1af0: 5f 49 4e 50 55 54 2c 20 4f 50 54 5f 4f 55 54 50 _INPUT, OPT_OUTP
1b00: 55 54 2c 20 4f 50 54 5f 45 52 52 4f 52 7d 3b 0a UT, OPT_ERROR};.
1b10: 20 20 20 20 69 6e 74 20 6b 65 65 70 4f 70 65 6e int keepOpen
1b20: 20 3d 20 30 2c 20 6d 6f 64 65 4c 65 6e 3b 0a 0a = 0, modeLen;..
1b30: 20 20 20 20 69 66 20 28 61 72 67 63 20 21 3d 20 if (argc !=
1b40: 32 20 26 26 20 61 72 67 63 20 21 3d 20 33 29 20 2 && argc != 3)
1b50: 7b 0a 20 20 20 20 20 20 20 20 4a 69 6d 5f 57 72 {. Jim_Wr
1b60: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
1b70: 70 2c 20 31 2c 20 61 72 67 76 2c 20 22 66 69 6c p, 1, argv, "fil
1b80: 65 6e 61 6d 65 20 3f 6d 6f 64 65 3f 22 29 3b 0a ename ?mode?");.
1b90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 4a return J
1ba0: 49 4d 5f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 IM_ERR;. }.
1bb0: 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 33 29 if (argc == 3)
1bc0: 0a 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 . mode =
1bd0: 4a 69 6d 5f 47 65 74 53 74 72 69 6e 67 28 61 72 Jim_GetString(ar
1be0: 67 76 5b 32 5d 2c 20 26 6d 6f 64 65 4c 65 6e 29 gv[2], &modeLen)
1bf0: 3b 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3d ;. if (argc =
1c00: 3d 20 33 20 26 26 20 4a 69 6d 5f 43 6f 6d 70 61 = 3 && Jim_Compa
1c10: 72 65 53 74 72 69 6e 67 49 6d 6d 65 64 69 61 74 reStringImmediat
1c20: 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 e(interp, argv[1
1c30: 5d 2c 20 22 73 74 61 6e 64 61 72 64 22 29 20 26 ], "standard") &
1c40: 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f &. mo
1c50: 64 65 4c 65 6e 20 3e 3d 20 33 29 20 7b 0a 20 20 deLen >= 3) {.
1c60: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 int op
1c70: 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 tion;. if
1c80: 20 28 4a 69 6d 5f 47 65 74 45 6e 75 6d 28 69 6e (Jim_GetEnum(in
1c90: 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 6f terp, argv[2], o
1ca0: 70 74 69 6f 6e 73 2c 20 26 6f 70 74 69 6f 6e 2c ptions, &option,
1cb0: 20 22 73 74 61 6e 64 61 72 64 20 63 68 61 6e 6e "standard chann
1cc0: 65 6c 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 el",.
1cd0: 20 20 20 20 20 20 20 20 20 4a 49 4d 5f 45 52 52 JIM_ERR
1ce0: 4d 53 47 29 20 21 3d 20 4a 49 4d 5f 4f 4b 29 0a MSG) != JIM_OK).
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 retu
1d00: 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 20 rn JIM_ERR;.
1d10: 20 20 20 20 6b 65 65 70 4f 70 65 6e 20 3d 20 31 keepOpen = 1
1d20: 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 ;. switch
1d30: 20 28 6f 70 74 69 6f 6e 29 20 7b 0a 20 20 20 20 (option) {.
1d40: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 50 case OPT_INP
1d50: 55 54 3a 20 66 70 20 3d 20 73 74 64 69 6e 3b 20 UT: fp = stdin;
1d60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 break;. c
1d70: 61 73 65 20 4f 50 54 5f 4f 55 54 50 55 54 3a 20 ase OPT_OUTPUT:
1d80: 66 70 20 3d 20 73 74 64 6f 75 74 3b 20 62 72 65 fp = stdout; bre
1d90: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 ak;. case
1da0: 20 4f 50 54 5f 45 52 52 4f 52 3a 20 66 70 20 3d OPT_ERROR: fp =
1db0: 20 73 74 64 65 72 72 3b 20 62 72 65 61 6b 3b 0a stderr; break;.
1dc0: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a default:
1dd0: 20 66 70 20 3d 20 4e 55 4c 4c 3b 20 4a 69 6d 5f fp = NULL; Jim_
1de0: 50 61 6e 69 63 28 22 64 65 66 61 75 6c 74 20 72 Panic("default r
1df0: 65 61 63 68 65 64 20 69 6e 20 4a 69 6d 41 69 6f eached in JimAio
1e00: 4f 70 65 6e 43 6f 6d 6d 61 6e 64 28 29 22 29 3b OpenCommand()");
1e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1e20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 break;.
1e30: 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a }. } else {.
1e40: 20 20 20 20 20 20 20 20 66 70 20 3d 20 66 6f 70 fp = fop
1e50: 65 6e 28 4a 69 6d 5f 47 65 74 53 74 72 69 6e 67 en(Jim_GetString
1e60: 28 61 72 67 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c (argv[1], NULL),
1e70: 20 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 mode);.
1e80: 69 66 20 28 66 70 20 3d 3d 20 4e 55 4c 4c 29 20 if (fp == NULL)
1e90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4a 69 {. Ji
1ea0: 6d 41 69 6f 53 65 74 45 72 72 6f 72 28 69 6e 74 mAioSetError(int
1eb0: 65 72 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 erp);.
1ec0: 20 20 72 65 74 75 72 6e 20 4a 49 4d 5f 45 52 52 return JIM_ERR
1ed0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
1ee0: 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 }. /* Get the
1ef0: 20 6e 65 78 74 20 66 69 6c 65 20 69 64 20 2a 2f next file id */
1f00: 0a 20 20 20 20 69 66 20 28 4a 69 6d 5f 45 76 61 . if (Jim_Eva
1f10: 6c 47 6c 6f 62 61 6c 28 69 6e 74 65 72 70 2c 0a lGlobal(interp,.
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f30: 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 69 6e 63 "if {[catch {inc
1f40: 72 20 61 69 6f 2e 66 69 6c 65 49 64 7d 5d 7d 20 r aio.fileId}]}
1f50: 7b 73 65 74 20 61 69 6f 2e 66 69 6c 65 49 64 20 {set aio.fileId
1f60: 30 7d 22 29 20 21 3d 20 4a 49 4d 5f 4f 4b 29 0a 0}") != JIM_OK).
1f70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 4a return J
1f80: 49 4d 5f 45 52 52 3b 0a 20 20 20 20 6f 62 6a 50 IM_ERR;. objP
1f90: 74 72 20 3d 20 4a 69 6d 5f 47 65 74 56 61 72 69 tr = Jim_GetVari
1fa0: 61 62 6c 65 53 74 72 28 69 6e 74 65 72 70 2c 20 ableStr(interp,
1fb0: 22 61 69 6f 2e 66 69 6c 65 49 64 22 2c 20 4a 49 "aio.fileId", JI
1fc0: 4d 5f 45 52 52 4d 53 47 29 3b 0a 20 20 20 20 69 M_ERRMSG);. i
1fd0: 66 20 28 6f 62 6a 50 74 72 20 3d 3d 20 4e 55 4c f (objPtr == NUL
1fe0: 4c 29 20 72 65 74 75 72 6e 20 4a 49 4d 5f 45 52 L) return JIM_ER
1ff0: 52 3b 0a 20 20 20 20 69 66 20 28 4a 69 6d 5f 47 R;. if (Jim_G
2000: 65 74 4c 6f 6e 67 28 69 6e 74 65 72 70 2c 20 6f etLong(interp, o
2010: 62 6a 50 74 72 2c 20 26 66 69 6c 65 49 64 29 20 bjPtr, &fileId)
2020: 21 3d 20 4a 49 4d 5f 4f 4b 29 20 72 65 74 75 72 != JIM_OK) retur
2030: 6e 20 4a 49 4d 5f 45 52 52 3b 0a 0a 20 20 20 20 n JIM_ERR;..
2040: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 66 69 /* Create the fi
2050: 6c 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 le command */.
2060: 20 20 61 66 20 3d 20 4a 69 6d 5f 41 6c 6c 6f 63 af = Jim_Alloc
2070: 28 73 69 7a 65 6f 66 28 2a 61 66 29 29 3b 0a 20 (sizeof(*af));.
2080: 20 20 20 61 66 2d 3e 66 70 20 3d 20 66 70 3b 0a af->fp = fp;.
2090: 20 20 20 20 61 66 2d 3e 6b 65 65 70 4f 70 65 6e af->keepOpen
20a0: 20 3d 20 6b 65 65 70 4f 70 65 6e 3b 0a 20 20 20 = keepOpen;.
20b0: 20 73 70 72 69 6e 74 66 28 62 75 66 2c 20 22 61 sprintf(buf, "a
20c0: 69 6f 2e 68 61 6e 64 6c 65 25 6c 64 22 2c 20 66 io.handle%ld", f
20d0: 69 6c 65 49 64 29 3b 0a 20 20 20 20 4a 69 6d 5f ileId);. Jim_
20e0: 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e CreateCommand(in
20f0: 74 65 72 70 2c 20 62 75 66 2c 20 4a 69 6d 41 69 terp, buf, JimAi
2100: 6f 48 61 6e 64 6c 65 72 43 6f 6d 6d 61 6e 64 2c oHandlerCommand,
2110: 20 61 66 2c 20 4a 69 6d 41 69 6f 44 65 6c 50 72 af, JimAioDelPr
2120: 6f 63 29 3b 0a 20 20 20 20 4a 69 6d 5f 53 65 74 oc);. Jim_Set
2130: 52 65 73 75 6c 74 53 74 72 69 6e 67 28 69 6e 74 ResultString(int
2140: 65 72 70 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 20 erp, buf, -1);.
2150: 20 20 20 72 65 74 75 72 6e 20 4a 49 4d 5f 4f 4b return JIM_OK
2160: 3b 0a 7d 0a 0a 69 6e 74 20 4a 69 6d 5f 4f 6e 4c ;.}..int Jim_OnL
2170: 6f 61 64 28 4a 69 6d 5f 49 6e 74 65 72 70 20 2a oad(Jim_Interp *
2180: 69 6e 74 65 72 70 29 0a 7b 0a 20 20 20 20 4a 69 interp).{. Ji
2190: 6d 5f 49 6e 69 74 45 78 74 65 6e 73 69 6f 6e 28 m_InitExtension(
21a0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 66 20 interp);. if
21b0: 28 4a 69 6d 5f 50 61 63 6b 61 67 65 50 72 6f 76 (Jim_PackageProv
21c0: 69 64 65 28 69 6e 74 65 72 70 2c 20 22 61 69 6f ide(interp, "aio
21d0: 22 2c 20 22 31 2e 30 22 2c 20 4a 49 4d 5f 45 52 ", "1.0", JIM_ER
21e0: 52 4d 53 47 29 20 21 3d 20 4a 49 4d 5f 4f 4b 29 RMSG) != JIM_OK)
21f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 . return
2200: 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 20 4a 69 6d JIM_ERR;. Jim
2210: 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 _CreateCommand(i
2220: 6e 74 65 72 70 2c 20 22 61 69 6f 2e 6f 70 65 6e nterp, "aio.open
2230: 22 2c 20 4a 69 6d 41 69 6f 4f 70 65 6e 43 6f 6d ", JimAioOpenCom
2240: 6d 61 6e 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c mand, NULL, NULL
2250: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 49 );. return JI
2260: 4d 5f 4f 4b 3b 0a 7d 0a M_OK;.}.