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 31 30 20 32 30 30 36 2f 31 31 2f 30 36 20 31 .10 2006/11/06 1
0080: 36 3a 35 34 3a 34 38 20 61 6e 74 69 72 65 7a 20 6:54:48 antirez
0090: 45 78 70 20 24 0a 20 2a 0a 20 2a 20 4c 69 63 65 Exp $. *. * Lice
00a0: 6e 73 65 64 20 75 6e 64 65 72 20 74 68 65 20 41 nsed under the A
00b0: 70 61 63 68 65 20 4c 69 63 65 6e 73 65 2c 20 56 pache License, V
00c0: 65 72 73 69 6f 6e 20 32 2e 30 20 28 74 68 65 20 ersion 2.0 (the
00d0: 22 4c 69 63 65 6e 73 65 22 29 3b 0a 20 2a 20 79 "License");. * y
00e0: 6f 75 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 74 ou may not use t
00f0: 68 69 73 20 66 69 6c 65 20 65 78 63 65 70 74 20 his file except
0100: 69 6e 20 63 6f 6d 70 6c 69 61 6e 63 65 20 77 69 in compliance wi
0110: 74 68 20 74 68 65 20 4c 69 63 65 6e 73 65 2e 0a th the License..
0120: 20 2a 20 59 6f 75 20 6d 61 79 20 6f 62 74 61 69 * You may obtai
0130: 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 n a copy of the
0140: 4c 69 63 65 6e 73 65 20 61 74 0a 20 2a 0a 20 2a License at. *. *
0150: 20 20 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e http://www.
0160: 61 70 61 63 68 65 2e 6f 72 67 2f 6c 69 63 65 6e apache.org/licen
0170: 73 65 73 2f 4c 49 43 45 4e 53 45 2d 32 2e 30 0a ses/LICENSE-2.0.
0180: 20 2a 0a 20 2a 20 41 20 63 6f 70 79 20 6f 66 20 *. * A copy of
0190: 74 68 65 20 6c 69 63 65 6e 73 65 20 69 73 20 61 the license is a
01a0: 6c 73 6f 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 lso included in
01b0: 74 68 65 20 73 6f 75 72 63 65 20 64 69 73 74 72 the source distr
01c0: 69 62 75 74 69 6f 6e 0a 20 2a 20 6f 66 20 4a 69 ibution. * of Ji
01d0: 6d 2c 20 61 73 20 61 20 54 58 54 20 66 69 6c 65 m, as a TXT file
01e0: 20 6e 61 6d 65 20 63 61 6c 6c 65 64 20 4c 49 43 name called LIC
01f0: 45 4e 53 45 2e 0a 20 2a 0a 20 2a 20 55 6e 6c 65 ENSE.. *. * Unle
0200: 73 73 20 72 65 71 75 69 72 65 64 20 62 79 20 61 ss required by a
0210: 70 70 6c 69 63 61 62 6c 65 20 6c 61 77 20 6f 72 pplicable law or
0220: 20 61 67 72 65 65 64 20 74 6f 20 69 6e 20 77 72 agreed to in wr
0230: 69 74 69 6e 67 2c 20 73 6f 66 74 77 61 72 65 0a iting, software.
0240: 20 2a 20 64 69 73 74 72 69 62 75 74 65 64 20 75 * distributed u
0250: 6e 64 65 72 20 74 68 65 20 4c 69 63 65 6e 73 65 nder the License
0260: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 is distributed
0270: 6f 6e 20 61 6e 20 22 41 53 20 49 53 22 20 42 41 on an "AS IS" BA
0280: 53 49 53 2c 0a 20 2a 20 57 49 54 48 4f 55 54 20 SIS,. * WITHOUT
0290: 57 41 52 52 41 4e 54 49 45 53 20 4f 52 20 43 4f WARRANTIES OR CO
02a0: 4e 44 49 54 49 4f 4e 53 20 4f 46 20 41 4e 59 20 NDITIONS OF ANY
02b0: 4b 49 4e 44 2c 20 65 69 74 68 65 72 20 65 78 70 KIND, either exp
02c0: 72 65 73 73 20 6f 72 20 69 6d 70 6c 69 65 64 2e ress or implied.
02d0: 0a 20 2a 20 53 65 65 20 74 68 65 20 4c 69 63 65 . * See the Lice
02e0: 6e 73 65 20 66 6f 72 20 74 68 65 20 73 70 65 63 nse for the spec
02f0: 69 66 69 63 20 6c 61 6e 67 75 61 67 65 20 67 6f ific language go
0300: 76 65 72 6e 69 6e 67 20 70 65 72 6d 69 73 73 69 verning permissi
0310: 6f 6e 73 20 61 6e 64 0a 20 2a 20 6c 69 6d 69 74 ons and. * limit
0320: 61 74 69 6f 6e 73 20 75 6e 64 65 72 20 74 68 65 ations under the
0330: 20 4c 69 63 65 6e 73 65 2e 0a 20 2a 2f 0a 0a 23 License.. */..#
0340: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 include <stdio.h
0350: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 >.#include <stri
0360: 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c ng.h>.#include <
0370: 65 72 72 6e 6f 2e 68 3e 0a 0a 23 69 66 6e 64 65 errno.h>..#ifnde
0380: 66 20 4a 49 4d 5f 53 54 41 54 49 43 45 58 54 0a f JIM_STATICEXT.
0390: 23 64 65 66 69 6e 65 20 4a 49 4d 5f 45 58 54 45 #define JIM_EXTE
03a0: 4e 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 23 69 6e NSION.#endif.#in
03b0: 63 6c 75 64 65 20 22 6a 69 6d 2e 68 22 0a 0a 23 clude "jim.h"..#
03c0: 64 65 66 69 6e 65 20 41 49 4f 5f 43 4d 44 5f 4c define AIO_CMD_L
03d0: 45 4e 20 31 32 38 0a 23 64 65 66 69 6e 65 20 41 EN 128.#define A
03e0: 49 4f 5f 42 55 46 5f 4c 45 4e 20 31 30 32 34 0a IO_BUF_LEN 1024.
03f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
0400: 41 69 6f 46 69 6c 65 20 7b 0a 20 20 20 20 46 49 AioFile {. FI
0410: 4c 45 20 2a 66 70 3b 0a 20 20 20 20 69 6e 74 20 LE *fp;. int
0420: 6b 65 65 70 4f 70 65 6e 3b 20 2f 2a 20 49 66 20 keepOpen; /* If
0430: 73 65 74 2c 20 74 68 65 20 66 69 6c 65 20 69 73 set, the file is
0440: 20 6e 6f 74 20 66 63 6c 6f 73 65 64 20 6f 6e 20 not fclosed on
0450: 63 6c 65 61 6e 75 70 20 28 73 74 64 69 6e 2c 20 cleanup (stdin,
0460: 2e 2e 2e 29 20 2a 2f 0a 7d 20 41 69 6f 46 69 6c ...) */.} AioFil
0470: 65 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 e;..static void
0480: 4a 69 6d 41 69 6f 53 65 74 45 72 72 6f 72 28 4a JimAioSetError(J
0490: 69 6d 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 im_Interp *inter
04a0: 70 29 0a 7b 0a 20 20 20 20 4a 69 6d 5f 53 65 74 p).{. Jim_Set
04b0: 52 65 73 75 6c 74 53 74 72 69 6e 67 28 69 6e 74 ResultString(int
04c0: 65 72 70 2c 20 73 74 72 65 72 72 6f 72 28 65 72 erp, strerror(er
04d0: 72 6e 6f 29 2c 20 2d 31 29 3b 0a 7d 0a 0a 73 74 rno), -1);.}..st
04e0: 61 74 69 63 20 76 6f 69 64 20 4a 69 6d 41 69 6f atic void JimAio
04f0: 44 65 6c 50 72 6f 63 28 4a 69 6d 5f 49 6e 74 65 DelProc(Jim_Inte
0500: 72 70 20 2a 69 6e 74 65 72 70 2c 20 76 6f 69 64 rp *interp, void
0510: 20 2a 70 72 69 76 44 61 74 61 29 0a 7b 0a 20 20 *privData).{.
0520: 20 20 41 69 6f 46 69 6c 65 20 2a 61 66 20 3d 20 AioFile *af =
0530: 70 72 69 76 44 61 74 61 3b 0a 20 20 20 20 4a 49 privData;. JI
0540: 4d 5f 4e 4f 54 55 53 45 44 28 69 6e 74 65 72 70 M_NOTUSED(interp
0550: 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 61 66 2d );.. if (!af-
0560: 3e 6b 65 65 70 4f 70 65 6e 29 0a 20 20 20 20 20 >keepOpen).
0570: 20 20 20 66 63 6c 6f 73 65 28 61 66 2d 3e 66 70 fclose(af->fp
0580: 29 3b 0a 20 20 20 20 4a 69 6d 5f 46 72 65 65 28 );. Jim_Free(
0590: 61 66 29 3b 0a 7d 0a 0a 2f 2a 20 43 61 6c 6c 73 af);.}../* Calls
05a0: 20 74 6f 20 5b 61 69 6f 2e 66 69 6c 65 5d 20 63 to [aio.file] c
05b0: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 73 20 74 reate commands t
05c0: 68 61 74 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e hat are implemen
05d0: 74 65 64 20 62 79 20 74 68 69 73 0a 20 2a 20 43 ted by this. * C
05e0: 20 63 6f 6d 6d 61 6e 64 2e 20 2a 2f 0a 73 74 61 command. */.sta
05f0: 74 69 63 20 69 6e 74 20 4a 69 6d 41 69 6f 48 61 tic int JimAioHa
0600: 6e 64 6c 65 72 43 6f 6d 6d 61 6e 64 28 4a 69 6d ndlerCommand(Jim
0610: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
0620: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 20 20 20 int argc,.
0630: 20 20 20 4a 69 6d 5f 4f 62 6a 20 2a 63 6f 6e 73 Jim_Obj *cons
0640: 74 20 2a 61 72 67 76 29 0a 7b 0a 20 20 20 20 41 t *argv).{. A
0650: 69 6f 46 69 6c 65 20 2a 61 66 20 3d 20 4a 69 6d ioFile *af = Jim
0660: 5f 43 6d 64 50 72 69 76 44 61 74 61 28 69 6e 74 _CmdPrivData(int
0670: 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6f 70 erp);. int op
0680: 74 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 tion;. const
0690: 63 68 61 72 20 2a 6f 70 74 69 6f 6e 73 5b 5d 20 char *options[]
06a0: 3d 20 7b 0a 20 20 20 20 20 20 20 20 22 63 6c 6f = {. "clo
06b0: 73 65 22 2c 20 22 73 65 65 6b 22 2c 20 22 74 65 se", "seek", "te
06c0: 6c 6c 22 2c 20 22 67 65 74 73 22 2c 20 22 72 65 ll", "gets", "re
06d0: 61 64 22 2c 20 22 70 75 74 73 22 2c 20 22 66 6c ad", "puts", "fl
06e0: 75 73 68 22 2c 20 22 65 6f 66 22 2c 20 4e 55 4c ush", "eof", NUL
06f0: 4c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 65 6e 75 L. };. enu
0700: 6d 20 7b 4f 50 54 5f 43 4c 4f 53 45 2c 20 4f 50 m {OPT_CLOSE, OP
0710: 54 5f 53 45 45 4b 2c 20 4f 50 54 5f 54 45 4c 4c T_SEEK, OPT_TELL
0720: 2c 20 4f 50 54 5f 47 45 54 53 2c 20 4f 50 54 5f , OPT_GETS, OPT_
0730: 52 45 41 44 2c 20 4f 50 54 5f 50 55 54 53 2c 0a READ, OPT_PUTS,.
0740: 20 20 20 20 20 20 20 20 20 20 4f 50 54 5f 46 4c OPT_FL
0750: 55 53 48 2c 20 4f 50 54 5f 45 4f 46 7d 3b 0a 0a USH, OPT_EOF};..
0760: 20 20 20 20 69 66 20 28 61 72 67 63 20 3c 20 32 if (argc < 2
0770: 29 20 7b 0a 20 20 20 20 20 20 20 20 4a 69 6d 5f ) {. Jim_
0780: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
0790: 65 72 70 2c 20 31 2c 20 61 72 67 76 2c 20 22 6d erp, 1, argv, "m
07a0: 65 74 68 6f 64 20 3f 61 72 67 73 20 2e 2e 2e 3f ethod ?args ...?
07b0: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 ");. retu
07c0: 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 20 rn JIM_ERR;.
07d0: 7d 0a 20 20 20 20 69 66 20 28 4a 69 6d 5f 47 65 }. if (Jim_Ge
07e0: 74 45 6e 75 6d 28 69 6e 74 65 72 70 2c 20 61 72 tEnum(interp, ar
07f0: 67 76 5b 31 5d 2c 20 6f 70 74 69 6f 6e 73 2c 20 gv[1], options,
0800: 26 6f 70 74 69 6f 6e 2c 20 22 41 49 4f 20 6d 65 &option, "AIO me
0810: 74 68 6f 64 22 2c 0a 20 20 20 20 20 20 20 20 20 thod",.
0820: 20 20 20 20 20 20 20 4a 49 4d 5f 45 52 52 4d 53 JIM_ERRMS
0830: 47 29 20 21 3d 20 4a 49 4d 5f 4f 4b 29 0a 20 20 G) != JIM_OK).
0840: 20 20 20 20 20 20 72 65 74 75 72 6e 20 4a 49 4d return JIM
0850: 5f 45 52 52 3b 0a 20 20 20 20 2f 2a 20 43 4c 4f _ERR;. /* CLO
0860: 53 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 70 SE */. if (op
0870: 74 69 6f 6e 20 3d 3d 20 4f 50 54 5f 43 4c 4f 53 tion == OPT_CLOS
0880: 45 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 E) {. if
0890: 28 61 72 67 63 20 21 3d 20 32 29 20 7b 0a 20 20 (argc != 2) {.
08a0: 20 20 20 20 20 20 20 20 20 20 4a 69 6d 5f 57 72 Jim_Wr
08b0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
08c0: 70 2c 20 32 2c 20 61 72 67 76 2c 20 22 22 29 3b p, 2, argv, "");
08d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 . ret
08e0: 75 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 urn JIM_ERR;.
08f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4a }. J
0900: 69 6d 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 im_DeleteCommand
0910: 28 69 6e 74 65 72 70 2c 20 4a 69 6d 5f 47 65 74 (interp, Jim_Get
0920: 53 74 72 69 6e 67 28 61 72 67 76 5b 30 5d 2c 20 String(argv[0],
0930: 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 20 20 20 20 NULL));.
0940: 72 65 74 75 72 6e 20 4a 49 4d 5f 4f 4b 3b 0a 20 return JIM_OK;.
0950: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 } else if (op
0960: 74 69 6f 6e 20 3d 3d 20 4f 50 54 5f 53 45 45 4b tion == OPT_SEEK
0970: 29 20 7b 0a 20 20 20 20 2f 2a 20 53 45 45 4b 20 ) {. /* SEEK
0980: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f */. int o
0990: 72 69 67 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a rig = SEEK_SET;.
09a0: 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 6f 66 66 long off
09b0: 73 65 74 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 set;.. if
09c0: 20 28 61 72 67 63 20 21 3d 20 33 20 26 26 20 61 (argc != 3 && a
09d0: 72 67 63 20 21 3d 20 34 29 20 7b 0a 20 20 20 20 rgc != 4) {.
09e0: 20 20 20 20 20 20 20 20 4a 69 6d 5f 57 72 6f 6e Jim_Wron
09f0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
0a00: 20 32 2c 20 61 72 67 76 2c 20 22 6f 66 66 73 65 2, argv, "offse
0a10: 74 20 3f 6f 72 69 67 69 6e 3f 22 29 3b 0a 20 20 t ?origin?");.
0a20: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e return
0a30: 20 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 20 20 20 JIM_ERR;.
0a40: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 }. if (
0a50: 61 72 67 63 20 3d 3d 20 34 29 20 7b 0a 20 20 20 argc == 4) {.
0a60: 20 20 20 20 20 20 20 20 20 69 66 20 28 4a 69 6d if (Jim
0a70: 5f 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 49 6d _CompareStringIm
0a80: 6d 65 64 69 61 74 65 28 69 6e 74 65 72 70 2c 20 mediate(interp,
0a90: 61 72 67 76 5b 33 5d 2c 20 22 73 74 61 72 74 22 argv[3], "start"
0aa0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 )).
0ab0: 20 20 20 6f 72 69 67 20 3d 20 53 45 45 4b 5f 53 orig = SEEK_S
0ac0: 45 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ET;.
0ad0: 65 6c 73 65 20 69 66 20 28 4a 69 6d 5f 43 6f 6d else if (Jim_Com
0ae0: 70 61 72 65 53 74 72 69 6e 67 49 6d 6d 65 64 69 pareStringImmedi
0af0: 61 74 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 ate(interp, argv
0b00: 5b 33 5d 2c 20 22 63 75 72 72 65 6e 74 22 29 29 [3], "current"))
0b10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
0b20: 20 6f 72 69 67 20 3d 20 53 45 45 4b 5f 43 55 52 orig = SEEK_CUR
0b30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c ;. el
0b40: 73 65 20 69 66 20 28 4a 69 6d 5f 43 6f 6d 70 61 se if (Jim_Compa
0b50: 72 65 53 74 72 69 6e 67 49 6d 6d 65 64 69 61 74 reStringImmediat
0b60: 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 33 e(interp, argv[3
0b70: 5d 2c 20 22 65 6e 64 22 29 29 0a 20 20 20 20 20 ], "end")).
0b80: 20 20 20 20 20 20 20 20 20 20 20 6f 72 69 67 20 orig
0b90: 3d 20 53 45 45 4b 5f 45 4e 44 3b 0a 20 20 20 20 = SEEK_END;.
0ba0: 20 20 20 20 20 20 20 20 65 6c 73 65 20 7b 0a 20 else {.
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4a J
0bc0: 69 6d 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 im_SetResult(int
0bd0: 65 72 70 2c 20 4a 69 6d 5f 4e 65 77 45 6d 70 74 erp, Jim_NewEmpt
0be0: 79 53 74 72 69 6e 67 4f 62 6a 28 69 6e 74 65 72 yStringObj(inter
0bf0: 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 p));.
0c00: 20 20 20 20 20 4a 69 6d 5f 41 70 70 65 6e 64 53 Jim_AppendS
0c10: 74 72 69 6e 67 73 28 69 6e 74 65 72 70 2c 20 4a trings(interp, J
0c20: 69 6d 5f 47 65 74 52 65 73 75 6c 74 28 69 6e 74 im_GetResult(int
0c30: 65 72 70 29 2c 0a 20 20 20 20 20 20 20 20 20 20 erp),.
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 62 "b
0c50: 61 64 20 6f 72 69 67 69 6e 20 5c 22 22 2c 20 4a ad origin \"", J
0c60: 69 6d 5f 47 65 74 53 74 72 69 6e 67 28 61 72 67 im_GetString(arg
0c70: 76 5b 33 5d 2c 20 4e 55 4c 4c 29 2c 0a 20 20 20 v[3], NULL),.
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0c90: 20 20 20 20 20 22 5c 22 20 6d 75 73 74 20 62 65 "\" must be
0ca0: 3a 20 73 74 61 72 74 2c 20 63 75 72 72 65 6e 74 : start, current
0cb0: 2c 20 6f 72 20 65 6e 64 22 2c 20 4e 55 4c 4c 29 , or end", NULL)
0cc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;.
0cd0: 20 20 72 65 74 75 72 6e 20 4a 49 4d 5f 45 52 52 return JIM_ERR
0ce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a ;. }.
0cf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
0d00: 20 20 69 66 20 28 4a 69 6d 5f 47 65 74 4c 6f 6e if (Jim_GetLon
0d10: 67 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 g(interp, argv[2
0d20: 5d 2c 20 26 6f 66 66 73 65 74 29 20 21 3d 20 4a ], &offset) != J
0d30: 49 4d 5f 4f 4b 29 0a 20 20 20 20 20 20 20 20 20 IM_OK).
0d40: 20 20 20 72 65 74 75 72 6e 20 4a 49 4d 5f 45 52 return JIM_ER
0d50: 52 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 66 R;. if (f
0d60: 73 65 65 6b 28 61 66 2d 3e 66 70 2c 20 6f 66 66 seek(af->fp, off
0d70: 73 65 74 2c 20 6f 72 69 67 29 20 3d 3d 20 2d 31 set, orig) == -1
0d80: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ) {.
0d90: 4a 69 6d 41 69 6f 53 65 74 45 72 72 6f 72 28 69 JimAioSetError(i
0da0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 20 20 nterp);.
0db0: 20 20 20 20 72 65 74 75 72 6e 20 4a 49 4d 5f 45 return JIM_E
0dc0: 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 RR;. }.
0dd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 4a 49 4d return JIM
0de0: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 _OK;. } else
0df0: 69 66 20 28 6f 70 74 69 6f 6e 20 3d 3d 20 4f 50 if (option == OP
0e00: 54 5f 54 45 4c 4c 29 20 7b 0a 20 20 20 20 2f 2a T_TELL) {. /*
0e10: 20 54 45 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20 TELL */.
0e20: 20 6c 6f 6e 67 20 70 6f 73 69 74 69 6f 6e 3b 0a long position;.
0e30: 0a 20 20 20 20 20 20 20 20 69 66 20 28 61 72 67 . if (arg
0e40: 63 20 21 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 c != 2) {.
0e50: 20 20 20 20 20 20 4a 69 6d 5f 57 72 6f 6e 67 4e Jim_WrongN
0e60: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 umArgs(interp, 2
0e70: 2c 20 61 72 67 76 2c 20 22 22 29 3b 0a 20 20 20 , argv, "");.
0e80: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 return
0e90: 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 20 20 20 20 JIM_ERR;.
0ea0: 20 7d 0a 20 20 20 20 20 20 20 20 70 6f 73 69 74 }. posit
0eb0: 69 6f 6e 20 3d 20 66 74 65 6c 6c 28 61 66 2d 3e ion = ftell(af->
0ec0: 66 70 29 3b 0a 20 20 20 20 20 20 20 20 4a 69 6d fp);. Jim
0ed0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
0ee0: 70 2c 20 4a 69 6d 5f 4e 65 77 49 6e 74 4f 62 6a p, Jim_NewIntObj
0ef0: 28 69 6e 74 65 72 70 2c 20 70 6f 73 69 74 69 6f (interp, positio
0f00: 6e 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 n));. ret
0f10: 75 72 6e 20 4a 49 4d 5f 4f 4b 3b 0a 20 20 20 20 urn JIM_OK;.
0f20: 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f } else if (optio
0f30: 6e 20 3d 3d 20 4f 50 54 5f 47 45 54 53 29 20 7b n == OPT_GETS) {
0f40: 0a 20 20 20 20 2f 2a 20 47 45 54 53 20 2a 2f 0a . /* GETS */.
0f50: 20 20 20 20 20 20 20 20 63 68 61 72 20 62 75 66 char buf
0f60: 5b 41 49 4f 5f 42 55 46 5f 4c 45 4e 5d 3b 0a 20 [AIO_BUF_LEN];.
0f70: 20 20 20 20 20 20 20 4a 69 6d 5f 4f 62 6a 20 2a Jim_Obj *
0f80: 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 20 20 20 objPtr;..
0f90: 20 69 66 20 28 61 72 67 63 20 21 3d 20 32 20 26 if (argc != 2 &
0fa0: 26 20 61 72 67 63 20 21 3d 20 33 29 20 7b 0a 20 & argc != 3) {.
0fb0: 20 20 20 20 20 20 20 20 20 20 20 4a 69 6d 5f 57 Jim_W
0fc0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
0fd0: 72 70 2c 20 32 2c 20 61 72 67 76 2c 20 22 3f 76 rp, 2, argv, "?v
0fe0: 61 72 4e 61 6d 65 3f 22 29 3b 0a 20 20 20 20 20 arName?");.
0ff0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 4a 49 return JI
1000: 4d 5f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d M_ERR;. }
1010: 0a 20 20 20 20 20 20 20 20 6f 62 6a 50 74 72 20 . objPtr
1020: 3d 20 4a 69 6d 5f 4e 65 77 53 74 72 69 6e 67 4f = Jim_NewStringO
1030: 62 6a 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c bj(interp, NULL,
1040: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 0);. whi
1050: 6c 65 20 28 31 29 20 7b 0a 20 20 20 20 20 20 20 le (1) {.
1060: 20 20 20 20 20 69 6e 74 20 6d 6f 72 65 20 3d 20 int more =
1070: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 0;. b
1080: 75 66 5b 41 49 4f 5f 42 55 46 5f 4c 45 4e 2d 31 uf[AIO_BUF_LEN-1
1090: 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 20 ] = '_';.
10a0: 20 20 20 20 20 69 66 20 28 66 67 65 74 73 28 62 if (fgets(b
10b0: 75 66 2c 20 41 49 4f 5f 42 55 46 5f 4c 45 4e 2c uf, AIO_BUF_LEN,
10c0: 20 61 66 2d 3e 66 70 29 20 3d 3d 20 4e 55 4c 4c af->fp) == NULL
10d0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ).
10e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 break;.
10f0: 20 20 20 20 20 69 66 20 28 62 75 66 5b 41 49 4f if (buf[AIO
1100: 5f 42 55 46 5f 4c 45 4e 2d 31 5d 20 3d 3d 20 27 _BUF_LEN-1] == '
1110: 5c 30 27 20 26 26 20 62 75 66 5b 41 49 4f 5f 42 \0' && buf[AIO_B
1120: 55 46 5f 4c 45 4e 5d 20 3d 3d 20 27 5c 6e 27 29 UF_LEN] == '\n')
1130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1140: 20 6d 6f 72 65 20 3d 20 31 3b 0a 20 20 20 20 20 more = 1;.
1150: 20 20 20 20 20 20 20 69 66 20 28 6d 6f 72 65 29 if (more)
1160: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
1170: 20 20 20 4a 69 6d 5f 41 70 70 65 6e 64 53 74 72 Jim_AppendStr
1180: 69 6e 67 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ing(interp, objP
1190: 74 72 2c 20 62 75 66 2c 20 41 49 4f 5f 42 55 46 tr, buf, AIO_BUF
11a0: 5f 4c 45 4e 2d 31 29 3b 0a 20 20 20 20 20 20 20 _LEN-1);.
11b0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 } else {.
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
11d0: 20 73 74 72 69 70 20 22 5c 6e 22 20 2a 2f 0a 20 strip "\n" */.
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4a J
11f0: 69 6d 5f 41 70 70 65 6e 64 53 74 72 69 6e 67 28 im_AppendString(
1200: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
1210: 62 75 66 2c 20 73 74 72 6c 65 6e 28 62 75 66 29 buf, strlen(buf)
1220: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 -1);.
1230: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 }. i
1240: 66 20 28 21 6d 6f 72 65 29 0a 20 20 20 20 20 20 f (!more).
1250: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b break;
1260: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
1270: 20 20 20 69 66 20 28 66 65 72 72 6f 72 28 61 66 if (ferror(af
1280: 2d 3e 66 70 29 29 20 7b 0a 20 20 20 20 20 20 20 ->fp)) {.
1290: 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f /* I/O erro
12a0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 r */.
12b0: 20 4a 69 6d 5f 49 6e 63 72 52 65 66 43 6f 75 6e Jim_IncrRefCoun
12c0: 74 28 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 20 t(objPtr);.
12d0: 20 20 20 20 20 20 20 4a 69 6d 5f 44 65 63 72 52 Jim_DecrR
12e0: 65 66 43 6f 75 6e 74 28 69 6e 74 65 72 70 2c 20 efCount(interp,
12f0: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 20 20 20 objPtr);.
1300: 20 20 20 20 20 4a 69 6d 41 69 6f 53 65 74 45 72 JimAioSetEr
1310: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 ror(interp);.
1320: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 return
1330: 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 20 20 20 20 JIM_ERR;.
1340: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e }. /* On
1350: 20 45 4f 46 20 72 65 74 75 72 6e 73 20 2d 31 20 EOF returns -1
1360: 69 66 20 76 61 72 4e 61 6d 65 20 77 61 73 20 73 if varName was s
1370: 70 65 63 69 66 69 65 64 2c 20 6f 72 20 74 68 65 pecified, or the
1380: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 2a empty string. *
1390: 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28 66 65 /. if (fe
13a0: 6f 66 28 61 66 2d 3e 66 70 29 20 26 26 20 4a 69 of(af->fp) && Ji
13b0: 6d 5f 4c 65 6e 67 74 68 28 6f 62 6a 50 74 72 29 m_Length(objPtr)
13c0: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 == 0) {.
13d0: 20 20 20 20 20 4a 69 6d 5f 49 6e 63 72 52 65 66 Jim_IncrRef
13e0: 43 6f 75 6e 74 28 6f 62 6a 50 74 72 29 3b 0a 20 Count(objPtr);.
13f0: 20 20 20 20 20 20 20 20 20 20 20 4a 69 6d 5f 44 Jim_D
1400: 65 63 72 52 65 66 43 6f 75 6e 74 28 69 6e 74 65 ecrRefCount(inte
1410: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
1420: 20 20 20 20 20 20 20 20 20 69 66 20 28 61 72 67 if (arg
1430: 63 20 3d 3d 20 33 29 0a 20 20 20 20 20 20 20 20 c == 3).
1440: 20 20 20 20 20 20 20 20 4a 69 6d 5f 53 65 74 52 Jim_SetR
1450: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4a 69 esult(interp, Ji
1460: 6d 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 6e 74 65 m_NewIntObj(inte
1470: 72 70 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 rp, -1));.
1480: 20 20 20 20 20 20 72 65 74 75 72 6e 20 4a 49 4d return JIM
1490: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 _OK;. }.
14a0: 20 20 20 20 20 20 20 69 66 20 28 61 72 67 63 20 if (argc
14b0: 3d 3d 20 33 29 20 7b 0a 20 20 20 20 20 20 20 20 == 3) {.
14c0: 20 20 20 20 69 6e 74 20 74 6f 74 4c 65 6e 3b 0a int totLen;.
14d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 4a 69 6d . Jim
14e0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 50 74 _GetString(objPt
14f0: 72 2c 20 26 74 6f 74 4c 65 6e 29 3b 0a 20 20 20 r, &totLen);.
1500: 20 20 20 20 20 20 20 20 20 69 66 20 28 4a 69 6d if (Jim
1510: 5f 53 65 74 56 61 72 69 61 62 6c 65 28 69 6e 74 _SetVariable(int
1520: 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 6f 62 erp, argv[2], ob
1530: 6a 50 74 72 29 20 21 3d 20 4a 49 4d 5f 4f 4b 29 jPtr) != JIM_OK)
1540: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
1550: 20 20 20 4a 69 6d 5f 49 6e 63 72 52 65 66 43 6f Jim_IncrRefCo
1560: 75 6e 74 28 6f 62 6a 50 74 72 29 3b 0a 20 20 20 unt(objPtr);.
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 4a 69 6d Jim
1580: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 69 6e _DecrRefCount(in
1590: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 terp, objPtr);.
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 r
15b0: 65 74 75 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a 20 eturn JIM_ERR;.
15c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }.
15d0: 20 20 20 20 20 20 20 20 20 4a 69 6d 5f 53 65 74 Jim_Set
15e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4a Result(interp, J
15f0: 69 6d 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 6e 74 im_NewIntObj(int
1600: 65 72 70 2c 20 74 6f 74 4c 65 6e 29 29 3b 0a 20 erp, totLen));.
1610: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a } else {.
1620: 20 20 20 20 20 20 20 20 20 20 20 20 4a 69 6d 5f Jim_
1630: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
1640: 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 20 , objPtr);.
1650: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 }. ret
1660: 75 72 6e 20 4a 49 4d 5f 4f 4b 3b 0a 20 20 20 20 urn JIM_OK;.
1670: 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f } else if (optio
1680: 6e 20 3d 3d 20 4f 50 54 5f 52 45 41 44 29 20 7b n == OPT_READ) {
1690: 0a 20 20 20 20 2f 2a 20 52 45 41 44 20 2a 2f 0a . /* READ */.
16a0: 20 20 20 20 20 20 20 20 63 68 61 72 20 62 75 66 char buf
16b0: 5b 41 49 4f 5f 42 55 46 5f 4c 45 4e 5d 3b 0a 20 [AIO_BUF_LEN];.
16c0: 20 20 20 20 20 20 20 4a 69 6d 5f 4f 62 6a 20 2a Jim_Obj *
16d0: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 20 20 20 20 objPtr;.
16e0: 69 6e 74 20 6e 6f 6e 65 77 6c 69 6e 65 20 3d 20 int nonewline =
16f0: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 0;. int n
1700: 65 65 64 65 64 4c 65 6e 20 3d 20 2d 31 3b 20 2f eededLen = -1; /
1710: 2a 20 2d 31 20 69 73 20 22 72 65 61 64 20 61 73 * -1 is "read as
1720: 20 6d 75 63 68 20 61 73 20 70 6f 73 73 69 62 6c much as possibl
1730: 65 22 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 e" */.. i
1740: 66 20 28 61 72 67 63 20 21 3d 20 32 20 26 26 20 f (argc != 2 &&
1750: 61 72 67 63 20 21 3d 20 33 29 20 7b 0a 20 20 20 argc != 3) {.
1760: 20 20 20 20 20 20 20 20 20 4a 69 6d 5f 57 72 6f Jim_Wro
1770: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
1780: 2c 20 32 2c 20 61 72 67 76 2c 20 22 3f 2d 6e 6f , 2, argv, "?-no
1790: 6e 65 77 6c 69 6e 65 3f 20 3f 6c 65 6e 3f 22 29 newline? ?len?")
17a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 ;. re
17b0: 74 75 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a 20 20 turn JIM_ERR;.
17c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
17d0: 69 66 20 28 61 72 67 63 20 3d 3d 20 33 20 26 26 if (argc == 3 &&
17e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 4a 69 6d . Jim
17f0: 5f 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 49 6d _CompareStringIm
1800: 6d 65 64 69 61 74 65 28 69 6e 74 65 72 70 2c 20 mediate(interp,
1810: 61 72 67 76 5b 32 5d 2c 20 22 2d 6e 6f 6e 65 77 argv[2], "-nonew
1820: 6c 69 6e 65 22 29 29 0a 20 20 20 20 20 20 20 20 line")).
1830: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f {. no
1840: 6e 65 77 6c 69 6e 65 20 3d 20 31 3b 0a 20 20 20 newline = 1;.
1850: 20 20 20 20 20 20 20 20 20 61 72 67 76 2b 2b 3b argv++;
1860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 72 67 . arg
1870: 63 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 c--;. }.
1880: 20 20 20 20 20 20 20 69 66 20 28 61 72 67 63 20 if (argc
1890: 3d 3d 20 33 29 20 7b 0a 20 20 20 20 20 20 20 20 == 3) {.
18a0: 20 20 20 20 6a 69 6d 5f 77 69 64 65 20 77 69 64 jim_wide wid
18b0: 65 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 eValue;.
18c0: 20 20 20 20 69 66 20 28 4a 69 6d 5f 47 65 74 57 if (Jim_GetW
18d0: 69 64 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 ide(interp, argv
18e0: 5b 32 5d 2c 20 26 77 69 64 65 56 61 6c 75 65 29 [2], &wideValue)
18f0: 20 21 3d 20 4a 49 4d 5f 4f 4b 29 0a 20 20 20 20 != JIM_OK).
1900: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 retu
1910: 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 20 rn JIM_ERR;.
1920: 20 20 20 20 20 20 20 20 69 66 20 28 77 69 64 65 if (wide
1930: 56 61 6c 75 65 20 3c 20 30 29 20 7b 0a 20 20 20 Value < 0) {.
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 4a 69 6d Jim
1950: 5f 53 65 74 52 65 73 75 6c 74 53 74 72 69 6e 67 _SetResultString
1960: 28 69 6e 74 65 72 70 2c 20 22 69 6e 76 61 6c 69 (interp, "invali
1970: 64 20 70 61 72 61 6d 65 74 65 72 3a 20 6e 65 67 d parameter: neg
1980: 61 74 69 76 65 20 6c 65 6e 22 2c 0a 20 20 20 20 ative len",.
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19a0: 20 20 20 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 -1);.
19b0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 return
19c0: 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 20 20 20 20 JIM_ERR;.
19d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 }.
19e0: 20 20 20 6e 65 65 64 65 64 4c 65 6e 20 3d 20 28 neededLen = (
19f0: 69 6e 74 29 20 77 69 64 65 56 61 6c 75 65 3b 0a int) wideValue;.
1a00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
1a10: 20 20 6f 62 6a 50 74 72 20 3d 20 4a 69 6d 5f 4e objPtr = Jim_N
1a20: 65 77 53 74 72 69 6e 67 4f 62 6a 28 69 6e 74 65 ewStringObj(inte
1a30: 72 70 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 rp, NULL, 0);.
1a40: 20 20 20 20 20 20 77 68 69 6c 65 20 28 6e 65 65 while (nee
1a50: 64 65 64 4c 65 6e 20 21 3d 20 30 29 20 7b 0a 20 dedLen != 0) {.
1a60: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 int r
1a70: 65 74 76 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 etval;.
1a80: 20 20 20 69 6e 74 20 72 65 61 64 6c 65 6e 3b 0a int readlen;.
1a90: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 .
1aa0: 20 20 20 20 20 20 20 20 69 66 20 28 6e 65 65 64 if (need
1ab0: 65 64 4c 65 6e 20 3d 3d 20 2d 31 29 20 7b 0a 20 edLen == -1) {.
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 r
1ad0: 65 61 64 6c 65 6e 20 3d 20 41 49 4f 5f 42 55 46 eadlen = AIO_BUF
1ae0: 5f 4c 45 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 _LEN;.
1af0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 } else {.
1b00: 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64 6c readl
1b10: 65 6e 20 3d 20 28 6e 65 65 64 65 64 4c 65 6e 20 en = (neededLen
1b20: 3e 20 41 49 4f 5f 42 55 46 5f 4c 45 4e 20 3f 20 > AIO_BUF_LEN ?
1b30: 41 49 4f 5f 42 55 46 5f 4c 45 4e 20 3a 20 6e 65 AIO_BUF_LEN : ne
1b40: 65 64 65 64 4c 65 6e 29 3b 0a 20 20 20 20 20 20 ededLen);.
1b50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
1b60: 20 20 20 20 72 65 74 76 61 6c 20 3d 20 66 72 65 retval = fre
1b70: 61 64 28 62 75 66 2c 20 31 2c 20 72 65 61 64 6c ad(buf, 1, readl
1b80: 65 6e 2c 20 61 66 2d 3e 66 70 29 3b 0a 20 20 20 en, af->fp);.
1b90: 20 20 20 20 20 20 20 20 20 69 66 20 28 72 65 74 if (ret
1ba0: 76 61 6c 20 3e 20 30 29 20 7b 0a 20 20 20 20 20 val > 0) {.
1bb0: 20 20 20 20 20 20 20 20 20 20 20 4a 69 6d 5f 41 Jim_A
1bc0: 70 70 65 6e 64 53 74 72 69 6e 67 28 69 6e 74 65 ppendString(inte
1bd0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 62 75 66 2c rp, objPtr, buf,
1be0: 20 72 65 74 76 61 6c 29 3b 0a 20 20 20 20 20 20 retval);.
1bf0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6e 65 if (ne
1c00: 65 64 65 64 4c 65 6e 20 21 3d 20 2d 31 29 20 7b ededLen != -1) {
1c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1c20: 20 20 20 20 20 6e 65 65 64 65 64 4c 65 6e 20 2d neededLen -
1c30: 3d 20 72 65 74 76 61 6c 3b 0a 20 20 20 20 20 20 = retval;.
1c40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
1c50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
1c60: 20 20 20 20 20 20 69 66 20 28 72 65 74 76 61 6c if (retval
1c70: 20 21 3d 20 72 65 61 64 6c 65 6e 29 20 62 72 65 != readlen) bre
1c80: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 ak;. }.
1c90: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 /* Check f
1ca0: 6f 72 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 or error conditi
1cb0: 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 ons */. i
1cc0: 66 20 28 66 65 72 72 6f 72 28 61 66 2d 3e 66 70 f (ferror(af->fp
1cd0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 )) {.
1ce0: 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f /* I/O error */
1cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 4a 69 6d . Jim
1d00: 5f 46 72 65 65 4e 65 77 4f 62 6a 28 69 6e 74 65 _FreeNewObj(inte
1d10: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
1d20: 20 20 20 20 20 20 20 20 20 4a 69 6d 41 69 6f 53 JimAioS
1d30: 65 74 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b etError(interp);
1d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 . ret
1d50: 75 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 urn JIM_ERR;.
1d60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 }. i
1d70: 66 20 28 6e 6f 6e 65 77 6c 69 6e 65 29 20 7b 0a f (nonewline) {.
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 int
1d90: 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 len;.
1da0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 20 3d const char *s =
1db0: 20 4a 69 6d 5f 47 65 74 53 74 72 69 6e 67 28 6f Jim_GetString(o
1dc0: 62 6a 50 74 72 2c 20 26 6c 65 6e 29 3b 0a 0a 20 bjPtr, &len);..
1dd0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6c if (l
1de0: 65 6e 20 3e 20 30 20 26 26 20 73 5b 6c 65 6e 2d en > 0 && s[len-
1df0: 31 5d 20 3d 3d 20 27 5c 6e 27 29 20 7b 0a 20 20 1] == '\n') {.
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 ob
1e10: 6a 50 74 72 2d 3e 6c 65 6e 67 74 68 2d 2d 3b 0a jPtr->length--;.
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e30: 6f 62 6a 50 74 72 2d 3e 62 79 74 65 73 5b 6f 62 objPtr->bytes[ob
1e40: 6a 50 74 72 2d 3e 6c 65 6e 67 74 68 5d 20 3d 20 jPtr->length] =
1e50: 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 '\0';.
1e60: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 }. }.
1e70: 20 20 20 20 20 20 4a 69 6d 5f 53 65 74 52 65 73 Jim_SetRes
1e80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ult(interp, objP
1e90: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 tr);. ret
1ea0: 75 72 6e 20 4a 49 4d 5f 4f 4b 3b 0a 20 20 20 20 urn JIM_OK;.
1eb0: 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f } else if (optio
1ec0: 6e 20 3d 3d 20 4f 50 54 5f 50 55 54 53 29 20 7b n == OPT_PUTS) {
1ed0: 0a 20 20 20 20 2f 2a 20 50 55 54 53 20 2a 2f 0a . /* PUTS */.
1ee0: 20 20 20 20 20 20 20 20 69 6e 74 20 77 6c 65 6e int wlen
1ef0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 ;. const
1f00: 63 68 61 72 20 2a 77 64 61 74 61 3b 0a 0a 20 20 char *wdata;..
1f10: 20 20 20 20 20 20 69 66 20 28 61 72 67 63 20 21 if (argc !
1f20: 3d 20 33 20 26 26 20 28 61 72 67 63 20 21 3d 20 = 3 && (argc !=
1f30: 34 20 7c 7c 20 21 4a 69 6d 5f 43 6f 6d 70 61 72 4 || !Jim_Compar
1f40: 65 53 74 72 69 6e 67 49 6d 6d 65 64 69 61 74 65 eStringImmediate
1f50: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 (.
1f60: 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 interp
1f70: 2c 20 61 72 67 76 5b 32 5d 2c 20 22 2d 6e 6f 6e , argv[2], "-non
1f80: 65 77 6c 69 6e 65 22 29 29 29 20 7b 0a 20 20 20 ewline"))) {.
1f90: 20 20 20 20 20 20 20 20 20 4a 69 6d 5f 57 72 6f Jim_Wro
1fa0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
1fb0: 2c 20 32 2c 20 61 72 67 76 2c 20 22 3f 2d 6e 6f , 2, argv, "?-no
1fc0: 6e 65 77 6c 69 6e 65 3f 20 73 74 72 69 6e 67 22 newline? string"
1fd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 );. r
1fe0: 65 74 75 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a 20 eturn JIM_ERR;.
1ff0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
2000: 20 77 64 61 74 61 20 3d 20 4a 69 6d 5f 47 65 74 wdata = Jim_Get
2010: 53 74 72 69 6e 67 28 61 72 67 76 5b 32 2b 28 61 String(argv[2+(a
2020: 72 67 63 3d 3d 34 29 5d 2c 20 26 77 6c 65 6e 29 rgc==4)], &wlen)
2030: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 66 77 ;. if (fw
2040: 72 69 74 65 28 77 64 61 74 61 2c 20 31 2c 20 77 rite(wdata, 1, w
2050: 6c 65 6e 2c 20 61 66 2d 3e 66 70 29 20 21 3d 20 len, af->fp) !=
2060: 28 75 6e 73 69 67 6e 65 64 29 77 6c 65 6e 20 7c (unsigned)wlen |
2070: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 61 |. (a
2080: 72 67 63 20 3d 3d 20 33 20 26 26 20 66 77 72 69 rgc == 3 && fwri
2090: 74 65 28 22 5c 6e 22 2c 20 31 2c 20 31 2c 20 61 te("\n", 1, 1, a
20a0: 66 2d 3e 66 70 29 20 21 3d 20 31 29 29 20 7b 0a f->fp) != 1)) {.
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 4a 69 6d 41 JimA
20c0: 69 6f 53 65 74 45 72 72 6f 72 28 69 6e 74 65 72 ioSetError(inter
20d0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 p);.
20e0: 72 65 74 75 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a return JIM_ERR;.
20f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
2100: 20 20 72 65 74 75 72 6e 20 4a 49 4d 5f 4f 4b 3b return JIM_OK;
2110: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
2120: 6f 70 74 69 6f 6e 20 20 3d 3d 20 4f 50 54 5f 46 option == OPT_F
2130: 4c 55 53 48 29 20 7b 0a 20 20 20 20 2f 2a 20 46 LUSH) {. /* F
2140: 4c 55 53 48 20 2a 2f 0a 20 20 20 20 20 20 20 20 LUSH */.
2150: 69 66 20 28 61 72 67 63 20 21 3d 20 32 29 20 7b if (argc != 2) {
2160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 4a 69 6d . Jim
2170: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
2180: 74 65 72 70 2c 20 32 2c 20 61 72 67 76 2c 20 22 terp, 2, argv, "
2190: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ");.
21a0: 72 65 74 75 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a return JIM_ERR;.
21b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
21c0: 20 20 69 66 20 28 66 66 6c 75 73 68 28 61 66 2d if (fflush(af-
21d0: 3e 66 70 29 20 3d 3d 20 45 4f 46 29 20 7b 0a 20 >fp) == EOF) {.
21e0: 20 20 20 20 20 20 20 20 20 20 20 4a 69 6d 41 69 JimAi
21f0: 6f 53 65 74 45 72 72 6f 72 28 69 6e 74 65 72 70 oSetError(interp
2200: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 );. r
2210: 65 74 75 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a 20 eturn JIM_ERR;.
2220: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
2230: 20 72 65 74 75 72 6e 20 4a 49 4d 5f 4f 4b 3b 0a return JIM_OK;.
2240: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6f } else if (o
2250: 70 74 69 6f 6e 20 20 3d 3d 20 4f 50 54 5f 45 4f ption == OPT_EO
2260: 46 29 20 7b 0a 20 20 20 20 2f 2a 20 45 4f 46 20 F) {. /* EOF
2270: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28 61 */. if (a
2280: 72 67 63 20 21 3d 20 32 29 20 7b 0a 20 20 20 20 rgc != 2) {.
2290: 20 20 20 20 20 20 20 20 4a 69 6d 5f 57 72 6f 6e Jim_Wron
22a0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
22b0: 20 32 2c 20 61 72 67 76 2c 20 22 22 29 3b 0a 20 2, argv, "");.
22c0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 retur
22d0: 6e 20 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 20 20 n JIM_ERR;.
22e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4a 69 6d }. Jim
22f0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
2300: 70 2c 20 4a 69 6d 5f 4e 65 77 49 6e 74 4f 62 6a p, Jim_NewIntObj
2310: 28 69 6e 74 65 72 70 2c 20 66 65 6f 66 28 61 66 (interp, feof(af
2320: 2d 3e 66 70 29 29 29 3b 0a 20 20 20 20 20 20 20 ->fp)));.
2330: 20 72 65 74 75 72 6e 20 4a 49 4d 5f 4f 4b 3b 0a return JIM_OK;.
2340: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
2350: 20 4a 49 4d 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 JIM_OK;.}..stat
2360: 69 63 20 69 6e 74 20 4a 69 6d 41 69 6f 4f 70 65 ic int JimAioOpe
2370: 6e 43 6f 6d 6d 61 6e 64 28 4a 69 6d 5f 49 6e 74 nCommand(Jim_Int
2380: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
2390: 20 61 72 67 63 2c 20 0a 20 20 20 20 20 20 20 20 argc, .
23a0: 4a 69 6d 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a Jim_Obj *const *
23b0: 61 72 67 76 29 0a 7b 0a 20 20 20 20 46 49 4c 45 argv).{. FILE
23c0: 20 2a 66 70 3b 0a 20 20 20 20 41 69 6f 46 69 6c *fp;. AioFil
23d0: 65 20 2a 61 66 3b 0a 20 20 20 20 63 68 61 72 20 e *af;. char
23e0: 62 75 66 5b 41 49 4f 5f 43 4d 44 5f 4c 45 4e 5d buf[AIO_CMD_LEN]
23f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
2400: 20 2a 6d 6f 64 65 20 3d 20 22 72 22 3b 0a 20 20 *mode = "r";.
2410: 20 20 4a 69 6d 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Jim_Obj *objPt
2420: 72 3b 0a 20 20 20 20 6c 6f 6e 67 20 66 69 6c 65 r;. long file
2430: 49 64 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 Id;. const ch
2440: 61 72 20 2a 6f 70 74 69 6f 6e 73 5b 5d 20 3d 20 ar *options[] =
2450: 7b 22 69 6e 70 75 74 22 2c 20 22 6f 75 74 70 75 {"input", "outpu
2460: 74 22 2c 20 22 65 72 72 6f 72 22 7d 3b 0a 20 20 t", "error"};.
2470: 20 20 65 6e 75 6d 20 7b 4f 50 54 5f 49 4e 50 55 enum {OPT_INPU
2480: 54 2c 20 4f 50 54 5f 4f 55 54 50 55 54 2c 20 4f T, OPT_OUTPUT, O
2490: 50 54 5f 45 52 52 4f 52 7d 3b 0a 20 20 20 20 69 PT_ERROR};. i
24a0: 6e 74 20 6b 65 65 70 4f 70 65 6e 20 3d 20 30 2c nt keepOpen = 0,
24b0: 20 6d 6f 64 65 4c 65 6e 3b 0a 0a 20 20 20 20 69 modeLen;.. i
24c0: 66 20 28 61 72 67 63 20 21 3d 20 32 20 26 26 20 f (argc != 2 &&
24d0: 61 72 67 63 20 21 3d 20 33 29 20 7b 0a 20 20 20 argc != 3) {.
24e0: 20 20 20 20 20 4a 69 6d 5f 57 72 6f 6e 67 4e 75 Jim_WrongNu
24f0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
2500: 20 61 72 67 76 2c 20 22 66 69 6c 65 6e 61 6d 65 argv, "filename
2510: 20 3f 6d 6f 64 65 3f 22 29 3b 0a 20 20 20 20 20 ?mode?");.
2520: 20 20 20 72 65 74 75 72 6e 20 4a 49 4d 5f 45 52 return JIM_ER
2530: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
2540: 28 61 72 67 63 20 3d 3d 20 33 29 0a 20 20 20 20 (argc == 3).
2550: 20 20 20 20 6d 6f 64 65 20 3d 20 4a 69 6d 5f 47 mode = Jim_G
2560: 65 74 53 74 72 69 6e 67 28 61 72 67 76 5b 32 5d etString(argv[2]
2570: 2c 20 26 6d 6f 64 65 4c 65 6e 29 3b 0a 20 20 20 , &modeLen);.
2580: 20 69 66 20 28 61 72 67 63 20 3d 3d 20 33 20 26 if (argc == 3 &
2590: 26 20 4a 69 6d 5f 43 6f 6d 70 61 72 65 53 74 72 & Jim_CompareStr
25a0: 69 6e 67 49 6d 6d 65 64 69 61 74 65 28 69 6e 74 ingImmediate(int
25b0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 22 73 erp, argv[1], "s
25c0: 74 61 6e 64 61 72 64 22 29 20 26 26 0a 20 20 20 tandard") &&.
25d0: 20 20 20 20 20 20 20 20 20 6d 6f 64 65 4c 65 6e modeLen
25e0: 20 3e 3d 20 33 29 20 7b 0a 20 20 20 20 20 20 20 >= 3) {.
25f0: 20 20 20 20 20 69 6e 74 20 6f 70 74 69 6f 6e 3b int option;
2600: 0a 20 20 20 20 20 20 20 20 69 66 20 28 4a 69 6d . if (Jim
2610: 5f 47 65 74 45 6e 75 6d 28 69 6e 74 65 72 70 2c _GetEnum(interp,
2620: 20 61 72 67 76 5b 32 5d 2c 20 6f 70 74 69 6f 6e argv[2], option
2630: 73 2c 20 26 6f 70 74 69 6f 6e 2c 20 22 73 74 61 s, &option, "sta
2640: 6e 64 61 72 64 20 63 68 61 6e 6e 65 6c 22 2c 0a ndard channel",.
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2660: 20 20 20 20 4a 49 4d 5f 45 52 52 4d 53 47 29 20 JIM_ERRMSG)
2670: 21 3d 20 4a 49 4d 5f 4f 4b 29 0a 20 20 20 20 20 != JIM_OK).
2680: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 4a 49 return JI
2690: 4d 5f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 6b M_ERR;. k
26a0: 65 65 70 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 eepOpen = 1;.
26b0: 20 20 20 20 20 73 77 69 74 63 68 20 28 6f 70 74 switch (opt
26c0: 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 63 ion) {. c
26d0: 61 73 65 20 4f 50 54 5f 49 4e 50 55 54 3a 20 66 ase OPT_INPUT: f
26e0: 70 20 3d 20 73 74 64 69 6e 3b 20 62 72 65 61 6b p = stdin; break
26f0: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f ;. case O
2700: 50 54 5f 4f 55 54 50 55 54 3a 20 66 70 20 3d 20 PT_OUTPUT: fp =
2710: 73 74 64 6f 75 74 3b 20 62 72 65 61 6b 3b 0a 20 stdout; break;.
2720: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f case OPT_
2730: 45 52 52 4f 52 3a 20 66 70 20 3d 20 73 74 64 65 ERROR: fp = stde
2740: 72 72 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 rr; break;.
2750: 20 20 20 64 65 66 61 75 6c 74 3a 20 66 70 20 3d default: fp =
2760: 20 4e 55 4c 4c 3b 20 4a 69 6d 5f 50 61 6e 69 63 NULL; Jim_Panic
2770: 28 69 6e 74 65 72 70 2c 22 64 65 66 61 75 6c 74 (interp,"default
2780: 20 72 65 61 63 68 65 64 20 69 6e 20 4a 69 6d 41 reached in JimA
2790: 69 6f 4f 70 65 6e 43 6f 6d 6d 61 6e 64 28 29 22 ioOpenCommand()"
27a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 );.
27b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
27c0: 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 }. } else
27d0: 7b 0a 20 20 20 20 20 20 20 20 66 70 20 3d 20 66 {. fp = f
27e0: 6f 70 65 6e 28 4a 69 6d 5f 47 65 74 53 74 72 69 open(Jim_GetStri
27f0: 6e 67 28 61 72 67 76 5b 31 5d 2c 20 4e 55 4c 4c ng(argv[1], NULL
2800: 29 2c 20 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 ), mode);.
2810: 20 20 69 66 20 28 66 70 20 3d 3d 20 4e 55 4c 4c if (fp == NULL
2820: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ) {.
2830: 4a 69 6d 41 69 6f 53 65 74 45 72 72 6f 72 28 69 JimAioSetError(i
2840: 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 20 20 nterp);.
2850: 20 20 20 20 72 65 74 75 72 6e 20 4a 49 4d 5f 45 return JIM_E
2860: 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 RR;. }.
2870: 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 }. /* Get t
2880: 68 65 20 6e 65 78 74 20 66 69 6c 65 20 69 64 20 he next file id
2890: 2a 2f 0a 20 20 20 20 69 66 20 28 4a 69 6d 5f 45 */. if (Jim_E
28a0: 76 61 6c 47 6c 6f 62 61 6c 28 69 6e 74 65 72 70 valGlobal(interp
28b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
28c0: 20 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 69 "if {[catch {i
28d0: 6e 63 72 20 61 69 6f 2e 66 69 6c 65 49 64 7d 5d ncr aio.fileId}]
28e0: 7d 20 7b 73 65 74 20 61 69 6f 2e 66 69 6c 65 49 } {set aio.fileI
28f0: 64 20 30 7d 22 29 20 21 3d 20 4a 49 4d 5f 4f 4b d 0}") != JIM_OK
2900: 29 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e ). return
2910: 20 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 20 6f 62 JIM_ERR;. ob
2920: 6a 50 74 72 20 3d 20 4a 69 6d 5f 47 65 74 47 6c jPtr = Jim_GetGl
2930: 6f 62 61 6c 56 61 72 69 61 62 6c 65 53 74 72 28 obalVariableStr(
2940: 69 6e 74 65 72 70 2c 20 22 61 69 6f 2e 66 69 6c interp, "aio.fil
2950: 65 49 64 22 2c 20 4a 49 4d 5f 45 52 52 4d 53 47 eId", JIM_ERRMSG
2960: 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 50 74 );. if (objPt
2970: 72 20 3d 3d 20 4e 55 4c 4c 29 20 72 65 74 75 72 r == NULL) retur
2980: 6e 20 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 20 69 n JIM_ERR;. i
2990: 66 20 28 4a 69 6d 5f 47 65 74 4c 6f 6e 67 28 69 f (Jim_GetLong(i
29a0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 26 nterp, objPtr, &
29b0: 66 69 6c 65 49 64 29 20 21 3d 20 4a 49 4d 5f 4f fileId) != JIM_O
29c0: 4b 29 20 72 65 74 75 72 6e 20 4a 49 4d 5f 45 52 K) return JIM_ER
29d0: 52 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 R;.. /* Creat
29e0: 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6d 6d 61 e the file comma
29f0: 6e 64 20 2a 2f 0a 20 20 20 20 61 66 20 3d 20 4a nd */. af = J
2a00: 69 6d 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 im_Alloc(sizeof(
2a10: 2a 61 66 29 29 3b 0a 20 20 20 20 61 66 2d 3e 66 *af));. af->f
2a20: 70 20 3d 20 66 70 3b 0a 20 20 20 20 61 66 2d 3e p = fp;. af->
2a30: 6b 65 65 70 4f 70 65 6e 20 3d 20 6b 65 65 70 4f keepOpen = keepO
2a40: 70 65 6e 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 pen;. sprintf
2a50: 28 62 75 66 2c 20 22 61 69 6f 2e 68 61 6e 64 6c (buf, "aio.handl
2a60: 65 25 6c 64 22 2c 20 66 69 6c 65 49 64 29 3b 0a e%ld", fileId);.
2a70: 20 20 20 20 4a 69 6d 5f 43 72 65 61 74 65 43 6f Jim_CreateCo
2a80: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 62 75 mmand(interp, bu
2a90: 66 2c 20 4a 69 6d 41 69 6f 48 61 6e 64 6c 65 72 f, JimAioHandler
2aa0: 43 6f 6d 6d 61 6e 64 2c 20 61 66 2c 20 4a 69 6d Command, af, Jim
2ab0: 41 69 6f 44 65 6c 50 72 6f 63 29 3b 0a 20 20 20 AioDelProc);.
2ac0: 20 4a 69 6d 5f 53 65 74 52 65 73 75 6c 74 53 74 Jim_SetResultSt
2ad0: 72 69 6e 67 28 69 6e 74 65 72 70 2c 20 62 75 66 ring(interp, buf
2ae0: 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 , -1);. retur
2af0: 6e 20 4a 49 4d 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 n JIM_OK;.}..#if
2b00: 6e 64 65 66 20 4a 49 4d 5f 53 54 41 54 49 43 45 ndef JIM_STATICE
2b10: 58 54 0a 69 6e 74 20 4a 69 6d 5f 4f 6e 4c 6f 61 XT.int Jim_OnLoa
2b20: 64 28 4a 69 6d 5f 49 6e 74 65 72 70 20 2a 69 6e d(Jim_Interp *in
2b30: 74 65 72 70 29 0a 23 65 6c 73 65 0a 69 6e 74 20 terp).#else.int
2b40: 4a 69 6d 5f 41 69 6f 49 6e 69 74 28 4a 69 6d 5f Jim_AioInit(Jim_
2b50: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 0a Interp *interp).
2b60: 23 65 6e 64 69 66 0a 7b 0a 20 20 20 20 23 69 66 #endif.{. #if
2b70: 6e 64 65 66 20 4a 49 4d 5f 53 54 41 54 49 43 45 ndef JIM_STATICE
2b80: 58 54 0a 20 20 20 20 4a 69 6d 5f 49 6e 69 74 45 XT. Jim_InitE
2b90: 78 74 65 6e 73 69 6f 6e 28 69 6e 74 65 72 70 29 xtension(interp)
2ba0: 3b 0a 20 20 20 20 23 65 6e 64 69 66 0a 20 20 20 ;. #endif.
2bb0: 20 69 66 20 28 4a 69 6d 5f 50 61 63 6b 61 67 65 if (Jim_Package
2bc0: 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 Provide(interp,
2bd0: 22 61 69 6f 22 2c 20 22 31 2e 30 22 2c 20 4a 49 "aio", "1.0", JI
2be0: 4d 5f 45 52 52 4d 53 47 29 20 21 3d 20 4a 49 4d M_ERRMSG) != JIM
2bf0: 5f 4f 4b 29 0a 20 20 20 20 20 20 20 20 72 65 74 _OK). ret
2c00: 75 72 6e 20 4a 49 4d 5f 45 52 52 3b 0a 20 20 20 urn JIM_ERR;.
2c10: 20 4a 69 6d 5f 43 72 65 61 74 65 43 6f 6d 6d 61 Jim_CreateComma
2c20: 6e 64 28 69 6e 74 65 72 70 2c 20 22 61 69 6f 2e nd(interp, "aio.
2c30: 6f 70 65 6e 22 2c 20 4a 69 6d 41 69 6f 4f 70 65 open", JimAioOpe
2c40: 6e 43 6f 6d 6d 61 6e 64 2c 20 4e 55 4c 4c 2c 20 nCommand, NULL,
2c50: 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 NULL);. retur
2c60: 6e 20 4a 49 4d 5f 4f 4b 3b 0a 7d 0a n JIM_OK;.}.