1
0
mirror of https://github.com/rancher/os.git synced 2025-09-02 15:24:32 +00:00

move dependencies to vendor

This commit is contained in:
Ivan Mikushin
2015-11-26 17:37:01 +05:00
parent 63d7de67cd
commit 1d691cd8d6
2232 changed files with 154499 additions and 9037 deletions

16
vendor/github.com/kless/term/Doc/AUTHORS.md generated vendored Normal file
View File

@@ -0,0 +1,16 @@
###### Notice
*This is the official list of **Terminal** authors for copyright purposes.*
*This file is distinct from the CONTRIBUTORS file. See the latter for an
explanation.*
*Names should be added to this file as: `Organization`;
`[Name](web address)` or `Name <email>` for individuals*
*Please keep the list sorted.*
* * *
[Jonas mg](https://github.com/kless)

26
vendor/github.com/kless/term/Doc/CONTRIBUTORS.md generated vendored Normal file
View File

@@ -0,0 +1,26 @@
###### Notice
*This is the official list of people who can contribute (and typically have
contributed) code to the **Terminal** repository.*
*The AUTHORS file lists the copyright holders; this file lists people. For
example, the employees of an organization are listed here but not in AUTHORS,
because the organization holds the copyright.*
*Names should be added to this file as: `[Name](web address)` or `Name <email>`*
*Please keep the list sorted.*
* * *
### Initial author
[Jonas mg](https://github.com/kless)
### Maintainer
### Other authors

374
vendor/github.com/kless/term/Doc/LICENSE-MPL.txt generated vendored Normal file
View File

@@ -0,0 +1,374 @@
Mozilla Public License Version 2.0
==================================
1. Definitions
--------------
1.1. "Contributor"
means each individual or legal entity that creates, contributes to
the creation of, or owns Covered Software.
1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution.
1.3. "Contribution"
means Covered Software of a particular Contributor.
1.4. "Covered Software"
means Source Code Form to which the initial Contributor has attached
the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case
including portions thereof.
1.5. "Incompatible With Secondary Licenses"
means
(a) that the initial Contributor has attached the notice described
in Exhibit B to the Covered Software; or
(b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the
terms of a Secondary License.
1.6. "Executable Form"
means any form of the work other than Source Code Form.
1.7. "Larger Work"
means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software.
1.8. "License"
means this document.
1.9. "Licensable"
means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License.
1.10. "Modifications"
means any of the following:
(a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered
Software; or
(b) any new file in Source Code Form that contains any Covered
Software.
1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its
Contributor Version.
1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those
licenses.
1.13. "Source Code Form"
means the form of the work preferred for making modifications.
1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For
purposes of this definition, "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of more than
fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity.
2. License Grants and Conditions
--------------------------------
2.1. Grants
Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:
(a) under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and
(b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version.
2.2. Effective Date
The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.
2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:
(a) for any code that a Contributor has removed from Covered Software;
or
(b) for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor
Version); or
(c) under Patent Claims infringed by Covered Software in the absence of
its Contributions.
This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).
2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).
2.5. Representation
Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use
This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.
2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1.
3. Responsibilities
-------------------
3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.
3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then:
(a) such Covered Software must also be made available in Source Code
Form, as described in Section 3.1, and You must inform recipients of
the Executable Form how they can obtain a copy of such Source Code
Form by reasonable means in a timely manner, at a charge no more
than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).
3.4. Notices
You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.
4. Inability to Comply Due to Statute or Regulation
---------------------------------------------------
If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it.
5. Termination
--------------
5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License
prior to termination shall survive termination.
************************************************************************
* *
* 6. Disclaimer of Warranty *
* ------------------------- *
* *
* Covered Software is provided under this License on an "as is" *
* basis, without warranty of any kind, either expressed, implied, or *
* statutory, including, without limitation, warranties that the *
* Covered Software is free of defects, merchantable, fit for a *
* particular purpose or non-infringing. The entire risk as to the *
* quality and performance of the Covered Software is with You. *
* Should any Covered Software prove defective in any respect, You *
* (not any Contributor) assume the cost of any necessary servicing, *
* repair, or correction. This disclaimer of warranty constitutes an *
* essential part of this License. No use of any Covered Software is *
* authorized under this License except under this disclaimer. *
* *
************************************************************************
************************************************************************
* *
* 7. Limitation of Liability *
* -------------------------- *
* *
* Under no circumstances and under no legal theory, whether tort *
* (including negligence), contract, or otherwise, shall any *
* Contributor, or anyone who distributes Covered Software as *
* permitted above, be liable to You for any direct, indirect, *
* special, incidental, or consequential damages of any character *
* including, without limitation, damages for lost profits, loss of *
* goodwill, work stoppage, computer failure or malfunction, or any *
* and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the *
* extent applicable law prohibits such limitation. Some *
* jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. *
* *
************************************************************************
8. Litigation
-------------
Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims.
9. Miscellaneous
----------------
This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor.
10. Versions of the License
---------------------------
10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.
10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.
10.3. Modified Versions
If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses
If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice
-------------------------------------------
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look
for such a notice.
You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0.

15
vendor/github.com/kless/term/Doc/NEWS.md generated vendored Normal file
View File

@@ -0,0 +1,15 @@
###### Notice
*This file documents the changes in **Terminal** versions that are listed below.*
*Items should be added to this file as:*
### YYYY-MM-DD Release
+ Additional changes.
+ More changes.
* * *

24
vendor/github.com/kless/term/README.md generated vendored Normal file
View File

@@ -0,0 +1,24 @@
term
====
Package term provides a portable interface for terminal I/O.
[Documentation online](http://godoc.org/github.com/kless/term)
## Installation
go get github.com/kless/term
## Status
Tested in Linux 3.5.0, FreeBSD 9.1, NetBSD 6.1, OpenBSD 5.3, and Darwin systems,
for AMD64 and i386 architectures.
## License
The source files are distributed under the [Mozilla Public License, version 2.0](http://mozilla.org/MPL/2.0/),
unless otherwise noted.
Please read the [FAQ](http://www.mozilla.org/MPL/2.0/FAQ.html)
if you have further questions regarding the license.
* * *
*Generated by [Gowizard](https://github.com/kless/wizard)*

33
vendor/github.com/kless/term/doc.go generated vendored Normal file
View File

@@ -0,0 +1,33 @@
/*
Package term provides a portable interface for terminal I/O.
It manages input and output (I/O) for character-mode applications.
The high-level functions enable an application to read from standard input to
retrieve keyboard input stored in a terminal's input buffer. They also enable
an application to write to standard output or standard error to display text
in the terminal's screen buffer. And they also support redirection of standard
handles and control of terminal modes for different I/O functionality.
The low-level functions enable applications to receive detailed input about
keyboard. They also enable greater control of output to the screen.
Usage:
ter, err := term.New()
if err != nil {
panic(err)
}
defer func() {
if err = ter.Restore(); err != nil {
// Handle error
}
}()
Important
The "go test" tool runs tests with standard input connected to standard
error. So whatever program that uses the file descriptor of "/dev/stdin"
(which is 0), then it is going to fail. The solution is to use the standard
error.
*/
package term

65
vendor/github.com/kless/term/readline/ansi.go generated vendored Normal file
View File

@@ -0,0 +1,65 @@
// Copyright 2010 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// The references about ANSI Escape sequences have been got from
// http://ascii-table.com/ansi-escape-sequences.php and
// http://www.termsys.demon.co.uk/vtansi.htm
package readline
// ANSI terminal escape controls
const (
// Cursor control
ANSI_CURSOR_UP = "\033[A" // Up
ANSI_CURSOR_DOWN = "\033[B" // Down
ANSI_CURSOR_FORWARD = "\033[C" // Forward
ANSI_CURSOR_BACKWARD = "\033[D" // Backward
ANSI_NEXT_LINE = "\033[E" // To next line
ANSI_PREV_LINE = "\033[F" // To previous line
// Erase
ANSI_DEL_LINE = "\033[2K" // Erase line
// Graphics mode
ANSI_SET_BOLD = "\033[1m" // Bold on
ANSI_SET_OFF = "\033[0m" // All attributes off
)
// ANSI terminal escape controls
var (
// Cursor control
CursorUp = []byte(ANSI_CURSOR_UP)
CursorDown = []byte(ANSI_CURSOR_DOWN)
CursorForward = []byte(ANSI_CURSOR_FORWARD)
CursorBackward = []byte(ANSI_CURSOR_BACKWARD)
ToNextLine = []byte(ANSI_NEXT_LINE)
ToPreviousLine = []byte(ANSI_PREV_LINE)
// Erase Text
DelScreenToUpper = []byte("\033[2J\033[0;0H") // Erase the screen; move upper
DelToRight = []byte("\033[0K") // Erase to right
DelLine_CR = []byte("\033[2K\r") // Erase line; carriage return
DelLine_cursorUp = []byte("\033[2K\033[A") // Erase line; cursor up
//DelChar = []byte("\033[1X") // Erase character
DelChar = []byte("\033[P") // Delete character, from current position
DelBackspace = []byte("\033[D\033[P")
// Misc.
//InsertChar = []byte("\033[@") // Insert CHaracter
//SetLineWrap = []byte("\033[?7h") // Enable Line Wrap
)
// Characters
var (
CR = []byte{13} // Carriage return -- \r
CRLF = []byte{13, 10} // CR+LF is used for a new line in raw mode -- \r\n
CtrlC = []rune("^C")
CtrlD = []rune("^D")
)

380
vendor/github.com/kless/term/readline/buffer.go generated vendored Normal file
View File

@@ -0,0 +1,380 @@
// Copyright 2010 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package readline
import (
"fmt"
"unicode/utf8"
"github.com/kless/term"
)
// Buffer size
var (
BufferCap = 4096
BufferLen = 64 // Initial length
)
// == Init
/*var lines, columns int
func init() {
lines, columns = term.SizeInChar()
}*/
// == Type
// A buffer represents the line buffer.
type buffer struct {
columns int // Number of columns for actual window
promptLen int
pos int // Pointer position into buffer
size int // Amount of characters added
data []rune // Text buffer
}
func newBuffer(promptLen, columns int) *buffer {
b := new(buffer)
b.columns = columns
b.promptLen = promptLen
b.data = make([]rune, BufferLen, BufferCap)
return b
}
// == Output
// insertRune inserts a character in the cursor position.
func (b *buffer) insertRune(r rune) error {
var useRefresh bool
b.grow(b.size + 1) // Check if there is free space for one more character
// Avoid a full update of the line.
if b.pos == b.size {
char := make([]byte, utf8.UTFMax)
utf8.EncodeRune(char, r)
if _, err := term.Output.Write(char); err != nil {
return outputError(err.Error())
}
} else {
useRefresh = true
copy(b.data[b.pos+1:b.size+1], b.data[b.pos:b.size])
}
b.data[b.pos] = r
b.pos++
b.size++
if useRefresh {
return b.refresh()
}
return nil
}
// insertRunes inserts several characters.
func (b *buffer) insertRunes(runes []rune) error {
for _, r := range runes {
if err := b.insertRune(r); err != nil {
return err
}
}
return nil
}
// toBytes returns a slice of the contents of the buffer.
func (b *buffer) toBytes() []byte {
chars := make([]byte, b.size*utf8.UTFMax)
var end, runeLen int
// == Each character (as integer) is encoded to []byte
for i := 0; i < b.size; i++ {
if i != 0 {
runeLen = utf8.EncodeRune(chars[end:], b.data[i])
end += runeLen
} else {
runeLen = utf8.EncodeRune(chars, b.data[i])
end = runeLen
}
}
return chars[:end]
}
// toString returns the contents of the buffer as a string.
func (b *buffer) toString() string { return string(b.data[b.promptLen:b.size]) }
// refresh refreshes the line.
func (b *buffer) refresh() (err error) {
lastLine, _ := b.pos2xy(b.size)
posLine, posColumn := b.pos2xy(b.pos)
// To the first line.
for ln := posLine; ln > 0; ln-- {
if _, err = term.Output.Write(ToPreviousLine); err != nil {
return outputError(err.Error())
}
}
// == Write the line
if _, err = term.Output.Write(CR); err != nil {
return outputError(err.Error())
}
if _, err = term.Output.Write(b.toBytes()); err != nil {
return outputError(err.Error())
}
if _, err = term.Output.Write(DelToRight); err != nil {
return outputError(err.Error())
}
// == Move cursor to original position.
for ln := lastLine; ln > posLine; ln-- {
if _, err = term.Output.Write(ToPreviousLine); err != nil {
return outputError(err.Error())
}
}
if _, err = fmt.Fprintf(term.Output, "\r\033[%dC", posColumn); err != nil {
return outputError(err.Error())
}
return nil
}
// == Movement
// start moves the cursor at the start.
func (b *buffer) start() (err error) {
if b.pos == b.promptLen {
return
}
for ln, _ := b.pos2xy(b.pos); ln > 0; ln-- {
if _, err = term.Output.Write(CursorUp); err != nil {
return outputError(err.Error())
}
}
if _, err = fmt.Fprintf(term.Output, "\r\033[%dC", b.promptLen); err != nil {
return outputError(err.Error())
}
b.pos = b.promptLen
return
}
// end moves the cursor at the end.
// Returns the number of lines that fill in the data.
func (b *buffer) end() (lines int, err error) {
if b.pos == b.size {
return
}
lastLine, lastColumn := b.pos2xy(b.size)
for ln, _ := b.pos2xy(b.pos); ln < lastLine; ln++ {
if _, err = term.Output.Write(CursorDown); err != nil {
return 0, outputError(err.Error())
}
}
if _, err = fmt.Fprintf(term.Output, "\r\033[%dC", lastColumn); err != nil {
return 0, outputError(err.Error())
}
b.pos = b.size
return lastLine, nil
}
// backward moves the cursor one character backward.
// Returns a boolean to know if the cursor is at the beginning of the line.
func (b *buffer) backward() (start bool, err error) {
if b.pos == b.promptLen {
return true, nil
}
b.pos--
// If position is on the same line.
if _, col := b.pos2xy(b.pos); col != 0 {
if _, err = term.Output.Write(CursorBackward); err != nil {
return false, outputError(err.Error())
}
} else {
if _, err = term.Output.Write(CursorUp); err != nil {
return false, outputError(err.Error())
}
if _, err = fmt.Fprintf(term.Output, "\033[%dC", b.columns); err != nil {
return false, outputError(err.Error())
}
}
return
}
// forward moves the cursor one character forward.
// Returns a boolean to know if the cursor is at the end of the line.
func (b *buffer) forward() (end bool, err error) {
if b.pos == b.size {
return true, nil
}
b.pos++
if _, col := b.pos2xy(b.pos); col != 0 {
if _, err = term.Output.Write(CursorForward); err != nil {
return false, outputError(err.Error())
}
} else {
if _, err = term.Output.Write(ToNextLine); err != nil {
return false, outputError(err.Error())
}
}
return
}
// swap swaps the actual character by the previous one. If it is the end of the
// line then it is swapped the 2nd previous by the previous one.
func (b *buffer) swap() error {
if b.pos == b.promptLen {
return nil
}
if b.pos < b.size {
aux := b.data[b.pos-1]
b.data[b.pos-1] = b.data[b.pos]
b.data[b.pos] = aux
b.pos++
// End of line
} else {
aux := b.data[b.pos-2]
b.data[b.pos-2] = b.data[b.pos-1]
b.data[b.pos-1] = aux
}
return b.refresh()
}
// wordBackward moves the cursor one word backward.
func (b *buffer) wordBackward() (err error) {
for start := false; ; {
start, err = b.backward()
if start == true || err != nil || b.data[b.pos-1] == 32 {
return
}
}
}
// wordForward moves the cursor one word forward.
func (b *buffer) wordForward() (err error) {
for end := false; ; {
end, err = b.forward()
if end == true || err != nil || b.data[b.pos] == 32 {
return
}
}
}
// == Delete
// deleteChar deletes the character in cursor.
func (b *buffer) deleteChar() (err error) {
if b.pos == b.size {
return
}
copy(b.data[b.pos:], b.data[b.pos+1:b.size])
b.size--
if lastLine, _ := b.pos2xy(b.size); lastLine == 0 {
if _, err = term.Output.Write(DelChar); err != nil {
return outputError(err.Error())
}
return nil
}
return b.refresh()
}
// deleteCharPrev deletes the previous character from cursor.
func (b *buffer) deleteCharPrev() (err error) {
if b.pos == b.promptLen {
return
}
copy(b.data[b.pos-1:], b.data[b.pos:b.size])
b.pos--
b.size--
if lastLine, _ := b.pos2xy(b.size); lastLine == 0 {
if _, err = term.Output.Write(DelBackspace); err != nil {
return outputError(err.Error())
}
return nil
}
return b.refresh()
}
// deleteToRight deletes from current position until to end of line.
func (b *buffer) deleteToRight() (err error) {
if b.pos == b.size {
return
}
lastLine, _ := b.pos2xy(b.size)
posLine, _ := b.pos2xy(b.pos)
// To the last line.
for ln := posLine; ln < lastLine; ln++ {
if _, err = term.Output.Write(CursorDown); err != nil {
return outputError(err.Error())
}
}
// Delete all lines until the cursor position.
for ln := lastLine; ln > posLine; ln-- {
if _, err = term.Output.Write(DelLine_cursorUp); err != nil {
return outputError(err.Error())
}
}
if _, err = term.Output.Write(DelToRight); err != nil {
return outputError(err.Error())
}
b.size = b.pos
return nil
}
// deleteLine deletes full line.
func (b *buffer) deleteLine() error {
lines, err := b.end()
if err != nil {
return err
}
for lines > 0 {
if _, err = term.Output.Write(DelLine_cursorUp); err != nil {
return outputError(err.Error())
}
lines--
}
return nil
}
// == Utility
// grow grows buffer to guarantee space for n more byte.
func (b *buffer) grow(n int) {
for n > len(b.data) {
b.data = b.data[:len(b.data)+BufferLen]
}
}
// pos2xy returns the coordinates of a position for a line of size given in
// columns.
func (b *buffer) pos2xy(pos int) (line, column int) {
if pos < b.columns {
return 0, pos
}
line = pos / b.columns
column = pos - (line * b.columns) //- 1
return
}

50
vendor/github.com/kless/term/readline/doc.go generated vendored Normal file
View File

@@ -0,0 +1,50 @@
// Copyright 2010 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
/*
Package readline provides simple functions for both line and screen editing.
Features:
Unicode support
History
Multi-line editing
List of key sequences enabled (just like in GNU Readline):
Backspace / Ctrl+h
Delete
Home / Ctrl+a
End / Ctrl+e
Left arrow / Ctrl+b
Right arrow / Ctrl+f
Up arrow / Ctrl+p
Down arrow / Ctrl+n
Ctrl+left arrow
Ctrl+right arrow
Ctrl+t : swap actual character by the previous one
Ctrl+k : delete from current to end of line
Ctrl+u : delete the whole line
Ctrl+l : clear screen
Ctrl+c
Ctrl+d : exit
Note that There are several default values:
+ For the buffer: BufferCap, BufferLen.
+ For the history file: HistoryCap, HistoryPerm.
Important: the TTY is set in "raw mode" so there is to use CR+LF ("\r\n") for
writing a new line.
Note: the values for the input and output are got from the package base "term".
*/
package readline

25
vendor/github.com/kless/term/readline/error.go generated vendored Normal file
View File

@@ -0,0 +1,25 @@
// Copyright 2010 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package readline
import "errors"
var ErrCtrlD = errors.New("Interrumpted (Ctrl+d)")
// An inputError represents a failure on input.
type inputError string
func (e inputError) Error() string {
return "could not read from input: " + string(e)
}
// An outputError represents a failure in output.
type outputError string
func (e outputError) Error() string {
return "could not write to output: " + string(e)
}

196
vendor/github.com/kless/term/readline/history.go generated vendored Normal file
View File

@@ -0,0 +1,196 @@
// Copyright 2010 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package readline
import (
"bufio"
"container/list"
"errors"
"io"
"log"
"os"
"strconv"
"strings"
)
// Values by default
var (
HistoryCap = 500 // Capacity
HistoryPerm os.FileMode = 0600 // History file permission
)
var (
ErrEmptyHist = errors.New("history: empty")
ErrNilElement = errors.New("history: no more elements")
)
// == Type
type history struct {
Cap int
filename string
file *os.File
mark *list.Element // Pointer to the last element added.
li *list.List
}
// _baseHistory is the base to create an history file.
func _baseHistory(fname string, size int) (*history, error) {
file, err := os.OpenFile(fname, os.O_CREATE|os.O_RDWR, HistoryPerm)
if err != nil {
return nil, err
}
h := new(history)
h.Cap = size
h.filename = fname
h.file = file
h.li = list.New()
return h, nil
}
// NewHistory creates a new history using the maximum length by default.
func NewHistory(filename string) (*history, error) {
return _baseHistory(filename, HistoryCap)
}
// NewHistoryOfSize creates a new history whose buffer has the specified size,
// which must be greater than zero.
func NewHistoryOfSize(filename string, size int) (*history, error) {
if size <= 0 {
return nil, errors.New("wrong history size: " + strconv.Itoa(size))
}
return _baseHistory(filename, size)
}
// == Access to file
// Load loads the history from the file.
func (h *history) Load() {
in := bufio.NewReader(h.file)
for {
line, err := in.ReadString('\n')
if err == io.EOF {
break
}
h.li.PushBack(strings.TrimRight(line, "\n"))
}
h.mark = h.li.Back() // Point to an element.
}
// Save saves all lines to the text file, excep when:
// + it starts with some space
// + it is an empty line
func (h *history) Save() (err error) {
if _, err = h.file.Seek(0, 0); err != nil {
return
}
out := bufio.NewWriter(h.file)
element := h.li.Front() // Get the first element.
for i := 0; i < h.li.Len(); i++ {
line := element.Value.(string)
if strings.HasPrefix(line, " ") {
goto _next
}
if line = strings.TrimSpace(line); line == "" {
goto _next
}
if _, err = out.WriteString(line + "\n"); err != nil {
log.Println("history.Save:", err)
break
}
_next:
if element = element.Next(); element == nil {
continue
}
}
if err = out.Flush(); err != nil {
log.Println("history.Save:", err)
}
h.close()
return
}
// close Close the file descriptor.
func (h *history) close() {
h.file.Close()
}
// openFile opens again the file.
/*func (h *history) openFile() {
file, err := os.Open(fname, os.O_CREATE|os.O_RDWR, HistoryPerm)
if err != nil {
log.Println("history.openFile:", err)
return
}
h.file = file
}*/
// Add adds a new line to the buffer.
func (h *history) Add(line string) {
if h.li.Len() <= h.Cap {
h.mark = h.li.PushBack(line)
} else {
// TODO: overwrite lines
}
}
// _baseNextPrev is the base to move between lines.
func (h *history) _baseNextPrev(c byte) (line []rune, err error) {
if h.li.Len() <= 0 {
return line, ErrEmptyHist
}
new := new(list.Element)
if c == 'p' {
new = h.mark.Prev()
} else if c == 'n' {
new = h.mark.Next()
} else {
panic("history._baseNextPrev: wrong character choice")
}
if new != nil {
h.mark = new
} else {
return nil, ErrNilElement
}
return []rune(new.Value.(string)), nil
}
// Next returns the next line.
func (h *history) Next() (line []rune, err error) {
return h._baseNextPrev('n')
}
// Prev returns the previous line.
func (h *history) Prev() (line []rune, err error) {
return h._baseNextPrev('p')
}
// == Utility
// hasHistory checks whether has an history file.
func hasHistory(h *history) bool {
if h == nil {
return false
}
return true
}

71
vendor/github.com/kless/term/readline/history_test.go generated vendored Normal file
View File

@@ -0,0 +1,71 @@
// Copyright 2010 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// +build !lookup
package readline
import (
"os"
"path"
"strings"
"testing"
)
var (
historyFile = path.Join(os.TempDir(), "test_history")
historyLen int
)
func TestHistSave(t *testing.T) {
hist, err := NewHistoryOfSize(historyFile, 10)
if err != nil {
t.Error("could not create history", err)
}
if hist.li.Len() > hist.Cap {
t.Error("bad capacity size")
}
hist.Add("1 line with trailing spaces ")
hist.Add("2 line without trailing spaces")
hist.Add("3 line without trailing spaces")
hist.Add("4 with trailing tabulator\t")
hist.Add("5 with trailing new line\n")
hist.Add(" ") // Not saved to file
hist.Add(" leading space") // Idem
hist.Add("") // Idem
hist.Add("9 line without trailing spaces")
hist.Add("10 line number 6")
hist.Save()
historyLen = hist.li.Len() - 3 // 3 lines should not be saved
}
func TestHistLoad(t *testing.T) {
hist, err := NewHistoryOfSize(historyFile, 10)
if err != nil {
t.Error("could not load history", err)
}
hist.Load()
e := hist.li.Front()
for i := 0; i < hist.li.Len(); i++ {
line := e.Value.(string)
if strings.HasSuffix(line, "\n") || strings.HasSuffix(line, "\t") ||
strings.HasSuffix(line, " ") {
t.Error("line saved with any trailing Unicode space")
}
}
if hist.li.Len() != historyLen {
t.Error("length doesn't match with values saved")
}
os.Remove(historyFile)
}

86
vendor/github.com/kless/term/readline/read.go generated vendored Normal file
View File

@@ -0,0 +1,86 @@
// Copyright 2010 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package readline
import "github.com/kless/term"
// Default values for prompts.
const (
PS1 = "$ "
PS2 = "> "
)
// keyAction represents the action to run for a key or sequence of keys pressed.
type keyAction int
const (
_ keyAction = iota
_LEFT
_RIGHT
_UP
_DOWN
_HOME
_END
)
// To detect if has been pressed CTRL-C
var ChanCtrlC = make(chan byte)
// To detect if has been pressed CTRL-D
var ChanCtrlD = make(chan byte)
// A Line represents a line in the term.
type Line struct {
ter *term.Terminal
buf *buffer // Text buffer
hist *history // History file
ps1 string // Primary prompt
ps2 string // Command continuations
lenPS1 int // Size of primary prompt
useHistory bool
}
// NewDefaultLine returns a line type using the prompt by default, and setting
// the terminal to raw mode.
// If the history is nil then it is not used.
func NewDefaultLine(hist *history) (*Line, error) {
ter, err := term.New()
if err != nil {
return nil, err
}
if err = ter.RawMode(); err != nil {
return nil, err
}
_, col, err := ter.GetSize()
if err != nil {
return nil, err
}
buf := newBuffer(len(PS1), col)
buf.insertRunes([]rune(PS1))
return &Line{
ter: ter,
buf: buf,
hist: hist,
ps1: PS1,
ps2: PS2,
lenPS1: len(PS1),
useHistory: hasHistory(hist),
}, nil
}
// Restore restores the terminal settings, so it is disabled the raw mode.
func (ln *Line) Restore() error {
return ln.ter.Restore()
}

345
vendor/github.com/kless/term/readline/read_unix.go generated vendored Normal file
View File

@@ -0,0 +1,345 @@
// Copyright 2010 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// +build !plan9,!windows
package readline
import (
"bufio"
"fmt"
"strings"
"github.com/kless/term"
"github.com/kless/term/sys"
)
func init() {
if !term.SupportANSI() {
panic("Your terminal does not support ANSI")
}
}
// NewLine returns a line using both prompts ps1 and ps2, and setting the given
// terminal to raw mode, if were necessary.
// lenAnsi is the length of ANSI codes that the prompt ps1 could have.
// If the history is nil then it is not used.
func NewLine(ter *term.Terminal, ps1, ps2 string, lenAnsi int, hist *history) (*Line, error) {
if ter.Mode()&term.RawMode == 0 { // the raw mode is not set
if err := ter.RawMode(); err != nil {
return nil, err
}
}
lenPS1 := len(ps1) - lenAnsi
_, col, err := ter.GetSize()
if err != nil {
return nil, err
}
buf := newBuffer(lenPS1, col)
buf.insertRunes([]rune(ps1))
return &Line{
ter: ter,
buf: buf,
hist: hist,
ps1: ps1,
ps2: ps2,
lenPS1: lenPS1,
useHistory: hasHistory(hist),
}, nil
}
// Prompt prints the primary prompt.
func (ln *Line) Prompt() (err error) {
if _, err = term.Output.Write(DelLine_CR); err != nil {
return outputError(err.Error())
}
if _, err = fmt.Fprint(term.Output, ln.ps1); err != nil {
return outputError(err.Error())
}
ln.buf.pos, ln.buf.size = ln.lenPS1, ln.lenPS1
return
}
// Read reads charactes from input to write them to output, enabling line editing.
// The errors that could return are to indicate if Ctrl+D was pressed, and for
// both input/output errors.
func (ln *Line) Read() (line string, err error) {
var anotherLine []rune // For lines got from history.
var isHistoryUsed bool // If the history has been accessed.
var action keyAction
in := bufio.NewReader(term.Input) // Read input.
esc := make([]byte, 2) // For escape sequences.
extEsc := make([]byte, 3) // Extended escape sequences.
// Print the primary prompt.
if err = ln.Prompt(); err != nil {
return "", err
}
// == Detect change of window size.
winSize := term.DetectWinSize()
go func() {
for {
select {
case <-winSize.Change: // Wait for.
_, col, err := ln.ter.GetSize()
if err != nil {
ln.buf.columns = col
ln.buf.refresh()
}
}
}
}()
defer winSize.Close()
for ; ; action = 0 {
char, _, err := in.ReadRune()
if err != nil {
return "", inputError(err.Error())
}
_S:
switch char {
default:
if err = ln.buf.insertRune(char); err != nil {
return "", err
}
continue
case sys.K_RETURN:
line = ln.buf.toString()
if ln.useHistory {
ln.hist.Add(line)
}
if _, err = term.Output.Write(CRLF); err != nil {
return "", outputError(err.Error())
}
return strings.TrimSpace(line), nil
case sys.K_TAB:
// TODO: disabled by now
continue
case sys.K_BACK, sys.K_CTRL_H:
if err = ln.buf.deleteCharPrev(); err != nil {
return "", err
}
continue
case sys.K_CTRL_C:
if err = ln.buf.insertRunes(CtrlC); err != nil {
return "", err
}
if _, err = term.Output.Write(CRLF); err != nil {
return "", outputError(err.Error())
}
ChanCtrlC <- 1 //TODO: is really necessary?
if err = ln.Prompt(); err != nil {
return "", err
}
continue
case sys.K_CTRL_D:
if err = ln.buf.insertRunes(CtrlD); err != nil {
return "", err
}
if _, err = term.Output.Write(CRLF); err != nil {
return "", outputError(err.Error())
}
ln.Restore()
ChanCtrlD <- 1
return "", ErrCtrlD
// Escape sequence
case sys.K_ESCAPE: // Ctrl+[ ("\x1b" in hexadecimal, "033" in octal)
if _, err = in.Read(esc); err != nil {
return "", inputError(err.Error())
}
if esc[0] == 79 { // 'O'
switch esc[1] {
case 72: // Home: "\x1b O H"
action = _HOME
break _S
case 70: // End: "\x1b O F"
action = _END
break _S
}
}
if esc[0] == 91 { // '['
switch esc[1] {
case 65: // Up: "\x1b [ A"
if !ln.useHistory {
continue
}
action = _UP
break _S
case 66: // Down: "\x1b [ B"
if !ln.useHistory {
continue
}
action = _DOWN
break _S
case 68: // "\x1b [ D"
action = _LEFT
break _S
case 67: // "\x1b [ C"
action = _RIGHT
break _S
}
// Extended escape.
if esc[1] > 48 && esc[1] < 55 {
if _, err = in.Read(extEsc); err != nil {
return "", inputError(err.Error())
}
if extEsc[0] == 126 { // '~'
switch esc[1] {
//case 50: // Insert: "\x1b [ 2 ~"
case 51: // Delete: "\x1b [ 3 ~"
if err = ln.buf.deleteChar(); err != nil {
return "", err
}
continue
//case 53: // RePag: "\x1b [ 5 ~"
//case 54: // AvPag: "\x1b [ 6 ~"
}
}
if esc[1] == 49 && extEsc[0] == 59 && extEsc[1] == 53 { // "1;5"
switch extEsc[2] {
case 68: // Ctrl+left arrow: "\x1b [ 1 ; 5 D"
// move to last word
if err = ln.buf.wordBackward(); err != nil {
return "", err
}
continue
case 67: // Ctrl+right arrow: "\x1b [ 1 ; 5 C"
// move to next word
if err = ln.buf.wordForward(); err != nil {
return "", err
}
continue
}
}
}
}
continue
case sys.K_CTRL_T: // Swap actual character by the previous one.
if err = ln.buf.swap(); err != nil {
return "", err
}
continue
case sys.K_CTRL_L: // Clear screen.
if _, err = term.Output.Write(DelScreenToUpper); err != nil {
return "", err
}
if err = ln.Prompt(); err != nil {
return "", err
}
continue
case sys.K_CTRL_U: // Delete the whole line.
if err = ln.buf.deleteLine(); err != nil {
return "", err
}
if err = ln.Prompt(); err != nil {
return "", err
}
continue
case sys.K_CTRL_K: // Delete from current to end of line.
if err = ln.buf.deleteToRight(); err != nil {
return "", err
}
continue
case sys.K_CTRL_P: // Up
if !ln.useHistory {
continue
}
action = _UP
case sys.K_CTRL_N: // Down
if !ln.useHistory {
continue
}
action = _DOWN
case sys.K_CTRL_B: // Left
action = _LEFT
case sys.K_CTRL_F: // Right
action = _RIGHT
case sys.K_CTRL_A: // Start of line.
action = _HOME
case sys.K_CTRL_E: // End of line.
action = _END
}
switch action {
case _UP, _DOWN: // Up and down arrow: history
if action == _UP {
anotherLine, err = ln.hist.Prev()
} else {
anotherLine, err = ln.hist.Next()
}
if err != nil {
continue
}
// Update the current history entry before to overwrite it with
// the next one.
// TODO: it has to be removed before of to be saved the history
if !isHistoryUsed {
ln.hist.Add(ln.buf.toString())
}
isHistoryUsed = true
ln.buf.grow(len(anotherLine))
ln.buf.size = len(anotherLine) + ln.buf.promptLen
copy(ln.buf.data[ln.lenPS1:], anotherLine)
if err = ln.buf.refresh(); err != nil {
return "", err
}
continue
case _LEFT:
if _, err = ln.buf.backward(); err != nil {
return "", err
}
continue
case _RIGHT:
if _, err = ln.buf.forward(); err != nil {
return "", err
}
continue
case _HOME:
if err = ln.buf.start(); err != nil {
return "", err
}
continue
case _END:
if _, err = ln.buf.end(); err != nil {
return "", err
}
continue
}
}
}

8
vendor/github.com/kless/term/sys/doc.go generated vendored Normal file
View File

@@ -0,0 +1,8 @@
// Copyright 2013 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// Package sys contains low-level operating system primitives of the term.
package sys

47
vendor/github.com/kless/term/sys/key_unix.go generated vendored Normal file
View File

@@ -0,0 +1,47 @@
// Copyright 2013 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// +build !plan9,!windows
package sys
// Key codes
const (
K_TAB = 0x09 // TAB key
K_BACK = 0x7F // BACKSPACE key
K_RETURN = 0x0D // RETURN key
K_ESCAPE = 0x1B // ESC key
)
// Control+letters key codes.
const (
K_CTRL_A = iota + 0x01
K_CTRL_B
K_CTRL_C
K_CTRL_D
K_CTRL_E
K_CTRL_F
K_CTRL_G
K_CTRL_H
K_CTRL_I
K_CTRL_J
K_CTRL_K
K_CTRL_L
K_CTRL_M
K_CTRL_N
K_CTRL_O
K_CTRL_P
K_CTRL_Q
K_CTRL_R
K_CTRL_S
K_CTRL_T
K_CTRL_U
K_CTRL_V
K_CTRL_W
K_CTRL_X
K_CTRL_Y
K_CTRL_Z
)

14
vendor/github.com/kless/term/sys/sys_bsd.go generated vendored Normal file
View File

@@ -0,0 +1,14 @@
// Copyright 2012 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// +build ignore
package sys
//cgo const TCGETS = TIOCGETA
//cgo const TCSETS = TIOCSETA
//cgo const TCSETSW = TIOCSETAW
//cgo const TCSETSF = TIOCSETAF

11
vendor/github.com/kless/term/sys/sys_linux.go generated vendored Normal file
View File

@@ -0,0 +1,11 @@
// Copyright 2012 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// +build ignore
package sys
//cgo const (TCGETS, TCSETS, TCSETSW, TCSETSF)

119
vendor/github.com/kless/term/sys/sys_unix.go generated vendored Normal file
View File

@@ -0,0 +1,119 @@
// Copyright 2010 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// +build !plan9,!windows
// Reference: man termios ; man tty_ioctl
// Linux file: "asm-generic/termbits.h"
package sys
import (
"syscall"
"unsafe"
)
// int tcgetattr(int fd, struct termios *termios_p)
func Getattr(fd int, state *Termios) (err error) {
_, _, e1 := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd),
uintptr(TCGETS), uintptr(unsafe.Pointer(state)))
if e1 != 0 {
err = e1
}
return
}
// int tcsetattr(int fd, int optional_actions, const struct termios *termios_p)
func Setattr(fd int, action uint, state *Termios) (err error) {
switch action {
case TCSANOW:
action = TCSETS
case TCSADRAIN:
action = TCSETSW
case TCSAFLUSH:
action = TCSETSF
}
_, _, e1 := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd),
uintptr(action), uintptr(unsafe.Pointer(state)))
if e1 != 0 {
err = e1
}
return
}
// GetWinsize gets the winsize struct with the terminal size set by the kernel.
func GetWinsize(fd int, ws *Winsize) (err error) {
_, _, e1 := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd),
uintptr(TIOCGWINSZ), uintptr(unsafe.Pointer(ws)))
if e1 != 0 {
err = e1
}
return
}
// Types
//cgo const (TCSANOW, TCSADRAIN, TCSAFLUSH)
//cgo const TIOCGWINSZ
//cgo type struct_termios
//cgo type struct_winsize
//cgo// c_cc characters
//cgo const (VINTR, VQUIT, VERASE, VKILL, VEOF, VTIME, VMIN, VSTART, VSTOP,
// VSUSP, VEOL, VREPRINT, VDISCARD, VWERASE, VLNEXT, VEOL2)
//cgo// c_iflag bits
//cgo const (IGNBRK, BRKINT, IGNPAR, PARMRK, INPCK, ISTRIP, INLCR, IGNCR, ICRNL,
// IXON, IXANY, IXOFF, IMAXBEL)
//cgo// c_oflag bits
//cgo const (OPOST, ONLCR, OCRNL, ONOCR, ONLRET, NL0, NL1, CR0, CR1, CR2, CR3,
// TAB0, TAB1, TAB2, XTABS, BS0, BS1, FF0, FF1)
//cgo// c_cflag bits
//cgo const (B0, B50, B75, B110, B134, B150, B200, B300,
// B600, B1200, B1800, B2400, B4800, B9600, B19200, B38400, EXTA, EXTB, CSIZE,
// CS5, CS6, CS7, CS8, CSTOPB, CREAD, PARENB, PARODD, HUPCL, CLOCAL,
// B57600, B115200, B230400, CRTSCTS)
//cgo// c_lflag bits
//cgo const (ISIG, ICANON, ECHO, ECHOE, ECHOK, ECHONL, NOFLSH, TOSTOP, ECHOCTL,
// ECHOPRT, ECHOKE, FLUSHO, PENDIN, IEXTEN, EXTPROC)
/*
== FreeBSD has not:
// c_cc characters
VSWTC
// c_iflag bits
(IUCLC, IUTF8)
// c_oflag bits
(OLCUC, OFILL, OFDEL, NLDLY, CRDLY, BSDLY, VTDLY, VT0, VT1, FFDLY)
// c_cflag bits
(CBAUD, CBAUDEX, BOTHER, B500000, B576000,
B1000000, B1152000, B1500000, B2000000, B2500000, B3000000, B3500000,
B4000000, CIBAUD, CMSPAR, IBSHIFT)
// c_lflag bits
XCASE
== NetBSD, besides, has not:
// c_oflag bits
(TABDLY, TAB3)
== OpenBSD, besides, has not:
// c_cflag bits
(B460800, B921600)
*/

