1*0a0d522bSKyle Evans /*-
2*0a0d522bSKyle Evans * Copyright (c) 2020 Kyle Evans <kevans@FreeBSD.org>
3*0a0d522bSKyle Evans *
4*0a0d522bSKyle Evans * Redistribution and use in source and binary forms, with or without
5*0a0d522bSKyle Evans * modification, are permitted provided that the following conditions
6*0a0d522bSKyle Evans * are met:
7*0a0d522bSKyle Evans * 1. Redistributions of source code must retain the above copyright
8*0a0d522bSKyle Evans * notice, this list of conditions and the following disclaimer.
9*0a0d522bSKyle Evans * 2. Redistributions in binary form must reproduce the above copyright
10*0a0d522bSKyle Evans * notice, this list of conditions and the following disclaimer in the
11*0a0d522bSKyle Evans * documentation and/or other materials provided with the distribution.
12*0a0d522bSKyle Evans *
13*0a0d522bSKyle Evans * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14*0a0d522bSKyle Evans * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15*0a0d522bSKyle Evans * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16*0a0d522bSKyle Evans * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17*0a0d522bSKyle Evans * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18*0a0d522bSKyle Evans * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19*0a0d522bSKyle Evans * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20*0a0d522bSKyle Evans * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21*0a0d522bSKyle Evans * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22*0a0d522bSKyle Evans * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23*0a0d522bSKyle Evans * SUCH DAMAGE.
24*0a0d522bSKyle Evans */
25*0a0d522bSKyle Evans
26*0a0d522bSKyle Evans #include <lua.h>
27*0a0d522bSKyle Evans #include "lauxlib.h"
28*0a0d522bSKyle Evans
29*0a0d522bSKyle Evans /* Open the pager. No arguments, no return value. */
30*0a0d522bSKyle Evans static int
lpager_open(lua_State * L)31*0a0d522bSKyle Evans lpager_open(lua_State *L)
32*0a0d522bSKyle Evans {
33*0a0d522bSKyle Evans
34*0a0d522bSKyle Evans pager_open();
35*0a0d522bSKyle Evans return (0);
36*0a0d522bSKyle Evans }
37*0a0d522bSKyle Evans
38*0a0d522bSKyle Evans /*
39*0a0d522bSKyle Evans * Output to the pager. All arguments are interpreted as strings and passed to
40*0a0d522bSKyle Evans * pager_output(). No return value.
41*0a0d522bSKyle Evans */
42*0a0d522bSKyle Evans static int
lpager_output(lua_State * L)43*0a0d522bSKyle Evans lpager_output(lua_State *L)
44*0a0d522bSKyle Evans {
45*0a0d522bSKyle Evans const char *outstr;
46*0a0d522bSKyle Evans int i;
47*0a0d522bSKyle Evans
48*0a0d522bSKyle Evans for (i = 1; i <= lua_gettop(L); i++) {
49*0a0d522bSKyle Evans outstr = luaL_tolstring(L, i, NULL);
50*0a0d522bSKyle Evans pager_output(outstr);
51*0a0d522bSKyle Evans lua_pop(L, -1);
52*0a0d522bSKyle Evans }
53*0a0d522bSKyle Evans
54*0a0d522bSKyle Evans return (0);
55*0a0d522bSKyle Evans }
56*0a0d522bSKyle Evans
57*0a0d522bSKyle Evans /* Output to the pager from a file. Takes a filename, no return value. */
58*0a0d522bSKyle Evans static int
lpager_file(lua_State * L)59*0a0d522bSKyle Evans lpager_file(lua_State *L)
60*0a0d522bSKyle Evans {
61*0a0d522bSKyle Evans
62*0a0d522bSKyle Evans return (pager_file(luaL_checkstring(L, 1)));
63*0a0d522bSKyle Evans }
64*0a0d522bSKyle Evans
65*0a0d522bSKyle Evans static int
lpager_close(lua_State * L)66*0a0d522bSKyle Evans lpager_close(lua_State *L)
67*0a0d522bSKyle Evans {
68*0a0d522bSKyle Evans
69*0a0d522bSKyle Evans pager_close();
70*0a0d522bSKyle Evans return (0);
71*0a0d522bSKyle Evans }
72*0a0d522bSKyle Evans
73*0a0d522bSKyle Evans static const struct luaL_Reg pagerlib[] = {
74*0a0d522bSKyle Evans { "open", lpager_open },
75*0a0d522bSKyle Evans { "output", lpager_output },
76*0a0d522bSKyle Evans { "file", lpager_file },
77*0a0d522bSKyle Evans { "close", lpager_close },
78*0a0d522bSKyle Evans { NULL, NULL },
79*0a0d522bSKyle Evans };
80*0a0d522bSKyle Evans
81*0a0d522bSKyle Evans int
luaopen_pager(lua_State * L)82*0a0d522bSKyle Evans luaopen_pager(lua_State *L)
83*0a0d522bSKyle Evans {
84*0a0d522bSKyle Evans luaL_newlib(L, pagerlib);
85*0a0d522bSKyle Evans return 1;
86*0a0d522bSKyle Evans }
87