renaming files

Nikolay V. Razbegaev [2009-11-30 17:56]
renaming files
Filename
ffi-termios-constants-unix.lisp
ffi-termios-constants.lisp
iolib.termios.asd
wrapers.lisp
wrappers.lisp
diff --git a/ffi-termios-constants-unix.lisp b/ffi-termios-constants-unix.lisp
new file mode 100644
index 0000000..5934395
--- /dev/null
+++ b/ffi-termios-constants-unix.lisp
@@ -0,0 +1,474 @@
+;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; indent-tabs-mode: nil -*-
+;; Grovel for termios constants.
+;; TODO: check non POSXI features for other (non linux) systems: i.e #+bsd etc.
+;; Currently non POSIX features are #+linux marked or #+(or linux bsd) marked
+;; if they requires _BSD_SOURCE
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package :iolib.termios)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(include "termios.h")
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; for some non posix features
+(define "_XOPEN_SOURCE")
+(define "_BSD_SOURCE")
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; < clfags >
+(constantenum (cflag :define-constants t)
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+(or linux bsd)
+  ((:cbaud "CBAUD")
+   :documentation "Baud speed mask (4+1 bits).")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+(or linux bsd)
+  ((:cbaudex "CBAUDEX")
+   :documentation "Extra baud speed mask (1 bit),included in CBAUD. ")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:csize "CSIZE")
+   :documentation "Character size mask.  Values are CS5, CS6, CS7, or CS8.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ;; < valid character sizes >
+  ((:cs5 "CS5"))
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:cs6 "CS6"))
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:cs7 "CS7"))
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:cs8 "CS8"))
+  ;; </ valid character sizes >
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:cstopb "CSTOPB")
+   :documentation "Set two stop bits, rather than one.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:cread "CREAD")
+   :documentation "Enable receiver. This flag is really necessary.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:parenb "PARENB")
+   :documentation
+   "Enable parity generation on output and parity checking for input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:parodd "PARODD")
+   :documentation
+   "If  set,  then parity  for  input  and  output is  odd;
+	   otherwise even parity is used.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:hupcl "HUPCL")
+   :documentation
+   "Lower modem control lines after last process closes the
+	   device (hang up).")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:clocal "CLOCAL") :documentation "Ignore modem control lines.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #-linux
+  ((:loblk "LOBLK")
+   :documentation
+   "Block  output from a  non-current shell layer.
+    For use by shl (shell layers).")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+(or bsd linux)
+  ((:cibaud "CIBAUD")
+   :documentation
+   "Mask for input speeds. The values for the CIBAUD bits are the same
+    as the values for the CBAUD bits,shifted left IBSHIFT bits. ")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+(or bsd linux)
+  ((:cmspar "CMSPAR")
+   :documentation
+   "Use `stick' (mark/space) parity
+    (supported on certain serial devices):
+    if  PARODD is set, the parity bit is  always 1;
+    if PARODD is not set,then the parity bit is always 0).")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+(or bsd linux)
+  ((:crtscts "CRTSCTS")
+   :documentation "Enable RTS/CTS (hardware) flow control.")) ; </cflags>
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; <lflags>
+(constantenum (lflag :define-constants t)
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:isig "ISIG")
+   :documentation
+   "When any of the characters INTR, QUIT, SUSP, or DSUSP
+    are received, generate the corresponding signal.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:icanon "ICANON") :documentation "Enable canonical mode.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #-linux
+  ((:xcase "XCASE")
+   :documentation
+   "If ICANON is also  set, terminal is uppercase only.
+    Input is converted to lowercase, except for characters preceded
+    by \.  On output,  uppercase characters are preceded by
+    \\ and lowercase  characters are converted to uppercase.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:echo "ECHO") :documentation "Echo input characters.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:echoe "ECHOE")
+   :documentation
+   "If ICANON is also set, the ERASE character erases the
+	   preceding input character, and WERASE erases the
+	   preceding word.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:echok "ECHOK")
+   :documentation
+   "If ICANON is also set, the KILL character erases the current line.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:echonl "ECHONL")
+   :documentation
+   "If ICANON is also set, echo the NL character
+           even if ECHO is not set.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+(or linux bsd)
+  ((:echoctl "ECHOCTL")
+   :documentation
+   "If ECHO is  also  set, ASCII control signals other than TAB,
+    NL, START, and STOP are echoed as ^X, where X is the character
+    with ASCII code 0x40 greater than the control signal.
+    For  example, character  0x08  (BS) is echoed as  ^H.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+(or linux bsd)
+  ((:echoprt "ECHOPRT")
+   :documentation
+   "If ICANON and IECHO are also set, characters are printed
+    as they are being erased.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+(or linux bsd)
+  ((:echoke "ECHOKE")
+   :documentation
+   "If ICANON is also set, KILL is echoed by erasing each character
+    on the line, as  specified by ECHOE and ECHOPRT.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #-linux
+  ((:defecho "DEFECHO")
+   :documentation " Echo only when a process is reading.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+bsd
+  ((:flusho "FLUSHO")
+   :documentation
+   "Output is being flushed.
+    This flag is toggled by typing the DISCARD character.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:noflsh "NOFLSH")
+   :documentation
+   "Disable  flushing  the  input  and output  queues  when
+           generating the SIGINT, SIGQUIT, and SIGSUSP signals.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:tostop "TOSTOP")
+   :documentation
+   "Send  the SIGTTOU signal to the process group of
+           a background process which tries to write to
+           its controlling terminal.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+bsd
+  ((:pendin "PENDIN")
+   :documentation
+   "All characters in the input queue are reprinted when the
+    next character is read. (bash(1) handles typeahead this way.)")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:iexten "IEXTEN")
+   :documentation
+   "Enable implementation-defined input processing.
+    This flag, as well as ICANON must be enabled for the special
+    characters EOL2, LNEXT, REPRINT, WERASE to be interpreted,
+    and for the IUCLC flag to be effective.")) ; </lflags>
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; <iflags>
+(constantenum (iflag :define-constants t)
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:ignbrk "IGNBRK") :documentation "Ignore BREAK condition on input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:brkint "BRKINT")
+   :documentation
+   "If IGNBRK is set, a BREAK is ignored.  If it is not set
+    but BRKINT  is set, then  a BREAK causes the  input and
+    output queues to be flushed, and if the terminal is the
+    controlling terminal of  a foreground process group, it
+    will  cause a  SIGINT  to be  sent  to this  foreground
+    process group.  When neither IGNBRK nor BRKINT are set,
+    a BREAK reads as a null byte ('0'), except when PARMRK
+    is set, in which case  it reads as the sequence \377 \0 \0.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:ignpar "IGNPAR")
+   :documentation "Ignore framing errors and parity errors.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:parmrk "PARMRK")
+   :documentation
+   "If IGNPAR is not set, prefix a character with a parity
+    error or framing error with 377 0. If neither IGNPAR
+    nor PARMRK is set, read a character with a parity error
+    or framing error as 0.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:inpck "INPCK") :documentation "Enable input parity checking.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:istrip "ISTRIP") :documentation "Strip off eighth bit.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:inlcr "INLCR") :documentation "Translate NL to CR on input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:igncr "IGNCR") :documentation "Ignore carriage return on input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:icrnl "ICRNL")
+   :documentation
+   "Translate carriage return to newline on input
+    (unless IGNCR is set).")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+linux
+  ((:iuclc "IUCLC")
+   :documentation "Map uppercase characters to lowercase on input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:ixon "IXON")
+   :documentation "Enable XON/XOFF flow control on output.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ;; XSI features are #+xfi marked in sb-posix grovel file,
+  ;; but (find :xsi *features*) return NIL
+  ;; so i'm leaving xsi features unmarked
+  ((:ixany "IXANY")
+   :documentation
+   "Typing any character will restart stopped output.
+           (The default is to allow just the START character
+           to restart output.)")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:ixoff "IXOFF")
+   :documentation "Enable XON/XOFF flow control on input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #-linux
+  ((:imaxbel "IMAXBEL")
+   :documentation "Ring bell when input queue is full.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+linux
+  ((:iutf8 "IUTF8")
+   :documentation
+   "Input is UTF8; this allows character-erase to be correctly performed
+    in cooked mode."))                  ; </iflags>
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; <oflags>
+(constantenum (oflag :define-constants t)
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:opost "OPOST")
+   :documentation "Enable implementation-defined output processing.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+linux
+  ((:olcuc "OLCUC")
+   :documentation "Map lowercase characters to uppercase on output.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:onlcr "ONLCR") :documentation "Map NL to CR-NL on output.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:ocrnl "OCRNL") :documentation "Map CR to NL on output.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:onocr "ONOCR") :documentation "Don't output CR at column 0.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:onlret "ONLRET") :documentation "Don't output CR.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:ofill "OFILL")
+   :documentation
+   "Send fill characters for a delay, rather than using a timed delay.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #-linux
+  ((:ofdel "OFDEL")
+   :documentation
+   "Fill character is ASCII DEL (0177). If unset, fill character
+    is ASCII NUL ('0').")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+(or linux bsd)
+  ((:nldly "NLDLY")
+   :documentation
+   "Newline delay mask. Values are NL0 and NL1.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+(or linux bsd)
+  ((:crdly "CRDLY")
+   :documentation
+   "Carriage return delay mask. Values are CR0, CR1, CR2,or  CR3.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+(or linux bsd)
+  ((:tabdly "TABDLY")
+   :documentation
+   "Horizontal tab delay mask.
+    Values are TAB0, TAB1,TAB2, TAB3 (or XTABS).
+    A value  of  TAB3, that is, XTABS, expands tabs to spaces
+    (with tab  stops every eight columns).")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+(or linux bsd)
+  ((:bsdly "BSDLY")
+   :documentation "Backspace  delay mask. Values are BS0 or BS1.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+(or linux bsd)
+  ((:vtdly "VTDLY")
+   :documentation "Vertical tab delay mask.  Values are VT0 or VT1.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+(or linux bsd)
+  ((:ffdly "FFDLY")
+   :documentation "Form feed delay mask. Values are FF0 or FF1.")) ;</oflags>
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; <control characters>
+(constantenum (control-character :define-constants t)
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:vintr "VINTR")
+   :documentation
+   "(003, ETX, Ctrl-C, or also 0177, DEL, rubout) Interrupt character.
+    Send a SIGINT signal. Recognized when ISIG is set,
+    and then not passed as input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:vquit "VQUIT")
+   :documentation
+   "(034, FS, Ctrl-) Quit character.  Send SIGQUIT signal.
+    Recognized  when ISIG is  set, and  then not  passed as input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:verase "VERASE")
+   :documentation
+   "(0177, DEL, rubout,  or 010,  BS, Ctrl-H, or also #)
+           Erase    character.    This    erases    the   previous
+           not-yet-erased character,  but does not  erase past EOF
+	   or beginning-of-line.   Recognized when ICANON  is set,
+	   and then not passed as input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:vkill "VKILL")
+   :documentation
+   "(025, NAK, Ctrl-U, or Ctrl-X, or also @) Kill character.
+    This erases the input since the last EOF or beginning-of-line.
+    Recognized when ICANON is set, and then not passed as input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:veof "VEOF")
+   :documentation
+   "(004, EOT, Ctrl-D) End-of-file character.
+    More precisely: this character causes the pending tty buffer
+    to be sent to the waiting user program without waiting for
+    end-of-line.  If it is the first character of the line,
+    the read(2) in the user program returns 0, which signifies
+    end-of-file.
+    Recognized  when ICANON is set, and then not passed as input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:vmin "VMIN")
+   :documentation
+   "Minimum number of characters for non-canonical read.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:veol "VEOL")
+   :documentation
+   "(0, NUL) Additional end-of-line character.
+           Recognized when ICANON is set.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:vtime "VTIME")
+   :documentation "Timeout in deciseconds for non-canonical read.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+linux
+  ((:veol2 "VEOL2")
+   :documentation
+   "Yet another end-of-line character.
+    Recognized when ICANON is set.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #-linux
+  ((:vswtch "VSWTCH")
+   :documentation "Switch character.  (Used by shl only.)")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:vstart "VSTART")
+   :documentation
+   "(021, DC1, Ctrl-Q) Start character.
+    Restarts output stopped by the Stop character.
+    Recognized when IXON is set, and then not passed as input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:vstop "VSTOP")
+   :documentation
+   "(023, DC3, Ctrl-S) Stop character.
+    Stop output until Start character typed.
+    Recognized  when IXON  is set, and then not passed as input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:vsusp "VSUSP")
+   :documentation
+   "(032, SUB, Ctrl-Z) Suspend character.
+           Send SIGTSTP signal. Recognized when ISIG is set,
+           and then not passed as input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #-linux
+  ((:vdsusp "VDSUSP")
+   :documentation
+   "031, EM, Ctrl-Y) Delayed suspend  character: send SIGTSTP signal
+    when  the  character  is  read  by  the  user  program.
+    Recognized when IEXTEN and ISIG are set, and the system
+    supports job control, and then not passed as input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+linux
+  ((:vlnext "VLNEXT")
+   :documentation
+   "(026, SYN, Ctrl-V) Literal next.
+    Quotes the next  input character,  depriving it of  a possible
+    special  meaning.  Recognized when  IEXTEN is  set,
+   and then not passed as input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+linux
+  ((:vwerase "VWERASE")
+   :documentation
+   "(027, ETB, Ctrl-W) Word  erase.
+    Recognized when ICANON and IEXTEN are set,
+    and then not passed as input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #+linux
+  ((:vreprint "VREPRINT")
+   :documentation
+   "(022, DC2, Ctrl-R) Reprint unread characters.
+    Recognized when ICANON and IEXTEN are set,
+    and then not passed as input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #-linux
+  ((:vdiscard "VDISCARD")
+   :documentation
+   "017, SI, Ctrl-O) Toggle: start/stop discarding  pending output.
+    Recognized when  IEXTEN is set, and then  not passed as input.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  #-linux
+  ((:vstatus "VSTATUS")
+   :documentation "Status request: 024, DC4, Ctrl-T).")) ;</control characters>
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; < tcssetattr actions >
+(constantenum (tcssetattr-action :define-constants t)
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:tcsanow "TCSANOW")
+   :documentation "The change (by tcssetattr) occurs immediately.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:tcsadrain "TCSADRAIN")
+   :documentation
+   "The change occurs (by tcssetattr) after all output written to fd
+    has been  transmitted.  This function  should be used when
+    changing parameters that affect output.")
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ((:tcsaflush "TCSAFLUSH")
+   :documentation
+   "The change (by tcssetattr) occurs after all output written to the
+    object referred by fd has been transmitted, and all
+    input that has been received but not read will be
+    discarded before the change is made.")) ; </tcssetattr actions>
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; <baud rates >
+(constantenum (baud-rate :define-constants t)
+  ;; <Posix baud rates>
+  ((:b0       "B0"))
+  ((:b50      "B50"))
+  ((:b75      "B75"))
+  ((:b110     "B110"))
+  ((:b134     "B134"))
+  ((:b150     "B150"))
+  ((:b200     "B200"))
+  ((:b300     "B300"))
+  ((:b600     "B600"))
+  ((:b1200    "B1200"))
+  ((:b1800    "B1800"))
+  ((:b2400    "B2400"))
+  ((:b4800    "B4800"))
+  ((:b9600    "B9600"))
+  ((:b19200   "B19200"))
+  ((:b38400   "B38400"))
+  ((:b57600   "B57600"))
+  ((:b115200  "B115200"))
+  ;; </Posix baud rates>
+  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+  ;; <Non posix baud rates>
+  ((:b230400  "B230400"))
+  ((:b460800  "B460800"))
+  ((:b500000  "B500000"))
+  ((:b576000  "B576000"))
+  ((:b921600  "B921600"))
+  ((:b1000000 "B1000000"))
+  ((:b1152000 "B1152000"))
+  ((:b1500000 "B1500000"))
+  ((:b2000000 "B2000000"))
+  ((:b2500000 "B2500000"))
+  ((:b3000000 "B3000000"))
+  ((:b3500000 "B3500000"))
+  ((:b4000000 "B4000000")))             ;</Non posix baud rates> </baud rates>
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/ffi-termios-constants.lisp b/ffi-termios-constants.lisp
deleted file mode 100644
index 5934395..0000000
--- a/ffi-termios-constants.lisp
+++ /dev/null
@@ -1,474 +0,0 @@
-;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; indent-tabs-mode: nil -*-
-;; Grovel for termios constants.
-;; TODO: check non POSXI features for other (non linux) systems: i.e #+bsd etc.
-;; Currently non POSIX features are #+linux marked or #+(or linux bsd) marked
-;; if they requires _BSD_SOURCE
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(in-package :iolib.termios)
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(include "termios.h")
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; for some non posix features
-(define "_XOPEN_SOURCE")
-(define "_BSD_SOURCE")
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; < clfags >
-(constantenum (cflag :define-constants t)
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+(or linux bsd)
-  ((:cbaud "CBAUD")
-   :documentation "Baud speed mask (4+1 bits).")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+(or linux bsd)
-  ((:cbaudex "CBAUDEX")
-   :documentation "Extra baud speed mask (1 bit),included in CBAUD. ")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:csize "CSIZE")
-   :documentation "Character size mask.  Values are CS5, CS6, CS7, or CS8.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ;; < valid character sizes >
-  ((:cs5 "CS5"))
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:cs6 "CS6"))
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:cs7 "CS7"))
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:cs8 "CS8"))
-  ;; </ valid character sizes >
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:cstopb "CSTOPB")
-   :documentation "Set two stop bits, rather than one.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:cread "CREAD")
-   :documentation "Enable receiver. This flag is really necessary.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:parenb "PARENB")
-   :documentation
-   "Enable parity generation on output and parity checking for input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:parodd "PARODD")
-   :documentation
-   "If  set,  then parity  for  input  and  output is  odd;
-	   otherwise even parity is used.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:hupcl "HUPCL")
-   :documentation
-   "Lower modem control lines after last process closes the
-	   device (hang up).")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:clocal "CLOCAL") :documentation "Ignore modem control lines.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #-linux
-  ((:loblk "LOBLK")
-   :documentation
-   "Block  output from a  non-current shell layer.
-    For use by shl (shell layers).")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+(or bsd linux)
-  ((:cibaud "CIBAUD")
-   :documentation
-   "Mask for input speeds. The values for the CIBAUD bits are the same
-    as the values for the CBAUD bits,shifted left IBSHIFT bits. ")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+(or bsd linux)
-  ((:cmspar "CMSPAR")
-   :documentation
-   "Use `stick' (mark/space) parity
-    (supported on certain serial devices):
-    if  PARODD is set, the parity bit is  always 1;
-    if PARODD is not set,then the parity bit is always 0).")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+(or bsd linux)
-  ((:crtscts "CRTSCTS")
-   :documentation "Enable RTS/CTS (hardware) flow control.")) ; </cflags>
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; <lflags>
-(constantenum (lflag :define-constants t)
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:isig "ISIG")
-   :documentation
-   "When any of the characters INTR, QUIT, SUSP, or DSUSP
-    are received, generate the corresponding signal.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:icanon "ICANON") :documentation "Enable canonical mode.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #-linux
-  ((:xcase "XCASE")
-   :documentation
-   "If ICANON is also  set, terminal is uppercase only.
-    Input is converted to lowercase, except for characters preceded
-    by \.  On output,  uppercase characters are preceded by
-    \\ and lowercase  characters are converted to uppercase.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:echo "ECHO") :documentation "Echo input characters.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:echoe "ECHOE")
-   :documentation
-   "If ICANON is also set, the ERASE character erases the
-	   preceding input character, and WERASE erases the
-	   preceding word.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:echok "ECHOK")
-   :documentation
-   "If ICANON is also set, the KILL character erases the current line.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:echonl "ECHONL")
-   :documentation
-   "If ICANON is also set, echo the NL character
-           even if ECHO is not set.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+(or linux bsd)
-  ((:echoctl "ECHOCTL")
-   :documentation
-   "If ECHO is  also  set, ASCII control signals other than TAB,
-    NL, START, and STOP are echoed as ^X, where X is the character
-    with ASCII code 0x40 greater than the control signal.
-    For  example, character  0x08  (BS) is echoed as  ^H.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+(or linux bsd)
-  ((:echoprt "ECHOPRT")
-   :documentation
-   "If ICANON and IECHO are also set, characters are printed
-    as they are being erased.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+(or linux bsd)
-  ((:echoke "ECHOKE")
-   :documentation
-   "If ICANON is also set, KILL is echoed by erasing each character
-    on the line, as  specified by ECHOE and ECHOPRT.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #-linux
-  ((:defecho "DEFECHO")
-   :documentation " Echo only when a process is reading.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+bsd
-  ((:flusho "FLUSHO")
-   :documentation
-   "Output is being flushed.
-    This flag is toggled by typing the DISCARD character.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:noflsh "NOFLSH")
-   :documentation
-   "Disable  flushing  the  input  and output  queues  when
-           generating the SIGINT, SIGQUIT, and SIGSUSP signals.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:tostop "TOSTOP")
-   :documentation
-   "Send  the SIGTTOU signal to the process group of
-           a background process which tries to write to
-           its controlling terminal.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+bsd
-  ((:pendin "PENDIN")
-   :documentation
-   "All characters in the input queue are reprinted when the
-    next character is read. (bash(1) handles typeahead this way.)")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:iexten "IEXTEN")
-   :documentation
-   "Enable implementation-defined input processing.
-    This flag, as well as ICANON must be enabled for the special
-    characters EOL2, LNEXT, REPRINT, WERASE to be interpreted,
-    and for the IUCLC flag to be effective.")) ; </lflags>
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; <iflags>
-(constantenum (iflag :define-constants t)
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:ignbrk "IGNBRK") :documentation "Ignore BREAK condition on input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:brkint "BRKINT")
-   :documentation
-   "If IGNBRK is set, a BREAK is ignored.  If it is not set
-    but BRKINT  is set, then  a BREAK causes the  input and
-    output queues to be flushed, and if the terminal is the
-    controlling terminal of  a foreground process group, it
-    will  cause a  SIGINT  to be  sent  to this  foreground
-    process group.  When neither IGNBRK nor BRKINT are set,
-    a BREAK reads as a null byte ('0'), except when PARMRK
-    is set, in which case  it reads as the sequence \377 \0 \0.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:ignpar "IGNPAR")
-   :documentation "Ignore framing errors and parity errors.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:parmrk "PARMRK")
-   :documentation
-   "If IGNPAR is not set, prefix a character with a parity
-    error or framing error with 377 0. If neither IGNPAR
-    nor PARMRK is set, read a character with a parity error
-    or framing error as 0.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:inpck "INPCK") :documentation "Enable input parity checking.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:istrip "ISTRIP") :documentation "Strip off eighth bit.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:inlcr "INLCR") :documentation "Translate NL to CR on input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:igncr "IGNCR") :documentation "Ignore carriage return on input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:icrnl "ICRNL")
-   :documentation
-   "Translate carriage return to newline on input
-    (unless IGNCR is set).")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+linux
-  ((:iuclc "IUCLC")
-   :documentation "Map uppercase characters to lowercase on input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:ixon "IXON")
-   :documentation "Enable XON/XOFF flow control on output.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ;; XSI features are #+xfi marked in sb-posix grovel file,
-  ;; but (find :xsi *features*) return NIL
-  ;; so i'm leaving xsi features unmarked
-  ((:ixany "IXANY")
-   :documentation
-   "Typing any character will restart stopped output.
-           (The default is to allow just the START character
-           to restart output.)")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:ixoff "IXOFF")
-   :documentation "Enable XON/XOFF flow control on input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #-linux
-  ((:imaxbel "IMAXBEL")
-   :documentation "Ring bell when input queue is full.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+linux
-  ((:iutf8 "IUTF8")
-   :documentation
-   "Input is UTF8; this allows character-erase to be correctly performed
-    in cooked mode."))                  ; </iflags>
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; <oflags>
-(constantenum (oflag :define-constants t)
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:opost "OPOST")
-   :documentation "Enable implementation-defined output processing.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+linux
-  ((:olcuc "OLCUC")
-   :documentation "Map lowercase characters to uppercase on output.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:onlcr "ONLCR") :documentation "Map NL to CR-NL on output.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:ocrnl "OCRNL") :documentation "Map CR to NL on output.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:onocr "ONOCR") :documentation "Don't output CR at column 0.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:onlret "ONLRET") :documentation "Don't output CR.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:ofill "OFILL")
-   :documentation
-   "Send fill characters for a delay, rather than using a timed delay.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #-linux
-  ((:ofdel "OFDEL")
-   :documentation
-   "Fill character is ASCII DEL (0177). If unset, fill character
-    is ASCII NUL ('0').")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+(or linux bsd)
-  ((:nldly "NLDLY")
-   :documentation
-   "Newline delay mask. Values are NL0 and NL1.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+(or linux bsd)
-  ((:crdly "CRDLY")
-   :documentation
-   "Carriage return delay mask. Values are CR0, CR1, CR2,or  CR3.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+(or linux bsd)
-  ((:tabdly "TABDLY")
-   :documentation
-   "Horizontal tab delay mask.
-    Values are TAB0, TAB1,TAB2, TAB3 (or XTABS).
-    A value  of  TAB3, that is, XTABS, expands tabs to spaces
-    (with tab  stops every eight columns).")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+(or linux bsd)
-  ((:bsdly "BSDLY")
-   :documentation "Backspace  delay mask. Values are BS0 or BS1.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+(or linux bsd)
-  ((:vtdly "VTDLY")
-   :documentation "Vertical tab delay mask.  Values are VT0 or VT1.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+(or linux bsd)
-  ((:ffdly "FFDLY")
-   :documentation "Form feed delay mask. Values are FF0 or FF1.")) ;</oflags>
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; <control characters>
-(constantenum (control-character :define-constants t)
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:vintr "VINTR")
-   :documentation
-   "(003, ETX, Ctrl-C, or also 0177, DEL, rubout) Interrupt character.
-    Send a SIGINT signal. Recognized when ISIG is set,
-    and then not passed as input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:vquit "VQUIT")
-   :documentation
-   "(034, FS, Ctrl-) Quit character.  Send SIGQUIT signal.
-    Recognized  when ISIG is  set, and  then not  passed as input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:verase "VERASE")
-   :documentation
-   "(0177, DEL, rubout,  or 010,  BS, Ctrl-H, or also #)
-           Erase    character.    This    erases    the   previous
-           not-yet-erased character,  but does not  erase past EOF
-	   or beginning-of-line.   Recognized when ICANON  is set,
-	   and then not passed as input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:vkill "VKILL")
-   :documentation
-   "(025, NAK, Ctrl-U, or Ctrl-X, or also @) Kill character.
-    This erases the input since the last EOF or beginning-of-line.
-    Recognized when ICANON is set, and then not passed as input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:veof "VEOF")
-   :documentation
-   "(004, EOT, Ctrl-D) End-of-file character.
-    More precisely: this character causes the pending tty buffer
-    to be sent to the waiting user program without waiting for
-    end-of-line.  If it is the first character of the line,
-    the read(2) in the user program returns 0, which signifies
-    end-of-file.
-    Recognized  when ICANON is set, and then not passed as input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:vmin "VMIN")
-   :documentation
-   "Minimum number of characters for non-canonical read.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:veol "VEOL")
-   :documentation
-   "(0, NUL) Additional end-of-line character.
-           Recognized when ICANON is set.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:vtime "VTIME")
-   :documentation "Timeout in deciseconds for non-canonical read.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+linux
-  ((:veol2 "VEOL2")
-   :documentation
-   "Yet another end-of-line character.
-    Recognized when ICANON is set.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #-linux
-  ((:vswtch "VSWTCH")
-   :documentation "Switch character.  (Used by shl only.)")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:vstart "VSTART")
-   :documentation
-   "(021, DC1, Ctrl-Q) Start character.
-    Restarts output stopped by the Stop character.
-    Recognized when IXON is set, and then not passed as input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:vstop "VSTOP")
-   :documentation
-   "(023, DC3, Ctrl-S) Stop character.
-    Stop output until Start character typed.
-    Recognized  when IXON  is set, and then not passed as input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:vsusp "VSUSP")
-   :documentation
-   "(032, SUB, Ctrl-Z) Suspend character.
-           Send SIGTSTP signal. Recognized when ISIG is set,
-           and then not passed as input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #-linux
-  ((:vdsusp "VDSUSP")
-   :documentation
-   "031, EM, Ctrl-Y) Delayed suspend  character: send SIGTSTP signal
-    when  the  character  is  read  by  the  user  program.
-    Recognized when IEXTEN and ISIG are set, and the system
-    supports job control, and then not passed as input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+linux
-  ((:vlnext "VLNEXT")
-   :documentation
-   "(026, SYN, Ctrl-V) Literal next.
-    Quotes the next  input character,  depriving it of  a possible
-    special  meaning.  Recognized when  IEXTEN is  set,
-   and then not passed as input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+linux
-  ((:vwerase "VWERASE")
-   :documentation
-   "(027, ETB, Ctrl-W) Word  erase.
-    Recognized when ICANON and IEXTEN are set,
-    and then not passed as input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #+linux
-  ((:vreprint "VREPRINT")
-   :documentation
-   "(022, DC2, Ctrl-R) Reprint unread characters.
-    Recognized when ICANON and IEXTEN are set,
-    and then not passed as input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #-linux
-  ((:vdiscard "VDISCARD")
-   :documentation
-   "017, SI, Ctrl-O) Toggle: start/stop discarding  pending output.
-    Recognized when  IEXTEN is set, and then  not passed as input.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  #-linux
-  ((:vstatus "VSTATUS")
-   :documentation "Status request: 024, DC4, Ctrl-T).")) ;</control characters>
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; < tcssetattr actions >
-(constantenum (tcssetattr-action :define-constants t)
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:tcsanow "TCSANOW")
-   :documentation "The change (by tcssetattr) occurs immediately.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:tcsadrain "TCSADRAIN")
-   :documentation
-   "The change occurs (by tcssetattr) after all output written to fd
-    has been  transmitted.  This function  should be used when
-    changing parameters that affect output.")
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ((:tcsaflush "TCSAFLUSH")
-   :documentation
-   "The change (by tcssetattr) occurs after all output written to the
-    object referred by fd has been transmitted, and all
-    input that has been received but not read will be
-    discarded before the change is made.")) ; </tcssetattr actions>
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; <baud rates >
-(constantenum (baud-rate :define-constants t)
-  ;; <Posix baud rates>
-  ((:b0       "B0"))
-  ((:b50      "B50"))
-  ((:b75      "B75"))
-  ((:b110     "B110"))
-  ((:b134     "B134"))
-  ((:b150     "B150"))
-  ((:b200     "B200"))
-  ((:b300     "B300"))
-  ((:b600     "B600"))
-  ((:b1200    "B1200"))
-  ((:b1800    "B1800"))
-  ((:b2400    "B2400"))
-  ((:b4800    "B4800"))
-  ((:b9600    "B9600"))
-  ((:b19200   "B19200"))
-  ((:b38400   "B38400"))
-  ((:b57600   "B57600"))
-  ((:b115200  "B115200"))
-  ;; </Posix baud rates>
-  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-  ;; <Non posix baud rates>
-  ((:b230400  "B230400"))
-  ((:b460800  "B460800"))
-  ((:b500000  "B500000"))
-  ((:b576000  "B576000"))
-  ((:b921600  "B921600"))
-  ((:b1000000 "B1000000"))
-  ((:b1152000 "B1152000"))
-  ((:b1500000 "B1500000"))
-  ((:b2000000 "B2000000"))
-  ((:b2500000 "B2500000"))
-  ((:b3000000 "B3000000"))
-  ((:b3500000 "B3500000"))
-  ((:b4000000 "B4000000")))             ;</Non posix baud rates> </baud rates>
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/iolib.termios.asd b/iolib.termios.asd
index fdf21bb..fc3443b 100644
--- a/iolib.termios.asd
+++ b/iolib.termios.asd
@@ -13,9 +13,9 @@
   :components
   ((:file "pkgdcl")
    #+unix(cffi-grovel:grovel-file "ffi-termios-types-unix")
-   #+unix(cffi-grovel:grovel-file "ffi-termios-constants")
+   #+unix(cffi-grovel:grovel-file "ffi-termios-constants-unix")
    #+unix(:file "ffi-termios-functions-unix")
    (:file "conditions")
-   (:file "wrapers")
+   (:file "wrappers")
    (:file "streams")))
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/wrapers.lisp b/wrapers.lisp
deleted file mode 100644
index 68cc40a..0000000
--- a/wrapers.lisp
+++ /dev/null
@@ -1,227 +0,0 @@
-;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; indent-tabs-mode: nil -*-
-;; common lisp wrapers for termios (3) api
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(in-package :iolib.termios)
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; <Termios options manipulation routines>
-(defmacro membercase (form &rest clauses)
-  "(membercase 'a
-	    ('(b c e) 1)
-	    ('(e d b) 2)
-	    ('(a b c) 3))
-    ==> 3
-  "
-  `(cond ,@(mapcar #'(lambda (x)
-                       (let ((lst (first x))
-                             (body (rest x)))
-                         `((member ,form ,lst) ,@body)))
-                   clauses)))
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defmacro enumcase (form &rest clauses)
-  "(enumcase :b115200
-		   (baud-rates 1)
-		   (iflags 2)
-   		   (cflags 3))
-   ==> 1
-  "
-  `(membercase ,form ,@(mapcar #'(lambda (x)
-                                   (let ((enum (first x))
-                                         (body (rest x)))
-                                     `((foreign-enum-keyword-list ',enum)
-                                       ,@body)))
-                               clauses)))
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun which-termios-keyword (keyword)
-  (enumcase keyword
-   (iflag 'iflag)
-   (oflag 'oflag)
-   (lflag 'lflag)
-   (cflag 'cflag)
-   (control-character 'control-character)
-   (baud-rate 'baud-rate)))
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun termios-flag-p (keyword)
-  (member (which-termios-keyword keyword) '(iflag oflag cflag lflag)))
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun termios-control-character-p (keyword)
-  (eql 'control-character (which-termios-keyword keyword)))
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun termios-baud-rate-p (keyword)
-  (eql 'baud-rate (which-termios-keyword keyword)))
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun setup-termios-flag (termios flag &optional setp)
-  "Reset `flag' in corresponding `termios' field, or set in, if `setp' is true."
-  (let ((type (which-termios-keyword flag)))
-    (unless type
-      (error "Unknown termios option ~a" flag))
-    (setf (foreign-slot-value termios 'termios type)
-            ;; value specified => set (logior), reset over otherwise
-            (funcall (if setp #'logior #'logandc2)
-                     (foreign-slot-value termios 'termios type)
-                     (foreign-enum-value type flag)))))
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun setup-termios-control-character (termios cc value)
-  "Setup corresponding control character value.
-   Value can be `control-character' keyword or integer."
-  (setf (mem-aref (foreign-slot-pointer termios
-                                        'termios
-                                        'control-chars)
-                       'cc
-                       ;; constant name is offset
-                       (foreign-enum-value 'control-character cc))
-        (if (integerp value)
-            value
-            (foreign-enum-value 'control-character value))))
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun make-raw-termios (termios)
-  "Same effect as cfmakeraw()"
-  (dolist (flag
-            '(:ignbrk :brkint :parmrk :istrip :inlcr :igncr :icrnl :ixon ;iflag
-              :opost						         ;oflag
-              :echo :echonl :icanon :isig :iexten		         ;lflag
-              :csize :parenb))				                 ;cflag
-    (setup-termios-flag termios flag))
-  (setup-termios-flag termios :cs8 t))
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun make-cooked-termios (termios)
-  "Effect is opposite to `make-raw-termios'"
-  (dolist (flag
-            '(:ignbrk :brkint :parmrk :istrip :inlcr :igncr :icrnl :ixon ;iflag
-              :opost						         ;oflag
-              :echo :echonl :icanon :isig :iexten	                 ;lflag
-              :csize :parenb))				                 ;cflag
-    (setup-termios-flag termios flag t))
-  #|(set-termios-option termios 'cs8 t)|#)
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun make-evenp-termios (termios)
-  "Enable parenb and cs7; disable parodd"
-  (setup-termios-flag termios :parenb t)
-  (setup-termios-flag termios :parodd)
-  (setup-termios-flag termios :cstopb)
-  (setup-termios-flag termios :csize)
-  (setup-termios-flag termios :cs7 t))
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun make-oddp-termios (termios)
-  "Enable parenb, cs7, and parodd"
-  (setup-termios-flag termios :parenb t)
-  (setup-termios-flag termios :parodd t)
-  (setup-termios-flag termios :cstopb)
-  (setup-termios-flag termios :csize)
-  (setup-termios-flag termios :cs7 t))
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun make-8n1-termios (termios)
-  "Disable parenb, and set cs8."
-  (setup-termios-flag termios :parenb)
-  (setup-termios-flag termios :cstopb)
-  (setup-termios-flag termios :csize)
-  (setup-termios-flag termios :cs8 t))
-;; </ Termios options manipulation routines >
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; I guess that bits manipulation stuff is not a lisp way,
-;; and using a kind of `stty (1p)' will be more lisp kind
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun stty (serial &rest options)
-  "Impliment stty (1) in lisp way.
-   `serial` can be stream or fd.
-   `options` should be list of termios keywords and values:
-   `nil` or `t` for flags or one of `:raw`, `:cooked`, `:evenp` or `:oddp`,
-   integers for control characters.
-
-   `:inlcr t` set corresponding flag,
-   `:inlcr nil` reset it,
-   `:b115200` set corresponding speed,
-   `:vtime 0` setup corresponding control character value.
-
-   Setup for 8n1 mode: `(stty fd :evenp nil)`
-   Setup speed: `(stty fd :b115200)` or `(stty my-stream 115200)`
-   Setup raw mode and speed: `(stty fd :b115200 :raw t)`
-   Setup cooked mode: `(stty fd :raw nil)`
-  "
-  (labels
-      ;; As said in man termios:
-      ;; >tcsetattr() returns success if any of the
-      ;; >requested changes could be successfully carried out."
-      ;; This manual also recomend to use tcgetattr() in oder to check
-      ;; all performed settings. But I really dot't like to find back
-      ;; that each zero ore one in coresponding field mead. So I prefer
-      ;; to process each option step by step and signal a condition
-      ;; when there will be a difference:
-      ((%set-test-termios (fd set test)
-         (%tcsetattr fd :tcsanow set)
-         (%tcgetattr fd test)
-         (and
-          (every #'(lambda (flag)
-                     (=  (foreign-slot-value set  'termios flag)
-                         (foreign-slot-value test 'termios flag)))
-                 '(iflag oflag cflag lflag))
-          (dotimes (i nccs t)
-            (when
-                (/= (mem-aref (foreign-slot-pointer set
-                                                    'termios
-                                                    'control-chars)
-                              'cc
-                              i)
-                    (mem-aref (foreign-slot-pointer test
-                                                    'termios
-                                                    'control-chars)
-                              'cc
-                              i))
-              (return nil)))))
-       (%stty (set test fd options)
-         (let ((opt  (car options))
-               (setp (cadr options))
-               (rst  (cddr options)))
-           (cond
-             ((termios-flag-p opt)
-              (setup-termios-flag set opt setp)
-              (unless (%set-test-termios fd set test)
-                (error 'termios-set-flag-failled :request opt)))
-             ((termios-control-character-p opt)
-              (setup-termios-control-character set opt setp)
-              (unless (%set-test-termios fd set test)
-                (error 'termios-set-control-character-failled :request opt)))
-             ((eql opt :raw)
-              (if setp (make-raw-termios set) (make-cooked-termios set))
-              (unless (%set-test-termios fd set test)
-                (error 'termios-set-failled
-                        :request (if setp :raw :cooked))))
-             ((eql opt :cooked)
-              (if setp (make-cooked-termios set) (make-raw-termios set))
-              (unless (%set-test-termios fd set test)
-                (error 'termios-set-failled
-                        :request (if setp :cooked :raw))))
-             ((eql opt :evenp)
-              (if setp (make-evenp-termios set) (make-oddp-termios set))
-              (unless (%set-test-termios fd set test)
-                (error 'termios-set-failled
-                        :request (if setp :evenp :oddp))))
-             ((eql opt :oddp)
-              (if setp (make-oddp-termios set) (make-evenp-termios set))
-              (unless (%set-test-termios fd set test)
-                (error 'termios-set-failled
-                        :request (if setp :oddp :evenp)))))
-           (if rst
-               (%stty set test fd rst)
-               set))))
-    (let ((fd (typecase serial
-                (integer serial)
-                (stream (fd-of serial))
-                (t (error "You should specify stream or fd"))))
-          (opts-w/o-baud (remove-if #'termios-baud-rate-p options))
-          (baud  (find-if #'termios-baud-rate-p options)))
-      (when (and options (oddp (length opts-w/o-baud)))
-        (error "Mailformed stty options list"))
-      (with-foreign-objects ((set  'termios)
-                             (test 'termios))
-        (%tcgetattr fd set)
-        (when baud
-          (%cfsetispeed set baud)
-          (%cfsetospeed set baud)
-          (%tcsetattr fd :tcsanow set)
-          (%tcgetattr fd test)
-          (let ((ispeed (%cfgetispeed test))
-                (ospeed (%cfgetospeed test)))
-            (unless (and (eql baud ispeed) (eql baud ospeed))
-              (error 'termios-set-baud-rate-failled :request baud))))
-        (%stty set test fd opts-w/o-baud)))))
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/wrappers.lisp b/wrappers.lisp
new file mode 100644
index 0000000..68cc40a
--- /dev/null
+++ b/wrappers.lisp
@@ -0,0 +1,227 @@
+;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; indent-tabs-mode: nil -*-
+;; common lisp wrapers for termios (3) api
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package :iolib.termios)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; <Termios options manipulation routines>
+(defmacro membercase (form &rest clauses)
+  "(membercase 'a
+	    ('(b c e) 1)
+	    ('(e d b) 2)
+	    ('(a b c) 3))
+    ==> 3
+  "
+  `(cond ,@(mapcar #'(lambda (x)
+                       (let ((lst (first x))
+                             (body (rest x)))
+                         `((member ,form ,lst) ,@body)))
+                   clauses)))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defmacro enumcase (form &rest clauses)
+  "(enumcase :b115200
+		   (baud-rates 1)
+		   (iflags 2)
+   		   (cflags 3))
+   ==> 1
+  "
+  `(membercase ,form ,@(mapcar #'(lambda (x)
+                                   (let ((enum (first x))
+                                         (body (rest x)))
+                                     `((foreign-enum-keyword-list ',enum)
+                                       ,@body)))
+                               clauses)))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun which-termios-keyword (keyword)
+  (enumcase keyword
+   (iflag 'iflag)
+   (oflag 'oflag)
+   (lflag 'lflag)
+   (cflag 'cflag)
+   (control-character 'control-character)
+   (baud-rate 'baud-rate)))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun termios-flag-p (keyword)
+  (member (which-termios-keyword keyword) '(iflag oflag cflag lflag)))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun termios-control-character-p (keyword)
+  (eql 'control-character (which-termios-keyword keyword)))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun termios-baud-rate-p (keyword)
+  (eql 'baud-rate (which-termios-keyword keyword)))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun setup-termios-flag (termios flag &optional setp)
+  "Reset `flag' in corresponding `termios' field, or set in, if `setp' is true."
+  (let ((type (which-termios-keyword flag)))
+    (unless type
+      (error "Unknown termios option ~a" flag))
+    (setf (foreign-slot-value termios 'termios type)
+            ;; value specified => set (logior), reset over otherwise
+            (funcall (if setp #'logior #'logandc2)
+                     (foreign-slot-value termios 'termios type)
+                     (foreign-enum-value type flag)))))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun setup-termios-control-character (termios cc value)
+  "Setup corresponding control character value.
+   Value can be `control-character' keyword or integer."
+  (setf (mem-aref (foreign-slot-pointer termios
+                                        'termios
+                                        'control-chars)
+                       'cc
+                       ;; constant name is offset
+                       (foreign-enum-value 'control-character cc))
+        (if (integerp value)
+            value
+            (foreign-enum-value 'control-character value))))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun make-raw-termios (termios)
+  "Same effect as cfmakeraw()"
+  (dolist (flag
+            '(:ignbrk :brkint :parmrk :istrip :inlcr :igncr :icrnl :ixon ;iflag
+              :opost						         ;oflag
+              :echo :echonl :icanon :isig :iexten		         ;lflag
+              :csize :parenb))				                 ;cflag
+    (setup-termios-flag termios flag))
+  (setup-termios-flag termios :cs8 t))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun make-cooked-termios (termios)
+  "Effect is opposite to `make-raw-termios'"
+  (dolist (flag
+            '(:ignbrk :brkint :parmrk :istrip :inlcr :igncr :icrnl :ixon ;iflag
+              :opost						         ;oflag
+              :echo :echonl :icanon :isig :iexten	                 ;lflag
+              :csize :parenb))				                 ;cflag
+    (setup-termios-flag termios flag t))
+  #|(set-termios-option termios 'cs8 t)|#)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun make-evenp-termios (termios)
+  "Enable parenb and cs7; disable parodd"
+  (setup-termios-flag termios :parenb t)
+  (setup-termios-flag termios :parodd)
+  (setup-termios-flag termios :cstopb)
+  (setup-termios-flag termios :csize)
+  (setup-termios-flag termios :cs7 t))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun make-oddp-termios (termios)
+  "Enable parenb, cs7, and parodd"
+  (setup-termios-flag termios :parenb t)
+  (setup-termios-flag termios :parodd t)
+  (setup-termios-flag termios :cstopb)
+  (setup-termios-flag termios :csize)
+  (setup-termios-flag termios :cs7 t))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun make-8n1-termios (termios)
+  "Disable parenb, and set cs8."
+  (setup-termios-flag termios :parenb)
+  (setup-termios-flag termios :cstopb)
+  (setup-termios-flag termios :csize)
+  (setup-termios-flag termios :cs8 t))
+;; </ Termios options manipulation routines >
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; I guess that bits manipulation stuff is not a lisp way,
+;; and using a kind of `stty (1p)' will be more lisp kind
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun stty (serial &rest options)
+  "Impliment stty (1) in lisp way.
+   `serial` can be stream or fd.
+   `options` should be list of termios keywords and values:
+   `nil` or `t` for flags or one of `:raw`, `:cooked`, `:evenp` or `:oddp`,
+   integers for control characters.
+
+   `:inlcr t` set corresponding flag,
+   `:inlcr nil` reset it,
+   `:b115200` set corresponding speed,
+   `:vtime 0` setup corresponding control character value.
+
+   Setup for 8n1 mode: `(stty fd :evenp nil)`
+   Setup speed: `(stty fd :b115200)` or `(stty my-stream 115200)`
+   Setup raw mode and speed: `(stty fd :b115200 :raw t)`
+   Setup cooked mode: `(stty fd :raw nil)`
+  "
+  (labels
+      ;; As said in man termios:
+      ;; >tcsetattr() returns success if any of the
+      ;; >requested changes could be successfully carried out."
+      ;; This manual also recomend to use tcgetattr() in oder to check
+      ;; all performed settings. But I really dot't like to find back
+      ;; that each zero ore one in coresponding field mead. So I prefer
+      ;; to process each option step by step and signal a condition
+      ;; when there will be a difference:
+      ((%set-test-termios (fd set test)
+         (%tcsetattr fd :tcsanow set)
+         (%tcgetattr fd test)
+         (and
+          (every #'(lambda (flag)
+                     (=  (foreign-slot-value set  'termios flag)
+                         (foreign-slot-value test 'termios flag)))
+                 '(iflag oflag cflag lflag))
+          (dotimes (i nccs t)
+            (when
+                (/= (mem-aref (foreign-slot-pointer set
+                                                    'termios
+                                                    'control-chars)
+                              'cc
+                              i)
+                    (mem-aref (foreign-slot-pointer test
+                                                    'termios
+                                                    'control-chars)
+                              'cc
+                              i))
+              (return nil)))))
+       (%stty (set test fd options)
+         (let ((opt  (car options))
+               (setp (cadr options))
+               (rst  (cddr options)))
+           (cond
+             ((termios-flag-p opt)
+              (setup-termios-flag set opt setp)
+              (unless (%set-test-termios fd set test)
+                (error 'termios-set-flag-failled :request opt)))
+             ((termios-control-character-p opt)
+              (setup-termios-control-character set opt setp)
+              (unless (%set-test-termios fd set test)
+                (error 'termios-set-control-character-failled :request opt)))
+             ((eql opt :raw)
+              (if setp (make-raw-termios set) (make-cooked-termios set))
+              (unless (%set-test-termios fd set test)
+                (error 'termios-set-failled
+                        :request (if setp :raw :cooked))))
+             ((eql opt :cooked)
+              (if setp (make-cooked-termios set) (make-raw-termios set))
+              (unless (%set-test-termios fd set test)
+                (error 'termios-set-failled
+                        :request (if setp :cooked :raw))))
+             ((eql opt :evenp)
+              (if setp (make-evenp-termios set) (make-oddp-termios set))
+              (unless (%set-test-termios fd set test)
+                (error 'termios-set-failled
+                        :request (if setp :evenp :oddp))))
+             ((eql opt :oddp)
+              (if setp (make-oddp-termios set) (make-evenp-termios set))
+              (unless (%set-test-termios fd set test)
+                (error 'termios-set-failled
+                        :request (if setp :oddp :evenp)))))
+           (if rst
+               (%stty set test fd rst)
+               set))))
+    (let ((fd (typecase serial
+                (integer serial)
+                (stream (fd-of serial))
+                (t (error "You should specify stream or fd"))))
+          (opts-w/o-baud (remove-if #'termios-baud-rate-p options))
+          (baud  (find-if #'termios-baud-rate-p options)))
+      (when (and options (oddp (length opts-w/o-baud)))
+        (error "Mailformed stty options list"))
+      (with-foreign-objects ((set  'termios)
+                             (test 'termios))
+        (%tcgetattr fd set)
+        (when baud
+          (%cfsetispeed set baud)
+          (%cfsetospeed set baud)
+          (%tcsetattr fd :tcsanow set)
+          (%tcgetattr fd test)
+          (let ((ispeed (%cfgetispeed test))
+                (ospeed (%cfgetospeed test)))
+            (unless (and (eql baud ispeed) (eql baud ospeed))
+              (error 'termios-set-baud-rate-failled :request baud))))
+        (%stty set test fd opts-w/o-baud)))))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ViewGit