151
vendor/github.com/kless/term/sys/z-sys_darwin_386.go generated vendored Normal file
View File

@@ -0,0 +1,151 @@
// go.mkdef -w sys_unix.go sys_bsd.go
// MACHINE GENERATED BY go.mkdef (github.com/kless/gotool/go.mkdef); DO NOT EDIT
//
// Created by cgo -godefs - DO NOT EDIT
// cgo -godefs _z-sys_darwin_386.go
package sys
const (
TCSADRAIN = 0x1
TCSAFLUSH = 0x2
TCSANOW = 0x0
)
const TIOCGWINSZ = 0x40087468
const (
VDISCARD = 0xf
VEOF = 0x0
VEOL = 0x1
VEOL2 = 0x2
VERASE = 0x3
VINTR = 0x8
VKILL = 0x5
VLNEXT = 0xe
VMIN = 0x10
VQUIT = 0x9
VREPRINT = 0x6
VSTART = 0xc
VSTOP = 0xd
VSUSP = 0xa
VTIME = 0x11
VWERASE = 0x4
)
const (
BRKINT = 0x2
ICRNL = 0x100
IGNBRK = 0x1
IGNCR = 0x80
IGNPAR = 0x4
IMAXBEL = 0x2000
INLCR = 0x40
INPCK = 0x10
ISTRIP = 0x20
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
PARMRK = 0x8
)
const (
BS0 = 0x0
BS1 = 0x8000
CR0 = 0x0
CR1 = 0x1000
CR2 = 0x2000
CR3 = 0x3000
FF0 = 0x0
FF1 = 0x4000
NL0 = 0x0
NL1 = 0x100
OCRNL = 0x10
ONLCR = 0x2
ONLRET = 0x40
ONOCR = 0x20
OPOST = 0x1
TAB0 = 0x0
TAB1 = 0x400
TAB2 = 0x800
XTABS = 0xc00
)
const (
B0 = 0x0
B110 = 0x6e
B115200 = 0x1c200
B1200 = 0x4b0
B134 = 0x86
B150 = 0x96
B1800 = 0x708
B19200 = 0x4b00
B200 = 0xc8
B230400 = 0x38400
B2400 = 0x960
B300 = 0x12c
B38400 = 0x9600
B4800 = 0x12c0
B50 = 0x32
B57600 = 0xe100
B600 = 0x258
B75 = 0x4b
B9600 = 0x2580
CLOCAL = 0x8000
CREAD = 0x800
CRTSCTS = 0x30000
CS5 = 0x0
CS6 = 0x100
CS7 = 0x200
CS8 = 0x300
CSIZE = 0x300
CSTOPB = 0x400
EXTA = 0x4b00
EXTB = 0x9600
HUPCL = 0x4000
PARENB = 0x1000
PARODD = 0x2000
)
const (
ECHO = 0x8
ECHOCTL = 0x40
ECHOE = 0x2
ECHOK = 0x4
ECHOKE = 0x1
ECHONL = 0x10
ECHOPRT = 0x20
EXTPROC = 0x800
FLUSHO = 0x800000
ICANON = 0x100
IEXTEN = 0x400
ISIG = 0x80
NOFLSH = 0x80000000
PENDIN = 0x20000000
TOSTOP = 0x400000
)
const TCGETS = 0x402c7413
const TCSETS = 0x802c7414
const TCSETSW = 0x802c7415
const TCSETSF = 0x802c7416
type termios struct {
Iflag uint32
Oflag uint32
Cflag uint32
Lflag uint32
Cc [20]uint8
Ispeed uint32
Ospeed uint32
}
type winsize struct {
Row uint16
Col uint16
Xpixel uint16
Ypixel uint16
}

