# To check our support for screens in scenarios, rewrite tests from print.mu
scenario print-character-at-top-left2 [
assume-screen 3:literal/width, 2:literal/height
run [
screen:address <- print-character screen:address, 97:literal # 'a'
]
screen-should-contain [
.a .
. .
]
]
scenario clear-line-erases-printed-characters2 [
assume-screen 5:literal/width, 3:literal/height
run [
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* 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 *//*
* POSIX library for Lua 5.1, 5.2 & 5.3.
* (c) Gary V. Vaughan <gary@vaughan.pe>, 2013-2017
* (c) Reuben Thomas <rrt@sc3d.org> 2010-2013
* (c) Natanael Copa <natanael.copa@gmail.com> 2008-2010
* Clean up and bug fixes by Leo Razoumov <slonik.az@gmail.com> 2006-10-11
* Luiz Henrique de Figueiredo <lhf@tecgraf.puc-rio.br> 07 Apr 2006 23:17:49
* Based on original by Claudio Terra for Lua 3.x.
* With contributions by Roberto Ierusalimschy.
* With documentation from Steve Donovan 2012
*/
#ifndef LCURSES__HELPERS_C
#define LCURSES__HELPERS_C 1
#include <errno.h>
#include <grp.h>
#include <pwd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h> /* for _POSIX_VERSION */
#ifdef __NetBSD__
#include <curses.h>
#else
#include <ncurses.h>
#endif
#include <term.h>
#include "../lua.h"
#include "../lualib.h"
#include "../lauxlib.h"
#if LUA_VERSION_NUM < 503
# define lua_isinteger lua_isnumber
# if LUA_VERSION_NUM == 501
# include "compat-5.2.c"
# endif
#endif
#if LUA_VERSION_NUM == 502 || LUA_VERSION_NUM == 503
# define lua_objlen lua_rawlen
# define lua_strlen lua_rawlen
# define luaL_openlib(L,n,l,nup) luaL_setfuncs((L),(l),(nup))
# define luaL_register(L,n,l) (luaL_newlib(L,l))
#endif
#ifndef STREQ
# define STREQ(a, b) (strcmp (a, b) == 0)
#endif
/* Mark unused parameters required only to match a function type
specification. */
#ifdef __GNUC__
# define LCURSES_UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
#else
# define LCURSES_UNUSED(x) UNUSED_ ## x
#endif
/* LCURSES_STMT_BEG/END are used to create macros that expand to a
single compound statement in a portable way. */
#if defined __GNUC__ && !defined __STRICT_ANSI__ && !defined __cplusplus
# define LCURSES_STMT_BEG (void)(
# define LCURSES_STMT_END )
#else
# if (defined sun || defined __sun__)
# define LCURSES_STMT_BEG if (1)
# define LCURSES_STMT_END else (void)0
# else
# define LCURSES_STMT_BEG do
# define LCURSES_STMT_END while (0)
# endif
#endif
/* The extra indirection to these macros is required so that if the
arguments are themselves macros, they will get expanded too. */
#define LCURSES__SPLICE(_s, _t) _s##_t
#define LCURSES_SPLICE(_s, _t) LCURSES__SPLICE(_s, _t)
#define LCURSES__STR(_s) #_s
#define LCURSES_STR(_s) LCURSES__STR(_s)
/* The +1 is to step over the leading '_' that is required to prevent
premature expansion of MENTRY arguments if we didn't add it. */
#define LCURSES__STR_1(_s) (#_s + 1)
#define LCURSES_STR_1(_s) LCURSES__STR_1(_s)
#define LCURSES_CONST(_f) LCURSES_STMT_BEG { \
lua_pushinteger(L, _f); \
lua_setfield(L, -2, #_f); \
} LCURSES_STMT_END
#define LCURSES_FUNC(_s) {LCURSES_STR_1(_s), (_s)}
#define pushokresult(b) pushboolresult((int) (b) == OK)
#ifndef errno
extern int errno;
#endif
/* ========================= *
* Bad argument diagnostics. *
* ========================= */
static int
argtypeerror(lua_State *L, int narg, const char *expected)
{
const char *got = luaL_typename(L, narg);
return luaL_argerror(L, narg,
lua_pushfstring(L, "%s expected, got %s", expected, got));
}
static lua_Integer
checkinteger(lua_State *L, int narg, const char *expected)
{
lua_Integer d = lua_tointeger(L, narg);
if (d == 0 && !lua_isinteger(L, narg))
argtypeerror(L, narg, expected);
return d;
}
static int
checkint(lua_State *L, int narg)
{
return (int)checkinteger(L, narg, "int");
}
static chtype
checkch(lua_State *L, int narg)
{
if (lua_isnumber(L, narg))
return (chtype)checkint(L, narg);
if (lua_isstring(L, narg))
return *lua_tostring(L, narg);
return argtypeerror(L, narg, "int or char");
}
static chtype
optch(lua_State *L, int narg, chtype def)
{
if (lua_isnoneornil(L, narg))
return def;
if (lua_isnumber(L, narg) || lua_isstring(L, narg))
return checkch(L, narg);
return argtypeerror(L, narg, "int or char or nil");
}
static int
optint(lua_State *L, int narg, lua_Integer def)
{
if (lua_isnoneornil(L, narg))
return (int) def;
return (int)checkinteger(L, narg, "int or nil");
}
#define pushboolresult(b) (lua_pushboolean(L, (b)), 1)
#define pushintresult(n) (lua_pushinteger(L, (n)), 1)
#define pushstringresult(s) (lua_pushstring(L, (s)), 1)
/* ================== *
* Utility functions. *
* ================== */
#define pushintegerfield(k,v) LCURSES_STMT_BEG { \
lua_pushinteger(L, (lua_Integer) v); lua_setfield(L, -2, k); \
} LCURSES_STMT_END
#define pushnumberfield(k,v) LCURSES_STMT_BEG { \
lua_pushnumber(L, (lua_Number) v); lua_setfield(L, -2, k); \
} LCURSES_STMT_END
#define pushstringfield(k,v) LCURSES_STMT_BEG { \
if (v) { \
lua_pushstring(L, (const char *) v); \
lua_setfield(L, -2, k); \
} \
} LCURSES_STMT_END
#define pushliteralfield(k,v) LCURSES_STMT_BEG { \
if (v) { \
lua_pushliteral(L, v); \
lua_setfield(L, -2, k); \
} \
} LCURSES_STMT_END
#define settypemetatable(t) LCURSES_STMT_BEG { \
if (luaL_newmetatable(L, t) == 1) \
pushliteralfield("_type", t); \
lua_setmetatable(L, -2); \
} LCURSES_STMT_END
#define setintegerfield(_p, _n) pushintegerfield(LCURSES_STR(_n), _p->_n)
#define setnumberfield(_p, _n) pushnumberfield(LCURSES_STR(_n), _p->_n)
#define setstringfield(_p, _n) pushstringfield(LCURSES_STR(_n), _p->_n)
#endif /*LCURSES__HELPERS_C*/