156043Syokota/*- 256043Syokota * Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp> 356043Syokota * All rights reserved. 456043Syokota * 556043Syokota * Redistribution and use in source and binary forms, with or without 656043Syokota * modification, are permitted provided that the following conditions 756043Syokota * are met: 856043Syokota * 1. Redistributions of source code must retain the above copyright 956043Syokota * notice, this list of conditions and the following disclaimer as 1056043Syokota * the first lines of this file unmodified. 1156043Syokota * 2. Redistributions in binary form must reproduce the above copyright 1256043Syokota * notice, this list of conditions and the following disclaimer in the 1356043Syokota * documentation and/or other materials provided with the distribution. 1456043Syokota * 1556043Syokota * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 1656043Syokota * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1756043Syokota * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1856043Syokota * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, 1956043Syokota * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2056043Syokota * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2156043Syokota * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2256043Syokota * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2356043Syokota * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2456043Syokota * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2556043Syokota * 2656043Syokota */ 2756043Syokota 28119420Sobrien#include <sys/cdefs.h> 29119420Sobrien__FBSDID("$FreeBSD$"); 30119420Sobrien 3156043Syokota#include "opt_syscons.h" 3256043Syokota 3356043Syokota#include <sys/param.h> 3456043Syokota#include <sys/systm.h> 3556043Syokota#include <sys/kernel.h> 3656043Syokota#include <sys/consio.h> 3756043Syokota 3856043Syokota#include <dev/syscons/syscons.h> 3956043Syokota 4078161SpeterSET_DECLARE(scterm_set, sc_term_sw_t); 4178161Speter 4256043Syokota/* exported subroutines */ 4356043Syokota 4456043Syokotavoid 4556043Syokotasc_move_cursor(scr_stat *scp, int x, int y) 4656043Syokota{ 4756043Syokota if (x < 0) 4856043Syokota x = 0; 4956043Syokota if (y < 0) 5056043Syokota y = 0; 5156043Syokota if (x >= scp->xsize) 5256043Syokota x = scp->xsize - 1; 5356043Syokota if (y >= scp->ysize) 5456043Syokota y = scp->ysize - 1; 5556043Syokota scp->xpos = x; 5656043Syokota scp->ypos = y; 5756043Syokota scp->cursor_pos = scp->ypos*scp->xsize + scp->xpos; 5856043Syokota} 5956043Syokota 6056043Syokotavoid 6156043Syokotasc_clear_screen(scr_stat *scp) 6256043Syokota{ 6356043Syokota (*scp->tsw->te_clear)(scp); 6456043Syokota scp->cursor_oldpos = scp->cursor_pos; 6556043Syokota sc_remove_cutmarking(scp); 6656043Syokota} 6756043Syokota 6856043Syokota/* terminal emulator manager routines */ 6956043Syokota 7060938Sjakestatic LIST_HEAD(, sc_term_sw) sc_term_list = 7156043Syokota LIST_HEAD_INITIALIZER(sc_term_list); 7256043Syokota 7356043Syokotaint 7456043Syokotasc_term_add(sc_term_sw_t *sw) 7556043Syokota{ 7656043Syokota LIST_INSERT_HEAD(&sc_term_list, sw, link); 7756043Syokota return 0; 7856043Syokota} 7956043Syokota 8056043Syokotaint 8156043Syokotasc_term_remove(sc_term_sw_t *sw) 8256043Syokota{ 8356043Syokota LIST_REMOVE(sw, link); 8456043Syokota return 0; 8556043Syokota} 8656043Syokota 8756043Syokotasc_term_sw_t 8856043Syokota*sc_term_match(char *name) 8956043Syokota{ 9056043Syokota sc_term_sw_t **list; 9156043Syokota sc_term_sw_t *p; 9256043Syokota 9356043Syokota if (!LIST_EMPTY(&sc_term_list)) { 9456043Syokota LIST_FOREACH(p, &sc_term_list, link) { 9556043Syokota if ((strcmp(name, p->te_name) == 0) 9656043Syokota || (strcmp(name, "*") == 0)) { 9756043Syokota return p; 9856043Syokota } 9956043Syokota } 10056043Syokota } else { 10178161Speter SET_FOREACH(list, scterm_set) { 10278161Speter p = *list; 10356043Syokota if ((strcmp(name, p->te_name) == 0) 10456043Syokota || (strcmp(name, "*") == 0)) { 10556043Syokota return p; 10656043Syokota } 10756043Syokota } 10856043Syokota } 10956043Syokota 11056043Syokota return NULL; 11156043Syokota} 11256043Syokota 11356043Syokotasc_term_sw_t 11456043Syokota*sc_term_match_by_number(int index) 11556043Syokota{ 11656043Syokota sc_term_sw_t *p; 11756043Syokota 11856043Syokota if (index <= 0) 11956043Syokota return NULL; 12056043Syokota LIST_FOREACH(p, &sc_term_list, link) { 12156043Syokota if (--index <= 0) 12256043Syokota return p; 12356043Syokota } 12456043Syokota 12556043Syokota return NULL; 12656043Syokota} 127