152
vendor/github.com/kless/term/sys/z-sys_darwin_amd64.go generated vendored Normal file
View File

@@ -0,0 +1,152 @@
// go.mkdef -w sys_unix.go sys_bsd.go
// MACHINE GENERATED BY go.mkdef (github.com/kless/gotool/go.mkdef); DO NOT EDIT
//
// Created by cgo -godefs - DO NOT EDIT
// cgo -godefs _z-sys_darwin_amd64.go
package sys
const (
TCSADRAIN = 0x1
TCSAFLUSH = 0x2
TCSANOW = 0x0
)
const TIOCGWINSZ = 0x40087468
const (
VDISCARD = 0xf
VEOF = 0x0
VEOL = 0x1
VEOL2 = 0x2
VERASE = 0x3
VINTR = 0x8
VKILL = 0x5
VLNEXT = 0xe
VMIN = 0x10
VQUIT = 0x9
VREPRINT = 0x6
VSTART = 0xc
VSTOP = 0xd
VSUSP = 0xa
VTIME = 0x11
VWERASE = 0x4
)
const (
BRKINT = 0x2
ICRNL = 0x100
IGNBRK = 0x1
IGNCR = 0x80
IGNPAR = 0x4
IMAXBEL = 0x2000
INLCR = 0x40
INPCK = 0x10
ISTRIP = 0x20
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
PARMRK = 0x8
)
const (
BS0 = 0x0
BS1 = 0x8000
CR0 = 0x0
CR1 = 0x1000
CR2 = 0x2000
CR3 = 0x3000
FF0 = 0x0
FF1 = 0x4000
NL0 = 0x0
NL1 = 0x100
OCRNL = 0x10
ONLCR = 0x2
ONLRET = 0x40
ONOCR = 0x20
OPOST = 0x1
TAB0 = 0x0
TAB1 = 0x400
TAB2 = 0x800
XTABS = 0xc00
)
const (
B0 = 0x0
B110 = 0x6e
B115200 = 0x1c200
B1200 = 0x4b0
B134 = 0x86
B150 = 0x96
B1800 = 0x708
B19200 = 0x4b00
B200 = 0xc8
B230400 = 0x38400
B2400 = 0x960
B300 = 0x12c
B38400 = 0x9600
B4800 = 0x12c0
B50 = 0x32
B57600 = 0xe100
B600 = 0x258
B75 = 0x4b
B9600 = 0x2580
CLOCAL = 0x8000
CREAD = 0x800
CRTSCTS = 0x30000
CS5 = 0x0
CS6 = 0x100
CS7 = 0x200
CS8 = 0x300
CSIZE = 0x300
CSTOPB = 0x400
EXTA = 0x4b00
EXTB = 0x9600
HUPCL = 0x4000
PARENB = 0x1000
PARODD = 0x2000
)
const (
ECHO = 0x8
ECHOCTL = 0x40
ECHOE = 0x2
ECHOK = 0x4
ECHOKE = 0x1
ECHONL = 0x10
ECHOPRT = 0x20
EXTPROC = 0x800
FLUSHO = 0x800000
ICANON = 0x100
IEXTEN = 0x400
ISIG = 0x80
NOFLSH = 0x80000000
PENDIN = 0x20000000
TOSTOP = 0x400000
)
const TCGETS = 0x40487413
const TCSETS = 0x80487414
const TCSETSW = 0x80487415
const TCSETSF = 0x80487416
type Termios struct {
Iflag uint64
Oflag uint64
Cflag uint64
Lflag uint64
Cc [20]uint8
Pad_cgo_0 [4]byte
Ispeed uint64
Ospeed uint64
}
type Winsize struct {
Row uint16
Col uint16
Xpixel uint16
Ypixel uint16
}

