about summary refs log blame commit diff stats
path: root/LICENSE.txt
blob: e19909859776884ad743f625b323e14639d31c63 (plain) (tree)
1
2
         
                                                         




















                                                                    
Profanity
Copyright (C) 2012 - 2015 James Booth <boothj5@gmail.com>

Profanity is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Profanity is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Profanity.  If not, see <http://www.gnu.org/licenses/>.

There is an additional exception from the author permitting linking
with OpenSSL:

As copyright holder, I give permission for profanity to be linked to
the OpenSSL libraries. This includes permission for profanity
binaries to be distributed linked against the OpenSSL libraries.
All other obligations under the GPL v3 remain intact.
5555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
# Primitives for keyboard control.
# Require Linux and a modern terminal.

== code

enable-keyboard-immediate-mode:
    # . prologue
    55/push-ebp
    89/<- %ebp 4/r32/esp
    # . save registers
    50/push-eax
    51/push-ecx
    52/push-edx
    53/push-ebx
    56/push-esi
    57/push-edi
    #
    (_maybe-open-terminal)
    # var terminal-info/esi: (addr termios)
    # termios is a type from the Linux kernel. We don't care how large it is.
    81 5/subop/subtract %esp 0x100/imm32
    89/<- %esi 4/r32/esp
    # ioctl(*Terminal-file-descriptor, TCGETS, terminal-info)
    89/<- %edx 6/r32/esi
    b9/copy-to-ecx 0x5401/imm32/TCGETS
    8b/-> *Terminal-file-descriptor 3/r32/ebx
    e8/call syscall_ioctl/disp32
    # terminal-info->c_iflags &= Keyboard-immediate-mode-iflags
#?     (write-buffered Stderr "iflags before: ")
#?     (write-int32-hex-buffered Stderr *esi)
#?     (write-buffered Stderr Newline)
#?     (flush Stderr)
    8b/-> *esi 0/r32/eax  # Termios-c_iflag
    23/and *Keyboard-immediate-mode-iflags 0/r32/eax
    89/<- *esi 0/r32/eax  # Termios-c_iflag
#?     (write-buffered Stderr "iflags after: ")
#?     (write-int32-hex-buffered Stderr *esi)
#?     (write-buffered Stderr Newline)
#?     (flush Stderr)
    # terminal-info->c_lflags &= Keyboard-immediate-mode-lflags
#?     (write-buffered Stderr "lflags before: ")
#?     (write-int32-hex-buffered Stderr *(esi+0xc))
#?     (write-buffered Stderr Newline)
#?     (flush Stderr)
    8b/-> *(esi+0xc) 0/r32/eax  # Termios-c_lflag
    23/and *Keyboard-immediate-mode-lflags 0/r32/eax
    89/<- *(esi+0xc) 0/r32/eax  # Termios-c_lflag
#?     (write-buffered Stderr "lflags after: ")
#?     (write-int32-hex-buffered Stderr *(esi+0xc))
#?     (write-buffered Stderr Newline)
#?     (flush Stderr)
    # ioctl(*Terminal-file-descriptor, TCSETS, terminal-info)
    89/<- %edx 6/r32/esi
    b9/copy-to-ecx 0x5402/imm32/TCSETS
    8b/-> *Terminal-file-descriptor 3/r32/ebx
    e8/call syscall_ioctl/disp32
$enable-keyboard-immediate-mode:end:
    # . reclaim locals
    81 0/subop/add %esp 0x100/imm32
    # . restore registers
    5f/pop-to-edi
    5e/pop-to-esi
    5b/pop-to-ebx
    5a/pop-to-edx
    59/pop-to-ecx
    58/pop-to-eax
    # . epilogue
    89/<- %esp 5/r32/ebp
    5d/pop-to-ebp
    c3/return

