started adding console primitives
This commit is contained in:
parent
f82997394d
commit
cba78a7ec0
75
stix/kernel/test-014.st
Normal file
75
stix/kernel/test-014.st
Normal file
@ -0,0 +1,75 @@
|
||||
|
||||
#include 'Stix.st'.
|
||||
|
||||
#################################################################
|
||||
## MAIN
|
||||
#################################################################
|
||||
|
||||
## TODO: use #define to define a class or use #class to define a class.
|
||||
## use #extend to extend a class
|
||||
## using #class for both feels confusing.
|
||||
|
||||
#extend Apex
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#extend SmallInteger
|
||||
{
|
||||
#method getTrue: anInteger
|
||||
{
|
||||
^anInteger + 9999.
|
||||
}
|
||||
|
||||
#method inc
|
||||
{
|
||||
^self + 1.
|
||||
}
|
||||
}
|
||||
|
||||
#class TestObject(Object)
|
||||
{
|
||||
#dcl(#class) Q R.
|
||||
#dcl(#classinst) a1 a2.
|
||||
|
||||
#method test999
|
||||
{
|
||||
^self.Q
|
||||
}
|
||||
}
|
||||
|
||||
#class B.TestObject(Object)
|
||||
{
|
||||
#dcl(#class) Q R.
|
||||
#dcl(#classinst) a1 a2.
|
||||
|
||||
#method test000
|
||||
{
|
||||
^self.Q
|
||||
}
|
||||
}
|
||||
|
||||
#pooldic ABC
|
||||
{
|
||||
#KKK := 20.
|
||||
}
|
||||
|
||||
|
||||
#class MyObject(TestObject)
|
||||
{
|
||||
#method(#class) main
|
||||
{
|
||||
| v1 v2 |
|
||||
System logNl: 'START OF MAIN'.
|
||||
|
||||
v1 := Console output.
|
||||
|
||||
v1 write: S'hello, 월드 이거 좋지 않니\n'.
|
||||
v1 write: S'하하하하하하하하 좋아좋아 可愛くってしょうがない(^o^) ほのかちゃん、しおりちゃん元気そうだね! 久しぶりに見た。しおりちゃんどうしたのかな?좋아 하라하하\n'.
|
||||
v1 close.
|
||||
|
||||
System logNl: S'\0\0\0END OF MAIN\0AB\0\0\0C\0\0\0'.
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -95,7 +95,7 @@ libstix_snd_la_LIBADD = $(LIBADD_MOD_COMMON)
|
||||
libstix_con_la_SOURCES = mod-con.c mod-con.h
|
||||
libstix_con_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
|
||||
libstix_con_la_LDFLAGS = $(LDFLAGS_MOD_COMMON)
|
||||
libstix_con_la_LIBADD = $(LIBADD_MOD_COMMON)
|
||||
libstix_con_la_LIBADD = $(LIBADD_MOD_COMMON) -ltermcap
|
||||
|
||||
endif
|
||||
|
||||
|
@ -481,7 +481,7 @@ stix_LDADD = $(LIBADD_LIB_COMMON) -lstix #-ldyncall_s
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_con_la_SOURCES = mod-con.c mod-con.h
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_con_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_con_la_LDFLAGS = $(LDFLAGS_MOD_COMMON)
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_con_la_LIBADD = $(LIBADD_MOD_COMMON)
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_con_la_LIBADD = $(LIBADD_MOD_COMMON) -ltermcap
|
||||
all: stix-cfg.h
|
||||
$(MAKE) $(AM_MAKEFLAGS) all-am
|
||||
|
||||
|
260
stix/lib/mod-con.c
Normal file
260
stix/lib/mod-con.c
Normal file
@ -0,0 +1,260 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
Copyright (c) 2014-2016 Chung, Hyung-Hwan. 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 AUTHOR "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 AUTHOR 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 "mod-con.h"
|
||||
#include <stix-utl.h>
|
||||
|
||||
#include "stix-prv.h" /* TODO: remove this header after refactoring it */
|
||||
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <stdlib.h> /* getenv */
|
||||
|
||||
#include <curses.h>
|
||||
#include <term.h>
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
typedef struct console_t console_t;
|
||||
struct console_t
|
||||
{
|
||||
int fd;
|
||||
int fd_opened;
|
||||
char* cup;
|
||||
char* clear;
|
||||
};
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
static int prim_open (stix_t* stix, stix_ooi_t nargs)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
HANDLE h;
|
||||
stix_ooi_t immv;
|
||||
|
||||
h = GetStdHandle(STD_INPUT_HANDLE);
|
||||
if (h == INVALID_HANDLE_VALUE) return 0;
|
||||
if (h == NULL)
|
||||
{
|
||||
}
|
||||
|
||||
imm = stix_makeimm (stix, h);
|
||||
if (imm <= -1)
|
||||
{
|
||||
/* error */
|
||||
}
|
||||
|
||||
rsrc = stix_makersrc (stix, h);
|
||||
|
||||
#else
|
||||
|
||||
console_t* con;
|
||||
int err;
|
||||
char* term;
|
||||
|
||||
con = stix_callocmem (stix, STIX_SIZEOF(*con));
|
||||
if (!con) return 0;
|
||||
|
||||
if (isatty(1))
|
||||
{
|
||||
con->fd = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
con->fd = open ("/dev/tty", O_RDWR, 0);
|
||||
if (con->fd == -1)
|
||||
{
|
||||
/* TODO: failed to open /dev/stdout */
|
||||
stix_freemem (stix, con);
|
||||
return 0;
|
||||
}
|
||||
|
||||
con->fd_opened = 1;
|
||||
}
|
||||
|
||||
term = getenv ("TERM");
|
||||
if (term && setupterm (term, con->fd, &err) == OK)
|
||||
{
|
||||
}
|
||||
|
||||
con->cup = tigetstr ("cup"); /* TODO: error check */
|
||||
con->clear = tigetstr ("clear");
|
||||
|
||||
#if 0
|
||||
{
|
||||
const char* cup, * clear;
|
||||
struct winsize wsz;
|
||||
|
||||
cup = tigetstr ("cup");
|
||||
clear = tigetstr ("clear");
|
||||
ioctl (fd, TIOCGWINSZ, &wsz);
|
||||
|
||||
write (fd, clear, strlen(clear));
|
||||
/*write (fd, tparm (cup, wsz.ws_row - 1, 0), strlen(tparm (cup, wsz.ws_row - 1, 0)));*/
|
||||
write (fd, tiparm (cup, 0, 0), strlen(tiparm (cup, 0, 0)));
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
STIX_STACK_SETRET (stix, nargs, STIX_SMOOI_TO_OOP((stix_oow_t)con));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int prim_close (stix_t* stix, stix_ooi_t nargs)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
HANDLE h;
|
||||
|
||||
h = STIX_STACK_GETARG (stix, nargs, 0);
|
||||
#else
|
||||
#endif
|
||||
console_t* con;
|
||||
|
||||
con = STIX_OOP_TO_SMOOI(STIX_STACK_GETARG (stix, nargs, 0));
|
||||
/* TODO: sanity check */
|
||||
|
||||
if (con->fd_opened) close (con->fd);
|
||||
|
||||
STIX_STACK_SETRETTORCV (stix, nargs);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int prim_write (stix_t* stix, stix_ooi_t nargs)
|
||||
{
|
||||
console_t* con;
|
||||
stix_oop_char_t oomsg;
|
||||
|
||||
stix_oow_t ucspos, ucsrem, ucslen, bcslen;
|
||||
stix_bch_t bcs[1024];
|
||||
int n;
|
||||
|
||||
con = STIX_OOP_TO_SMOOI(STIX_STACK_GETARG (stix, nargs, 0));
|
||||
oomsg = (stix_oop_char_t)STIX_STACK_GETARG (stix, nargs, 1);
|
||||
|
||||
if (STIX_CLASSOF(stix,oomsg) != stix->_string)
|
||||
{
|
||||
/* TODO: invalid message */
|
||||
return 0;
|
||||
}
|
||||
|
||||
ucspos = 0;
|
||||
ucsrem = STIX_OBJ_GET_SIZE(oomsg);
|
||||
while (ucsrem > 0)
|
||||
{
|
||||
ucslen = ucsrem;
|
||||
bcslen = STIX_COUNTOF(bcs);
|
||||
if ((n = stix_ucstoutf8 (&oomsg->slot[ucspos], &ucslen, bcs, &bcslen)) <= -1)
|
||||
{
|
||||
if (n != -2 || ucslen <= 0)
|
||||
{
|
||||
stix_seterrnum (stix, STIX_EECERR);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
write (con->fd, bcs, bcslen); /* TODO: error handling */
|
||||
/* TODO: abort looping for async processing???? */
|
||||
ucspos += ucslen;
|
||||
ucsrem -= ucslen;
|
||||
}
|
||||
|
||||
STIX_STACK_SETRETTORCV (stix, nargs); /* TODO: change return code */
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int prim_setcursor (stix_t* stix, stix_ooi_t nargs)
|
||||
{
|
||||
console_t* con;
|
||||
stix_ooi_t x, y;
|
||||
char* cup;
|
||||
|
||||
con = STIX_OOP_TO_SMOOI(STIX_STACK_GETARG(stix, nargs, 0));
|
||||
point = STIX_OOP_TO_SMOOI(STIX_STACK_GETARG(stix, nargs, 1));
|
||||
|
||||
cup = tiparm (con->cup, point->slot[0], point->slot[1]);
|
||||
write (con->fd, cup, strlen(cup)); /* TODO: error check */
|
||||
free (cup);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
typedef struct fnctab_t fnctab_t;
|
||||
struct fnctab_t
|
||||
{
|
||||
const stix_bch_t* name;
|
||||
stix_prim_impl_t handler;
|
||||
};
|
||||
|
||||
static fnctab_t fnctab[] =
|
||||
{
|
||||
{ "close", prim_close },
|
||||
{ "open", prim_open },
|
||||
{ "setcursor", prim_setcursor },
|
||||
{ "write", prim_write },
|
||||
};
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
static stix_prim_impl_t query (stix_t* stix, stix_prim_mod_t* mod, const stix_ooch_t* name)
|
||||
{
|
||||
int left, right, mid, n;
|
||||
|
||||
left = 0; right = STIX_COUNTOF(fnctab) - 1;
|
||||
|
||||
while (left <= right)
|
||||
{
|
||||
mid = (left + right) / 2;
|
||||
|
||||
n = stix_compoocbcstr (name, fnctab[mid].name);
|
||||
if (n < 0) right = mid - 1;
|
||||
else if (n > 0) left = mid + 1;
|
||||
else
|
||||
{
|
||||
return fnctab[mid].handler;
|
||||
}
|
||||
}
|
||||
|
||||
stix->errnum = STIX_ENOENT;
|
||||
return STIX_NULL;
|
||||
}
|
||||
|
||||
|
||||
static void unload (stix_t* stix, stix_prim_mod_t* mod)
|
||||
{
|
||||
/* TODO: close all open handle?? */
|
||||
}
|
||||
|
||||
|
||||
int stix_prim_mod_con (stix_t* stix, stix_prim_mod_t* mod)
|
||||
{
|
||||
mod->query = query;
|
||||
mod->unload = unload;
|
||||
mod->ctx = STIX_NULL;
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user