ObjFW  Hex Artifact Content

Artifact 88e2ee5d8cb865fd7c89dc194b000b3ace5cb276e519328781fab500e38c32dc:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 63 29 20 32 30 30 38 2c 20 32 30 30 39 2c 20  (c) 2008, 2009, 
0020: 32 30 31 30 2c 20 32 30 31 31 2c 20 32 30 31 32  2010, 2011, 2012
0030: 2c 20 32 30 31 33 2c 20 32 30 31 34 2c 20 32 30  , 2013, 2014, 20
0040: 31 35 2c 20 32 30 31 36 2c 20 32 30 31 37 2c 0a  15, 2016, 2017,.
0050: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   *              
0060: 20 32 30 31 38 2c 20 32 30 31 39 2c 20 32 30 32   2018, 2019, 202
0070: 30 0a 20 2a 20 20 20 4a 6f 6e 61 74 68 61 6e 20  0. *   Jonathan 
0080: 53 63 68 6c 65 69 66 65 72 20 3c 6a 73 40 6e 69  Schleifer <js@ni
0090: 6c 2e 69 6d 3e 0a 20 2a 0a 20 2a 20 41 6c 6c 20  l.im>. *. * All 
00a0: 72 69 67 68 74 73 20 72 65 73 65 72 76 65 64 2e  rights reserved.
00b0: 0a 20 2a 0a 20 2a 20 54 68 69 73 20 66 69 6c 65  . *. * This file
00c0: 20 69 73 20 70 61 72 74 20 6f 66 20 4f 62 6a 46   is part of ObjF
00d0: 57 2e 20 49 74 20 6d 61 79 20 62 65 20 64 69 73  W. It may be dis
00e0: 74 72 69 62 75 74 65 64 20 75 6e 64 65 72 20 74  tributed under t
00f0: 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  he terms of the.
0100: 20 2a 20 51 20 50 75 62 6c 69 63 20 4c 69 63 65   * Q Public Lice
0110: 6e 73 65 20 31 2e 30 2c 20 77 68 69 63 68 20 63  nse 1.0, which c
0120: 61 6e 20 62 65 20 66 6f 75 6e 64 20 69 6e 20 74  an be found in t
0130: 68 65 20 66 69 6c 65 20 4c 49 43 45 4e 53 45 2e  he file LICENSE.
0140: 51 50 4c 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a  QPL included in.
0150: 20 2a 20 74 68 65 20 70 61 63 6b 61 67 69 6e 67   * the packaging
0160: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 20   of this file.. 
0170: 2a 0a 20 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *. * Alternative
0180: 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 64 69  ly, it may be di
0190: 73 74 72 69 62 75 74 65 64 20 75 6e 64 65 72 20  stributed under 
01a0: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
01b0: 20 47 4e 55 20 47 65 6e 65 72 61 6c 0a 20 2a 20   GNU General. * 
01c0: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 2c 20  Public License, 
01d0: 65 69 74 68 65 72 20 76 65 72 73 69 6f 6e 20 32  either version 2
01e0: 20 6f 72 20 33 2c 20 77 68 69 63 68 20 63 61 6e   or 3, which can
01f0: 20 62 65 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   be found in the
0200: 20 66 69 6c 65 0a 20 2a 20 4c 49 43 45 4e 53 45   file. * LICENSE
0210: 2e 47 50 4c 76 32 20 6f 72 20 4c 49 43 45 4e 53  .GPLv2 or LICENS
0220: 45 2e 47 50 4c 76 33 20 72 65 73 70 65 63 74 69  E.GPLv3 respecti
0230: 76 65 6c 79 20 69 6e 63 6c 75 64 65 64 20 69 6e  vely included in
0240: 20 74 68 65 20 70 61 63 6b 61 67 69 6e 67 20 6f   the packaging o
0250: 66 20 74 68 69 73 0a 20 2a 20 66 69 6c 65 2e 0a  f this. * file..
0260: 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20   */../*. * This 
0270: 66 69 6c 65 20 74 72 69 65 73 20 74 6f 20 6d 61  file tries to ma
0280: 6b 65 20 77 72 69 74 69 6e 67 20 55 54 46 2d 38  ke writing UTF-8
0290: 20 73 74 72 69 6e 67 73 20 74 6f 20 74 68 65 20   strings to the 
02a0: 63 6f 6e 73 6f 6c 65 20 22 6a 75 73 74 20 77 6f  console "just wo
02b0: 72 6b 22 20 6f 6e 0a 20 2a 20 57 69 6e 64 6f 77  rk" on. * Window
02c0: 73 2e 0a 20 2a 0a 20 2a 20 57 68 69 6c 65 20 57  s.. *. * While W
02d0: 69 6e 64 6f 77 73 20 64 6f 65 73 20 70 72 6f 76  indows does prov
02e0: 69 64 65 20 61 20 77 61 79 20 74 6f 20 63 68 61  ide a way to cha
02f0: 6e 67 65 20 74 68 65 20 63 6f 64 65 70 61 67 65  nge the codepage
0300: 20 6f 66 20 74 68 65 20 63 6f 6e 73 6f 6c 65 20   of the console 
0310: 74 6f 0a 20 2a 20 55 54 46 2d 38 2c 20 75 6e 66  to. * UTF-8, unf
0320: 6f 72 74 75 6e 61 74 65 6c 79 2c 20 64 69 66 66  ortunately, diff
0330: 65 72 65 6e 74 20 57 69 6e 64 6f 77 73 20 76 65  erent Windows ve
0340: 72 73 69 6f 6e 73 20 68 61 6e 64 6c 65 20 74 68  rsions handle th
0350: 61 74 20 64 69 66 66 65 72 65 6e 74 6c 79 2e 0a  at differently..
0360: 20 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20   * For example, 
0370: 6f 6e 20 57 69 6e 64 6f 77 73 20 58 50 2c 20 77  on Windows XP, w
0380: 68 65 6e 20 75 73 69 6e 67 20 57 69 6e 64 6f 77  hen using Window
0390: 73 20 58 50 27 73 20 63 6f 6e 73 6f 6c 65 2c 20  s XP's console, 
03a0: 63 68 61 6e 67 69 6e 67 20 74 68 65 0a 20 2a 20  changing the. * 
03b0: 63 6f 64 65 70 61 67 65 20 74 6f 20 55 54 46 2d  codepage to UTF-
03c0: 38 20 6d 6f 73 74 6c 79 20 62 72 65 61 6b 73 20  8 mostly breaks 
03d0: 77 72 69 74 65 28 29 20 61 6e 64 20 63 6f 6d 70  write() and comp
03e0: 6c 65 74 65 6c 79 20 62 72 65 61 6b 73 20 72 65  letely breaks re
03f0: 61 64 28 29 3a 0a 20 2a 20 77 72 69 74 65 28 29  ad():. * write()
0400: 20 73 75 64 64 65 6e 6c 79 20 72 65 74 75 72 6e   suddenly return
0410: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
0420: 63 68 61 72 61 63 74 65 72 73 20 2d 20 69 6e 73  characters - ins
0430: 74 65 61 64 20 6f 66 20 62 79 74 65 73 20 2d 0a  tead of bytes -.
0440: 20 2a 20 77 72 69 74 74 65 6e 20 61 6e 64 20 72   * written and r
0450: 65 61 64 28 29 20 6a 75 73 74 20 72 65 74 75 72  ead() just retur
0460: 6e 73 20 30 20 61 73 20 73 6f 6f 6e 20 61 73 20  ns 0 as soon as 
0470: 61 20 55 6e 69 63 6f 64 65 20 63 68 61 72 61 63  a Unicode charac
0480: 74 65 72 20 69 73 20 62 65 69 6e 67 0a 20 2a 20  ter is being. * 
0490: 72 65 61 64 2e 0a 20 2a 0a 20 2a 20 54 68 65 72  read.. *. * Ther
04a0: 65 66 6f 72 65 2c 20 69 6e 73 74 65 61 64 20 6f  efore, instead o
04b0: 66 20 6a 75 73 74 20 75 73 69 6e 67 20 74 68 65  f just using the
04c0: 20 55 54 46 2d 38 20 63 6f 64 65 70 61 67 65 2c   UTF-8 codepage,
04d0: 20 74 68 69 73 20 63 61 70 74 75 72 65 73 20 61   this captures a
04e0: 6c 6c 20 72 65 61 64 73 0a 20 2a 20 61 6e 64 20  ll reads. * and 
04f0: 77 72 69 74 65 73 20 74 6f 20 6f 66 5f 73 74 64  writes to of_std
0500: 7b 69 6e 2c 6f 75 74 2c 65 72 72 7d 20 6f 6e 20  {in,out,err} on 
0510: 74 68 65 20 6c 6f 77 20 6c 65 76 65 6c 2c 20 69  the low level, i
0520: 6e 74 65 72 70 72 65 74 73 20 74 68 65 20 62 75  nterprets the bu
0530: 66 66 65 72 20 61 73 0a 20 2a 20 55 54 46 2d 38  ffer as. * UTF-8
0540: 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 6f   and converts to
0550: 20 2f 20 66 72 6f 6d 20 55 54 46 2d 31 36 20 74   / from UTF-16 t
0560: 6f 20 75 73 65 20 52 65 61 64 43 6f 6e 73 6f 6c  o use ReadConsol
0570: 65 57 28 29 20 2f 20 57 72 69 74 65 43 6f 6e 73  eW() / WriteCons
0580: 6f 6c 65 57 28 29 2e 0a 20 2a 20 44 6f 69 6e 67  oleW().. * Doing
0590: 20 73 6f 20 69 73 20 73 61 66 65 2c 20 61 73 20   so is safe, as 
05a0: 74 68 65 20 63 6f 6e 73 6f 6c 65 20 6f 6e 6c 79  the console only
05b0: 20 73 75 70 70 6f 72 74 73 20 74 65 78 74 20 61   supports text a
05c0: 6e 79 77 61 79 20 61 6e 64 20 74 68 75 73 20 69  nyway and thus i
05d0: 74 20 64 6f 65 73 0a 20 2a 20 6e 6f 74 20 6d 61  t does. * not ma
05e0: 74 74 65 72 20 69 66 20 62 69 6e 61 72 79 20 67  tter if binary g
05f0: 65 74 73 20 67 61 72 62 6c 65 64 20 62 79 20 74  ets garbled by t
0600: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 28 65  he conversion (e
0610: 2e 67 2e 20 62 65 63 61 75 73 65 20 69 6e 76 61  .g. because inva
0620: 6c 69 64 0a 20 2a 20 55 54 46 2d 38 20 67 65 74  lid. * UTF-8 get
0630: 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 55  s converted to U
0640: 2b 46 46 46 44 29 2e 0a 20 2a 0a 20 2a 20 49 6e  +FFFD).. *. * In
0650: 20 6f 72 64 65 72 20 74 6f 20 6e 6f 74 20 64 6f   order to not do
0660: 20 74 68 69 73 20 77 68 65 6e 20 72 65 64 69 72   this when redir
0670: 65 63 74 69 6e 67 20 69 6e 70 75 74 20 2f 20 6f  ecting input / o
0680: 75 74 70 75 74 20 74 6f 20 61 20 66 69 6c 65 20  utput to a file 
0690: 28 61 73 20 74 68 65 0a 20 2a 20 66 69 6c 65 20  (as the. * file 
06a0: 77 6f 75 6c 64 20 74 68 65 6e 20 62 65 20 72 65  would then be re
06b0: 61 64 20 2f 20 77 72 69 74 74 65 6e 20 69 6e 20  ad / written in 
06c0: 74 68 65 20 77 72 6f 6e 67 20 65 6e 63 6f 64 69  the wrong encodi
06d0: 6e 67 20 61 6e 64 20 62 72 65 61 6b 20 72 65 61  ng and break rea
06e0: 64 69 6e 67 20 2f 0a 20 2a 20 77 72 69 74 69 6e  ding /. * writin
06f0: 67 20 62 69 6e 61 72 79 29 2c 20 69 74 20 63 68  g binary), it ch
0700: 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 68 61  ecks that the ha
0710: 6e 64 6c 65 20 69 73 20 69 6e 64 65 65 64 20 61  ndle is indeed a
0720: 20 63 6f 6e 73 6f 6c 65 2e 0a 20 2a 2f 0a 0a 23   console.. */..#
0730: 64 65 66 69 6e 65 20 4f 46 5f 53 54 44 49 4f 5f  define OF_STDIO_
0740: 53 54 52 45 41 4d 5f 57 49 4e 33 32 5f 43 4f 4e  STREAM_WIN32_CON
0750: 53 4f 4c 45 5f 4d 0a 0a 23 69 6e 63 6c 75 64 65  SOLE_M..#include
0760: 20 22 63 6f 6e 66 69 67 2e 68 22 0a 0a 23 69 6e   "config.h"..#in
0770: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
0780: 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  .#include <errno
0790: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 69 6f  .h>.#include <io
07a0: 2e 68 3e 0a 0a 23 69 6d 70 6f 72 74 20 22 4f 46  .h>..#import "OF
07b0: 57 69 6e 33 32 43 6f 6e 73 6f 6c 65 53 74 64 49  Win32ConsoleStdI
07c0: 4f 53 74 72 65 61 6d 2e 68 22 0a 23 69 6d 70 6f  OStream.h".#impo
07d0: 72 74 20 22 4f 46 44 61 74 61 2e 68 22 0a 23 69  rt "OFData.h".#i
07e0: 6d 70 6f 72 74 20 22 4f 46 53 74 64 49 4f 53 74  mport "OFStdIOSt
07f0: 72 65 61 6d 2b 50 72 69 76 61 74 65 2e 68 22 0a  ream+Private.h".
0800: 23 69 6d 70 6f 72 74 20 22 4f 46 53 74 72 69 6e  #import "OFStrin
0810: 67 2e 68 22 0a 23 69 6d 70 6f 72 74 20 22 4f 46  g.h".#import "OF
0820: 53 79 73 74 65 6d 49 6e 66 6f 2e 68 22 0a 0a 23  SystemInfo.h"..#
0830: 69 6d 70 6f 72 74 20 22 4f 46 49 6e 76 61 6c 69  import "OFInvali
0840: 64 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74 69  dArgumentExcepti
0850: 6f 6e 2e 68 22 0a 23 69 6d 70 6f 72 74 20 22 4f  on.h".#import "O
0860: 46 49 6e 76 61 6c 69 64 45 6e 63 6f 64 69 6e 67  FInvalidEncoding
0870: 45 78 63 65 70 74 69 6f 6e 2e 68 22 0a 23 69 6d  Exception.h".#im
0880: 70 6f 72 74 20 22 4f 46 4f 75 74 4f 66 52 61 6e  port "OFOutOfRan
0890: 67 65 45 78 63 65 70 74 69 6f 6e 2e 68 22 0a 23  geException.h".#
08a0: 69 6d 70 6f 72 74 20 22 4f 46 52 65 61 64 46 61  import "OFReadFa
08b0: 69 6c 65 64 45 78 63 65 70 74 69 6f 6e 2e 68 22  iledException.h"
08c0: 0a 23 69 6d 70 6f 72 74 20 22 4f 46 57 72 69 74  .#import "OFWrit
08d0: 65 46 61 69 6c 65 64 45 78 63 65 70 74 69 6f 6e  eFailedException
08e0: 2e 68 22 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 77  .h"..#include <w
08f0: 69 6e 64 6f 77 73 2e 68 3e 0a 0a 73 74 61 74 69  indows.h>..stati
0900: 63 20 6f 66 5f 73 74 72 69 6e 67 5f 65 6e 63 6f  c of_string_enco
0910: 64 69 6e 67 5f 74 0a 63 6f 64 65 70 61 67 65 54  ding_t.codepageT
0920: 6f 45 6e 63 6f 64 69 6e 67 28 55 49 4e 54 20 63  oEncoding(UINT c
0930: 6f 64 65 70 61 67 65 29 0a 7b 0a 09 73 77 69 74  odepage).{..swit
0940: 63 68 20 28 63 6f 64 65 70 61 67 65 29 20 7b 0a  ch (codepage) {.
0950: 09 63 61 73 65 20 34 33 37 3a 0a 09 09 72 65 74  .case 437:...ret
0960: 75 72 6e 20 4f 46 5f 53 54 52 49 4e 47 5f 45 4e  urn OF_STRING_EN
0970: 43 4f 44 49 4e 47 5f 43 4f 44 45 50 41 47 45 5f  CODING_CODEPAGE_
0980: 34 33 37 3b 0a 09 63 61 73 65 20 38 35 30 3a 0a  437;..case 850:.
0990: 09 09 72 65 74 75 72 6e 20 4f 46 5f 53 54 52 49  ..return OF_STRI
09a0: 4e 47 5f 45 4e 43 4f 44 49 4e 47 5f 43 4f 44 45  NG_ENCODING_CODE
09b0: 50 41 47 45 5f 38 35 30 3b 0a 09 63 61 73 65 20  PAGE_850;..case 
09c0: 38 35 38 3a 0a 09 09 72 65 74 75 72 6e 20 4f 46  858:...return OF
09d0: 5f 53 54 52 49 4e 47 5f 45 4e 43 4f 44 49 4e 47  _STRING_ENCODING
09e0: 5f 43 4f 44 45 50 41 47 45 5f 38 35 38 3b 0a 09  _CODEPAGE_858;..
09f0: 63 61 73 65 20 31 32 35 31 3a 0a 09 09 72 65 74  case 1251:...ret
0a00: 75 72 6e 20 4f 46 5f 53 54 52 49 4e 47 5f 45 4e  urn OF_STRING_EN
0a10: 43 4f 44 49 4e 47 5f 57 49 4e 44 4f 57 53 5f 31  CODING_WINDOWS_1
0a20: 32 35 31 3b 0a 09 63 61 73 65 20 31 32 35 32 3a  251;..case 1252:
0a30: 0a 09 09 72 65 74 75 72 6e 20 4f 46 5f 53 54 52  ...return OF_STR
0a40: 49 4e 47 5f 45 4e 43 4f 44 49 4e 47 5f 57 49 4e  ING_ENCODING_WIN
0a50: 44 4f 57 53 5f 31 32 35 32 3b 0a 09 64 65 66 61  DOWS_1252;..defa
0a60: 75 6c 74 3a 0a 09 09 40 74 68 72 6f 77 20 5b 4f  ult:...@throw [O
0a70: 46 49 6e 76 61 6c 69 64 45 6e 63 6f 64 69 6e 67  FInvalidEncoding
0a80: 45 78 63 65 70 74 69 6f 6e 20 65 78 63 65 70 74  Exception except
0a90: 69 6f 6e 5d 3b 0a 09 7d 0a 7d 0a 0a 40 69 6d 70  ion];..}.}..@imp
0aa0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 4f 46 57 69  lementation OFWi
0ab0: 6e 33 32 43 6f 6e 73 6f 6c 65 53 74 64 49 4f 53  n32ConsoleStdIOS
0ac0: 74 72 65 61 6d 0a 2b 20 28 76 6f 69 64 29 6c 6f  tream.+ (void)lo
0ad0: 61 64 0a 7b 0a 09 69 6e 74 20 66 64 3b 0a 0a 09  ad.{..int fd;...
0ae0: 69 66 20 28 73 65 6c 66 20 21 3d 20 5b 4f 46 57  if (self != [OFW
0af0: 69 6e 33 32 43 6f 6e 73 6f 6c 65 53 74 64 49 4f  in32ConsoleStdIO
0b00: 53 74 72 65 61 6d 20 63 6c 61 73 73 5d 29 0a 09  Stream class])..
0b10: 09 72 65 74 75 72 6e 3b 0a 0a 09 69 66 20 28 28  .return;...if ((
0b20: 66 64 20 3d 20 5f 66 69 6c 65 6e 6f 28 73 74 64  fd = _fileno(std
0b30: 69 6e 29 29 20 3e 3d 20 30 29 0a 09 09 6f 66 5f  in)) >= 0)...of_
0b40: 73 74 64 69 6e 20 3d 20 5b 5b 4f 46 57 69 6e 33  stdin = [[OFWin3
0b50: 32 43 6f 6e 73 6f 6c 65 53 74 64 49 4f 53 74 72  2ConsoleStdIOStr
0b60: 65 61 6d 20 61 6c 6c 6f 63 5d 0a 09 09 20 20 20  eam alloc]...   
0b70: 20 6f 66 5f 69 6e 69 74 57 69 74 68 46 69 6c 65   of_initWithFile
0b80: 44 65 73 63 72 69 70 74 6f 72 3a 20 66 64 5d 3b  Descriptor: fd];
0b90: 0a 09 69 66 20 28 28 66 64 20 3d 20 5f 66 69 6c  ..if ((fd = _fil
0ba0: 65 6e 6f 28 73 74 64 6f 75 74 29 29 20 3e 3d 20  eno(stdout)) >= 
0bb0: 30 29 0a 09 09 6f 66 5f 73 74 64 6f 75 74 20 3d  0)...of_stdout =
0bc0: 20 5b 5b 4f 46 57 69 6e 33 32 43 6f 6e 73 6f 6c   [[OFWin32Consol
0bd0: 65 53 74 64 49 4f 53 74 72 65 61 6d 20 61 6c 6c  eStdIOStream all
0be0: 6f 63 5d 0a 09 09 20 20 20 20 6f 66 5f 69 6e 69  oc]...    of_ini
0bf0: 74 57 69 74 68 46 69 6c 65 44 65 73 63 72 69 70  tWithFileDescrip
0c00: 74 6f 72 3a 20 66 64 5d 3b 0a 09 69 66 20 28 28  tor: fd];..if ((
0c10: 66 64 20 3d 20 5f 66 69 6c 65 6e 6f 28 73 74 64  fd = _fileno(std
0c20: 65 72 72 29 29 20 3e 3d 20 30 29 0a 09 09 6f 66  err)) >= 0)...of
0c30: 5f 73 74 64 65 72 72 20 3d 20 5b 5b 4f 46 57 69  _stderr = [[OFWi
0c40: 6e 33 32 43 6f 6e 73 6f 6c 65 53 74 64 49 4f 53  n32ConsoleStdIOS
0c50: 74 72 65 61 6d 20 61 6c 6c 6f 63 5d 0a 09 09 20  tream alloc]... 
0c60: 20 20 20 6f 66 5f 69 6e 69 74 57 69 74 68 46 69     of_initWithFi
0c70: 6c 65 44 65 73 63 72 69 70 74 6f 72 3a 20 66 64  leDescriptor: fd
0c80: 5d 3b 0a 7d 0a 0a 2d 20 28 69 6e 73 74 61 6e 63  ];.}..- (instanc
0c90: 65 74 79 70 65 29 6f 66 5f 69 6e 69 74 57 69 74  etype)of_initWit
0ca0: 68 46 69 6c 65 44 65 73 63 72 69 70 74 6f 72 3a  hFileDescriptor:
0cb0: 20 28 69 6e 74 29 66 64 0a 7b 0a 09 73 65 6c 66   (int)fd.{..self
0cc0: 20 3d 20 5b 73 75 70 65 72 20 6f 66 5f 69 6e 69   = [super of_ini
0cd0: 74 57 69 74 68 46 69 6c 65 44 65 73 63 72 69 70  tWithFileDescrip
0ce0: 74 6f 72 3a 20 66 64 5d 3b 0a 0a 09 40 74 72 79  tor: fd];...@try
0cf0: 20 7b 0a 09 09 44 57 4f 52 44 20 6d 6f 64 65 3b   {...DWORD mode;
0d00: 0a 0a 09 09 5f 68 61 6e 64 6c 65 20 3d 20 28 48  ...._handle = (H
0d10: 41 4e 44 4c 45 29 5f 67 65 74 5f 6f 73 66 68 61  ANDLE)_get_osfha
0d20: 6e 64 6c 65 28 66 64 29 3b 0a 09 09 69 66 20 28  ndle(fd);...if (
0d30: 5f 68 61 6e 64 6c 65 20 3d 3d 20 49 4e 56 41 4c  _handle == INVAL
0d40: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29  ID_HANDLE_VALUE)
0d50: 0a 09 09 09 40 74 68 72 6f 77 20 5b 4f 46 49 6e  ....@throw [OFIn
0d60: 76 61 6c 69 64 41 72 67 75 6d 65 6e 74 45 78 63  validArgumentExc
0d70: 65 70 74 69 6f 6e 20 65 78 63 65 70 74 69 6f 6e  eption exception
0d80: 5d 3b 0a 0a 09 09 2f 2a 20 4e 6f 74 20 61 20 63  ];..../* Not a c
0d90: 6f 6e 73 6f 6c 65 3a 20 54 72 65 61 74 20 69 74  onsole: Treat it
0da0: 20 61 73 20 61 20 72 65 67 75 6c 61 72 20 4f 46   as a regular OF
0db0: 53 74 64 49 4f 53 74 72 65 61 6d 20 2a 2f 0a 09  StdIOStream */..
0dc0: 09 69 66 20 28 21 47 65 74 43 6f 6e 73 6f 6c 65  .if (!GetConsole
0dd0: 4d 6f 64 65 28 5f 68 61 6e 64 6c 65 2c 20 26 6d  Mode(_handle, &m
0de0: 6f 64 65 29 29 0a 09 09 09 6f 62 6a 65 63 74 5f  ode))....object_
0df0: 73 65 74 43 6c 61 73 73 28 73 65 6c 66 2c 20 5b  setClass(self, [
0e00: 4f 46 53 74 64 49 4f 53 74 72 65 61 6d 20 63 6c  OFStdIOStream cl
0e10: 61 73 73 5d 29 3b 0a 09 7d 20 40 63 61 74 63 68  ass]);..} @catch
0e20: 20 28 69 64 20 65 29 20 7b 0a 09 09 5b 73 65 6c   (id e) {...[sel
0e30: 66 20 72 65 6c 65 61 73 65 5d 3b 0a 09 09 40 74  f release];...@t
0e40: 68 72 6f 77 20 65 3b 0a 09 7d 0a 0a 09 72 65 74  hrow e;..}...ret
0e50: 75 72 6e 20 73 65 6c 66 3b 0a 7d 0a 0a 2d 20 28  urn self;.}..- (
0e60: 73 69 7a 65 5f 74 29 6c 6f 77 6c 65 76 65 6c 52  size_t)lowlevelR
0e70: 65 61 64 49 6e 74 6f 42 75 66 66 65 72 3a 20 28  eadIntoBuffer: (
0e80: 76 6f 69 64 20 2a 29 62 75 66 66 65 72 5f 0a 09  void *)buffer_..
0e90: 09 09 20 20 6c 65 6e 67 74 68 3a 20 28 73 69 7a  ..  length: (siz
0ea0: 65 5f 74 29 6c 65 6e 67 74 68 0a 7b 0a 09 76 6f  e_t)length.{..vo
0eb0: 69 64 20 2a 70 6f 6f 6c 20 3d 20 6f 62 6a 63 5f  id *pool = objc_
0ec0: 61 75 74 6f 72 65 6c 65 61 73 65 50 6f 6f 6c 50  autoreleasePoolP
0ed0: 75 73 68 28 29 3b 0a 09 63 68 61 72 20 2a 62 75  ush();..char *bu
0ee0: 66 66 65 72 20 3d 20 62 75 66 66 65 72 5f 3b 0a  ffer = buffer_;.
0ef0: 09 6f 66 5f 63 68 61 72 31 36 5f 74 20 2a 55 54  .of_char16_t *UT
0f00: 46 31 36 3b 0a 09 73 69 7a 65 5f 74 20 6a 20 3d  F16;..size_t j =
0f10: 20 30 3b 0a 0a 09 69 66 20 28 6c 65 6e 67 74 68   0;...if (length
0f20: 20 3e 20 55 49 4e 54 33 32 5f 4d 41 58 29 0a 09   > UINT32_MAX)..
0f30: 09 40 74 68 72 6f 77 20 5b 4f 46 4f 75 74 4f 66  .@throw [OFOutOf
0f40: 52 61 6e 67 65 45 78 63 65 70 74 69 6f 6e 20 65  RangeException e
0f50: 78 63 65 70 74 69 6f 6e 5d 3b 0a 0a 09 55 54 46  xception];...UTF
0f60: 31 36 20 3d 20 5b 73 65 6c 66 20 61 6c 6c 6f 63  16 = [self alloc
0f70: 4d 65 6d 6f 72 79 57 69 74 68 53 69 7a 65 3a 20  MemoryWithSize: 
0f80: 73 69 7a 65 6f 66 28 6f 66 5f 63 68 61 72 31 36  sizeof(of_char16
0f90: 5f 74 29 0a 09 09 09 09 20 20 20 20 63 6f 75 6e  _t).....    coun
0fa0: 74 3a 20 6c 65 6e 67 74 68 5d 3b 0a 09 40 74 72  t: length];..@tr
0fb0: 79 20 7b 0a 09 09 44 57 4f 52 44 20 55 54 46 31  y {...DWORD UTF1
0fc0: 36 4c 65 6e 3b 0a 09 09 4f 46 4d 75 74 61 62 6c  6Len;...OFMutabl
0fd0: 65 44 61 74 61 20 2a 72 65 73 74 20 3d 20 6e 69  eData *rest = ni
0fe0: 6c 3b 0a 09 09 73 69 7a 65 5f 74 20 69 20 3d 20  l;...size_t i = 
0ff0: 30 3b 0a 0a 09 09 69 66 20 28 5b 4f 46 53 79 73  0;....if ([OFSys
1000: 74 65 6d 49 6e 66 6f 20 69 73 57 69 6e 64 6f 77  temInfo isWindow
1010: 73 4e 54 5d 29 20 7b 0a 09 09 09 69 66 20 28 21  sNT]) {....if (!
1020: 52 65 61 64 43 6f 6e 73 6f 6c 65 57 28 5f 68 61  ReadConsoleW(_ha
1030: 6e 64 6c 65 2c 20 55 54 46 31 36 2c 20 28 44 57  ndle, UTF16, (DW
1040: 4f 52 44 29 6c 65 6e 67 74 68 2c 0a 09 09 09 20  ORD)length,.... 
1050: 20 20 20 26 55 54 46 31 36 4c 65 6e 2c 20 4e 55     &UTF16Len, NU
1060: 4c 4c 29 29 0a 09 09 09 09 40 74 68 72 6f 77 20  LL)).....@throw 
1070: 5b 4f 46 52 65 61 64 46 61 69 6c 65 64 45 78 63  [OFReadFailedExc
1080: 65 70 74 69 6f 6e 0a 09 09 09 09 20 20 20 20 65  eption.....    e
1090: 78 63 65 70 74 69 6f 6e 57 69 74 68 4f 62 6a 65  xceptionWithObje
10a0: 63 74 3a 20 73 65 6c 66 0a 09 09 09 09 09 72 65  ct: self......re
10b0: 71 75 65 73 74 65 64 4c 65 6e 67 74 68 3a 20 6c  questedLength: l
10c0: 65 6e 67 74 68 20 2a 20 32 0a 09 09 09 09 09 09  ength * 2.......
10d0: 20 20 65 72 72 4e 6f 3a 20 45 49 4f 5d 3b 0a 09    errNo: EIO];..
10e0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6f 66 5f  .} else {....of_
10f0: 73 74 72 69 6e 67 5f 65 6e 63 6f 64 69 6e 67 5f  string_encoding_
1100: 74 20 65 6e 63 6f 64 69 6e 67 3b 0a 09 09 09 4f  t encoding;....O
1110: 46 53 74 72 69 6e 67 20 2a 73 74 72 69 6e 67 3b  FString *string;
1120: 0a 09 09 09 73 69 7a 65 5f 74 20 73 74 72 69 6e  ....size_t strin
1130: 67 4c 65 6e 3b 0a 0a 09 09 09 69 66 20 28 21 52  gLen;.....if (!R
1140: 65 61 64 43 6f 6e 73 6f 6c 65 41 28 5f 68 61 6e  eadConsoleA(_han
1150: 64 6c 65 2c 20 28 63 68 61 72 20 2a 29 55 54 46  dle, (char *)UTF
1160: 31 36 2c 20 28 44 57 4f 52 44 29 6c 65 6e 67 74  16, (DWORD)lengt
1170: 68 2c 0a 09 09 09 20 20 20 20 26 55 54 46 31 36  h,....    &UTF16
1180: 4c 65 6e 2c 20 4e 55 4c 4c 29 29 0a 09 09 09 09  Len, NULL)).....
1190: 40 74 68 72 6f 77 20 5b 4f 46 52 65 61 64 46 61  @throw [OFReadFa
11a0: 69 6c 65 64 45 78 63 65 70 74 69 6f 6e 0a 09 09  iledException...
11b0: 09 09 20 20 20 20 65 78 63 65 70 74 69 6f 6e 57  ..    exceptionW
11c0: 69 74 68 4f 62 6a 65 63 74 3a 20 73 65 6c 66 0a  ithObject: self.
11d0: 09 09 09 09 09 72 65 71 75 65 73 74 65 64 4c 65  .....requestedLe
11e0: 6e 67 74 68 3a 20 6c 65 6e 67 74 68 0a 09 09 09  ngth: length....
11f0: 09 09 09 20 20 65 72 72 4e 6f 3a 20 45 49 4f 5d  ...  errNo: EIO]
1200: 3b 0a 0a 09 09 09 65 6e 63 6f 64 69 6e 67 20 3d  ;.....encoding =
1210: 20 63 6f 64 65 70 61 67 65 54 6f 45 6e 63 6f 64   codepageToEncod
1220: 69 6e 67 28 47 65 74 43 6f 6e 73 6f 6c 65 43 50  ing(GetConsoleCP
1230: 28 29 29 3b 0a 09 09 09 73 74 72 69 6e 67 20 3d  ());....string =
1240: 20 5b 4f 46 53 74 72 69 6e 67 20 73 74 72 69 6e   [OFString strin
1250: 67 57 69 74 68 43 53 74 72 69 6e 67 3a 20 28 63  gWithCString: (c
1260: 68 61 72 20 2a 29 55 54 46 31 36 0a 09 09 09 09  har *)UTF16.....
1270: 09 09 20 20 20 20 65 6e 63 6f 64 69 6e 67 3a 20  ..    encoding: 
1280: 65 6e 63 6f 64 69 6e 67 0a 09 09 09 09 09 09 20  encoding....... 
1290: 20 20 20 20 20 6c 65 6e 67 74 68 3a 20 55 54 46       length: UTF
12a0: 31 36 4c 65 6e 5d 3b 0a 09 09 09 73 74 72 69 6e  16Len];....strin
12b0: 67 4c 65 6e 20 3d 20 73 74 72 69 6e 67 2e 55 54  gLen = string.UT
12c0: 46 31 36 53 74 72 69 6e 67 4c 65 6e 67 74 68 3b  F16StringLength;
12d0: 0a 0a 09 09 09 69 66 20 28 73 74 72 69 6e 67 4c  .....if (stringL
12e0: 65 6e 20 3e 20 6c 65 6e 67 74 68 29 0a 09 09 09  en > length)....
12f0: 09 40 74 68 72 6f 77 20 5b 4f 46 4f 75 74 4f 66  .@throw [OFOutOf
1300: 52 61 6e 67 65 45 78 63 65 70 74 69 6f 6e 20 65  RangeException e
1310: 78 63 65 70 74 69 6f 6e 5d 3b 0a 0a 09 09 09 55  xception];.....U
1320: 54 46 31 36 4c 65 6e 20 3d 20 28 44 57 4f 52 44  TF16Len = (DWORD
1330: 29 73 74 72 69 6e 67 4c 65 6e 3b 0a 09 09 09 6d  )stringLen;....m
1340: 65 6d 63 70 79 28 55 54 46 31 36 2c 20 73 74 72  emcpy(UTF16, str
1350: 69 6e 67 2e 55 54 46 31 36 53 74 72 69 6e 67 2c  ing.UTF16String,
1360: 20 73 74 72 69 6e 67 4c 65 6e 29 3b 0a 09 09 7d   stringLen);...}
1370: 0a 0a 09 09 69 66 20 28 55 54 46 31 36 4c 65 6e  ....if (UTF16Len
1380: 20 3e 20 30 20 26 26 20 5f 69 6e 63 6f 6d 70 6c   > 0 && _incompl
1390: 65 74 65 55 54 46 31 36 53 75 72 72 6f 67 61 74  eteUTF16Surrogat
13a0: 65 20 21 3d 20 30 29 20 7b 0a 09 09 09 6f 66 5f  e != 0) {....of_
13b0: 75 6e 69 63 68 61 72 5f 74 20 63 20 3d 0a 09 09  unichar_t c =...
13c0: 09 20 20 20 20 28 28 28 5f 69 6e 63 6f 6d 70 6c  .    (((_incompl
13d0: 65 74 65 55 54 46 31 36 53 75 72 72 6f 67 61 74  eteUTF16Surrogat
13e0: 65 20 26 20 30 78 33 46 46 29 20 3c 3c 20 31 30  e & 0x3FF) << 10
13f0: 29 20 7c 0a 09 09 09 20 20 20 20 28 55 54 46 31  ) |....    (UTF1
1400: 36 5b 30 5d 20 26 20 30 78 33 46 46 29 29 20 2b  6[0] & 0x3FF)) +
1410: 20 30 78 31 30 30 30 30 3b 0a 09 09 09 63 68 61   0x10000;....cha
1420: 72 20 55 54 46 38 5b 34 5d 3b 0a 09 09 09 73 69  r UTF8[4];....si
1430: 7a 65 5f 74 20 55 54 46 38 4c 65 6e 3b 0a 0a 09  ze_t UTF8Len;...
1440: 09 09 69 66 20 28 28 55 54 46 38 4c 65 6e 20 3d  ..if ((UTF8Len =
1450: 20 6f 66 5f 73 74 72 69 6e 67 5f 75 74 66 38 5f   of_string_utf8_
1460: 65 6e 63 6f 64 65 28 63 2c 20 55 54 46 38 29 29  encode(c, UTF8))
1470: 20 3d 3d 20 30 29 0a 09 09 09 09 40 74 68 72 6f   == 0).....@thro
1480: 77 20 5b 4f 46 49 6e 76 61 6c 69 64 45 6e 63 6f  w [OFInvalidEnco
1490: 64 69 6e 67 45 78 63 65 70 74 69 6f 6e 20 65 78  dingException ex
14a0: 63 65 70 74 69 6f 6e 5d 3b 0a 0a 09 09 09 69 66  ception];.....if
14b0: 20 28 55 54 46 38 4c 65 6e 20 3c 3d 20 6c 65 6e   (UTF8Len <= len
14c0: 67 74 68 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70  gth) {.....memcp
14d0: 79 28 62 75 66 66 65 72 2c 20 55 54 46 38 2c 20  y(buffer, UTF8, 
14e0: 55 54 46 38 4c 65 6e 29 3b 0a 09 09 09 09 6a 20  UTF8Len);.....j 
14f0: 2b 3d 20 55 54 46 38 4c 65 6e 3b 0a 09 09 09 7d  += UTF8Len;....}
1500: 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28   else {.....if (
1510: 72 65 73 74 20 3d 3d 20 6e 69 6c 29 0a 09 09 09  rest == nil)....
1520: 09 09 72 65 73 74 20 3d 20 5b 4f 46 4d 75 74 61  ..rest = [OFMuta
1530: 62 6c 65 44 61 74 61 20 64 61 74 61 5d 3b 0a 0a  bleData data];..
1540: 09 09 09 09 5b 72 65 73 74 20 61 64 64 49 74 65  ....[rest addIte
1550: 6d 73 3a 20 55 54 46 38 0a 09 09 09 09 09 20 63  ms: UTF8...... c
1560: 6f 75 6e 74 3a 20 55 54 46 38 4c 65 6e 5d 3b 0a  ount: UTF8Len];.
1570: 09 09 09 7d 0a 0a 09 09 09 5f 69 6e 63 6f 6d 70  ...}....._incomp
1580: 6c 65 74 65 55 54 46 31 36 53 75 72 72 6f 67 61  leteUTF16Surroga
1590: 74 65 20 3d 20 30 3b 0a 09 09 09 69 2b 2b 3b 0a  te = 0;....i++;.
15a0: 09 09 7d 0a 0a 09 09 66 6f 72 20 28 3b 20 69 20  ..}....for (; i 
15b0: 3c 20 55 54 46 31 36 4c 65 6e 3b 20 69 2b 2b 29  < UTF16Len; i++)
15c0: 20 7b 0a 09 09 09 6f 66 5f 75 6e 69 63 68 61 72   {....of_unichar
15d0: 5f 74 20 63 20 3d 20 55 54 46 31 36 5b 69 5d 3b  _t c = UTF16[i];
15e0: 0a 09 09 09 63 68 61 72 20 55 54 46 38 5b 34 5d  ....char UTF8[4]
15f0: 3b 0a 09 09 09 73 69 7a 65 5f 74 20 55 54 46 38  ;....size_t UTF8
1600: 4c 65 6e 3b 0a 0a 09 09 09 2f 2a 20 4d 69 73 73  Len;...../* Miss
1610: 69 6e 67 20 68 69 67 68 20 73 75 72 72 6f 67 61  ing high surroga
1620: 74 65 20 2a 2f 0a 09 09 09 69 66 20 28 28 63 20  te */....if ((c 
1630: 26 20 30 78 46 43 30 30 29 20 3d 3d 20 30 78 44  & 0xFC00) == 0xD
1640: 43 30 30 29 0a 09 09 09 09 40 74 68 72 6f 77 20  C00).....@throw 
1650: 5b 4f 46 49 6e 76 61 6c 69 64 45 6e 63 6f 64 69  [OFInvalidEncodi
1660: 6e 67 45 78 63 65 70 74 69 6f 6e 20 65 78 63 65  ngException exce
1670: 70 74 69 6f 6e 5d 3b 0a 0a 09 09 09 69 66 20 28  ption];.....if (
1680: 28 63 20 26 20 30 78 46 43 30 30 29 20 3d 3d 20  (c & 0xFC00) == 
1690: 30 78 44 38 30 30 29 20 7b 0a 09 09 09 09 6f 66  0xD800) {.....of
16a0: 5f 63 68 61 72 31 36 5f 74 20 6e 65 78 74 3b 0a  _char16_t next;.
16b0: 0a 09 09 09 09 69 66 20 28 55 54 46 31 36 4c 65  .....if (UTF16Le
16c0: 6e 20 3c 3d 20 69 20 2b 20 31 29 20 7b 0a 09 09  n <= i + 1) {...
16d0: 09 09 09 5f 69 6e 63 6f 6d 70 6c 65 74 65 55 54  ..._incompleteUT
16e0: 46 31 36 53 75 72 72 6f 67 61 74 65 20 3d 20 63  F16Surrogate = c
16f0: 3b 0a 0a 09 09 09 09 09 69 66 20 28 72 65 73 74  ;.......if (rest
1700: 20 21 3d 20 6e 69 6c 29 20 7b 0a 09 09 09 09 09   != nil) {......
1710: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 74 65  .const char *ite
1720: 6d 73 20 3d 20 72 65 73 74 2e 69 74 65 6d 73 3b  ms = rest.items;
1730: 0a 09 09 09 09 09 09 73 69 7a 65 5f 74 20 63 6f  .......size_t co
1740: 75 6e 74 20 3d 20 72 65 73 74 2e 63 6f 75 6e 74  unt = rest.count
1750: 3b 0a 0a 09 09 09 09 09 09 5b 73 65 6c 66 20 75  ;........[self u
1760: 6e 72 65 61 64 46 72 6f 6d 42 75 66 66 65 72 3a  nreadFromBuffer:
1770: 20 69 74 65 6d 73 0a 09 09 09 09 09 09 09 09 6c   items.........l
1780: 65 6e 67 74 68 3a 20 63 6f 75 6e 74 5d 3b 0a 09  ength: count];..
1790: 09 09 09 09 7d 0a 0a 09 09 09 09 09 6f 62 6a 63  ....}.......objc
17a0: 5f 61 75 74 6f 72 65 6c 65 61 73 65 50 6f 6f 6c  _autoreleasePool
17b0: 50 6f 70 28 70 6f 6f 6c 29 3b 0a 0a 09 09 09 09  Pop(pool);......
17c0: 09 72 65 74 75 72 6e 20 6a 3b 0a 09 09 09 09 7d  .return j;.....}
17d0: 0a 0a 09 09 09 09 6e 65 78 74 20 3d 20 55 54 46  ......next = UTF
17e0: 31 36 5b 69 20 2b 20 31 5d 3b 0a 0a 09 09 09 09  16[i + 1];......
17f0: 69 66 20 28 28 6e 65 78 74 20 26 20 30 78 46 43  if ((next & 0xFC
1800: 30 30 29 20 21 3d 20 30 78 44 43 30 30 29 0a 09  00) != 0xDC00)..
1810: 09 09 09 09 40 74 68 72 6f 77 20 5b 4f 46 49 6e  ....@throw [OFIn
1820: 76 61 6c 69 64 45 6e 63 6f 64 69 6e 67 45 78 63  validEncodingExc
1830: 65 70 74 69 6f 6e 0a 09 09 09 09 09 20 20 20 20  eption......    
1840: 65 78 63 65 70 74 69 6f 6e 5d 3b 0a 0a 09 09 09  exception];.....
1850: 09 63 20 3d 20 28 28 28 63 20 26 20 30 78 33 46  .c = (((c & 0x3F
1860: 46 29 20 3c 3c 20 31 30 29 20 7c 20 28 6e 65 78  F) << 10) | (nex
1870: 74 20 26 20 30 78 33 46 46 29 29 20 2b 0a 09 09  t & 0x3FF)) +...
1880: 09 09 20 20 20 20 30 78 31 30 30 30 30 3b 0a 0a  ..    0x10000;..
1890: 09 09 09 09 69 2b 2b 3b 0a 09 09 09 7d 0a 0a 09  ....i++;....}...
18a0: 09 09 69 66 20 28 28 55 54 46 38 4c 65 6e 20 3d  ..if ((UTF8Len =
18b0: 20 6f 66 5f 73 74 72 69 6e 67 5f 75 74 66 38 5f   of_string_utf8_
18c0: 65 6e 63 6f 64 65 28 63 2c 20 55 54 46 38 29 29  encode(c, UTF8))
18d0: 20 3d 3d 20 30 29 0a 09 09 09 09 40 74 68 72 6f   == 0).....@thro
18e0: 77 20 5b 4f 46 49 6e 76 61 6c 69 64 45 6e 63 6f  w [OFInvalidEnco
18f0: 64 69 6e 67 45 78 63 65 70 74 69 6f 6e 20 65 78  dingException ex
1900: 63 65 70 74 69 6f 6e 5d 3b 0a 0a 09 09 09 69 66  ception];.....if
1910: 20 28 6a 20 2b 20 55 54 46 38 4c 65 6e 20 3c 3d   (j + UTF8Len <=
1920: 20 6c 65 6e 67 74 68 29 20 7b 0a 09 09 09 09 6d   length) {.....m
1930: 65 6d 63 70 79 28 62 75 66 66 65 72 20 2b 20 6a  emcpy(buffer + j
1940: 2c 20 55 54 46 38 2c 20 55 54 46 38 4c 65 6e 29  , UTF8, UTF8Len)
1950: 3b 0a 09 09 09 09 6a 20 2b 3d 20 55 54 46 38 4c  ;.....j += UTF8L
1960: 65 6e 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  en;....} else {.
1970: 09 09 09 09 69 66 20 28 72 65 73 74 20 3d 3d 20  ....if (rest == 
1980: 6e 69 6c 29 0a 09 09 09 09 09 72 65 73 74 20 3d  nil)......rest =
1990: 20 5b 4f 46 4d 75 74 61 62 6c 65 44 61 74 61 20   [OFMutableData 
19a0: 64 61 74 61 5d 3b 0a 0a 09 09 09 09 5b 72 65 73  data];......[res
19b0: 74 20 61 64 64 49 74 65 6d 73 3a 20 55 54 46 38  t addItems: UTF8
19c0: 0a 09 09 09 09 09 20 63 6f 75 6e 74 3a 20 55 54  ...... count: UT
19d0: 46 38 4c 65 6e 5d 3b 0a 09 09 09 7d 0a 09 09 7d  F8Len];....}...}
19e0: 0a 0a 09 09 69 66 20 28 72 65 73 74 20 21 3d 20  ....if (rest != 
19f0: 6e 69 6c 29 0a 09 09 09 5b 73 65 6c 66 20 75 6e  nil)....[self un
1a00: 72 65 61 64 46 72 6f 6d 42 75 66 66 65 72 3a 20  readFromBuffer: 
1a10: 72 65 73 74 2e 69 74 65 6d 73 0a 09 09 09 09 09  rest.items......
1a20: 6c 65 6e 67 74 68 3a 20 72 65 73 74 2e 63 6f 75  length: rest.cou
1a30: 6e 74 5d 3b 0a 09 7d 20 40 66 69 6e 61 6c 6c 79  nt];..} @finally
1a40: 20 7b 0a 09 09 5b 73 65 6c 66 20 66 72 65 65 4d   {...[self freeM
1a50: 65 6d 6f 72 79 3a 20 55 54 46 31 36 5d 3b 0a 09  emory: UTF16];..
1a60: 7d 0a 0a 09 6f 62 6a 63 5f 61 75 74 6f 72 65 6c  }...objc_autorel
1a70: 65 61 73 65 50 6f 6f 6c 50 6f 70 28 70 6f 6f 6c  easePoolPop(pool
1a80: 29 3b 0a 0a 09 72 65 74 75 72 6e 20 6a 3b 0a 7d  );...return j;.}
1a90: 0a 0a 2d 20 28 73 69 7a 65 5f 74 29 6c 6f 77 6c  ..- (size_t)lowl
1aa0: 65 76 65 6c 57 72 69 74 65 42 75 66 66 65 72 3a  evelWriteBuffer:
1ab0: 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 62   (const void *)b
1ac0: 75 66 66 65 72 5f 0a 09 09 20 20 20 20 20 20 20  uffer_...       
1ad0: 6c 65 6e 67 74 68 3a 20 28 73 69 7a 65 5f 74 29  length: (size_t)
1ae0: 6c 65 6e 67 74 68 0a 7b 0a 09 63 6f 6e 73 74 20  length.{..const 
1af0: 63 68 61 72 20 2a 62 75 66 66 65 72 20 3d 20 62  char *buffer = b
1b00: 75 66 66 65 72 5f 3b 0a 09 6f 66 5f 63 68 61 72  uffer_;..of_char
1b10: 31 36 5f 74 20 2a 74 6d 70 3b 0a 09 73 69 7a 65  16_t *tmp;..size
1b20: 5f 74 20 69 20 3d 20 30 2c 20 6a 20 3d 20 30 3b  _t i = 0, j = 0;
1b30: 0a 0a 09 69 66 20 28 6c 65 6e 67 74 68 20 3e 20  ...if (length > 
1b40: 53 49 5a 45 5f 4d 41 58 20 2f 20 32 29 0a 09 09  SIZE_MAX / 2)...
1b50: 40 74 68 72 6f 77 20 5b 4f 46 4f 75 74 4f 66 52  @throw [OFOutOfR
1b60: 61 6e 67 65 45 78 63 65 70 74 69 6f 6e 20 65 78  angeException ex
1b70: 63 65 70 74 69 6f 6e 5d 3b 0a 0a 09 69 66 20 28  ception];...if (
1b80: 5f 69 6e 63 6f 6d 70 6c 65 74 65 55 54 46 38 53  _incompleteUTF8S
1b90: 75 72 72 6f 67 61 74 65 4c 65 6e 20 3e 20 30 29  urrogateLen > 0)
1ba0: 20 7b 0a 09 09 6f 66 5f 75 6e 69 63 68 61 72 5f   {...of_unichar_
1bb0: 74 20 63 3b 0a 09 09 6f 66 5f 63 68 61 72 31 36  t c;...of_char16
1bc0: 5f 74 20 55 54 46 31 36 5b 32 5d 3b 0a 09 09 73  _t UTF16[2];...s
1bd0: 73 69 7a 65 5f 74 20 55 54 46 38 4c 65 6e 3b 0a  size_t UTF8Len;.
1be0: 09 09 73 69 7a 65 5f 74 20 74 6f 43 6f 70 79 3b  ..size_t toCopy;
1bf0: 0a 09 09 44 57 4f 52 44 20 55 54 46 31 36 4c 65  ...DWORD UTF16Le
1c00: 6e 2c 20 62 79 74 65 73 57 72 69 74 74 65 6e 3b  n, bytesWritten;
1c10: 0a 0a 09 09 55 54 46 38 4c 65 6e 20 3d 20 2d 6f  ....UTF8Len = -o
1c20: 66 5f 73 74 72 69 6e 67 5f 75 74 66 38 5f 64 65  f_string_utf8_de
1c30: 63 6f 64 65 28 0a 09 09 20 20 20 20 5f 69 6e 63  code(...    _inc
1c40: 6f 6d 70 6c 65 74 65 55 54 46 38 53 75 72 72 6f  ompleteUTF8Surro
1c50: 67 61 74 65 2c 20 5f 69 6e 63 6f 6d 70 6c 65 74  gate, _incomplet
1c60: 65 55 54 46 38 53 75 72 72 6f 67 61 74 65 4c 65  eUTF8SurrogateLe
1c70: 6e 2c 20 26 63 29 3b 0a 0a 09 09 4f 46 5f 45 4e  n, &c);....OF_EN
1c80: 53 55 52 45 28 55 54 46 38 4c 65 6e 20 3e 20 30  SURE(UTF8Len > 0
1c90: 29 3b 0a 0a 09 09 74 6f 43 6f 70 79 20 3d 20 55  );....toCopy = U
1ca0: 54 46 38 4c 65 6e 20 2d 20 5f 69 6e 63 6f 6d 70  TF8Len - _incomp
1cb0: 6c 65 74 65 55 54 46 38 53 75 72 72 6f 67 61 74  leteUTF8Surrogat
1cc0: 65 4c 65 6e 3b 0a 09 09 69 66 20 28 74 6f 43 6f  eLen;...if (toCo
1cd0: 70 79 20 3e 20 6c 65 6e 67 74 68 29 0a 09 09 09  py > length)....
1ce0: 74 6f 43 6f 70 79 20 3d 20 6c 65 6e 67 74 68 3b  toCopy = length;
1cf0: 0a 0a 09 09 6d 65 6d 63 70 79 28 5f 69 6e 63 6f  ....memcpy(_inco
1d00: 6d 70 6c 65 74 65 55 54 46 38 53 75 72 72 6f 67  mpleteUTF8Surrog
1d10: 61 74 65 20 2b 20 5f 69 6e 63 6f 6d 70 6c 65 74  ate + _incomplet
1d20: 65 55 54 46 38 53 75 72 72 6f 67 61 74 65 4c 65  eUTF8SurrogateLe
1d30: 6e 2c 0a 09 09 20 20 20 20 62 75 66 66 65 72 2c  n,...    buffer,
1d40: 20 74 6f 43 6f 70 79 29 3b 0a 09 09 5f 69 6e 63   toCopy);..._inc
1d50: 6f 6d 70 6c 65 74 65 55 54 46 38 53 75 72 72 6f  ompleteUTF8Surro
1d60: 67 61 74 65 4c 65 6e 20 2b 3d 20 74 6f 43 6f 70  gateLen += toCop
1d70: 79 3b 0a 0a 09 09 69 66 20 28 5f 69 6e 63 6f 6d  y;....if (_incom
1d80: 70 6c 65 74 65 55 54 46 38 53 75 72 72 6f 67 61  pleteUTF8Surroga
1d90: 74 65 4c 65 6e 20 3c 20 28 73 69 7a 65 5f 74 29  teLen < (size_t)
1da0: 55 54 46 38 4c 65 6e 29 0a 09 09 09 72 65 74 75  UTF8Len)....retu
1db0: 72 6e 20 30 3b 0a 0a 09 09 55 54 46 38 4c 65 6e  rn 0;....UTF8Len
1dc0: 20 3d 20 6f 66 5f 73 74 72 69 6e 67 5f 75 74 66   = of_string_utf
1dd0: 38 5f 64 65 63 6f 64 65 28 0a 09 09 20 20 20 20  8_decode(...    
1de0: 5f 69 6e 63 6f 6d 70 6c 65 74 65 55 54 46 38 53  _incompleteUTF8S
1df0: 75 72 72 6f 67 61 74 65 2c 20 5f 69 6e 63 6f 6d  urrogate, _incom
1e00: 70 6c 65 74 65 55 54 46 38 53 75 72 72 6f 67 61  pleteUTF8Surroga
1e10: 74 65 4c 65 6e 2c 20 26 63 29 3b 0a 0a 09 09 69  teLen, &c);....i
1e20: 66 20 28 55 54 46 38 4c 65 6e 20 3c 3d 20 30 20  f (UTF8Len <= 0 
1e30: 7c 7c 20 63 20 3e 20 30 78 31 30 46 46 46 46 29  || c > 0x10FFFF)
1e40: 20 7b 0a 09 09 09 61 73 73 65 72 74 28 55 54 46   {....assert(UTF
1e50: 38 4c 65 6e 20 3d 3d 20 30 20 7c 7c 20 55 54 46  8Len == 0 || UTF
1e60: 38 4c 65 6e 20 3c 20 2d 34 29 3b 0a 0a 09 09 09  8Len < -4);.....
1e70: 55 54 46 31 36 5b 30 5d 20 3d 20 30 78 46 46 46  UTF16[0] = 0xFFF
1e80: 44 3b 0a 09 09 09 55 54 46 31 36 4c 65 6e 20 3d  D;....UTF16Len =
1e90: 20 31 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09   1;...} else {..
1ea0: 09 09 69 66 20 28 63 20 3e 20 30 78 46 46 46 46  ..if (c > 0xFFFF
1eb0: 29 20 7b 0a 09 09 09 09 63 20 2d 3d 20 30 78 31  ) {.....c -= 0x1
1ec0: 30 30 30 30 3b 0a 09 09 09 09 55 54 46 31 36 5b  0000;.....UTF16[
1ed0: 30 5d 20 3d 20 30 78 44 38 30 30 20 7c 20 28 63  0] = 0xD800 | (c
1ee0: 20 3e 3e 20 31 30 29 3b 0a 09 09 09 09 55 54 46   >> 10);.....UTF
1ef0: 31 36 5b 31 5d 20 3d 20 30 78 44 43 30 30 20 7c  16[1] = 0xDC00 |
1f00: 20 28 63 20 26 20 30 78 33 46 46 29 3b 0a 09 09   (c & 0x3FF);...
1f10: 09 09 55 54 46 31 36 4c 65 6e 20 3d 20 32 3b 0a  ..UTF16Len = 2;.
1f20: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1f30: 55 54 46 31 36 5b 30 5d 20 3d 20 63 3b 0a 09 09  UTF16[0] = c;...
1f40: 09 09 55 54 46 31 36 4c 65 6e 20 3d 20 31 3b 0a  ..UTF16Len = 1;.
1f50: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
1f60: 5b 4f 46 53 79 73 74 65 6d 49 6e 66 6f 20 69 73  [OFSystemInfo is
1f70: 57 69 6e 64 6f 77 73 4e 54 5d 29 20 7b 0a 09 09  WindowsNT]) {...
1f80: 09 69 66 20 28 21 57 72 69 74 65 43 6f 6e 73 6f  .if (!WriteConso
1f90: 6c 65 57 28 5f 68 61 6e 64 6c 65 2c 20 55 54 46  leW(_handle, UTF
1fa0: 31 36 2c 20 55 54 46 31 36 4c 65 6e 2c 0a 09 09  16, UTF16Len,...
1fb0: 09 20 20 20 20 26 62 79 74 65 73 57 72 69 74 74  .    &bytesWritt
1fc0: 65 6e 2c 20 4e 55 4c 4c 29 29 0a 09 09 09 09 40  en, NULL)).....@
1fd0: 74 68 72 6f 77 20 5b 4f 46 57 72 69 74 65 46 61  throw [OFWriteFa
1fe0: 69 6c 65 64 45 78 63 65 70 74 69 6f 6e 0a 09 09  iledException...
1ff0: 09 09 20 20 20 20 65 78 63 65 70 74 69 6f 6e 57  ..    exceptionW
2000: 69 74 68 4f 62 6a 65 63 74 3a 20 73 65 6c 66 0a  ithObject: self.
2010: 09 09 09 09 09 72 65 71 75 65 73 74 65 64 4c 65  .....requestedLe
2020: 6e 67 74 68 3a 20 55 54 46 31 36 4c 65 6e 20 2a  ngth: UTF16Len *
2030: 20 32 0a 09 09 09 09 09 20 20 20 62 79 74 65 73   2......   bytes
2040: 57 72 69 74 74 65 6e 3a 20 62 79 74 65 73 57 72  Written: bytesWr
2050: 69 74 74 65 6e 20 2a 20 32 0a 09 09 09 09 09 09  itten * 2.......
2060: 20 20 65 72 72 4e 6f 3a 20 45 49 4f 5d 3b 0a 09    errNo: EIO];..
2070: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 76 6f 69  .} else {....voi
2080: 64 20 2a 70 6f 6f 6c 20 3d 20 6f 62 6a 63 5f 61  d *pool = objc_a
2090: 75 74 6f 72 65 6c 65 61 73 65 50 6f 6f 6c 50 75  utoreleasePoolPu
20a0: 73 68 28 29 3b 0a 09 09 09 4f 46 53 74 72 69 6e  sh();....OFStrin
20b0: 67 20 2a 73 74 72 69 6e 67 20 3d 20 5b 4f 46 53  g *string = [OFS
20c0: 74 72 69 6e 67 0a 09 09 09 20 20 20 20 73 74 72  tring....    str
20d0: 69 6e 67 57 69 74 68 55 54 46 31 36 53 74 72 69  ingWithUTF16Stri
20e0: 6e 67 3a 20 55 54 46 31 36 0a 09 09 09 09 09 20  ng: UTF16...... 
20f0: 20 20 6c 65 6e 67 74 68 3a 20 55 54 46 31 36 4c    length: UTF16L
2100: 65 6e 5d 3b 0a 09 09 09 6f 66 5f 73 74 72 69 6e  en];....of_strin
2110: 67 5f 65 6e 63 6f 64 69 6e 67 5f 74 20 65 6e 63  g_encoding_t enc
2120: 6f 64 69 6e 67 20 3d 0a 09 09 09 20 20 20 20 63  oding =....    c
2130: 6f 64 65 70 61 67 65 54 6f 45 6e 63 6f 64 69 6e  odepageToEncodin
2140: 67 28 47 65 74 43 6f 6e 73 6f 6c 65 4f 75 74 70  g(GetConsoleOutp
2150: 75 74 43 50 28 29 29 3b 0a 09 09 09 73 69 7a 65  utCP());....size
2160: 5f 74 20 6e 61 74 69 76 65 4c 65 6e 20 3d 20 5b  _t nativeLen = [
2170: 73 74 72 69 6e 67 0a 09 09 09 20 20 20 20 63 53  string....    cS
2180: 74 72 69 6e 67 4c 65 6e 67 74 68 57 69 74 68 45  tringLengthWithE
2190: 6e 63 6f 64 69 6e 67 3a 20 65 6e 63 6f 64 69 6e  ncoding: encodin
21a0: 67 5d 3b 0a 0a 09 09 09 69 66 20 28 6e 61 74 69  g];.....if (nati
21b0: 76 65 4c 65 6e 20 3e 20 55 49 4e 54 33 32 5f 4d  veLen > UINT32_M
21c0: 41 58 29 0a 09 09 09 09 40 74 68 72 6f 77 20 5b  AX).....@throw [
21d0: 4f 46 4f 75 74 4f 66 52 61 6e 67 65 45 78 63 65  OFOutOfRangeExce
21e0: 70 74 69 6f 6e 20 65 78 63 65 70 74 69 6f 6e 5d  ption exception]
21f0: 3b 0a 0a 09 09 09 69 66 20 28 21 57 72 69 74 65  ;.....if (!Write
2200: 43 6f 6e 73 6f 6c 65 41 28 5f 68 61 6e 64 6c 65  ConsoleA(_handle
2210: 2c 0a 09 09 09 20 20 20 20 5b 73 74 72 69 6e 67  ,....    [string
2220: 20 63 53 74 72 69 6e 67 57 69 74 68 45 6e 63 6f   cStringWithEnco
2230: 64 69 6e 67 3a 20 65 6e 63 6f 64 69 6e 67 5d 2c  ding: encoding],
2240: 0a 09 09 09 20 20 20 20 28 44 57 4f 52 44 29 6e  ....    (DWORD)n
2250: 61 74 69 76 65 4c 65 6e 2c 20 26 62 79 74 65 73  ativeLen, &bytes
2260: 57 72 69 74 74 65 6e 2c 20 4e 55 4c 4c 29 29 0a  Written, NULL)).
2270: 09 09 09 09 40 74 68 72 6f 77 20 5b 4f 46 57 72  ....@throw [OFWr
2280: 69 74 65 46 61 69 6c 65 64 45 78 63 65 70 74 69  iteFailedExcepti
2290: 6f 6e 0a 09 09 09 09 20 20 20 20 65 78 63 65 70  on.....    excep
22a0: 74 69 6f 6e 57 69 74 68 4f 62 6a 65 63 74 3a 20  tionWithObject: 
22b0: 73 65 6c 66 0a 09 09 09 09 09 72 65 71 75 65 73  self......reques
22c0: 74 65 64 4c 65 6e 67 74 68 3a 20 6e 61 74 69 76  tedLength: nativ
22d0: 65 4c 65 6e 0a 09 09 09 09 09 20 20 20 62 79 74  eLen......   byt
22e0: 65 73 57 72 69 74 74 65 6e 3a 20 62 79 74 65 73  esWritten: bytes
22f0: 57 72 69 74 74 65 6e 0a 09 09 09 09 09 09 20 20  Written.......  
2300: 65 72 72 4e 6f 3a 20 45 49 4f 5d 3b 0a 0a 09 09  errNo: EIO];....
2310: 09 6f 62 6a 63 5f 61 75 74 6f 72 65 6c 65 61 73  .objc_autoreleas
2320: 65 50 6f 6f 6c 50 6f 70 28 70 6f 6f 6c 29 3b 0a  ePoolPop(pool);.
2330: 09 09 7d 0a 0a 09 09 69 66 20 28 62 79 74 65 73  ..}....if (bytes
2340: 57 72 69 74 74 65 6e 20 21 3d 20 55 54 46 31 36  Written != UTF16
2350: 4c 65 6e 29 0a 09 09 09 40 74 68 72 6f 77 20 5b  Len)....@throw [
2360: 4f 46 57 72 69 74 65 46 61 69 6c 65 64 45 78 63  OFWriteFailedExc
2370: 65 70 74 69 6f 6e 0a 09 09 09 20 20 20 20 65 78  eption....    ex
2380: 63 65 70 74 69 6f 6e 57 69 74 68 4f 62 6a 65 63  ceptionWithObjec
2390: 74 3a 20 73 65 6c 66 0a 09 09 09 09 72 65 71 75  t: self.....requ
23a0: 65 73 74 65 64 4c 65 6e 67 74 68 3a 20 55 54 46  estedLength: UTF
23b0: 31 36 4c 65 6e 20 2a 20 32 0a 09 09 09 09 20 20  16Len * 2.....  
23c0: 20 62 79 74 65 73 57 72 69 74 74 65 6e 3a 20 62   bytesWritten: b
23d0: 79 74 65 73 57 72 69 74 74 65 6e 20 2a 20 32 0a  ytesWritten * 2.
23e0: 09 09 09 09 09 20 20 65 72 72 4e 6f 3a 20 30 5d  .....  errNo: 0]
23f0: 3b 0a 0a 09 09 5f 69 6e 63 6f 6d 70 6c 65 74 65  ;...._incomplete
2400: 55 54 46 38 53 75 72 72 6f 67 61 74 65 4c 65 6e  UTF8SurrogateLen
2410: 20 3d 20 30 3b 0a 09 09 69 20 2b 3d 20 74 6f 43   = 0;...i += toC
2420: 6f 70 79 3b 0a 09 7d 0a 0a 09 74 6d 70 20 3d 20  opy;..}...tmp = 
2430: 5b 73 65 6c 66 20 61 6c 6c 6f 63 4d 65 6d 6f 72  [self allocMemor
2440: 79 57 69 74 68 53 69 7a 65 3a 20 73 69 7a 65 6f  yWithSize: sizeo
2450: 66 28 6f 66 5f 63 68 61 72 31 36 5f 74 29 0a 09  f(of_char16_t)..
2460: 09 09 09 20 20 63 6f 75 6e 74 3a 20 6c 65 6e 67  ...  count: leng
2470: 74 68 20 2a 20 32 5d 3b 0a 09 40 74 72 79 20 7b  th * 2];..@try {
2480: 0a 09 09 44 57 4f 52 44 20 62 79 74 65 73 57 72  ...DWORD bytesWr
2490: 69 74 74 65 6e 3b 0a 0a 09 09 77 68 69 6c 65 20  itten;....while 
24a0: 28 69 20 3c 20 6c 65 6e 67 74 68 29 20 7b 0a 09  (i < length) {..
24b0: 09 09 6f 66 5f 75 6e 69 63 68 61 72 5f 74 20 63  ..of_unichar_t c
24c0: 3b 0a 09 09 09 73 73 69 7a 65 5f 74 20 55 54 46  ;....ssize_t UTF
24d0: 38 4c 65 6e 3b 0a 0a 09 09 09 55 54 46 38 4c 65  8Len;.....UTF8Le
24e0: 6e 20 3d 20 6f 66 5f 73 74 72 69 6e 67 5f 75 74  n = of_string_ut
24f0: 66 38 5f 64 65 63 6f 64 65 28 62 75 66 66 65 72  f8_decode(buffer
2500: 20 2b 20 69 2c 20 6c 65 6e 67 74 68 20 2d 20 69   + i, length - i
2510: 2c 0a 09 09 09 20 20 20 20 26 63 29 3b 0a 0a 09  ,....    &c);...
2520: 09 09 69 66 20 28 55 54 46 38 4c 65 6e 20 3c 20  ..if (UTF8Len < 
2530: 30 20 26 26 20 55 54 46 38 4c 65 6e 20 3e 3d 20  0 && UTF8Len >= 
2540: 2d 34 29 20 7b 0a 09 09 09 09 4f 46 5f 45 4e 53  -4) {.....OF_ENS
2550: 55 52 45 28 6c 65 6e 67 74 68 20 2d 20 69 20 3c  URE(length - i <
2560: 20 34 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79   4);......memcpy
2570: 28 5f 69 6e 63 6f 6d 70 6c 65 74 65 55 54 46 38  (_incompleteUTF8
2580: 53 75 72 72 6f 67 61 74 65 2c 20 62 75 66 66 65  Surrogate, buffe
2590: 72 20 2b 20 69 2c 0a 09 09 09 09 20 20 20 20 6c  r + i,.....    l
25a0: 65 6e 67 74 68 20 2d 20 69 29 3b 0a 09 09 09 09  ength - i);.....
25b0: 5f 69 6e 63 6f 6d 70 6c 65 74 65 55 54 46 38 53  _incompleteUTF8S
25c0: 75 72 72 6f 67 61 74 65 4c 65 6e 20 3d 20 6c 65  urrogateLen = le
25d0: 6e 67 74 68 20 2d 20 69 3b 0a 0a 09 09 09 09 62  ngth - i;......b
25e0: 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  reak;....}.....i
25f0: 66 20 28 55 54 46 38 4c 65 6e 20 3c 3d 20 30 20  f (UTF8Len <= 0 
2600: 7c 7c 20 63 20 3e 20 30 78 31 30 46 46 46 46 29  || c > 0x10FFFF)
2610: 20 7b 0a 09 09 09 09 74 6d 70 5b 6a 2b 2b 5d 20   {.....tmp[j++] 
2620: 3d 20 30 78 46 46 46 44 3b 0a 09 09 09 09 69 2b  = 0xFFFD;.....i+
2630: 2b 3b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  +;.....continue;
2640: 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 20  ....}.....if (c 
2650: 3e 20 30 78 46 46 46 46 29 20 7b 0a 09 09 09 09  > 0xFFFF) {.....
2660: 63 20 2d 3d 20 30 78 31 30 30 30 30 3b 0a 09 09  c -= 0x10000;...
2670: 09 09 74 6d 70 5b 6a 2b 2b 5d 20 3d 20 30 78 44  ..tmp[j++] = 0xD
2680: 38 30 30 20 7c 20 28 63 20 3e 3e 20 31 30 29 3b  800 | (c >> 10);
2690: 0a 09 09 09 09 74 6d 70 5b 6a 2b 2b 5d 20 3d 20  .....tmp[j++] = 
26a0: 30 78 44 43 30 30 20 7c 20 28 63 20 26 20 30 78  0xDC00 | (c & 0x
26b0: 33 46 46 29 3b 0a 09 09 09 7d 20 65 6c 73 65 0a  3FF);....} else.
26c0: 09 09 09 09 74 6d 70 5b 6a 2b 2b 5d 20 3d 20 63  ....tmp[j++] = c
26d0: 3b 0a 0a 09 09 09 69 20 2b 3d 20 55 54 46 38 4c  ;.....i += UTF8L
26e0: 65 6e 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6a  en;...}....if (j
26f0: 20 3e 20 55 49 4e 54 33 32 5f 4d 41 58 29 0a 09   > UINT32_MAX)..
2700: 09 09 40 74 68 72 6f 77 20 5b 4f 46 4f 75 74 4f  ..@throw [OFOutO
2710: 66 52 61 6e 67 65 45 78 63 65 70 74 69 6f 6e 20  fRangeException 
2720: 65 78 63 65 70 74 69 6f 6e 5d 3b 0a 0a 09 09 69  exception];....i
2730: 66 20 28 5b 4f 46 53 79 73 74 65 6d 49 6e 66 6f  f ([OFSystemInfo
2740: 20 69 73 57 69 6e 64 6f 77 73 4e 54 5d 29 20 7b   isWindowsNT]) {
2750: 0a 09 09 09 69 66 20 28 21 57 72 69 74 65 43 6f  ....if (!WriteCo
2760: 6e 73 6f 6c 65 57 28 5f 68 61 6e 64 6c 65 2c 20  nsoleW(_handle, 
2770: 74 6d 70 2c 20 28 44 57 4f 52 44 29 6a 2c 0a 09  tmp, (DWORD)j,..
2780: 09 09 20 20 20 20 26 62 79 74 65 73 57 72 69 74  ..    &bytesWrit
2790: 74 65 6e 2c 20 4e 55 4c 4c 29 29 0a 09 09 09 09  ten, NULL)).....
27a0: 40 74 68 72 6f 77 20 5b 4f 46 57 72 69 74 65 46  @throw [OFWriteF
27b0: 61 69 6c 65 64 45 78 63 65 70 74 69 6f 6e 0a 09  ailedException..
27c0: 09 09 09 20 20 20 20 65 78 63 65 70 74 69 6f 6e  ...    exception
27d0: 57 69 74 68 4f 62 6a 65 63 74 3a 20 73 65 6c 66  WithObject: self
27e0: 0a 09 09 09 09 09 72 65 71 75 65 73 74 65 64 4c  ......requestedL
27f0: 65 6e 67 74 68 3a 20 6a 20 2a 20 32 0a 09 09 09  ength: j * 2....
2800: 09 09 20 20 20 62 79 74 65 73 57 72 69 74 74 65  ..   bytesWritte
2810: 6e 3a 20 62 79 74 65 73 57 72 69 74 74 65 6e 20  n: bytesWritten 
2820: 2a 20 32 0a 09 09 09 09 09 09 20 20 65 72 72 4e  * 2.......  errN
2830: 6f 3a 20 45 49 4f 5d 3b 0a 09 09 7d 20 65 6c 73  o: EIO];...} els
2840: 65 20 7b 0a 09 09 09 76 6f 69 64 20 2a 70 6f 6f  e {....void *poo
2850: 6c 20 3d 20 6f 62 6a 63 5f 61 75 74 6f 72 65 6c  l = objc_autorel
2860: 65 61 73 65 50 6f 6f 6c 50 75 73 68 28 29 3b 0a  easePoolPush();.
2870: 09 09 09 4f 46 53 74 72 69 6e 67 20 2a 73 74 72  ...OFString *str
2880: 69 6e 67 20 3d 20 5b 4f 46 53 74 72 69 6e 67 20  ing = [OFString 
2890: 73 74 72 69 6e 67 57 69 74 68 55 54 46 31 36 53  stringWithUTF16S
28a0: 74 72 69 6e 67 3a 20 74 6d 70 0a 09 09 09 09 09  tring: tmp......
28b0: 09 09 09 20 20 20 20 6c 65 6e 67 74 68 3a 20 6a  ...    length: j
28c0: 5d 3b 0a 09 09 09 6f 66 5f 73 74 72 69 6e 67 5f  ];....of_string_
28d0: 65 6e 63 6f 64 69 6e 67 5f 74 20 65 6e 63 6f 64  encoding_t encod
28e0: 69 6e 67 20 3d 0a 09 09 09 20 20 20 20 63 6f 64  ing =....    cod
28f0: 65 70 61 67 65 54 6f 45 6e 63 6f 64 69 6e 67 28  epageToEncoding(
2900: 47 65 74 43 6f 6e 73 6f 6c 65 4f 75 74 70 75 74  GetConsoleOutput
2910: 43 50 28 29 29 3b 0a 09 09 09 73 69 7a 65 5f 74  CP());....size_t
2920: 20 6e 61 74 69 76 65 4c 65 6e 20 3d 20 5b 73 74   nativeLen = [st
2930: 72 69 6e 67 0a 09 09 09 20 20 20 20 63 53 74 72  ring....    cStr
2940: 69 6e 67 4c 65 6e 67 74 68 57 69 74 68 45 6e 63  ingLengthWithEnc
2950: 6f 64 69 6e 67 3a 20 65 6e 63 6f 64 69 6e 67 5d  oding: encoding]
2960: 3b 0a 0a 09 09 09 69 66 20 28 6e 61 74 69 76 65  ;.....if (native
2970: 4c 65 6e 20 3e 20 55 49 4e 54 33 32 5f 4d 41 58  Len > UINT32_MAX
2980: 29 0a 09 09 09 09 40 74 68 72 6f 77 20 5b 4f 46  ).....@throw [OF
2990: 4f 75 74 4f 66 52 61 6e 67 65 45 78 63 65 70 74  OutOfRangeExcept
29a0: 69 6f 6e 20 65 78 63 65 70 74 69 6f 6e 5d 3b 0a  ion exception];.
29b0: 0a 09 09 09 69 66 20 28 21 57 72 69 74 65 43 6f  ....if (!WriteCo
29c0: 6e 73 6f 6c 65 41 28 5f 68 61 6e 64 6c 65 2c 0a  nsoleA(_handle,.
29d0: 09 09 09 20 20 20 20 5b 73 74 72 69 6e 67 20 63  ...    [string c
29e0: 53 74 72 69 6e 67 57 69 74 68 45 6e 63 6f 64 69  StringWithEncodi
29f0: 6e 67 3a 20 65 6e 63 6f 64 69 6e 67 5d 2c 0a 09  ng: encoding],..
2a00: 09 09 20 20 20 20 28 44 57 4f 52 44 29 6e 61 74  ..    (DWORD)nat
2a10: 69 76 65 4c 65 6e 2c 20 26 62 79 74 65 73 57 72  iveLen, &bytesWr
2a20: 69 74 74 65 6e 2c 20 4e 55 4c 4c 29 29 0a 09 09  itten, NULL))...
2a30: 09 09 40 74 68 72 6f 77 20 5b 4f 46 57 72 69 74  ..@throw [OFWrit
2a40: 65 46 61 69 6c 65 64 45 78 63 65 70 74 69 6f 6e  eFailedException
2a50: 0a 09 09 09 09 20 20 20 20 65 78 63 65 70 74 69  .....    excepti
2a60: 6f 6e 57 69 74 68 4f 62 6a 65 63 74 3a 20 73 65  onWithObject: se
2a70: 6c 66 0a 09 09 09 09 09 72 65 71 75 65 73 74 65  lf......requeste
2a80: 64 4c 65 6e 67 74 68 3a 20 6e 61 74 69 76 65 4c  dLength: nativeL
2a90: 65 6e 0a 09 09 09 09 09 20 20 20 62 79 74 65 73  en......   bytes
2aa0: 57 72 69 74 74 65 6e 3a 20 62 79 74 65 73 57 72  Written: bytesWr
2ab0: 69 74 74 65 6e 0a 09 09 09 09 09 09 20 20 65 72  itten.......  er
2ac0: 72 4e 6f 3a 20 45 49 4f 5d 3b 0a 0a 09 09 09 6f  rNo: EIO];.....o
2ad0: 62 6a 63 5f 61 75 74 6f 72 65 6c 65 61 73 65 50  bjc_autoreleaseP
2ae0: 6f 6f 6c 50 6f 70 28 70 6f 6f 6c 29 3b 0a 09 09  oolPop(pool);...
2af0: 7d 0a 0a 09 09 69 66 20 28 62 79 74 65 73 57 72  }....if (bytesWr
2b00: 69 74 74 65 6e 20 21 3d 20 6a 29 0a 09 09 09 40  itten != j)....@
2b10: 74 68 72 6f 77 20 5b 4f 46 57 72 69 74 65 46 61  throw [OFWriteFa
2b20: 69 6c 65 64 45 78 63 65 70 74 69 6f 6e 0a 09 09  iledException...
2b30: 09 20 20 20 20 65 78 63 65 70 74 69 6f 6e 57 69  .    exceptionWi
2b40: 74 68 4f 62 6a 65 63 74 3a 20 73 65 6c 66 0a 09  thObject: self..
2b50: 09 09 09 72 65 71 75 65 73 74 65 64 4c 65 6e 67  ...requestedLeng
2b60: 74 68 3a 20 6a 20 2a 20 32 0a 09 09 09 09 20 20  th: j * 2.....  
2b70: 20 62 79 74 65 73 57 72 69 74 74 65 6e 3a 20 62   bytesWritten: b
2b80: 79 74 65 73 57 72 69 74 74 65 6e 20 2a 20 32 0a  ytesWritten * 2.
2b90: 09 09 09 09 09 20 20 65 72 72 4e 6f 3a 20 30 5d  .....  errNo: 0]
2ba0: 3b 0a 09 7d 20 40 66 69 6e 61 6c 6c 79 20 7b 0a  ;..} @finally {.
2bb0: 09 09 5b 73 65 6c 66 20 66 72 65 65 4d 65 6d 6f  ..[self freeMemo
2bc0: 72 79 3a 20 74 6d 70 5d 3b 0a 09 7d 0a 0a 09 2f  ry: tmp];..}.../
2bd0: 2a 0a 09 20 2a 20 57 65 20 64 6f 20 6e 6f 74 20  *.. * We do not 
2be0: 63 6f 75 6e 74 20 69 6e 20 62 79 74 65 73 20 77  count in bytes w
2bf0: 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 74  hen writing to t
2c00: 68 65 20 57 69 6e 33 32 20 63 6f 6e 73 6f 6c 65  he Win32 console
2c10: 2e 20 42 75 74 0a 09 20 2a 20 73 69 6e 63 65 20  . But.. * since 
2c20: 61 6e 79 20 69 6e 63 6f 6d 70 6c 65 74 65 20 77  any incomplete w
2c30: 72 69 74 65 20 69 73 20 61 6e 20 65 78 63 65 70  rite is an excep
2c40: 74 69 6f 6e 20 68 65 72 65 20 61 6e 79 77 61 79  tion here anyway
2c50: 2c 20 77 65 20 63 61 6e 20 6a 75 73 74 0a 09 20  , we can just.. 
2c60: 2a 20 72 65 74 75 72 6e 20 6c 65 6e 67 74 68 2e  * return length.
2c70: 0a 09 20 2a 2f 0a 09 72 65 74 75 72 6e 20 6c 65  .. */..return le
2c80: 6e 67 74 68 3b 0a 7d 0a 40 65 6e 64 0a           ngth;.}.@end.