enable-keyboard-type-mode:
    # . prologue
    55/push-ebp
    89/<- %ebp 4/r32/esp
    # . save registers
    50/push-eax
    51/push-ecx
    52/push-edx
    53/push-ebx
    56/push-esi
    57/push-edi
    #
    (_maybe-open-terminal)
    # var terminal-info/esi: (addr termios)
    # termios is a type from the Linux kernel. We don't care how large it is.
    81 5/subop/subtract %esp 0x100/imm32
    89/<- %esi 4/r32/esp
    # ioctl(*Terminal-file-descriptor, TCGETS, terminal-info)
    89/<- %edx 6/r32/esi
    b9/copy-to-ecx 0x5401/imm32/TCGETS
    8b/-> *Terminal-file-descriptor 3/r32/ebx
    e8/call syscall_ioctl/disp32
    # terminal-info->c_iflags |= Keyboard-type-mode-iflags
    8b/-> *esi 0/r32/eax  # Termios-c_iflag
    0b/or *Keyboard-type-mode-iflags 0/r32/eax
    89/<- *esi 0/r32/eax  # Termios-c_iflag
    # terminal-info->c_lflags |= Keyboard-type-mode-lflags
    8b/-> *(esi+0xc) 0/r32/eax  # Termios-c_lflag
    0b/or *Keyboard-type-mode-lflags 0/r32/eax
    89/<- *(esi+0xc) 0/r32/eax  # Termios-c_lflag
    # ioctl(*Terminal-file-descriptor, TCSETS, terminal-info)
    89/<- %edx 6/r32/esi
    b9/copy-to-ecx 0x5402/imm32/TCSETS
    8b/-> *Terminal-file-descriptor 3/r32/ebx
    e8/call syscall_ioctl/disp32
$enable-keyboard-type-mode:end:
    # . reclaim locals
    81 0/subop/add %esp 0x100/imm32
    # . restore registers
    5f/pop-to-edi
    5e/pop-to-esi
    5b/pop-to-ebx
    5a/pop-to-edx
    59/pop-to-ecx
    58/pop-to-eax
    # . epilogue
    89/<- %esp 5/r32/ebp
    5d/pop-to-ebp
    c3/return

read-key:  # -> eax: byte
    # . prologue
    55/push-ebp
    89/<- %ebp 4/r32/esp
    # . save registers
    51/push-ecx
    # var buf/ecx: (stream byte 1)
    68/push 0/imm32/data
    68/push 1/imm32/size  # 3 bytes of data unused
    68/push 0/imm32/read
    68/push 0/imm32/write
    89/<- %ecx 4/r32/esp
    #
    (read 2 %ecx)  # => eax
    8b/-> *(ecx+0xc) 0/r32/eax
$read-key:end:
    # . reclaim locals
    81 0/subop/add %esp 0x10/imm32
    # . restore registers
    59/pop-to-ecx
    # . epilogue
    89/<- %esp 5/r32/ebp
    5d/pop-to-ebp
    c3/return

== data

# iflags:   octal     hex
#  IGNBRK  0000001   0x0001
#  BRKINT  0000002   0x0002
#  IGNPAR  0000004   0x0004
#  PARMRK  0000010   0x0008
#  INPCK   0000020   0x0010
#  ISTRIP  0000040   0x0020
#  INLCR   0000100   0x0040
#  IGNCR   0000200   0x0080
#  ICRNL   0000400   0x0100
#  IUCLC   0001000   0x0200
#  IXON    0002000   0x0400
#  IXANY   0004000   0x0800
#  IXOFF   0010000   0x1000
#  IMAXBEL 0020000   0x2000
#  IUTF8   0040000   0x4000

# lflags:
#  ISIG   0000001     0x0001
#  ICANON 0000002     0x0002
#  ECHO   0000010     0x0008
#  ECHOE  0000020     0x0010
#  ECHOK  0000040     0x0020
#  ECHONL 0000100     0x0040
#  NOFLSH 0000200     0x0080
#  TOSTOP 0000400     0x0100
#  IEXTEN 0100000     0x8000

# recipe for raw mode according to the termios.3 manpage on Linux:
#   termios_p->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
#   termios_p->c_oflag &= ~OPOST;
#   termios_p->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
#   termios_p->c_cflag &= ~(CSIZE | PARENB);
#   termios_p->c_cflag |= CS8;

Keyboard-immediate-mode-iflags:  # (addr tcflag_t)
#?     0xfffffa14  # ~IGNBRK & ~BRKINT & ~PARMRK & ~ISTRIP & ~INLCR & ~IGNCR & ~ICRNL & ~IXON
    0xffffffff/imm32

Keyboard-immediate-mode-lflags:  # (addr tcflag_t)
#?     0xffff7fb4/imm32  # ~ICANON & ~ISIG & ~IEXTEN & ~ECHO & ~ECHONL
    0xffffffb5/imm32  # ~ICANON & ~ECHO & ~ECHONL

Keyboard-type-mode-iflags:  # (addr tcflag_t)
    0x00000000/imm32  # ~Keyboard-immediate-mode-iflags

Keyboard-type-mode-lflags:  # (addr tcflag_t)
    0x0000004a/imm32  # ~Keyboard-immediate-mode-lflags