Hex Artifact Content

Artifact 1d0ef6f1071a747092ad516dde030b62090a5890:


0000: 2f 2a 0a 20 2a 20 20 54 63 6c 54 43 43 20 2d 20  /*. *  TclTCC - 
0010: 54 63 6c 20 62 69 6e 64 69 6e 67 20 74 6f 20 54  Tcl binding to T
0020: 69 6e 79 20 43 20 43 6f 6d 70 69 6c 65 72 0a 20  iny C Compiler. 
0030: 2a 20 0a 20 2a 20 20 43 6f 70 79 72 69 67 68 74  * . *  Copyright
0040: 20 28 63 29 20 32 30 30 37 20 4d 61 72 6b 20 4a   (c) 2007 Mark J
0050: 61 6e 73 73 65 6e 0a 20 2a 20 20 43 6f 70 79 72  anssen. *  Copyr
0060: 69 67 68 74 20 28 63 29 20 32 30 31 34 20 52 6f  ight (c) 2014 Ro
0070: 79 20 4b 65 65 6e 65 0a 20 2a 0a 20 2a 20 54 68  y Keene. *. * Th
0080: 69 73 20 6c 69 62 72 61 72 79 20 69 73 20 66 72  is library is fr
0090: 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f 75  ee software; you
00a0: 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 74   can redistribut
00b0: 65 20 69 74 20 61 6e 64 2f 6f 72 0a 20 2a 20 6d  e it and/or. * m
00c0: 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20 74  odify it under t
00d0: 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
00e0: 47 4e 55 20 4c 65 73 73 65 72 20 47 65 6e 65 72  GNU Lesser Gener
00f0: 61 6c 20 50 75 62 6c 69 63 0a 20 2a 20 4c 69 63  al Public. * Lic
0100: 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73 68 65  ense as publishe
0110: 64 20 62 79 20 74 68 65 20 46 72 65 65 20 53 6f  d by the Free So
0120: 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f  ftware Foundatio
0130: 6e 3b 20 65 69 74 68 65 72 0a 20 2a 20 76 65 72  n; either. * ver
0140: 73 69 6f 6e 20 32 20 6f 66 20 74 68 65 20 4c 69  sion 2 of the Li
0150: 63 65 6e 73 65 2c 20 6f 72 20 28 61 74 20 79 6f  cense, or (at yo
0160: 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c  ur option) any l
0170: 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 20 2a  ater version.. *
0180: 0a 20 2a 20 54 68 69 73 20 6c 69 62 72 61 72 79  . * This library
0190: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
01a0: 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74  in the hope that
01b0: 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66   it will be usef
01c0: 75 6c 2c 0a 20 2a 20 62 75 74 20 57 49 54 48 4f  ul,. * but WITHO
01d0: 55 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b  UT ANY WARRANTY;
01e0: 20 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68   without even th
01f0: 65 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e  e implied warran
0200: 74 79 20 6f 66 0a 20 2a 20 4d 45 52 43 48 41 4e  ty of. * MERCHAN
0210: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
0220: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
0230: 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20 20 53  ULAR PURPOSE.  S
0240: 65 65 20 74 68 65 20 47 4e 55 0a 20 2a 20 4c 65  ee the GNU. * Le
0250: 73 73 65 72 20 47 65 6e 65 72 61 6c 20 50 75 62  sser General Pub
0260: 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f 72 20  lic License for 
0270: 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a 20 2a  more details.. *
0280: 0a 20 2a 20 59 6f 75 20 73 68 6f 75 6c 64 20 68  . * You should h
0290: 61 76 65 20 72 65 63 65 69 76 65 64 20 61 20 63  ave received a c
02a0: 6f 70 79 20 6f 66 20 74 68 65 20 47 4e 55 20 4c  opy of the GNU L
02b0: 65 73 73 65 72 20 47 65 6e 65 72 61 6c 20 50 75  esser General Pu
02c0: 62 6c 69 63 0a 20 2a 20 4c 69 63 65 6e 73 65 20  blic. * License 
02d0: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 69 73 20  along with this 
02e0: 6c 69 62 72 61 72 79 3b 20 69 66 20 6e 6f 74 2c  library; if not,
02f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 46 72   write to the Fr
0300: 65 65 20 53 6f 66 74 77 61 72 65 0a 20 2a 20 46  ee Software. * F
0310: 6f 75 6e 64 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c  oundation, Inc.,
0320: 20 35 39 20 54 65 6d 70 6c 65 20 50 6c 61 63 65   59 Temple Place
0330: 2c 20 53 75 69 74 65 20 33 33 30 2c 20 42 6f 73  , Suite 330, Bos
0340: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
0350: 33 30 37 20 20 55 53 41 0a 20 2a 2f 0a 0a 23 69  307  USA. */..#i
0360: 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23  nclude <tcl.h>.#
0370: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0380: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 63  h>.#include "tcc
0390: 2e 68 22 0a 0a 73 74 72 75 63 74 20 54 63 6c 54  .h"..struct TclT
03a0: 43 43 53 74 61 74 65 20 7b 0a 09 54 43 43 53 74  CCState {..TCCSt
03b0: 61 74 65 20 2a 73 3b 0a 09 69 6e 74 20 72 65 6c  ate *s;..int rel
03c0: 6f 63 61 74 65 64 3b 0a 7d 3b 0a 0a 73 74 61 74  ocated;.};..stat
03d0: 69 63 20 76 6f 69 64 20 54 63 63 34 74 63 6c 45  ic void Tcc4tclE
03e0: 72 72 6f 72 46 75 6e 63 28 54 63 6c 5f 49 6e 74  rrorFunc(Tcl_Int
03f0: 65 72 70 20 2a 20 69 6e 74 65 72 70 2c 20 63 68  erp * interp, ch
0400: 61 72 20 2a 20 6d 73 67 29 20 7b 0a 09 54 63 6c  ar * msg) {..Tcl
0410: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
0420: 74 65 72 70 2c 20 6d 73 67 2c 20 22 5c 6e 22 2c  terp, msg, "\n",
0430: 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 73 74 61 74 69   NULL);.}..stati
0440: 63 20 76 6f 69 64 20 54 63 63 34 74 63 6c 43 43  c void Tcc4tclCC
0450: 6f 6d 6d 61 6e 64 44 65 6c 65 74 65 50 72 6f 63  ommandDeleteProc
0460: 20 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64 61   (ClientData cda
0470: 74 61 29 20 7b 0a 09 73 74 72 75 63 74 20 54 63  ta) {..struct Tc
0480: 6c 54 43 43 53 74 61 74 65 20 2a 74 73 3b 0a 09  lTCCState *ts;..
0490: 54 43 43 53 74 61 74 65 20 2a 73 20 3b 0a 0a 09  TCCState *s ;...
04a0: 74 73 20 3d 20 28 73 74 72 75 63 74 20 54 63 6c  ts = (struct Tcl
04b0: 54 43 43 53 74 61 74 65 20 2a 29 20 63 64 61 74  TCCState *) cdat
04c0: 61 3b 0a 09 73 20 3d 20 74 73 2d 3e 73 3b 0a 0a  a;..s = ts->s;..
04d0: 09 2f 2a 20 57 65 20 63 61 6e 20 64 65 6c 65 74  ./* We can delet
04e0: 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 69  e the compiler i
04f0: 66 20 74 68 65 20 6f 75 74 70 75 74 20 77 61 73  f the output was
0500: 20 6e 6f 74 20 74 6f 20 6d 65 6d 6f 72 79 20 2a   not to memory *
0510: 2f 0a 09 69 66 20 28 73 2d 3e 6f 75 74 70 75 74  /..if (s->output
0520: 5f 74 79 70 65 20 21 3d 20 54 43 43 5f 4f 55 54  _type != TCC_OUT
0530: 50 55 54 5f 4d 45 4d 4f 52 59 29 20 7b 0a 09 09  PUT_MEMORY) {...
0540: 74 63 63 5f 64 65 6c 65 74 65 28 73 29 3b 0a 09  tcc_delete(s);..
0550: 09 74 73 2d 3e 73 20 3d 20 4e 55 4c 4c 3b 0a 09  .ts->s = NULL;..
0560: 7d 0a 0a 09 63 6b 66 72 65 65 28 28 76 6f 69 64  }...ckfree((void
0570: 20 2a 29 20 74 73 29 3b 0a 7d 0a 0a 73 74 61 74   *) ts);.}..stat
0580: 69 63 20 69 6e 74 20 54 63 63 34 74 63 6c 48 61  ic int Tcc4tclHa
0590: 6e 64 6c 65 43 6d 64 20 28 20 43 6c 69 65 6e 74  ndleCmd ( Client
05a0: 44 61 74 61 20 63 64 61 74 61 2c 20 54 63 6c 5f  Data cdata, Tcl_
05b0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
05c0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
05d0: 6a 20 2a 20 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  j * CONST objv[]
05e0: 29 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ){..unsigned lon
05f0: 67 20 76 61 6c 3b 0a 09 76 6f 69 64 20 2a 76 61  g val;..void *va
0600: 6c 5f 70 3b 0a 09 69 6e 74 20 69 6e 64 65 78 3b  l_p;..int index;
0610: 0a 09 69 6e 74 20 72 65 73 3b 0a 09 73 74 72 75  ..int res;..stru
0620: 63 74 20 54 63 6c 54 43 43 53 74 61 74 65 20 2a  ct TclTCCState *
0630: 74 73 3b 0a 09 54 43 43 53 74 61 74 65 20 2a 73  ts;..TCCState *s
0640: 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 73 79 6d 5f  ;..Tcl_Obj *sym_
0650: 61 64 64 72 3b 0a 09 73 74 61 74 69 63 20 43 4f  addr;..static CO
0660: 4e 53 54 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e  NST char *option
0670: 73 5b 5d 20 3d 20 7b 0a 09 09 22 61 64 64 5f 69  s[] = {..."add_i
0680: 6e 63 6c 75 64 65 5f 70 61 74 68 22 2c 20 22 61  nclude_path", "a
0690: 64 64 5f 66 69 6c 65 22 2c 20 20 22 61 64 64 5f  dd_file",  "add_
06a0: 6c 69 62 72 61 72 79 22 2c 20 0a 09 09 22 61 64  library", ..."ad
06b0: 64 5f 6c 69 62 72 61 72 79 5f 70 61 74 68 22 2c  d_library_path",
06c0: 20 22 61 64 64 5f 73 79 6d 62 6f 6c 22 2c 20 22   "add_symbol", "
06d0: 63 6f 6d 6d 61 6e 64 22 2c 20 22 63 6f 6d 70 69  command", "compi
06e0: 6c 65 22 2c 0a 09 09 22 64 65 66 69 6e 65 22 2c  le",..."define",
06f0: 20 22 67 65 74 5f 73 79 6d 62 6f 6c 22 2c 20 22   "get_symbol", "
0700: 6f 75 74 70 75 74 5f 66 69 6c 65 22 2c 20 22 75  output_file", "u
0710: 6e 64 65 66 69 6e 65 22 2c 0a 09 09 28 63 68 61  ndefine",...(cha
0720: 72 20 2a 29 20 4e 55 4c 4c 0a 09 7d 3b 0a 09 65  r *) NULL..};..e
0730: 6e 75 6d 20 6f 70 74 69 6f 6e 73 20 7b 0a 09 09  num options {...
0740: 54 43 43 34 54 43 4c 5f 41 44 44 5f 49 4e 43 4c  TCC4TCL_ADD_INCL
0750: 55 44 45 2c 20 54 43 43 34 54 43 4c 5f 41 44 44  UDE, TCC4TCL_ADD
0760: 5f 46 49 4c 45 2c 20 54 43 43 34 54 43 4c 5f 41  _FILE, TCC4TCL_A
0770: 44 44 5f 4c 49 42 52 41 52 59 2c 20 0a 09 09 54  DD_LIBRARY, ...T
0780: 43 43 34 54 43 4c 5f 41 44 44 5f 4c 49 42 52 41  CC4TCL_ADD_LIBRA
0790: 52 59 5f 50 41 54 48 2c 20 54 43 43 34 54 43 4c  RY_PATH, TCC4TCL
07a0: 5f 41 44 44 5f 53 59 4d 42 4f 4c 2c 20 54 43 43  _ADD_SYMBOL, TCC
07b0: 34 54 43 4c 5f 43 4f 4d 4d 41 4e 44 2c 20 54 43  4TCL_COMMAND, TC
07c0: 43 34 54 43 4c 5f 43 4f 4d 50 49 4c 45 2c 0a 09  C4TCL_COMPILE,..
07d0: 09 54 43 43 34 54 43 4c 5f 44 45 46 49 4e 45 2c  .TCC4TCL_DEFINE,
07e0: 20 54 43 43 34 54 43 4c 5f 47 45 54 5f 53 59 4d   TCC4TCL_GET_SYM
07f0: 42 4f 4c 2c 20 54 43 43 34 54 43 4c 5f 4f 55 54  BOL, TCC4TCL_OUT
0800: 50 55 54 5f 46 49 4c 45 2c 20 54 43 43 34 54 43  PUT_FILE, TCC4TC
0810: 4c 5f 55 4e 44 45 46 49 4e 45 0a 09 7d 3b 0a 09  L_UNDEFINE..};..
0820: 63 68 61 72 20 2a 73 74 72 3b 0a 0a 09 74 73 20  char *str;...ts 
0830: 3d 20 28 73 74 72 75 63 74 20 54 63 6c 54 43 43  = (struct TclTCC
0840: 53 74 61 74 65 20 2a 29 20 63 64 61 74 61 3b 0a  State *) cdata;.
0850: 09 73 20 3d 20 74 73 2d 3e 73 3b 0a 0a 20 20 20  .s = ts->s;..   
0860: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b   if (objc < 2) {
0870: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
0880: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
0890: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63  , 1, objv, "subc
08a0: 6f 6d 6d 61 6e 64 20 61 72 67 20 3f 61 72 67 20  ommand arg ?arg 
08b0: 2e 2e 2e 3f 22 29 3b 0a 20 20 20 20 20 20 20 20  ...?");.        
08c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
08d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
08e0: 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f  (Tcl_GetIndexFro
08f0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
0900: 76 5b 31 5d 2c 20 6f 70 74 69 6f 6e 73 2c 20 22  v[1], options, "
0910: 6f 70 74 69 6f 6e 22 2c 20 30 2c 0a 20 20 20 20  option", 0,.    
0920: 20 20 20 20 20 20 20 20 20 20 20 20 26 69 6e 64              &ind
0930: 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ex) != TCL_OK) {
0940: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0950: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
0960: 0a 20 20 20 20 73 77 69 74 63 68 20 28 69 6e 64  .    switch (ind
0970: 65 78 29 20 7b 0a 20 20 20 20 20 20 20 20 63 61  ex) {.        ca
0980: 73 65 20 54 43 43 34 54 43 4c 5f 41 44 44 5f 49  se TCC4TCL_ADD_I
0990: 4e 43 4c 55 44 45 3a 20 20 20 0a 20 20 20 20 20  NCLUDE:   .     
09a0: 20 20 20 20 20 20 20 69 66 20 28 6f 62 6a 63 20         if (objc 
09b0: 21 3d 20 33 29 20 7b 0a 20 20 20 20 20 20 20 20  != 3) {.        
09c0: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
09d0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
09e0: 20 32 2c 20 6f 62 6a 76 2c 20 22 70 61 74 68 22   2, objv, "path"
09f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
0a00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
0a10: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ROR;.           
0a20: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
0a30: 20 20 20 20 20 20 20 20 20 20 74 63 63 5f 61 64            tcc_ad
0a40: 64 5f 69 6e 63 6c 75 64 65 5f 70 61 74 68 28 73  d_include_path(s
0a50: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
0a60: 6f 62 6a 76 5b 32 5d 29 29 3b 0a 20 20 20 20 20  objv[2]));.     
0a70: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
0a80: 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20  n TCL_OK;.      
0a90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0aa0: 63 61 73 65 20 54 43 43 34 54 43 4c 5f 41 44 44  case TCC4TCL_ADD
0ab0: 5f 46 49 4c 45 3a 20 20 20 0a 20 20 20 20 20 20  _FILE:   .      
0ac0: 20 20 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21        if (objc !
0ad0: 3d 20 33 29 20 7b 0a 20 20 20 20 20 20 20 20 20  = 3) {.         
0ae0: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
0af0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
0b00: 32 2c 20 6f 62 6a 76 2c 20 22 66 69 6c 65 6e 61  2, objv, "filena
0b10: 6d 65 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me");.          
0b20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
0b30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
0b40: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
0b60: 74 63 63 5f 61 64 64 5f 66 69 6c 65 28 73 2c 20  tcc_add_file(s, 
0b70: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
0b80: 6a 76 5b 32 5d 29 29 21 3d 30 29 20 7b 0a 20 20  jv[2]))!=0) {.  
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
0bb0: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OR;.            
0bc0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
0c10: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 43 43          case TCC
0c20: 34 54 43 4c 5f 41 44 44 5f 4c 49 42 52 41 52 59  4TCL_ADD_LIBRARY
0c30: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  :.            if
0c40: 20 28 6f 62 6a 63 20 21 3d 20 33 29 20 7b 0a 20   (objc != 3) {. 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
0c60: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
0c70: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
0c80: 20 22 6c 69 62 22 29 3b 0a 20 20 20 20 20 20 20   "lib");.       
0c90: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0ca0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
0cb0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 74 63 63 5f 61 64 64 5f 6c 69 62 72 61 72 79 28  tcc_add_library(
0ce0: 73 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  s, Tcl_GetString
0cf0: 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a 20 20 20 20  (objv[2]));.    
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
0d10: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20  rn TCL_OK;.     
0d20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
0d30: 20 63 61 73 65 20 54 43 43 34 54 43 4c 5f 41 44   case TCC4TCL_AD
0d40: 44 5f 4c 49 42 52 41 52 59 5f 50 41 54 48 3a 0a  D_LIBRARY_PATH:.
0d50: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
0d60: 6f 62 6a 63 20 21 3d 20 33 29 20 7b 0a 20 20 20  objc != 3) {.   
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
0d80: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
0d90: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
0da0: 70 61 74 68 22 29 3b 0a 20 20 20 20 20 20 20 20  path");.        
0db0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
0dc0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
0dd0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
0df0: 63 63 5f 61 64 64 5f 6c 69 62 72 61 72 79 5f 70  cc_add_library_p
0e00: 61 74 68 28 73 2c 20 54 63 6c 5f 47 65 74 53 74  ath(s, Tcl_GetSt
0e10: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a  ring(objv[2]));.
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
0e40: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0e50: 20 20 20 20 20 63 61 73 65 20 54 43 43 34 54 43       case TCC4TC
0e60: 4c 5f 41 44 44 5f 53 59 4d 42 4f 4c 3a 0a 20 20  L_ADD_SYMBOL:.  
0e70: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6f 62            if (ob
0e80: 6a 63 20 21 3d 20 34 29 20 7b 0a 20 20 20 20 20  jc != 4) {.     
0e90: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57             Tcl_W
0ea0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
0eb0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73 79  rp, 2, objv, "sy
0ec0: 6d 62 6f 6c 20 76 61 6c 75 65 22 29 3b 0a 20 20  mbol value");.  
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
0ee0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
0f00: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
0f10: 65 74 4c 6f 6e 67 46 72 6f 6d 4f 62 6a 28 69 6e  etLongFromObj(in
0f20: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
0f30: 76 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  val);.          
0f40: 20 20 76 61 6c 5f 70 20 3d 20 28 76 6f 69 64 20    val_p = (void 
0f50: 2a 29 20 76 61 6c 3b 0a 0a 20 20 20 20 20 20 20  *) val;..       
0f60: 20 20 20 20 20 74 63 63 5f 61 64 64 5f 73 79 6d       tcc_add_sym
0f70: 62 6f 6c 28 73 2c 54 63 6c 5f 47 65 74 53 74 72  bol(s,Tcl_GetStr
0f80: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 76 61  ing(objv[2]), va
0f90: 6c 5f 70 29 3b 20 0a 20 20 20 20 20 20 20 20 20  l_p); .         
0fa0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
0fb0: 3b 20 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ; .        case 
0fc0: 54 43 43 34 54 43 4c 5f 43 4f 4d 4d 41 4e 44 3a  TCC4TCL_COMMAND:
0fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
0fe0: 28 6f 62 6a 63 20 21 3d 20 34 29 20 7b 0a 20 20  (objc != 4) {.  
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
1000: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1010: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
1020: 22 74 63 6c 6e 61 6d 65 20 63 6e 61 6d 65 22 29  "tclname cname")
1030: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1040: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1050: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OR;.            
1060: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
1070: 20 28 21 74 73 2d 3e 72 65 6c 6f 63 61 74 65 64   (!ts->relocated
1080: 29 20 7b 20 20 20 20 20 0a 20 20 20 20 20 20 20  ) {     .       
1090: 20 20 20 20 20 20 20 20 20 69 66 28 74 63 63 5f           if(tcc_
10a0: 72 65 6c 6f 63 61 74 65 28 73 2c 20 54 43 43 5f  relocate(s, TCC_
10b0: 52 45 4c 4f 43 41 54 45 5f 41 55 54 4f 29 21 3d  RELOCATE_AUTO)!=
10c0: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0) {.           
10d0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70           Tcl_App
10e0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
10f0: 2c 20 22 72 65 6c 6f 63 61 74 69 6e 67 20 66 61  , "relocating fa
1100: 69 6c 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20  iled", NULL);.  
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1120: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1130: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OR;.            
1140: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1160: 20 74 73 2d 3e 72 65 6c 6f 63 61 74 65 64 3d 31   ts->relocated=1
1170: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1180: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1190: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  }..            v
11a0: 61 6c 5f 70 20 3d 20 74 63 63 5f 67 65 74 5f 73  al_p = tcc_get_s
11b0: 79 6d 62 6f 6c 28 73 2c 20 54 63 6c 5f 47 65 74  ymbol(s, Tcl_Get
11c0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 29  String(objv[3]))
11d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
11e0: 20 28 76 61 6c 5f 70 20 3d 3d 20 4e 55 4c 4c 29   (val_p == NULL)
11f0: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70   {...    Tcl_App
1200: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1210: 2c 20 22 73 79 6d 62 6f 6c 20 27 22 2c 20 54 63  , "symbol '", Tc
1220: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1230: 5b 33 5d 29 2c 22 27 20 6e 6f 74 20 66 6f 75 6e  [3]),"' not foun
1240: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  d", NULL);...   
1250: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1260: 52 3b 0a 09 20 20 20 20 7d 0a 0a 20 20 20 20 20  R;..    }..     
1270: 20 20 20 20 20 20 20 2f 2a 70 72 69 6e 74 66 28         /*printf(
1280: 22 73 79 6d 62 6f 6c 3a 20 25 78 5c 6e 22 2c 76  "symbol: %x\n",v
1290: 61 6c 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20  al); */.        
12a0: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
12b0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
12c0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
12d0: 6a 76 5b 32 5d 29 2c 76 61 6c 5f 70 2c 4e 55 4c  jv[2]),val_p,NUL
12e0: 4c 2c 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  L,NULL);.       
12f0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
1300: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  OK;.        case
1310: 20 54 43 43 34 54 43 4c 5f 43 4f 4d 50 49 4c 45   TCC4TCL_COMPILE
1320: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  :.            if
1330: 28 74 73 2d 3e 72 65 6c 6f 63 61 74 65 64 20 3d  (ts->relocated =
1340: 3d 20 31 29 20 7b 0a 20 20 20 20 20 20 20 20 20  = 1) {.         
1350: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
1360: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1370: 22 63 6f 64 65 20 61 6c 72 65 61 64 79 20 72 65  "code already re
1380: 6c 6f 63 61 74 65 64 2c 20 63 61 6e 6e 6f 74 20  located, cannot 
1390: 63 6f 6d 70 69 6c 65 20 6d 6f 72 65 22 2c 4e 55  compile more",NU
13a0: 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  LL);.           
13b0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
13c0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
13d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
13e0: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 33 29 20   if (objc != 3) 
13f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1400: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1410: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
1420: 6a 76 2c 20 22 63 63 6f 64 65 22 29 3b 0a 20 20  jv, "ccode");.  
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1440: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1450: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
1460: 73 65 20 7b 0a 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1470: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1480: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
1490: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
14a0: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  2]);.           
14b0: 20 20 20 20 20 69 20 3d 20 74 63 63 5f 63 6f 6d       i = tcc_com
14c0: 70 69 6c 65 5f 73 74 72 69 6e 67 28 73 2c 54 63  pile_string(s,Tc
14d0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
14e0: 5b 32 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 20  [2]));.         
14f0: 20 20 20 20 20 20 20 69 66 20 28 69 21 3d 30 29         if (i!=0)
1500: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1510: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
1520: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
1530: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 66 61 69 6c  compilation fail
1540: 65 64 22 2c 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  ed",NULL);.     
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1560: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1580: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
15a0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
15c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
15d0: 20 20 20 20 20 63 61 73 65 20 54 43 43 34 54 43       case TCC4TC
15e0: 4c 5f 44 45 46 49 4e 45 3a 0a 20 20 20 20 20 20  L_DEFINE:.      
15f0: 20 20 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21        if (objc !
1600: 3d 20 34 29 20 7b 0a 20 20 20 20 20 20 20 20 20  = 4) {.         
1610: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
1620: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1630: 32 2c 20 6f 62 6a 76 2c 20 22 73 79 6d 62 6f 6c  2, objv, "symbol
1640: 20 76 61 6c 75 65 22 29 3b 0a 20 20 20 20 20 20   value");.      
1650: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1660: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
1670: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1680: 20 20 20 20 20 20 74 63 63 5f 64 65 66 69 6e 65        tcc_define
1690: 5f 73 79 6d 62 6f 6c 28 73 2c 54 63 6c 5f 47 65  _symbol(s,Tcl_Ge
16a0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
16b0: 2c 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  ,Tcl_GetString(o
16c0: 62 6a 76 5b 33 5d 29 29 3b 0a 20 20 20 20 20 20  bjv[3]));.      
16d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
16e0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  _OK;.        cas
16f0: 65 20 54 43 43 34 54 43 4c 5f 47 45 54 5f 53 59  e TCC4TCL_GET_SY
1700: 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 20 20 20 20  MBOL:.          
1710: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 33 29    if (objc != 3)
1720: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1730: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1740: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
1750: 62 6a 76 2c 20 22 73 79 6d 62 6f 6c 22 29 3b 0a  bjv, "symbol");.
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1780: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1790: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
17a0: 21 74 73 2d 3e 72 65 6c 6f 63 61 74 65 64 29 20  !ts->relocated) 
17b0: 7b 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20  {     .         
17c0: 20 20 20 20 20 20 20 69 66 28 74 63 63 5f 72 65         if(tcc_re
17d0: 6c 6f 63 61 74 65 28 73 2c 20 54 43 43 5f 52 45  locate(s, TCC_RE
17e0: 4c 4f 43 41 54 45 5f 41 55 54 4f 29 21 3d 30 29  LOCATE_AUTO)!=0)
17f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1800: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
1810: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1820: 22 72 65 6c 6f 63 61 74 69 6e 67 20 66 61 69 6c  "relocating fail
1830: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  ed", NULL);.    
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1860: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1870: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1890: 73 2d 3e 72 65 6c 6f 63 61 74 65 64 3d 31 3b 0a  s->relocated=1;.
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 6c 5f              val_
18d0: 70 20 3d 20 74 63 63 5f 67 65 74 5f 73 79 6d 62  p = tcc_get_symb
18e0: 6f 6c 28 73 2c 54 63 6c 5f 47 65 74 53 74 72 69  ol(s,Tcl_GetStri
18f0: 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a 20 20  ng(objv[2]));.  
1900: 20 20 20 20 20 20 20 20 20 20 69 66 28 76 61 6c            if(val
1910: 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20  _p == NULL) {.  
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
1930: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1940: 6e 74 65 72 70 2c 20 22 73 79 6d 62 6f 6c 20 27  nterp, "symbol '
1950: 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ", Tcl_GetString
1960: 28 6f 62 6a 76 5b 32 5d 29 2c 22 27 20 6e 6f 74  (objv[2]),"' not
1970: 20 66 6f 75 6e 64 22 2c 20 4e 55 4c 4c 29 3b 0a   found", NULL);.
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6d 5f              sym_
19c0: 61 64 64 72 20 3d 20 54 63 6c 5f 4e 65 77 57 69  addr = Tcl_NewWi
19d0: 64 65 49 6e 74 4f 62 6a 28 28 54 63 6c 5f 57 69  deIntObj((Tcl_Wi
19e0: 64 65 49 6e 74 29 20 76 61 6c 5f 70 29 3b 0a 20  deInt) val_p);. 
19f0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53             Tcl_S
1a00: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1a10: 72 70 2c 20 73 79 6d 5f 61 64 64 72 29 3b 0a 20  rp, sym_addr);. 
1a20: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1a30: 6e 20 54 43 4c 5f 4f 4b 3b 20 0a 20 20 20 20 20  n TCL_OK; .     
1a40: 20 20 20 63 61 73 65 20 54 43 43 34 54 43 4c 5f     case TCC4TCL_
1a50: 4f 55 54 50 55 54 5f 46 49 4c 45 3a 0a 20 20 20  OUTPUT_FILE:.   
1a60: 20 20 20 20 20 20 20 20 20 69 66 20 28 6f 62 6a           if (obj
1a70: 63 20 21 3d 20 33 29 20 7b 0a 20 20 20 20 20 20  c != 3) {.      
1a80: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72            Tcl_Wr
1a90: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1aa0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66 69 6c  p, 2, objv, "fil
1ab0: 65 6e 61 6d 65 22 29 3b 0a 20 20 20 20 20 20 20  ename");.       
1ac0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1ad0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
1ae0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1af0: 20 20 20 20 20 69 66 20 28 74 73 2d 3e 72 65 6c       if (ts->rel
1b00: 6f 63 61 74 65 64 29 20 7b 20 20 20 20 20 0a 20  ocated) {     . 
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
1b20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1b30: 69 6e 74 65 72 70 2c 20 22 63 6f 64 65 20 61 6c  interp, "code al
1b40: 72 65 61 64 79 20 72 65 6c 6f 63 61 74 65 64 2c  ready relocated,
1b50: 20 63 61 6e 6e 6f 74 20 6f 75 74 70 75 74 20 74   cannot output t
1b60: 6f 20 66 69 6c 65 22 2c 20 4e 55 4c 4c 29 3b 0a  o file", NULL);.
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
1bb0: 73 2d 3e 6f 75 74 70 75 74 5f 74 79 70 65 20 3d  s->output_type =
1bc0: 3d 20 54 43 43 5f 4f 55 54 50 55 54 5f 4d 45 4d  = TCC_OUTPUT_MEM
1bd0: 4f 52 59 29 20 7b 20 20 20 20 20 0a 20 20 20 20  ORY) {     .    
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
1bf0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1c00: 65 72 70 2c 20 22 6f 75 74 70 75 74 5f 74 79 70  erp, "output_typ
1c10: 65 20 6d 65 6d 6f 72 79 20 6e 6f 74 20 76 61 6c  e memory not val
1c20: 69 64 20 66 6f 72 20 6f 75 74 70 75 74 20 74 6f  id for output to
1c30: 20 66 69 6c 65 22 2c 20 4e 55 4c 4c 29 3b 0a 20   file", NULL);. 
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1c50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1c70: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d             res =
1c80: 20 74 63 63 5f 6f 75 74 70 75 74 5f 66 69 6c 65   tcc_output_file
1c90: 28 73 2c 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  (s,Tcl_GetString
1ca0: 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a 0a 20 20 20  (objv[2]));..   
1cb0: 20 20 20 20 20 20 20 20 20 69 66 20 28 72 65 73           if (res
1cc0: 21 3d 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20  !=0) {.         
1cd0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
1ce0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1cf0: 22 6f 75 74 70 75 74 20 74 6f 20 66 69 6c 65 20  "output to file 
1d00: 66 61 69 6c 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  failed", NULL);.
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ;.            } 
1d40: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
1d50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
1d60: 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  L_OK;.          
1d70: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
1d80: 20 54 43 43 34 54 43 4c 5f 55 4e 44 45 46 49 4e   TCC4TCL_UNDEFIN
1d90: 45 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  E:.            i
1da0: 66 20 28 6f 62 6a 63 20 21 3d 20 33 29 20 7b 0a  f (objc != 3) {.
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1dd0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
1de0: 2c 20 22 73 79 6d 62 6f 6c 22 29 3b 0a 20 20 20  , "symbol");.   
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1e00: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e10: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1e20: 20 20 20 20 20 20 20 20 20 74 63 63 5f 75 6e 64           tcc_und
1e30: 65 66 69 6e 65 5f 73 79 6d 62 6f 6c 28 73 2c 54  efine_symbol(s,T
1e40: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1e50: 76 5b 32 5d 29 29 3b 0a 20 20 20 20 20 20 20 20  v[2]));.        
1e60: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
1e70: 4b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75  K;.        defau
1e80: 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt:.            
1e90: 54 63 6c 5f 50 61 6e 69 63 28 22 69 6e 74 65 72  Tcl_Panic("inter
1ea0: 6e 61 6c 20 65 72 72 6f 72 20 64 75 72 69 6e 67  nal error during
1eb0: 20 6f 70 74 69 6f 6e 20 6c 6f 6f 6b 75 70 22 29   option lookup")
1ec0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1ed0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 20 0a 0a 73  rn TCL_OK;.} ..s
1ee0: 74 61 74 69 63 20 69 6e 74 20 54 63 63 34 74 63  tatic int Tcc4tc
1ef0: 6c 43 72 65 61 74 65 43 6d 64 28 20 43 6c 69 65  lCreateCmd( Clie
1f00: 6e 74 44 61 74 61 20 63 64 61 74 61 2c 20 54 63  ntData cdata, Tc
1f10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1f20: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
1f30: 4f 62 6a 20 2a 20 43 4f 4e 53 54 20 6f 62 6a 76  Obj * CONST objv
1f40: 5b 5d 29 7b 0a 09 73 74 72 75 63 74 20 54 63 6c  []){..struct Tcl
1f50: 54 43 43 53 74 61 74 65 20 2a 74 73 3b 0a 09 54  TCCState *ts;..T
1f60: 43 43 53 74 61 74 65 20 2a 73 3b 0a 20 20 20 20  CCState *s;.    
1f70: 09 69 6e 74 20 69 6e 64 65 78 3b 0a 09 73 74 61  .int index;..sta
1f80: 74 69 63 20 43 4f 4e 53 54 20 63 68 61 72 20 2a  tic CONST char *
1f90: 74 79 70 65 73 5b 5d 20 3d 20 7b 0a 09 09 22 6d  types[] = {..."m
1fa0: 65 6d 6f 72 79 22 2c 20 22 65 78 65 22 2c 20 22  emory", "exe", "
1fb0: 64 6c 6c 22 2c 20 22 6f 62 6a 22 2c 20 22 70 72  dll", "obj", "pr
1fc0: 65 70 72 6f 63 65 73 73 22 2c 20 20 20 20 28 63  eprocess",    (c
1fd0: 68 61 72 20 2a 29 20 4e 55 4c 4c 0a 09 7d 3b 0a  har *) NULL..};.
1fe0: 0a 09 69 66 20 28 6f 62 6a 63 20 3c 20 33 20 7c  ..if (objc < 3 |
1ff0: 7c 20 6f 62 6a 63 20 3e 20 34 29 20 7b 0a 09 09  | objc > 4) {...
2000: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2010: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2020: 2c 20 22 74 63 63 5f 6c 69 62 61 72 79 5f 70 61  , "tcc_libary_pa
2030: 74 68 20 3f 6f 75 74 70 75 74 5f 74 79 70 65 3f  th ?output_type?
2040: 20 68 61 6e 64 6c 65 22 29 3b 0a 09 09 72 65 74   handle");...ret
2050: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
2060: 7d 0a 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20  }...if (objc == 
2070: 33 29 20 7b 0a 09 09 69 6e 64 65 78 20 3d 20 54  3) {...index = T
2080: 43 43 5f 4f 55 54 50 55 54 5f 4d 45 4d 4f 52 59  CC_OUTPUT_MEMORY
2090: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  ;..} else {...if
20a0: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
20b0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
20c0: 6a 76 5b 32 5d 2c 20 74 79 70 65 73 2c 20 22 74  jv[2], types, "t
20d0: 79 70 65 22 2c 20 30 2c 20 26 69 6e 64 65 78 29  ype", 0, &index)
20e0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   != TCL_OK) {...
20f0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
2100: 52 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 73 20 3d 20  R;...}..}...s = 
2110: 74 63 63 5f 6e 65 77 28 54 63 6c 5f 47 65 74 53  tcc_new(Tcl_GetS
2120: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b  tring(objv[1]));
2130: 0a 09 69 66 20 28 73 20 3d 3d 20 4e 55 4c 4c 29  ..if (s == NULL)
2140: 20 7b 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f   {...return(TCL_
2150: 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 23 69 66 64  ERROR);..}..#ifd
2160: 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
2170: 0a 09 74 63 63 5f 61 64 64 5f 73 79 6d 62 6f 6c  ..tcc_add_symbol
2180: 28 73 2c 20 22 74 63 6c 53 74 75 62 73 50 74 72  (s, "tclStubsPtr
2190: 22 2c 20 26 74 63 6c 53 74 75 62 73 50 74 72 29  ", &tclStubsPtr)
21a0: 3b 0a 09 74 63 63 5f 64 65 66 69 6e 65 5f 73 79  ;..tcc_define_sy
21b0: 6d 62 6f 6c 28 73 2c 20 22 55 53 45 5f 54 43 4c  mbol(s, "USE_TCL
21c0: 5f 53 54 55 42 53 22 2c 20 22 31 22 29 3b 0a 23  _STUBS", "1");.#
21d0: 65 6e 64 69 66 0a 0a 09 74 63 63 5f 73 65 74 5f  endif...tcc_set_
21e0: 65 72 72 6f 72 5f 66 75 6e 63 28 73 2c 20 69 6e  error_func(s, in
21f0: 74 65 72 70 2c 20 28 76 6f 69 64 20 2a 29 26 54  terp, (void *)&T
2200: 63 63 34 74 63 6c 45 72 72 6f 72 46 75 6e 63 29  cc4tclErrorFunc)
2210: 3b 0a 0a 09 74 73 20 3d 20 28 76 6f 69 64 20 2a  ;...ts = (void *
2220: 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  ) ckalloc(sizeof
2230: 28 2a 74 73 29 29 3b 0a 09 74 73 2d 3e 73 20 3d  (*ts));..ts->s =
2240: 20 73 3b 0a 20 20 20 20 09 74 73 2d 3e 72 65 6c   s;.    .ts->rel
2250: 6f 63 61 74 65 64 20 3d 20 30 3b 0a 0a 09 2f 2a  ocated = 0;.../*
2260: 70 72 69 6e 74 66 28 22 74 79 70 65 3a 20 25 64  printf("type: %d
2270: 5c 6e 22 2c 20 69 6e 64 65 78 29 3b 20 2a 2f 0a  \n", index); */.
2280: 09 74 63 63 5f 73 65 74 5f 6f 75 74 70 75 74 5f  .tcc_set_output_
2290: 74 79 70 65 28 73 2c 69 6e 64 65 78 29 3b 0a 09  type(s,index);..
22a0: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
22b0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 54 63 6c 5f  mand(interp,Tcl_
22c0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f  GetString(objv[o
22d0: 62 6a 63 2d 31 5d 29 2c 54 63 63 34 74 63 6c 48  bjc-1]),Tcc4tclH
22e0: 61 6e 64 6c 65 43 6d 64 2c 74 73 2c 54 63 63 34  andleCmd,ts,Tcc4
22f0: 74 63 6c 43 43 6f 6d 6d 61 6e 64 44 65 6c 65 74  tclCCommandDelet
2300: 65 50 72 6f 63 29 3b 0a 0a 09 54 63 6c 5f 53 65  eProc);...Tcl_Se
2310: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
2320: 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 29  p, objv[objc-1])
2330: 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;...return TCL_O
2340: 4b 3b 0a 7d 0a 0a 69 6e 74 20 54 63 63 34 74 63  K;.}..int Tcc4tc
2350: 6c 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  l_Init(Tcl_Inter
2360: 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 23 69 66  p *interp) {.#if
2370: 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42  def USE_TCL_STUB
2380: 53 0a 09 69 66 20 28 54 63 6c 5f 49 6e 69 74 53  S..if (Tcl_InitS
2390: 74 75 62 73 28 69 6e 74 65 72 70 2c 20 54 43 4c  tubs(interp, TCL
23a0: 5f 56 45 52 53 49 4f 4e 20 2c 20 30 29 20 3d 3d  _VERSION , 0) ==
23b0: 20 30 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 20   0L) {...return 
23c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 23 65  TCL_ERROR;..}.#e
23d0: 6e 64 69 66 0a 0a 09 54 63 6c 5f 43 72 65 61 74  ndif...Tcl_Creat
23e0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
23f0: 72 70 2c 20 22 74 63 63 34 74 63 6c 22 2c 20 54  rp, "tcc4tcl", T
2400: 63 63 34 74 63 6c 43 72 65 61 74 65 43 6d 64 2c  cc4tclCreateCmd,
2410: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09   NULL, NULL);...
2420: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2430: 0a                                               .