151
vendor/github.com/kless/term/sys/z-sys_freebsd.go generated vendored Normal file
View File

@@ -0,0 +1,151 @@
// go.mkdef -w sys_unix.go sys_bsd.go
// MACHINE GENERATED BY go.mkdef (github.com/kless/gotool/go.mkdef); DO NOT EDIT
//
// Created by cgo -godefs - DO NOT EDIT
// cgo -godefs _z-sys_freebsd_amd64.go
package sys
const (
TCSADRAIN = 0x1
TCSAFLUSH = 0x2
TCSANOW = 0x0
)
const TIOCGWINSZ = 0x40087468
const (
VDISCARD = 0xf
VEOF = 0x0
VEOL = 0x1
VEOL2 = 0x2
VERASE = 0x3
VINTR = 0x8
VKILL = 0x5
VLNEXT = 0xe
VMIN = 0x10
VQUIT = 0x9
VREPRINT = 0x6
VSTART = 0xc
VSTOP = 0xd
VSUSP = 0xa
VTIME = 0x11
VWERASE = 0x4
)
const (
BRKINT = 0x2
ICRNL = 0x100
IGNBRK = 0x1
IGNCR = 0x80
IGNPAR = 0x4
IMAXBEL = 0x2000
INLCR = 0x40
INPCK = 0x10
ISTRIP = 0x20
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
PARMRK = 0x8
)
const (
BS0 = 0x0
BS1 = 0x8000
CR0 = 0x0
CR1 = 0x1000
CR2 = 0x2000
CR3 = 0x3000
FF0 = 0x0
FF1 = 0x4000
NL0 = 0x0
NL1 = 0x100
OCRNL = 0x10
ONLCR = 0x2
ONLRET = 0x40
ONOCR = 0x20
OPOST = 0x1
TAB0 = 0x0
TAB1 = 0x400
TAB2 = 0x800
XTABS = 0xc00
)
const (
B0 = 0x0
B110 = 0x6e
B115200 = 0x1c200
B1200 = 0x4b0
B134 = 0x86
B150 = 0x96
B1800 = 0x708
B19200 = 0x4b00
B200 = 0xc8
B230400 = 0x38400
B2400 = 0x960
B300 = 0x12c
B38400 = 0x9600
B4800 = 0x12c0
B50 = 0x32
B57600 = 0xe100
B600 = 0x258
B75 = 0x4b
B9600 = 0x2580
CLOCAL = 0x8000
CREAD = 0x800
CRTSCTS = 0x30000
CS5 = 0x0
CS6 = 0x100
CS7 = 0x200
CS8 = 0x300
CSIZE = 0x300
CSTOPB = 0x400
EXTA = 0x4b00
EXTB = 0x9600
HUPCL = 0x4000
PARENB = 0x1000
PARODD = 0x2000
)
const (
ECHO = 0x8
ECHOCTL = 0x40
ECHOE = 0x2
ECHOK = 0x4
ECHOKE = 0x1
ECHONL = 0x10
ECHOPRT = 0x20
EXTPROC = 0x800
FLUSHO = 0x800000
ICANON = 0x100
IEXTEN = 0x400
ISIG = 0x80
NOFLSH = 0x80000000
PENDIN = 0x20000000
TOSTOP = 0x400000
)
const TCGETS = 0x402c7413
const TCSETS = 0x802c7414
const TCSETSW = 0x802c7415
const TCSETSF = 0x802c7416
type Termios struct {
Iflag uint32
Oflag uint32
Cflag uint32
Lflag uint32
Cc [20]uint8
Ispeed uint32
Ospeed uint32
}
type Winsize struct {
Row uint16
Col uint16
Xpixel uint16
Ypixel uint16
}

