Jim Tcl
Hex Artifact Content
Not logged in

Artifact a755fdc10662daa31dcbd41d7e38a778c6fc5ad7:


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;.}.