[BACK]Return to mygetnstr.c CVS log [TXT][DIR] Up to [contributed] / dgamelaunch-openbsd

File: [contributed] / dgamelaunch-openbsd / mygetnstr.c (download)

Revision 1.1, Tue Mar 9 14:36:00 2021 UTC (3 years, 1 month ago) by rubenllorente
Branch point for: MAIN

Initial revision

/*
 * Copyright (c) 2004, Jilles Tjoelker
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with
 * or without modification, are permitted provided that the
 * following conditions are met:
 *
 * 1. Redistributions of source code must retain the above
 *    copyright notice, this list of conditions and the
 *    following disclaimer.
 * 2. Redistributions in binary form must reproduce the
 *    above copyright notice, this list of conditions and
 *    the following disclaimer in the documentation and/or
 *    other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
 * OF SUCH DAMAGE.
 */

#include <curses.h>

/* Assumes noecho(). */
/* As with getnstr(), maxlen does not include the '\0' character. */

int
mygetnstr(char *buf, int maxlen, int doecho)
{
    int c, i;

    i = 0;
    for (;;)
    {
	c = getch();
	if (c == 8 || c == 127 || c == KEY_BACKSPACE || c == KEY_DC ||
		c == KEY_LEFT)
	{
	    if (i > 0)
	    {
		i--;
		if (doecho)
		    addstr("\010 \010");
	    }
	    else
		beep();
	}
	else if (c == 21 || c == 24 || c == KEY_DL) /* ^U/^X */
	{
	    while (i > 0)
	    {
		i--;
		if (doecho)
		    addstr("\010 \010");
	    }
	}
	else if (c == 23) /* ^W */
	{
	    while (i > 0 && buf[i - 1] == ' ')
	    {
		i--;
		if (doecho)
		    addstr("\010 \010");
	    }
	    while (i > 0 && buf[i - 1] != ' ')
	    {
		i--;
		if (doecho)
		    addstr("\010 \010");
	    }
	}
	else if ((c >= ' ' && c <= '~'))
	{
	    if (i < maxlen)
	    {
		buf[i] = c;
		i++;
		if (doecho)
		    addch(c);
	    }
	    else
		beep();
	}
	else if (c == 10 || c == 13 || c == KEY_ENTER || c == KEY_RESIZE)
	    break;
	else if (c == ERR)
	{
	    buf[i] = 0;
	    return ERR;
	}
	else
	    beep();
    }
    buf[i] = 0;
    return OK;
}

/* vim:ts=8:cin:sw=4
 */