149
vendor/github.com/kless/term/sys/z-sys_linux.go generated vendored Normal file
View File

@@ -0,0 +1,149 @@
// go.mkdef -w sys_unix.go sys_linux.go
// MACHINE GENERATED BY go.mkdef (github.com/kless/gotool/go.mkdef); DO NOT EDIT
//
// Created by cgo -godefs - DO NOT EDIT
// cgo -godefs _z-sys_linux_amd64.go
package sys
const (
TCSADRAIN = 0x1
TCSAFLUSH = 0x2
TCSANOW = 0x0
)
const TIOCGWINSZ = 0x5413
const (
VDISCARD = 0xd
VEOF = 0x4
VEOL = 0xb
VEOL2 = 0x10
VERASE = 0x2
VINTR = 0x0
VKILL = 0x3
VLNEXT = 0xf
VMIN = 0x6
VQUIT = 0x1
VREPRINT = 0xc
VSTART = 0x8
VSTOP = 0x9
VSUSP = 0xa
VTIME = 0x5
VWERASE = 0xe
)
const (
BRKINT = 0x2
ICRNL = 0x100
IGNBRK = 0x1
IGNCR = 0x80
IGNPAR = 0x4
IMAXBEL = 0x2000
INLCR = 0x40
INPCK = 0x10
ISTRIP = 0x20
IXANY = 0x800
IXOFF = 0x1000
IXON = 0x400
PARMRK = 0x8
)
const (
BS0 = 0x0
BS1 = 0x2000
CR0 = 0x0
CR1 = 0x200
CR2 = 0x400
CR3 = 0x600
FF0 = 0x0
FF1 = 0x8000
NL0 = 0x0
NL1 = 0x100
OCRNL = 0x8
ONLCR = 0x4
ONLRET = 0x20
ONOCR = 0x10
OPOST = 0x1
TAB0 = 0x0
TAB1 = 0x800
TAB2 = 0x1000
XTABS = 0x1800
)
const (
B0 = 0x0
B110 = 0x3
B115200 = 0x1002
B1200 = 0x9
B134 = 0x4
B150 = 0x5
B1800 = 0xa
B19200 = 0xe
B200 = 0x6
B230400 = 0x1003
B2400 = 0xb
B300 = 0x7
B38400 = 0xf
B4800 = 0xc
B50 = 0x1
B57600 = 0x1001
B600 = 0x8
B75 = 0x2
B9600 = 0xd
CLOCAL = 0x800
CREAD = 0x80
CRTSCTS = 0x80000000
CS5 = 0x0
CS6 = 0x10
CS7 = 0x20
CS8 = 0x30
CSIZE = 0x30
CSTOPB = 0x40
EXTA = 0xe
EXTB = 0xf
HUPCL = 0x400
PARENB = 0x100
PARODD = 0x200
)
const (
ECHO = 0x8
ECHOCTL = 0x200
ECHOE = 0x10
ECHOK = 0x20
ECHOKE = 0x800
ECHONL = 0x40
ECHOPRT = 0x400
EXTPROC = 0x10000
FLUSHO = 0x1000
ICANON = 0x2
IEXTEN = 0x8000
ISIG = 0x1
NOFLSH = 0x80
PENDIN = 0x4000
TOSTOP = 0x100
)
const (
TCGETS = 0x5401
TCSETS = 0x5402
TCSETSF = 0x5404
TCSETSW = 0x5403
)
type Termios struct {
Iflag uint32
Oflag uint32
Cflag uint32
Lflag uint32
Line uint8
Cc [19]uint8
}
type Winsize struct {
Row uint16
Col uint16
Xpixel uint16
Ypixel uint16
}

