LCOV - code coverage report
Current view: top level - dev/wscons - wsemulvar.h (source / functions) Hit Total Coverage
Test: 6.4 Lines: 0 20 0.0 %
Date: 2018-10-19 03:25:38 Functions: 0 5 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* $OpenBSD: wsemulvar.h,v 1.16 2017/03/06 09:08:45 mpi Exp $ */
       2             : /* $NetBSD: wsemulvar.h,v 1.6 1999/01/17 15:46:15 drochner Exp $ */
       3             : 
       4             : /*
       5             :  * Copyright (c) 2009 Miodrag Vallat.
       6             :  *
       7             :  * Permission to use, copy, modify, and distribute this software for any
       8             :  * purpose with or without fee is hereby granted, provided that the above
       9             :  * copyright notice and this permission notice appear in all copies.
      10             :  *
      11             :  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
      12             :  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
      13             :  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
      14             :  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
      15             :  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
      16             :  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
      17             :  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
      18             :  */
      19             : /*
      20             :  * Copyright (c) 1996, 1997 Christopher G. Demetriou.  All rights reserved.
      21             :  *
      22             :  * Redistribution and use in source and binary forms, with or without
      23             :  * modification, are permitted provided that the following conditions
      24             :  * are met:
      25             :  * 1. Redistributions of source code must retain the above copyright
      26             :  *    notice, this list of conditions and the following disclaimer.
      27             :  * 2. Redistributions in binary form must reproduce the above copyright
      28             :  *    notice, this list of conditions and the following disclaimer in the
      29             :  *    documentation and/or other materials provided with the distribution.
      30             :  * 3. All advertising materials mentioning features or use of this software
      31             :  *    must display the following acknowledgement:
      32             :  *      This product includes software developed by Christopher G. Demetriou
      33             :  *      for the NetBSD Project.
      34             :  * 4. The name of the author may not be used to endorse or promote products
      35             :  *    derived from this software without specific prior written permission
      36             :  *
      37             :  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
      38             :  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
      39             :  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
      40             :  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
      41             :  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      42             :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
      43             :  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
      44             :  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
      45             :  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
      46             :  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      47             :  */
      48             : 
      49             : #ifdef  _KERNEL
      50             : 
      51             : #include <dev/wscons/wscons_features.h>
      52             : 
      53             : struct device;
      54             : struct wsdisplay_emulops;
      55             : 
      56             : enum wsemul_resetops {
      57             :         WSEMUL_RESET,
      58             :         WSEMUL_SYNCFONT,
      59             :         WSEMUL_CLEARSCREEN,
      60             :         WSEMUL_CLEARCURSOR
      61             : };
      62             : 
      63             : struct wsemul_ops {
      64             :         char name[WSEMUL_NAME_SIZE];
      65             : 
      66             :         void    *(*cnattach)(const struct wsscreen_descr *, void *,
      67             :                                   int, int, long);
      68             :         void    *(*attach)(int, const struct wsscreen_descr *, void *,
      69             :                                 int, int, void *, long);
      70             :         u_int   (*output)(void *, const u_char *, u_int, int);
      71             :         int     (*translate)(void *, kbd_t, keysym_t, const u_char **);
      72             :         void    (*detach)(void *, u_int *, u_int *);
      73             :         void    (*reset)(void *, enum wsemul_resetops);
      74             : };
      75             : 
      76             : /*
      77             :  * Structure carrying the state of multi-byte character sequences
      78             :  * decoding.
      79             :  */
      80             : struct wsemul_inputstate {
      81             :         u_int32_t       inchar; /* character being reconstructed */
      82             :         u_int           mbleft; /* multibyte bytes left until char complete */
      83             : };
      84             : 
      85             : extern const struct wsemul_ops wsemul_dumb_ops;
      86             : extern const struct wsemul_ops wsemul_sun_ops;
      87             : extern const struct wsemul_ops wsemul_vt100_ops;
      88             : 
      89             : const struct wsemul_ops *wsemul_pick(const char *);
      90             : const char *wsemul_getname(int);
      91             : 
      92             : /*
      93             :  * Callbacks from the emulation code to the display interface driver.
      94             :  */
      95             : void    wsdisplay_emulbell(void *v);
      96             : void    wsdisplay_emulinput(void *v, const u_char *, u_int);
      97             : 
      98             : /*
      99             :  * Get characters from an input stream and update the input state.
     100             :  * Processing stops when the stream is empty, or a complete character
     101             :  * sequence has been recognized, in which case it returns zero.
     102             :  */
     103             : int     wsemul_getchar(const u_char **, u_int *, struct wsemul_inputstate *,
     104             :             int);
     105             : 
     106             : /*
     107             :  * Keysym to UTF-8 sequence translation function.
     108             :  */
     109             : int     wsemul_utf8_translate(u_int32_t, kbd_t, u_char *, int);
     110             : 
     111             : /*
     112             :  * emulops failure abort/recovery state
     113             :  *
     114             :  * The tty layer needs a character output to be atomic.  Since this may
     115             :  * expand to multiple emulops operations, which may fail, it is necessary
     116             :  * for each emulation code to keep state of its current processing, so
     117             :  * that if an operation fails, the whole character from the tty layer is
     118             :  * reported as not having been output, while it has in fact been partly
     119             :  * processed.
     120             :  *
     121             :  * When the tty layer will try to retransmit the character, this state
     122             :  * information is used to not retrig the emulops which have been issued
     123             :  * succesfully already.
     124             :  *
     125             :  * In order to make things more confusing, there is a particular failure
     126             :  * case, when all characters have been processed successfully, but
     127             :  * displaying the cursor image fails.
     128             :  *
     129             :  * Since there might not be tty output in a while, we need to report
     130             :  * failure, so we pretend not having been able to issue the last character.
     131             :  * When the tty layer tries again to display this character (really to get
     132             :  * the cursor image back), it will directly be skipped. This is done with
     133             :  * a special state value.
     134             :  */
     135             : 
     136             : struct wsemul_abortstate {
     137             :         enum {
     138             :                 ABORT_OK,
     139             :                 ABORT_FAILED_CURSOR,
     140             :                 ABORT_FAILED_JUMP_SCROLL,
     141             :                 ABORT_FAILED_OTHER
     142             :         } state;
     143             :         int     skip;   /* emulops to skip before reaching resume point */
     144             :         int     done;   /* emulops completed */
     145             :         int     lines;  /* jump scroll lines */
     146             : };
     147             : 
     148             : /* start character processing, assuming cursor or jump scroll failure condition
     149             :    has been taken care of */
     150             : static inline void
     151           0 : wsemul_resume_abort(struct wsemul_abortstate *was)
     152             : {
     153           0 :         was->state = ABORT_OK;
     154           0 :         was->done = 0;
     155           0 : }
     156             : 
     157             : /* register processing failure points */
     158             : static inline void
     159           0 : wsemul_abort_cursor(struct wsemul_abortstate *was)
     160             : {
     161           0 :         was->state = ABORT_FAILED_CURSOR;
     162           0 : }
     163             : 
     164             : static inline void
     165           0 : wsemul_abort_jump_scroll(struct wsemul_abortstate *was, int lines)
     166             : {
     167           0 :         was->state = ABORT_FAILED_JUMP_SCROLL;
     168           0 :         was->skip = was->done;
     169           0 :         was->lines = lines;
     170           0 : }
     171             : 
     172             : static inline void
     173           0 : wsemul_abort_other(struct wsemul_abortstate *was)
     174             : {
     175           0 :         was->state = ABORT_FAILED_OTHER;
     176           0 :         was->skip = was->done;
     177           0 : }
     178             : 
     179             : /* initialize abortstate structure */
     180             : static inline void
     181           0 : wsemul_reset_abortstate(struct wsemul_abortstate *was)
     182             : {
     183           0 :         was->state = ABORT_OK;
     184           0 :         was->skip = 0;
     185             :         /* was->done = 0; */
     186           0 : }
     187             : 
     188             : /*
     189             :  * Wrapper macro to handle failing emulops calls consistently.
     190             :  */
     191             : 
     192             : #ifdef HAVE_RESTARTABLE_EMULOPS
     193             : #define WSEMULOP(rc, edp, was, rutin, args) \
     194             : do { \
     195             :         if ((was)->skip != 0) { \
     196             :                 (was)->skip--; \
     197             :                 (rc) = 0; \
     198             :         } else { \
     199             :                 (rc) = (*(edp)->emulops->rutin) args ; \
     200             :         } \
     201             :         if ((rc) == 0) \
     202             :                 (was)->done++; \
     203             : } while (0)
     204             : #else
     205             : #define WSEMULOP(rc, edp, was, rutin, args) \
     206             : do { \
     207             :         (void)(*(edp)->emulops->rutin) args ; \
     208             :         (rc) = 0; \
     209             : } while(0)
     210             : #endif
     211             : 
     212             : #endif  /* _KERNEL */

Generated by: LCOV version 1.13