/ Hex Artifact Content
Login

Artifact 2070e086f39866b353a482d3a14dedaf26196506:


0000: 2f 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. * ----------
0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0050: 2d 2d 0a 20 2a 20 6e 6d 61 6b 65 68 6c 70 2e 63  --. * nmakehlp.c
0060: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69   --. *. *.This i
0070: 73 20 75 73 65 64 20 74 6f 20 66 69 78 20 6c 69  s used to fix li
0080: 6d 69 74 61 74 69 6f 6e 73 20 77 69 74 68 69 6e  mitations within
0090: 20 6e 6d 61 6b 65 20 61 6e 64 20 74 68 65 20 65   nmake and the e
00a0: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 0a 20 2a 0a 20  nvironment.. *. 
00b0: 2a 20 43 6f 70 79 72 69 67 68 74 20 28 63 29 20  * Copyright (c) 
00c0: 32 30 30 32 20 62 79 20 44 61 76 69 64 20 47 72  2002 by David Gr
00d0: 61 76 65 72 65 61 75 78 2e 0a 20 2a 20 43 6f 70  avereaux.. * Cop
00e0: 79 72 69 67 68 74 20 28 63 29 20 32 30 30 36 20  yright (c) 2006 
00f0: 62 79 20 50 61 74 20 54 68 6f 79 74 73 0a 20 2a  by Pat Thoyts. *
0100: 0a 20 2a 20 53 65 65 20 74 68 65 20 66 69 6c 65  . * See the file
0110: 20 22 6c 69 63 65 6e 73 65 2e 74 65 72 6d 73 22   "license.terms"
0120: 20 66 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   for information
0130: 20 6f 6e 20 75 73 61 67 65 20 61 6e 64 20 72 65   on usage and re
0140: 64 69 73 74 72 69 62 75 74 69 6f 6e 20 6f 66 0a  distribution of.
0150: 20 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e   * this file, an
0160: 64 20 66 6f 72 20 61 20 44 49 53 43 4c 41 49 4d  d for a DISCLAIM
0170: 45 52 20 4f 46 20 41 4c 4c 20 57 41 52 52 41 4e  ER OF ALL WARRAN
0180: 54 49 45 53 2e 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d  TIES.. * -------
0190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01d0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 64 65 66 69  -----. */..#defi
01e0: 6e 65 20 5f 43 52 54 5f 53 45 43 55 52 45 5f 4e  ne _CRT_SECURE_N
01f0: 4f 5f 44 45 50 52 45 43 41 54 45 0a 23 69 6e 63  O_DEPRECATE.#inc
0200: 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e  lude <windows.h>
0210: 0a 23 64 65 66 69 6e 65 20 4e 4f 5f 53 48 4c 57  .#define NO_SHLW
0220: 41 50 49 5f 47 44 49 0a 23 64 65 66 69 6e 65 20  API_GDI.#define 
0230: 4e 4f 5f 53 48 4c 57 41 50 49 5f 53 54 52 45 41  NO_SHLWAPI_STREA
0240: 4d 0a 23 64 65 66 69 6e 65 20 4e 4f 5f 53 48 4c  M.#define NO_SHL
0250: 57 41 50 49 5f 52 45 47 0a 23 69 6e 63 6c 75 64  WAPI_REG.#includ
0260: 65 20 3c 73 68 6c 77 61 70 69 2e 68 3e 0a 23 70  e <shlwapi.h>.#p
0270: 72 61 67 6d 61 20 63 6f 6d 6d 65 6e 74 20 28 6c  ragma comment (l
0280: 69 62 2c 20 22 75 73 65 72 33 32 2e 6c 69 62 22  ib, "user32.lib"
0290: 29 0a 23 70 72 61 67 6d 61 20 63 6f 6d 6d 65 6e  ).#pragma commen
02a0: 74 20 28 6c 69 62 2c 20 22 6b 65 72 6e 65 6c 33  t (lib, "kernel3
02b0: 32 2e 6c 69 62 22 29 0a 23 70 72 61 67 6d 61 20  2.lib").#pragma 
02c0: 63 6f 6d 6d 65 6e 74 20 28 6c 69 62 2c 20 22 73  comment (lib, "s
02d0: 68 6c 77 61 70 69 2e 6c 69 62 22 29 0a 23 69 6e  hlwapi.lib").#in
02e0: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
02f0: 23 69 6e 63 6c 75 64 65 20 3c 6d 61 74 68 2e 68  #include <math.h
0300: 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 6c 69  >../*. * This li
0310: 62 72 61 72 79 20 69 73 20 72 65 71 75 69 72 65  brary is require
0320: 64 20 66 6f 72 20 78 36 34 20 62 75 69 6c 64 73  d for x64 builds
0330: 20 77 69 74 68 20 5f 73 6f 6d 65 5f 20 76 65 72   with _some_ ver
0340: 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 0a 20 2a  sions of MSVC. *
0350: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d  /.#if defined(_M
0360: 5f 49 41 36 34 29 20 7c 7c 20 64 65 66 69 6e 65  _IA64) || define
0370: 64 28 5f 4d 5f 41 4d 44 36 34 29 0a 23 69 66 20  d(_M_AMD64).#if 
0380: 5f 4d 53 43 5f 56 45 52 20 3e 3d 20 31 34 30 30  _MSC_VER >= 1400
0390: 20 26 26 20 5f 4d 53 43 5f 56 45 52 20 3c 20 31   && _MSC_VER < 1
03a0: 35 30 30 0a 23 70 72 61 67 6d 61 20 63 6f 6d 6d  500.#pragma comm
03b0: 65 6e 74 28 6c 69 62 2c 20 22 62 75 66 66 65 72  ent(lib, "buffer
03c0: 6f 76 65 72 66 6c 6f 77 55 22 29 0a 23 65 6e 64  overflowU").#end
03d0: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49 53  if.#endif../* IS
03e0: 4f 20 68 61 63 6b 20 66 6f 72 20 64 75 6d 62 20  O hack for dumb 
03f0: 56 43 2b 2b 20 2a 2f 0a 23 69 66 64 65 66 20 5f  VC++ */.#ifdef _
0400: 4d 53 43 5f 56 45 52 0a 23 64 65 66 69 6e 65 20  MSC_VER.#define 
0410: 20 20 73 6e 70 72 69 6e 74 66 09 5f 73 6e 70 72    snprintf._snpr
0420: 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  intf.#endif..../
0430: 2a 20 70 72 6f 74 6f 73 20 2a 2f 0a 0a 73 74 61  * protos */..sta
0440: 74 69 63 20 69 6e 74 20 43 68 65 63 6b 46 6f 72  tic int CheckFor
0450: 43 6f 6d 70 69 6c 65 72 46 65 61 74 75 72 65 28  CompilerFeature(
0460: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69  const char *opti
0470: 6f 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  on);.static int 
0480: 43 68 65 63 6b 46 6f 72 4c 69 6e 6b 65 72 46 65  CheckForLinkerFe
0490: 61 74 75 72 65 28 63 6f 6e 73 74 20 63 68 61 72  ature(const char
04a0: 20 2a 6f 70 74 69 6f 6e 29 3b 0a 73 74 61 74 69   *option);.stati
04b0: 63 20 69 6e 74 20 49 73 49 6e 28 63 6f 6e 73 74  c int IsIn(const
04c0: 20 63 68 61 72 20 2a 73 74 72 69 6e 67 2c 20 63   char *string, c
04d0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 62 73 74  onst char *subst
04e0: 72 69 6e 67 29 3b 0a 73 74 61 74 69 63 20 69 6e  ring);.static in
04f0: 74 20 53 75 62 73 74 69 74 75 74 65 46 69 6c 65  t SubstituteFile
0500: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 62  (const char *sub
0510: 73 74 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  sts, const char 
0520: 2a 66 69 6c 65 6e 61 6d 65 29 3b 0a 73 74 61 74  *filename);.stat
0530: 69 63 20 69 6e 74 20 51 75 61 6c 69 66 79 50 61  ic int QualifyPa
0540: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  th(const char *p
0550: 61 74 68 29 3b 0a 73 74 61 74 69 63 20 63 6f 6e  ath);.static con
0560: 73 74 20 63 68 61 72 20 2a 47 65 74 56 65 72 73  st char *GetVers
0570: 69 6f 6e 46 72 6f 6d 46 69 6c 65 28 63 6f 6e 73  ionFromFile(cons
0580: 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65  t char *filename
0590: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 61  , const char *ma
05a0: 74 63 68 29 3b 0a 73 74 61 74 69 63 20 44 57 4f  tch);.static DWO
05b0: 52 44 20 57 49 4e 41 50 49 20 52 65 61 64 46 72  RD WINAPI ReadFr
05c0: 6f 6d 50 69 70 65 28 4c 50 56 4f 49 44 20 61 72  omPipe(LPVOID ar
05d0: 67 73 29 3b 0a 0a 2f 2a 20 67 6c 6f 62 61 6c 73  gs);../* globals
05e0: 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 43 48 55   */..#define CHU
05f0: 4e 4b 09 32 35 0a 23 64 65 66 69 6e 65 20 53 54  NK.25.#define ST
0600: 41 54 49 43 42 55 46 46 45 52 53 49 5a 45 20 20  ATICBUFFERSIZE  
0610: 20 20 31 30 30 30 0a 74 79 70 65 64 65 66 20 73    1000.typedef s
0620: 74 72 75 63 74 20 7b 0a 20 20 20 20 48 41 4e 44  truct {.    HAND
0630: 4c 45 20 70 69 70 65 3b 0a 20 20 20 20 63 68 61  LE pipe;.    cha
0640: 72 20 62 75 66 66 65 72 5b 53 54 41 54 49 43 42  r buffer[STATICB
0650: 55 46 46 45 52 53 49 5a 45 5d 3b 0a 7d 20 70 69  UFFERSIZE];.} pi
0660: 70 65 69 6e 66 6f 3b 0a 0a 70 69 70 65 69 6e 66  peinfo;..pipeinf
0670: 6f 20 4f 75 74 20 3d 20 7b 49 4e 56 41 4c 49 44  o Out = {INVALID
0680: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 27  _HANDLE_VALUE, '
0690: 5c 30 27 7d 3b 0a 70 69 70 65 69 6e 66 6f 20 45  \0'};.pipeinfo E
06a0: 72 72 20 3d 20 7b 49 4e 56 41 4c 49 44 5f 48 41  rr = {INVALID_HA
06b0: 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 27 5c 30 27  NDLE_VALUE, '\0'
06c0: 7d 3b 0a 0c 0a 2f 2a 0a 20 2a 20 65 78 69 74 63  };.../*. * exitc
06d0: 6f 64 65 73 3a 20 30 20 3d 3d 20 6e 6f 2c 20 31  odes: 0 == no, 1
06e0: 20 3d 3d 20 79 65 73 2c 20 32 20 3d 3d 20 65 72   == yes, 2 == er
06f0: 72 6f 72 0a 20 2a 2f 0a 0a 69 6e 74 0a 6d 61 69  ror. */..int.mai
0700: 6e 28 0a 20 20 20 20 69 6e 74 20 61 72 67 63 2c  n(.    int argc,
0710: 0a 20 20 20 20 63 68 61 72 20 2a 61 72 67 76 5b  .    char *argv[
0720: 5d 29 0a 7b 0a 20 20 20 20 63 68 61 72 20 6d 73  ]).{.    char ms
0730: 67 5b 33 30 30 5d 3b 0a 20 20 20 20 44 57 4f 52  g[300];.    DWOR
0740: 44 20 64 77 57 72 69 74 74 65 6e 3b 0a 20 20 20  D dwWritten;.   
0750: 20 69 6e 74 20 63 68 61 72 73 3b 0a 0a 20 20 20   int chars;..   
0760: 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20   /*.     * Make 
0770: 73 75 72 65 20 63 68 69 6c 64 72 65 6e 20 28 63  sure children (c
0780: 6c 2e 65 78 65 20 61 6e 64 20 6c 69 6e 6b 2e 65  l.exe and link.e
0790: 78 65 29 20 61 72 65 20 6b 65 70 74 20 71 75 69  xe) are kept qui
07a0: 65 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  et..     */..   
07b0: 20 53 65 74 45 72 72 6f 72 4d 6f 64 65 28 53 45   SetErrorMode(SE
07c0: 4d 5f 46 41 49 4c 43 52 49 54 49 43 41 4c 45 52  M_FAILCRITICALER
07d0: 52 4f 52 53 20 7c 20 53 45 4d 5f 4e 4f 4f 50 45  RORS | SEM_NOOPE
07e0: 4e 46 49 4c 45 45 52 52 4f 52 42 4f 58 29 3b 0a  NFILEERRORBOX);.
07f0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d  .    /*.     * M
0800: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6d  ake sure the com
0810: 70 69 6c 65 72 20 61 6e 64 20 6c 69 6e 6b 65 72  piler and linker
0820: 20 61 72 65 6e 27 74 20 65 66 66 65 63 74 65 64   aren't effected
0830: 20 62 79 20 74 68 65 20 6f 75 74 73 69 64 65 20   by the outside 
0840: 77 6f 72 6c 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a  world..     */..
0850: 20 20 20 20 53 65 74 45 6e 76 69 72 6f 6e 6d 65      SetEnvironme
0860: 6e 74 56 61 72 69 61 62 6c 65 28 22 43 4c 22 2c  ntVariable("CL",
0870: 20 22 22 29 3b 0a 20 20 20 20 53 65 74 45 6e 76   "");.    SetEnv
0880: 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
0890: 28 22 4c 49 4e 4b 22 2c 20 22 22 29 3b 0a 0a 20  ("LINK", "");.. 
08a0: 20 20 20 69 66 20 28 61 72 67 63 20 3e 20 31 20     if (argc > 1 
08b0: 26 26 20 2a 61 72 67 76 5b 31 5d 20 3d 3d 20 27  && *argv[1] == '
08c0: 2d 27 29 20 7b 0a 09 73 77 69 74 63 68 20 28 2a  -') {..switch (*
08d0: 28 61 72 67 76 5b 31 5d 2b 31 29 29 20 7b 0a 09  (argv[1]+1)) {..
08e0: 63 61 73 65 20 27 63 27 3a 0a 09 20 20 20 20 69  case 'c':..    i
08f0: 66 20 28 61 72 67 63 20 21 3d 20 33 29 20 7b 0a  f (argc != 3) {.
0900: 09 09 63 68 61 72 73 20 3d 20 73 6e 70 72 69 6e  ..chars = snprin
0910: 74 66 28 6d 73 67 2c 20 73 69 7a 65 6f 66 28 6d  tf(msg, sizeof(m
0920: 73 67 29 20 2d 20 31 2c 0a 09 09 20 20 20 20 20  sg) - 1,...     
0930: 20 20 20 22 75 73 61 67 65 3a 20 25 73 20 2d 63     "usage: %s -c
0940: 20 3c 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f   <compiler optio
0950: 6e 3e 5c 6e 22 0a 09 09 09 22 54 65 73 74 73 20  n>\n"...."Tests 
0960: 66 6f 72 20 77 68 65 74 68 65 72 20 63 6c 2e 65  for whether cl.e
0970: 78 65 20 73 75 70 70 6f 72 74 73 20 61 6e 20 6f  xe supports an o
0980: 70 74 69 6f 6e 5c 6e 22 0a 09 09 09 22 65 78 69  ption\n"...."exi
0990: 74 63 6f 64 65 73 3a 20 30 20 3d 3d 20 6e 6f 2c  tcodes: 0 == no,
09a0: 20 31 20 3d 3d 20 79 65 73 2c 20 32 20 3d 3d 20   1 == yes, 2 == 
09b0: 65 72 72 6f 72 5c 6e 22 2c 20 61 72 67 76 5b 30  error\n", argv[0
09c0: 5d 29 3b 0a 09 09 57 72 69 74 65 46 69 6c 65 28  ]);...WriteFile(
09d0: 47 65 74 53 74 64 48 61 6e 64 6c 65 28 53 54 44  GetStdHandle(STD
09e0: 5f 45 52 52 4f 52 5f 48 41 4e 44 4c 45 29 2c 20  _ERROR_HANDLE), 
09f0: 6d 73 67 2c 20 63 68 61 72 73 2c 0a 09 09 09 26  msg, chars,....&
0a00: 64 77 57 72 69 74 74 65 6e 2c 20 4e 55 4c 4c 29  dwWritten, NULL)
0a10: 3b 0a 09 09 72 65 74 75 72 6e 20 32 3b 0a 09 20  ;...return 2;.. 
0a20: 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75 72 6e     }..    return
0a30: 20 43 68 65 63 6b 46 6f 72 43 6f 6d 70 69 6c 65   CheckForCompile
0a40: 72 46 65 61 74 75 72 65 28 61 72 67 76 5b 32 5d  rFeature(argv[2]
0a50: 29 3b 0a 09 63 61 73 65 20 27 6c 27 3a 0a 09 20  );..case 'l':.. 
0a60: 20 20 20 69 66 20 28 61 72 67 63 20 21 3d 20 33     if (argc != 3
0a70: 29 20 7b 0a 09 09 63 68 61 72 73 20 3d 20 73 6e  ) {...chars = sn
0a80: 70 72 69 6e 74 66 28 6d 73 67 2c 20 73 69 7a 65  printf(msg, size
0a90: 6f 66 28 6d 73 67 29 20 2d 20 31 2c 0a 09 20 20  of(msg) - 1,..  
0aa0: 20 20 20 20 20 09 09 22 75 73 61 67 65 3a 20 25       .."usage: %
0ab0: 73 20 2d 6c 20 3c 6c 69 6e 6b 65 72 20 6f 70 74  s -l <linker opt
0ac0: 69 6f 6e 3e 5c 6e 22 0a 09 09 09 22 54 65 73 74  ion>\n"...."Test
0ad0: 73 20 66 6f 72 20 77 68 65 74 68 65 72 20 6c 69  s for whether li
0ae0: 6e 6b 2e 65 78 65 20 73 75 70 70 6f 72 74 73 20  nk.exe supports 
0af0: 61 6e 20 6f 70 74 69 6f 6e 5c 6e 22 0a 09 09 09  an option\n"....
0b00: 22 65 78 69 74 63 6f 64 65 73 3a 20 30 20 3d 3d  "exitcodes: 0 ==
0b10: 20 6e 6f 2c 20 31 20 3d 3d 20 79 65 73 2c 20 32   no, 1 == yes, 2
0b20: 20 3d 3d 20 65 72 72 6f 72 5c 6e 22 2c 20 61 72   == error\n", ar
0b30: 67 76 5b 30 5d 29 3b 0a 09 09 57 72 69 74 65 46  gv[0]);...WriteF
0b40: 69 6c 65 28 47 65 74 53 74 64 48 61 6e 64 6c 65  ile(GetStdHandle
0b50: 28 53 54 44 5f 45 52 52 4f 52 5f 48 41 4e 44 4c  (STD_ERROR_HANDL
0b60: 45 29 2c 20 6d 73 67 2c 20 63 68 61 72 73 2c 0a  E), msg, chars,.
0b70: 09 09 09 26 64 77 57 72 69 74 74 65 6e 2c 20 4e  ...&dwWritten, N
0b80: 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 32  ULL);...return 2
0b90: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 72 65  ;..    }..    re
0ba0: 74 75 72 6e 20 43 68 65 63 6b 46 6f 72 4c 69 6e  turn CheckForLin
0bb0: 6b 65 72 46 65 61 74 75 72 65 28 61 72 67 76 5b  kerFeature(argv[
0bc0: 32 5d 29 3b 0a 09 63 61 73 65 20 27 66 27 3a 0a  2]);..case 'f':.
0bd0: 09 20 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d  .    if (argc ==
0be0: 20 32 29 20 7b 0a 09 09 63 68 61 72 73 20 3d 20   2) {...chars = 
0bf0: 73 6e 70 72 69 6e 74 66 28 6d 73 67 2c 20 73 69  snprintf(msg, si
0c00: 7a 65 6f 66 28 6d 73 67 29 20 2d 20 31 2c 0a 09  zeof(msg) - 1,..
0c10: 09 09 22 75 73 61 67 65 3a 20 25 73 20 2d 66 20  .."usage: %s -f 
0c20: 3c 73 74 72 69 6e 67 3e 20 3c 73 75 62 73 74 72  <string> <substr
0c30: 69 6e 67 3e 5c 6e 22 0a 09 09 09 22 46 69 6e 64  ing>\n"...."Find
0c40: 20 61 20 73 75 62 73 74 72 69 6e 67 20 77 69 74   a substring wit
0c50: 68 69 6e 20 61 6e 6f 74 68 65 72 5c 6e 22 0a 09  hin another\n"..
0c60: 09 09 22 65 78 69 74 63 6f 64 65 73 3a 20 30 20  .."exitcodes: 0 
0c70: 3d 3d 20 6e 6f 2c 20 31 20 3d 3d 20 79 65 73 2c  == no, 1 == yes,
0c80: 20 32 20 3d 3d 20 65 72 72 6f 72 5c 6e 22 2c 20   2 == error\n", 
0c90: 61 72 67 76 5b 30 5d 29 3b 0a 09 09 57 72 69 74  argv[0]);...Writ
0ca0: 65 46 69 6c 65 28 47 65 74 53 74 64 48 61 6e 64  eFile(GetStdHand
0cb0: 6c 65 28 53 54 44 5f 45 52 52 4f 52 5f 48 41 4e  le(STD_ERROR_HAN
0cc0: 44 4c 45 29 2c 20 6d 73 67 2c 20 63 68 61 72 73  DLE), msg, chars
0cd0: 2c 0a 09 09 09 26 64 77 57 72 69 74 74 65 6e 2c  ,....&dwWritten,
0ce0: 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e   NULL);...return
0cf0: 20 32 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20   2;..    } else 
0d00: 69 66 20 28 61 72 67 63 20 3d 3d 20 33 29 20 7b  if (argc == 3) {
0d10: 0a 09 09 2f 2a 0a 09 09 20 2a 20 49 66 20 74 68  .../*... * If th
0d20: 65 20 73 74 72 69 6e 67 20 69 73 20 62 6c 61 6e  e string is blan
0d30: 6b 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  k, there is no m
0d40: 61 74 63 68 2e 0a 09 09 20 2a 2f 0a 0a 09 09 72  atch.... */....r
0d50: 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d 20  eturn 0;..    } 
0d60: 65 6c 73 65 20 7b 0a 09 09 72 65 74 75 72 6e 20  else {...return 
0d70: 49 73 49 6e 28 61 72 67 76 5b 32 5d 2c 20 61 72  IsIn(argv[2], ar
0d80: 67 76 5b 33 5d 29 3b 0a 09 20 20 20 20 7d 0a 09  gv[3]);..    }..
0d90: 63 61 73 65 20 27 73 27 3a 0a 09 20 20 20 20 69  case 's':..    i
0da0: 66 20 28 61 72 67 63 20 3d 3d 20 32 29 20 7b 0a  f (argc == 2) {.
0db0: 09 09 63 68 61 72 73 20 3d 20 73 6e 70 72 69 6e  ..chars = snprin
0dc0: 74 66 28 6d 73 67 2c 20 73 69 7a 65 6f 66 28 6d  tf(msg, sizeof(m
0dd0: 73 67 29 20 2d 20 31 2c 0a 09 09 09 22 75 73 61  sg) - 1,...."usa
0de0: 67 65 3a 20 25 73 20 2d 73 20 3c 73 75 62 73 74  ge: %s -s <subst
0df0: 69 74 75 74 69 6f 6e 73 20 66 69 6c 65 3e 20 3c  itutions file> <
0e00: 66 69 6c 65 3e 5c 6e 22 0a 09 09 09 22 50 65 72  file>\n"...."Per
0e10: 66 6f 72 6d 20 61 20 73 65 74 20 6f 66 20 73 74  form a set of st
0e20: 72 69 6e 67 20 6d 61 70 20 74 79 70 65 20 73 75  ring map type su
0e30: 62 73 74 75 74 69 74 69 6f 6e 73 20 6f 6e 20 61  bstutitions on a
0e40: 20 66 69 6c 65 5c 6e 22 0a 09 09 09 22 65 78 69   file\n"...."exi
0e50: 74 63 6f 64 65 73 3a 20 30 5c 6e 22 2c 0a 09 09  tcodes: 0\n",...
0e60: 09 61 72 67 76 5b 30 5d 29 3b 0a 09 09 57 72 69  .argv[0]);...Wri
0e70: 74 65 46 69 6c 65 28 47 65 74 53 74 64 48 61 6e  teFile(GetStdHan
0e80: 64 6c 65 28 53 54 44 5f 45 52 52 4f 52 5f 48 41  dle(STD_ERROR_HA
0e90: 4e 44 4c 45 29 2c 20 6d 73 67 2c 20 63 68 61 72  NDLE), msg, char
0ea0: 73 2c 0a 09 09 09 26 64 77 57 72 69 74 74 65 6e  s,....&dwWritten
0eb0: 2c 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72  , NULL);...retur
0ec0: 6e 20 32 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  n 2;..    }..   
0ed0: 20 72 65 74 75 72 6e 20 53 75 62 73 74 69 74 75   return Substitu
0ee0: 74 65 46 69 6c 65 28 61 72 67 76 5b 32 5d 2c 20  teFile(argv[2], 
0ef0: 61 72 67 76 5b 33 5d 29 3b 0a 09 63 61 73 65 20  argv[3]);..case 
0f00: 27 56 27 3a 0a 09 20 20 20 20 69 66 20 28 61 72  'V':..    if (ar
0f10: 67 63 20 21 3d 20 34 29 20 7b 0a 09 09 63 68 61  gc != 4) {...cha
0f20: 72 73 20 3d 20 73 6e 70 72 69 6e 74 66 28 6d 73  rs = snprintf(ms
0f30: 67 2c 20 73 69 7a 65 6f 66 28 6d 73 67 29 20 2d  g, sizeof(msg) -
0f40: 20 31 2c 0a 09 09 20 20 20 20 22 75 73 61 67 65   1,...    "usage
0f50: 3a 20 25 73 20 2d 56 20 66 69 6c 65 6e 61 6d 65  : %s -V filename
0f60: 20 6d 61 74 63 68 73 74 72 69 6e 67 5c 6e 22 0a   matchstring\n".
0f70: 09 09 20 20 20 20 22 45 78 74 72 61 63 74 20 61  ..    "Extract a
0f80: 20 76 65 72 73 69 6f 6e 20 66 72 6f 6d 20 61 20   version from a 
0f90: 66 69 6c 65 3a 5c 6e 22 0a 09 09 20 20 20 20 22  file:\n"...    "
0fa0: 65 67 3a 20 70 6b 67 49 6e 64 65 78 2e 74 63 6c  eg: pkgIndex.tcl
0fb0: 20 5c 22 70 61 63 6b 61 67 65 20 69 66 6e 65 65   \"package ifnee
0fc0: 64 65 64 20 68 74 74 70 5c 22 22 2c 0a 09 09 20  ded http\"",... 
0fd0: 20 20 20 61 72 67 76 5b 30 5d 29 3b 0a 09 09 57     argv[0]);...W
0fe0: 72 69 74 65 46 69 6c 65 28 47 65 74 53 74 64 48  riteFile(GetStdH
0ff0: 61 6e 64 6c 65 28 53 54 44 5f 45 52 52 4f 52 5f  andle(STD_ERROR_
1000: 48 41 4e 44 4c 45 29 2c 20 6d 73 67 2c 20 63 68  HANDLE), msg, ch
1010: 61 72 73 2c 0a 09 09 20 20 20 20 26 64 77 57 72  ars,...    &dwWr
1020: 69 74 74 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 09 09  itten, NULL);...
1030: 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d  return 0;..    }
1040: 0a 09 20 20 20 20 70 72 69 6e 74 66 28 22 25 73  ..    printf("%s
1050: 5c 6e 22 2c 20 47 65 74 56 65 72 73 69 6f 6e 46  \n", GetVersionF
1060: 72 6f 6d 46 69 6c 65 28 61 72 67 76 5b 32 5d 2c  romFile(argv[2],
1070: 20 61 72 67 76 5b 33 5d 29 29 3b 0a 09 20 20 20   argv[3]));..   
1080: 20 72 65 74 75 72 6e 20 30 3b 0a 09 63 61 73 65   return 0;..case
1090: 20 27 51 27 3a 0a 09 20 20 20 20 69 66 20 28 61   'Q':..    if (a
10a0: 72 67 63 20 21 3d 20 33 29 20 7b 0a 09 09 63 68  rgc != 3) {...ch
10b0: 61 72 73 20 3d 20 73 6e 70 72 69 6e 74 66 28 6d  ars = snprintf(m
10c0: 73 67 2c 20 73 69 7a 65 6f 66 28 6d 73 67 29 20  sg, sizeof(msg) 
10d0: 2d 20 31 2c 0a 09 09 20 20 20 20 22 75 73 61 67  - 1,...    "usag
10e0: 65 3a 20 25 73 20 2d 51 20 70 61 74 68 5c 6e 22  e: %s -Q path\n"
10f0: 0a 09 09 20 20 20 20 22 45 6d 69 74 20 74 68 65  ...    "Emit the
1100: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
1110: 20 70 61 74 68 5c 6e 22 0a 09 09 20 20 20 20 22   path\n"...    "
1120: 65 78 69 74 63 6f 64 65 73 3a 20 30 20 3d 3d 20  exitcodes: 0 == 
1130: 6e 6f 2c 20 31 20 3d 3d 20 79 65 73 2c 20 32 20  no, 1 == yes, 2 
1140: 3d 3d 20 65 72 72 6f 72 5c 6e 22 2c 20 61 72 67  == error\n", arg
1150: 76 5b 30 5d 29 3b 0a 09 09 57 72 69 74 65 46 69  v[0]);...WriteFi
1160: 6c 65 28 47 65 74 53 74 64 48 61 6e 64 6c 65 28  le(GetStdHandle(
1170: 53 54 44 5f 45 52 52 4f 52 5f 48 41 4e 44 4c 45  STD_ERROR_HANDLE
1180: 29 2c 20 6d 73 67 2c 20 63 68 61 72 73 2c 0a 09  ), msg, chars,..
1190: 09 20 20 20 20 26 64 77 57 72 69 74 74 65 6e 2c  .    &dwWritten,
11a0: 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e   NULL);...return
11b0: 20 32 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20   2;..    }..    
11c0: 72 65 74 75 72 6e 20 51 75 61 6c 69 66 79 50 61  return QualifyPa
11d0: 74 68 28 61 72 67 76 5b 32 5d 29 3b 0a 09 7d 0a  th(argv[2]);..}.
11e0: 20 20 20 20 7d 0a 20 20 20 20 63 68 61 72 73 20      }.    chars 
11f0: 3d 20 73 6e 70 72 69 6e 74 66 28 6d 73 67 2c 20  = snprintf(msg, 
1200: 73 69 7a 65 6f 66 28 6d 73 67 29 20 2d 20 31 2c  sizeof(msg) - 1,
1210: 0a 09 20 20 20 20 22 75 73 61 67 65 3a 20 25 73  ..    "usage: %s
1220: 20 2d 63 7c 2d 66 7c 2d 6c 7c 2d 51 7c 2d 73 7c   -c|-f|-l|-Q|-s|
1230: 2d 56 20 2e 2e 2e 5c 6e 22 0a 09 20 20 20 20 22  -V ...\n"..    "
1240: 54 68 69 73 20 69 73 20 61 20 6c 69 74 74 6c 65  This is a little
1250: 20 68 65 6c 70 65 72 20 61 70 70 20 74 6f 20 65   helper app to e
1260: 71 75 61 6c 69 7a 65 20 73 68 65 6c 6c 20 64 69  qualize shell di
1270: 66 66 65 72 65 6e 63 65 73 20 62 65 74 77 65 65  fferences betwee
1280: 6e 20 57 69 6e 4e 54 20 61 6e 64 5c 6e 22 0a 09  n WinNT and\n"..
1290: 20 20 20 20 22 57 69 6e 39 78 20 61 6e 64 20 67      "Win9x and g
12a0: 65 74 20 6e 6d 61 6b 65 2e 65 78 65 20 74 6f 20  et nmake.exe to 
12b0: 61 63 63 6f 6d 70 6c 69 73 68 20 69 74 73 20 6a  accomplish its j
12c0: 6f 62 2e 5c 6e 22 2c 0a 09 20 20 20 20 61 72 67  ob.\n",..    arg
12d0: 76 5b 30 5d 29 3b 0a 20 20 20 20 57 72 69 74 65  v[0]);.    Write
12e0: 46 69 6c 65 28 47 65 74 53 74 64 48 61 6e 64 6c  File(GetStdHandl
12f0: 65 28 53 54 44 5f 45 52 52 4f 52 5f 48 41 4e 44  e(STD_ERROR_HAND
1300: 4c 45 29 2c 20 6d 73 67 2c 20 63 68 61 72 73 2c  LE), msg, chars,
1310: 20 26 64 77 57 72 69 74 74 65 6e 2c 20 4e 55 4c   &dwWritten, NUL
1320: 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32  L);.    return 2
1330: 3b 0a 7d 0a 0c 0a 73 74 61 74 69 63 20 69 6e 74  ;.}...static int
1340: 0a 43 68 65 63 6b 46 6f 72 43 6f 6d 70 69 6c 65  .CheckForCompile
1350: 72 46 65 61 74 75 72 65 28 0a 20 20 20 20 63 6f  rFeature(.    co
1360: 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e  nst char *option
1370: 29 0a 7b 0a 20 20 20 20 53 54 41 52 54 55 50 49  ).{.    STARTUPI
1380: 4e 46 4f 20 73 69 3b 0a 20 20 20 20 50 52 4f 43  NFO si;.    PROC
1390: 45 53 53 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 20  ESS_INFORMATION 
13a0: 70 69 3b 0a 20 20 20 20 53 45 43 55 52 49 54 59  pi;.    SECURITY
13b0: 5f 41 54 54 52 49 42 55 54 45 53 20 73 61 3b 0a  _ATTRIBUTES sa;.
13c0: 20 20 20 20 44 57 4f 52 44 20 74 68 72 65 61 64      DWORD thread
13d0: 49 44 3b 0a 20 20 20 20 63 68 61 72 20 6d 73 67  ID;.    char msg
13e0: 5b 33 30 30 5d 3b 0a 20 20 20 20 42 4f 4f 4c 20  [300];.    BOOL 
13f0: 6f 6b 3b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68  ok;.    HANDLE h
1400: 50 72 6f 63 65 73 73 2c 20 68 2c 20 70 69 70 65  Process, h, pipe
1410: 54 68 72 65 61 64 73 5b 32 5d 3b 0a 20 20 20 20  Threads[2];.    
1420: 63 68 61 72 20 63 6d 64 6c 69 6e 65 5b 31 30 30  char cmdline[100
1430: 5d 3b 0a 0a 20 20 20 20 68 50 72 6f 63 65 73 73  ];..    hProcess
1440: 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72 6f   = GetCurrentPro
1450: 63 65 73 73 28 29 3b 0a 0a 20 20 20 20 5a 65 72  cess();..    Zer
1460: 6f 4d 65 6d 6f 72 79 28 26 70 69 2c 20 73 69 7a  oMemory(&pi, siz
1470: 65 6f 66 28 50 52 4f 43 45 53 53 5f 49 4e 46 4f  eof(PROCESS_INFO
1480: 52 4d 41 54 49 4f 4e 29 29 3b 0a 20 20 20 20 5a  RMATION));.    Z
1490: 65 72 6f 4d 65 6d 6f 72 79 28 26 73 69 2c 20 73  eroMemory(&si, s
14a0: 69 7a 65 6f 66 28 53 54 41 52 54 55 50 49 4e 46  izeof(STARTUPINF
14b0: 4f 29 29 3b 0a 20 20 20 20 73 69 2e 63 62 20 3d  O));.    si.cb =
14c0: 20 73 69 7a 65 6f 66 28 53 54 41 52 54 55 50 49   sizeof(STARTUPI
14d0: 4e 46 4f 29 3b 0a 20 20 20 20 73 69 2e 64 77 46  NFO);.    si.dwF
14e0: 6c 61 67 73 20 20 20 3d 20 53 54 41 52 54 46 5f  lags   = STARTF_
14f0: 55 53 45 53 54 44 48 41 4e 44 4c 45 53 3b 0a 20  USESTDHANDLES;. 
1500: 20 20 20 73 69 2e 68 53 74 64 49 6e 70 75 74 20     si.hStdInput 
1510: 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
1520: 5f 56 41 4c 55 45 3b 0a 0a 20 20 20 20 5a 65 72  _VALUE;..    Zer
1530: 6f 4d 65 6d 6f 72 79 28 26 73 61 2c 20 73 69 7a  oMemory(&sa, siz
1540: 65 6f 66 28 53 45 43 55 52 49 54 59 5f 41 54 54  eof(SECURITY_ATT
1550: 52 49 42 55 54 45 53 29 29 3b 0a 20 20 20 20 73  RIBUTES));.    s
1560: 61 2e 6e 4c 65 6e 67 74 68 20 3d 20 73 69 7a 65  a.nLength = size
1570: 6f 66 28 53 45 43 55 52 49 54 59 5f 41 54 54 52  of(SECURITY_ATTR
1580: 49 42 55 54 45 53 29 3b 0a 20 20 20 20 73 61 2e  IBUTES);.    sa.
1590: 6c 70 53 65 63 75 72 69 74 79 44 65 73 63 72 69  lpSecurityDescri
15a0: 70 74 6f 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ptor = NULL;.   
15b0: 20 73 61 2e 62 49 6e 68 65 72 69 74 48 61 6e 64   sa.bInheritHand
15c0: 6c 65 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 20  le = FALSE;..   
15d0: 20 2f 2a 0a 20 20 20 20 20 2a 20 43 72 65 61 74   /*.     * Creat
15e0: 65 20 61 20 6e 6f 6e 2d 69 6e 68 65 72 69 74 69  e a non-inheriti
15f0: 62 6c 65 20 70 69 70 65 2e 0a 20 20 20 20 20 2a  ble pipe..     *
1600: 2f 0a 0a 20 20 20 20 43 72 65 61 74 65 50 69 70  /..    CreatePip
1610: 65 28 26 4f 75 74 2e 70 69 70 65 2c 20 26 68 2c  e(&Out.pipe, &h,
1620: 20 26 73 61 2c 20 30 29 3b 0a 0a 20 20 20 20 2f   &sa, 0);..    /
1630: 2a 0a 20 20 20 20 20 2a 20 44 75 70 65 20 74 68  *.     * Dupe th
1640: 65 20 77 72 69 74 65 20 73 69 64 65 2c 20 6d 61  e write side, ma
1650: 6b 65 20 69 74 20 69 6e 68 65 72 69 74 69 62 6c  ke it inheritibl
1660: 65 2c 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  e, and close the
1670: 20 6f 72 69 67 69 6e 61 6c 2e 0a 20 20 20 20 20   original..     
1680: 2a 2f 0a 0a 20 20 20 20 44 75 70 6c 69 63 61 74  */..    Duplicat
1690: 65 48 61 6e 64 6c 65 28 68 50 72 6f 63 65 73 73  eHandle(hProcess
16a0: 2c 20 68 2c 20 68 50 72 6f 63 65 73 73 2c 20 26  , h, hProcess, &
16b0: 73 69 2e 68 53 74 64 4f 75 74 70 75 74 2c 20 30  si.hStdOutput, 0
16c0: 2c 20 54 52 55 45 2c 0a 09 20 20 20 20 44 55 50  , TRUE,..    DUP
16d0: 4c 49 43 41 54 45 5f 53 41 4d 45 5f 41 43 43 45  LICATE_SAME_ACCE
16e0: 53 53 20 7c 20 44 55 50 4c 49 43 41 54 45 5f 43  SS | DUPLICATE_C
16f0: 4c 4f 53 45 5f 53 4f 55 52 43 45 29 3b 0a 0a 20  LOSE_SOURCE);.. 
1700: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 61 6d     /*.     * Sam
1710: 65 20 61 73 20 61 62 6f 76 65 2c 20 62 75 74 20  e as above, but 
1720: 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 69  for the error si
1730: 64 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  de..     */..   
1740: 20 43 72 65 61 74 65 50 69 70 65 28 26 45 72 72   CreatePipe(&Err
1750: 2e 70 69 70 65 2c 20 26 68 2c 20 26 73 61 2c 20  .pipe, &h, &sa, 
1760: 30 29 3b 0a 20 20 20 20 44 75 70 6c 69 63 61 74  0);.    Duplicat
1770: 65 48 61 6e 64 6c 65 28 68 50 72 6f 63 65 73 73  eHandle(hProcess
1780: 2c 20 68 2c 20 68 50 72 6f 63 65 73 73 2c 20 26  , h, hProcess, &
1790: 73 69 2e 68 53 74 64 45 72 72 6f 72 2c 20 30 2c  si.hStdError, 0,
17a0: 20 54 52 55 45 2c 0a 09 20 20 20 20 44 55 50 4c   TRUE,..    DUPL
17b0: 49 43 41 54 45 5f 53 41 4d 45 5f 41 43 43 45 53  ICATE_SAME_ACCES
17c0: 53 20 7c 20 44 55 50 4c 49 43 41 54 45 5f 43 4c  S | DUPLICATE_CL
17d0: 4f 53 45 5f 53 4f 55 52 43 45 29 3b 0a 0a 20 20  OSE_SOURCE);..  
17e0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 42 61 73 65    /*.     * Base
17f0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 0a 20   command line.. 
1800: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6c 73 74 72      */..    lstr
1810: 63 70 79 28 63 6d 64 6c 69 6e 65 2c 20 22 63 6c  cpy(cmdline, "cl
1820: 2e 65 78 65 20 2d 6e 6f 6c 6f 67 6f 20 2d 63 20  .exe -nologo -c 
1830: 2d 54 43 20 2d 5a 73 20 2d 58 20 2d 46 70 2e 5c  -TC -Zs -X -Fp.\
1840: 5c 5f 6a 75 6e 6b 2e 70 63 68 20 22 29 3b 0a 0a  \_junk.pch ");..
1850: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 70      /*.     * Ap
1860: 70 65 6e 64 20 6f 75 72 20 6f 70 74 69 6f 6e 20  pend our option 
1870: 66 6f 72 20 74 65 73 74 69 6e 67 0a 20 20 20 20  for testing.    
1880: 20 2a 2f 0a 0a 20 20 20 20 6c 73 74 72 63 61 74   */..    lstrcat
1890: 28 63 6d 64 6c 69 6e 65 2c 20 6f 70 74 69 6f 6e  (cmdline, option
18a0: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
18b0: 2a 20 46 69 6c 65 6e 61 6d 65 20 74 6f 20 63 6f  * Filename to co
18c0: 6d 70 69 6c 65 2c 20 77 68 69 63 68 20 65 78 69  mpile, which exi
18d0: 73 74 73 2c 20 62 75 74 20 69 73 20 6e 6f 74 68  sts, but is noth
18e0: 69 6e 67 20 61 6e 64 20 65 6d 70 74 79 2e 0a 20  ing and empty.. 
18f0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6c 73 74 72      */..    lstr
1900: 63 61 74 28 63 6d 64 6c 69 6e 65 2c 20 22 20 2e  cat(cmdline, " .
1910: 5c 5c 6e 75 6c 22 29 3b 0a 0a 20 20 20 20 6f 6b  \\nul");..    ok
1920: 20 3d 20 43 72 65 61 74 65 50 72 6f 63 65 73 73   = CreateProcess
1930: 28 0a 09 20 20 20 20 4e 55 4c 4c 2c 09 20 20 20  (..    NULL,.   
1940: 20 2f 2a 20 4d 6f 64 75 6c 65 20 6e 61 6d 65 2e   /* Module name.
1950: 20 2a 2f 0a 09 20 20 20 20 63 6d 64 6c 69 6e 65   */..    cmdline
1960: 2c 09 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  ,.    /* Command
1970: 20 6c 69 6e 65 2e 20 2a 2f 0a 09 20 20 20 20 4e   line. */..    N
1980: 55 4c 4c 2c 09 20 20 20 20 2f 2a 20 50 72 6f 63  ULL,.    /* Proc
1990: 65 73 73 20 68 61 6e 64 6c 65 20 6e 6f 74 20 69  ess handle not i
19a0: 6e 68 65 72 69 74 61 62 6c 65 2e 20 2a 2f 0a 09  nheritable. */..
19b0: 20 20 20 20 4e 55 4c 4c 2c 09 20 20 20 20 2f 2a      NULL,.    /*
19c0: 20 54 68 72 65 61 64 20 68 61 6e 64 6c 65 20 6e   Thread handle n
19d0: 6f 74 20 69 6e 68 65 72 69 74 61 62 6c 65 2e 20  ot inheritable. 
19e0: 2a 2f 0a 09 20 20 20 20 54 52 55 45 2c 09 20 20  */..    TRUE,.  
19f0: 20 20 2f 2a 20 79 65 73 2c 20 69 6e 68 65 72 69    /* yes, inheri
1a00: 74 20 68 61 6e 64 6c 65 73 2e 20 2a 2f 0a 09 20  t handles. */.. 
1a10: 20 20 20 44 45 54 41 43 48 45 44 5f 50 52 4f 43     DETACHED_PROC
1a20: 45 53 53 2c 20 2f 2a 20 4e 6f 20 63 6f 6e 73 6f  ESS, /* No conso
1a30: 6c 65 20 66 6f 72 20 79 6f 75 2e 20 2a 2f 0a 09  le for you. */..
1a40: 20 20 20 20 4e 55 4c 4c 2c 09 20 20 20 20 2f 2a      NULL,.    /*
1a50: 20 55 73 65 20 70 61 72 65 6e 74 27 73 20 65 6e   Use parent's en
1a60: 76 69 72 6f 6e 6d 65 6e 74 20 62 6c 6f 63 6b 2e  vironment block.
1a70: 20 2a 2f 0a 09 20 20 20 20 4e 55 4c 4c 2c 09 20   */..    NULL,. 
1a80: 20 20 20 2f 2a 20 55 73 65 20 70 61 72 65 6e 74     /* Use parent
1a90: 27 73 20 73 74 61 72 74 69 6e 67 20 64 69 72 65  's starting dire
1aa0: 63 74 6f 72 79 2e 20 2a 2f 0a 09 20 20 20 20 26  ctory. */..    &
1ab0: 73 69 2c 09 20 20 20 20 2f 2a 20 50 6f 69 6e 74  si,.    /* Point
1ac0: 65 72 20 74 6f 20 53 54 41 52 54 55 50 49 4e 46  er to STARTUPINF
1ad0: 4f 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  O structure. */.
1ae0: 09 20 20 20 20 26 70 69 29 3b 09 20 20 20 20 2f  .    &pi);.    /
1af0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 50 52 4f  * Pointer to PRO
1b00: 43 45 53 53 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  CESS_INFORMATION
1b10: 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 0a   structure. */..
1b20: 20 20 20 20 69 66 20 28 21 6f 6b 29 20 7b 0a 09      if (!ok) {..
1b30: 44 57 4f 52 44 20 65 72 72 20 3d 20 47 65 74 4c  DWORD err = GetL
1b40: 61 73 74 45 72 72 6f 72 28 29 3b 0a 09 69 6e 74  astError();..int
1b50: 20 63 68 61 72 73 20 3d 20 73 6e 70 72 69 6e 74   chars = snprint
1b60: 66 28 6d 73 67 2c 20 73 69 7a 65 6f 66 28 6d 73  f(msg, sizeof(ms
1b70: 67 29 20 2d 20 31 2c 0a 09 09 22 54 72 69 65 64  g) - 1,..."Tried
1b80: 20 74 6f 20 6c 61 75 6e 63 68 3a 20 5c 22 25 73   to launch: \"%s
1b90: 5c 22 2c 20 62 75 74 20 67 6f 74 20 65 72 72 6f  \", but got erro
1ba0: 72 20 5b 25 75 5d 3a 20 22 2c 20 63 6d 64 6c 69  r [%u]: ", cmdli
1bb0: 6e 65 2c 20 65 72 72 29 3b 0a 0a 09 46 6f 72 6d  ne, err);...Form
1bc0: 61 74 4d 65 73 73 61 67 65 28 46 4f 52 4d 41 54  atMessage(FORMAT
1bd0: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
1be0: 53 54 45 4d 7c 46 4f 52 4d 41 54 5f 4d 45 53 53  STEM|FORMAT_MESS
1bf0: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
1c00: 54 53 7c 0a 09 09 46 4f 52 4d 41 54 5f 4d 45 53  TS|...FORMAT_MES
1c10: 53 41 47 45 5f 4d 41 58 5f 57 49 44 54 48 5f 4d  SAGE_MAX_WIDTH_M
1c20: 41 53 4b 2c 20 30 4c 2c 20 65 72 72 2c 20 30 2c  ASK, 0L, err, 0,
1c30: 20 28 4c 50 56 4f 49 44 29 26 6d 73 67 5b 63 68   (LPVOID)&msg[ch
1c40: 61 72 73 5d 2c 0a 09 09 28 33 30 30 2d 63 68 61  ars],...(300-cha
1c50: 72 73 29 2c 20 30 29 3b 0a 09 57 72 69 74 65 46  rs), 0);..WriteF
1c60: 69 6c 65 28 47 65 74 53 74 64 48 61 6e 64 6c 65  ile(GetStdHandle
1c70: 28 53 54 44 5f 45 52 52 4f 52 5f 48 41 4e 44 4c  (STD_ERROR_HANDL
1c80: 45 29 2c 20 6d 73 67 2c 20 6c 73 74 72 6c 65 6e  E), msg, lstrlen
1c90: 28 6d 73 67 29 2c 20 26 65 72 72 2c 4e 55 4c 4c  (msg), &err,NULL
1ca0: 29 3b 0a 09 72 65 74 75 72 6e 20 32 3b 0a 20 20  );..return 2;.  
1cb0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1cc0: 20 2a 20 43 6c 6f 73 65 20 6f 75 72 20 72 65 66   * Close our ref
1cd0: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 77  erences to the w
1ce0: 72 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 61  rite handles tha
1cf0: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
1d00: 69 6e 68 65 72 69 74 65 64 2e 0a 20 20 20 20 20  inherited..     
1d10: 2a 2f 0a 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e  */..    CloseHan
1d20: 64 6c 65 28 73 69 2e 68 53 74 64 4f 75 74 70 75  dle(si.hStdOutpu
1d30: 74 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e  t);.    CloseHan
1d40: 64 6c 65 28 73 69 2e 68 53 74 64 45 72 72 6f 72  dle(si.hStdError
1d50: 29 3b 0a 0a 20 20 20 20 57 61 69 74 46 6f 72 49  );..    WaitForI
1d60: 6e 70 75 74 49 64 6c 65 28 70 69 2e 68 50 72 6f  nputIdle(pi.hPro
1d70: 63 65 73 73 2c 20 35 30 30 30 29 3b 0a 20 20 20  cess, 5000);.   
1d80: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 69 2e   CloseHandle(pi.
1d90: 68 54 68 72 65 61 64 29 3b 0a 0a 20 20 20 20 2f  hThread);..    /
1da0: 2a 0a 20 20 20 20 20 2a 20 53 74 61 72 74 20 74  *.     * Start t
1db0: 68 65 20 70 69 70 65 20 72 65 61 64 65 72 20 74  he pipe reader t
1dc0: 68 72 65 61 64 73 2e 0a 20 20 20 20 20 2a 2f 0a  hreads..     */.
1dd0: 0a 20 20 20 20 70 69 70 65 54 68 72 65 61 64 73  .    pipeThreads
1de0: 5b 30 5d 20 3d 20 43 72 65 61 74 65 54 68 72 65  [0] = CreateThre
1df0: 61 64 28 4e 55 4c 4c 2c 20 30 2c 20 52 65 61 64  ad(NULL, 0, Read
1e00: 46 72 6f 6d 50 69 70 65 2c 20 26 4f 75 74 2c 20  FromPipe, &Out, 
1e10: 30 2c 20 26 74 68 72 65 61 64 49 44 29 3b 0a 20  0, &threadID);. 
1e20: 20 20 20 70 69 70 65 54 68 72 65 61 64 73 5b 31     pipeThreads[1
1e30: 5d 20 3d 20 43 72 65 61 74 65 54 68 72 65 61 64  ] = CreateThread
1e40: 28 4e 55 4c 4c 2c 20 30 2c 20 52 65 61 64 46 72  (NULL, 0, ReadFr
1e50: 6f 6d 50 69 70 65 2c 20 26 45 72 72 2c 20 30 2c  omPipe, &Err, 0,
1e60: 20 26 74 68 72 65 61 64 49 44 29 3b 0a 0a 20 20   &threadID);..  
1e70: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 42 6c 6f 63    /*.     * Bloc
1e80: 6b 20 77 61 69 74 69 6e 67 20 66 6f 72 20 74 68  k waiting for th
1e90: 65 20 70 72 6f 63 65 73 73 20 74 6f 20 65 6e 64  e process to end
1ea0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 57  ..     */..    W
1eb0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
1ec0: 63 74 28 70 69 2e 68 50 72 6f 63 65 73 73 2c 20  ct(pi.hProcess, 
1ed0: 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 20 43  INFINITE);.    C
1ee0: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 69 2e 68 50  loseHandle(pi.hP
1ef0: 72 6f 63 65 73 73 29 3b 0a 0a 20 20 20 20 2f 2a  rocess);..    /*
1f00: 0a 20 20 20 20 20 2a 20 57 61 69 74 20 66 6f 72  .     * Wait for
1f10: 20 6f 75 72 20 70 69 70 65 20 74 6f 20 67 65 74   our pipe to get
1f20: 20 64 6f 6e 65 20 72 65 61 64 69 6e 67 2c 20 73   done reading, s
1f30: 68 6f 75 6c 64 20 69 74 20 62 65 20 61 20 6c 69  hould it be a li
1f40: 74 74 6c 65 20 73 6c 6f 77 2e 0a 20 20 20 20 20  ttle slow..     
1f50: 2a 2f 0a 0a 20 20 20 20 57 61 69 74 46 6f 72 4d  */..    WaitForM
1f60: 75 6c 74 69 70 6c 65 4f 62 6a 65 63 74 73 28 32  ultipleObjects(2
1f70: 2c 20 70 69 70 65 54 68 72 65 61 64 73 2c 20 54  , pipeThreads, T
1f80: 52 55 45 2c 20 35 30 30 29 3b 0a 20 20 20 20 43  RUE, 500);.    C
1f90: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 69 70 65 54  loseHandle(pipeT
1fa0: 68 72 65 61 64 73 5b 30 5d 29 3b 0a 20 20 20 20  hreads[0]);.    
1fb0: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 69 70 65  CloseHandle(pipe
1fc0: 54 68 72 65 61 64 73 5b 31 5d 29 3b 0a 0a 20 20  Threads[1]);..  
1fd0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4c 6f 6f 6b    /*.     * Look
1fe0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64   for the command
1ff0: 6c 69 6e 65 20 77 61 72 6e 69 6e 67 20 63 6f 64  line warning cod
2000: 65 20 69 6e 20 62 6f 74 68 20 73 74 72 65 61 6d  e in both stream
2010: 73 2e 0a 20 20 20 20 20 2a 20 20 2d 20 69 6e 20  s..     *  - in 
2020: 4d 53 56 43 20 36 20 26 20 37 20 77 65 20 67 65  MSVC 6 & 7 we ge
2030: 74 20 44 34 30 30 32 2c 20 69 6e 20 4d 53 56 43  t D4002, in MSVC
2040: 20 38 20 77 65 20 67 65 74 20 44 39 30 30 32 2e   8 we get D9002.
2050: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 65  .     */..    re
2060: 74 75 72 6e 20 21 28 73 74 72 73 74 72 28 4f 75  turn !(strstr(Ou
2070: 74 2e 62 75 66 66 65 72 2c 20 22 44 34 30 30 32  t.buffer, "D4002
2080: 22 29 20 21 3d 20 4e 55 4c 4c 0a 20 20 20 20 20  ") != NULL.     
2090: 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 73 74          || strst
20a0: 72 28 45 72 72 2e 62 75 66 66 65 72 2c 20 22 44  r(Err.buffer, "D
20b0: 34 30 30 32 22 29 20 21 3d 20 4e 55 4c 4c 0a 20  4002") != NULL. 
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
20d0: 74 72 73 74 72 28 4f 75 74 2e 62 75 66 66 65 72  trstr(Out.buffer
20e0: 2c 20 22 44 39 30 30 32 22 29 20 21 3d 20 4e 55  , "D9002") != NU
20f0: 4c 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  LL.             
2100: 7c 7c 20 73 74 72 73 74 72 28 45 72 72 2e 62 75  || strstr(Err.bu
2110: 66 66 65 72 2c 20 22 44 39 30 30 32 22 29 20 21  ffer, "D9002") !
2120: 3d 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20  = NULL.         
2130: 20 20 20 20 7c 7c 20 73 74 72 73 74 72 28 4f 75      || strstr(Ou
2140: 74 2e 62 75 66 66 65 72 2c 20 22 44 32 30 32 31  t.buffer, "D2021
2150: 22 29 20 21 3d 20 4e 55 4c 4c 0a 20 20 20 20 20  ") != NULL.     
2160: 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 73 74          || strst
2170: 72 28 45 72 72 2e 62 75 66 66 65 72 2c 20 22 44  r(Err.buffer, "D
2180: 32 30 32 31 22 29 20 21 3d 20 4e 55 4c 4c 29 3b  2021") != NULL);
2190: 0a 7d 0a 0c 0a 73 74 61 74 69 63 20 69 6e 74 0a  .}...static int.
21a0: 43 68 65 63 6b 46 6f 72 4c 69 6e 6b 65 72 46 65  CheckForLinkerFe
21b0: 61 74 75 72 65 28 0a 20 20 20 20 63 6f 6e 73 74  ature(.    const
21c0: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 29 0a 7b   char *option).{
21d0: 0a 20 20 20 20 53 54 41 52 54 55 50 49 4e 46 4f  .    STARTUPINFO
21e0: 20 73 69 3b 0a 20 20 20 20 50 52 4f 43 45 53 53   si;.    PROCESS
21f0: 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 20 70 69 3b  _INFORMATION pi;
2200: 0a 20 20 20 20 53 45 43 55 52 49 54 59 5f 41 54  .    SECURITY_AT
2210: 54 52 49 42 55 54 45 53 20 73 61 3b 0a 20 20 20  TRIBUTES sa;.   
2220: 20 44 57 4f 52 44 20 74 68 72 65 61 64 49 44 3b   DWORD threadID;
2230: 0a 20 20 20 20 63 68 61 72 20 6d 73 67 5b 33 30  .    char msg[30
2240: 30 5d 3b 0a 20 20 20 20 42 4f 4f 4c 20 6f 6b 3b  0];.    BOOL ok;
2250: 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 50 72 6f  .    HANDLE hPro
2260: 63 65 73 73 2c 20 68 2c 20 70 69 70 65 54 68 72  cess, h, pipeThr
2270: 65 61 64 73 5b 32 5d 3b 0a 20 20 20 20 63 68 61  eads[2];.    cha
2280: 72 20 63 6d 64 6c 69 6e 65 5b 31 30 30 5d 3b 0a  r cmdline[100];.
2290: 0a 20 20 20 20 68 50 72 6f 63 65 73 73 20 3d 20  .    hProcess = 
22a0: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
22b0: 73 28 29 3b 0a 0a 20 20 20 20 5a 65 72 6f 4d 65  s();..    ZeroMe
22c0: 6d 6f 72 79 28 26 70 69 2c 20 73 69 7a 65 6f 66  mory(&pi, sizeof
22d0: 28 50 52 4f 43 45 53 53 5f 49 4e 46 4f 52 4d 41  (PROCESS_INFORMA
22e0: 54 49 4f 4e 29 29 3b 0a 20 20 20 20 5a 65 72 6f  TION));.    Zero
22f0: 4d 65 6d 6f 72 79 28 26 73 69 2c 20 73 69 7a 65  Memory(&si, size
2300: 6f 66 28 53 54 41 52 54 55 50 49 4e 46 4f 29 29  of(STARTUPINFO))
2310: 3b 0a 20 20 20 20 73 69 2e 63 62 20 3d 20 73 69  ;.    si.cb = si
2320: 7a 65 6f 66 28 53 54 41 52 54 55 50 49 4e 46 4f  zeof(STARTUPINFO
2330: 29 3b 0a 20 20 20 20 73 69 2e 64 77 46 6c 61 67  );.    si.dwFlag
2340: 73 20 20 20 3d 20 53 54 41 52 54 46 5f 55 53 45  s   = STARTF_USE
2350: 53 54 44 48 41 4e 44 4c 45 53 3b 0a 20 20 20 20  STDHANDLES;.    
2360: 73 69 2e 68 53 74 64 49 6e 70 75 74 20 3d 20 49  si.hStdInput = I
2370: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
2380: 4c 55 45 3b 0a 0a 20 20 20 20 5a 65 72 6f 4d 65  LUE;..    ZeroMe
2390: 6d 6f 72 79 28 26 73 61 2c 20 73 69 7a 65 6f 66  mory(&sa, sizeof
23a0: 28 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  (SECURITY_ATTRIB
23b0: 55 54 45 53 29 29 3b 0a 20 20 20 20 73 61 2e 6e  UTES));.    sa.n
23c0: 4c 65 6e 67 74 68 20 3d 20 73 69 7a 65 6f 66 28  Length = sizeof(
23d0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
23e0: 54 45 53 29 3b 0a 20 20 20 20 73 61 2e 6c 70 53  TES);.    sa.lpS
23f0: 65 63 75 72 69 74 79 44 65 73 63 72 69 70 74 6f  ecurityDescripto
2400: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 61  r = NULL;.    sa
2410: 2e 62 49 6e 68 65 72 69 74 48 61 6e 64 6c 65 20  .bInheritHandle 
2420: 3d 20 54 52 55 45 3b 0a 0a 20 20 20 20 2f 2a 0a  = TRUE;..    /*.
2430: 20 20 20 20 20 2a 20 43 72 65 61 74 65 20 61 20       * Create a 
2440: 6e 6f 6e 2d 69 6e 68 65 72 69 74 69 62 6c 65 20  non-inheritible 
2450: 70 69 70 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  pipe..     */.. 
2460: 20 20 20 43 72 65 61 74 65 50 69 70 65 28 26 4f     CreatePipe(&O
2470: 75 74 2e 70 69 70 65 2c 20 26 68 2c 20 26 73 61  ut.pipe, &h, &sa
2480: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  , 0);..    /*.  
2490: 20 20 20 2a 20 44 75 70 65 20 74 68 65 20 77 72     * Dupe the wr
24a0: 69 74 65 20 73 69 64 65 2c 20 6d 61 6b 65 20 69  ite side, make i
24b0: 74 20 69 6e 68 65 72 69 74 69 62 6c 65 2c 20 61  t inheritible, a
24c0: 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6f 72 69  nd close the ori
24d0: 67 69 6e 61 6c 2e 0a 20 20 20 20 20 2a 2f 0a 0a  ginal..     */..
24e0: 20 20 20 20 44 75 70 6c 69 63 61 74 65 48 61 6e      DuplicateHan
24f0: 64 6c 65 28 68 50 72 6f 63 65 73 73 2c 20 68 2c  dle(hProcess, h,
2500: 20 68 50 72 6f 63 65 73 73 2c 20 26 73 69 2e 68   hProcess, &si.h
2510: 53 74 64 4f 75 74 70 75 74 2c 20 30 2c 20 54 52  StdOutput, 0, TR
2520: 55 45 2c 0a 09 20 20 20 20 44 55 50 4c 49 43 41  UE,..    DUPLICA
2530: 54 45 5f 53 41 4d 45 5f 41 43 43 45 53 53 20 7c  TE_SAME_ACCESS |
2540: 20 44 55 50 4c 49 43 41 54 45 5f 43 4c 4f 53 45   DUPLICATE_CLOSE
2550: 5f 53 4f 55 52 43 45 29 3b 0a 0a 20 20 20 20 2f  _SOURCE);..    /
2560: 2a 0a 20 20 20 20 20 2a 20 53 61 6d 65 20 61 73  *.     * Same as
2570: 20 61 62 6f 76 65 2c 20 62 75 74 20 66 6f 72 20   above, but for 
2580: 74 68 65 20 65 72 72 6f 72 20 73 69 64 65 2e 0a  the error side..
2590: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 43 72 65       */..    Cre
25a0: 61 74 65 50 69 70 65 28 26 45 72 72 2e 70 69 70  atePipe(&Err.pip
25b0: 65 2c 20 26 68 2c 20 26 73 61 2c 20 30 29 3b 0a  e, &h, &sa, 0);.
25c0: 20 20 20 20 44 75 70 6c 69 63 61 74 65 48 61 6e      DuplicateHan
25d0: 64 6c 65 28 68 50 72 6f 63 65 73 73 2c 20 68 2c  dle(hProcess, h,
25e0: 20 68 50 72 6f 63 65 73 73 2c 20 26 73 69 2e 68   hProcess, &si.h
25f0: 53 74 64 45 72 72 6f 72 2c 20 30 2c 20 54 52 55  StdError, 0, TRU
2600: 45 2c 0a 09 20 20 20 20 44 55 50 4c 49 43 41 54  E,..    DUPLICAT
2610: 45 5f 53 41 4d 45 5f 41 43 43 45 53 53 20 7c 20  E_SAME_ACCESS | 
2620: 44 55 50 4c 49 43 41 54 45 5f 43 4c 4f 53 45 5f  DUPLICATE_CLOSE_
2630: 53 4f 55 52 43 45 29 3b 0a 0a 20 20 20 20 2f 2a  SOURCE);..    /*
2640: 0a 20 20 20 20 20 2a 20 42 61 73 65 20 63 6f 6d  .     * Base com
2650: 6d 61 6e 64 20 6c 69 6e 65 2e 0a 20 20 20 20 20  mand line..     
2660: 2a 2f 0a 0a 20 20 20 20 6c 73 74 72 63 70 79 28  */..    lstrcpy(
2670: 63 6d 64 6c 69 6e 65 2c 20 22 6c 69 6e 6b 2e 65  cmdline, "link.e
2680: 78 65 20 2d 6e 6f 6c 6f 67 6f 20 22 29 3b 0a 0a  xe -nologo ");..
2690: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 70      /*.     * Ap
26a0: 70 65 6e 64 20 6f 75 72 20 6f 70 74 69 6f 6e 20  pend our option 
26b0: 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 20 20 20  for testing..   
26c0: 20 20 2a 2f 0a 0a 20 20 20 20 6c 73 74 72 63 61    */..    lstrca
26d0: 74 28 63 6d 64 6c 69 6e 65 2c 20 6f 70 74 69 6f  t(cmdline, optio
26e0: 6e 29 3b 0a 0a 20 20 20 20 6f 6b 20 3d 20 43 72  n);..    ok = Cr
26f0: 65 61 74 65 50 72 6f 63 65 73 73 28 0a 09 20 20  eateProcess(..  
2700: 20 20 4e 55 4c 4c 2c 09 20 20 20 20 2f 2a 20 4d    NULL,.    /* M
2710: 6f 64 75 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a 09  odule name. */..
2720: 20 20 20 20 63 6d 64 6c 69 6e 65 2c 09 20 20 20      cmdline,.   
2730: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 6c 69 6e 65   /* Command line
2740: 2e 20 2a 2f 0a 09 20 20 20 20 4e 55 4c 4c 2c 09  . */..    NULL,.
2750: 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 68      /* Process h
2760: 61 6e 64 6c 65 20 6e 6f 74 20 69 6e 68 65 72 69  andle not inheri
2770: 74 61 62 6c 65 2e 20 2a 2f 0a 09 20 20 20 20 4e  table. */..    N
2780: 55 4c 4c 2c 09 20 20 20 20 2f 2a 20 54 68 72 65  ULL,.    /* Thre
2790: 61 64 20 68 61 6e 64 6c 65 20 6e 6f 74 20 69 6e  ad handle not in
27a0: 68 65 72 69 74 61 62 6c 65 2e 20 2a 2f 0a 09 20  heritable. */.. 
27b0: 20 20 20 54 52 55 45 2c 09 20 20 20 20 2f 2a 20     TRUE,.    /* 
27c0: 79 65 73 2c 20 69 6e 68 65 72 69 74 20 68 61 6e  yes, inherit han
27d0: 64 6c 65 73 2e 20 2a 2f 0a 09 20 20 20 20 44 45  dles. */..    DE
27e0: 54 41 43 48 45 44 5f 50 52 4f 43 45 53 53 2c 20  TACHED_PROCESS, 
27f0: 2f 2a 20 4e 6f 20 63 6f 6e 73 6f 6c 65 20 66 6f  /* No console fo
2800: 72 20 79 6f 75 2e 20 2a 2f 0a 09 20 20 20 20 4e  r you. */..    N
2810: 55 4c 4c 2c 09 20 20 20 20 2f 2a 20 55 73 65 20  ULL,.    /* Use 
2820: 70 61 72 65 6e 74 27 73 20 65 6e 76 69 72 6f 6e  parent's environ
2830: 6d 65 6e 74 20 62 6c 6f 63 6b 2e 20 2a 2f 0a 09  ment block. */..
2840: 20 20 20 20 4e 55 4c 4c 2c 09 20 20 20 20 2f 2a      NULL,.    /*
2850: 20 55 73 65 20 70 61 72 65 6e 74 27 73 20 73 74   Use parent's st
2860: 61 72 74 69 6e 67 20 64 69 72 65 63 74 6f 72 79  arting directory
2870: 2e 20 2a 2f 0a 09 20 20 20 20 26 73 69 2c 09 20  . */..    &si,. 
2880: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2890: 20 53 54 41 52 54 55 50 49 4e 46 4f 20 73 74 72   STARTUPINFO str
28a0: 75 63 74 75 72 65 2e 20 2a 2f 0a 09 20 20 20 20  ucture. */..    
28b0: 26 70 69 29 3b 09 20 20 20 20 2f 2a 20 50 6f 69  &pi);.    /* Poi
28c0: 6e 74 65 72 20 74 6f 20 50 52 4f 43 45 53 53 5f  nter to PROCESS_
28d0: 49 4e 46 4f 52 4d 41 54 49 4f 4e 20 73 74 72 75  INFORMATION stru
28e0: 63 74 75 72 65 2e 20 2a 2f 0a 0a 20 20 20 20 69  cture. */..    i
28f0: 66 20 28 21 6f 6b 29 20 7b 0a 09 44 57 4f 52 44  f (!ok) {..DWORD
2900: 20 65 72 72 20 3d 20 47 65 74 4c 61 73 74 45 72   err = GetLastEr
2910: 72 6f 72 28 29 3b 0a 09 69 6e 74 20 63 68 61 72  ror();..int char
2920: 73 20 3d 20 73 6e 70 72 69 6e 74 66 28 6d 73 67  s = snprintf(msg
2930: 2c 20 73 69 7a 65 6f 66 28 6d 73 67 29 20 2d 20  , sizeof(msg) - 
2940: 31 2c 0a 09 09 22 54 72 69 65 64 20 74 6f 20 6c  1,..."Tried to l
2950: 61 75 6e 63 68 3a 20 5c 22 25 73 5c 22 2c 20 62  aunch: \"%s\", b
2960: 75 74 20 67 6f 74 20 65 72 72 6f 72 20 5b 25 75  ut got error [%u
2970: 5d 3a 20 22 2c 20 63 6d 64 6c 69 6e 65 2c 20 65  ]: ", cmdline, e
2980: 72 72 29 3b 0a 0a 09 46 6f 72 6d 61 74 4d 65 73  rr);...FormatMes
2990: 73 61 67 65 28 46 4f 52 4d 41 54 5f 4d 45 53 53  sage(FORMAT_MESS
29a0: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 7c  AGE_FROM_SYSTEM|
29b0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
29c0: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 7c 0a 09  GNORE_INSERTS|..
29d0: 09 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  .FORMAT_MESSAGE_
29e0: 4d 41 58 5f 57 49 44 54 48 5f 4d 41 53 4b 2c 20  MAX_WIDTH_MASK, 
29f0: 30 4c 2c 20 65 72 72 2c 20 30 2c 20 28 4c 50 56  0L, err, 0, (LPV
2a00: 4f 49 44 29 26 6d 73 67 5b 63 68 61 72 73 5d 2c  OID)&msg[chars],
2a10: 0a 09 09 28 33 30 30 2d 63 68 61 72 73 29 2c 20  ...(300-chars), 
2a20: 30 29 3b 0a 09 57 72 69 74 65 46 69 6c 65 28 47  0);..WriteFile(G
2a30: 65 74 53 74 64 48 61 6e 64 6c 65 28 53 54 44 5f  etStdHandle(STD_
2a40: 45 52 52 4f 52 5f 48 41 4e 44 4c 45 29 2c 20 6d  ERROR_HANDLE), m
2a50: 73 67 2c 20 6c 73 74 72 6c 65 6e 28 6d 73 67 29  sg, lstrlen(msg)
2a60: 2c 20 26 65 72 72 2c 4e 55 4c 4c 29 3b 0a 09 72  , &err,NULL);..r
2a70: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 0a  eturn 2;.    }..
2a80: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6c      /*.     * Cl
2a90: 6f 73 65 20 6f 75 72 20 72 65 66 65 72 65 6e 63  ose our referenc
2aa0: 65 73 20 74 6f 20 74 68 65 20 77 72 69 74 65 20  es to the write 
2ab0: 68 61 6e 64 6c 65 73 20 74 68 61 74 20 68 61 76  handles that hav
2ac0: 65 20 6e 6f 77 20 62 65 65 6e 20 69 6e 68 65 72  e now been inher
2ad0: 69 74 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  ited..     */.. 
2ae0: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73     CloseHandle(s
2af0: 69 2e 68 53 74 64 4f 75 74 70 75 74 29 3b 0a 20  i.hStdOutput);. 
2b00: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73     CloseHandle(s
2b10: 69 2e 68 53 74 64 45 72 72 6f 72 29 3b 0a 0a 20  i.hStdError);.. 
2b20: 20 20 20 57 61 69 74 46 6f 72 49 6e 70 75 74 49     WaitForInputI
2b30: 64 6c 65 28 70 69 2e 68 50 72 6f 63 65 73 73 2c  dle(pi.hProcess,
2b40: 20 35 30 30 30 29 3b 0a 20 20 20 20 43 6c 6f 73   5000);.    Clos
2b50: 65 48 61 6e 64 6c 65 28 70 69 2e 68 54 68 72 65  eHandle(pi.hThre
2b60: 61 64 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ad);..    /*.   
2b70: 20 20 2a 20 53 74 61 72 74 20 74 68 65 20 70 69    * Start the pi
2b80: 70 65 20 72 65 61 64 65 72 20 74 68 72 65 61 64  pe reader thread
2b90: 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  s..     */..    
2ba0: 70 69 70 65 54 68 72 65 61 64 73 5b 30 5d 20 3d  pipeThreads[0] =
2bb0: 20 43 72 65 61 74 65 54 68 72 65 61 64 28 4e 55   CreateThread(NU
2bc0: 4c 4c 2c 20 30 2c 20 52 65 61 64 46 72 6f 6d 50  LL, 0, ReadFromP
2bd0: 69 70 65 2c 20 26 4f 75 74 2c 20 30 2c 20 26 74  ipe, &Out, 0, &t
2be0: 68 72 65 61 64 49 44 29 3b 0a 20 20 20 20 70 69  hreadID);.    pi
2bf0: 70 65 54 68 72 65 61 64 73 5b 31 5d 20 3d 20 43  peThreads[1] = C
2c00: 72 65 61 74 65 54 68 72 65 61 64 28 4e 55 4c 4c  reateThread(NULL
2c10: 2c 20 30 2c 20 52 65 61 64 46 72 6f 6d 50 69 70  , 0, ReadFromPip
2c20: 65 2c 20 26 45 72 72 2c 20 30 2c 20 26 74 68 72  e, &Err, 0, &thr
2c30: 65 61 64 49 44 29 3b 0a 0a 20 20 20 20 2f 2a 0a  eadID);..    /*.
2c40: 20 20 20 20 20 2a 20 42 6c 6f 63 6b 20 77 61 69       * Block wai
2c50: 74 69 6e 67 20 66 6f 72 20 74 68 65 20 70 72 6f  ting for the pro
2c60: 63 65 73 73 20 74 6f 20 65 6e 64 2e 0a 20 20 20  cess to end..   
2c70: 20 20 2a 2f 0a 0a 20 20 20 20 57 61 69 74 46 6f    */..    WaitFo
2c80: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 70 69  rSingleObject(pi
2c90: 2e 68 50 72 6f 63 65 73 73 2c 20 49 4e 46 49 4e  .hProcess, INFIN
2ca0: 49 54 45 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48  ITE);.    CloseH
2cb0: 61 6e 64 6c 65 28 70 69 2e 68 50 72 6f 63 65 73  andle(pi.hProces
2cc0: 73 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  s);..    /*.    
2cd0: 20 2a 20 57 61 69 74 20 66 6f 72 20 6f 75 72 20   * Wait for our 
2ce0: 70 69 70 65 20 74 6f 20 67 65 74 20 64 6f 6e 65  pipe to get done
2cf0: 20 72 65 61 64 69 6e 67 2c 20 73 68 6f 75 6c 64   reading, should
2d00: 20 69 74 20 62 65 20 61 20 6c 69 74 74 6c 65 20   it be a little 
2d10: 73 6c 6f 77 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  slow..     */.. 
2d20: 20 20 20 57 61 69 74 46 6f 72 4d 75 6c 74 69 70     WaitForMultip
2d30: 6c 65 4f 62 6a 65 63 74 73 28 32 2c 20 70 69 70  leObjects(2, pip
2d40: 65 54 68 72 65 61 64 73 2c 20 54 52 55 45 2c 20  eThreads, TRUE, 
2d50: 35 30 30 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48  500);.    CloseH
2d60: 61 6e 64 6c 65 28 70 69 70 65 54 68 72 65 61 64  andle(pipeThread
2d70: 73 5b 30 5d 29 3b 0a 20 20 20 20 43 6c 6f 73 65  s[0]);.    Close
2d80: 48 61 6e 64 6c 65 28 70 69 70 65 54 68 72 65 61  Handle(pipeThrea
2d90: 64 73 5b 31 5d 29 3b 0a 0a 20 20 20 20 2f 2a 0a  ds[1]);..    /*.
2da0: 20 20 20 20 20 2a 20 4c 6f 6f 6b 20 66 6f 72 20       * Look for 
2db0: 74 68 65 20 63 6f 6d 6d 61 6e 64 6c 69 6e 65 20  the commandline 
2dc0: 77 61 72 6e 69 6e 67 20 63 6f 64 65 20 69 6e 20  warning code in 
2dd0: 74 68 65 20 73 74 64 65 72 72 20 73 74 72 65 61  the stderr strea
2de0: 6d 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  m..     */..    
2df0: 72 65 74 75 72 6e 20 21 28 73 74 72 73 74 72 28  return !(strstr(
2e00: 4f 75 74 2e 62 75 66 66 65 72 2c 20 22 4c 4e 4b  Out.buffer, "LNK
2e10: 31 31 31 37 22 29 20 21 3d 20 4e 55 4c 4c 20 7c  1117") != NULL |
2e20: 7c 0a 09 20 20 20 20 73 74 72 73 74 72 28 45 72  |..    strstr(Er
2e30: 72 2e 62 75 66 66 65 72 2c 20 22 4c 4e 4b 31 31  r.buffer, "LNK11
2e40: 31 37 22 29 20 21 3d 20 4e 55 4c 4c 20 7c 7c 0a  17") != NULL ||.
2e50: 09 20 20 20 20 73 74 72 73 74 72 28 4f 75 74 2e  .    strstr(Out.
2e60: 62 75 66 66 65 72 2c 20 22 4c 4e 4b 34 30 34 34  buffer, "LNK4044
2e70: 22 29 20 21 3d 20 4e 55 4c 4c 20 7c 7c 0a 09 20  ") != NULL ||.. 
2e80: 20 20 20 73 74 72 73 74 72 28 45 72 72 2e 62 75     strstr(Err.bu
2e90: 66 66 65 72 2c 20 22 4c 4e 4b 34 30 34 34 22 29  ffer, "LNK4044")
2ea0: 20 21 3d 20 4e 55 4c 4c 29 3b 0a 7d 0a 0c 0a 73   != NULL);.}...s
2eb0: 74 61 74 69 63 20 44 57 4f 52 44 20 57 49 4e 41  tatic DWORD WINA
2ec0: 50 49 0a 52 65 61 64 46 72 6f 6d 50 69 70 65 28  PI.ReadFromPipe(
2ed0: 0a 20 20 20 20 4c 50 56 4f 49 44 20 61 72 67 73  .    LPVOID args
2ee0: 29 0a 7b 0a 20 20 20 20 70 69 70 65 69 6e 66 6f  ).{.    pipeinfo
2ef0: 20 2a 70 69 20 3d 20 28 70 69 70 65 69 6e 66 6f   *pi = (pipeinfo
2f00: 20 2a 29 20 61 72 67 73 3b 0a 20 20 20 20 63 68   *) args;.    ch
2f10: 61 72 20 2a 6c 61 73 74 42 75 66 20 3d 20 70 69  ar *lastBuf = pi
2f20: 2d 3e 62 75 66 66 65 72 3b 0a 20 20 20 20 44 57  ->buffer;.    DW
2f30: 4f 52 44 20 64 77 52 65 61 64 3b 0a 20 20 20 20  ORD dwRead;.    
2f40: 42 4f 4f 4c 20 6f 6b 3b 0a 0a 20 20 61 67 61 69  BOOL ok;..  agai
2f50: 6e 3a 0a 20 20 20 20 69 66 20 28 6c 61 73 74 42  n:.    if (lastB
2f60: 75 66 20 2d 20 70 69 2d 3e 62 75 66 66 65 72 20  uf - pi->buffer 
2f70: 2b 20 43 48 55 4e 4b 20 3e 20 53 54 41 54 49 43  + CHUNK > STATIC
2f80: 42 55 46 46 45 52 53 49 5a 45 29 20 7b 0a 09 43  BUFFERSIZE) {..C
2f90: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 69 2d 3e 70  loseHandle(pi->p
2fa0: 69 70 65 29 3b 0a 09 72 65 74 75 72 6e 20 28 44  ipe);..return (D
2fb0: 57 4f 52 44 29 2d 31 3b 0a 20 20 20 20 7d 0a 20  WORD)-1;.    }. 
2fc0: 20 20 20 6f 6b 20 3d 20 52 65 61 64 46 69 6c 65     ok = ReadFile
2fd0: 28 70 69 2d 3e 70 69 70 65 2c 20 6c 61 73 74 42  (pi->pipe, lastB
2fe0: 75 66 2c 20 43 48 55 4e 4b 2c 20 26 64 77 52 65  uf, CHUNK, &dwRe
2ff0: 61 64 2c 20 30 4c 29 3b 0a 20 20 20 20 69 66 20  ad, 0L);.    if 
3000: 28 21 6f 6b 20 7c 7c 20 64 77 52 65 61 64 20 3d  (!ok || dwRead =
3010: 3d 20 30 29 20 7b 0a 09 43 6c 6f 73 65 48 61 6e  = 0) {..CloseHan
3020: 64 6c 65 28 70 69 2d 3e 70 69 70 65 29 3b 0a 09  dle(pi->pipe);..
3030: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
3040: 20 20 20 20 6c 61 73 74 42 75 66 20 2b 3d 20 64      lastBuf += d
3050: 77 52 65 61 64 3b 0a 20 20 20 20 67 6f 74 6f 20  wRead;.    goto 
3060: 61 67 61 69 6e 3b 0a 0a 20 20 20 20 72 65 74 75  again;..    retu
3070: 72 6e 20 30 3b 20 20 2f 2a 20 6d 61 6b 65 73 20  rn 0;  /* makes 
3080: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 68 61 70  the compiler hap
3090: 70 79 20 2a 2f 0a 7d 0a 0c 0a 73 74 61 74 69 63  py */.}...static
30a0: 20 69 6e 74 0a 49 73 49 6e 28 0a 20 20 20 20 63   int.IsIn(.    c
30b0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 72 69 6e  onst char *strin
30c0: 67 2c 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  g,.    const cha
30d0: 72 20 2a 73 75 62 73 74 72 69 6e 67 29 0a 7b 0a  r *substring).{.
30e0: 20 20 20 20 72 65 74 75 72 6e 20 28 73 74 72 73      return (strs
30f0: 74 72 28 73 74 72 69 6e 67 2c 20 73 75 62 73 74  tr(string, subst
3100: 72 69 6e 67 29 20 21 3d 20 4e 55 4c 4c 29 3b 0a  ring) != NULL);.
3110: 7d 0a 0c 0a 2f 2a 0a 20 2a 20 47 65 74 56 65 72  }.../*. * GetVer
3120: 73 69 6f 6e 46 72 6f 6d 46 69 6c 65 20 2d 2d 0a  sionFromFile --.
3130: 20 2a 20 09 4c 6f 6f 6b 73 20 66 6f 72 20 61 20   * .Looks for a 
3140: 6d 61 74 63 68 20 73 74 72 69 6e 67 20 69 6e 20  match string in 
3150: 61 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20  a file and then 
3160: 72 65 74 75 72 6e 73 20 74 68 65 20 76 65 72 73  returns the vers
3170: 69 6f 6e 0a 20 2a 20 09 66 6f 6c 6c 6f 77 69 6e  ion. * .followin
3180: 67 20 74 68 65 20 6d 61 74 63 68 20 77 68 65 72  g the match wher
3190: 65 20 61 20 76 65 72 73 69 6f 6e 20 69 73 20 61  e a version is a
31a0: 6e 79 74 68 69 6e 67 20 61 63 63 65 70 74 61 62  nything acceptab
31b0: 6c 65 20 74 6f 0a 20 2a 20 09 70 61 63 6b 61 67  le to. * .packag
31c0: 65 20 70 72 6f 76 69 64 65 20 6f 72 20 70 61 63  e provide or pac
31d0: 6b 61 67 65 20 69 66 6e 65 65 64 65 64 2e 0a 20  kage ifneeded.. 
31e0: 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  */..static const
31f0: 20 63 68 61 72 20 2a 0a 47 65 74 56 65 72 73 69   char *.GetVersi
3200: 6f 6e 46 72 6f 6d 46 69 6c 65 28 0a 20 20 20 20  onFromFile(.    
3210: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
3220: 6e 61 6d 65 2c 0a 20 20 20 20 63 6f 6e 73 74 20  name,.    const 
3230: 63 68 61 72 20 2a 6d 61 74 63 68 29 0a 7b 0a 20  char *match).{. 
3240: 20 20 20 73 69 7a 65 5f 74 20 63 62 42 75 66 66     size_t cbBuff
3250: 65 72 20 3d 20 31 30 30 3b 0a 20 20 20 20 73 74  er = 100;.    st
3260: 61 74 69 63 20 63 68 61 72 20 73 7a 42 75 66 66  atic char szBuff
3270: 65 72 5b 31 30 30 5d 3b 0a 20 20 20 20 63 68 61  er[100];.    cha
3280: 72 20 2a 73 7a 52 65 73 75 6c 74 20 3d 20 4e 55  r *szResult = NU
3290: 4c 4c 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66 70  LL;.    FILE *fp
32a0: 20 3d 20 66 6f 70 65 6e 28 66 69 6c 65 6e 61 6d   = fopen(filenam
32b0: 65 2c 20 22 72 74 22 29 3b 0a 0a 20 20 20 20 69  e, "rt");..    i
32c0: 66 20 28 66 70 20 21 3d 20 4e 55 4c 4c 29 20 7b  f (fp != NULL) {
32d0: 0a 09 2f 2a 0a 09 20 2a 20 52 65 61 64 20 64 61  ../*.. * Read da
32e0: 74 61 20 75 6e 74 69 6c 20 77 65 20 73 65 65 20  ta until we see 
32f0: 6f 75 72 20 6d 61 74 63 68 20 73 74 72 69 6e 67  our match string
3300: 2e 0a 09 20 2a 2f 0a 0a 09 77 68 69 6c 65 20 28  ... */...while (
3310: 66 67 65 74 73 28 73 7a 42 75 66 66 65 72 2c 20  fgets(szBuffer, 
3320: 63 62 42 75 66 66 65 72 2c 20 66 70 29 20 21 3d  cbBuffer, fp) !=
3330: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 50   NULL) {..    LP
3340: 53 54 52 20 70 2c 20 71 3b 0a 0a 09 20 20 20 20  STR p, q;...    
3350: 70 20 3d 20 73 74 72 73 74 72 28 73 7a 42 75 66  p = strstr(szBuf
3360: 66 65 72 2c 20 6d 61 74 63 68 29 3b 0a 09 20 20  fer, match);..  
3370: 20 20 69 66 20 28 70 20 21 3d 20 4e 55 4c 4c 29    if (p != NULL)
3380: 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 53 6b 69   {.../*... * Ski
3390: 70 20 74 6f 20 66 69 72 73 74 20 64 69 67 69 74  p to first digit
33a0: 2e 0a 09 09 20 2a 2f 0a 0a 09 09 77 68 69 6c 65  .... */....while
33b0: 20 28 2a 70 20 26 26 20 21 69 73 64 69 67 69 74   (*p && !isdigit
33c0: 28 2a 70 29 29 20 7b 0a 09 09 20 20 20 20 2b 2b  (*p)) {...    ++
33d0: 70 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 0a 09 09 20  p;...}..../*... 
33e0: 2a 20 46 69 6e 64 20 65 6e 64 69 6e 67 20 77 68  * Find ending wh
33f0: 69 74 65 73 70 61 63 65 2e 0a 09 09 20 2a 2f 0a  itespace.... */.
3400: 0a 09 09 71 20 3d 20 70 3b 0a 09 09 77 68 69 6c  ...q = p;...whil
3410: 65 20 28 2a 71 20 26 26 20 28 69 73 61 6c 6e 75  e (*q && (isalnu
3420: 6d 28 2a 71 29 20 7c 7c 20 2a 71 20 3d 3d 20 27  m(*q) || *q == '
3430: 2e 27 29 29 20 7b 0a 09 09 20 20 20 20 2b 2b 71  .')) {...    ++q
3440: 3b 0a 09 09 7d 0a 0a 09 09 6d 65 6d 63 70 79 28  ;...}....memcpy(
3450: 73 7a 42 75 66 66 65 72 2c 20 70 2c 20 71 20 2d  szBuffer, p, q -
3460: 20 70 29 3b 0a 09 09 73 7a 42 75 66 66 65 72 5b   p);...szBuffer[
3470: 71 2d 70 5d 20 3d 20 30 3b 0a 09 09 73 7a 52 65  q-p] = 0;...szRe
3480: 73 75 6c 74 20 3d 20 73 7a 42 75 66 66 65 72 3b  sult = szBuffer;
3490: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d  ...break;..    }
34a0: 0a 09 7d 0a 09 66 63 6c 6f 73 65 28 66 70 29 3b  ..}..fclose(fp);
34b0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
34c0: 6e 20 73 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0c 0a  n szResult;.}...
34d0: 2f 2a 0a 20 2a 20 4c 69 73 74 20 68 65 6c 70 65  /*. * List helpe
34e0: 72 73 20 66 6f 72 20 74 68 65 20 53 75 62 73 74  rs for the Subst
34f0: 69 74 75 74 65 46 69 6c 65 20 66 75 6e 63 74 69  ituteFile functi
3500: 6f 6e 0a 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20  on. */..typedef 
3510: 73 74 72 75 63 74 20 6c 69 73 74 5f 69 74 65 6d  struct list_item
3520: 5f 74 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20  _t {.    struct 
3530: 6c 69 73 74 5f 69 74 65 6d 5f 74 20 2a 6e 65 78  list_item_t *nex
3540: 74 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a  tPtr;.    char *
3550: 20 6b 65 79 3b 0a 20 20 20 20 63 68 61 72 20 2a   key;.    char *
3560: 20 76 61 6c 75 65 3b 0a 7d 20 6c 69 73 74 5f 69   value;.} list_i
3570: 74 65 6d 5f 74 3b 0a 0a 2f 2a 20 69 6e 73 65 72  tem_t;../* inser
3580: 74 20 61 20 6c 69 73 74 20 69 74 65 6d 20 69 6e  t a list item in
3590: 74 6f 20 74 68 65 20 6c 69 73 74 20 28 6c 69 73  to the list (lis
35a0: 74 20 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a  t may be null) *
35b0: 2f 0a 73 74 61 74 69 63 20 6c 69 73 74 5f 69 74  /.static list_it
35c0: 65 6d 5f 74 20 2a 0a 6c 69 73 74 5f 69 6e 73 65  em_t *.list_inse
35d0: 72 74 28 6c 69 73 74 5f 69 74 65 6d 5f 74 20 2a  rt(list_item_t *
35e0: 2a 6c 69 73 74 50 74 72 50 74 72 2c 20 63 6f 6e  *listPtrPtr, con
35f0: 73 74 20 63 68 61 72 20 2a 6b 65 79 2c 20 63 6f  st char *key, co
3600: 6e 73 74 20 63 68 61 72 20 2a 76 61 6c 75 65 29  nst char *value)
3610: 0a 7b 0a 20 20 20 20 6c 69 73 74 5f 69 74 65 6d  .{.    list_item
3620: 5f 74 20 2a 69 74 65 6d 50 74 72 20 3d 20 6d 61  _t *itemPtr = ma
3630: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 6c 69 73 74  lloc(sizeof(list
3640: 5f 69 74 65 6d 5f 74 29 29 3b 0a 20 20 20 20 69  _item_t));.    i
3650: 66 20 28 69 74 65 6d 50 74 72 29 20 7b 0a 09 69  f (itemPtr) {..i
3660: 74 65 6d 50 74 72 2d 3e 6b 65 79 20 3d 20 73 74  temPtr->key = st
3670: 72 64 75 70 28 6b 65 79 29 3b 0a 09 69 74 65 6d  rdup(key);..item
3680: 50 74 72 2d 3e 76 61 6c 75 65 20 3d 20 73 74 72  Ptr->value = str
3690: 64 75 70 28 76 61 6c 75 65 29 3b 0a 09 69 74 65  dup(value);..ite
36a0: 6d 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20  mPtr->nextPtr = 
36b0: 4e 55 4c 4c 3b 0a 0a 09 77 68 69 6c 65 28 2a 6c  NULL;...while(*l
36c0: 69 73 74 50 74 72 50 74 72 29 20 7b 0a 09 20 20  istPtrPtr) {..  
36d0: 20 20 6c 69 73 74 50 74 72 50 74 72 20 3d 20 26    listPtrPtr = &
36e0: 28 2a 6c 69 73 74 50 74 72 50 74 72 29 2d 3e 6e  (*listPtrPtr)->n
36f0: 65 78 74 50 74 72 3b 0a 09 7d 0a 09 2a 6c 69 73  extPtr;..}..*lis
3700: 74 50 74 72 50 74 72 20 3d 20 69 74 65 6d 50 74  tPtrPtr = itemPt
3710: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  r;.    }.    ret
3720: 75 72 6e 20 69 74 65 6d 50 74 72 3b 0a 7d 0a 0a  urn itemPtr;.}..
3730: 73 74 61 74 69 63 20 76 6f 69 64 0a 6c 69 73 74  static void.list
3740: 5f 66 72 65 65 28 6c 69 73 74 5f 69 74 65 6d 5f  _free(list_item_
3750: 74 20 2a 2a 6c 69 73 74 50 74 72 50 74 72 29 0a  t **listPtrPtr).
3760: 7b 0a 20 20 20 20 6c 69 73 74 5f 69 74 65 6d 5f  {.    list_item_
3770: 74 20 2a 74 6d 70 50 74 72 2c 20 2a 6c 69 73 74  t *tmpPtr, *list
3780: 50 74 72 20 3d 20 2a 6c 69 73 74 50 74 72 50 74  Ptr = *listPtrPt
3790: 72 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 6c 69  r;.    while (li
37a0: 73 74 50 74 72 29 20 7b 0a 09 74 6d 70 50 74 72  stPtr) {..tmpPtr
37b0: 20 3d 20 6c 69 73 74 50 74 72 3b 0a 09 6c 69 73   = listPtr;..lis
37c0: 74 50 74 72 20 3d 20 6c 69 73 74 50 74 72 2d 3e  tPtr = listPtr->
37d0: 6e 65 78 74 50 74 72 3b 0a 09 66 72 65 65 28 74  nextPtr;..free(t
37e0: 6d 70 50 74 72 2d 3e 6b 65 79 29 3b 0a 09 66 72  mpPtr->key);..fr
37f0: 65 65 28 74 6d 70 50 74 72 2d 3e 76 61 6c 75 65  ee(tmpPtr->value
3800: 29 3b 0a 09 66 72 65 65 28 74 6d 70 50 74 72 29  );..free(tmpPtr)
3810: 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20  ;.    }.}.../*. 
3820: 2a 20 53 75 62 73 74 69 74 75 74 65 46 69 6c 65  * SubstituteFile
3830: 20 2d 2d 0a 20 2a 09 41 73 20 77 69 6e 64 6f 77   --. *.As window
3840: 73 20 64 6f 65 73 6e 27 74 20 70 72 6f 76 69 64  s doesn't provid
3850: 65 20 61 6e 79 74 68 69 6e 67 20 75 73 65 66 75  e anything usefu
3860: 6c 20 6c 69 6b 65 20 73 65 64 20 61 6e 64 20 69  l like sed and i
3870: 74 27 73 20 75 6e 72 65 6c 69 61 62 6c 65 0a 20  t's unreliable. 
3880: 2a 09 74 6f 20 75 73 65 20 74 68 65 20 74 63 6c  *.to use the tcl
3890: 73 68 20 79 6f 75 20 61 72 65 20 62 75 69 6c 64  sh you are build
38a0: 69 6e 67 20 61 67 61 69 6e 73 74 20 28 63 6f 6e  ing against (con
38b0: 73 69 64 65 72 20 78 2d 70 6c 61 74 66 6f 72 6d  sider x-platform
38c0: 20 62 75 69 6c 64 73 20 2d 0a 20 2a 09 65 67 20   builds -. *.eg 
38d0: 63 6f 6d 70 69 6c 69 6e 67 20 41 4d 44 36 34 20  compiling AMD64 
38e0: 74 61 72 67 65 74 20 66 72 6f 6d 20 49 58 38 36  target from IX86
38f0: 29 20 77 65 20 70 72 6f 76 69 64 65 20 61 20 73  ) we provide a s
3900: 69 6d 70 6c 65 20 73 75 62 73 74 69 74 75 74 69  imple substituti
3910: 6f 6e 0a 20 2a 09 6f 70 74 69 6f 6e 20 68 65 72  on. *.option her
3920: 65 20 74 6f 20 68 61 6e 64 6c 65 20 61 75 74 6f  e to handle auto
3930: 63 6f 6e 66 20 73 74 79 6c 65 20 73 75 62 73 74  conf style subst
3940: 69 74 75 74 69 6f 6e 73 2e 0a 20 2a 09 54 68 65  itutions.. *.The
3950: 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 66 69   substitution fi
3960: 6c 65 20 69 73 20 77 68 69 74 65 73 70 61 63 65  le is whitespace
3970: 20 61 6e 64 20 6c 69 6e 65 20 64 65 6c 69 6d 69   and line delimi
3980: 74 65 64 2e 20 54 68 65 20 66 69 6c 65 20 73 68  ted. The file sh
3990: 6f 75 6c 64 0a 20 2a 09 63 6f 6e 73 69 73 74 20  ould. *.consist 
39a0: 6f 66 20 6c 69 6e 65 73 20 6d 61 74 63 68 69 6e  of lines matchin
39b0: 67 20 74 68 65 20 72 65 67 75 6c 61 72 20 65 78  g the regular ex
39c0: 70 72 65 73 73 69 6f 6e 3a 0a 20 2a 09 20 20 5c  pression:. *.  \
39d0: 73 2a 5c 53 2b 5c 73 2b 5c 53 2a 24 0a 20 2a 0a  s*\S+\s+\S*$. *.
39e0: 20 2a 09 55 73 61 67 65 20 69 73 20 73 6f 6d 65   *.Usage is some
39f0: 74 68 69 6e 67 20 6c 69 6b 65 3a 0a 20 2a 09 20  thing like:. *. 
3a00: 20 6e 6d 61 6b 65 68 6c 70 20 2d 53 20 3c 3c 20   nmakehlp -S << 
3a10: 24 2a 2a 20 3e 20 24 40 0a 20 2a 20 20 20 20 20  $** > $@. *     
3a20: 20 20 20 40 50 41 43 4b 41 47 45 5f 4e 41 4d 45     @PACKAGE_NAME
3a30: 40 20 24 28 50 41 43 4b 41 47 45 5f 4e 41 4d 45  @ $(PACKAGE_NAME
3a40: 29 0a 20 2a 20 20 20 20 20 20 20 20 40 50 41 43  ). *        @PAC
3a50: 4b 41 47 45 5f 56 45 52 53 49 4f 4e 40 20 24 28  KAGE_VERSION@ $(
3a60: 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
3a70: 0a 20 2a 20 20 20 20 20 20 20 20 3c 3c 0a 20 2a  . *        <<. *
3a80: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 75  /..static int.Su
3a90: 62 73 74 69 74 75 74 65 46 69 6c 65 28 0a 20 20  bstituteFile(.  
3aa0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 75    const char *su
3ab0: 62 73 74 69 74 75 74 69 6f 6e 73 2c 0a 20 20 20  bstitutions,.   
3ac0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
3ad0: 65 6e 61 6d 65 29 0a 7b 0a 20 20 20 20 73 69 7a  ename).{.    siz
3ae0: 65 5f 74 20 63 62 42 75 66 66 65 72 20 3d 20 31  e_t cbBuffer = 1
3af0: 30 32 34 3b 0a 20 20 20 20 73 74 61 74 69 63 20  024;.    static 
3b00: 63 68 61 72 20 73 7a 42 75 66 66 65 72 5b 31 30  char szBuffer[10
3b10: 32 34 5d 2c 20 73 7a 43 6f 70 79 5b 31 30 32 34  24], szCopy[1024
3b20: 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 7a 52  ];.    char *szR
3b30: 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20  esult = NULL;.  
3b40: 20 20 6c 69 73 74 5f 69 74 65 6d 5f 74 20 2a 73    list_item_t *s
3b50: 75 62 73 74 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a  ubstPtr = NULL;.
3b60: 20 20 20 20 46 49 4c 45 20 2a 66 70 2c 20 2a 73      FILE *fp, *s
3b70: 70 3b 0a 0a 20 20 20 20 66 70 20 3d 20 66 6f 70  p;..    fp = fop
3b80: 65 6e 28 66 69 6c 65 6e 61 6d 65 2c 20 22 72 74  en(filename, "rt
3b90: 22 29 3b 0a 20 20 20 20 69 66 20 28 66 70 20 21  ");.    if (fp !
3ba0: 3d 20 4e 55 4c 4c 29 20 7b 0a 0a 09 2f 2a 0a 09  = NULL) {.../*..
3bb0: 20 2a 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20   * Build a list 
3bc0: 6f 66 20 73 75 62 73 74 75 74 69 74 69 6f 6e 73  of substutitions
3bd0: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
3be0: 66 69 6c 65 6e 61 6d 65 0a 09 20 2a 2f 0a 0a 09  filename.. */...
3bf0: 73 70 20 3d 20 66 6f 70 65 6e 28 73 75 62 73 74  sp = fopen(subst
3c00: 69 74 75 74 69 6f 6e 73 2c 20 22 72 74 22 29 3b  itutions, "rt");
3c10: 0a 09 69 66 20 28 73 70 20 21 3d 20 4e 55 4c 4c  ..if (sp != NULL
3c20: 29 20 7b 0a 09 20 20 20 20 77 68 69 6c 65 20 28  ) {..    while (
3c30: 66 67 65 74 73 28 73 7a 42 75 66 66 65 72 2c 20  fgets(szBuffer, 
3c40: 63 62 42 75 66 66 65 72 2c 20 73 70 29 20 21 3d  cbBuffer, sp) !=
3c50: 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 68 61 72 20   NULL) {...char 
3c60: 2a 6b 73 2c 20 2a 6b 65 2c 20 2a 76 73 2c 20 2a  *ks, *ke, *vs, *
3c70: 76 65 3b 0a 09 09 6b 73 20 3d 20 73 7a 42 75 66  ve;...ks = szBuf
3c80: 66 65 72 3b 0a 09 09 77 68 69 6c 65 20 28 6b 73  fer;...while (ks
3c90: 20 26 26 20 2a 6b 73 20 26 26 20 69 73 73 70 61   && *ks && isspa
3ca0: 63 65 28 2a 6b 73 29 29 20 2b 2b 6b 73 3b 0a 09  ce(*ks)) ++ks;..
3cb0: 09 6b 65 20 3d 20 6b 73 3b 0a 09 09 77 68 69 6c  .ke = ks;...whil
3cc0: 65 20 28 6b 65 20 26 26 20 2a 6b 65 20 26 26 20  e (ke && *ke && 
3cd0: 21 69 73 73 70 61 63 65 28 2a 6b 65 29 29 20 2b  !isspace(*ke)) +
3ce0: 2b 6b 65 3b 0a 09 09 76 73 20 3d 20 6b 65 3b 0a  +ke;...vs = ke;.
3cf0: 09 09 77 68 69 6c 65 20 28 76 73 20 26 26 20 2a  ..while (vs && *
3d00: 76 73 20 26 26 20 69 73 73 70 61 63 65 28 2a 76  vs && isspace(*v
3d10: 73 29 29 20 2b 2b 76 73 3b 0a 09 09 76 65 20 3d  s)) ++vs;...ve =
3d20: 20 76 73 3b 0a 09 09 77 68 69 6c 65 20 28 76 65   vs;...while (ve
3d30: 20 26 26 20 2a 76 65 20 26 26 20 21 28 2a 76 65   && *ve && !(*ve
3d40: 20 3d 3d 20 27 5c 72 27 20 7c 7c 20 2a 76 65 20   == '\r' || *ve 
3d50: 3d 3d 20 27 5c 6e 27 29 29 20 2b 2b 76 65 3b 0a  == '\n')) ++ve;.
3d60: 09 09 2a 6b 65 20 3d 20 30 2c 20 2a 76 65 20 3d  ..*ke = 0, *ve =
3d70: 20 30 3b 0a 09 09 6c 69 73 74 5f 69 6e 73 65 72   0;...list_inser
3d80: 74 28 26 73 75 62 73 74 50 74 72 2c 20 6b 73 2c  t(&substPtr, ks,
3d90: 20 76 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20   vs);..    }..  
3da0: 20 20 66 63 6c 6f 73 65 28 73 70 29 3b 0a 09 7d    fclose(sp);..}
3db0: 0a 0a 09 2f 2a 20 64 65 62 75 67 3a 20 64 75 6d  .../* debug: dum
3dc0: 70 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 23 69  p the list */.#i
3dd0: 66 64 65 66 20 5f 44 45 42 55 47 0a 09 7b 0a 09  fdef _DEBUG..{..
3de0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 09      int n = 0;..
3df0: 20 20 20 20 6c 69 73 74 5f 69 74 65 6d 5f 74 20      list_item_t 
3e00: 2a 70 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  *p = NULL;..    
3e10: 66 6f 72 20 28 70 20 3d 20 73 75 62 73 74 50 74  for (p = substPt
3e20: 72 3b 20 70 20 21 3d 20 4e 55 4c 4c 3b 20 70 20  r; p != NULL; p 
3e30: 3d 20 70 2d 3e 6e 65 78 74 50 74 72 2c 20 2b 2b  = p->nextPtr, ++
3e40: 6e 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73  n) {...fprintf(s
3e50: 74 64 65 72 72 2c 20 22 25 20 33 64 20 27 25 73  tderr, "% 3d '%s
3e60: 27 20 3d 3e 20 27 25 73 27 5c 6e 22 2c 20 6e 2c  ' => '%s'\n", n,
3e70: 20 70 2d 3e 6b 65 79 2c 20 70 2d 3e 76 61 6c 75   p->key, p->valu
3e80: 65 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 23 65  e);..    }..}.#e
3e90: 6e 64 69 66 0a 09 0a 09 2f 2a 0a 09 20 2a 20 52  ndif..../*.. * R
3ea0: 75 6e 20 74 68 65 20 73 75 62 73 74 69 74 75 74  un the substitut
3eb0: 69 6f 6e 73 20 6f 76 65 72 20 65 61 63 68 20 6c  ions over each l
3ec0: 69 6e 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ine of the input
3ed0: 0a 09 20 2a 2f 0a 09 0a 09 77 68 69 6c 65 20 28  .. */....while (
3ee0: 66 67 65 74 73 28 73 7a 42 75 66 66 65 72 2c 20  fgets(szBuffer, 
3ef0: 63 62 42 75 66 66 65 72 2c 20 66 70 29 20 21 3d  cbBuffer, fp) !=
3f00: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6c 69   NULL) {..    li
3f10: 73 74 5f 69 74 65 6d 5f 74 20 2a 70 20 3d 20 4e  st_item_t *p = N
3f20: 55 4c 4c 3b 0a 09 20 20 20 20 66 6f 72 20 28 70  ULL;..    for (p
3f30: 20 3d 20 73 75 62 73 74 50 74 72 3b 20 70 20 21   = substPtr; p !
3f40: 3d 20 4e 55 4c 4c 3b 20 70 20 3d 20 70 2d 3e 6e  = NULL; p = p->n
3f50: 65 78 74 50 74 72 29 20 7b 0a 09 09 63 68 61 72  extPtr) {...char
3f60: 20 2a 6d 20 3d 20 73 74 72 73 74 72 28 73 7a 42   *m = strstr(szB
3f70: 75 66 66 65 72 2c 20 70 2d 3e 6b 65 79 29 3b 0a  uffer, p->key);.
3f80: 09 09 69 66 20 28 6d 29 20 7b 0a 09 09 20 20 20  ..if (m) {...   
3f90: 20 63 68 61 72 20 2a 63 70 2c 20 2a 6f 70 2c 20   char *cp, *op, 
3fa0: 2a 73 70 3b 0a 09 09 20 20 20 20 63 70 20 3d 20  *sp;...    cp = 
3fb0: 73 7a 43 6f 70 79 3b 0a 09 09 20 20 20 20 6f 70  szCopy;...    op
3fc0: 20 3d 20 73 7a 42 75 66 66 65 72 3b 0a 09 09 20   = szBuffer;... 
3fd0: 20 20 20 77 68 69 6c 65 20 28 6f 70 20 21 3d 20     while (op != 
3fe0: 6d 29 20 2a 63 70 2b 2b 20 3d 20 2a 6f 70 2b 2b  m) *cp++ = *op++
3ff0: 3b 0a 09 09 20 20 20 20 73 70 20 3d 20 70 2d 3e  ;...    sp = p->
4000: 76 61 6c 75 65 3b 0a 09 09 20 20 20 20 77 68 69  value;...    whi
4010: 6c 65 20 28 73 70 20 26 26 20 2a 73 70 29 20 2a  le (sp && *sp) *
4020: 63 70 2b 2b 20 3d 20 2a 73 70 2b 2b 3b 0a 09 09  cp++ = *sp++;...
4030: 20 20 20 20 6f 70 20 2b 3d 20 73 74 72 6c 65 6e      op += strlen
4040: 28 70 2d 3e 6b 65 79 29 3b 0a 09 09 20 20 20 20  (p->key);...    
4050: 77 68 69 6c 65 20 28 2a 6f 70 29 20 2a 63 70 2b  while (*op) *cp+
4060: 2b 20 3d 20 2a 6f 70 2b 2b 3b 0a 09 09 20 20 20  + = *op++;...   
4070: 20 2a 63 70 20 3d 20 30 3b 0a 09 09 20 20 20 20   *cp = 0;...    
4080: 6d 65 6d 63 70 79 28 73 7a 42 75 66 66 65 72 2c  memcpy(szBuffer,
4090: 20 73 7a 43 6f 70 79 2c 20 73 69 7a 65 6f 66 28   szCopy, sizeof(
40a0: 73 7a 43 6f 70 79 29 29 3b 0a 09 09 7d 0a 09 20  szCopy));...}.. 
40b0: 20 20 20 7d 0a 09 20 20 20 20 70 72 69 6e 74 66     }..    printf
40c0: 28 73 7a 42 75 66 66 65 72 29 3b 0a 09 7d 0a 09  (szBuffer);..}..
40d0: 0a 09 6c 69 73 74 5f 66 72 65 65 28 26 73 75 62  ..list_free(&sub
40e0: 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20  stPtr);.    }.  
40f0: 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20    fclose(fp);.  
4100: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a    return 0;.}...
4110: 2f 2a 0a 20 2a 20 51 75 61 6c 69 66 79 50 61 74  /*. * QualifyPat
4120: 68 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  h --. *. *.This 
4130: 63 6f 6d 70 6f 73 65 73 20 74 68 65 20 63 75 72  composes the cur
4140: 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72  rent working dir
4150: 65 63 74 6f 72 79 20 77 69 74 68 20 61 20 70 72  ectory with a pr
4160: 6f 76 69 64 65 64 20 70 61 74 68 0a 20 2a 09 61  ovided path. *.a
4170: 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 66  nd returns the f
4180: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 61  ully qualified a
4190: 6e 64 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 70 61  nd normalized pa
41a0: 74 68 2e 0a 20 2a 09 4d 6f 73 74 6c 79 20 6e 65  th.. *.Mostly ne
41b0: 65 64 65 64 20 74 6f 20 73 65 74 75 70 20 70 61  eded to setup pa
41c0: 74 68 73 20 66 6f 72 20 74 65 73 74 69 6e 67 2e  ths for testing.
41d0: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
41e0: 0a 51 75 61 6c 69 66 79 50 61 74 68 28 0a 20 20  .QualifyPath(.  
41f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 7a    const char *sz
4200: 50 61 74 68 29 0a 7b 0a 20 20 20 20 63 68 61 72  Path).{.    char
4210: 20 73 7a 43 77 64 5b 4d 41 58 5f 50 41 54 48 20   szCwd[MAX_PATH 
4220: 2b 20 31 5d 3b 0a 20 20 20 20 63 68 61 72 20 73  + 1];.    char s
4230: 7a 54 6d 70 5b 4d 41 58 5f 50 41 54 48 20 2b 20  zTmp[MAX_PATH + 
4240: 31 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 3b  1];.    char *p;
4250: 0a 20 20 20 20 47 65 74 43 75 72 72 65 6e 74 44  .    GetCurrentD
4260: 69 72 65 63 74 6f 72 79 28 4d 41 58 5f 50 41 54  irectory(MAX_PAT
4270: 48 2c 20 73 7a 43 77 64 29 3b 0a 20 20 20 20 77  H, szCwd);.    w
4280: 68 69 6c 65 20 28 28 70 20 3d 20 73 74 72 63 68  hile ((p = strch
4290: 72 28 73 7a 50 61 74 68 2c 20 27 2f 27 29 29 20  r(szPath, '/')) 
42a0: 26 26 20 2a 70 29 0a 09 2a 70 20 3d 20 27 5c 5c  && *p)..*p = '\\
42b0: 27 3b 0a 20 20 20 20 50 61 74 68 43 6f 6d 62 69  ';.    PathCombi
42c0: 6e 65 28 73 7a 54 6d 70 2c 20 73 7a 43 77 64 2c  ne(szTmp, szCwd,
42d0: 20 73 7a 50 61 74 68 29 3b 0a 20 20 20 20 50 61   szPath);.    Pa
42e0: 74 68 43 61 6e 6f 6e 69 63 61 6c 69 7a 65 28 73  thCanonicalize(s
42f0: 7a 43 77 64 2c 20 73 7a 54 6d 70 29 3b 0a 20 20  zCwd, szTmp);.  
4300: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
4310: 20 73 7a 43 77 64 29 3b 0a 20 20 20 20 72 65 74   szCwd);.    ret
4320: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  urn 0;.}../*. * 
4330: 4c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 3a  Local variables:
4340: 0a 20 2a 20 20 20 6d 6f 64 65 3a 20 63 0a 20 2a  . *   mode: c. *
4350: 20 20 20 63 2d 62 61 73 69 63 2d 6f 66 66 73 65     c-basic-offse
4360: 74 3a 20 34 0a 20 2a 20 20 20 66 69 6c 6c 2d 63  t: 4. *   fill-c
4370: 6f 6c 75 6d 6e 3a 20 37 38 0a 20 2a 20 20 20 69  olumn: 78. *   i
4380: 6e 64 65 6e 74 2d 74 61 62 73 2d 6d 6f 64 65 3a  ndent-tabs-mode:
4390: 20 74 0a 20 2a 20 20 20 74 61 62 2d 77 69 64 74   t. *   tab-widt
43a0: 68 3a 20 38 0a 20 2a 20 45 6e 64 3a 0a 20 2a 2f  h: 8. * End:. */
43b0: 0a                                               .