151
vendor/github.com/kless/term/sys/z-sys_netbsd.go generated vendored Normal file
View File

@@ -0,0 +1,151 @@
// go.mkdef -w sys_unix.go sys_bsd.go
// MACHINE GENERATED BY go.mkdef (github.com/kless/gotool/go.mkdef); DO NOT EDIT
//
// Created by cgo -godefs - DO NOT EDIT
// cgo -godefs _z-sys_netbsd_amd64.go
package sys
const (
TCSADRAIN = 0x1
TCSAFLUSH = 0x2
TCSANOW = 0x0
)
const TIOCGWINSZ = 0x40087468
const (
VDISCARD = 0xf
VEOF = 0x0
VEOL = 0x1
VEOL2 = 0x2
VERASE = 0x3
VINTR = 0x8
VKILL = 0x5
VLNEXT = 0xe
VMIN = 0x10
VQUIT = 0x9
VREPRINT = 0x6
VSTART = 0xc
VSTOP = 0xd
VSUSP = 0xa
VTIME = 0x11
VWERASE = 0x4
)
const (
BRKINT = 0x2
ICRNL = 0x100
IGNBRK = 0x1
IGNCR = 0x80
IGNPAR = 0x4
IMAXBEL = 0x2000
INLCR = 0x40
INPCK = 0x10
ISTRIP = 0x20
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
PARMRK = 0x8
)
const (
BS0 = 0x0
BS1 = 0x8000
CR0 = 0x0
CR1 = 0x1000
CR2 = 0x2000
CR3 = 0x3000
FF0 = 0x0
FF1 = 0x4000
NL0 = 0x0
NL1 = 0x100
OCRNL = 0x10
ONLCR = 0x2
ONLRET = 0x40
ONOCR = 0x20
OPOST = 0x1
TAB0 = 0x0
TAB1 = 0x400
TAB2 = 0x800
XTABS = 0xc00
)
const (
B0 = 0x0
B110 = 0x6e
B115200 = 0x1c200
B1200 = 0x4b0
B134 = 0x86
B150 = 0x96
B1800 = 0x708
B19200 = 0x4b00
B200 = 0xc8
B230400 = 0x38400
B2400 = 0x960
B300 = 0x12c
B38400 = 0x9600
B4800 = 0x12c0
B50 = 0x32
B57600 = 0xe100
B600 = 0x258
B75 = 0x4b
B9600 = 0x2580
CLOCAL = 0x8000
CREAD = 0x800
CRTSCTS = 0x10000
CS5 = 0x0
CS6 = 0x100
CS7 = 0x200
CS8 = 0x300
CSIZE = 0x300
CSTOPB = 0x400
EXTA = 0x4b00
EXTB = 0x9600
HUPCL = 0x4000
PARENB = 0x1000
PARODD = 0x2000
)
const (
ECHO = 0x8
ECHOCTL = 0x40
ECHOE = 0x2
ECHOK = 0x4
ECHOKE = 0x1
ECHONL = 0x10
ECHOPRT = 0x20
EXTPROC = 0x800
FLUSHO = 0x800000
ICANON = 0x100
IEXTEN = 0x400
ISIG = 0x80
NOFLSH = 0x80000000
PENDIN = 0x20000000
TOSTOP = 0x400000
)
const TCGETS = 0x402c7413
const TCSETS = 0x802c7414
const TCSETSW = 0x802c7415
const TCSETSF = 0x802c7416
type Termios struct {
Iflag uint32
Oflag uint32
Cflag uint32
Lflag uint32
Cc [20]uint8
Ispeed int32
Ospeed int32
}
type Winsize struct {
Row uint16
Col uint16
Xpixel uint16
Ypixel uint16
}

151
vendor/github.com/kless/term/sys/z-sys_openbsd.go generated vendored Normal file
View File

@@ -0,0 +1,151 @@
// go.mkdef -w sys_unix.go sys_bsd.go
// MACHINE GENERATED BY go.mkdef (github.com/kless/gotool/go.mkdef); DO NOT EDIT
//
// Created by cgo -godefs - DO NOT EDIT
// cgo -godefs _z-sys_openbsd_amd64.go
package sys
const (
TCSADRAIN = 0x1
TCSAFLUSH = 0x2
TCSANOW = 0x0
)
const TIOCGWINSZ = 0x40087468
const (
VDISCARD = 0xf
VEOF = 0x0
VEOL = 0x1
VEOL2 = 0x2
VERASE = 0x3
VINTR = 0x8
VKILL = 0x5
VLNEXT = 0xe
VMIN = 0x10
VQUIT = 0x9
VREPRINT = 0x6
VSTART = 0xc
VSTOP = 0xd
VSUSP = 0xa
VTIME = 0x11
VWERASE = 0x4
)
const (
BRKINT = 0x2
ICRNL = 0x100
IGNBRK = 0x1
IGNCR = 0x80
IGNPAR = 0x4
IMAXBEL = 0x2000
INLCR = 0x40
INPCK = 0x10
ISTRIP = 0x20
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
PARMRK = 0x8
)
const (
BS0 = 0x0
BS1 = 0x8000
CR0 = 0x0
CR1 = 0x1000
CR2 = 0x2000
CR3 = 0x3000
FF0 = 0x0
FF1 = 0x4000
NL0 = 0x0
NL1 = 0x100
OCRNL = 0x10
ONLCR = 0x2
ONLRET = 0x80
ONOCR = 0x40
OPOST = 0x1
TAB0 = 0x0
TAB1 = 0x400
TAB2 = 0x800
XTABS = 0xc00
)
const (
B0 = 0x0
B110 = 0x6e
B115200 = 0x1c200
B1200 = 0x4b0
B134 = 0x86
B150 = 0x96
B1800 = 0x708
B19200 = 0x4b00
B200 = 0xc8
B230400 = 0x38400
B2400 = 0x960
B300 = 0x12c
B38400 = 0x9600
B4800 = 0x12c0
B50 = 0x32
B57600 = 0xe100
B600 = 0x258
B75 = 0x4b
B9600 = 0x2580
CLOCAL = 0x8000
CREAD = 0x800
CRTSCTS = 0x10000
CS5 = 0x0
CS6 = 0x100
CS7 = 0x200
CS8 = 0x300
CSIZE = 0x300
CSTOPB = 0x400
EXTA = 0x4b00
EXTB = 0x9600
HUPCL = 0x4000
PARENB = 0x1000
PARODD = 0x2000
)
const (
ECHO = 0x8
ECHOCTL = 0x40
ECHOE = 0x2
ECHOK = 0x4
ECHOKE = 0x1
ECHONL = 0x10
ECHOPRT = 0x20
EXTPROC = 0x800
FLUSHO = 0x800000
ICANON = 0x100
IEXTEN = 0x400
ISIG = 0x80
NOFLSH = 0x80000000
PENDIN = 0x20000000
TOSTOP = 0x400000
)
const TCGETS = 0x402c7413
const TCSETS = 0x802c7414
const TCSETSW = 0x802c7415
const TCSETSF = 0x802c7416
type Termios struct {
Iflag uint32
Oflag uint32
Cflag uint32
Lflag uint32
Cc [20]uint8
Ispeed int32
Ospeed int32
}
type Winsize struct {
Row uint16
Col uint16
Xpixel uint16
Ypixel uint16
}

