Jim Tcl
Hex Artifact Content
Not logged in

Artifact 626a63dd7f47bfe38238eb1b882ba842040d5081:


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