Fossil

Hex Artifact Content
Login

Artifact ab8f5fa33327842cd43959d06c8ba741f3dc467f00bc2a2790d5c1ac48276f7b:


0000: 2f 2a 20 6c 69 6e 65 6e 6f 69 73 65 2e 63 20 2d  /* linenoise.c -
0010: 2d 20 67 75 65 72 72 69 6c 6c 61 20 6c 69 6e 65  - guerrilla line
0020: 20 65 64 69 74 69 6e 67 20 6c 69 62 72 61 72 79   editing library
0030: 20 61 67 61 69 6e 73 74 20 74 68 65 20 69 64 65   against the ide
0040: 61 20 74 68 61 74 20 61 0a 20 2a 20 6c 69 6e 65  a that a. * line
0050: 20 65 64 69 74 69 6e 67 20 6c 69 62 20 6e 65 65   editing lib nee
0060: 64 73 20 74 6f 20 62 65 20 32 30 2c 30 30 30 20  ds to be 20,000 
0070: 6c 69 6e 65 73 20 6f 66 20 43 20 63 6f 64 65 2e  lines of C code.
0080: 0a 20 2a 0a 20 2a 20 59 6f 75 20 63 61 6e 20 66  . *. * You can f
0090: 69 6e 64 20 74 68 65 20 6c 61 74 65 73 74 20 73  ind the latest s
00a0: 6f 75 72 63 65 20 63 6f 64 65 20 61 74 3a 0a 20  ource code at:. 
00b0: 2a 0a 20 2a 20 20 20 68 74 74 70 3a 2f 2f 67 69  *. *   http://gi
00c0: 74 68 75 62 2e 63 6f 6d 2f 61 6e 74 69 72 65 7a  thub.com/antirez
00d0: 2f 6c 69 6e 65 6e 6f 69 73 65 0a 20 2a 0a 20 2a  /linenoise. *. *
00e0: 20 44 6f 65 73 20 61 20 6e 75 6d 62 65 72 20 6f   Does a number o
00f0: 66 20 63 72 61 7a 79 20 61 73 73 75 6d 70 74 69  f crazy assumpti
0100: 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20  ons that happen 
0110: 74 6f 20 62 65 20 74 72 75 65 20 69 6e 20 39 39  to be true in 99
0120: 2e 39 39 39 39 25 20 6f 66 0a 20 2a 20 74 68 65  .9999% of. * the
0130: 20 32 30 31 30 20 55 4e 49 58 20 63 6f 6d 70 75   2010 UNIX compu
0140: 74 65 72 73 20 61 72 6f 75 6e 64 2e 0a 20 2a 0a  ters around.. *.
0150: 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   * -------------
0160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
01a0: 2a 20 43 6f 70 79 72 69 67 68 74 20 28 63 29 20  * Copyright (c) 
01b0: 32 30 31 30 2d 32 30 31 36 2c 20 53 61 6c 76 61  2010-2016, Salva
01c0: 74 6f 72 65 20 53 61 6e 66 69 6c 69 70 70 6f 20  tore Sanfilippo 
01d0: 3c 61 6e 74 69 72 65 7a 20 61 74 20 67 6d 61 69  <antirez at gmai
01e0: 6c 20 64 6f 74 20 63 6f 6d 3e 0a 20 2a 20 43 6f  l dot com>. * Co
01f0: 70 79 72 69 67 68 74 20 28 63 29 20 32 30 31 30  pyright (c) 2010
0200: 2d 32 30 31 33 2c 20 50 69 65 74 65 72 20 4e 6f  -2013, Pieter No
0210: 6f 72 64 68 75 69 73 20 3c 70 63 6e 6f 6f 72 64  ordhuis <pcnoord
0220: 68 75 69 73 20 61 74 20 67 6d 61 69 6c 20 64 6f  huis at gmail do
0230: 74 20 63 6f 6d 3e 0a 20 2a 0a 20 2a 20 41 6c 6c  t com>. *. * All
0240: 20 72 69 67 68 74 73 20 72 65 73 65 72 76 65 64   rights reserved
0250: 2e 0a 20 2a 0a 20 2a 20 52 65 64 69 73 74 72 69  .. *. * Redistri
0260: 62 75 74 69 6f 6e 20 61 6e 64 20 75 73 65 20 69  bution and use i
0270: 6e 20 73 6f 75 72 63 65 20 61 6e 64 20 62 69 6e  n source and bin
0280: 61 72 79 20 66 6f 72 6d 73 2c 20 77 69 74 68 20  ary forms, with 
0290: 6f 72 20 77 69 74 68 6f 75 74 0a 20 2a 20 6d 6f  or without. * mo
02a0: 64 69 66 69 63 61 74 69 6f 6e 2c 20 61 72 65 20  dification, are 
02b0: 70 65 72 6d 69 74 74 65 64 20 70 72 6f 76 69 64  permitted provid
02c0: 65 64 20 74 68 61 74 20 74 68 65 20 66 6f 6c 6c  ed that the foll
02d0: 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 73  owing conditions
02e0: 20 61 72 65 0a 20 2a 20 6d 65 74 3a 0a 20 2a 0a   are. * met:. *.
02f0: 20 2a 20 20 2a 20 20 52 65 64 69 73 74 72 69 62   *  *  Redistrib
0300: 75 74 69 6f 6e 73 20 6f 66 20 73 6f 75 72 63 65  utions of source
0310: 20 63 6f 64 65 20 6d 75 73 74 20 72 65 74 61 69   code must retai
0320: 6e 20 74 68 65 20 61 62 6f 76 65 20 63 6f 70 79  n the above copy
0330: 72 69 67 68 74 0a 20 2a 20 20 20 20 20 6e 6f 74  right. *     not
0340: 69 63 65 2c 20 74 68 69 73 20 6c 69 73 74 20 6f  ice, this list o
0350: 66 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64  f conditions and
0360: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   the following d
0370: 69 73 63 6c 61 69 6d 65 72 2e 0a 20 2a 0a 20 2a  isclaimer.. *. *
0380: 20 20 2a 20 20 52 65 64 69 73 74 72 69 62 75 74    *  Redistribut
0390: 69 6f 6e 73 20 69 6e 20 62 69 6e 61 72 79 20 66  ions in binary f
03a0: 6f 72 6d 20 6d 75 73 74 20 72 65 70 72 6f 64 75  orm must reprodu
03b0: 63 65 20 74 68 65 20 61 62 6f 76 65 20 63 6f 70  ce the above cop
03c0: 79 72 69 67 68 74 0a 20 2a 20 20 20 20 20 6e 6f  yright. *     no
03d0: 74 69 63 65 2c 20 74 68 69 73 20 6c 69 73 74 20  tice, this list 
03e0: 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e  of conditions an
03f0: 64 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  d the following 
0400: 64 69 73 63 6c 61 69 6d 65 72 20 69 6e 20 74 68  disclaimer in th
0410: 65 0a 20 2a 20 20 20 20 20 64 6f 63 75 6d 65 6e  e. *     documen
0420: 74 61 74 69 6f 6e 20 61 6e 64 2f 6f 72 20 6f 74  tation and/or ot
0430: 68 65 72 20 6d 61 74 65 72 69 61 6c 73 20 70 72  her materials pr
0440: 6f 76 69 64 65 64 20 77 69 74 68 20 74 68 65 20  ovided with the 
0450: 64 69 73 74 72 69 62 75 74 69 6f 6e 2e 0a 20 2a  distribution.. *
0460: 0a 20 2a 20 54 48 49 53 20 53 4f 46 54 57 41 52  . * THIS SOFTWAR
0470: 45 20 49 53 20 50 52 4f 56 49 44 45 44 20 42 59  E IS PROVIDED BY
0480: 20 54 48 45 20 43 4f 50 59 52 49 47 48 54 20 48   THE COPYRIGHT H
0490: 4f 4c 44 45 52 53 20 41 4e 44 20 43 4f 4e 54 52  OLDERS AND CONTR
04a0: 49 42 55 54 4f 52 53 0a 20 2a 20 22 41 53 20 49  IBUTORS. * "AS I
04b0: 53 22 20 41 4e 44 20 41 4e 59 20 45 58 50 52 45  S" AND ANY EXPRE
04c0: 53 53 20 4f 52 20 49 4d 50 4c 49 45 44 20 57 41  SS OR IMPLIED WA
04d0: 52 52 41 4e 54 49 45 53 2c 20 49 4e 43 4c 55 44  RRANTIES, INCLUD
04e0: 49 4e 47 2c 20 42 55 54 20 4e 4f 54 0a 20 2a 20  ING, BUT NOT. * 
04f0: 4c 49 4d 49 54 45 44 20 54 4f 2c 20 54 48 45 20  LIMITED TO, THE 
0500: 49 4d 50 4c 49 45 44 20 57 41 52 52 41 4e 54 49  IMPLIED WARRANTI
0510: 45 53 20 4f 46 20 4d 45 52 43 48 41 4e 54 41 42  ES OF MERCHANTAB
0520: 49 4c 49 54 59 20 41 4e 44 20 46 49 54 4e 45 53  ILITY AND FITNES
0530: 53 20 46 4f 52 0a 20 2a 20 41 20 50 41 52 54 49  S FOR. * A PARTI
0540: 43 55 4c 41 52 20 50 55 52 50 4f 53 45 20 41 52  CULAR PURPOSE AR
0550: 45 20 44 49 53 43 4c 41 49 4d 45 44 2e 20 49 4e  E DISCLAIMED. IN
0560: 20 4e 4f 20 45 56 45 4e 54 20 53 48 41 4c 4c 20   NO EVENT SHALL 
0570: 54 48 45 20 43 4f 50 59 52 49 47 48 54 0a 20 2a  THE COPYRIGHT. *
0580: 20 48 4f 4c 44 45 52 20 4f 52 20 43 4f 4e 54 52   HOLDER OR CONTR
0590: 49 42 55 54 4f 52 53 20 42 45 20 4c 49 41 42 4c  IBUTORS BE LIABL
05a0: 45 20 46 4f 52 20 41 4e 59 20 44 49 52 45 43 54  E FOR ANY DIRECT
05b0: 2c 20 49 4e 44 49 52 45 43 54 2c 20 49 4e 43 49  , INDIRECT, INCI
05c0: 44 45 4e 54 41 4c 2c 0a 20 2a 20 53 50 45 43 49  DENTAL,. * SPECI
05d0: 41 4c 2c 20 45 58 45 4d 50 4c 41 52 59 2c 20 4f  AL, EXEMPLARY, O
05e0: 52 20 43 4f 4e 53 45 51 55 45 4e 54 49 41 4c 20  R CONSEQUENTIAL 
05f0: 44 41 4d 41 47 45 53 20 28 49 4e 43 4c 55 44 49  DAMAGES (INCLUDI
0600: 4e 47 2c 20 42 55 54 20 4e 4f 54 0a 20 2a 20 4c  NG, BUT NOT. * L
0610: 49 4d 49 54 45 44 20 54 4f 2c 20 50 52 4f 43 55  IMITED TO, PROCU
0620: 52 45 4d 45 4e 54 20 4f 46 20 53 55 42 53 54 49  REMENT OF SUBSTI
0630: 54 55 54 45 20 47 4f 4f 44 53 20 4f 52 20 53 45  TUTE GOODS OR SE
0640: 52 56 49 43 45 53 3b 20 4c 4f 53 53 20 4f 46 20  RVICES; LOSS OF 
0650: 55 53 45 2c 0a 20 2a 20 44 41 54 41 2c 20 4f 52  USE,. * DATA, OR
0660: 20 50 52 4f 46 49 54 53 3b 20 4f 52 20 42 55 53   PROFITS; OR BUS
0670: 49 4e 45 53 53 20 49 4e 54 45 52 52 55 50 54 49  INESS INTERRUPTI
0680: 4f 4e 29 20 48 4f 57 45 56 45 52 20 43 41 55 53  ON) HOWEVER CAUS
0690: 45 44 20 41 4e 44 20 4f 4e 20 41 4e 59 0a 20 2a  ED AND ON ANY. *
06a0: 20 54 48 45 4f 52 59 20 4f 46 20 4c 49 41 42 49   THEORY OF LIABI
06b0: 4c 49 54 59 2c 20 57 48 45 54 48 45 52 20 49 4e  LITY, WHETHER IN
06c0: 20 43 4f 4e 54 52 41 43 54 2c 20 53 54 52 49 43   CONTRACT, STRIC
06d0: 54 20 4c 49 41 42 49 4c 49 54 59 2c 20 4f 52 20  T LIABILITY, OR 
06e0: 54 4f 52 54 0a 20 2a 20 28 49 4e 43 4c 55 44 49  TORT. * (INCLUDI
06f0: 4e 47 20 4e 45 47 4c 49 47 45 4e 43 45 20 4f 52  NG NEGLIGENCE OR
0700: 20 4f 54 48 45 52 57 49 53 45 29 20 41 52 49 53   OTHERWISE) ARIS
0710: 49 4e 47 20 49 4e 20 41 4e 59 20 57 41 59 20 4f  ING IN ANY WAY O
0720: 55 54 20 4f 46 20 54 48 45 20 55 53 45 0a 20 2a  UT OF THE USE. *
0730: 20 4f 46 20 54 48 49 53 20 53 4f 46 54 57 41 52   OF THIS SOFTWAR
0740: 45 2c 20 45 56 45 4e 20 49 46 20 41 44 56 49 53  E, EVEN IF ADVIS
0750: 45 44 20 4f 46 20 54 48 45 20 50 4f 53 53 49 42  ED OF THE POSSIB
0760: 49 4c 49 54 59 20 4f 46 20 53 55 43 48 20 44 41  ILITY OF SUCH DA
0770: 4d 41 47 45 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d  MAGE.. *. * ----
0780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07c0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 52 65 66 65 72  ----. *. * Refer
07d0: 65 6e 63 65 73 3a 0a 20 2a 20 2d 20 68 74 74 70  ences:. * - http
07e0: 3a 2f 2f 69 6e 76 69 73 69 62 6c 65 2d 69 73 6c  ://invisible-isl
07f0: 61 6e 64 2e 6e 65 74 2f 78 74 65 72 6d 2f 63 74  and.net/xterm/ct
0800: 6c 73 65 71 73 2f 63 74 6c 73 65 71 73 2e 68 74  lseqs/ctlseqs.ht
0810: 6d 6c 0a 20 2a 20 2d 20 68 74 74 70 3a 2f 2f 77  ml. * - http://w
0820: 77 77 2e 33 77 61 79 6c 61 62 73 2e 63 6f 6d 2f  ww.3waylabs.com/
0830: 6e 77 2f 57 57 57 2f 70 72 6f 64 75 63 74 73 2f  nw/WWW/products/
0840: 77 69 7a 63 6f 6e 2f 76 74 32 32 30 2e 68 74 6d  wizcon/vt220.htm
0850: 6c 0a 20 2a 0a 20 2a 20 54 6f 64 6f 20 6c 69 73  l. *. * Todo lis
0860: 74 3a 0a 20 2a 20 2d 20 46 69 6c 74 65 72 20 62  t:. * - Filter b
0870: 6f 67 75 73 20 43 74 72 6c 2b 3c 63 68 61 72 3e  ogus Ctrl+<char>
0880: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 2e 0a 20   combinations.. 
0890: 2a 20 2d 20 57 69 6e 33 32 20 73 75 70 70 6f 72  * - Win32 suppor
08a0: 74 0a 20 2a 0a 20 2a 20 42 6c 6f 61 74 3a 0a 20  t. *. * Bloat:. 
08b0: 2a 20 2d 20 48 69 73 74 6f 72 79 20 73 65 61 72  * - History sear
08c0: 63 68 20 6c 69 6b 65 20 43 74 72 6c 2b 72 20 69  ch like Ctrl+r i
08d0: 6e 20 72 65 61 64 6c 69 6e 65 3f 0a 20 2a 0a 20  n readline?. *. 
08e0: 2a 20 4c 69 73 74 20 6f 66 20 65 73 63 61 70 65  * List of escape
08f0: 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
0900: 62 79 20 74 68 69 73 20 70 72 6f 67 72 61 6d 2c  by this program,
0910: 20 77 65 20 64 6f 20 65 76 65 72 79 74 68 69 6e   we do everythin
0920: 67 20 6a 75 73 74 0a 20 2a 20 77 69 74 68 20 74  g just. * with t
0930: 68 72 65 65 20 73 65 71 75 65 6e 63 65 73 2e 20  hree sequences. 
0940: 49 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 73  In order to be s
0950: 6f 20 63 68 65 61 70 20 77 65 20 6d 61 79 20 68  o cheap we may h
0960: 61 76 65 20 73 6f 6d 65 0a 20 2a 20 66 6c 69 63  ave some. * flic
0970: 6b 65 72 69 6e 67 20 65 66 66 65 63 74 20 77 69  kering effect wi
0980: 74 68 20 73 6f 6d 65 20 73 6c 6f 77 20 74 65 72  th some slow ter
0990: 6d 69 6e 61 6c 2c 20 62 75 74 20 74 68 65 20 6c  minal, but the l
09a0: 65 73 73 65 72 20 73 65 71 75 65 6e 63 65 73 0a  esser sequences.
09b0: 20 2a 20 74 68 65 20 6d 6f 72 65 20 63 6f 6d 70   * the more comp
09c0: 61 74 69 62 6c 65 2e 0a 20 2a 0a 20 2a 20 45 4c  atible.. *. * EL
09d0: 20 28 45 72 61 73 65 20 4c 69 6e 65 29 0a 20 2a   (Erase Line). *
09e0: 20 20 20 20 53 65 71 75 65 6e 63 65 3a 20 45 53      Sequence: ES
09f0: 43 20 5b 20 6e 20 4b 0a 20 2a 20 20 20 20 45 66  C [ n K. *    Ef
0a00: 66 65 63 74 3a 20 69 66 20 6e 20 69 73 20 30 20  fect: if n is 0 
0a10: 6f 72 20 6d 69 73 73 69 6e 67 2c 20 63 6c 65 61  or missing, clea
0a20: 72 20 66 72 6f 6d 20 63 75 72 73 6f 72 20 74 6f  r from cursor to
0a30: 20 65 6e 64 20 6f 66 20 6c 69 6e 65 0a 20 2a 20   end of line. * 
0a40: 20 20 20 45 66 66 65 63 74 3a 20 69 66 20 6e 20     Effect: if n 
0a50: 69 73 20 31 2c 20 63 6c 65 61 72 20 66 72 6f 6d  is 1, clear from
0a60: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6c 69   beginning of li
0a70: 6e 65 20 74 6f 20 63 75 72 73 6f 72 0a 20 2a 20  ne to cursor. * 
0a80: 20 20 20 45 66 66 65 63 74 3a 20 69 66 20 6e 20     Effect: if n 
0a90: 69 73 20 32 2c 20 63 6c 65 61 72 20 65 6e 74 69  is 2, clear enti
0aa0: 72 65 20 6c 69 6e 65 0a 20 2a 0a 20 2a 20 43 55  re line. *. * CU
0ab0: 46 20 28 43 55 72 73 6f 72 20 46 6f 72 77 61 72  F (CUrsor Forwar
0ac0: 64 29 0a 20 2a 20 20 20 20 53 65 71 75 65 6e 63  d). *    Sequenc
0ad0: 65 3a 20 45 53 43 20 5b 20 6e 20 43 0a 20 2a 20  e: ESC [ n C. * 
0ae0: 20 20 20 45 66 66 65 63 74 3a 20 6d 6f 76 65 73     Effect: moves
0af0: 20 63 75 72 73 6f 72 20 66 6f 72 77 61 72 64 20   cursor forward 
0b00: 6e 20 63 68 61 72 73 0a 20 2a 0a 20 2a 20 43 55  n chars. *. * CU
0b10: 42 20 28 43 55 72 73 6f 72 20 42 61 63 6b 77 61  B (CUrsor Backwa
0b20: 72 64 29 0a 20 2a 20 20 20 20 53 65 71 75 65 6e  rd). *    Sequen
0b30: 63 65 3a 20 45 53 43 20 5b 20 6e 20 44 0a 20 2a  ce: ESC [ n D. *
0b40: 20 20 20 20 45 66 66 65 63 74 3a 20 6d 6f 76 65      Effect: move
0b50: 73 20 63 75 72 73 6f 72 20 62 61 63 6b 77 61 72  s cursor backwar
0b60: 64 20 6e 20 63 68 61 72 73 0a 20 2a 0a 20 2a 20  d n chars. *. * 
0b70: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
0b80: 20 75 73 65 64 20 74 6f 20 67 65 74 20 74 68 65   used to get the
0b90: 20 74 65 72 6d 69 6e 61 6c 20 77 69 64 74 68 20   terminal width 
0ba0: 69 66 20 67 65 74 74 69 6e 67 0a 20 2a 20 74 68  if getting. * th
0bb0: 65 20 77 69 64 74 68 20 77 69 74 68 20 74 68 65  e width with the
0bc0: 20 54 49 4f 43 47 57 49 4e 53 5a 20 69 6f 63 74   TIOCGWINSZ ioct
0bd0: 6c 20 66 61 69 6c 73 0a 20 2a 0a 20 2a 20 44 53  l fails. *. * DS
0be0: 52 20 28 44 65 76 69 63 65 20 53 74 61 74 75 73  R (Device Status
0bf0: 20 52 65 70 6f 72 74 29 0a 20 2a 20 20 20 20 53   Report). *    S
0c00: 65 71 75 65 6e 63 65 3a 20 45 53 43 20 5b 20 36  equence: ESC [ 6
0c10: 20 6e 0a 20 2a 20 20 20 20 45 66 66 65 63 74 3a   n. *    Effect:
0c20: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
0c30: 72 65 6e 74 20 63 75 73 6f 72 20 70 6f 73 69 74  rent cusor posit
0c40: 69 6f 6e 20 61 73 20 45 53 43 20 5b 20 6e 20 3b  ion as ESC [ n ;
0c50: 20 6d 20 52 0a 20 2a 20 20 20 20 20 20 20 20 20   m R. *         
0c60: 20 20 20 77 68 65 72 65 20 6e 20 69 73 20 74 68     where n is th
0c70: 65 20 72 6f 77 20 61 6e 64 20 6d 20 69 73 20 74  e row and m is t
0c80: 68 65 20 63 6f 6c 75 6d 6e 0a 20 2a 0a 20 2a 20  he column. *. * 
0c90: 57 68 65 6e 20 6d 75 6c 74 69 20 6c 69 6e 65 20  When multi line 
0ca0: 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2c  mode is enabled,
0cb0: 20 77 65 20 61 6c 73 6f 20 75 73 65 20 61 6e 20   we also use an 
0cc0: 61 64 64 69 74 69 6f 6e 61 6c 20 65 73 63 61 70  additional escap
0cd0: 65 0a 20 2a 20 73 65 71 75 65 6e 63 65 2e 20 48  e. * sequence. H
0ce0: 6f 77 65 76 65 72 20 6d 75 6c 74 69 20 6c 69 6e  owever multi lin
0cf0: 65 20 65 64 69 74 69 6e 67 20 69 73 20 64 69 73  e editing is dis
0d00: 61 62 6c 65 64 20 62 79 20 64 65 66 61 75 6c 74  abled by default
0d10: 2e 0a 20 2a 0a 20 2a 20 43 55 55 20 28 43 75 72  .. *. * CUU (Cur
0d20: 73 6f 72 20 55 70 29 0a 20 2a 20 20 20 20 53 65  sor Up). *    Se
0d30: 71 75 65 6e 63 65 3a 20 45 53 43 20 5b 20 6e 20  quence: ESC [ n 
0d40: 41 0a 20 2a 20 20 20 20 45 66 66 65 63 74 3a 20  A. *    Effect: 
0d50: 6d 6f 76 65 73 20 63 75 72 73 6f 72 20 75 70 20  moves cursor up 
0d60: 6f 66 20 6e 20 63 68 61 72 73 2e 0a 20 2a 0a 20  of n chars.. *. 
0d70: 2a 20 43 55 44 20 28 43 75 72 73 6f 72 20 44 6f  * CUD (Cursor Do
0d80: 77 6e 29 0a 20 2a 20 20 20 20 53 65 71 75 65 6e  wn). *    Sequen
0d90: 63 65 3a 20 45 53 43 20 5b 20 6e 20 42 0a 20 2a  ce: ESC [ n B. *
0da0: 20 20 20 20 45 66 66 65 63 74 3a 20 6d 6f 76 65      Effect: move
0db0: 73 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 6f 66  s cursor down of
0dc0: 20 6e 20 63 68 61 72 73 2e 0a 20 2a 0a 20 2a 20   n chars.. *. * 
0dd0: 57 68 65 6e 20 6c 69 6e 65 6e 6f 69 73 65 43 6c  When linenoiseCl
0de0: 65 61 72 53 63 72 65 65 6e 28 29 20 69 73 20 63  earScreen() is c
0df0: 61 6c 6c 65 64 2c 20 74 77 6f 20 61 64 64 69 74  alled, two addit
0e00: 69 6f 6e 61 6c 20 65 73 63 61 70 65 20 73 65 71  ional escape seq
0e10: 75 65 6e 63 65 73 0a 20 2a 20 61 72 65 20 75 73  uences. * are us
0e20: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ed in order to c
0e30: 6c 65 61 72 20 74 68 65 20 73 63 72 65 65 6e 20  lear the screen 
0e40: 61 6e 64 20 70 6f 73 69 74 69 6f 6e 20 74 68 65  and position the
0e50: 20 63 75 72 73 6f 72 20 61 74 20 68 6f 6d 65 0a   cursor at home.
0e60: 20 2a 20 70 6f 73 69 74 69 6f 6e 2e 0a 20 2a 0a   * position.. *.
0e70: 20 2a 20 43 55 50 20 28 43 75 72 73 6f 72 20 70   * CUP (Cursor p
0e80: 6f 73 69 74 69 6f 6e 29 0a 20 2a 20 20 20 20 53  osition). *    S
0e90: 65 71 75 65 6e 63 65 3a 20 45 53 43 20 5b 20 48  equence: ESC [ H
0ea0: 0a 20 2a 20 20 20 20 45 66 66 65 63 74 3a 20 6d  . *    Effect: m
0eb0: 6f 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20  oves the cursor 
0ec0: 74 6f 20 75 70 70 65 72 20 6c 65 66 74 20 63 6f  to upper left co
0ed0: 72 6e 65 72 0a 20 2a 0a 20 2a 20 45 44 20 28 45  rner. *. * ED (E
0ee0: 72 61 73 65 20 64 69 73 70 6c 61 79 29 0a 20 2a  rase display). *
0ef0: 20 20 20 20 53 65 71 75 65 6e 63 65 3a 20 45 53      Sequence: ES
0f00: 43 20 5b 20 32 20 4a 0a 20 2a 20 20 20 20 45 66  C [ 2 J. *    Ef
0f10: 66 65 63 74 3a 20 63 6c 65 61 72 20 74 68 65 20  fect: clear the 
0f20: 77 68 6f 6c 65 20 73 63 72 65 65 6e 0a 20 2a 0a  whole screen. *.
0f30: 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 74   */..#include <t
0f40: 65 72 6d 69 6f 73 2e 68 3e 0a 23 69 6e 63 6c 75  ermios.h>.#inclu
0f50: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69  de <unistd.h>.#i
0f60: 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68  nclude <stdlib.h
0f70: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69  >.#include <stdi
0f80: 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65  o.h>.#include <e
0f90: 72 72 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  rrno.h>.#include
0fa0: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63   <string.h>.#inc
0fb0: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
0fc0: 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e  #include <ctype.
0fd0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0fe0: 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  /stat.h>.#includ
0ff0: 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a  e <sys/types.h>.
1000: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f  #include <sys/io
1010: 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ctl.h>.#include 
1020: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1030: 75 64 65 20 22 6c 69 6e 65 6e 6f 69 73 65 2e 68  ude "linenoise.h
1040: 22 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 4e  "..#define LINEN
1050: 4f 49 53 45 5f 44 45 46 41 55 4c 54 5f 48 49 53  OISE_DEFAULT_HIS
1060: 54 4f 52 59 5f 4d 41 58 5f 4c 45 4e 20 31 30 30  TORY_MAX_LEN 100
1070: 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 4e 4f 49  .#define LINENOI
1080: 53 45 5f 4d 41 58 5f 4c 49 4e 45 20 34 30 39 36  SE_MAX_LINE 4096
1090: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e  .static char *un
10a0: 73 75 70 70 6f 72 74 65 64 5f 74 65 72 6d 5b 5d  supported_term[]
10b0: 20 3d 20 7b 22 64 75 6d 62 22 2c 22 63 6f 6e 73   = {"dumb","cons
10c0: 32 35 22 2c 22 65 6d 61 63 73 22 2c 4e 55 4c 4c  25","emacs",NULL
10d0: 7d 3b 0a 73 74 61 74 69 63 20 6c 69 6e 65 6e 6f  };.static lineno
10e0: 69 73 65 43 6f 6d 70 6c 65 74 69 6f 6e 43 61 6c  iseCompletionCal
10f0: 6c 62 61 63 6b 20 2a 63 6f 6d 70 6c 65 74 69 6f  lback *completio
1100: 6e 43 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c  nCallback = NULL
1110: 3b 0a 73 74 61 74 69 63 20 6c 69 6e 65 6e 6f 69  ;.static linenoi
1120: 73 65 48 69 6e 74 73 43 61 6c 6c 62 61 63 6b 20  seHintsCallback 
1130: 2a 68 69 6e 74 73 43 61 6c 6c 62 61 63 6b 20 3d  *hintsCallback =
1140: 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 6c 69   NULL;.static li
1150: 6e 65 6e 6f 69 73 65 46 72 65 65 48 69 6e 74 73  nenoiseFreeHints
1160: 43 61 6c 6c 62 61 63 6b 20 2a 66 72 65 65 48 69  Callback *freeHi
1170: 6e 74 73 43 61 6c 6c 62 61 63 6b 20 3d 20 4e 55  ntsCallback = NU
1180: 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 73 74 72 75  LL;..static stru
1190: 63 74 20 74 65 72 6d 69 6f 73 20 6f 72 69 67 5f  ct termios orig_
11a0: 74 65 72 6d 69 6f 73 3b 20 2f 2a 20 49 6e 20 6f  termios; /* In o
11b0: 72 64 65 72 20 74 6f 20 72 65 73 74 6f 72 65 20  rder to restore 
11c0: 61 74 20 65 78 69 74 2e 2a 2f 0a 73 74 61 74 69  at exit.*/.stati
11d0: 63 20 69 6e 74 20 72 61 77 6d 6f 64 65 20 3d 20  c int rawmode = 
11e0: 30 3b 20 2f 2a 20 46 6f 72 20 61 74 65 78 69 74  0; /* For atexit
11f0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63  () function to c
1200: 68 65 63 6b 20 69 66 20 72 65 73 74 6f 72 65 20  heck if restore 
1210: 69 73 20 6e 65 65 64 65 64 2a 2f 0a 73 74 61 74  is needed*/.stat
1220: 69 63 20 69 6e 74 20 6d 6c 6d 6f 64 65 20 3d 20  ic int mlmode = 
1230: 30 3b 20 20 2f 2a 20 4d 75 6c 74 69 20 6c 69 6e  0;  /* Multi lin
1240: 65 20 6d 6f 64 65 2e 20 44 65 66 61 75 6c 74 20  e mode. Default 
1250: 69 73 20 73 69 6e 67 6c 65 20 6c 69 6e 65 2e 20  is single line. 
1260: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 74  */.static int at
1270: 65 78 69 74 5f 72 65 67 69 73 74 65 72 65 64 20  exit_registered 
1280: 3d 20 30 3b 20 2f 2a 20 52 65 67 69 73 74 65 72  = 0; /* Register
1290: 20 61 74 65 78 69 74 20 6a 75 73 74 20 31 20 74   atexit just 1 t
12a0: 69 6d 65 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  ime. */.static i
12b0: 6e 74 20 68 69 73 74 6f 72 79 5f 6d 61 78 5f 6c  nt history_max_l
12c0: 65 6e 20 3d 20 4c 49 4e 45 4e 4f 49 53 45 5f 44  en = LINENOISE_D
12d0: 45 46 41 55 4c 54 5f 48 49 53 54 4f 52 59 5f 4d  EFAULT_HISTORY_M
12e0: 41 58 5f 4c 45 4e 3b 0a 73 74 61 74 69 63 20 69  AX_LEN;.static i
12f0: 6e 74 20 68 69 73 74 6f 72 79 5f 6c 65 6e 20 3d  nt history_len =
1300: 20 30 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20   0;.static char 
1310: 2a 2a 68 69 73 74 6f 72 79 20 3d 20 4e 55 4c 4c  **history = NULL
1320: 3b 0a 0a 2f 2a 20 54 68 65 20 6c 69 6e 65 6e 6f  ;../* The lineno
1330: 69 73 65 53 74 61 74 65 20 73 74 72 75 63 74 75  iseState structu
1340: 72 65 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  re represents th
1350: 65 20 73 74 61 74 65 20 64 75 72 69 6e 67 20 6c  e state during l
1360: 69 6e 65 20 65 64 69 74 69 6e 67 2e 0a 20 2a 20  ine editing.. * 
1370: 57 65 20 70 61 73 73 20 74 68 69 73 20 73 74 61  We pass this sta
1380: 74 65 20 74 6f 20 66 75 6e 63 74 69 6f 6e 73 20  te to functions 
1390: 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 73 70 65  implementing spe
13a0: 63 69 66 69 63 20 65 64 69 74 69 6e 67 0a 20 2a  cific editing. *
13b0: 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 69 65 73   functionalities
13c0: 2e 20 2a 2f 0a 73 74 72 75 63 74 20 6c 69 6e 65  . */.struct line
13d0: 6e 6f 69 73 65 53 74 61 74 65 20 7b 0a 20 20 20  noiseState {.   
13e0: 20 69 6e 74 20 69 66 64 3b 20 20 20 20 20 20 20   int ifd;       
13f0: 20 20 20 20 20 2f 2a 20 54 65 72 6d 69 6e 61 6c       /* Terminal
1400: 20 73 74 64 69 6e 20 66 69 6c 65 20 64 65 73 63   stdin file desc
1410: 72 69 70 74 6f 72 2e 20 2a 2f 0a 20 20 20 20 69  riptor. */.    i
1420: 6e 74 20 6f 66 64 3b 20 20 20 20 20 20 20 20 20  nt ofd;         
1430: 20 20 20 2f 2a 20 54 65 72 6d 69 6e 61 6c 20 73     /* Terminal s
1440: 74 64 6f 75 74 20 66 69 6c 65 20 64 65 73 63 72  tdout file descr
1450: 69 70 74 6f 72 2e 20 2a 2f 0a 20 20 20 20 63 68  iptor. */.    ch
1460: 61 72 20 2a 62 75 66 3b 20 20 20 20 20 20 20 20  ar *buf;        
1470: 20 20 2f 2a 20 45 64 69 74 65 64 20 6c 69 6e 65    /* Edited line
1480: 20 62 75 66 66 65 72 2e 20 2a 2f 0a 20 20 20 20   buffer. */.    
1490: 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 20 20  size_t buflen;  
14a0: 20 20 20 20 2f 2a 20 45 64 69 74 65 64 20 6c 69      /* Edited li
14b0: 6e 65 20 62 75 66 66 65 72 20 73 69 7a 65 2e 20  ne buffer size. 
14c0: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
14d0: 72 20 2a 70 72 6f 6d 70 74 3b 20 2f 2a 20 50 72  r *prompt; /* Pr
14e0: 6f 6d 70 74 20 74 6f 20 64 69 73 70 6c 61 79 2e  ompt to display.
14f0: 20 2a 2f 0a 20 20 20 20 73 69 7a 65 5f 74 20 70   */.    size_t p
1500: 6c 65 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  len;        /* P
1510: 72 6f 6d 70 74 20 6c 65 6e 67 74 68 2e 20 2a 2f  rompt length. */
1520: 0a 20 20 20 20 73 69 7a 65 5f 74 20 70 6f 73 3b  .    size_t pos;
1530: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1540: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
1550: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  ion. */.    size
1560: 5f 74 20 6f 6c 64 70 6f 73 3b 20 20 20 20 20 20  _t oldpos;      
1570: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 66 72  /* Previous refr
1580: 65 73 68 20 63 75 72 73 6f 72 20 70 6f 73 69 74  esh cursor posit
1590: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  ion. */.    size
15a0: 5f 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  _t len;         
15b0: 2f 2a 20 43 75 72 72 65 6e 74 20 65 64 69 74 65  /* Current edite
15c0: 64 20 6c 69 6e 65 20 6c 65 6e 67 74 68 2e 20 2a  d line length. *
15d0: 2f 0a 20 20 20 20 73 69 7a 65 5f 74 20 63 6f 6c  /.    size_t col
15e0: 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  s;        /* Num
15f0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
1600: 6e 20 74 65 72 6d 69 6e 61 6c 2e 20 2a 2f 0a 20  n terminal. */. 
1610: 20 20 20 73 69 7a 65 5f 74 20 6d 61 78 72 6f 77     size_t maxrow
1620: 73 3b 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75  s;     /* Maximu
1630: 6d 20 6e 75 6d 20 6f 66 20 72 6f 77 73 20 75 73  m num of rows us
1640: 65 64 20 73 6f 20 66 61 72 20 28 6d 75 6c 74 69  ed so far (multi
1650: 6c 69 6e 65 20 6d 6f 64 65 29 20 2a 2f 0a 20 20  line mode) */.  
1660: 20 20 69 6e 74 20 68 69 73 74 6f 72 79 5f 69 6e    int history_in
1670: 64 65 78 3b 20 20 2f 2a 20 54 68 65 20 68 69 73  dex;  /* The his
1680: 74 6f 72 79 20 69 6e 64 65 78 20 77 65 20 61 72  tory index we ar
1690: 65 20 63 75 72 72 65 6e 74 6c 79 20 65 64 69 74  e currently edit
16a0: 69 6e 67 2e 20 2a 2f 0a 7d 3b 0a 0a 65 6e 75 6d  ing. */.};..enum
16b0: 20 4b 45 59 5f 41 43 54 49 4f 4e 7b 0a 09 4b 45   KEY_ACTION{..KE
16c0: 59 5f 4e 55 4c 4c 20 3d 20 30 2c 09 20 20 20 20  Y_NULL = 0,.    
16d0: 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 09 43 54 52 4c  /* NULL */..CTRL
16e0: 5f 41 20 3d 20 31 2c 20 20 20 20 20 20 20 20 20  _A = 1,         
16f0: 2f 2a 20 43 74 72 6c 2b 61 20 2a 2f 0a 09 43 54  /* Ctrl+a */..CT
1700: 52 4c 5f 42 20 3d 20 32 2c 20 20 20 20 20 20 20  RL_B = 2,       
1710: 20 20 2f 2a 20 43 74 72 6c 2d 62 20 2a 2f 0a 09    /* Ctrl-b */..
1720: 43 54 52 4c 5f 43 20 3d 20 33 2c 20 20 20 20 20  CTRL_C = 3,     
1730: 20 20 20 20 2f 2a 20 43 74 72 6c 2d 63 20 2a 2f      /* Ctrl-c */
1740: 0a 09 43 54 52 4c 5f 44 20 3d 20 34 2c 20 20 20  ..CTRL_D = 4,   
1750: 20 20 20 20 20 20 2f 2a 20 43 74 72 6c 2d 64 20        /* Ctrl-d 
1760: 2a 2f 0a 09 43 54 52 4c 5f 45 20 3d 20 35 2c 20  */..CTRL_E = 5, 
1770: 20 20 20 20 20 20 20 20 2f 2a 20 43 74 72 6c 2d          /* Ctrl-
1780: 65 20 2a 2f 0a 09 43 54 52 4c 5f 46 20 3d 20 36  e */..CTRL_F = 6
1790: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 43 74 72  ,         /* Ctr
17a0: 6c 2d 66 20 2a 2f 0a 09 43 54 52 4c 5f 48 20 3d  l-f */..CTRL_H =
17b0: 20 38 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 43   8,         /* C
17c0: 74 72 6c 2d 68 20 2a 2f 0a 09 54 41 42 20 3d 20  trl-h */..TAB = 
17d0: 39 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  9,            /*
17e0: 20 54 61 62 20 2a 2f 0a 09 43 54 52 4c 5f 4b 20   Tab */..CTRL_K 
17f0: 3d 20 31 31 2c 20 20 20 20 20 20 20 20 2f 2a 20  = 11,        /* 
1800: 43 74 72 6c 2b 6b 20 2a 2f 0a 09 43 54 52 4c 5f  Ctrl+k */..CTRL_
1810: 4c 20 3d 20 31 32 2c 20 20 20 20 20 20 20 20 2f  L = 12,        /
1820: 2a 20 43 74 72 6c 2b 6c 20 2a 2f 0a 09 45 4e 54  * Ctrl+l */..ENT
1830: 45 52 20 3d 20 31 33 2c 20 20 20 20 20 20 20 20  ER = 13,        
1840: 20 2f 2a 20 45 6e 74 65 72 20 2a 2f 0a 09 43 54   /* Enter */..CT
1850: 52 4c 5f 4e 20 3d 20 31 34 2c 20 20 20 20 20 20  RL_N = 14,      
1860: 20 20 2f 2a 20 43 74 72 6c 2d 6e 20 2a 2f 0a 09    /* Ctrl-n */..
1870: 43 54 52 4c 5f 50 20 3d 20 31 36 2c 20 20 20 20  CTRL_P = 16,    
1880: 20 20 20 20 2f 2a 20 43 74 72 6c 2d 70 20 2a 2f      /* Ctrl-p */
1890: 0a 09 43 54 52 4c 5f 54 20 3d 20 32 30 2c 20 20  ..CTRL_T = 20,  
18a0: 20 20 20 20 20 20 2f 2a 20 43 74 72 6c 2d 74 20        /* Ctrl-t 
18b0: 2a 2f 0a 09 43 54 52 4c 5f 55 20 3d 20 32 31 2c  */..CTRL_U = 21,
18c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 74 72 6c 2b          /* Ctrl+
18d0: 75 20 2a 2f 0a 09 43 54 52 4c 5f 57 20 3d 20 32  u */..CTRL_W = 2
18e0: 33 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 74 72  3,        /* Ctr
18f0: 6c 2b 77 20 2a 2f 0a 09 45 53 43 20 3d 20 32 37  l+w */..ESC = 27
1900: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ,           /* E
1910: 73 63 61 70 65 20 2a 2f 0a 09 42 41 43 4b 53 50  scape */..BACKSP
1920: 41 43 45 20 3d 20 20 31 32 37 20 20 20 20 2f 2a  ACE =  127    /*
1930: 20 42 61 63 6b 73 70 61 63 65 20 2a 2f 0a 7d 3b   Backspace */.};
1940: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69  ..static void li
1950: 6e 65 6e 6f 69 73 65 41 74 45 78 69 74 28 76 6f  nenoiseAtExit(vo
1960: 69 64 29 3b 0a 69 6e 74 20 6c 69 6e 65 6e 6f 69  id);.int linenoi
1970: 73 65 48 69 73 74 6f 72 79 41 64 64 28 63 6f 6e  seHistoryAdd(con
1980: 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 3b 0a  st char *line);.
1990: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 66 72  static void refr
19a0: 65 73 68 4c 69 6e 65 28 73 74 72 75 63 74 20 6c  eshLine(struct l
19b0: 69 6e 65 6e 6f 69 73 65 53 74 61 74 65 20 2a 6c  inenoiseState *l
19c0: 29 3b 0a 0a 2f 2a 20 44 65 62 75 67 67 69 6e 67  );../* Debugging
19d0: 20 6d 61 63 72 6f 2e 20 2a 2f 0a 23 69 66 20 30   macro. */.#if 0
19e0: 0a 46 49 4c 45 20 2a 6c 6e 64 65 62 75 67 5f 66  .FILE *lndebug_f
19f0: 70 20 3d 20 4e 55 4c 4c 3b 0a 23 64 65 66 69 6e  p = NULL;.#defin
1a00: 65 20 6c 6e 64 65 62 75 67 28 2e 2e 2e 29 20 5c  e lndebug(...) \
1a10: 0a 20 20 20 20 64 6f 20 7b 20 5c 0a 20 20 20 20  .    do { \.    
1a20: 20 20 20 20 69 66 20 28 6c 6e 64 65 62 75 67 5f      if (lndebug_
1a30: 66 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 20 5c 0a  fp == NULL) { \.
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 6c 6e 64 65              lnde
1a50: 62 75 67 5f 66 70 20 3d 20 66 6f 70 65 6e 28 22  bug_fp = fopen("
1a60: 2f 74 6d 70 2f 6c 6e 64 65 62 75 67 2e 74 78 74  /tmp/lndebug.txt
1a70: 22 2c 22 61 22 29 3b 20 5c 0a 20 20 20 20 20 20  ","a"); \.      
1a80: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6c 6e        fprintf(ln
1a90: 64 65 62 75 67 5f 66 70 2c 20 5c 0a 20 20 20 20  debug_fp, \.    
1aa0: 20 20 20 20 20 20 20 20 22 5b 25 64 20 25 64 20          "[%d %d 
1ab0: 25 64 5d 20 70 3a 20 25 64 2c 20 72 6f 77 73 3a  %d] p: %d, rows:
1ac0: 20 25 64 2c 20 72 70 6f 73 3a 20 25 64 2c 20 6d   %d, rpos: %d, m
1ad0: 61 78 3a 20 25 64 2c 20 6f 6c 64 6d 61 78 3a 20  ax: %d, oldmax: 
1ae0: 25 64 5c 6e 22 2c 20 5c 0a 20 20 20 20 20 20 20  %d\n", \.       
1af0: 20 20 20 20 20 28 69 6e 74 29 6c 2d 3e 6c 65 6e       (int)l->len
1b00: 2c 28 69 6e 74 29 6c 2d 3e 70 6f 73 2c 28 69 6e  ,(int)l->pos,(in
1b10: 74 29 6c 2d 3e 6f 6c 64 70 6f 73 2c 70 6c 65 6e  t)l->oldpos,plen
1b20: 2c 72 6f 77 73 2c 72 70 6f 73 2c 20 5c 0a 20 20  ,rows,rpos, \.  
1b30: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6c            (int)l
1b40: 2d 3e 6d 61 78 72 6f 77 73 2c 6f 6c 64 5f 72 6f  ->maxrows,old_ro
1b50: 77 73 29 3b 20 5c 0a 20 20 20 20 20 20 20 20 7d  ws); \.        }
1b60: 20 5c 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e   \.        fprin
1b70: 74 66 28 6c 6e 64 65 62 75 67 5f 66 70 2c 20 22  tf(lndebug_fp, "
1b80: 2c 20 22 20 5f 5f 56 41 5f 41 52 47 53 5f 5f 29  , " __VA_ARGS__)
1b90: 3b 20 5c 0a 20 20 20 20 20 20 20 20 66 66 6c 75  ; \.        fflu
1ba0: 73 68 28 6c 6e 64 65 62 75 67 5f 66 70 29 3b 20  sh(lndebug_fp); 
1bb0: 5c 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 30  \.    } while (0
1bc0: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
1bd0: 6c 6e 64 65 62 75 67 28 66 6d 74 2c 20 2e 2e 2e  lndebug(fmt, ...
1be0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 3d 3d 3d  ).#endif../* ===
1bf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c00: 3d 3d 3d 3d 20 4c 6f 77 20 6c 65 76 65 6c 20 74  ==== Low level t
1c10: 65 72 6d 69 6e 61 6c 20 68 61 6e 64 6c 69 6e 67  erminal handling
1c20: 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d   ===============
1c30: 3d 3d 3d 3d 3d 3d 3d 20 2a 2f 0a 0a 2f 2a 20 53  ======= */../* S
1c40: 65 74 20 69 66 20 74 6f 20 75 73 65 20 6f 72 20  et if to use or 
1c50: 6e 6f 74 20 74 68 65 20 6d 75 6c 74 69 20 6c 69  not the multi li
1c60: 6e 65 20 6d 6f 64 65 2e 20 2a 2f 0a 76 6f 69 64  ne mode. */.void
1c70: 20 6c 69 6e 65 6e 6f 69 73 65 53 65 74 4d 75 6c   linenoiseSetMul
1c80: 74 69 4c 69 6e 65 28 69 6e 74 20 6d 6c 29 20 7b  tiLine(int ml) {
1c90: 0a 20 20 20 20 6d 6c 6d 6f 64 65 20 3d 20 6d 6c  .    mlmode = ml
1ca0: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
1cb0: 72 75 65 20 69 66 20 74 68 65 20 74 65 72 6d 69  rue if the termi
1cc0: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 69 6e 20 74  nal name is in t
1cd0: 68 65 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 69  he list of termi
1ce0: 6e 61 6c 73 20 77 65 20 6b 6e 6f 77 20 61 72 65  nals we know are
1cf0: 0a 20 2a 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20  . * not able to 
1d00: 75 6e 64 65 72 73 74 61 6e 64 20 62 61 73 69 63  understand basic
1d10: 20 65 73 63 61 70 65 20 73 65 71 75 65 6e 63 65   escape sequence
1d20: 73 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s. */.static int
1d30: 20 69 73 55 6e 73 75 70 70 6f 72 74 65 64 54 65   isUnsupportedTe
1d40: 72 6d 28 76 6f 69 64 29 20 7b 0a 20 20 20 20 63  rm(void) {.    c
1d50: 68 61 72 20 2a 74 65 72 6d 20 3d 20 67 65 74 65  har *term = gete
1d60: 6e 76 28 22 54 45 52 4d 22 29 3b 0a 20 20 20 20  nv("TERM");.    
1d70: 69 6e 74 20 6a 3b 0a 0a 20 20 20 20 69 66 20 28  int j;..    if (
1d80: 74 65 72 6d 20 3d 3d 20 4e 55 4c 4c 29 20 72 65  term == NULL) re
1d90: 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 20  turn 0;.    for 
1da0: 28 6a 20 3d 20 30 3b 20 75 6e 73 75 70 70 6f 72  (j = 0; unsuppor
1db0: 74 65 64 5f 74 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b  ted_term[j]; j++
1dc0: 29 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 73  ).        if (!s
1dd0: 74 72 63 61 73 65 63 6d 70 28 74 65 72 6d 2c 75  trcasecmp(term,u
1de0: 6e 73 75 70 70 6f 72 74 65 64 5f 74 65 72 6d 5b  nsupported_term[
1df0: 6a 5d 29 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  j])) return 1;. 
1e00: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a     return 0;.}..
1e10: 2f 2a 20 52 61 77 20 6d 6f 64 65 3a 20 31 39 36  /* Raw mode: 196
1e20: 30 20 6d 61 67 69 63 20 73 68 69 74 2e 20 2a 2f  0 magic shit. */
1e30: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 6e 61 62  .static int enab
1e40: 6c 65 52 61 77 4d 6f 64 65 28 69 6e 74 20 66 64  leRawMode(int fd
1e50: 29 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 74  ) {.    struct t
1e60: 65 72 6d 69 6f 73 20 72 61 77 3b 0a 0a 20 20 20  ermios raw;..   
1e70: 20 69 66 20 28 21 69 73 61 74 74 79 28 53 54 44   if (!isatty(STD
1e80: 49 4e 5f 46 49 4c 45 4e 4f 29 29 20 67 6f 74 6f  IN_FILENO)) goto
1e90: 20 66 61 74 61 6c 3b 0a 20 20 20 20 69 66 20 28   fatal;.    if (
1ea0: 21 61 74 65 78 69 74 5f 72 65 67 69 73 74 65 72  !atexit_register
1eb0: 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 61 74  ed) {.        at
1ec0: 65 78 69 74 28 6c 69 6e 65 6e 6f 69 73 65 41 74  exit(linenoiseAt
1ed0: 45 78 69 74 29 3b 0a 20 20 20 20 20 20 20 20 61  Exit);.        a
1ee0: 74 65 78 69 74 5f 72 65 67 69 73 74 65 72 65 64  texit_registered
1ef0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
1f00: 69 66 20 28 74 63 67 65 74 61 74 74 72 28 66 64  if (tcgetattr(fd
1f10: 2c 26 6f 72 69 67 5f 74 65 72 6d 69 6f 73 29 20  ,&orig_termios) 
1f20: 3d 3d 20 2d 31 29 20 67 6f 74 6f 20 66 61 74 61  == -1) goto fata
1f30: 6c 3b 0a 0a 20 20 20 20 72 61 77 20 3d 20 6f 72  l;..    raw = or
1f40: 69 67 5f 74 65 72 6d 69 6f 73 3b 20 20 2f 2a 20  ig_termios;  /* 
1f50: 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69  modify the origi
1f60: 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  nal mode */.    
1f70: 2f 2a 20 69 6e 70 75 74 20 6d 6f 64 65 73 3a 20  /* input modes: 
1f80: 6e 6f 20 62 72 65 61 6b 2c 20 6e 6f 20 43 52 20  no break, no CR 
1f90: 74 6f 20 4e 4c 2c 20 6e 6f 20 70 61 72 69 74 79  to NL, no parity
1fa0: 20 63 68 65 63 6b 2c 20 6e 6f 20 73 74 72 69 70   check, no strip
1fb0: 20 63 68 61 72 2c 0a 20 20 20 20 20 2a 20 6e 6f   char,.     * no
1fc0: 20 73 74 61 72 74 2f 73 74 6f 70 20 6f 75 74 70   start/stop outp
1fd0: 75 74 20 63 6f 6e 74 72 6f 6c 2e 20 2a 2f 0a 20  ut control. */. 
1fe0: 20 20 20 72 61 77 2e 63 5f 69 66 6c 61 67 20 26     raw.c_iflag &
1ff0: 3d 20 7e 28 42 52 4b 49 4e 54 20 7c 20 49 43 52  = ~(BRKINT | ICR
2000: 4e 4c 20 7c 20 49 4e 50 43 4b 20 7c 20 49 53 54  NL | INPCK | IST
2010: 52 49 50 20 7c 20 49 58 4f 4e 29 3b 0a 20 20 20  RIP | IXON);.   
2020: 20 2f 2a 20 6f 75 74 70 75 74 20 6d 6f 64 65 73   /* output modes
2030: 20 2d 20 64 69 73 61 62 6c 65 20 70 6f 73 74 20   - disable post 
2040: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
2050: 20 20 72 61 77 2e 63 5f 6f 66 6c 61 67 20 26 3d    raw.c_oflag &=
2060: 20 7e 28 4f 50 4f 53 54 29 3b 0a 20 20 20 20 2f   ~(OPOST);.    /
2070: 2a 20 63 6f 6e 74 72 6f 6c 20 6d 6f 64 65 73 20  * control modes 
2080: 2d 20 73 65 74 20 38 20 62 69 74 20 63 68 61 72  - set 8 bit char
2090: 73 20 2a 2f 0a 20 20 20 20 72 61 77 2e 63 5f 63  s */.    raw.c_c
20a0: 66 6c 61 67 20 7c 3d 20 28 43 53 38 29 3b 0a 20  flag |= (CS8);. 
20b0: 20 20 20 2f 2a 20 6c 6f 63 61 6c 20 6d 6f 64 65     /* local mode
20c0: 73 20 2d 20 63 68 6f 69 6e 67 20 6f 66 66 2c 20  s - choing off, 
20d0: 63 61 6e 6f 6e 69 63 61 6c 20 6f 66 66 2c 20 6e  canonical off, n
20e0: 6f 20 65 78 74 65 6e 64 65 64 20 66 75 6e 63 74  o extended funct
20f0: 69 6f 6e 73 2c 0a 20 20 20 20 20 2a 20 6e 6f 20  ions,.     * no 
2100: 73 69 67 6e 61 6c 20 63 68 61 72 73 20 28 5e 5a  signal chars (^Z
2110: 2c 5e 43 29 20 2a 2f 0a 20 20 20 20 72 61 77 2e  ,^C) */.    raw.
2120: 63 5f 6c 66 6c 61 67 20 26 3d 20 7e 28 45 43 48  c_lflag &= ~(ECH
2130: 4f 20 7c 20 49 43 41 4e 4f 4e 20 7c 20 49 45 58  O | ICANON | IEX
2140: 54 45 4e 20 7c 20 49 53 49 47 29 3b 0a 20 20 20  TEN | ISIG);.   
2150: 20 2f 2a 20 63 6f 6e 74 72 6f 6c 20 63 68 61 72   /* control char
2160: 73 20 2d 20 73 65 74 20 72 65 74 75 72 6e 20 63  s - set return c
2170: 6f 6e 64 69 74 69 6f 6e 3a 20 6d 69 6e 20 6e 75  ondition: min nu
2180: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6e  mber of bytes an
2190: 64 20 74 69 6d 65 72 2e 0a 20 20 20 20 20 2a 20  d timer..     * 
21a0: 57 65 20 77 61 6e 74 20 72 65 61 64 20 74 6f 20  We want read to 
21b0: 72 65 74 75 72 6e 20 65 76 65 72 79 20 73 69 6e  return every sin
21c0: 67 6c 65 20 62 79 74 65 2c 20 77 69 74 68 6f 75  gle byte, withou
21d0: 74 20 74 69 6d 65 6f 75 74 2e 20 2a 2f 0a 20 20  t timeout. */.  
21e0: 20 20 72 61 77 2e 63 5f 63 63 5b 56 4d 49 4e 5d    raw.c_cc[VMIN]
21f0: 20 3d 20 31 3b 20 72 61 77 2e 63 5f 63 63 5b 56   = 1; raw.c_cc[V
2200: 54 49 4d 45 5d 20 3d 20 30 3b 20 2f 2a 20 31 20  TIME] = 0; /* 1 
2210: 62 79 74 65 2c 20 6e 6f 20 74 69 6d 65 72 20 2a  byte, no timer *
2220: 2f 0a 0a 20 20 20 20 2f 2a 20 70 75 74 20 74 65  /..    /* put te
2230: 72 6d 69 6e 61 6c 20 69 6e 20 72 61 77 20 6d 6f  rminal in raw mo
2240: 64 65 20 61 66 74 65 72 20 66 6c 75 73 68 69 6e  de after flushin
2250: 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 63 73  g */.    if (tcs
2260: 65 74 61 74 74 72 28 66 64 2c 54 43 53 41 46 4c  etattr(fd,TCSAFL
2270: 55 53 48 2c 26 72 61 77 29 20 3c 20 30 29 20 67  USH,&raw) < 0) g
2280: 6f 74 6f 20 66 61 74 61 6c 3b 0a 20 20 20 20 72  oto fatal;.    r
2290: 61 77 6d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  awmode = 1;.    
22a0: 72 65 74 75 72 6e 20 30 3b 0a 0a 66 61 74 61 6c  return 0;..fatal
22b0: 3a 0a 20 20 20 20 65 72 72 6e 6f 20 3d 20 45 4e  :.    errno = EN
22c0: 4f 54 54 59 3b 0a 20 20 20 20 72 65 74 75 72 6e  OTTY;.    return
22d0: 20 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76   -1;.}..static v
22e0: 6f 69 64 20 64 69 73 61 62 6c 65 52 61 77 4d 6f  oid disableRawMo
22f0: 64 65 28 69 6e 74 20 66 64 29 20 7b 0a 20 20 20  de(int fd) {.   
2300: 20 2f 2a 20 44 6f 6e 27 74 20 65 76 65 6e 20 63   /* Don't even c
2310: 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
2320: 76 61 6c 75 65 20 61 73 20 69 74 27 73 20 74 6f  value as it's to
2330: 6f 20 6c 61 74 65 2e 20 2a 2f 0a 20 20 20 20 69  o late. */.    i
2340: 66 20 28 72 61 77 6d 6f 64 65 20 26 26 20 74 63  f (rawmode && tc
2350: 73 65 74 61 74 74 72 28 66 64 2c 54 43 53 41 46  setattr(fd,TCSAF
2360: 4c 55 53 48 2c 26 6f 72 69 67 5f 74 65 72 6d 69  LUSH,&orig_termi
2370: 6f 73 29 20 21 3d 20 2d 31 29 0a 20 20 20 20 20  os) != -1).     
2380: 20 20 20 72 61 77 6d 6f 64 65 20 3d 20 30 3b 0a     rawmode = 0;.
2390: 7d 0a 0a 2f 2a 20 55 73 65 20 74 68 65 20 45 53  }../* Use the ES
23a0: 43 20 5b 36 6e 20 65 73 63 61 70 65 20 73 65 71  C [6n escape seq
23b0: 75 65 6e 63 65 20 74 6f 20 71 75 65 72 79 20 74  uence to query t
23c0: 68 65 20 68 6f 72 69 7a 6f 6e 74 61 6c 20 63 75  he horizontal cu
23d0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 0a 20 2a  rsor position. *
23e0: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 2e 20   and return it. 
23f0: 4f 6e 20 65 72 72 6f 72 20 2d 31 20 69 73 20 72  On error -1 is r
2400: 65 74 75 72 6e 65 64 2c 20 6f 6e 20 73 75 63 63  eturned, on succ
2410: 65 73 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ess the position
2420: 20 6f 66 20 74 68 65 0a 20 2a 20 63 75 72 73 6f   of the. * curso
2430: 72 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r. */.static int
2440: 20 67 65 74 43 75 72 73 6f 72 50 6f 73 69 74 69   getCursorPositi
2450: 6f 6e 28 69 6e 74 20 69 66 64 2c 20 69 6e 74 20  on(int ifd, int 
2460: 6f 66 64 29 20 7b 0a 20 20 20 20 63 68 61 72 20  ofd) {.    char 
2470: 62 75 66 5b 33 32 5d 3b 0a 20 20 20 20 69 6e 74  buf[32];.    int
2480: 20 63 6f 6c 73 2c 20 72 6f 77 73 3b 0a 20 20 20   cols, rows;.   
2490: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 20   unsigned int i 
24a0: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70  = 0;..    /* Rep
24b0: 6f 72 74 20 63 75 72 73 6f 72 20 6c 6f 63 61 74  ort cursor locat
24c0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 77  ion */.    if (w
24d0: 72 69 74 65 28 6f 66 64 2c 20 22 5c 78 31 62 5b  rite(ofd, "\x1b[
24e0: 36 6e 22 2c 20 34 29 20 21 3d 20 34 29 20 72 65  6n", 4) != 4) re
24f0: 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 20 20 2f 2a  turn -1;..    /*
2500: 20 52 65 61 64 20 74 68 65 20 72 65 73 70 6f 6e   Read the respon
2510: 73 65 3a 20 45 53 43 20 5b 20 72 6f 77 73 20 3b  se: ESC [ rows ;
2520: 20 63 6f 6c 73 20 52 20 2a 2f 0a 20 20 20 20 77   cols R */.    w
2530: 68 69 6c 65 20 28 69 20 3c 20 73 69 7a 65 6f 66  hile (i < sizeof
2540: 28 62 75 66 29 2d 31 29 20 7b 0a 20 20 20 20 20  (buf)-1) {.     
2550: 20 20 20 69 66 20 28 72 65 61 64 28 69 66 64 2c     if (read(ifd,
2560: 62 75 66 2b 69 2c 31 29 20 21 3d 20 31 29 20 62  buf+i,1) != 1) b
2570: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
2580: 20 28 62 75 66 5b 69 5d 20 3d 3d 20 27 52 27 29   (buf[i] == 'R')
2590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
25a0: 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  i++;.    }.    b
25b0: 75 66 5b 69 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  uf[i] = '\0';.. 
25c0: 20 20 20 2f 2a 20 50 61 72 73 65 20 69 74 2e 20     /* Parse it. 
25d0: 2a 2f 0a 20 20 20 20 69 66 20 28 62 75 66 5b 30  */.    if (buf[0
25e0: 5d 20 21 3d 20 45 53 43 20 7c 7c 20 62 75 66 5b  ] != ESC || buf[
25f0: 31 5d 20 21 3d 20 27 5b 27 29 20 72 65 74 75 72  1] != '[') retur
2600: 6e 20 2d 31 3b 0a 20 20 20 20 69 66 20 28 73 73  n -1;.    if (ss
2610: 63 61 6e 66 28 62 75 66 2b 32 2c 22 25 64 3b 25  canf(buf+2,"%d;%
2620: 64 22 2c 26 72 6f 77 73 2c 26 63 6f 6c 73 29 20  d",&rows,&cols) 
2630: 21 3d 20 32 29 20 72 65 74 75 72 6e 20 2d 31 3b  != 2) return -1;
2640: 0a 20 20 20 20 72 65 74 75 72 6e 20 63 6f 6c 73  .    return cols
2650: 3b 0a 7d 0a 0a 2f 2a 20 54 72 79 20 74 6f 20 67  ;.}../* Try to g
2660: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
2670: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2680: 63 75 72 72 65 6e 74 20 74 65 72 6d 69 6e 61 6c  current terminal
2690: 2c 20 6f 72 20 61 73 73 75 6d 65 20 38 30 0a 20  , or assume 80. 
26a0: 2a 20 69 66 20 69 74 20 66 61 69 6c 73 2e 20 2a  * if it fails. *
26b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
26c0: 43 6f 6c 75 6d 6e 73 28 69 6e 74 20 69 66 64 2c  Columns(int ifd,
26d0: 20 69 6e 74 20 6f 66 64 29 20 7b 0a 20 20 20 20   int ofd) {.    
26e0: 73 74 72 75 63 74 20 77 69 6e 73 69 7a 65 20 77  struct winsize w
26f0: 73 3b 0a 0a 20 20 20 20 69 66 20 28 69 6f 63 74  s;..    if (ioct
2700: 6c 28 31 2c 20 54 49 4f 43 47 57 49 4e 53 5a 2c  l(1, TIOCGWINSZ,
2710: 20 26 77 73 29 20 3d 3d 20 2d 31 20 7c 7c 20 77   &ws) == -1 || w
2720: 73 2e 77 73 5f 63 6f 6c 20 3d 3d 20 30 29 20 7b  s.ws_col == 0) {
2730: 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 6f 63 74  .        /* ioct
2740: 6c 28 29 20 66 61 69 6c 65 64 2e 20 54 72 79 20  l() failed. Try 
2750: 74 6f 20 71 75 65 72 79 20 74 68 65 20 74 65 72  to query the ter
2760: 6d 69 6e 61 6c 20 69 74 73 65 6c 66 2e 20 2a 2f  minal itself. */
2770: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 74 61  .        int sta
2780: 72 74 2c 20 63 6f 6c 73 3b 0a 0a 20 20 20 20 20  rt, cols;..     
2790: 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 69 6e     /* Get the in
27a0: 69 74 69 61 6c 20 70 6f 73 69 74 69 6f 6e 20 73  itial position s
27b0: 6f 20 77 65 20 63 61 6e 20 72 65 73 74 6f 72 65  o we can restore
27c0: 20 69 74 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20   it later. */.  
27d0: 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 67 65        start = ge
27e0: 74 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  tCursorPosition(
27f0: 69 66 64 2c 6f 66 64 29 3b 0a 20 20 20 20 20 20  ifd,ofd);.      
2800: 20 20 69 66 20 28 73 74 61 72 74 20 3d 3d 20 2d    if (start == -
2810: 31 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a  1) goto failed;.
2820: 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 6f 20 74  .        /* Go t
2830: 6f 20 72 69 67 68 74 20 6d 61 72 67 69 6e 20 61  o right margin a
2840: 6e 64 20 67 65 74 20 70 6f 73 69 74 69 6f 6e 2e  nd get position.
2850: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28   */.        if (
2860: 77 72 69 74 65 28 6f 66 64 2c 22 5c 78 31 62 5b  write(ofd,"\x1b[
2870: 39 39 39 43 22 2c 36 29 20 21 3d 20 36 29 20 67  999C",6) != 6) g
2880: 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
2890: 20 20 20 20 63 6f 6c 73 20 3d 20 67 65 74 43 75      cols = getCu
28a0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 69 66 64  rsorPosition(ifd
28b0: 2c 6f 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ,ofd);.        i
28c0: 66 20 28 63 6f 6c 73 20 3d 3d 20 2d 31 29 20 67  f (cols == -1) g
28d0: 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20  oto failed;..   
28e0: 20 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65 20       /* Restore 
28f0: 70 6f 73 69 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  position. */.   
2900: 20 20 20 20 20 69 66 20 28 63 6f 6c 73 20 3e 20       if (cols > 
2910: 73 74 61 72 74 29 20 7b 0a 20 20 20 20 20 20 20  start) {.       
2920: 20 20 20 20 20 63 68 61 72 20 73 65 71 5b 33 32       char seq[32
2930: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ];.            s
2940: 6e 70 72 69 6e 74 66 28 73 65 71 2c 33 32 2c 22  nprintf(seq,32,"
2950: 5c 78 31 62 5b 25 64 44 22 2c 63 6f 6c 73 2d 73  \x1b[%dD",cols-s
2960: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tart);.         
2970: 20 20 20 69 66 20 28 77 72 69 74 65 28 6f 66 64     if (write(ofd
2980: 2c 73 65 71 2c 73 74 72 6c 65 6e 28 73 65 71 29  ,seq,strlen(seq)
2990: 29 20 3d 3d 20 2d 31 29 20 7b 0a 20 20 20 20 20  ) == -1) {.     
29a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61             /* Ca
29b0: 6e 27 74 20 72 65 63 6f 76 65 72 2e 2e 2e 20 2a  n't recover... *
29c0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  /.            }.
29d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29e0: 20 20 72 65 74 75 72 6e 20 63 6f 6c 73 3b 0a 20    return cols;. 
29f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
2a00: 20 20 20 20 72 65 74 75 72 6e 20 77 73 2e 77 73      return ws.ws
2a10: 5f 63 6f 6c 3b 0a 20 20 20 20 7d 0a 0a 66 61 69  _col;.    }..fai
2a20: 6c 65 64 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  led:.    return 
2a30: 38 30 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61 72 20  80;.}../* Clear 
2a40: 74 68 65 20 73 63 72 65 65 6e 2e 20 55 73 65 64  the screen. Used
2a50: 20 74 6f 20 68 61 6e 64 6c 65 20 63 74 72 6c 2b   to handle ctrl+
2a60: 6c 20 2a 2f 0a 76 6f 69 64 20 6c 69 6e 65 6e 6f  l */.void lineno
2a70: 69 73 65 43 6c 65 61 72 53 63 72 65 65 6e 28 76  iseClearScreen(v
2a80: 6f 69 64 29 20 7b 0a 20 20 20 20 69 66 20 28 77  oid) {.    if (w
2a90: 72 69 74 65 28 53 54 44 4f 55 54 5f 46 49 4c 45  rite(STDOUT_FILE
2aa0: 4e 4f 2c 22 5c 78 31 62 5b 48 5c 78 31 62 5b 32  NO,"\x1b[H\x1b[2
2ab0: 4a 22 2c 37 29 20 3c 3d 20 30 29 20 7b 0a 20 20  J",7) <= 0) {.  
2ac0: 20 20 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67        /* nothing
2ad0: 20 74 6f 20 64 6f 2c 20 6a 75 73 74 20 74 6f 20   to do, just to 
2ae0: 61 76 6f 69 64 20 77 61 72 6e 69 6e 67 2e 20 2a  avoid warning. *
2af0: 2f 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 20 42 65  /.    }.}../* Be
2b00: 65 70 2c 20 75 73 65 64 20 66 6f 72 20 63 6f 6d  ep, used for com
2b10: 70 6c 65 74 69 6f 6e 20 77 68 65 6e 20 74 68 65  pletion when the
2b20: 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f  re is nothing to
2b30: 20 63 6f 6d 70 6c 65 74 65 20 6f 72 20 77 68 65   complete or whe
2b40: 6e 20 61 6c 6c 0a 20 2a 20 74 68 65 20 63 68 6f  n all. * the cho
2b50: 69 63 65 73 20 77 65 72 65 20 61 6c 72 65 61 64  ices were alread
2b60: 79 20 73 68 6f 77 6e 2e 20 2a 2f 0a 73 74 61 74  y shown. */.stat
2b70: 69 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f 69 73  ic void linenois
2b80: 65 42 65 65 70 28 76 6f 69 64 29 20 7b 0a 20 20  eBeep(void) {.  
2b90: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
2ba0: 2c 20 22 5c 78 37 22 29 3b 0a 20 20 20 20 66 66  , "\x7");.    ff
2bb0: 6c 75 73 68 28 73 74 64 65 72 72 29 3b 0a 7d 0a  lush(stderr);.}.
2bc0: 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ./* ============
2bd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2be0: 3d 3d 20 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 3d  == Completion ==
2bf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2c00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 20 2a  ============== *
2c10: 2f 0a 0a 2f 2a 20 46 72 65 65 20 61 20 6c 69 73  /../* Free a lis
2c20: 74 20 6f 66 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  t of completion 
2c30: 6f 70 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 64  option populated
2c40: 20 62 79 20 6c 69 6e 65 6e 6f 69 73 65 41 64 64   by linenoiseAdd
2c50: 43 6f 6d 70 6c 65 74 69 6f 6e 28 29 2e 20 2a 2f  Completion(). */
2c60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
2c70: 65 43 6f 6d 70 6c 65 74 69 6f 6e 73 28 6c 69 6e  eCompletions(lin
2c80: 65 6e 6f 69 73 65 43 6f 6d 70 6c 65 74 69 6f 6e  enoiseCompletion
2c90: 73 20 2a 6c 63 29 20 7b 0a 20 20 20 20 73 69 7a  s *lc) {.    siz
2ca0: 65 5f 74 20 69 3b 0a 20 20 20 20 66 6f 72 20 28  e_t i;.    for (
2cb0: 69 20 3d 20 30 3b 20 69 20 3c 20 6c 63 2d 3e 6c  i = 0; i < lc->l
2cc0: 65 6e 3b 20 69 2b 2b 29 0a 20 20 20 20 20 20 20  en; i++).       
2cd0: 20 66 72 65 65 28 6c 63 2d 3e 63 76 65 63 5b 69   free(lc->cvec[i
2ce0: 5d 29 3b 0a 20 20 20 20 69 66 20 28 6c 63 2d 3e  ]);.    if (lc->
2cf0: 63 76 65 63 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  cvec != NULL).  
2d00: 20 20 20 20 20 20 66 72 65 65 28 6c 63 2d 3e 63        free(lc->c
2d10: 76 65 63 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73  vec);.}../* This
2d20: 20 69 73 20 61 6e 20 68 65 6c 70 65 72 20 66 75   is an helper fu
2d30: 6e 63 74 69 6f 6e 20 66 6f 72 20 6c 69 6e 65 6e  nction for linen
2d40: 6f 69 73 65 45 64 69 74 28 29 20 61 6e 64 20 69  oiseEdit() and i
2d50: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
2d60: 65 0a 20 2a 20 75 73 65 72 20 74 79 70 65 73 20  e. * user types 
2d70: 74 68 65 20 3c 74 61 62 3e 20 6b 65 79 20 69 6e  the <tab> key in
2d80: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
2d90: 74 65 20 74 68 65 20 73 74 72 69 6e 67 20 63 75  te the string cu
2da0: 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 0a 20  rrently in the. 
2db0: 2a 20 69 6e 70 75 74 2e 0a 20 2a 0a 20 2a 20 54  * input.. *. * T
2dc0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
2dd0: 65 64 69 74 69 6e 67 20 69 73 20 65 6e 63 61 70  editing is encap
2de0: 73 75 6c 61 74 65 64 20 69 6e 74 6f 20 74 68 65  sulated into the
2df0: 20 70 6f 69 6e 74 65 64 20 6c 69 6e 65 6e 6f 69   pointed linenoi
2e00: 73 65 53 74 61 74 65 0a 20 2a 20 73 74 72 75 63  seState. * struc
2e10: 74 75 72 65 20 61 73 20 64 65 73 63 72 69 62 65  ture as describe
2e20: 64 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  d in the structu
2e30: 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 2a  re definition. *
2e40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d  /.static int com
2e50: 70 6c 65 74 65 4c 69 6e 65 28 73 74 72 75 63 74  pleteLine(struct
2e60: 20 6c 69 6e 65 6e 6f 69 73 65 53 74 61 74 65 20   linenoiseState 
2e70: 2a 6c 73 29 20 7b 0a 20 20 20 20 6c 69 6e 65 6e  *ls) {.    linen
2e80: 6f 69 73 65 43 6f 6d 70 6c 65 74 69 6f 6e 73 20  oiseCompletions 
2e90: 6c 63 20 3d 20 7b 20 30 2c 20 4e 55 4c 4c 20 7d  lc = { 0, NULL }
2ea0: 3b 0a 20 20 20 20 69 6e 74 20 6e 72 65 61 64 2c  ;.    int nread,
2eb0: 20 6e 77 72 69 74 74 65 6e 3b 0a 20 20 20 20 63   nwritten;.    c
2ec0: 68 61 72 20 63 20 3d 20 30 3b 0a 0a 20 20 20 20  har c = 0;..    
2ed0: 63 6f 6d 70 6c 65 74 69 6f 6e 43 61 6c 6c 62 61  completionCallba
2ee0: 63 6b 28 6c 73 2d 3e 62 75 66 2c 26 6c 63 29 3b  ck(ls->buf,&lc);
2ef0: 0a 20 20 20 20 69 66 20 28 6c 63 2e 6c 65 6e 20  .    if (lc.len 
2f00: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20  == 0) {.        
2f10: 6c 69 6e 65 6e 6f 69 73 65 42 65 65 70 28 29 3b  linenoiseBeep();
2f20: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
2f30: 20 20 20 20 20 20 73 69 7a 65 5f 74 20 73 74 6f        size_t sto
2f40: 70 20 3d 20 30 2c 20 69 20 3d 20 30 3b 0a 0a 20  p = 0, i = 0;.. 
2f50: 20 20 20 20 20 20 20 77 68 69 6c 65 28 21 73 74         while(!st
2f60: 6f 70 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  op) {.          
2f70: 20 20 2f 2a 20 53 68 6f 77 20 63 6f 6d 70 6c 65    /* Show comple
2f80: 74 69 6f 6e 20 6f 72 20 6f 72 69 67 69 6e 61 6c  tion or original
2f90: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 20   buffer */.     
2fa0: 20 20 20 20 20 20 20 69 66 20 28 69 20 3c 20 6c         if (i < l
2fb0: 63 2e 6c 65 6e 29 20 7b 0a 20 20 20 20 20 20 20  c.len) {.       
2fc0: 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2fd0: 6c 69 6e 65 6e 6f 69 73 65 53 74 61 74 65 20 73  linenoiseState s
2fe0: 61 76 65 64 20 3d 20 2a 6c 73 3b 0a 0a 20 20 20  aved = *ls;..   
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 73 2d               ls-
3000: 3e 6c 65 6e 20 3d 20 6c 73 2d 3e 70 6f 73 20 3d  >len = ls->pos =
3010: 20 73 74 72 6c 65 6e 28 6c 63 2e 63 76 65 63 5b   strlen(lc.cvec[
3020: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
3030: 20 20 20 20 20 6c 73 2d 3e 62 75 66 20 3d 20 6c       ls->buf = l
3040: 63 2e 63 76 65 63 5b 69 5d 3b 0a 20 20 20 20 20  c.cvec[i];.     
3050: 20 20 20 20 20 20 20 20 20 20 20 72 65 66 72 65             refre
3060: 73 68 4c 69 6e 65 28 6c 73 29 3b 0a 20 20 20 20  shLine(ls);.    
3070: 20 20 20 20 20 20 20 20 20 20 20 20 6c 73 2d 3e              ls->
3080: 6c 65 6e 20 3d 20 73 61 76 65 64 2e 6c 65 6e 3b  len = saved.len;
3090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30a0: 20 6c 73 2d 3e 70 6f 73 20 3d 20 73 61 76 65 64   ls->pos = saved
30b0: 2e 70 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20  .pos;.          
30c0: 20 20 20 20 20 20 6c 73 2d 3e 62 75 66 20 3d 20        ls->buf = 
30d0: 73 61 76 65 64 2e 62 75 66 3b 0a 20 20 20 20 20  saved.buf;.     
30e0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 72 65 66 72 65 73 68 4c 69 6e 65 28 6c 73 29 3b  refreshLine(ls);
3110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  .            }..
3120: 20 20 20 20 20 20 20 20 20 20 20 20 6e 72 65 61              nrea
3130: 64 20 3d 20 72 65 61 64 28 6c 73 2d 3e 69 66 64  d = read(ls->ifd
3140: 2c 26 63 2c 31 29 3b 0a 20 20 20 20 20 20 20 20  ,&c,1);.        
3150: 20 20 20 20 69 66 20 28 6e 72 65 61 64 20 3c 3d      if (nread <=
3160: 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   0) {.          
3170: 20 20 20 20 20 20 66 72 65 65 43 6f 6d 70 6c 65        freeComple
3180: 74 69 6f 6e 73 28 26 6c 63 29 3b 0a 20 20 20 20  tions(&lc);.    
3190: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
31a0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  rn -1;.         
31b0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
31c0: 20 20 73 77 69 74 63 68 28 63 29 20 7b 0a 20 20    switch(c) {.  
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
31e0: 73 65 20 39 3a 20 2f 2a 20 74 61 62 20 2a 2f 0a  se 9: /* tab */.
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 20 20 20 20 69 20 3d 20 28 69 2b 31 29 20 25 20      i = (i+1) % 
3210: 28 6c 63 2e 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  (lc.len+1);.    
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3230: 69 66 20 28 69 20 3d 3d 20 6c 63 2e 6c 65 6e 29  if (i == lc.len)
3240: 20 6c 69 6e 65 6e 6f 69 73 65 42 65 65 70 28 29   linenoiseBeep()
3250: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3260: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
3280: 65 20 32 37 3a 20 2f 2a 20 65 73 63 61 70 65 20  e 27: /* escape 
3290: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
32a0: 20 20 20 20 20 20 20 2f 2a 20 52 65 2d 73 68 6f         /* Re-sho
32b0: 77 20 6f 72 69 67 69 6e 61 6c 20 62 75 66 66 65  w original buffe
32c0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  r */.           
32d0: 20 20 20 20 20 20 20 20 20 69 66 20 28 69 20 3c           if (i <
32e0: 20 6c 63 2e 6c 65 6e 29 20 72 65 66 72 65 73 68   lc.len) refresh
32f0: 4c 69 6e 65 28 6c 73 29 3b 0a 20 20 20 20 20 20  Line(ls);.      
3300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
3310: 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  op = 1;.        
3320: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
3330: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
3340: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3360: 2f 2a 20 55 70 64 61 74 65 20 62 75 66 66 65 72  /* Update buffer
3370: 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 20 20 69 66 20 28 69 20 3c 20 6c 63 2e 6c 65     if (i < lc.le
33a0: 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n) {.           
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 77 72               nwr
33c0: 69 74 74 65 6e 20 3d 20 73 6e 70 72 69 6e 74 66  itten = snprintf
33d0: 28 6c 73 2d 3e 62 75 66 2c 6c 73 2d 3e 62 75 66  (ls->buf,ls->buf
33e0: 6c 65 6e 2c 22 25 73 22 2c 6c 63 2e 63 76 65 63  len,"%s",lc.cvec
33f0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 73                ls
3410: 2d 3e 6c 65 6e 20 3d 20 6c 73 2d 3e 70 6f 73 20  ->len = ls->pos 
3420: 3d 20 6e 77 72 69 74 74 65 6e 3b 0a 20 20 20 20  = nwritten;.    
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3440: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
3450: 20 20 20 20 20 20 73 74 6f 70 20 3d 20 31 3b 0a        stop = 1;.
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3490: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 72   }.    }..    fr
34a0: 65 65 43 6f 6d 70 6c 65 74 69 6f 6e 73 28 26 6c  eeCompletions(&l
34b0: 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63  c);.    return c
34c0: 3b 20 2f 2a 20 52 65 74 75 72 6e 20 6c 61 73 74  ; /* Return last
34d0: 20 72 65 61 64 20 63 68 61 72 61 63 74 65 72 20   read character 
34e0: 2a 2f 0a 7d 0a 0a 2f 2a 20 52 65 67 69 73 74 65  */.}../* Registe
34f0: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  r a callback fun
3500: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 61 6c 6c  ction to be call
3510: 65 64 20 66 6f 72 20 74 61 62 2d 63 6f 6d 70 6c  ed for tab-compl
3520: 65 74 69 6f 6e 2e 20 2a 2f 0a 76 6f 69 64 20 6c  etion. */.void l
3530: 69 6e 65 6e 6f 69 73 65 53 65 74 43 6f 6d 70 6c  inenoiseSetCompl
3540: 65 74 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 6c 69  etionCallback(li
3550: 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c 65 74 69 6f  nenoiseCompletio
3560: 6e 43 61 6c 6c 62 61 63 6b 20 2a 66 6e 29 20 7b  nCallback *fn) {
3570: 0a 20 20 20 20 63 6f 6d 70 6c 65 74 69 6f 6e 43  .    completionC
3580: 61 6c 6c 62 61 63 6b 20 3d 20 66 6e 3b 0a 7d 0a  allback = fn;.}.
3590: 0a 2f 2a 20 52 65 67 69 73 74 65 72 20 61 20 68  ./* Register a h
35a0: 69 74 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  its function to 
35b0: 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 73 68 6f  be called to sho
35c0: 77 20 68 69 74 73 20 74 6f 20 74 68 65 20 75 73  w hits to the us
35d0: 65 72 20 61 74 20 74 68 65 0a 20 2a 20 72 69 67  er at the. * rig
35e0: 68 74 20 6f 66 20 74 68 65 20 70 72 6f 6d 70 74  ht of the prompt
35f0: 2e 20 2a 2f 0a 76 6f 69 64 20 6c 69 6e 65 6e 6f  . */.void lineno
3600: 69 73 65 53 65 74 48 69 6e 74 73 43 61 6c 6c 62  iseSetHintsCallb
3610: 61 63 6b 28 6c 69 6e 65 6e 6f 69 73 65 48 69 6e  ack(linenoiseHin
3620: 74 73 43 61 6c 6c 62 61 63 6b 20 2a 66 6e 29 20  tsCallback *fn) 
3630: 7b 0a 20 20 20 20 68 69 6e 74 73 43 61 6c 6c 62  {.    hintsCallb
3640: 61 63 6b 20 3d 20 66 6e 3b 0a 7d 0a 0a 2f 2a 20  ack = fn;.}../* 
3650: 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63 74  Register a funct
3660: 69 6f 6e 20 74 6f 20 66 72 65 65 20 74 68 65 20  ion to free the 
3670: 68 69 6e 74 73 20 72 65 74 75 72 6e 65 64 20 62  hints returned b
3680: 79 20 74 68 65 20 68 69 6e 74 73 20 63 61 6c 6c  y the hints call
3690: 62 61 63 6b 0a 20 2a 20 72 65 67 69 73 74 65 72  back. * register
36a0: 65 64 20 77 69 74 68 20 6c 69 6e 65 6e 6f 69 73  ed with linenois
36b0: 65 53 65 74 48 69 6e 74 73 43 61 6c 6c 62 61 63  eSetHintsCallbac
36c0: 6b 28 29 2e 20 2a 2f 0a 76 6f 69 64 20 6c 69 6e  k(). */.void lin
36d0: 65 6e 6f 69 73 65 53 65 74 46 72 65 65 48 69 6e  enoiseSetFreeHin
36e0: 74 73 43 61 6c 6c 62 61 63 6b 28 6c 69 6e 65 6e  tsCallback(linen
36f0: 6f 69 73 65 46 72 65 65 48 69 6e 74 73 43 61 6c  oiseFreeHintsCal
3700: 6c 62 61 63 6b 20 2a 66 6e 29 20 7b 0a 20 20 20  lback *fn) {.   
3710: 20 66 72 65 65 48 69 6e 74 73 43 61 6c 6c 62 61   freeHintsCallba
3720: 63 6b 20 3d 20 66 6e 3b 0a 7d 0a 0a 2f 2a 20 54  ck = fn;.}../* T
3730: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3740: 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
3750: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 72 65  back function re
3760: 67 69 73 74 65 72 65 64 20 62 79 20 74 68 65 20  gistered by the 
3770: 75 73 65 72 0a 20 2a 20 69 6e 20 6f 72 64 65 72  user. * in order
3780: 20 74 6f 20 61 64 64 20 63 6f 6d 70 6c 65 74 69   to add completi
3790: 6f 6e 20 6f 70 74 69 6f 6e 73 20 67 69 76 65 6e  on options given
37a0: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
37b0: 67 20 77 68 65 6e 20 74 68 65 0a 20 2a 20 75 73  g when the. * us
37c0: 65 72 20 74 79 70 65 64 20 3c 74 61 62 3e 2e 20  er typed <tab>. 
37d0: 53 65 65 20 74 68 65 20 65 78 61 6d 70 6c 65 2e  See the example.
37e0: 63 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f  c source code fo
37f0: 72 20 61 20 76 65 72 79 20 65 61 73 79 20 74 6f  r a very easy to
3800: 0a 20 2a 20 75 6e 64 65 72 73 74 61 6e 64 20 65  . * understand e
3810: 78 61 6d 70 6c 65 2e 20 2a 2f 0a 76 6f 69 64 20  xample. */.void 
3820: 6c 69 6e 65 6e 6f 69 73 65 41 64 64 43 6f 6d 70  linenoiseAddComp
3830: 6c 65 74 69 6f 6e 28 6c 69 6e 65 6e 6f 69 73 65  letion(linenoise
3840: 43 6f 6d 70 6c 65 74 69 6f 6e 73 20 2a 6c 63 2c  Completions *lc,
3850: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 72   const char *str
3860: 29 20 7b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c  ) {.    size_t l
3870: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 73 74 72 29  en = strlen(str)
3880: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 6f 70 79  ;.    char *copy
3890: 2c 20 2a 2a 63 76 65 63 3b 0a 0a 20 20 20 20 63  , **cvec;..    c
38a0: 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e  opy = malloc(len
38b0: 2b 31 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 70  +1);.    if (cop
38c0: 79 20 3d 3d 20 4e 55 4c 4c 29 20 72 65 74 75 72  y == NULL) retur
38d0: 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 63 6f  n;.    memcpy(co
38e0: 70 79 2c 73 74 72 2c 6c 65 6e 2b 31 29 3b 0a 20  py,str,len+1);. 
38f0: 20 20 20 63 76 65 63 20 3d 20 72 65 61 6c 6c 6f     cvec = reallo
3900: 63 28 6c 63 2d 3e 63 76 65 63 2c 73 69 7a 65 6f  c(lc->cvec,sizeo
3910: 66 28 63 68 61 72 2a 29 2a 28 6c 63 2d 3e 6c 65  f(char*)*(lc->le
3920: 6e 2b 31 29 29 3b 0a 20 20 20 20 69 66 20 28 63  n+1));.    if (c
3930: 76 65 63 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 20  vec == NULL) {. 
3940: 20 20 20 20 20 20 20 66 72 65 65 28 63 6f 70 79         free(copy
3950: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
3960: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 63 2d  n;.    }.    lc-
3970: 3e 63 76 65 63 20 3d 20 63 76 65 63 3b 0a 20 20  >cvec = cvec;.  
3980: 20 20 6c 63 2d 3e 63 76 65 63 5b 6c 63 2d 3e 6c    lc->cvec[lc->l
3990: 65 6e 2b 2b 5d 20 3d 20 63 6f 70 79 3b 0a 7d 0a  en++] = copy;.}.
39a0: 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ./* ============
39b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 20  =============== 
39c0: 4c 69 6e 65 20 65 64 69 74 69 6e 67 20 3d 3d 3d  Line editing ===
39d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
39e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 20 2a  ============== *
39f0: 2f 0a 0a 2f 2a 20 57 65 20 64 65 66 69 6e 65 20  /../* We define 
3a00: 61 20 76 65 72 79 20 73 69 6d 70 6c 65 20 22 61  a very simple "a
3a10: 70 70 65 6e 64 20 62 75 66 66 65 72 22 20 73 74  ppend buffer" st
3a20: 72 75 63 74 75 72 65 2c 20 74 68 61 74 20 69 73  ructure, that is
3a30: 20 61 6e 20 68 65 61 70 0a 20 2a 20 61 6c 6c 6f   an heap. * allo
3a40: 63 61 74 65 64 20 73 74 72 69 6e 67 20 77 68 65  cated string whe
3a50: 72 65 20 77 65 20 63 61 6e 20 61 70 70 65 6e 64  re we can append
3a60: 20 74 6f 2e 20 54 68 69 73 20 69 73 20 75 73 65   to. This is use
3a70: 66 75 6c 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  ful in order to.
3a80: 20 2a 20 77 72 69 74 65 20 61 6c 6c 20 74 68 65   * write all the
3a90: 20 65 73 63 61 70 65 20 73 65 71 75 65 6e 63 65   escape sequence
3aa0: 73 20 69 6e 20 61 20 62 75 66 66 65 72 20 61 6e  s in a buffer an
3ab0: 64 20 66 6c 75 73 68 20 74 68 65 6d 20 74 6f 20  d flush them to 
3ac0: 74 68 65 20 73 74 61 6e 64 61 72 64 0a 20 2a 20  the standard. * 
3ad0: 6f 75 74 70 75 74 20 69 6e 20 61 20 73 69 6e 67  output in a sing
3ae0: 6c 65 20 63 61 6c 6c 2c 20 74 6f 20 61 76 6f 69  le call, to avoi
3af0: 64 20 66 6c 69 63 6b 65 72 69 6e 67 20 65 66 66  d flickering eff
3b00: 65 63 74 73 2e 20 2a 2f 0a 73 74 72 75 63 74 20  ects. */.struct 
3b10: 61 62 75 66 20 7b 0a 20 20 20 20 63 68 61 72 20  abuf {.    char 
3b20: 2a 62 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b  *b;.    int len;
3b30: 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .};..static void
3b40: 20 61 62 49 6e 69 74 28 73 74 72 75 63 74 20 61   abInit(struct a
3b50: 62 75 66 20 2a 61 62 29 20 7b 0a 20 20 20 20 61  buf *ab) {.    a
3b60: 62 2d 3e 62 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  b->b = NULL;.   
3b70: 20 61 62 2d 3e 6c 65 6e 20 3d 20 30 3b 0a 7d 0a   ab->len = 0;.}.
3b80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 62 41  .static void abA
3b90: 70 70 65 6e 64 28 73 74 72 75 63 74 20 61 62 75  ppend(struct abu
3ba0: 66 20 2a 61 62 2c 20 63 6f 6e 73 74 20 63 68 61  f *ab, const cha
3bb0: 72 20 2a 73 2c 20 69 6e 74 20 6c 65 6e 29 20 7b  r *s, int len) {
3bc0: 0a 20 20 20 20 63 68 61 72 20 2a 6e 65 77 20 3d  .    char *new =
3bd0: 20 72 65 61 6c 6c 6f 63 28 61 62 2d 3e 62 2c 61   realloc(ab->b,a
3be0: 62 2d 3e 6c 65 6e 2b 6c 65 6e 29 3b 0a 0a 20 20  b->len+len);..  
3bf0: 20 20 69 66 20 28 6e 65 77 20 3d 3d 20 4e 55 4c    if (new == NUL
3c00: 4c 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6d  L) return;.    m
3c10: 65 6d 63 70 79 28 6e 65 77 2b 61 62 2d 3e 6c 65  emcpy(new+ab->le
3c20: 6e 2c 73 2c 6c 65 6e 29 3b 0a 20 20 20 20 61 62  n,s,len);.    ab
3c30: 2d 3e 62 20 3d 20 6e 65 77 3b 0a 20 20 20 20 61  ->b = new;.    a
3c40: 62 2d 3e 6c 65 6e 20 2b 3d 20 6c 65 6e 3b 0a 7d  b->len += len;.}
3c50: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 62  ..static void ab
3c60: 46 72 65 65 28 73 74 72 75 63 74 20 61 62 75 66  Free(struct abuf
3c70: 20 2a 61 62 29 20 7b 0a 20 20 20 20 66 72 65 65   *ab) {.    free
3c80: 28 61 62 2d 3e 62 29 3b 0a 7d 0a 0a 2f 2a 20 48  (ab->b);.}../* H
3c90: 65 6c 70 65 72 20 6f 66 20 72 65 66 72 65 73 68  elper of refresh
3ca0: 53 69 6e 67 6c 65 4c 69 6e 65 28 29 20 61 6e 64  SingleLine() and
3cb0: 20 72 65 66 72 65 73 68 4d 75 6c 74 69 4c 69 6e   refreshMultiLin
3cc0: 65 28 29 20 74 6f 20 73 68 6f 77 20 68 69 6e 74  e() to show hint
3cd0: 73 0a 20 2a 20 74 6f 20 74 68 65 20 72 69 67 68  s. * to the righ
3ce0: 74 20 6f 66 20 74 68 65 20 70 72 6f 6d 70 74 2e  t of the prompt.
3cf0: 20 2a 2f 0a 76 6f 69 64 20 72 65 66 72 65 73 68   */.void refresh
3d00: 53 68 6f 77 48 69 6e 74 73 28 73 74 72 75 63 74  ShowHints(struct
3d10: 20 61 62 75 66 20 2a 61 62 2c 20 73 74 72 75 63   abuf *ab, struc
3d20: 74 20 6c 69 6e 65 6e 6f 69 73 65 53 74 61 74 65  t linenoiseState
3d30: 20 2a 6c 2c 20 69 6e 74 20 70 6c 65 6e 29 20 7b   *l, int plen) {
3d40: 0a 20 20 20 20 63 68 61 72 20 73 65 71 5b 36 34  .    char seq[64
3d50: 5d 3b 0a 20 20 20 20 69 66 20 28 68 69 6e 74 73  ];.    if (hints
3d60: 43 61 6c 6c 62 61 63 6b 20 26 26 20 70 6c 65 6e  Callback && plen
3d70: 2b 6c 2d 3e 6c 65 6e 20 3c 20 6c 2d 3e 63 6f 6c  +l->len < l->col
3d80: 73 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  s) {.        int
3d90: 20 63 6f 6c 6f 72 20 3d 20 2d 31 2c 20 62 6f 6c   color = -1, bol
3da0: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  d = 0;.        c
3db0: 68 61 72 20 2a 68 69 6e 74 20 3d 20 68 69 6e 74  har *hint = hint
3dc0: 73 43 61 6c 6c 62 61 63 6b 28 6c 2d 3e 62 75 66  sCallback(l->buf
3dd0: 2c 26 63 6f 6c 6f 72 2c 26 62 6f 6c 64 29 3b 0a  ,&color,&bold);.
3de0: 20 20 20 20 20 20 20 20 69 66 20 28 68 69 6e 74          if (hint
3df0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3e00: 69 6e 74 20 68 69 6e 74 6c 65 6e 20 3d 20 73 74  int hintlen = st
3e10: 72 6c 65 6e 28 68 69 6e 74 29 3b 0a 20 20 20 20  rlen(hint);.    
3e20: 20 20 20 20 20 20 20 20 69 6e 74 20 68 69 6e 74          int hint
3e30: 6d 61 78 6c 65 6e 20 3d 20 6c 2d 3e 63 6f 6c 73  maxlen = l->cols
3e40: 2d 28 70 6c 65 6e 2b 6c 2d 3e 6c 65 6e 29 3b 0a  -(plen+l->len);.
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
3e60: 68 69 6e 74 6c 65 6e 20 3e 20 68 69 6e 74 6d 61  hintlen > hintma
3e70: 78 6c 65 6e 29 20 68 69 6e 74 6c 65 6e 20 3d 20  xlen) hintlen = 
3e80: 68 69 6e 74 6d 61 78 6c 65 6e 3b 0a 20 20 20 20  hintmaxlen;.    
3e90: 20 20 20 20 20 20 20 20 69 66 20 28 62 6f 6c 64          if (bold
3ea0: 20 3d 3d 20 31 20 26 26 20 63 6f 6c 6f 72 20 3d   == 1 && color =
3eb0: 3d 20 2d 31 29 20 63 6f 6c 6f 72 20 3d 20 33 37  = -1) color = 37
3ec0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
3ed0: 20 28 63 6f 6c 6f 72 20 21 3d 20 2d 31 20 7c 7c   (color != -1 ||
3ee0: 20 62 6f 6c 64 20 21 3d 20 30 29 0a 20 20 20 20   bold != 0).    
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 73 6e 70 72              snpr
3f00: 69 6e 74 66 28 73 65 71 2c 36 34 2c 22 5c 30 33  intf(seq,64,"\03
3f10: 33 5b 25 64 3b 25 64 3b 34 39 6d 22 2c 62 6f 6c  3[%d;%d;49m",bol
3f20: 64 2c 63 6f 6c 6f 72 29 3b 0a 20 20 20 20 20 20  d,color);.      
3f30: 20 20 20 20 20 20 61 62 41 70 70 65 6e 64 28 61        abAppend(a
3f40: 62 2c 73 65 71 2c 73 74 72 6c 65 6e 28 73 65 71  b,seq,strlen(seq
3f50: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
3f60: 61 62 41 70 70 65 6e 64 28 61 62 2c 68 69 6e 74  abAppend(ab,hint
3f70: 2c 68 69 6e 74 6c 65 6e 29 3b 0a 20 20 20 20 20  ,hintlen);.     
3f80: 20 20 20 20 20 20 20 69 66 20 28 63 6f 6c 6f 72         if (color
3f90: 20 21 3d 20 2d 31 20 7c 7c 20 62 6f 6c 64 20 21   != -1 || bold !
3fa0: 3d 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  = 0).           
3fb0: 20 20 20 20 20 61 62 41 70 70 65 6e 64 28 61 62       abAppend(ab
3fc0: 2c 22 5c 30 33 33 5b 30 6d 22 2c 34 29 3b 0a 20  ,"\033[0m",4);. 
3fd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61             /* Ca
3fe0: 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ll the function 
3ff0: 74 6f 20 66 72 65 65 20 74 68 65 20 68 69 6e 74  to free the hint
4000: 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 20 20   returned. */.  
4010: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 66 72            if (fr
4020: 65 65 48 69 6e 74 73 43 61 6c 6c 62 61 63 6b 29  eeHintsCallback)
4030: 20 66 72 65 65 48 69 6e 74 73 43 61 6c 6c 62 61   freeHintsCallba
4040: 63 6b 28 68 69 6e 74 29 3b 0a 20 20 20 20 20 20  ck(hint);.      
4050: 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 20    }.    }.}../* 
4060: 53 69 6e 67 6c 65 20 6c 69 6e 65 20 6c 6f 77 20  Single line low 
4070: 6c 65 76 65 6c 20 6c 69 6e 65 20 72 65 66 72 65  level line refre
4080: 73 68 2e 0a 20 2a 0a 20 2a 20 52 65 77 72 69 74  sh.. *. * Rewrit
4090: 65 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  e the currently 
40a0: 65 64 69 74 65 64 20 6c 69 6e 65 20 61 63 63 6f  edited line acco
40b0: 72 64 69 6e 67 6c 79 20 74 6f 20 74 68 65 20 62  rdingly to the b
40c0: 75 66 66 65 72 20 63 6f 6e 74 65 6e 74 2c 0a 20  uffer content,. 
40d0: 2a 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  * cursor positio
40e0: 6e 2c 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  n, and number of
40f0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
4100: 74 65 72 6d 69 6e 61 6c 2e 20 2a 2f 0a 73 74 61  terminal. */.sta
4110: 74 69 63 20 76 6f 69 64 20 72 65 66 72 65 73 68  tic void refresh
4120: 53 69 6e 67 6c 65 4c 69 6e 65 28 73 74 72 75 63  SingleLine(struc
4130: 74 20 6c 69 6e 65 6e 6f 69 73 65 53 74 61 74 65  t linenoiseState
4140: 20 2a 6c 29 20 7b 0a 20 20 20 20 63 68 61 72 20   *l) {.    char 
4150: 73 65 71 5b 36 34 5d 3b 0a 20 20 20 20 73 69 7a  seq[64];.    siz
4160: 65 5f 74 20 70 6c 65 6e 20 3d 20 73 74 72 6c 65  e_t plen = strle
4170: 6e 28 6c 2d 3e 70 72 6f 6d 70 74 29 3b 0a 20 20  n(l->prompt);.  
4180: 20 20 69 6e 74 20 66 64 20 3d 20 6c 2d 3e 6f 66    int fd = l->of
4190: 64 3b 0a 20 20 20 20 63 68 61 72 20 2a 62 75 66  d;.    char *buf
41a0: 20 3d 20 6c 2d 3e 62 75 66 3b 0a 20 20 20 20 73   = l->buf;.    s
41b0: 69 7a 65 5f 74 20 6c 65 6e 20 3d 20 6c 2d 3e 6c  ize_t len = l->l
41c0: 65 6e 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 70  en;.    size_t p
41d0: 6f 73 20 3d 20 6c 2d 3e 70 6f 73 3b 0a 20 20 20  os = l->pos;.   
41e0: 20 73 74 72 75 63 74 20 61 62 75 66 20 61 62 3b   struct abuf ab;
41f0: 0a 0a 20 20 20 20 77 68 69 6c 65 28 28 70 6c 65  ..    while((ple
4200: 6e 2b 70 6f 73 29 20 3e 3d 20 6c 2d 3e 63 6f 6c  n+pos) >= l->col
4210: 73 29 20 7b 0a 20 20 20 20 20 20 20 20 62 75 66  s) {.        buf
4220: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 2d  ++;.        len-
4230: 2d 3b 0a 20 20 20 20 20 20 20 20 70 6f 73 2d 2d  -;.        pos--
4240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
4250: 65 20 28 70 6c 65 6e 2b 6c 65 6e 20 3e 20 6c 2d  e (plen+len > l-
4260: 3e 63 6f 6c 73 29 20 7b 0a 20 20 20 20 20 20 20  >cols) {.       
4270: 20 6c 65 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20   len--;.    }.. 
4280: 20 20 20 61 62 49 6e 69 74 28 26 61 62 29 3b 0a     abInit(&ab);.
4290: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
42a0: 20 6c 65 66 74 20 65 64 67 65 20 2a 2f 0a 20 20   left edge */.  
42b0: 20 20 73 6e 70 72 69 6e 74 66 28 73 65 71 2c 36    snprintf(seq,6
42c0: 34 2c 22 5c 72 22 29 3b 0a 20 20 20 20 61 62 41  4,"\r");.    abA
42d0: 70 70 65 6e 64 28 26 61 62 2c 73 65 71 2c 73 74  ppend(&ab,seq,st
42e0: 72 6c 65 6e 28 73 65 71 29 29 3b 0a 20 20 20 20  rlen(seq));.    
42f0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 72 6f  /* Write the pro
4300: 6d 70 74 20 61 6e 64 20 74 68 65 20 63 75 72 72  mpt and the curr
4310: 65 6e 74 20 62 75 66 66 65 72 20 63 6f 6e 74 65  ent buffer conte
4320: 6e 74 20 2a 2f 0a 20 20 20 20 61 62 41 70 70 65  nt */.    abAppe
4330: 6e 64 28 26 61 62 2c 6c 2d 3e 70 72 6f 6d 70 74  nd(&ab,l->prompt
4340: 2c 73 74 72 6c 65 6e 28 6c 2d 3e 70 72 6f 6d 70  ,strlen(l->promp
4350: 74 29 29 3b 0a 20 20 20 20 61 62 41 70 70 65 6e  t));.    abAppen
4360: 64 28 26 61 62 2c 62 75 66 2c 6c 65 6e 29 3b 0a  d(&ab,buf,len);.
4370: 20 20 20 20 2f 2a 20 53 68 6f 77 20 68 69 74 73      /* Show hits
4380: 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
4390: 72 65 66 72 65 73 68 53 68 6f 77 48 69 6e 74 73  refreshShowHints
43a0: 28 26 61 62 2c 6c 2c 70 6c 65 6e 29 3b 0a 20 20  (&ab,l,plen);.  
43b0: 20 20 2f 2a 20 45 72 61 73 65 20 74 6f 20 72 69    /* Erase to ri
43c0: 67 68 74 20 2a 2f 0a 20 20 20 20 73 6e 70 72 69  ght */.    snpri
43d0: 6e 74 66 28 73 65 71 2c 36 34 2c 22 5c 78 31 62  ntf(seq,64,"\x1b
43e0: 5b 30 4b 22 29 3b 0a 20 20 20 20 61 62 41 70 70  [0K");.    abApp
43f0: 65 6e 64 28 26 61 62 2c 73 65 71 2c 73 74 72 6c  end(&ab,seq,strl
4400: 65 6e 28 73 65 71 29 29 3b 0a 20 20 20 20 2f 2a  en(seq));.    /*
4410: 20 4d 6f 76 65 20 63 75 72 73 6f 72 20 74 6f 20   Move cursor to 
4420: 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f  original positio
4430: 6e 2e 20 2a 2f 0a 20 20 20 20 73 6e 70 72 69 6e  n. */.    snprin
4440: 74 66 28 73 65 71 2c 36 34 2c 22 5c 72 5c 78 31  tf(seq,64,"\r\x1
4450: 62 5b 25 64 43 22 2c 20 28 69 6e 74 29 28 70 6f  b[%dC", (int)(po
4460: 73 2b 70 6c 65 6e 29 29 3b 0a 20 20 20 20 61 62  s+plen));.    ab
4470: 41 70 70 65 6e 64 28 26 61 62 2c 73 65 71 2c 73  Append(&ab,seq,s
4480: 74 72 6c 65 6e 28 73 65 71 29 29 3b 0a 20 20 20  trlen(seq));.   
4490: 20 69 66 20 28 77 72 69 74 65 28 66 64 2c 61 62   if (write(fd,ab
44a0: 2e 62 2c 61 62 2e 6c 65 6e 29 20 3d 3d 20 2d 31  .b,ab.len) == -1
44b0: 29 20 7b 7d 20 2f 2a 20 43 61 6e 27 74 20 72 65  ) {} /* Can't re
44c0: 63 6f 76 65 72 20 66 72 6f 6d 20 77 72 69 74 65  cover from write
44d0: 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 61   error. */.    a
44e0: 62 46 72 65 65 28 26 61 62 29 3b 0a 7d 0a 0a 2f  bFree(&ab);.}../
44f0: 2a 20 4d 75 6c 74 69 20 6c 69 6e 65 20 6c 6f 77  * Multi line low
4500: 20 6c 65 76 65 6c 20 6c 69 6e 65 20 72 65 66 72   level line refr
4510: 65 73 68 2e 0a 20 2a 0a 20 2a 20 52 65 77 72 69  esh.. *. * Rewri
4520: 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  te the currently
4530: 20 65 64 69 74 65 64 20 6c 69 6e 65 20 61 63 63   edited line acc
4540: 6f 72 64 69 6e 67 6c 79 20 74 6f 20 74 68 65 20  ordingly to the 
4550: 62 75 66 66 65 72 20 63 6f 6e 74 65 6e 74 2c 0a  buffer content,.
4560: 20 2a 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69   * cursor positi
4570: 6f 6e 2c 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  on, and number o
4580: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  f columns of the
4590: 20 74 65 72 6d 69 6e 61 6c 2e 20 2a 2f 0a 73 74   terminal. */.st
45a0: 61 74 69 63 20 76 6f 69 64 20 72 65 66 72 65 73  atic void refres
45b0: 68 4d 75 6c 74 69 4c 69 6e 65 28 73 74 72 75 63  hMultiLine(struc
45c0: 74 20 6c 69 6e 65 6e 6f 69 73 65 53 74 61 74 65  t linenoiseState
45d0: 20 2a 6c 29 20 7b 0a 20 20 20 20 63 68 61 72 20   *l) {.    char 
45e0: 73 65 71 5b 36 34 5d 3b 0a 20 20 20 20 69 6e 74  seq[64];.    int
45f0: 20 70 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6c   plen = strlen(l
4600: 2d 3e 70 72 6f 6d 70 74 29 3b 0a 20 20 20 20 69  ->prompt);.    i
4610: 6e 74 20 72 6f 77 73 20 3d 20 28 70 6c 65 6e 2b  nt rows = (plen+
4620: 6c 2d 3e 6c 65 6e 2b 6c 2d 3e 63 6f 6c 73 2d 31  l->len+l->cols-1
4630: 29 2f 6c 2d 3e 63 6f 6c 73 3b 20 2f 2a 20 72 6f  )/l->cols; /* ro
4640: 77 73 20 75 73 65 64 20 62 79 20 63 75 72 72 65  ws used by curre
4650: 6e 74 20 62 75 66 2e 20 2a 2f 0a 20 20 20 20 69  nt buf. */.    i
4660: 6e 74 20 72 70 6f 73 20 3d 20 28 70 6c 65 6e 2b  nt rpos = (plen+
4670: 6c 2d 3e 6f 6c 64 70 6f 73 2b 6c 2d 3e 63 6f 6c  l->oldpos+l->col
4680: 73 29 2f 6c 2d 3e 63 6f 6c 73 3b 20 2f 2a 20 63  s)/l->cols; /* c
4690: 75 72 73 6f 72 20 72 65 6c 61 74 69 76 65 20 72  ursor relative r
46a0: 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ow. */.    int r
46b0: 70 6f 73 32 3b 20 2f 2a 20 72 70 6f 73 20 61 66  pos2; /* rpos af
46c0: 74 65 72 20 72 65 66 72 65 73 68 2e 20 2a 2f 0a  ter refresh. */.
46d0: 20 20 20 20 69 6e 74 20 63 6f 6c 3b 20 2f 2a 20      int col; /* 
46e0: 63 6f 6c 75 6d 20 70 6f 73 69 74 69 6f 6e 2c 20  colum position, 
46f0: 7a 65 72 6f 2d 62 61 73 65 64 2e 20 2a 2f 0a 20  zero-based. */. 
4700: 20 20 20 69 6e 74 20 6f 6c 64 5f 72 6f 77 73 20     int old_rows 
4710: 3d 20 6c 2d 3e 6d 61 78 72 6f 77 73 3b 0a 20 20  = l->maxrows;.  
4720: 20 20 69 6e 74 20 66 64 20 3d 20 6c 2d 3e 6f 66    int fd = l->of
4730: 64 2c 20 6a 3b 0a 20 20 20 20 73 74 72 75 63 74  d, j;.    struct
4740: 20 61 62 75 66 20 61 62 3b 0a 0a 20 20 20 20 2f   abuf ab;..    /
4750: 2a 20 55 70 64 61 74 65 20 6d 61 78 72 6f 77 73  * Update maxrows
4760: 20 69 66 20 6e 65 65 64 65 64 2e 20 2a 2f 0a 20   if needed. */. 
4770: 20 20 20 69 66 20 28 72 6f 77 73 20 3e 20 28 69     if (rows > (i
4780: 6e 74 29 6c 2d 3e 6d 61 78 72 6f 77 73 29 20 6c  nt)l->maxrows) l
4790: 2d 3e 6d 61 78 72 6f 77 73 20 3d 20 72 6f 77 73  ->maxrows = rows
47a0: 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ;..    /* First 
47b0: 73 74 65 70 3a 20 63 6c 65 61 72 20 61 6c 6c 20  step: clear all 
47c0: 74 68 65 20 6c 69 6e 65 73 20 75 73 65 64 20 62  the lines used b
47d0: 65 66 6f 72 65 2e 20 54 6f 20 64 6f 20 73 6f 20  efore. To do so 
47e0: 73 74 61 72 74 20 62 79 0a 20 20 20 20 20 2a 20  start by.     * 
47f0: 67 6f 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  going to the las
4800: 74 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 61 62  t row. */.    ab
4810: 49 6e 69 74 28 26 61 62 29 3b 0a 20 20 20 20 69  Init(&ab);.    i
4820: 66 20 28 6f 6c 64 5f 72 6f 77 73 2d 72 70 6f 73  f (old_rows-rpos
4830: 20 3e 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20   > 0) {.        
4840: 2f 2a 20 6c 6e 64 65 62 75 67 28 22 67 6f 20 64  /* lndebug("go d
4850: 6f 77 6e 20 25 64 22 2c 20 6f 6c 64 5f 72 6f 77  own %d", old_row
4860: 73 2d 72 70 6f 73 29 3b 20 2a 2f 0a 20 20 20 20  s-rpos); */.    
4870: 20 20 20 20 73 6e 70 72 69 6e 74 66 28 73 65 71      snprintf(seq
4880: 2c 36 34 2c 22 5c 78 31 62 5b 25 64 42 22 2c 20  ,64,"\x1b[%dB", 
4890: 6f 6c 64 5f 72 6f 77 73 2d 72 70 6f 73 29 3b 0a  old_rows-rpos);.
48a0: 20 20 20 20 20 20 20 20 61 62 41 70 70 65 6e 64          abAppend
48b0: 28 26 61 62 2c 73 65 71 2c 73 74 72 6c 65 6e 28  (&ab,seq,strlen(
48c0: 73 65 71 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  seq));.    }..  
48d0: 20 20 2f 2a 20 4e 6f 77 20 66 6f 72 20 65 76 65    /* Now for eve
48e0: 72 79 20 72 6f 77 20 63 6c 65 61 72 20 69 74 2c  ry row clear it,
48f0: 20 67 6f 20 75 70 2e 20 2a 2f 0a 20 20 20 20 66   go up. */.    f
4900: 6f 72 20 28 6a 20 3d 20 30 3b 20 6a 20 3c 20 6f  or (j = 0; j < o
4910: 6c 64 5f 72 6f 77 73 2d 31 3b 20 6a 2b 2b 29 20  ld_rows-1; j++) 
4920: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6c 6e 64  {.        /* lnd
4930: 65 62 75 67 28 22 63 6c 65 61 72 2b 75 70 22 29  ebug("clear+up")
4940: 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 6e 70  ; */.        snp
4950: 72 69 6e 74 66 28 73 65 71 2c 36 34 2c 22 5c 72  rintf(seq,64,"\r
4960: 5c 78 31 62 5b 30 4b 5c 78 31 62 5b 31 41 22 29  \x1b[0K\x1b[1A")
4970: 3b 0a 20 20 20 20 20 20 20 20 61 62 41 70 70 65  ;.        abAppe
4980: 6e 64 28 26 61 62 2c 73 65 71 2c 73 74 72 6c 65  nd(&ab,seq,strle
4990: 6e 28 73 65 71 29 29 3b 0a 20 20 20 20 7d 0a 0a  n(seq));.    }..
49a0: 20 20 20 20 2f 2a 20 43 6c 65 61 6e 20 74 68 65      /* Clean the
49b0: 20 74 6f 70 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20   top line. */.  
49c0: 20 20 2f 2a 20 6c 6e 64 65 62 75 67 28 22 63 6c    /* lndebug("cl
49d0: 65 61 72 22 29 3b 20 2a 2f 0a 20 20 20 20 73 6e  ear"); */.    sn
49e0: 70 72 69 6e 74 66 28 73 65 71 2c 36 34 2c 22 5c  printf(seq,64,"\
49f0: 72 5c 78 31 62 5b 30 4b 22 29 3b 0a 20 20 20 20  r\x1b[0K");.    
4a00: 61 62 41 70 70 65 6e 64 28 26 61 62 2c 73 65 71  abAppend(&ab,seq
4a10: 2c 73 74 72 6c 65 6e 28 73 65 71 29 29 3b 0a 0a  ,strlen(seq));..
4a20: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
4a30: 20 70 72 6f 6d 70 74 20 61 6e 64 20 74 68 65 20   prompt and the 
4a40: 63 75 72 72 65 6e 74 20 62 75 66 66 65 72 20 63  current buffer c
4a50: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 61 62  ontent */.    ab
4a60: 41 70 70 65 6e 64 28 26 61 62 2c 6c 2d 3e 70 72  Append(&ab,l->pr
4a70: 6f 6d 70 74 2c 73 74 72 6c 65 6e 28 6c 2d 3e 70  ompt,strlen(l->p
4a80: 72 6f 6d 70 74 29 29 3b 0a 20 20 20 20 61 62 41  rompt));.    abA
4a90: 70 70 65 6e 64 28 26 61 62 2c 6c 2d 3e 62 75 66  ppend(&ab,l->buf
4aa0: 2c 6c 2d 3e 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f  ,l->len);..    /
4ab0: 2a 20 53 68 6f 77 20 68 69 74 73 20 69 66 20 61  * Show hits if a
4ac0: 6e 79 2e 20 2a 2f 0a 20 20 20 20 72 65 66 72 65  ny. */.    refre
4ad0: 73 68 53 68 6f 77 48 69 6e 74 73 28 26 61 62 2c  shShowHints(&ab,
4ae0: 6c 2c 70 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a  l,plen);..    /*
4af0: 20 49 66 20 77 65 20 61 72 65 20 61 74 20 74 68   If we are at th
4b00: 65 20 76 65 72 79 20 65 6e 64 20 6f 66 20 74 68  e very end of th
4b10: 65 20 73 63 72 65 65 6e 20 77 69 74 68 20 6f 75  e screen with ou
4b20: 72 20 70 72 6f 6d 70 74 2c 20 77 65 20 6e 65 65  r prompt, we nee
4b30: 64 20 74 6f 0a 20 20 20 20 20 2a 20 65 6d 69 74  d to.     * emit
4b40: 20 61 20 6e 65 77 6c 69 6e 65 20 61 6e 64 20 6d   a newline and m
4b50: 6f 76 65 20 74 68 65 20 70 72 6f 6d 70 74 20 74  ove the prompt t
4b60: 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75  o the first colu
4b70: 6d 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c  mn. */.    if (l
4b80: 2d 3e 70 6f 73 20 26 26 0a 20 20 20 20 20 20 20  ->pos &&.       
4b90: 20 6c 2d 3e 70 6f 73 20 3d 3d 20 6c 2d 3e 6c 65   l->pos == l->le
4ba0: 6e 20 26 26 0a 20 20 20 20 20 20 20 20 28 6c 2d  n &&.        (l-
4bb0: 3e 70 6f 73 2b 70 6c 65 6e 29 20 25 20 6c 2d 3e  >pos+plen) % l->
4bc0: 63 6f 6c 73 20 3d 3d 20 30 29 0a 20 20 20 20 7b  cols == 0).    {
4bd0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 6c 6e 64 65  .        /* lnde
4be0: 62 75 67 28 22 3c 6e 65 77 6c 69 6e 65 3e 22 29  bug("<newline>")
4bf0: 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 62 41  ; */.        abA
4c00: 70 70 65 6e 64 28 26 61 62 2c 22 5c 6e 22 2c 31  ppend(&ab,"\n",1
4c10: 29 3b 0a 20 20 20 20 20 20 20 20 73 6e 70 72 69  );.        snpri
4c20: 6e 74 66 28 73 65 71 2c 36 34 2c 22 5c 72 22 29  ntf(seq,64,"\r")
4c30: 3b 0a 20 20 20 20 20 20 20 20 61 62 41 70 70 65  ;.        abAppe
4c40: 6e 64 28 26 61 62 2c 73 65 71 2c 73 74 72 6c 65  nd(&ab,seq,strle
4c50: 6e 28 73 65 71 29 29 3b 0a 20 20 20 20 20 20 20  n(seq));.       
4c60: 20 72 6f 77 73 2b 2b 3b 0a 20 20 20 20 20 20 20   rows++;.       
4c70: 20 69 66 20 28 72 6f 77 73 20 3e 20 28 69 6e 74   if (rows > (int
4c80: 29 6c 2d 3e 6d 61 78 72 6f 77 73 29 20 6c 2d 3e  )l->maxrows) l->
4c90: 6d 61 78 72 6f 77 73 20 3d 20 72 6f 77 73 3b 0a  maxrows = rows;.
4ca0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 6f      }..    /* Mo
4cb0: 76 65 20 63 75 72 73 6f 72 20 74 6f 20 72 69 67  ve cursor to rig
4cc0: 68 74 20 70 6f 73 69 74 69 6f 6e 2e 20 2a 2f 0a  ht position. */.
4cd0: 20 20 20 20 72 70 6f 73 32 20 3d 20 28 70 6c 65      rpos2 = (ple
4ce0: 6e 2b 6c 2d 3e 70 6f 73 2b 6c 2d 3e 63 6f 6c 73  n+l->pos+l->cols
4cf0: 29 2f 6c 2d 3e 63 6f 6c 73 3b 20 2f 2a 20 63 75  )/l->cols; /* cu
4d00: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 72 65 6c  rrent cursor rel
4d10: 61 74 69 76 65 20 72 6f 77 2e 20 2a 2f 0a 20 20  ative row. */.  
4d20: 20 20 2f 2a 20 6c 6e 64 65 62 75 67 28 22 72 70    /* lndebug("rp
4d30: 6f 73 32 20 25 64 22 2c 20 72 70 6f 73 32 29 3b  os2 %d", rpos2);
4d40: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 47 6f 20 75   */..    /* Go u
4d50: 70 20 74 69 6c 6c 20 77 65 20 72 65 61 63 68 20  p till we reach 
4d60: 74 68 65 20 65 78 70 65 63 74 65 64 20 70 6f 73  the expected pos
4d70: 69 74 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 20  iton. */.    if 
4d80: 28 72 6f 77 73 2d 72 70 6f 73 32 20 3e 20 30 29  (rows-rpos2 > 0)
4d90: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6c 6e   {.        /* ln
4da0: 64 65 62 75 67 28 22 67 6f 2d 75 70 20 25 64 22  debug("go-up %d"
4db0: 2c 20 72 6f 77 73 2d 72 70 6f 73 32 29 3b 20 2a  , rows-rpos2); *
4dc0: 2f 0a 20 20 20 20 20 20 20 20 73 6e 70 72 69 6e  /.        snprin
4dd0: 74 66 28 73 65 71 2c 36 34 2c 22 5c 78 31 62 5b  tf(seq,64,"\x1b[
4de0: 25 64 41 22 2c 20 72 6f 77 73 2d 72 70 6f 73 32  %dA", rows-rpos2
4df0: 29 3b 0a 20 20 20 20 20 20 20 20 61 62 41 70 70  );.        abApp
4e00: 65 6e 64 28 26 61 62 2c 73 65 71 2c 73 74 72 6c  end(&ab,seq,strl
4e10: 65 6e 28 73 65 71 29 29 3b 0a 20 20 20 20 7d 0a  en(seq));.    }.
4e20: 0a 20 20 20 20 2f 2a 20 53 65 74 20 63 6f 6c 75  .    /* Set colu
4e30: 6d 6e 2e 20 2a 2f 0a 20 20 20 20 63 6f 6c 20 3d  mn. */.    col =
4e40: 20 28 70 6c 65 6e 2b 28 69 6e 74 29 6c 2d 3e 70   (plen+(int)l->p
4e50: 6f 73 29 20 25 20 28 69 6e 74 29 6c 2d 3e 63 6f  os) % (int)l->co
4e60: 6c 73 3b 0a 20 20 20 20 2f 2a 20 6c 6e 64 65 62  ls;.    /* lndeb
4e70: 75 67 28 22 73 65 74 20 63 6f 6c 20 25 64 22 2c  ug("set col %d",
4e80: 20 31 2b 63 6f 6c 29 3b 20 2a 2f 0a 20 20 20 20   1+col); */.    
4e90: 69 66 20 28 63 6f 6c 29 0a 20 20 20 20 20 20 20  if (col).       
4ea0: 20 73 6e 70 72 69 6e 74 66 28 73 65 71 2c 36 34   snprintf(seq,64
4eb0: 2c 22 5c 72 5c 78 31 62 5b 25 64 43 22 2c 20 63  ,"\r\x1b[%dC", c
4ec0: 6f 6c 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  ol);.    else.  
4ed0: 20 20 20 20 20 20 73 6e 70 72 69 6e 74 66 28 73        snprintf(s
4ee0: 65 71 2c 36 34 2c 22 5c 72 22 29 3b 0a 20 20 20  eq,64,"\r");.   
4ef0: 20 61 62 41 70 70 65 6e 64 28 26 61 62 2c 73 65   abAppend(&ab,se
4f00: 71 2c 73 74 72 6c 65 6e 28 73 65 71 29 29 3b 0a  q,strlen(seq));.
4f10: 0a 20 20 20 20 2f 2a 20 6c 6e 64 65 62 75 67 28  .    /* lndebug(
4f20: 22 5c 6e 22 29 3b 20 2a 2f 0a 20 20 20 20 6c 2d  "\n"); */.    l-
4f30: 3e 6f 6c 64 70 6f 73 20 3d 20 6c 2d 3e 70 6f 73  >oldpos = l->pos
4f40: 3b 0a 0a 20 20 20 20 69 66 20 28 77 72 69 74 65  ;..    if (write
4f50: 28 66 64 2c 61 62 2e 62 2c 61 62 2e 6c 65 6e 29  (fd,ab.b,ab.len)
4f60: 20 3d 3d 20 2d 31 29 20 7b 7d 20 2f 2a 20 43 61   == -1) {} /* Ca
4f70: 6e 27 74 20 72 65 63 6f 76 65 72 20 66 72 6f 6d  n't recover from
4f80: 20 77 72 69 74 65 20 65 72 72 6f 72 2e 20 2a 2f   write error. */
4f90: 0a 20 20 20 20 61 62 46 72 65 65 28 26 61 62 29  .    abFree(&ab)
4fa0: 3b 0a 7d 0a 0a 2f 2a 20 43 61 6c 6c 73 20 74 68  ;.}../* Calls th
4fb0: 65 20 74 77 6f 20 6c 6f 77 20 6c 65 76 65 6c 20  e two low level 
4fc0: 66 75 6e 63 74 69 6f 6e 73 20 72 65 66 72 65 73  functions refres
4fd0: 68 53 69 6e 67 6c 65 4c 69 6e 65 28 29 20 6f 72  hSingleLine() or
4fe0: 0a 20 2a 20 72 65 66 72 65 73 68 4d 75 6c 74 69  . * refreshMulti
4ff0: 4c 69 6e 65 28 29 20 61 63 63 6f 72 64 69 6e 67  Line() according
5000: 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65 64   to the selected
5010: 20 6d 6f 64 65 2e 20 2a 2f 0a 73 74 61 74 69 63   mode. */.static
5020: 20 76 6f 69 64 20 72 65 66 72 65 73 68 4c 69 6e   void refreshLin
5030: 65 28 73 74 72 75 63 74 20 6c 69 6e 65 6e 6f 69  e(struct linenoi
5040: 73 65 53 74 61 74 65 20 2a 6c 29 20 7b 0a 20 20  seState *l) {.  
5050: 20 20 69 66 20 28 6d 6c 6d 6f 64 65 29 0a 20 20    if (mlmode).  
5060: 20 20 20 20 20 20 72 65 66 72 65 73 68 4d 75 6c        refreshMul
5070: 74 69 4c 69 6e 65 28 6c 29 3b 0a 20 20 20 20 65  tiLine(l);.    e
5080: 6c 73 65 0a 20 20 20 20 20 20 20 20 72 65 66 72  lse.        refr
5090: 65 73 68 53 69 6e 67 6c 65 4c 69 6e 65 28 6c 29  eshSingleLine(l)
50a0: 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74 20 74  ;.}../* Insert t
50b0: 68 65 20 63 68 61 72 61 63 74 65 72 20 27 63 27  he character 'c'
50c0: 20 61 74 20 63 75 72 73 6f 72 20 63 75 72 72 65   at cursor curre
50d0: 6e 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 20 2a 0a  nt position.. *.
50e0: 20 2a 20 4f 6e 20 65 72 72 6f 72 20 77 72 69 74   * On error writ
50f0: 69 6e 67 20 74 6f 20 74 68 65 20 74 65 72 6d 69  ing to the termi
5100: 6e 61 6c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  nal -1 is return
5110: 65 64 2c 20 6f 74 68 65 72 77 69 73 65 20 30 2e  ed, otherwise 0.
5120: 20 2a 2f 0a 69 6e 74 20 6c 69 6e 65 6e 6f 69 73   */.int linenois
5130: 65 45 64 69 74 49 6e 73 65 72 74 28 73 74 72 75  eEditInsert(stru
5140: 63 74 20 6c 69 6e 65 6e 6f 69 73 65 53 74 61 74  ct linenoiseStat
5150: 65 20 2a 6c 2c 20 63 68 61 72 20 63 29 20 7b 0a  e *l, char c) {.
5160: 20 20 20 20 69 66 20 28 6c 2d 3e 6c 65 6e 20 3c      if (l->len <
5170: 20 6c 2d 3e 62 75 66 6c 65 6e 29 20 7b 0a 20 20   l->buflen) {.  
5180: 20 20 20 20 20 20 69 66 20 28 6c 2d 3e 6c 65 6e        if (l->len
5190: 20 3d 3d 20 6c 2d 3e 70 6f 73 29 20 7b 0a 20 20   == l->pos) {.  
51a0: 20 20 20 20 20 20 20 20 20 20 6c 2d 3e 62 75 66            l->buf
51b0: 5b 6c 2d 3e 70 6f 73 5d 20 3d 20 63 3b 0a 20 20  [l->pos] = c;.  
51c0: 20 20 20 20 20 20 20 20 20 20 6c 2d 3e 70 6f 73            l->pos
51d0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
51e0: 6c 2d 3e 6c 65 6e 2b 2b 3b 0a 20 20 20 20 20 20  l->len++;.      
51f0: 20 20 20 20 20 20 6c 2d 3e 62 75 66 5b 6c 2d 3e        l->buf[l->
5200: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  len] = '\0';.   
5210: 20 20 20 20 20 20 20 20 20 69 66 20 28 28 21 6d           if ((!m
5220: 6c 6d 6f 64 65 20 26 26 20 6c 2d 3e 70 6c 65 6e  lmode && l->plen
5230: 2b 6c 2d 3e 6c 65 6e 20 3c 20 6c 2d 3e 63 6f 6c  +l->len < l->col
5240: 73 20 26 26 20 21 68 69 6e 74 73 43 61 6c 6c 62  s && !hintsCallb
5250: 61 63 6b 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ack)) {.        
5260: 20 20 20 20 20 20 20 20 2f 2a 20 41 76 6f 69 64          /* Avoid
5270: 20 61 20 66 75 6c 6c 20 75 70 64 61 74 65 20 6f   a full update o
5280: 66 20 74 68 65 20 6c 69 6e 65 20 69 6e 20 74 68  f the line in th
5290: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
52a0: 20 20 20 2a 20 74 72 69 76 69 61 6c 20 63 61 73     * trivial cas
52b0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
52c0: 20 20 20 20 20 20 69 66 20 28 77 72 69 74 65 28        if (write(
52d0: 6c 2d 3e 6f 66 64 2c 26 63 2c 31 29 20 3d 3d 20  l->ofd,&c,1) == 
52e0: 2d 31 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  -1) return -1;. 
52f0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
5300: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
5310: 20 20 20 20 72 65 66 72 65 73 68 4c 69 6e 65 28      refreshLine(
5320: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
5330: 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  }.        } else
5340: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   {.            m
5350: 65 6d 6d 6f 76 65 28 6c 2d 3e 62 75 66 2b 6c 2d  emmove(l->buf+l-
5360: 3e 70 6f 73 2b 31 2c 6c 2d 3e 62 75 66 2b 6c 2d  >pos+1,l->buf+l-
5370: 3e 70 6f 73 2c 6c 2d 3e 6c 65 6e 2d 6c 2d 3e 70  >pos,l->len-l->p
5380: 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  os);.           
5390: 20 6c 2d 3e 62 75 66 5b 6c 2d 3e 70 6f 73 5d 20   l->buf[l->pos] 
53a0: 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = c;.           
53b0: 20 6c 2d 3e 6c 65 6e 2b 2b 3b 0a 20 20 20 20 20   l->len++;.     
53c0: 20 20 20 20 20 20 20 6c 2d 3e 70 6f 73 2b 2b 3b         l->pos++;
53d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 2d 3e  .            l->
53e0: 62 75 66 5b 6c 2d 3e 6c 65 6e 5d 20 3d 20 27 5c  buf[l->len] = '\
53f0: 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0';.            
5400: 72 65 66 72 65 73 68 4c 69 6e 65 28 6c 29 3b 0a  refreshLine(l);.
5410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
5420: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a      return 0;.}.
5430: 0a 2f 2a 20 4d 6f 76 65 20 63 75 72 73 6f 72 20  ./* Move cursor 
5440: 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 2a 2f 0a  on the left. */.
5450: 76 6f 69 64 20 6c 69 6e 65 6e 6f 69 73 65 45 64  void linenoiseEd
5460: 69 74 4d 6f 76 65 4c 65 66 74 28 73 74 72 75 63  itMoveLeft(struc
5470: 74 20 6c 69 6e 65 6e 6f 69 73 65 53 74 61 74 65  t linenoiseState
5480: 20 2a 6c 29 20 7b 0a 20 20 20 20 69 66 20 28 6c   *l) {.    if (l
5490: 2d 3e 70 6f 73 20 3e 20 30 29 20 7b 0a 20 20 20  ->pos > 0) {.   
54a0: 20 20 20 20 20 6c 2d 3e 70 6f 73 2d 2d 3b 0a 20       l->pos--;. 
54b0: 20 20 20 20 20 20 20 72 65 66 72 65 73 68 4c 69         refreshLi
54c0: 6e 65 28 6c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a  ne(l);.    }.}..
54d0: 2f 2a 20 4d 6f 76 65 20 63 75 72 73 6f 72 20 6f  /* Move cursor o
54e0: 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a  n the right. */.
54f0: 76 6f 69 64 20 6c 69 6e 65 6e 6f 69 73 65 45 64  void linenoiseEd
5500: 69 74 4d 6f 76 65 52 69 67 68 74 28 73 74 72 75  itMoveRight(stru
5510: 63 74 20 6c 69 6e 65 6e 6f 69 73 65 53 74 61 74  ct linenoiseStat
5520: 65 20 2a 6c 29 20 7b 0a 20 20 20 20 69 66 20 28  e *l) {.    if (
5530: 6c 2d 3e 70 6f 73 20 21 3d 20 6c 2d 3e 6c 65 6e  l->pos != l->len
5540: 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 2d 3e 70  ) {.        l->p
5550: 6f 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65  os++;.        re
5560: 66 72 65 73 68 4c 69 6e 65 28 6c 29 3b 0a 20 20  freshLine(l);.  
5570: 20 20 7d 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 63    }.}../* Move c
5580: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61  ursor to the sta
5590: 72 74 20 6f 66 20 74 68 65 20 6c 69 6e 65 2e 20  rt of the line. 
55a0: 2a 2f 0a 76 6f 69 64 20 6c 69 6e 65 6e 6f 69 73  */.void linenois
55b0: 65 45 64 69 74 4d 6f 76 65 48 6f 6d 65 28 73 74  eEditMoveHome(st
55c0: 72 75 63 74 20 6c 69 6e 65 6e 6f 69 73 65 53 74  ruct linenoiseSt
55d0: 61 74 65 20 2a 6c 29 20 7b 0a 20 20 20 20 69 66  ate *l) {.    if
55e0: 20 28 6c 2d 3e 70 6f 73 20 21 3d 20 30 29 20 7b   (l->pos != 0) {
55f0: 0a 20 20 20 20 20 20 20 20 6c 2d 3e 70 6f 73 20  .        l->pos 
5600: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 66  = 0;.        ref
5610: 72 65 73 68 4c 69 6e 65 28 6c 29 3b 0a 20 20 20  reshLine(l);.   
5620: 20 7d 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 63 75   }.}../* Move cu
5630: 72 73 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  rsor to the end 
5640: 6f 66 20 74 68 65 20 6c 69 6e 65 2e 20 2a 2f 0a  of the line. */.
5650: 76 6f 69 64 20 6c 69 6e 65 6e 6f 69 73 65 45 64  void linenoiseEd
5660: 69 74 4d 6f 76 65 45 6e 64 28 73 74 72 75 63 74  itMoveEnd(struct
5670: 20 6c 69 6e 65 6e 6f 69 73 65 53 74 61 74 65 20   linenoiseState 
5680: 2a 6c 29 20 7b 0a 20 20 20 20 69 66 20 28 6c 2d  *l) {.    if (l-
5690: 3e 70 6f 73 20 21 3d 20 6c 2d 3e 6c 65 6e 29 20  >pos != l->len) 
56a0: 7b 0a 20 20 20 20 20 20 20 20 6c 2d 3e 70 6f 73  {.        l->pos
56b0: 20 3d 20 6c 2d 3e 6c 65 6e 3b 0a 20 20 20 20 20   = l->len;.     
56c0: 20 20 20 72 65 66 72 65 73 68 4c 69 6e 65 28 6c     refreshLine(l
56d0: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 20 53  );.    }.}../* S
56e0: 75 62 73 74 69 74 75 74 65 20 74 68 65 20 63 75  ubstitute the cu
56f0: 72 72 65 6e 74 6c 79 20 65 64 69 74 65 64 20 6c  rrently edited l
5700: 69 6e 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  ine with the nex
5710: 74 20 6f 72 20 70 72 65 76 69 6f 75 73 20 68 69  t or previous hi
5720: 73 74 6f 72 79 0a 20 2a 20 65 6e 74 72 79 20 61  story. * entry a
5730: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 27  s specified by '
5740: 64 69 72 27 2e 20 2a 2f 0a 23 64 65 66 69 6e 65  dir'. */.#define
5750: 20 4c 49 4e 45 4e 4f 49 53 45 5f 48 49 53 54 4f   LINENOISE_HISTO
5760: 52 59 5f 4e 45 58 54 20 30 0a 23 64 65 66 69 6e  RY_NEXT 0.#defin
5770: 65 20 4c 49 4e 45 4e 4f 49 53 45 5f 48 49 53 54  e LINENOISE_HIST
5780: 4f 52 59 5f 50 52 45 56 20 31 0a 76 6f 69 64 20  ORY_PREV 1.void 
5790: 6c 69 6e 65 6e 6f 69 73 65 45 64 69 74 48 69 73  linenoiseEditHis
57a0: 74 6f 72 79 4e 65 78 74 28 73 74 72 75 63 74 20  toryNext(struct 
57b0: 6c 69 6e 65 6e 6f 69 73 65 53 74 61 74 65 20 2a  linenoiseState *
57c0: 6c 2c 20 69 6e 74 20 64 69 72 29 20 7b 0a 20 20  l, int dir) {.  
57d0: 20 20 69 66 20 28 68 69 73 74 6f 72 79 5f 6c 65    if (history_le
57e0: 6e 20 3e 20 31 29 20 7b 0a 20 20 20 20 20 20 20  n > 1) {.       
57f0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 63   /* Update the c
5800: 75 72 72 65 6e 74 20 68 69 73 74 6f 72 79 20 65  urrent history e
5810: 6e 74 72 79 20 62 65 66 6f 72 65 20 74 6f 0a 20  ntry before to. 
5820: 20 20 20 20 20 20 20 20 2a 20 6f 76 65 72 77 72          * overwr
5830: 69 74 65 20 69 74 20 77 69 74 68 20 74 68 65 20  ite it with the 
5840: 6e 65 78 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20  next one. */.   
5850: 20 20 20 20 20 66 72 65 65 28 68 69 73 74 6f 72       free(histor
5860: 79 5b 68 69 73 74 6f 72 79 5f 6c 65 6e 20 2d 20  y[history_len - 
5870: 31 20 2d 20 6c 2d 3e 68 69 73 74 6f 72 79 5f 69  1 - l->history_i
5880: 6e 64 65 78 5d 29 3b 0a 20 20 20 20 20 20 20 20  ndex]);.        
5890: 68 69 73 74 6f 72 79 5b 68 69 73 74 6f 72 79 5f  history[history_
58a0: 6c 65 6e 20 2d 20 31 20 2d 20 6c 2d 3e 68 69 73  len - 1 - l->his
58b0: 74 6f 72 79 5f 69 6e 64 65 78 5d 20 3d 20 73 74  tory_index] = st
58c0: 72 64 75 70 28 6c 2d 3e 62 75 66 29 3b 0a 20 20  rdup(l->buf);.  
58d0: 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 74 68        /* Show th
58e0: 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20  e new entry */. 
58f0: 20 20 20 20 20 20 20 6c 2d 3e 68 69 73 74 6f 72         l->histor
5900: 79 5f 69 6e 64 65 78 20 2b 3d 20 28 64 69 72 20  y_index += (dir 
5910: 3d 3d 20 4c 49 4e 45 4e 4f 49 53 45 5f 48 49 53  == LINENOISE_HIS
5920: 54 4f 52 59 5f 50 52 45 56 29 20 3f 20 31 20 3a  TORY_PREV) ? 1 :
5930: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 20   -1;.        if 
5940: 28 6c 2d 3e 68 69 73 74 6f 72 79 5f 69 6e 64 65  (l->history_inde
5950: 78 20 3c 20 30 29 20 7b 0a 20 20 20 20 20 20 20  x < 0) {.       
5960: 20 20 20 20 20 6c 2d 3e 68 69 73 74 6f 72 79 5f       l->history_
5970: 69 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  index = 0;.     
5980: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
5990: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66         } else if
59a0: 20 28 6c 2d 3e 68 69 73 74 6f 72 79 5f 69 6e 64   (l->history_ind
59b0: 65 78 20 3e 3d 20 68 69 73 74 6f 72 79 5f 6c 65  ex >= history_le
59c0: 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n) {.           
59d0: 20 6c 2d 3e 68 69 73 74 6f 72 79 5f 69 6e 64 65   l->history_inde
59e0: 78 20 3d 20 68 69 73 74 6f 72 79 5f 6c 65 6e 2d  x = history_len-
59f0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
5a00: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
5a10: 0a 20 20 20 20 20 20 20 20 73 74 72 6e 63 70 79  .        strncpy
5a20: 28 6c 2d 3e 62 75 66 2c 68 69 73 74 6f 72 79 5b  (l->buf,history[
5a30: 68 69 73 74 6f 72 79 5f 6c 65 6e 20 2d 20 31 20  history_len - 1 
5a40: 2d 20 6c 2d 3e 68 69 73 74 6f 72 79 5f 69 6e 64  - l->history_ind
5a50: 65 78 5d 2c 6c 2d 3e 62 75 66 6c 65 6e 29 3b 0a  ex],l->buflen);.
5a60: 20 20 20 20 20 20 20 20 6c 2d 3e 62 75 66 5b 6c          l->buf[l
5a70: 2d 3e 62 75 66 6c 65 6e 2d 31 5d 20 3d 20 27 5c  ->buflen-1] = '\
5a80: 30 27 3b 0a 20 20 20 20 20 20 20 20 6c 2d 3e 6c  0';.        l->l
5a90: 65 6e 20 3d 20 6c 2d 3e 70 6f 73 20 3d 20 73 74  en = l->pos = st
5aa0: 72 6c 65 6e 28 6c 2d 3e 62 75 66 29 3b 0a 20 20  rlen(l->buf);.  
5ab0: 20 20 20 20 20 20 72 65 66 72 65 73 68 4c 69 6e        refreshLin
5ac0: 65 28 6c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f  e(l);.    }.}../
5ad0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 63 68 61  * Delete the cha
5ae0: 72 61 63 74 65 72 20 61 74 20 74 68 65 20 72 69  racter at the ri
5af0: 67 68 74 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ght of the curso
5b00: 72 20 77 69 74 68 6f 75 74 20 61 6c 74 65 72 69  r without alteri
5b10: 6e 67 20 74 68 65 20 63 75 72 73 6f 72 0a 20 2a  ng the cursor. *
5b20: 20 70 6f 73 69 74 69 6f 6e 2e 20 42 61 73 69 63   position. Basic
5b30: 61 6c 6c 79 20 74 68 69 73 20 69 73 20 77 68 61  ally this is wha
5b40: 74 20 68 61 70 70 65 6e 73 20 77 69 74 68 20 74  t happens with t
5b50: 68 65 20 22 44 65 6c 65 74 65 22 20 6b 65 79 62  he "Delete" keyb
5b60: 6f 61 72 64 20 6b 65 79 2e 20 2a 2f 0a 76 6f 69  oard key. */.voi
5b70: 64 20 6c 69 6e 65 6e 6f 69 73 65 45 64 69 74 44  d linenoiseEditD
5b80: 65 6c 65 74 65 28 73 74 72 75 63 74 20 6c 69 6e  elete(struct lin
5b90: 65 6e 6f 69 73 65 53 74 61 74 65 20 2a 6c 29 20  enoiseState *l) 
5ba0: 7b 0a 20 20 20 20 69 66 20 28 6c 2d 3e 6c 65 6e  {.    if (l->len
5bb0: 20 3e 20 30 20 26 26 20 6c 2d 3e 70 6f 73 20 3c   > 0 && l->pos <
5bc0: 20 6c 2d 3e 6c 65 6e 29 20 7b 0a 20 20 20 20 20   l->len) {.     
5bd0: 20 20 20 6d 65 6d 6d 6f 76 65 28 6c 2d 3e 62 75     memmove(l->bu
5be0: 66 2b 6c 2d 3e 70 6f 73 2c 6c 2d 3e 62 75 66 2b  f+l->pos,l->buf+
5bf0: 6c 2d 3e 70 6f 73 2b 31 2c 6c 2d 3e 6c 65 6e 2d  l->pos+1,l->len-
5c00: 6c 2d 3e 70 6f 73 2d 31 29 3b 0a 20 20 20 20 20  l->pos-1);.     
5c10: 20 20 20 6c 2d 3e 6c 65 6e 2d 2d 3b 0a 20 20 20     l->len--;.   
5c20: 20 20 20 20 20 6c 2d 3e 62 75 66 5b 6c 2d 3e 6c       l->buf[l->l
5c30: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  en] = '\0';.    
5c40: 20 20 20 20 72 65 66 72 65 73 68 4c 69 6e 65 28      refreshLine(
5c50: 6c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 20  l);.    }.}../* 
5c60: 42 61 63 6b 73 70 61 63 65 20 69 6d 70 6c 65 6d  Backspace implem
5c70: 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 76 6f 69  entation. */.voi
5c80: 64 20 6c 69 6e 65 6e 6f 69 73 65 45 64 69 74 42  d linenoiseEditB
5c90: 61 63 6b 73 70 61 63 65 28 73 74 72 75 63 74 20  ackspace(struct 
5ca0: 6c 69 6e 65 6e 6f 69 73 65 53 74 61 74 65 20 2a  linenoiseState *
5cb0: 6c 29 20 7b 0a 20 20 20 20 69 66 20 28 6c 2d 3e  l) {.    if (l->
5cc0: 70 6f 73 20 3e 20 30 20 26 26 20 6c 2d 3e 6c 65  pos > 0 && l->le
5cd0: 6e 20 3e 20 30 29 20 7b 0a 20 20 20 20 20 20 20  n > 0) {.       
5ce0: 20 6d 65 6d 6d 6f 76 65 28 6c 2d 3e 62 75 66 2b   memmove(l->buf+
5cf0: 6c 2d 3e 70 6f 73 2d 31 2c 6c 2d 3e 62 75 66 2b  l->pos-1,l->buf+
5d00: 6c 2d 3e 70 6f 73 2c 6c 2d 3e 6c 65 6e 2d 6c 2d  l->pos,l->len-l-
5d10: 3e 70 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 6c  >pos);.        l
5d20: 2d 3e 70 6f 73 2d 2d 3b 0a 20 20 20 20 20 20 20  ->pos--;.       
5d30: 20 6c 2d 3e 6c 65 6e 2d 2d 3b 0a 20 20 20 20 20   l->len--;.     
5d40: 20 20 20 6c 2d 3e 62 75 66 5b 6c 2d 3e 6c 65 6e     l->buf[l->len
5d50: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
5d60: 20 20 72 65 66 72 65 73 68 4c 69 6e 65 28 6c 29    refreshLine(l)
5d70: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65  ;.    }.}../* De
5d80: 6c 65 74 65 20 74 68 65 20 70 72 65 76 69 6f 73  lete the previos
5d90: 75 20 77 6f 72 64 2c 20 6d 61 69 6e 74 61 69 6e  u word, maintain
5da0: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 61  ing the cursor a
5db0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
5dc0: 68 65 0a 20 2a 20 63 75 72 72 65 6e 74 20 77 6f  he. * current wo
5dd0: 72 64 2e 20 2a 2f 0a 76 6f 69 64 20 6c 69 6e 65  rd. */.void line
5de0: 6e 6f 69 73 65 45 64 69 74 44 65 6c 65 74 65 50  noiseEditDeleteP
5df0: 72 65 76 57 6f 72 64 28 73 74 72 75 63 74 20 6c  revWord(struct l
5e00: 69 6e 65 6e 6f 69 73 65 53 74 61 74 65 20 2a 6c  inenoiseState *l
5e10: 29 20 7b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6f  ) {.    size_t o
5e20: 6c 64 5f 70 6f 73 20 3d 20 6c 2d 3e 70 6f 73 3b  ld_pos = l->pos;
5e30: 0a 20 20 20 20 73 69 7a 65 5f 74 20 64 69 66 66  .    size_t diff
5e40: 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 6c 2d  ;..    while (l-
5e50: 3e 70 6f 73 20 3e 20 30 20 26 26 20 6c 2d 3e 62  >pos > 0 && l->b
5e60: 75 66 5b 6c 2d 3e 70 6f 73 2d 31 5d 20 3d 3d 20  uf[l->pos-1] == 
5e70: 27 20 27 29 0a 20 20 20 20 20 20 20 20 6c 2d 3e  ' ').        l->
5e80: 70 6f 73 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65  pos--;.    while
5e90: 20 28 6c 2d 3e 70 6f 73 20 3e 20 30 20 26 26 20   (l->pos > 0 && 
5ea0: 6c 2d 3e 62 75 66 5b 6c 2d 3e 70 6f 73 2d 31 5d  l->buf[l->pos-1]
5eb0: 20 21 3d 20 27 20 27 29 0a 20 20 20 20 20 20 20   != ' ').       
5ec0: 20 6c 2d 3e 70 6f 73 2d 2d 3b 0a 20 20 20 20 64   l->pos--;.    d
5ed0: 69 66 66 20 3d 20 6f 6c 64 5f 70 6f 73 20 2d 20  iff = old_pos - 
5ee0: 6c 2d 3e 70 6f 73 3b 0a 20 20 20 20 6d 65 6d 6d  l->pos;.    memm
5ef0: 6f 76 65 28 6c 2d 3e 62 75 66 2b 6c 2d 3e 70 6f  ove(l->buf+l->po
5f00: 73 2c 6c 2d 3e 62 75 66 2b 6f 6c 64 5f 70 6f 73  s,l->buf+old_pos
5f10: 2c 6c 2d 3e 6c 65 6e 2d 6f 6c 64 5f 70 6f 73 2b  ,l->len-old_pos+
5f20: 31 29 3b 0a 20 20 20 20 6c 2d 3e 6c 65 6e 20 2d  1);.    l->len -
5f30: 3d 20 64 69 66 66 3b 0a 20 20 20 20 72 65 66 72  = diff;.    refr
5f40: 65 73 68 4c 69 6e 65 28 6c 29 3b 0a 7d 0a 0a 2f  eshLine(l);.}../
5f50: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5f60: 69 73 20 74 68 65 20 63 6f 72 65 20 6f 66 20 74  is the core of t
5f70: 68 65 20 6c 69 6e 65 20 65 64 69 74 69 6e 67 20  he line editing 
5f80: 63 61 70 61 62 69 6c 69 74 79 20 6f 66 20 6c 69  capability of li
5f90: 6e 65 6e 6f 69 73 65 2e 0a 20 2a 20 49 74 20 65  nenoise.. * It e
5fa0: 78 70 65 63 74 73 20 27 66 64 27 20 74 6f 20 62  xpects 'fd' to b
5fb0: 65 20 61 6c 72 65 61 64 79 20 69 6e 20 22 72 61  e already in "ra
5fc0: 77 20 6d 6f 64 65 22 20 73 6f 20 74 68 61 74 20  w mode" so that 
5fd0: 65 76 65 72 79 20 6b 65 79 20 70 72 65 73 73 65  every key presse
5fe0: 64 0a 20 2a 20 77 69 6c 6c 20 62 65 20 72 65 74  d. * will be ret
5ff0: 75 72 6e 65 64 20 41 53 41 50 20 74 6f 20 72 65  urned ASAP to re
6000: 61 64 28 29 2e 0a 20 2a 0a 20 2a 20 54 68 65 20  ad().. *. * The 
6010: 72 65 73 75 6c 74 69 6e 67 20 73 74 72 69 6e 67  resulting string
6020: 20 69 73 20 70 75 74 20 69 6e 74 6f 20 27 62 75   is put into 'bu
6030: 66 27 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  f' when the user
6040: 20 74 79 70 65 20 65 6e 74 65 72 2c 20 6f 72 0a   type enter, or.
6050: 20 2a 20 77 68 65 6e 20 63 74 72 6c 2b 64 20 69   * when ctrl+d i
6060: 73 20 74 79 70 65 64 2e 0a 20 2a 0a 20 2a 20 54  s typed.. *. * T
6070: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
6080: 72 6e 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  rns the length o
6090: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75  f the current bu
60a0: 66 66 65 72 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ffer. */.static 
60b0: 69 6e 74 20 6c 69 6e 65 6e 6f 69 73 65 45 64 69  int linenoiseEdi
60c0: 74 28 69 6e 74 20 73 74 64 69 6e 5f 66 64 2c 20  t(int stdin_fd, 
60d0: 69 6e 74 20 73 74 64 6f 75 74 5f 66 64 2c 20 63  int stdout_fd, c
60e0: 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74  har *buf, size_t
60f0: 20 62 75 66 6c 65 6e 2c 20 63 6f 6e 73 74 20 63   buflen, const c
6100: 68 61 72 20 2a 70 72 6f 6d 70 74 29 0a 7b 0a 20  har *prompt).{. 
6110: 20 20 20 73 74 72 75 63 74 20 6c 69 6e 65 6e 6f     struct lineno
6120: 69 73 65 53 74 61 74 65 20 6c 3b 0a 0a 20 20 20  iseState l;..   
6130: 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
6140: 20 6c 69 6e 65 6e 6f 69 73 65 20 73 74 61 74 65   linenoise state
6150: 20 74 68 61 74 20 77 65 20 70 61 73 73 20 74 6f   that we pass to
6160: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6d 70 6c 65   functions imple
6170: 6d 65 6e 74 69 6e 67 0a 20 20 20 20 20 2a 20 73  menting.     * s
6180: 70 65 63 69 66 69 63 20 65 64 69 74 69 6e 67 20  pecific editing 
6190: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 69 65 73 2e  functionalities.
61a0: 20 2a 2f 0a 20 20 20 20 6c 2e 69 66 64 20 3d 20   */.    l.ifd = 
61b0: 73 74 64 69 6e 5f 66 64 3b 0a 20 20 20 20 6c 2e  stdin_fd;.    l.
61c0: 6f 66 64 20 3d 20 73 74 64 6f 75 74 5f 66 64 3b  ofd = stdout_fd;
61d0: 0a 20 20 20 20 6c 2e 62 75 66 20 3d 20 62 75 66  .    l.buf = buf
61e0: 3b 0a 20 20 20 20 6c 2e 62 75 66 6c 65 6e 20 3d  ;.    l.buflen =
61f0: 20 62 75 66 6c 65 6e 3b 0a 20 20 20 20 6c 2e 70   buflen;.    l.p
6200: 72 6f 6d 70 74 20 3d 20 70 72 6f 6d 70 74 3b 0a  rompt = prompt;.
6210: 20 20 20 20 6c 2e 70 6c 65 6e 20 3d 20 73 74 72      l.plen = str
6220: 6c 65 6e 28 70 72 6f 6d 70 74 29 3b 0a 20 20 20  len(prompt);.   
6230: 20 6c 2e 6f 6c 64 70 6f 73 20 3d 20 6c 2e 70 6f   l.oldpos = l.po
6240: 73 20 3d 20 30 3b 0a 20 20 20 20 6c 2e 6c 65 6e  s = 0;.    l.len
6250: 20 3d 20 30 3b 0a 20 20 20 20 6c 2e 63 6f 6c 73   = 0;.    l.cols
6260: 20 3d 20 67 65 74 43 6f 6c 75 6d 6e 73 28 73 74   = getColumns(st
6270: 64 69 6e 5f 66 64 2c 20 73 74 64 6f 75 74 5f 66  din_fd, stdout_f
6280: 64 29 3b 0a 20 20 20 20 6c 2e 6d 61 78 72 6f 77  d);.    l.maxrow
6290: 73 20 3d 20 30 3b 0a 20 20 20 20 6c 2e 68 69 73  s = 0;.    l.his
62a0: 74 6f 72 79 5f 69 6e 64 65 78 20 3d 20 30 3b 0a  tory_index = 0;.
62b0: 0a 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73  .    /* Buffer s
62c0: 74 61 72 74 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  tarts empty. */.
62d0: 20 20 20 20 6c 2e 62 75 66 5b 30 5d 20 3d 20 27      l.buf[0] = '
62e0: 5c 30 27 3b 0a 20 20 20 20 6c 2e 62 75 66 6c 65  \0';.    l.bufle
62f0: 6e 2d 2d 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  n--; /* Make sur
6300: 65 20 74 68 65 72 65 20 69 73 20 61 6c 77 61 79  e there is alway
6310: 73 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  s space for the 
6320: 6e 75 6c 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20  nulterm */..    
6330: 2f 2a 20 54 68 65 20 6c 61 74 65 73 74 20 68 69  /* The latest hi
6340: 73 74 6f 72 79 20 65 6e 74 72 79 20 69 73 20 61  story entry is a
6350: 6c 77 61 79 73 20 6f 75 72 20 63 75 72 72 65 6e  lways our curren
6360: 74 20 62 75 66 66 65 72 2c 20 74 68 61 74 0a 20  t buffer, that. 
6370: 20 20 20 20 2a 20 69 6e 69 74 69 61 6c 6c 79 20      * initially 
6380: 69 73 20 6a 75 73 74 20 61 6e 20 65 6d 70 74 79  is just an empty
6390: 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 20   string. */.    
63a0: 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79  linenoiseHistory
63b0: 41 64 64 28 22 22 29 3b 0a 0a 20 20 20 20 69 66  Add("");..    if
63c0: 20 28 77 72 69 74 65 28 6c 2e 6f 66 64 2c 70 72   (write(l.ofd,pr
63d0: 6f 6d 70 74 2c 6c 2e 70 6c 65 6e 29 20 3d 3d 20  ompt,l.plen) == 
63e0: 2d 31 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  -1) return -1;. 
63f0: 20 20 20 77 68 69 6c 65 28 31 29 20 7b 0a 20 20     while(1) {.  
6400: 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20        char c;.  
6410: 20 20 20 20 20 20 69 6e 74 20 6e 72 65 61 64 3b        int nread;
6420: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 73 65  .        char se
6430: 71 5b 33 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6e  q[3];..        n
6440: 72 65 61 64 20 3d 20 72 65 61 64 28 6c 2e 69 66  read = read(l.if
6450: 64 2c 26 63 2c 31 29 3b 0a 20 20 20 20 20 20 20  d,&c,1);.       
6460: 20 69 66 20 28 6e 72 65 61 64 20 3c 3d 20 30 29   if (nread <= 0)
6470: 20 72 65 74 75 72 6e 20 6c 2e 6c 65 6e 3b 0a 0a   return l.len;..
6480: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
6490: 61 75 74 6f 63 6f 6d 70 6c 65 74 65 20 77 68 65  autocomplete whe
64a0: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69  n the callback i
64b0: 73 20 73 65 74 2e 20 49 74 20 72 65 74 75 72 6e  s set. It return
64c0: 73 20 3c 20 30 20 77 68 65 6e 0a 20 20 20 20 20  s < 0 when.     
64d0: 20 20 20 20 2a 20 74 68 65 72 65 20 77 61 73 20      * there was 
64e0: 61 6e 20 65 72 72 6f 72 20 72 65 61 64 69 6e 67  an error reading
64f0: 20 66 72 6f 6d 20 66 64 2e 20 4f 74 68 65 72 77   from fd. Otherw
6500: 69 73 65 20 69 74 20 77 69 6c 6c 20 72 65 74 75  ise it will retu
6510: 72 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  rn the.         
6520: 2a 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74  * character that
6530: 20 73 68 6f 75 6c 64 20 62 65 20 68 61 6e 64 6c   should be handl
6540: 65 64 20 6e 65 78 74 2e 20 2a 2f 0a 20 20 20 20  ed next. */.    
6550: 20 20 20 20 69 66 20 28 63 20 3d 3d 20 39 20 26      if (c == 9 &
6560: 26 20 63 6f 6d 70 6c 65 74 69 6f 6e 43 61 6c 6c  & completionCall
6570: 62 61 63 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  back != NULL) {.
6580: 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20              c = 
6590: 63 6f 6d 70 6c 65 74 65 4c 69 6e 65 28 26 6c 29  completeLine(&l)
65a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;.            /*
65b0: 20 52 65 74 75 72 6e 20 6f 6e 20 65 72 72 6f 72   Return on error
65c0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
65d0: 20 69 66 20 28 63 20 3c 20 30 29 20 72 65 74 75   if (c < 0) retu
65e0: 72 6e 20 6c 2e 6c 65 6e 3b 0a 20 20 20 20 20 20  rn l.len;.      
65f0: 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 6e 65        /* Read ne
6600: 78 74 20 63 68 61 72 61 63 74 65 72 20 77 68 65  xt character whe
6610: 6e 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  n 0 */.         
6620: 20 20 20 69 66 20 28 63 20 3d 3d 20 30 29 20 63     if (c == 0) c
6630: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
6640: 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 77 69 74   }..        swit
6650: 63 68 28 63 29 20 7b 0a 20 20 20 20 20 20 20 20  ch(c) {.        
6660: 63 61 73 65 20 45 4e 54 45 52 3a 20 20 20 20 2f  case ENTER:    /
6670: 2a 20 65 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  * enter */.     
6680: 20 20 20 20 20 20 20 68 69 73 74 6f 72 79 5f 6c         history_l
6690: 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  en--;.          
66a0: 20 20 66 72 65 65 28 68 69 73 74 6f 72 79 5b 68    free(history[h
66b0: 69 73 74 6f 72 79 5f 6c 65 6e 5d 29 3b 0a 20 20  istory_len]);.  
66c0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6d 6c            if (ml
66d0: 6d 6f 64 65 29 20 6c 69 6e 65 6e 6f 69 73 65 45  mode) linenoiseE
66e0: 64 69 74 4d 6f 76 65 45 6e 64 28 26 6c 29 3b 0a  ditMoveEnd(&l);.
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
6700: 68 69 6e 74 73 43 61 6c 6c 62 61 63 6b 29 20 7b  hintsCallback) {
6710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6720: 20 2f 2a 20 46 6f 72 63 65 20 61 20 72 65 66 72   /* Force a refr
6730: 65 73 68 20 77 69 74 68 6f 75 74 20 68 69 6e 74  esh without hint
6740: 73 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 70  s to leave the p
6750: 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
6760: 20 20 20 20 20 20 20 20 20 2a 20 6c 69 6e 65 20           * line 
6770: 61 73 20 74 68 65 20 75 73 65 72 20 74 79 70 65  as the user type
6780: 64 20 69 74 20 61 66 74 65 72 20 61 20 6e 65 77  d it after a new
6790: 6c 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  line. */.       
67a0: 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 69           linenoi
67b0: 73 65 48 69 6e 74 73 43 61 6c 6c 62 61 63 6b 20  seHintsCallback 
67c0: 2a 68 63 20 3d 20 68 69 6e 74 73 43 61 6c 6c 62  *hc = hintsCallb
67d0: 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ack;.           
67e0: 20 20 20 20 20 68 69 6e 74 73 43 61 6c 6c 62 61       hintsCallba
67f0: 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  ck = NULL;.     
6800: 20 20 20 20 20 20 20 20 20 20 20 72 65 66 72 65             refre
6810: 73 68 4c 69 6e 65 28 26 6c 29 3b 0a 20 20 20 20  shLine(&l);.    
6820: 20 20 20 20 20 20 20 20 20 20 20 20 68 69 6e 74              hint
6830: 73 43 61 6c 6c 62 61 63 6b 20 3d 20 68 63 3b 0a  sCallback = hc;.
6840: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6850: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6860: 20 28 69 6e 74 29 6c 2e 6c 65 6e 3b 0a 20 20 20   (int)l.len;.   
6870: 20 20 20 20 20 63 61 73 65 20 43 54 52 4c 5f 43       case CTRL_C
6880: 3a 20 20 20 20 20 2f 2a 20 63 74 72 6c 2d 63 20  :     /* ctrl-c 
6890: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  */.            e
68a0: 72 72 6e 6f 20 3d 20 45 41 47 41 49 4e 3b 0a 20  rrno = EAGAIN;. 
68b0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
68c0: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 63 61  n -1;.        ca
68d0: 73 65 20 42 41 43 4b 53 50 41 43 45 3a 20 20 20  se BACKSPACE:   
68e0: 2f 2a 20 62 61 63 6b 73 70 61 63 65 20 2a 2f 0a  /* backspace */.
68f0: 20 20 20 20 20 20 20 20 63 61 73 65 20 38 3a 20          case 8: 
6900: 20 20 20 20 2f 2a 20 63 74 72 6c 2d 68 20 2a 2f      /* ctrl-h */
6910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e  .            lin
6920: 65 6e 6f 69 73 65 45 64 69 74 42 61 63 6b 73 70  enoiseEditBacksp
6930: 61 63 65 28 26 6c 29 3b 0a 20 20 20 20 20 20 20  ace(&l);.       
6940: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6950: 20 20 20 20 63 61 73 65 20 43 54 52 4c 5f 44 3a      case CTRL_D:
6960: 20 20 20 20 20 2f 2a 20 63 74 72 6c 2d 64 2c 20       /* ctrl-d, 
6970: 72 65 6d 6f 76 65 20 63 68 61 72 20 61 74 20 72  remove char at r
6980: 69 67 68 74 20 6f 66 20 63 75 72 73 6f 72 2c 20  ight of cursor, 
6990: 6f 72 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  or if the.      
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69b0: 20 20 20 20 20 20 6c 69 6e 65 20 69 73 20 65 6d        line is em
69c0: 70 74 79 2c 20 61 63 74 20 61 73 20 65 6e 64 2d  pty, act as end-
69d0: 6f 66 2d 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  of-file. */.    
69e0: 20 20 20 20 20 20 20 20 69 66 20 28 6c 2e 6c 65          if (l.le
69f0: 6e 20 3e 20 30 29 20 7b 0a 20 20 20 20 20 20 20  n > 0) {.       
6a00: 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 69           linenoi
6a10: 73 65 45 64 69 74 44 65 6c 65 74 65 28 26 6c 29  seEditDelete(&l)
6a20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ;.            } 
6a30: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
6a40: 20 20 20 20 20 20 20 68 69 73 74 6f 72 79 5f 6c         history_l
6a50: 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  en--;.          
6a60: 20 20 20 20 20 20 66 72 65 65 28 68 69 73 74 6f        free(histo
6a70: 72 79 5b 68 69 73 74 6f 72 79 5f 6c 65 6e 5d 29  ry[history_len])
6a80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6a90: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
6aa0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6ab0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6ac0: 20 20 20 20 20 20 63 61 73 65 20 43 54 52 4c 5f        case CTRL_
6ad0: 54 3a 20 20 20 20 2f 2a 20 63 74 72 6c 2d 74 2c  T:    /* ctrl-t,
6ae0: 20 73 77 61 70 73 20 63 75 72 72 65 6e 74 20 63   swaps current c
6af0: 68 61 72 61 63 74 65 72 20 77 69 74 68 20 70 72  haracter with pr
6b00: 65 76 69 6f 75 73 2e 20 2a 2f 0a 20 20 20 20 20  evious. */.     
6b10: 20 20 20 20 20 20 20 69 66 20 28 6c 2e 70 6f 73         if (l.pos
6b20: 20 3e 20 30 20 26 26 20 6c 2e 70 6f 73 20 3c 20   > 0 && l.pos < 
6b30: 6c 2e 6c 65 6e 29 20 7b 0a 20 20 20 20 20 20 20  l.len) {.       
6b40: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 75 78           int aux
6b50: 20 3d 20 62 75 66 5b 6c 2e 70 6f 73 2d 31 5d 3b   = buf[l.pos-1];
6b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6b70: 20 62 75 66 5b 6c 2e 70 6f 73 2d 31 5d 20 3d 20   buf[l.pos-1] = 
6b80: 62 75 66 5b 6c 2e 70 6f 73 5d 3b 0a 20 20 20 20  buf[l.pos];.    
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66 5b              buf[
6ba0: 6c 2e 70 6f 73 5d 20 3d 20 61 75 78 3b 0a 20 20  l.pos] = aux;.  
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
6bc0: 20 28 6c 2e 70 6f 73 20 21 3d 20 6c 2e 6c 65 6e   (l.pos != l.len
6bd0: 2d 31 29 20 6c 2e 70 6f 73 2b 2b 3b 0a 20 20 20  -1) l.pos++;.   
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66               ref
6bf0: 72 65 73 68 4c 69 6e 65 28 26 6c 29 3b 0a 20 20  reshLine(&l);.  
6c00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6c10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6c20: 20 20 20 20 20 20 20 63 61 73 65 20 43 54 52 4c         case CTRL
6c30: 5f 42 3a 20 20 20 20 20 2f 2a 20 63 74 72 6c 2d  _B:     /* ctrl-
6c40: 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  b */.           
6c50: 20 6c 69 6e 65 6e 6f 69 73 65 45 64 69 74 4d 6f   linenoiseEditMo
6c60: 76 65 4c 65 66 74 28 26 6c 29 3b 0a 20 20 20 20  veLeft(&l);.    
6c70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6c80: 20 20 20 20 20 20 20 63 61 73 65 20 43 54 52 4c         case CTRL
6c90: 5f 46 3a 20 20 20 20 20 2f 2a 20 63 74 72 6c 2d  _F:     /* ctrl-
6ca0: 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  f */.           
6cb0: 20 6c 69 6e 65 6e 6f 69 73 65 45 64 69 74 4d 6f   linenoiseEditMo
6cc0: 76 65 52 69 67 68 74 28 26 6c 29 3b 0a 20 20 20  veRight(&l);.   
6cd0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6ce0: 20 20 20 20 20 20 20 20 63 61 73 65 20 43 54 52          case CTR
6cf0: 4c 5f 50 3a 20 20 20 20 2f 2a 20 63 74 72 6c 2d  L_P:    /* ctrl-
6d00: 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  p */.           
6d10: 20 6c 69 6e 65 6e 6f 69 73 65 45 64 69 74 48 69   linenoiseEditHi
6d20: 73 74 6f 72 79 4e 65 78 74 28 26 6c 2c 20 4c 49  storyNext(&l, LI
6d30: 4e 45 4e 4f 49 53 45 5f 48 49 53 54 4f 52 59 5f  NENOISE_HISTORY_
6d40: 50 52 45 56 29 3b 0a 20 20 20 20 20 20 20 20 20  PREV);.         
6d50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6d60: 20 20 63 61 73 65 20 43 54 52 4c 5f 4e 3a 20 20    case CTRL_N:  
6d70: 20 20 2f 2a 20 63 74 72 6c 2d 6e 20 2a 2f 0a 20    /* ctrl-n */. 
6d80: 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e             linen
6d90: 6f 69 73 65 45 64 69 74 48 69 73 74 6f 72 79 4e  oiseEditHistoryN
6da0: 65 78 74 28 26 6c 2c 20 4c 49 4e 45 4e 4f 49 53  ext(&l, LINENOIS
6db0: 45 5f 48 49 53 54 4f 52 59 5f 4e 45 58 54 29 3b  E_HISTORY_NEXT);
6dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
6dd0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
6de0: 20 45 53 43 3a 20 20 20 20 2f 2a 20 65 73 63 61   ESC:    /* esca
6df0: 70 65 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  pe sequence */. 
6e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
6e10: 61 64 20 74 68 65 20 6e 65 78 74 20 74 77 6f 20  ad the next two 
6e20: 62 79 74 65 73 20 72 65 70 72 65 73 65 6e 74 69  bytes representi
6e30: 6e 67 20 74 68 65 20 65 73 63 61 70 65 20 73 65  ng the escape se
6e40: 71 75 65 6e 63 65 2e 0a 20 20 20 20 20 20 20 20  quence..        
6e50: 20 20 20 20 20 2a 20 55 73 65 20 74 77 6f 20 63       * Use two c
6e60: 61 6c 6c 73 20 74 6f 20 68 61 6e 64 6c 65 20 73  alls to handle s
6e70: 6c 6f 77 20 74 65 72 6d 69 6e 61 6c 73 20 72 65  low terminals re
6e80: 74 75 72 6e 69 6e 67 20 74 68 65 20 74 77 6f 0a  turning the two.
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 63               * c
6ea0: 68 61 72 73 20 61 74 20 64 69 66 66 65 72 65 6e  hars at differen
6eb0: 74 20 74 69 6d 65 73 2e 20 2a 2f 0a 20 20 20 20  t times. */.    
6ec0: 20 20 20 20 20 20 20 20 69 66 20 28 72 65 61 64          if (read
6ed0: 28 6c 2e 69 66 64 2c 73 65 71 2c 31 29 20 3d 3d  (l.ifd,seq,1) ==
6ee0: 20 2d 31 29 20 62 72 65 61 6b 3b 0a 20 20 20 20   -1) break;.    
6ef0: 20 20 20 20 20 20 20 20 69 66 20 28 72 65 61 64          if (read
6f00: 28 6c 2e 69 66 64 2c 73 65 71 2b 31 2c 31 29 20  (l.ifd,seq+1,1) 
6f10: 3d 3d 20 2d 31 29 20 62 72 65 61 6b 3b 0a 0a 20  == -1) break;.. 
6f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 53             /* ES
6f30: 43 20 5b 20 73 65 71 75 65 6e 63 65 73 2e 20 2a  C [ sequences. *
6f40: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
6f50: 20 28 73 65 71 5b 30 5d 20 3d 3d 20 27 5b 27 29   (seq[0] == '[')
6f60: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
6f70: 20 20 20 69 66 20 28 73 65 71 5b 31 5d 20 3e 3d     if (seq[1] >=
6f80: 20 27 30 27 20 26 26 20 73 65 71 5b 31 5d 20 3c   '0' && seq[1] <
6f90: 3d 20 27 39 27 29 20 7b 0a 20 20 20 20 20 20 20  = '9') {.       
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6fb0: 45 78 74 65 6e 64 65 64 20 65 73 63 61 70 65 2c  Extended escape,
6fc0: 20 72 65 61 64 20 61 64 64 69 74 69 6f 6e 61 6c   read additional
6fd0: 20 62 79 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20   byte. */.      
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
6ff0: 20 28 72 65 61 64 28 6c 2e 69 66 64 2c 73 65 71   (read(l.ifd,seq
7000: 2b 32 2c 31 29 20 3d 3d 20 2d 31 29 20 62 72 65  +2,1) == -1) bre
7010: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
7020: 20 20 20 20 20 20 20 20 69 66 20 28 73 65 71 5b          if (seq[
7030: 32 5d 20 3d 3d 20 27 7e 27 29 20 7b 0a 20 20 20  2] == '~') {.   
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7050: 20 20 20 20 20 73 77 69 74 63 68 28 73 65 71 5b       switch(seq[
7060: 31 5d 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  1]) {.          
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
7080: 73 65 20 27 33 27 3a 20 2f 2a 20 44 65 6c 65 74  se '3': /* Delet
7090: 65 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 20 20  e key. */.      
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70b0: 20 20 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65 45        linenoiseE
70c0: 64 69 74 44 65 6c 65 74 65 28 26 6c 29 3b 0a 20  ditDelete(&l);. 
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70e0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
70f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7100: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7120: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
7130: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
7150: 77 69 74 63 68 28 73 65 71 5b 31 5d 29 20 7b 0a  witch(seq[1]) {.
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7170: 20 20 20 20 63 61 73 65 20 27 41 27 3a 20 2f 2a      case 'A': /*
7180: 20 55 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   Up */.         
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
71a0: 69 6e 65 6e 6f 69 73 65 45 64 69 74 48 69 73 74  inenoiseEditHist
71b0: 6f 72 79 4e 65 78 74 28 26 6c 2c 20 4c 49 4e 45  oryNext(&l, LINE
71c0: 4e 4f 49 53 45 5f 48 49 53 54 4f 52 59 5f 50 52  NOISE_HISTORY_PR
71d0: 45 56 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  EV);.           
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
71f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
7200: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 42 27          case 'B'
7210: 3a 20 2f 2a 20 44 6f 77 6e 20 2a 2f 0a 20 20 20  : /* Down */.   
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7230: 20 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65 45 64       linenoiseEd
7240: 69 74 48 69 73 74 6f 72 79 4e 65 78 74 28 26 6c  itHistoryNext(&l
7250: 2c 20 4c 49 4e 45 4e 4f 49 53 45 5f 48 49 53 54  , LINENOISE_HIST
7260: 4f 52 59 5f 4e 45 58 54 29 3b 0a 20 20 20 20 20  ORY_NEXT);.     
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
72a0: 73 65 20 27 43 27 3a 20 2f 2a 20 52 69 67 68 74  se 'C': /* Right
72b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
72d0: 6e 6f 69 73 65 45 64 69 74 4d 6f 76 65 52 69 67  noiseEditMoveRig
72e0: 68 74 28 26 6c 29 3b 0a 20 20 20 20 20 20 20 20  ht(&l);.        
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7300: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
7310: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
7320: 27 44 27 3a 20 2f 2a 20 4c 65 66 74 20 2a 2f 0a  'D': /* Left */.
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7340: 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 69 73          linenois
7350: 65 45 64 69 74 4d 6f 76 65 4c 65 66 74 28 26 6c  eEditMoveLeft(&l
7360: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7370: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
7380: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7390: 20 20 20 20 20 20 63 61 73 65 20 27 48 27 3a 20        case 'H': 
73a0: 2f 2a 20 48 6f 6d 65 20 2a 2f 0a 20 20 20 20 20  /* Home */.     
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73c0: 20 20 20 6c 69 6e 65 6e 6f 69 73 65 45 64 69 74     linenoiseEdit
73d0: 4d 6f 76 65 48 6f 6d 65 28 26 6c 29 3b 0a 20 20  MoveHome(&l);.  
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7410: 20 63 61 73 65 20 27 46 27 3a 20 2f 2a 20 45 6e   case 'F': /* En
7420: 64 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20  d*/.            
7430: 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
7440: 6e 6f 69 73 65 45 64 69 74 4d 6f 76 65 45 6e 64  noiseEditMoveEnd
7450: 28 26 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (&l);.          
7460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
7470: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
7480: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7490: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
74a0: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
74b0: 20 20 20 20 20 20 20 20 2f 2a 20 45 53 43 20 4f          /* ESC O
74c0: 20 73 65 71 75 65 6e 63 65 73 2e 20 2a 2f 0a 20   sequences. */. 
74d0: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
74e0: 69 66 20 28 73 65 71 5b 30 5d 20 3d 3d 20 27 4f  if (seq[0] == 'O
74f0: 27 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ') {.           
7500: 20 20 20 20 20 73 77 69 74 63 68 28 73 65 71 5b       switch(seq[
7510: 31 5d 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  1]) {.          
7520: 20 20 20 20 20 20 63 61 73 65 20 27 48 27 3a 20        case 'H': 
7530: 2f 2a 20 48 6f 6d 65 20 2a 2f 0a 20 20 20 20 20  /* Home */.     
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
7550: 69 6e 65 6e 6f 69 73 65 45 64 69 74 4d 6f 76 65  inenoiseEditMove
7560: 48 6f 6d 65 28 26 6c 29 3b 0a 20 20 20 20 20 20  Home(&l);.      
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
7580: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
7590: 20 20 20 20 20 63 61 73 65 20 27 46 27 3a 20 2f       case 'F': /
75a0: 2a 20 45 6e 64 2a 2f 0a 20 20 20 20 20 20 20 20  * End*/.        
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
75c0: 6e 6f 69 73 65 45 64 69 74 4d 6f 76 65 45 6e 64  noiseEditMoveEnd
75d0: 28 26 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (&l);.          
75e0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
75f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7600: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
7610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
7620: 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61  ak;.        defa
7630: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ult:.           
7640: 20 69 66 20 28 6c 69 6e 65 6e 6f 69 73 65 45 64   if (linenoiseEd
7650: 69 74 49 6e 73 65 72 74 28 26 6c 2c 63 29 29 20  itInsert(&l,c)) 
7660: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
7670: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7680: 20 20 20 20 20 20 63 61 73 65 20 43 54 52 4c 5f        case CTRL_
7690: 55 3a 20 2f 2a 20 43 74 72 6c 2b 75 2c 20 64 65  U: /* Ctrl+u, de
76a0: 6c 65 74 65 20 74 68 65 20 77 68 6f 6c 65 20 6c  lete the whole l
76b0: 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ine. */.        
76c0: 20 20 20 20 62 75 66 5b 30 5d 20 3d 20 27 5c 30      buf[0] = '\0
76d0: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ';.            l
76e0: 2e 70 6f 73 20 3d 20 6c 2e 6c 65 6e 20 3d 20 30  .pos = l.len = 0
76f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
7700: 66 72 65 73 68 4c 69 6e 65 28 26 6c 29 3b 0a 20  freshLine(&l);. 
7710: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
7720: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 43  ;.        case C
7730: 54 52 4c 5f 4b 3a 20 2f 2a 20 43 74 72 6c 2b 6b  TRL_K: /* Ctrl+k
7740: 2c 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 63 75  , delete from cu
7750: 72 72 65 6e 74 20 74 6f 20 65 6e 64 20 6f 66 20  rrent to end of 
7760: 6c 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  line. */.       
7770: 20 20 20 20 20 62 75 66 5b 6c 2e 70 6f 73 5d 20       buf[l.pos] 
7780: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
7790: 20 20 20 20 6c 2e 6c 65 6e 20 3d 20 6c 2e 70 6f      l.len = l.po
77a0: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  s;.            r
77b0: 65 66 72 65 73 68 4c 69 6e 65 28 26 6c 29 3b 0a  efreshLine(&l);.
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
77d0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
77e0: 43 54 52 4c 5f 41 3a 20 2f 2a 20 43 74 72 6c 2b  CTRL_A: /* Ctrl+
77f0: 61 2c 20 67 6f 20 74 6f 20 74 68 65 20 73 74 61  a, go to the sta
7800: 72 74 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 2a  rt of the line *
7810: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 69  /.            li
7820: 6e 65 6e 6f 69 73 65 45 64 69 74 4d 6f 76 65 48  nenoiseEditMoveH
7830: 6f 6d 65 28 26 6c 29 3b 0a 20 20 20 20 20 20 20  ome(&l);.       
7840: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7850: 20 20 20 20 63 61 73 65 20 43 54 52 4c 5f 45 3a      case CTRL_E:
7860: 20 2f 2a 20 63 74 72 6c 2b 65 2c 20 67 6f 20 74   /* ctrl+e, go t
7870: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
7880: 20 6c 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20   line */.       
7890: 20 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65 45 64       linenoiseEd
78a0: 69 74 4d 6f 76 65 45 6e 64 28 26 6c 29 3b 0a 20  itMoveEnd(&l);. 
78b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
78c0: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 43  ;.        case C
78d0: 54 52 4c 5f 4c 3a 20 2f 2a 20 63 74 72 6c 2b 6c  TRL_L: /* ctrl+l
78e0: 2c 20 63 6c 65 61 72 20 73 63 72 65 65 6e 20 2a  , clear screen *
78f0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 69  /.            li
7900: 6e 65 6e 6f 69 73 65 43 6c 65 61 72 53 63 72 65  nenoiseClearScre
7910: 65 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  en();.          
7920: 20 20 72 65 66 72 65 73 68 4c 69 6e 65 28 26 6c    refreshLine(&l
7930: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
7940: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
7950: 73 65 20 43 54 52 4c 5f 57 3a 20 2f 2a 20 63 74  se CTRL_W: /* ct
7960: 72 6c 2b 77 2c 20 64 65 6c 65 74 65 20 70 72 65  rl+w, delete pre
7970: 76 69 6f 75 73 20 77 6f 72 64 20 2a 2f 0a 20 20  vious word */.  
7980: 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f            lineno
7990: 69 73 65 45 64 69 74 44 65 6c 65 74 65 50 72 65  iseEditDeletePre
79a0: 76 57 6f 72 64 28 26 6c 29 3b 0a 20 20 20 20 20  vWord(&l);.     
79b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
79c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
79d0: 20 20 72 65 74 75 72 6e 20 6c 2e 6c 65 6e 3b 0a    return l.len;.
79e0: 7d 0a 0a 2f 2a 20 54 68 69 73 20 73 70 65 63 69  }../* This speci
79f0: 61 6c 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  al mode is used 
7a00: 62 79 20 6c 69 6e 65 6e 6f 69 73 65 20 69 6e 20  by linenoise in 
7a10: 6f 72 64 65 72 20 74 6f 20 70 72 69 6e 74 20 73  order to print s
7a20: 63 61 6e 20 63 6f 64 65 73 0a 20 2a 20 6f 6e 20  can codes. * on 
7a30: 73 63 72 65 65 6e 20 66 6f 72 20 64 65 62 75 67  screen for debug
7a40: 67 69 6e 67 20 2f 20 64 65 76 65 6c 6f 70 6d 65  ging / developme
7a50: 6e 74 20 70 75 72 70 6f 73 65 73 2e 20 49 74 20  nt purposes. It 
7a60: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 20  is implemented. 
7a70: 2a 20 62 79 20 74 68 65 20 6c 69 6e 65 6e 6f 69  * by the linenoi
7a80: 73 65 5f 65 78 61 6d 70 6c 65 20 70 72 6f 67 72  se_example progr
7a90: 61 6d 20 75 73 69 6e 67 20 74 68 65 20 2d 2d 6b  am using the --k
7aa0: 65 79 63 6f 64 65 73 20 6f 70 74 69 6f 6e 2e 20  eycodes option. 
7ab0: 2a 2f 0a 76 6f 69 64 20 6c 69 6e 65 6e 6f 69 73  */.void linenois
7ac0: 65 50 72 69 6e 74 4b 65 79 43 6f 64 65 73 28 76  ePrintKeyCodes(v
7ad0: 6f 69 64 29 20 7b 0a 20 20 20 20 63 68 61 72 20  oid) {.    char 
7ae0: 71 75 69 74 5b 34 5d 3b 0a 0a 20 20 20 20 70 72  quit[4];..    pr
7af0: 69 6e 74 66 28 22 4c 69 6e 65 6e 6f 69 73 65 20  intf("Linenoise 
7b00: 6b 65 79 20 63 6f 64 65 73 20 64 65 62 75 67 67  key codes debugg
7b10: 69 6e 67 20 6d 6f 64 65 2e 5c 6e 22 0a 20 20 20  ing mode.\n".   
7b20: 20 20 20 20 20 20 20 20 20 22 50 72 65 73 73 20           "Press 
7b30: 6b 65 79 73 20 74 6f 20 73 65 65 20 73 63 61 6e  keys to see scan
7b40: 20 63 6f 64 65 73 2e 20 54 79 70 65 20 27 71 75   codes. Type 'qu
7b50: 69 74 27 20 61 74 20 61 6e 79 20 74 69 6d 65 20  it' at any time 
7b60: 74 6f 20 65 78 69 74 2e 5c 6e 22 29 3b 0a 20 20  to exit.\n");.  
7b70: 20 20 69 66 20 28 65 6e 61 62 6c 65 52 61 77 4d    if (enableRawM
7b80: 6f 64 65 28 53 54 44 49 4e 5f 46 49 4c 45 4e 4f  ode(STDIN_FILENO
7b90: 29 20 3d 3d 20 2d 31 29 20 72 65 74 75 72 6e 3b  ) == -1) return;
7ba0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 71 75 69 74  .    memset(quit
7bb0: 2c 27 20 27 2c 34 29 3b 0a 20 20 20 20 77 68 69  ,' ',4);.    whi
7bc0: 6c 65 28 31 29 20 7b 0a 20 20 20 20 20 20 20 20  le(1) {.        
7bd0: 63 68 61 72 20 63 3b 0a 20 20 20 20 20 20 20 20  char c;.        
7be0: 69 6e 74 20 6e 72 65 61 64 3b 0a 0a 20 20 20 20  int nread;..    
7bf0: 20 20 20 20 6e 72 65 61 64 20 3d 20 72 65 61 64      nread = read
7c00: 28 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 2c 26 63  (STDIN_FILENO,&c
7c10: 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20  ,1);.        if 
7c20: 28 6e 72 65 61 64 20 3c 3d 20 30 29 20 63 6f 6e  (nread <= 0) con
7c30: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 6d  tinue;.        m
7c40: 65 6d 6d 6f 76 65 28 71 75 69 74 2c 71 75 69 74  emmove(quit,quit
7c50: 2b 31 2c 73 69 7a 65 6f 66 28 71 75 69 74 29 2d  +1,sizeof(quit)-
7c60: 31 29 3b 20 2f 2a 20 73 68 69 66 74 20 73 74 72  1); /* shift str
7c70: 69 6e 67 20 74 6f 20 6c 65 66 74 2e 20 2a 2f 0a  ing to left. */.
7c80: 20 20 20 20 20 20 20 20 71 75 69 74 5b 73 69 7a          quit[siz
7c90: 65 6f 66 28 71 75 69 74 29 2d 31 5d 20 3d 20 63  eof(quit)-1] = c
7ca0: 3b 20 2f 2a 20 49 6e 73 65 72 74 20 63 75 72 72  ; /* Insert curr
7cb0: 65 6e 74 20 63 68 61 72 20 6f 6e 20 74 68 65 20  ent char on the 
7cc0: 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
7cd0: 20 20 69 66 20 28 6d 65 6d 63 6d 70 28 71 75 69    if (memcmp(qui
7ce0: 74 2c 22 71 75 69 74 22 2c 73 69 7a 65 6f 66 28  t,"quit",sizeof(
7cf0: 71 75 69 74 29 29 20 3d 3d 20 30 29 20 62 72 65  quit)) == 0) bre
7d00: 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 70 72 69  ak;..        pri
7d10: 6e 74 66 28 22 27 25 63 27 20 25 30 32 78 20 28  ntf("'%c' %02x (
7d20: 25 64 29 20 28 74 79 70 65 20 71 75 69 74 20 74  %d) (type quit t
7d30: 6f 20 65 78 69 74 29 5c 6e 22 2c 0a 20 20 20 20  o exit)\n",.    
7d40: 20 20 20 20 20 20 20 20 69 73 70 72 69 6e 74 28          isprint(
7d50: 63 29 20 3f 20 63 20 3a 20 27 3f 27 2c 20 28 69  c) ? c : '?', (i
7d60: 6e 74 29 63 2c 20 28 69 6e 74 29 63 29 3b 0a 20  nt)c, (int)c);. 
7d70: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c         printf("\
7d80: 72 22 29 3b 20 2f 2a 20 47 6f 20 6c 65 66 74 20  r"); /* Go left 
7d90: 65 64 67 65 20 6d 61 6e 75 61 6c 6c 79 2c 20 77  edge manually, w
7da0: 65 20 61 72 65 20 69 6e 20 72 61 77 20 6d 6f 64  e are in raw mod
7db0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 66  e. */.        ff
7dc0: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
7dd0: 20 20 7d 0a 20 20 20 20 64 69 73 61 62 6c 65 52    }.    disableR
7de0: 61 77 4d 6f 64 65 28 53 54 44 49 4e 5f 46 49 4c  awMode(STDIN_FIL
7df0: 45 4e 4f 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73  ENO);.}../* This
7e00: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20   function calls 
7e10: 74 68 65 20 6c 69 6e 65 20 65 64 69 74 69 6e 67  the line editing
7e20: 20 66 75 6e 63 74 69 6f 6e 20 6c 69 6e 65 6e 6f   function lineno
7e30: 69 73 65 45 64 69 74 28 29 20 75 73 69 6e 67 0a  iseEdit() using.
7e40: 20 2a 20 74 68 65 20 53 54 44 49 4e 20 66 69 6c   * the STDIN fil
7e50: 65 20 64 65 73 63 72 69 70 74 6f 72 20 73 65 74  e descriptor set
7e60: 20 69 6e 20 72 61 77 20 6d 6f 64 65 2e 20 2a 2f   in raw mode. */
7e70: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 65  .static int line
7e80: 6e 6f 69 73 65 52 61 77 28 63 68 61 72 20 2a 62  noiseRaw(char *b
7e90: 75 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c 65  uf, size_t bufle
7ea0: 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  n, const char *p
7eb0: 72 6f 6d 70 74 29 20 7b 0a 20 20 20 20 69 6e 74  rompt) {.    int
7ec0: 20 63 6f 75 6e 74 3b 0a 0a 20 20 20 20 69 66 20   count;..    if 
7ed0: 28 62 75 66 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a  (buflen == 0) {.
7ee0: 20 20 20 20 20 20 20 20 65 72 72 6e 6f 20 3d 20          errno = 
7ef0: 45 49 4e 56 41 4c 3b 0a 20 20 20 20 20 20 20 20  EINVAL;.        
7f00: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
7f10: 0a 0a 20 20 20 20 69 66 20 28 65 6e 61 62 6c 65  ..    if (enable
7f20: 52 61 77 4d 6f 64 65 28 53 54 44 49 4e 5f 46 49  RawMode(STDIN_FI
7f30: 4c 45 4e 4f 29 20 3d 3d 20 2d 31 29 20 72 65 74  LENO) == -1) ret
7f40: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 63 6f 75 6e  urn -1;.    coun
7f50: 74 20 3d 20 6c 69 6e 65 6e 6f 69 73 65 45 64 69  t = linenoiseEdi
7f60: 74 28 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 2c 20  t(STDIN_FILENO, 
7f70: 53 54 44 4f 55 54 5f 46 49 4c 45 4e 4f 2c 20 62  STDOUT_FILENO, b
7f80: 75 66 2c 20 62 75 66 6c 65 6e 2c 20 70 72 6f 6d  uf, buflen, prom
7f90: 70 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65  pt);.    disable
7fa0: 52 61 77 4d 6f 64 65 28 53 54 44 49 4e 5f 46 49  RawMode(STDIN_FI
7fb0: 4c 45 4e 4f 29 3b 0a 20 20 20 20 70 72 69 6e 74  LENO);.    print
7fc0: 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74  f("\n");.    ret
7fd0: 75 72 6e 20 63 6f 75 6e 74 3b 0a 7d 0a 0a 2f 2a  urn count;.}../*
7fe0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7ff0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 6c 69  s called when li
8000: 6e 65 6e 6f 69 73 65 28 29 20 69 73 20 63 61 6c  nenoise() is cal
8010: 6c 65 64 20 77 69 74 68 20 74 68 65 20 73 74 61  led with the sta
8020: 6e 64 61 72 64 0a 20 2a 20 69 6e 70 75 74 20 66  ndard. * input f
8030: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6e  ile descriptor n
8040: 6f 74 20 61 74 74 61 63 68 65 64 20 74 6f 20 61  ot attached to a
8050: 20 54 54 59 2e 20 53 6f 20 66 6f 72 20 65 78 61   TTY. So for exa
8060: 6d 70 6c 65 20 77 68 65 6e 20 74 68 65 0a 20 2a  mple when the. *
8070: 20 70 72 6f 67 72 61 6d 20 75 73 69 6e 67 20 6c   program using l
8080: 69 6e 65 6e 6f 69 73 65 20 69 73 20 63 61 6c 6c  inenoise is call
8090: 65 64 20 69 6e 20 70 69 70 65 20 6f 72 20 77 69  ed in pipe or wi
80a0: 74 68 20 61 20 66 69 6c 65 20 72 65 64 69 72 65  th a file redire
80b0: 63 74 65 64 0a 20 2a 20 74 6f 20 69 74 73 20 73  cted. * to its s
80c0: 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2e 20 49  tandard input. I
80d0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 77 65 20  n this case, we 
80e0: 77 61 6e 74 20 74 6f 20 62 65 20 61 62 6c 65 20  want to be able 
80f0: 74 6f 20 72 65 74 75 72 6e 20 74 68 65 0a 20 2a  to return the. *
8100: 20 6c 69 6e 65 20 72 65 67 61 72 64 6c 65 73 73   line regardless
8110: 20 6f 66 20 69 74 73 20 6c 65 6e 67 74 68 20 28   of its length (
8120: 62 79 20 64 65 66 61 75 6c 74 20 77 65 20 61 72  by default we ar
8130: 65 20 6c 69 6d 69 74 65 64 20 74 6f 20 34 6b 29  e limited to 4k)
8140: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  . */.static char
8150: 20 2a 6c 69 6e 65 6e 6f 69 73 65 4e 6f 54 54 59   *linenoiseNoTTY
8160: 28 76 6f 69 64 29 20 7b 0a 20 20 20 20 63 68 61  (void) {.    cha
8170: 72 20 2a 6c 69 6e 65 20 3d 20 4e 55 4c 4c 3b 0a  r *line = NULL;.
8180: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 20 3d      size_t len =
8190: 20 30 2c 20 6d 61 78 6c 65 6e 20 3d 20 30 3b 0a   0, maxlen = 0;.
81a0: 0a 20 20 20 20 77 68 69 6c 65 28 31 29 20 7b 0a  .    while(1) {.
81b0: 20 20 20 20 20 20 20 20 69 66 20 28 6c 65 6e 20          if (len 
81c0: 3d 3d 20 6d 61 78 6c 65 6e 29 20 7b 0a 20 20 20  == maxlen) {.   
81d0: 20 20 20 20 20 20 20 20 20 69 66 20 28 6d 61 78           if (max
81e0: 6c 65 6e 20 3d 3d 20 30 29 20 6d 61 78 6c 65 6e  len == 0) maxlen
81f0: 20 3d 20 31 36 3b 0a 20 20 20 20 20 20 20 20 20   = 16;.         
8200: 20 20 20 6d 61 78 6c 65 6e 20 2a 3d 20 32 3b 0a     maxlen *= 2;.
8210: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
8220: 20 2a 6f 6c 64 76 61 6c 20 3d 20 6c 69 6e 65 3b   *oldval = line;
8230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e  .            lin
8240: 65 20 3d 20 72 65 61 6c 6c 6f 63 28 6c 69 6e 65  e = realloc(line
8250: 2c 6d 61 78 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ,maxlen);.      
8260: 20 20 20 20 20 20 69 66 20 28 6c 69 6e 65 20 3d        if (line =
8270: 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20  = NULL) {.      
8280: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6f 6c            if (ol
8290: 64 76 61 6c 29 20 66 72 65 65 28 6f 6c 64 76 61  dval) free(oldva
82a0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
82b0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
82c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
82d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
82e0: 20 69 6e 74 20 63 20 3d 20 66 67 65 74 63 28 73   int c = fgetc(s
82f0: 74 64 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  tdin);.        i
8300: 66 20 28 63 20 3d 3d 20 45 4f 46 20 7c 7c 20 63  f (c == EOF || c
8310: 20 3d 3d 20 27 5c 6e 27 29 20 7b 0a 20 20 20 20   == '\n') {.    
8320: 20 20 20 20 20 20 20 20 69 66 20 28 63 20 3d 3d          if (c ==
8330: 20 45 4f 46 20 26 26 20 6c 65 6e 20 3d 3d 20 30   EOF && len == 0
8340: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
8350: 20 20 20 20 66 72 65 65 28 6c 69 6e 65 29 3b 0a      free(line);.
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
8380: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
8390: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
83a0: 20 20 6c 69 6e 65 5b 6c 65 6e 5d 20 3d 20 27 5c    line[len] = '\
83b0: 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0';.            
83c0: 20 20 20 20 72 65 74 75 72 6e 20 6c 69 6e 65 3b      return line;
83d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
83e0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
8400: 5b 6c 65 6e 5d 20 3d 20 63 3b 0a 20 20 20 20 20  [len] = c;.     
8410: 20 20 20 20 20 20 20 6c 65 6e 2b 2b 3b 0a 20 20         len++;.  
8420: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a        }.    }.}.
8430: 0a 2f 2a 20 54 68 65 20 68 69 67 68 20 6c 65 76  ./* The high lev
8440: 65 6c 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  el function that
8450: 20 69 73 20 74 68 65 20 6d 61 69 6e 20 41 50 49   is the main API
8460: 20 6f 66 20 74 68 65 20 6c 69 6e 65 6e 6f 69 73   of the linenois
8470: 65 20 6c 69 62 72 61 72 79 2e 0a 20 2a 20 54 68  e library.. * Th
8480: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
8490: 6b 73 20 69 66 20 74 68 65 20 74 65 72 6d 69 6e  ks if the termin
84a0: 61 6c 20 68 61 73 20 62 61 73 69 63 20 63 61 70  al has basic cap
84b0: 61 62 69 6c 69 74 69 65 73 2c 20 6a 75 73 74 20  abilities, just 
84c0: 63 68 65 63 6b 69 6e 67 0a 20 2a 20 66 6f 72 20  checking. * for 
84d0: 61 20 62 6c 61 63 6b 6c 69 73 74 20 6f 66 20 73  a blacklist of s
84e0: 74 75 70 69 64 20 74 65 72 6d 69 6e 61 6c 73 2c  tupid terminals,
84f0: 20 61 6e 64 20 6c 61 74 65 72 20 65 69 74 68 65   and later eithe
8500: 72 20 63 61 6c 6c 73 20 74 68 65 20 6c 69 6e 65  r calls the line
8510: 0a 20 2a 20 65 64 69 74 69 6e 67 20 66 75 6e 63  . * editing func
8520: 74 69 6f 6e 20 6f 72 20 75 73 65 73 20 64 75 6d  tion or uses dum
8530: 6d 79 20 66 67 65 74 73 28 29 20 73 6f 20 74 68  my fgets() so th
8540: 61 74 20 79 6f 75 20 77 69 6c 6c 20 62 65 20 61  at you will be a
8550: 62 6c 65 20 74 6f 20 74 79 70 65 0a 20 2a 20 73  ble to type. * s
8560: 6f 6d 65 74 68 69 6e 67 20 65 76 65 6e 20 69 6e  omething even in
8570: 20 74 68 65 20 6d 6f 73 74 20 64 65 73 70 65 72   the most desper
8580: 61 74 65 20 6f 66 20 74 68 65 20 63 6f 6e 64 69  ate of the condi
8590: 74 69 6f 6e 73 2e 20 2a 2f 0a 63 68 61 72 20 2a  tions. */.char *
85a0: 6c 69 6e 65 6e 6f 69 73 65 28 63 6f 6e 73 74 20  linenoise(const 
85b0: 63 68 61 72 20 2a 70 72 6f 6d 70 74 29 20 7b 0a  char *prompt) {.
85c0: 20 20 20 20 63 68 61 72 20 62 75 66 5b 4c 49 4e      char buf[LIN
85d0: 45 4e 4f 49 53 45 5f 4d 41 58 5f 4c 49 4e 45 5d  ENOISE_MAX_LINE]
85e0: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 3b  ;.    int count;
85f0: 0a 0a 20 20 20 20 69 66 20 28 21 69 73 61 74 74  ..    if (!isatt
8600: 79 28 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 29 29  y(STDIN_FILENO))
8610: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f   {.        /* No
8620: 74 20 61 20 74 74 79 3a 20 72 65 61 64 20 66 72  t a tty: read fr
8630: 6f 6d 20 66 69 6c 65 20 2f 20 70 69 70 65 2e 20  om file / pipe. 
8640: 49 6e 20 74 68 69 73 20 6d 6f 64 65 20 77 65 20  In this mode we 
8650: 64 6f 6e 27 74 20 77 61 6e 74 20 61 6e 79 0a 20  don't want any. 
8660: 20 20 20 20 20 20 20 20 2a 20 6c 69 6d 69 74 20          * limit 
8670: 74 6f 20 74 68 65 20 6c 69 6e 65 20 73 69 7a 65  to the line size
8680: 2c 20 73 6f 20 77 65 20 63 61 6c 6c 20 61 20 66  , so we call a f
8690: 75 6e 63 74 69 6f 6e 20 74 6f 20 68 61 6e 64 6c  unction to handl
86a0: 65 20 74 68 61 74 2e 20 2a 2f 0a 20 20 20 20 20  e that. */.     
86b0: 20 20 20 72 65 74 75 72 6e 20 6c 69 6e 65 6e 6f     return lineno
86c0: 69 73 65 4e 6f 54 54 59 28 29 3b 0a 20 20 20 20  iseNoTTY();.    
86d0: 7d 20 65 6c 73 65 20 69 66 20 28 69 73 55 6e 73  } else if (isUns
86e0: 75 70 70 6f 72 74 65 64 54 65 72 6d 28 29 29 20  upportedTerm()) 
86f0: 7b 0a 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74  {.        size_t
8700: 20 6c 65 6e 3b 0a 0a 20 20 20 20 20 20 20 20 70   len;..        p
8710: 72 69 6e 74 66 28 22 25 73 22 2c 70 72 6f 6d 70  rintf("%s",promp
8720: 74 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75  t);.        fflu
8730: 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  sh(stdout);.    
8740: 20 20 20 20 69 66 20 28 66 67 65 74 73 28 62 75      if (fgets(bu
8750: 66 2c 4c 49 4e 45 4e 4f 49 53 45 5f 4d 41 58 5f  f,LINENOISE_MAX_
8760: 4c 49 4e 45 2c 73 74 64 69 6e 29 20 3d 3d 20 4e  LINE,stdin) == N
8770: 55 4c 4c 29 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ULL) return NULL
8780: 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20  ;.        len = 
8790: 73 74 72 6c 65 6e 28 62 75 66 29 3b 0a 20 20 20  strlen(buf);.   
87a0: 20 20 20 20 20 77 68 69 6c 65 28 6c 65 6e 20 26       while(len &
87b0: 26 20 28 62 75 66 5b 6c 65 6e 2d 31 5d 20 3d 3d  & (buf[len-1] ==
87c0: 20 27 5c 6e 27 20 7c 7c 20 62 75 66 5b 6c 65 6e   '\n' || buf[len
87d0: 2d 31 5d 20 3d 3d 20 27 5c 72 27 29 29 20 7b 0a  -1] == '\r')) {.
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e 2d              len-
87f0: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  -;.            b
8800: 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  uf[len] = '\0';.
8810: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8820: 20 20 72 65 74 75 72 6e 20 73 74 72 64 75 70 28    return strdup(
8830: 62 75 66 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  buf);.    } else
8840: 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 75 6e 74   {.        count
8850: 20 3d 20 6c 69 6e 65 6e 6f 69 73 65 52 61 77 28   = linenoiseRaw(
8860: 62 75 66 2c 4c 49 4e 45 4e 4f 49 53 45 5f 4d 41  buf,LINENOISE_MA
8870: 58 5f 4c 49 4e 45 2c 70 72 6f 6d 70 74 29 3b 0a  X_LINE,prompt);.
8880: 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 75 6e          if (coun
8890: 74 20 3d 3d 20 2d 31 29 20 72 65 74 75 72 6e 20  t == -1) return 
88a0: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 72 65  NULL;.        re
88b0: 74 75 72 6e 20 73 74 72 64 75 70 28 62 75 66 29  turn strdup(buf)
88c0: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 20 54 68  ;.    }.}../* Th
88d0: 69 73 20 69 73 20 6a 75 73 74 20 61 20 77 72 61  is is just a wra
88e0: 70 70 65 72 20 74 68 65 20 75 73 65 72 20 6d 61  pper the user ma
88f0: 79 20 77 61 6e 74 20 74 6f 20 63 61 6c 6c 20 69  y want to call i
8900: 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
8910: 73 75 72 65 0a 20 2a 20 74 68 65 20 6c 69 6e 65  sure. * the line
8920: 6e 6f 69 73 65 20 72 65 74 75 72 6e 65 64 20 62  noise returned b
8930: 75 66 66 65 72 20 69 73 20 66 72 65 65 64 20 77  uffer is freed w
8940: 69 74 68 20 74 68 65 20 73 61 6d 65 20 61 6c 6c  ith the same all
8950: 6f 63 61 74 6f 72 20 69 74 20 77 61 73 0a 20 2a  ocator it was. *
8960: 20 63 72 65 61 74 65 64 20 77 69 74 68 2e 20 55   created with. U
8970: 73 65 66 75 6c 20 77 68 65 6e 20 74 68 65 20 6d  seful when the m
8980: 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 75  ain program is u
8990: 73 69 6e 67 20 61 6e 20 61 6c 74 65 72 6e 61 74  sing an alternat
89a0: 69 76 65 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72  ive. * allocator
89b0: 2e 20 2a 2f 0a 76 6f 69 64 20 6c 69 6e 65 6e 6f  . */.void lineno
89c0: 69 73 65 46 72 65 65 28 76 6f 69 64 20 2a 70 74  iseFree(void *pt
89d0: 72 29 20 7b 0a 20 20 20 20 66 72 65 65 28 70 74  r) {.    free(pt
89e0: 72 29 3b 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d  r);.}../* ======
89f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8a00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 20 48 69 73 74 6f  ========== Histo
8a10: 72 79 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ry =============
8a20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8a30: 3d 3d 3d 3d 20 2a 2f 0a 0a 2f 2a 20 46 72 65 65  ==== */../* Free
8a40: 20 74 68 65 20 68 69 73 74 6f 72 79 2c 20 62 75   the history, bu
8a50: 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 73 65 74  t does not reset
8a60: 20 69 74 2e 20 4f 6e 6c 79 20 75 73 65 64 20 77   it. Only used w
8a70: 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f 0a 20  hen we have to. 
8a80: 2a 20 65 78 69 74 28 29 20 74 6f 20 61 76 6f 69  * exit() to avoi
8a90: 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 73 20 61  d memory leaks a
8aa0: 72 65 20 72 65 70 6f 72 74 65 64 20 62 79 20 76  re reported by v
8ab0: 61 6c 67 72 69 6e 64 20 26 20 63 6f 2e 20 2a 2f  algrind & co. */
8ac0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
8ad0: 65 48 69 73 74 6f 72 79 28 76 6f 69 64 29 20 7b  eHistory(void) {
8ae0: 0a 20 20 20 20 69 66 20 28 68 69 73 74 6f 72 79  .    if (history
8af0: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ) {.        int 
8b00: 6a 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 20  j;..        for 
8b10: 28 6a 20 3d 20 30 3b 20 6a 20 3c 20 68 69 73 74  (j = 0; j < hist
8b20: 6f 72 79 5f 6c 65 6e 3b 20 6a 2b 2b 29 0a 20 20  ory_len; j++).  
8b30: 20 20 20 20 20 20 20 20 20 20 66 72 65 65 28 68            free(h
8b40: 69 73 74 6f 72 79 5b 6a 5d 29 3b 0a 20 20 20 20  istory[j]);.    
8b50: 20 20 20 20 66 72 65 65 28 68 69 73 74 6f 72 79      free(history
8b60: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 20 41  );.    }.}../* A
8b70: 74 20 65 78 69 74 20 77 65 27 6c 6c 20 74 72 79  t exit we'll try
8b80: 20 74 6f 20 66 69 78 20 74 68 65 20 74 65 72 6d   to fix the term
8b90: 69 6e 61 6c 20 74 6f 20 74 68 65 20 69 6e 69 74  inal to the init
8ba0: 69 61 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 20  ial conditions. 
8bb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
8bc0: 69 6e 65 6e 6f 69 73 65 41 74 45 78 69 74 28 76  inenoiseAtExit(v
8bd0: 6f 69 64 29 20 7b 0a 20 20 20 20 64 69 73 61 62  oid) {.    disab
8be0: 6c 65 52 61 77 4d 6f 64 65 28 53 54 44 49 4e 5f  leRawMode(STDIN_
8bf0: 46 49 4c 45 4e 4f 29 3b 0a 20 20 20 20 66 72 65  FILENO);.    fre
8c00: 65 48 69 73 74 6f 72 79 28 29 3b 0a 7d 0a 0a 2f  eHistory();.}../
8c10: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 41 50  * This is the AP
8c20: 49 20 63 61 6c 6c 20 74 6f 20 61 64 64 20 61 20  I call to add a 
8c30: 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 74 68 65  new entry in the
8c40: 20 6c 69 6e 65 6e 6f 69 73 65 20 68 69 73 74 6f   linenoise histo
8c50: 72 79 2e 0a 20 2a 20 49 74 20 75 73 65 73 20 61  ry.. * It uses a
8c60: 20 66 69 78 65 64 20 61 72 72 61 79 20 6f 66 20   fixed array of 
8c70: 63 68 61 72 20 70 6f 69 6e 74 65 72 73 20 74 68  char pointers th
8c80: 61 74 20 61 72 65 20 73 68 69 66 74 65 64 20 28  at are shifted (
8c90: 6d 65 6d 6d 6f 76 65 64 29 0a 20 2a 20 77 68 65  memmoved). * whe
8ca0: 6e 20 74 68 65 20 68 69 73 74 6f 72 79 20 6d 61  n the history ma
8cb0: 78 20 6c 65 6e 67 74 68 20 69 73 20 72 65 61 63  x length is reac
8cc0: 68 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  hed in order to 
8cd0: 72 65 6d 6f 76 65 20 74 68 65 20 6f 6c 64 65 72  remove the older
8ce0: 0a 20 2a 20 65 6e 74 72 79 20 61 6e 64 20 6d 61  . * entry and ma
8cf0: 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20  ke room for the 
8d00: 6e 65 77 20 6f 6e 65 2c 20 73 6f 20 69 74 20 69  new one, so it i
8d10: 73 20 6e 6f 74 20 65 78 61 63 74 6c 79 20 73 75  s not exactly su
8d20: 69 74 61 62 6c 65 20 66 6f 72 20 68 75 67 65 0a  itable for huge.
8d30: 20 2a 20 68 69 73 74 6f 72 69 65 73 2c 20 62 75   * histories, bu
8d40: 74 20 77 69 6c 6c 20 77 6f 72 6b 20 77 65 6c 6c  t will work well
8d50: 20 66 6f 72 20 61 20 66 65 77 20 68 75 6e 64 72   for a few hundr
8d60: 65 64 20 6f 66 20 65 6e 74 72 69 65 73 2e 0a 20  ed of entries.. 
8d70: 2a 0a 20 2a 20 55 73 69 6e 67 20 61 20 63 69 72  *. * Using a cir
8d80: 63 75 6c 61 72 20 62 75 66 66 65 72 20 69 73 20  cular buffer is 
8d90: 73 6d 61 72 74 65 72 2c 20 62 75 74 20 61 20 62  smarter, but a b
8da0: 69 74 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20  it more complex 
8db0: 74 6f 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 69 6e  to handle. */.in
8dc0: 74 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f  t linenoiseHisto
8dd0: 72 79 41 64 64 28 63 6f 6e 73 74 20 63 68 61 72  ryAdd(const char
8de0: 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68   *line) {.    ch
8df0: 61 72 20 2a 6c 69 6e 65 63 6f 70 79 3b 0a 0a 20  ar *linecopy;.. 
8e00: 20 20 20 69 66 20 28 68 69 73 74 6f 72 79 5f 6d     if (history_m
8e10: 61 78 5f 6c 65 6e 20 3d 3d 20 30 29 20 72 65 74  ax_len == 0) ret
8e20: 75 72 6e 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  urn 0;..    /* I
8e30: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e  nitialization on
8e40: 20 66 69 72 73 74 20 63 61 6c 6c 2e 20 2a 2f 0a   first call. */.
8e50: 20 20 20 20 69 66 20 28 68 69 73 74 6f 72 79 20      if (history 
8e60: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20  == NULL) {.     
8e70: 20 20 20 68 69 73 74 6f 72 79 20 3d 20 6d 61 6c     history = mal
8e80: 6c 6f 63 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  loc(sizeof(char*
8e90: 29 2a 68 69 73 74 6f 72 79 5f 6d 61 78 5f 6c 65  )*history_max_le
8ea0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  n);.        if (
8eb0: 68 69 73 74 6f 72 79 20 3d 3d 20 4e 55 4c 4c 29  history == NULL)
8ec0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
8ed0: 20 20 20 6d 65 6d 73 65 74 28 68 69 73 74 6f 72     memset(histor
8ee0: 79 2c 30 2c 28 73 69 7a 65 6f 66 28 63 68 61 72  y,0,(sizeof(char
8ef0: 2a 29 2a 68 69 73 74 6f 72 79 5f 6d 61 78 5f 6c  *)*history_max_l
8f00: 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  en));.    }..   
8f10: 20 2f 2a 20 44 6f 6e 27 74 20 61 64 64 20 64 75   /* Don't add du
8f20: 70 6c 69 63 61 74 65 64 20 6c 69 6e 65 73 2e 20  plicated lines. 
8f30: 2a 2f 0a 20 20 20 20 69 66 20 28 68 69 73 74 6f  */.    if (histo
8f40: 72 79 5f 6c 65 6e 20 26 26 20 21 73 74 72 63 6d  ry_len && !strcm
8f50: 70 28 68 69 73 74 6f 72 79 5b 68 69 73 74 6f 72  p(history[histor
8f60: 79 5f 6c 65 6e 2d 31 5d 2c 20 6c 69 6e 65 29 29  y_len-1], line))
8f70: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20   return 0;..    
8f80: 2f 2a 20 41 64 64 20 61 6e 20 68 65 61 70 20 61  /* Add an heap a
8f90: 6c 6c 6f 63 61 74 65 64 20 63 6f 70 79 20 6f 66  llocated copy of
8fa0: 20 74 68 65 20 6c 69 6e 65 20 69 6e 20 74 68 65   the line in the
8fb0: 20 68 69 73 74 6f 72 79 2e 0a 20 20 20 20 20 2a   history..     *
8fc0: 20 49 66 20 77 65 20 72 65 61 63 68 65 64 20 74   If we reached t
8fd0: 68 65 20 6d 61 78 20 6c 65 6e 67 74 68 2c 20 72  he max length, r
8fe0: 65 6d 6f 76 65 20 74 68 65 20 6f 6c 64 65 72 20  emove the older 
8ff0: 6c 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 6c 69 6e  line. */.    lin
9000: 65 63 6f 70 79 20 3d 20 73 74 72 64 75 70 28 6c  ecopy = strdup(l
9010: 69 6e 65 29 3b 0a 20 20 20 20 69 66 20 28 21 6c  ine);.    if (!l
9020: 69 6e 65 63 6f 70 79 29 20 72 65 74 75 72 6e 20  inecopy) return 
9030: 30 3b 0a 20 20 20 20 69 66 20 28 68 69 73 74 6f  0;.    if (histo
9040: 72 79 5f 6c 65 6e 20 3d 3d 20 68 69 73 74 6f 72  ry_len == histor
9050: 79 5f 6d 61 78 5f 6c 65 6e 29 20 7b 0a 20 20 20  y_max_len) {.   
9060: 20 20 20 20 20 66 72 65 65 28 68 69 73 74 6f 72       free(histor
9070: 79 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 6d  y[0]);.        m
9080: 65 6d 6d 6f 76 65 28 68 69 73 74 6f 72 79 2c 68  emmove(history,h
9090: 69 73 74 6f 72 79 2b 31 2c 73 69 7a 65 6f 66 28  istory+1,sizeof(
90a0: 63 68 61 72 2a 29 2a 28 68 69 73 74 6f 72 79 5f  char*)*(history_
90b0: 6d 61 78 5f 6c 65 6e 2d 31 29 29 3b 0a 20 20 20  max_len-1));.   
90c0: 20 20 20 20 20 68 69 73 74 6f 72 79 5f 6c 65 6e       history_len
90d0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 69  --;.    }.    hi
90e0: 73 74 6f 72 79 5b 68 69 73 74 6f 72 79 5f 6c 65  story[history_le
90f0: 6e 5d 20 3d 20 6c 69 6e 65 63 6f 70 79 3b 0a 20  n] = linecopy;. 
9100: 20 20 20 68 69 73 74 6f 72 79 5f 6c 65 6e 2b 2b     history_len++
9110: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
9120: 7d 0a 0a 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  }../* Set the ma
9130: 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 66 6f 72  ximum length for
9140: 20 74 68 65 20 68 69 73 74 6f 72 79 2e 20 54 68   the history. Th
9150: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20  is function can 
9160: 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 0a 20  be called even. 
9170: 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6c  * if there is al
9180: 72 65 61 64 79 20 73 6f 6d 65 20 68 69 73 74 6f  ready some histo
9190: 72 79 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ry, the function
91a0: 20 77 69 6c 6c 20 6d 61 6b 65 20 73 75 72 65 20   will make sure 
91b0: 74 6f 20 72 65 74 61 69 6e 0a 20 2a 20 6a 75 73  to retain. * jus
91c0: 74 20 74 68 65 20 6c 61 74 65 73 74 20 27 6c 65  t the latest 'le
91d0: 6e 27 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 74  n' elements if t
91e0: 68 65 20 6e 65 77 20 68 69 73 74 6f 72 79 20 6c  he new history l
91f0: 65 6e 67 74 68 20 76 61 6c 75 65 20 69 73 20 73  ength value is s
9200: 6d 61 6c 6c 65 72 0a 20 2a 20 74 68 61 6e 20 74  maller. * than t
9210: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 69 74 65  he amount of ite
9220: 6d 73 20 61 6c 72 65 61 64 79 20 69 6e 73 69 64  ms already insid
9230: 65 20 74 68 65 20 68 69 73 74 6f 72 79 2e 20 2a  e the history. *
9240: 2f 0a 69 6e 74 20 6c 69 6e 65 6e 6f 69 73 65 48  /.int linenoiseH
9250: 69 73 74 6f 72 79 53 65 74 4d 61 78 4c 65 6e 28  istorySetMaxLen(
9260: 69 6e 74 20 6c 65 6e 29 20 7b 0a 20 20 20 20 63  int len) {.    c
9270: 68 61 72 20 2a 2a 6e 65 77 3b 0a 0a 20 20 20 20  har **new;..    
9280: 69 66 20 28 6c 65 6e 20 3c 20 31 29 20 72 65 74  if (len < 1) ret
9290: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 20 28 68  urn 0;.    if (h
92a0: 69 73 74 6f 72 79 29 20 7b 0a 20 20 20 20 20 20  istory) {.      
92b0: 20 20 69 6e 74 20 74 6f 63 6f 70 79 20 3d 20 68    int tocopy = h
92c0: 69 73 74 6f 72 79 5f 6c 65 6e 3b 0a 0a 20 20 20  istory_len;..   
92d0: 20 20 20 20 20 6e 65 77 20 3d 20 6d 61 6c 6c 6f       new = mallo
92e0: 63 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  c(sizeof(char*)*
92f0: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  len);.        if
9300: 20 28 6e 65 77 20 3d 3d 20 4e 55 4c 4c 29 20 72   (new == NULL) r
9310: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20  eturn 0;..      
9320: 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 27 74    /* If we can't
9330: 20 63 6f 70 79 20 65 76 65 72 79 74 68 69 6e 67   copy everything
9340: 2c 20 66 72 65 65 20 74 68 65 20 65 6c 65 6d 65  , free the eleme
9350: 6e 74 73 20 77 65 27 6c 6c 20 6e 6f 74 20 75 73  nts we'll not us
9360: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  e. */.        if
9370: 20 28 6c 65 6e 20 3c 20 74 6f 63 6f 70 79 29 20   (len < tocopy) 
9380: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
9390: 74 20 6a 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  t j;..          
93a0: 20 20 66 6f 72 20 28 6a 20 3d 20 30 3b 20 6a 20    for (j = 0; j 
93b0: 3c 20 74 6f 63 6f 70 79 2d 6c 65 6e 3b 20 6a 2b  < tocopy-len; j+
93c0: 2b 29 20 66 72 65 65 28 68 69 73 74 6f 72 79 5b  +) free(history[
93d0: 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  j]);.           
93e0: 20 74 6f 63 6f 70 79 20 3d 20 6c 65 6e 3b 0a 20   tocopy = len;. 
93f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9400: 20 6d 65 6d 73 65 74 28 6e 65 77 2c 30 2c 73 69   memset(new,0,si
9410: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6c 65 6e 29  zeof(char*)*len)
9420: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
9430: 28 6e 65 77 2c 68 69 73 74 6f 72 79 2b 28 68 69  (new,history+(hi
9440: 73 74 6f 72 79 5f 6c 65 6e 2d 74 6f 63 6f 70 79  story_len-tocopy
9450: 29 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  ), sizeof(char*)
9460: 2a 74 6f 63 6f 70 79 29 3b 0a 20 20 20 20 20 20  *tocopy);.      
9470: 20 20 66 72 65 65 28 68 69 73 74 6f 72 79 29 3b    free(history);
9480: 0a 20 20 20 20 20 20 20 20 68 69 73 74 6f 72 79  .        history
9490: 20 3d 20 6e 65 77 3b 0a 20 20 20 20 7d 0a 20 20   = new;.    }.  
94a0: 20 20 68 69 73 74 6f 72 79 5f 6d 61 78 5f 6c 65    history_max_le
94b0: 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 69 66 20  n = len;.    if 
94c0: 28 68 69 73 74 6f 72 79 5f 6c 65 6e 20 3e 20 68  (history_len > h
94d0: 69 73 74 6f 72 79 5f 6d 61 78 5f 6c 65 6e 29 0a  istory_max_len).
94e0: 20 20 20 20 20 20 20 20 68 69 73 74 6f 72 79 5f          history_
94f0: 6c 65 6e 20 3d 20 68 69 73 74 6f 72 79 5f 6d 61  len = history_ma
9500: 78 5f 6c 65 6e 3b 0a 20 20 20 20 72 65 74 75 72  x_len;.    retur
9510: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 53 61 76 65 20  n 1;.}../* Save 
9520: 74 68 65 20 68 69 73 74 6f 72 79 20 69 6e 20 74  the history in t
9530: 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
9540: 65 2e 20 4f 6e 20 73 75 63 63 65 73 73 20 30 20  e. On success 0 
9550: 69 73 20 72 65 74 75 72 6e 65 64 0a 20 2a 20 6f  is returned. * o
9560: 74 68 65 72 77 69 73 65 20 2d 31 20 69 73 20 72  therwise -1 is r
9570: 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 69 6e 74 20  eturned. */.int 
9580: 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79  linenoiseHistory
9590: 53 61 76 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Save(const char 
95a0: 2a 66 69 6c 65 6e 61 6d 65 29 20 7b 0a 20 20 20  *filename) {.   
95b0: 20 6d 6f 64 65 5f 74 20 6f 6c 64 5f 75 6d 61 73   mode_t old_umas
95c0: 6b 20 3d 20 75 6d 61 73 6b 28 53 5f 49 58 55 53  k = umask(S_IXUS
95d0: 52 7c 53 5f 49 52 57 58 47 7c 53 5f 49 52 57 58  R|S_IRWXG|S_IRWX
95e0: 4f 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66 70  O);.    FILE *fp
95f0: 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 0a 20 20  ;.    int j;..  
9600: 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 66 69 6c    fp = fopen(fil
9610: 65 6e 61 6d 65 2c 22 77 22 29 3b 0a 20 20 20 20  ename,"w");.    
9620: 75 6d 61 73 6b 28 6f 6c 64 5f 75 6d 61 73 6b 29  umask(old_umask)
9630: 3b 0a 20 20 20 20 69 66 20 28 66 70 20 3d 3d 20  ;.    if (fp == 
9640: 4e 55 4c 4c 29 20 72 65 74 75 72 6e 20 2d 31 3b  NULL) return -1;
9650: 0a 20 20 20 20 63 68 6d 6f 64 28 66 69 6c 65 6e  .    chmod(filen
9660: 61 6d 65 2c 53 5f 49 52 55 53 52 7c 53 5f 49 57  ame,S_IRUSR|S_IW
9670: 55 53 52 29 3b 0a 20 20 20 20 66 6f 72 20 28 6a  USR);.    for (j
9680: 20 3d 20 30 3b 20 6a 20 3c 20 68 69 73 74 6f 72   = 0; j < histor
9690: 79 5f 6c 65 6e 3b 20 6a 2b 2b 29 0a 20 20 20 20  y_len; j++).    
96a0: 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
96b0: 25 73 5c 6e 22 2c 68 69 73 74 6f 72 79 5b 6a 5d  %s\n",history[j]
96c0: 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70  );.    fclose(fp
96d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
96e0: 0a 7d 0a 0a 2f 2a 20 4c 6f 61 64 20 74 68 65 20  .}../* Load the 
96f0: 68 69 73 74 6f 72 79 20 66 72 6f 6d 20 74 68 65  history from the
9700: 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e   specified file.
9710: 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65   If the file doe
9720: 73 20 6e 6f 74 20 65 78 69 73 74 0a 20 2a 20 7a  s not exist. * z
9730: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
9740: 61 6e 64 20 6e 6f 20 6f 70 65 72 61 74 69 6f 6e  and no operation
9750: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 20   is performed.. 
9760: 2a 0a 20 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *. * If the file
9770: 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20   exists and the 
9780: 6f 70 65 72 61 74 69 6f 6e 20 73 75 63 63 65 65  operation succee
9790: 64 65 64 20 30 20 69 73 20 72 65 74 75 72 6e 65  ded 0 is returne
97a0: 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 20 2a 20  d, otherwise. * 
97b0: 6f 6e 20 65 72 72 6f 72 20 2d 31 20 69 73 20 72  on error -1 is r
97c0: 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 69 6e 74 20  eturned. */.int 
97d0: 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79  linenoiseHistory
97e0: 4c 6f 61 64 28 63 6f 6e 73 74 20 63 68 61 72 20  Load(const char 
97f0: 2a 66 69 6c 65 6e 61 6d 65 29 20 7b 0a 20 20 20  *filename) {.   
9800: 20 46 49 4c 45 20 2a 66 70 20 3d 20 66 6f 70 65   FILE *fp = fope
9810: 6e 28 66 69 6c 65 6e 61 6d 65 2c 22 72 22 29 3b  n(filename,"r");
9820: 0a 20 20 20 20 63 68 61 72 20 62 75 66 5b 4c 49  .    char buf[LI
9830: 4e 45 4e 4f 49 53 45 5f 4d 41 58 5f 4c 49 4e 45  NENOISE_MAX_LINE
9840: 5d 3b 0a 0a 20 20 20 20 69 66 20 28 66 70 20 3d  ];..    if (fp =
9850: 3d 20 4e 55 4c 4c 29 20 72 65 74 75 72 6e 20 2d  = NULL) return -
9860: 31 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 66  1;..    while (f
9870: 67 65 74 73 28 62 75 66 2c 4c 49 4e 45 4e 4f 49  gets(buf,LINENOI
9880: 53 45 5f 4d 41 58 5f 4c 49 4e 45 2c 66 70 29 20  SE_MAX_LINE,fp) 
9890: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20  != NULL) {.     
98a0: 20 20 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 20     char *p;..   
98b0: 20 20 20 20 20 70 20 3d 20 73 74 72 63 68 72 28       p = strchr(
98c0: 62 75 66 2c 27 5c 72 27 29 3b 0a 20 20 20 20 20  buf,'\r');.     
98d0: 20 20 20 69 66 20 28 21 70 29 20 70 20 3d 20 73     if (!p) p = s
98e0: 74 72 63 68 72 28 62 75 66 2c 27 5c 6e 27 29 3b  trchr(buf,'\n');
98f0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 70 29 20  .        if (p) 
9900: 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  *p = '\0';.     
9910: 20 20 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74     linenoiseHist
9920: 6f 72 79 41 64 64 28 62 75 66 29 3b 0a 20 20 20  oryAdd(buf);.   
9930: 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70   }.    fclose(fp
9940: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
9950: 0a 7d 0a                                         .}.