35
vendor/github.com/kless/term/term.go generated vendored Normal file
View File

@@ -0,0 +1,35 @@
// Copyright 2012 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package term
// If it is true, at reading a password it shows characters shadowed by each key
// pressed.
var PasswordShadowed bool
var (
_CTRL_C = []byte{'^', 'C', '\r', '\n'}
_RETURN = []byte{'\r', '\n'}
_SHADOW_CHAR = []byte{'*'}
)
// * * *
type modeType int
const (
_ modeType = 1 << iota
RawMode
EchoMode
CharMode
PasswordMode
OtherMode
)
// Mode returns the mode set in the terminal, if any.
func (t *Terminal) Mode() modeType {
return t.mode
}

185
vendor/github.com/kless/term/term_unix.go generated vendored Normal file
View File

@@ -0,0 +1,185 @@
// Copyright 2010 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// +build !plan9,!windows
package term
import (
"io"
"os"
"syscall"
"github.com/kless/term/sys"
)
// Default values for input and output.
var (
InputFD int = syscall.Stdin
Input io.Reader = os.Stdin
Output io.Writer = os.Stdout
)
// A Terminal represents a general terminal interface.
type Terminal struct {
mode modeType
// Contain the state of a terminal, enabling to restore the original settings
oldState, lastState sys.Termios
// Window size
size sys.Winsize
fd int // File descriptor
}
// New creates a new terminal interface in the file descriptor InputFD.
func New() (*Terminal, error) {
var t Terminal
// Get the actual state
if err := sys.Getattr(InputFD, &t.lastState); err != nil {
return nil, os.NewSyscallError("sys.Getattr", err)
}
t.oldState = t.lastState // the actual state is copied to another one
t.fd = InputFD
return &t, nil
}
// == Restore
//
type State struct {
wrap sys.Termios
}
// OriginalState returns the terminal's original state.
func (t *Terminal) OriginalState() State {
return State{t.oldState}
}
// Restore restores the original settings for the term.
func (t *Terminal) Restore() error {
if t.mode != 0 {
if err := sys.Setattr(t.fd, sys.TCSANOW, &t.oldState); err != nil {
return os.NewSyscallError("sys.Setattr", err)
}
t.lastState = t.oldState
t.mode = 0
}
return nil
}
// Restore restores the settings from State.
func Restore(fd int, st State) error {
if err := sys.Setattr(fd, sys.TCSANOW, &st.wrap); err != nil {
return os.NewSyscallError("sys.Setattr", err)
}
return nil
}
// == Modes
//
// RawMode sets the terminal to something like the "raw" mode. Input is available
// character by character, echoing is disabled, and all special processing of
// terminal input and output characters is disabled.
//
// NOTE: in tty "raw mode", CR+LF is used for output and CR is used for input.
func (t *Terminal) RawMode() error {
// Input modes - no break, no CR to NL, no NL to CR, no carriage return,
// no strip char, no start/stop output control, no parity check.
t.lastState.Iflag &^= (sys.BRKINT | sys.IGNBRK | sys.ICRNL | sys.INLCR |
sys.IGNCR | sys.ISTRIP | sys.IXON | sys.PARMRK)
// Output modes - disable post processing.
t.lastState.Oflag &^= sys.OPOST
// Local modes - echoing off, canonical off, no extended functions,
// no signal chars (^Z,^C).
t.lastState.Lflag &^= (sys.ECHO | sys.ECHONL | sys.ICANON | sys.IEXTEN | sys.ISIG)
// Control modes - set 8 bit chars.
t.lastState.Cflag &^= (sys.CSIZE | sys.PARENB)
t.lastState.Cflag |= sys.CS8
// Control chars - set return condition: min number of bytes and timer.
// We want read to return every single byte, without timeout.
t.lastState.Cc[sys.VMIN] = 1 // Read returns when one char is available.
t.lastState.Cc[sys.VTIME] = 0
// Put the terminal in raw mode after flushing
if err := sys.Setattr(t.fd, sys.TCSAFLUSH, &t.lastState); err != nil {
return os.NewSyscallError("sys.Setattr", err)
}
t.mode |= RawMode
return nil
}
// EchoMode turns the echo mode.
func (t *Terminal) EchoMode(echo bool) error {
if !echo {
//t.lastState.Lflag &^= (sys.ECHO | sys.ECHOE | sys.ECHOK | sys.ECHONL)
t.lastState.Lflag &^= sys.ECHO
} else {
//t.lastState.Lflag |= (sys.ECHO | sys.ECHOE | sys.ECHOK | sys.ECHONL)
t.lastState.Lflag |= sys.ECHO
}
if err := sys.Setattr(t.fd, sys.TCSANOW, &t.lastState); err != nil {
return os.NewSyscallError("sys.Setattr", err)
}
if echo {
t.mode |= EchoMode
} else {
t.mode &^= EchoMode
}
return nil
}
// CharMode sets the terminal to single-character mode.
func (t *Terminal) CharMode() error {
// Disable canonical mode, and set buffer size to 1 byte.
t.lastState.Lflag &^= sys.ICANON
t.lastState.Cc[sys.VTIME] = 0
t.lastState.Cc[sys.VMIN] = 1
if err := sys.Setattr(t.fd, sys.TCSANOW, &t.lastState); err != nil {
return os.NewSyscallError("sys.Setattr", err)
}
t.mode |= CharMode
return nil
}
// SetMode sets the terminal attributes given by state.
// Warning: The use of this function is not cross-system.
func (t *Terminal) SetMode(state sys.Termios) error {
if err := sys.Setattr(t.fd, sys.TCSANOW, &state); err != nil {
return os.NewSyscallError("sys.Setattr", err)
}
t.lastState = state
t.mode |= OtherMode
return nil
}
// == Utility
//
// Fd returns the file descriptor referencing the term.
func (t *Terminal) Fd() int {
return t.fd
}
// GetSize returns the size of the term.
func (t *Terminal) GetSize() (row, column int, err error) {
if err = sys.GetWinsize(syscall.Stdout, &t.size); err != nil {
return
}
return int(t.size.Row), int(t.size.Col), nil
}

347
vendor/github.com/kless/term/test/runtest.go generated vendored Normal file
View File

@@ -0,0 +1,347 @@
// Copyright 2010 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// Package test checks the functions that depend of the standard input,
// which is changed by `go test` to the standard error.
//
// Flags:
//
// -dbg-key=false: debug: print the decimal code at pressing a key
// -dbg-winsize=false: debug: to know how many signals are sent at maximizing a window
// -iact=false: interactive mode
// -t=2: time in seconds to wait to write in automatic mode
package main
import (
"bufio"
"flag"
"fmt"
"io"
"log"
"os"
"path/filepath"
"strconv"
"strings"
"time"
"github.com/kless/term"
"github.com/kless/term/readline"
)
var (
IsInteractive = flag.Bool("iact", false, "interactive mode")
Time = flag.Uint("t", 2, "time in seconds to wait to write in automatic mode")
DebugWinSize = flag.Bool("dbg-winsize", false, "debug: to know how many signals are sent at maximizing a window")
DebugKey = flag.Bool("dbg-key", false, "debug: print the decimal code at pressing a key")
pr *io.PipeReader
pw *io.PipeWriter
)
func main() {
flag.Parse()
log.SetFlags(0)
log.SetPrefix("--- FAIL: ")
if *DebugKey {
Lookup()
return
}
if *DebugWinSize {
win := term.DetectWinSize()
defer win.Close()
fmt.Println("[Resize the window: should print a number every time]")
for i := 0; i < 7; i++ {
select {
case <-win.Change:
fmt.Printf("%d ", i)
case <-time.After(13 * time.Second):
fmt.Print("\ntimed out\n")
return
}
}
return
}
if !*IsInteractive {
pr, pw = io.Pipe()
term.Input = pr
}
TestCharMode()
TestEchoMode()
if *IsInteractive {
TestPassword()
}
TestEditLine()
if *IsInteractive {
TestDetectSize()
}
}
// TestCharMode tests terminal set to single character mode.
func TestCharMode() {
fmt.Print("\n=== RUN TestCharMode\n")
ter, _ := term.New()
defer func() {
if err := ter.Restore(); err != nil {
log.Print(err)
}
}()
if err := ter.CharMode(); err != nil {
log.Print("expected to set character mode:", err)
return
}
buf := bufio.NewReaderSize(term.Input, 4)
reply := []string{"a", "€", "~"}
if !*IsInteractive {
go func() {
for _, r := range reply {
time.Sleep(time.Duration(*Time) * time.Second)
fmt.Fprint(pw, r)
}
}()
}
for i := 1; ; i++ {
fmt.Print(" Press key: ")
rune, _, err := buf.ReadRune()
if err != nil {
log.Print(err)
return
}
fmt.Printf("\n pressed: %q\n", string(rune))
if *IsInteractive || i == len(reply) {
break
}
}
}
func TestEchoMode() {
fmt.Print("\n=== RUN TestEchoMode\n")
ter, _ := term.New()
defer func() {
if err := ter.Restore(); err != nil {
log.Print(err)
}
}()
if err := ter.EchoMode(false); err != nil {
log.Print("expected to set echo mode:", err)
return
}
fmt.Print(" + Mode to echo off\n")
buf := bufio.NewReader(term.Input)
if !*IsInteractive {
go func() {
time.Sleep(time.Duration(*Time) * time.Second)
fmt.Fprint(pw, "Karma\n")
}()
}
fmt.Print(" Write (enter to finish): ")
line, err := buf.ReadString('\n')
if err != nil {
log.Print(err)
return
}
fmt.Printf("\n entered: %q\n", line)
ter.EchoMode(true)
fmt.Print("\n + Mode to echo on\n")
if !*IsInteractive {
go func() {
time.Sleep(time.Duration(*Time) * time.Second)
fmt.Fprint(pw, "hotel\n")
}()
}
fmt.Print(" Write (enter to finish): ")
line, _ = buf.ReadString('\n')
if !*IsInteractive {
fmt.Println()
}
fmt.Printf(" entered: %q\n", line)
}
func TestPassword() {
fmt.Print("\n=== RUN TestPassword\n")
fmt.Print(" Password (no echo): ")
pass := make([]byte, 8)
n, err := term.ReadPassword(pass)
if err != nil {
log.Print(err)
return
}
fmt.Printf(" entered: %q\n number: %d\n", pass, n)
term.PasswordShadowed = true
fmt.Print("\n Password (shadow character): ")
pass = make([]byte, 8)
n, err = term.ReadPassword(pass)
if err != nil {
log.Print(err)
return
}
fmt.Printf(" entered: %q\n number: %d\n", pass, n)
}
func TestDetectSize() {
fmt.Print("\n=== RUN TestDetectSize\n")
ter, _ := term.New()
defer func() {
if err := ter.Restore(); err != nil {
log.Print(err)
}
}()
row, col, err := ter.GetSize()
if err != nil {
panic(err)
}
winSize := term.DetectWinSize()
fmt.Println("[Change the size of the terminal]")
// I want to finish the test.
go func() {
time.Sleep(10 * time.Second)
winSize.Change <- true
}()
<-winSize.Change
winSize.Close()
row2, col2, err := ter.GetSize()
if err != nil {
panic(err)
}
if row == row2 && col == col2 {
log.Print("the terminal size got the same value")
return
}
}
// Package readline
func TestEditLine() {
fmt.Println("\n=== RUN TestEditLine")
tempHistory := filepath.Join(os.TempDir(), "test_readline")
hist, err := readline.NewHistory(tempHistory)
if err != nil {
log.Print(err)
return
}
defer func() {
if err = os.Remove(tempHistory); err != nil {
log.Print(err)
}
}()
hist.Load()
fmt.Printf("Press ^D to exit\n\n")
ln, err := readline.NewDefaultLine(hist)
if err != nil {
log.Print(err)
return
}
defer func() {
if err = ln.Restore(); err != nil {
log.Print(err)
}
}()
if !*IsInteractive {
reply := []string{
"I have heard that the night is all magic",
"and that a goblin invites you to dream",
}
go func() {
for _, r := range reply {
time.Sleep(time.Duration(*Time) * time.Second)
fmt.Fprintf(pw, "%s\r\n", r)
}
time.Sleep(time.Duration(*Time) * time.Second)
pw.Write([]byte{4}) // Ctrl+D
}()
}
for {
if _, err = ln.Read(); err != nil {
if err == readline.ErrCtrlD {
hist.Save()
err = nil
} else {
log.Print(err)
return
}
break
}
}
}
// Lookup prints the decimal code at pressing a key.
func Lookup() {
ter, err := term.New()
if err != nil {
log.Print(err)
return
}
defer func() {
if err = ter.Restore(); err != nil {
log.Print(err)
}
}()
if err = ter.RawMode(); err != nil {
log.Print(err)
return
} else {
buf := bufio.NewReader(term.Input)
runes := make([]int32, 0)
chars := make([]string, 0)
fmt.Print("[Press Enter to exit]\r\n")
fmt.Print("> ")
L:
for {
rune_, _, err := buf.ReadRune()
if err != nil {
log.Print(err)
continue
}
switch rune_ {
default:
fmt.Print(rune_, " ")
runes = append(runes, rune_)
char := strconv.QuoteRune(rune_)
chars = append(chars, char[1:len(char)-1])
continue
case 13:
fmt.Printf("\r\n\r\n%v\r\n\"%s\"\r\n", runes, strings.Join(chars, " "))
break L
}
}
}
}

86
vendor/github.com/kless/term/unix_test.go generated vendored Normal file
View File

@@ -0,0 +1,86 @@
// Copyright 2010 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// +build !plan9,!windows
package term
import (
"syscall"
"testing"
)
func init() {
InputFD = syscall.Stderr
}
func TestRawMode(t *testing.T) {
ter, err := New()
if err != nil {
t.Fatal(err)
}
oldState := ter.oldState
if err = ter.RawMode(); err != nil {
t.Error("expected set raw mode:", err)
}
if err = ter.Restore(); err != nil {
t.Error("expected to restore:", err)
}
lastState := ter.lastState
if oldState.Iflag != lastState.Iflag ||
oldState.Oflag != lastState.Oflag ||
oldState.Cflag != lastState.Cflag ||
oldState.Lflag != lastState.Lflag {
t.Error("expected to restore all settings")
}
// Restore from a saved state
ter, _ = New()
state := ter.OriginalState()
if err = Restore(InputFD, state); err != nil {
t.Error("expected to restore from saved state:", err)
}
}
func TestInformation(t *testing.T) {
if !SupportANSI() {
t.Error("expected to support this terminal")
}
if !IsTerminal(InputFD) {
t.Error("expected to be a terminal")
}
/*ter, _ := New()
if _, err := TTYName(ter.fd); err != nil {
t.Error("expected to get the terminal name", err)
}
ter.Restore()*/
}
func TestSize(t *testing.T) {
ter, _ := New()
defer ter.Restore()
row, col, err := ter.GetSize()
if err != nil {
t.Error(err)
return
}
if row == 0 || col == 0 {
t.Error("expected to get size")
}
//rowE, colE := GetSizeFromEnv()
//if rowE == 0 || colE == 0 {
//t.Error("expected to get size from environment")
//}
}

185
vendor/github.com/kless/term/util_unix.go generated vendored Normal file
View File

@@ -0,0 +1,185 @@
// Copyright 2010 Jonas mg
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// +build !plan9,!windows
package term
//#include <unistd.h>
//import "C"
import (
"bytes"
"math/rand"
"os"
"os/signal"
"syscall"
"time"
"unicode"
"unicode/utf8"
"github.com/kless/term/sys"
)
var shellsWithoutANSI = []string{"dumb", "cons25"}
// SupportANSI checks if the terminal supports ANSI escape sequences.
func SupportANSI() bool {
term := os.Getenv("TERM")
if term == "" {
return false
}
for _, v := range shellsWithoutANSI {
if v == term {
return false
}
}
return true
}
// char *ttyname(int fd)
// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/ttyname.c;hb=HEAD
// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/posix/ttyname.c;hb=HEAD
// GetName gets the name of a term.
/*func GetName(fd int) (string, error) {
name, errno := C.ttyname(C.int(fd))
if errno != nil {
return "", fmt.Errorf("term.TTYName: %s", errno)
}
return C.GoString(name), nil
}*/
// int isatty(int fd)
// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/posix/isatty.c;hb=HEAD
// IsTerminal returns true if the file descriptor is a term.
func IsTerminal(fd int) bool {
return sys.Getattr(fd, &sys.Termios{}) == nil
}
// ReadPassword reads characters from the input until press Enter or until
// fill in the given slice.
//
// Only reads characters that include letters, marks, numbers, punctuation,
// and symbols from Unicode categories L, M, N, P, S, besides of the
// ASCII space character.
// Ctrl-C interrumpts, and backspace removes the last character read.
//
// Returns the number of bytes read.
func ReadPassword(password []byte) (n int, err error) {
ter, err := New()
if err != nil {
return 0, err
}
defer func() {
err2 := ter.Restore()
if err2 != nil && err == nil {
err = err2
}
}()
if err = ter.RawMode(); err != nil {
return 0, err
}
key := make([]byte, 4) // In-memory representation of a rune.
lenPassword := 0 // Number of characters read.
if PasswordShadowed {
rand.Seed(int64(time.Now().Nanosecond()))
}
L:
for {
n, err = syscall.Read(InputFD, key)
if err != nil {
return 0, err
}
if n == 1 {
switch key[0] {
case sys.K_RETURN:
break L
case sys.K_BACK:
if lenPassword != 0 {
lenPassword--
password[lenPassword] = 0
}
continue
case sys.K_CTRL_C:
syscall.Write(syscall.Stdout, _CTRL_C)
// Clean data stored, if any.
for i, v := range password {
if v == 0 {
break
}
password[i] = 0
}
return 0, nil
}
}
char, _ := utf8.DecodeRune(key)
if unicode.IsPrint(char) {
password[lenPassword] = key[0] // Only want a character by key
lenPassword++
if PasswordShadowed {
syscall.Write(syscall.Stdout, bytes.Repeat(_SHADOW_CHAR, rand.Intn(3)+1))
}
if lenPassword == len(password) {
break
}
}
}
syscall.Write(syscall.Stdout, _RETURN)
n = lenPassword
return
}
// WinSize represents a channel, Change, to know when the window size has
// changed through function DetectWinSize.
type WinSize struct {
Change chan bool
quit chan bool
wait chan bool
}
// DetectWinSize caughts a signal named SIGWINCH whenever the window size changes,
// being indicated in channel `WinSize.Change`.
func DetectWinSize() *WinSize {
w := &WinSize{
make(chan bool),
make(chan bool),
make(chan bool),
}
changeSig := make(chan os.Signal)
signal.Notify(changeSig, syscall.SIGWINCH)
go func() {
for {
select {
case <-changeSig:
// Add a pause because it is sent two signals at maximizing a window.
time.Sleep(7 * time.Millisecond)
w.Change <- true
case <-w.quit:
w.wait <- true
return
}
}
}()
return w
}
// Close closes the goroutine started to trap the signal.
func (w *WinSize) Close() {
w.quit <- true
<-w.wait
}