Merge branch 'master' of git.dcc.fc.up.pt:yap-6.3

Conflicts:
	configure
	configure.in
This commit is contained in:
Vitor Santos Costa 2014-02-27 16:33:25 +00:00
commit 0ab280ad25
20 changed files with 797 additions and 478 deletions

51
configure vendored
View File

@ -5230,8 +5230,49 @@ then
if test "$cygwin" = "no" -o "$target_os" = "mingw32"
then
# locale complaints without this.
if test "$threads" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lmscrt" >&5
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lpthread" >&5
$as_echo_n "checking for main in -lpthread... " >&6; }
if ${ac_cv_lib_pthread_main+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lpthread $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
return main ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_pthread_main=yes
else
ac_cv_lib_pthread_main=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_main" >&5
$as_echo "$ac_cv_lib_pthread_main" >&6; }
if test "x$ac_cv_lib_pthread_main" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBPTHREAD 1
_ACEOF
LIBS="-lpthread $LIBS"
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lmscrt" >&5
$as_echo_n "checking for main in -lmscrt... " >&6; }
if ${ac_cv_lib_mscrt_main+:} false; then :
$as_echo_n "(cached) " >&6
@ -12102,7 +12143,7 @@ else
JAVA_TEST=Test.java
CLASS_TEST=Test.class
cat << \EOF > $JAVA_TEST
/* #line 12105 "configure" */
/* #line 12146 "configure" */
public class Test {
}
EOF
@ -12278,7 +12319,7 @@ EOF
if uudecode$EXEEXT Test.uue; then
ac_cv_prog_uudecode_base64=yes
else
echo "configure: 12281: uudecode had trouble decoding base 64 file 'Test.uue'" >&5
echo "configure: 12322: uudecode had trouble decoding base 64 file 'Test.uue'" >&5
echo "configure: failed file was:" >&5
cat Test.uue >&5
ac_cv_prog_uudecode_base64=no
@ -12409,7 +12450,7 @@ else
JAVA_TEST=Test.java
CLASS_TEST=Test.class
cat << \EOF > $JAVA_TEST
/* #line 12412 "configure" */
/* #line 12453 "configure" */
public class Test {
}
EOF
@ -12444,7 +12485,7 @@ JAVA_TEST=Test.java
CLASS_TEST=Test.class
TEST=Test
cat << \EOF > $JAVA_TEST
/* [#]line 12447 "configure" */
/* [#]line 12488 "configure" */
public class Test {
public static void main (String args[]) {
System.exit (0);

View File

@ -498,6 +498,9 @@ then
if test "$cygwin" = "no" -o "$target_os" = "mingw32"
then
# locale complaints without this.
if test "$threads" = yes; then
AC_CHECK_LIB(pthread, main)
fi
AC_CHECK_LIB(mscrt,main)
if test "$target_cpu" = x86_64; then
YAP_TARGET=amd64

View File

@ -1,4 +1,4 @@
/* $Id$
/* $Id$
Part of SWI-Prolog
@ -20,7 +20,7 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#define WINDOWS_LEAN_AND_MEAN 1
@ -43,6 +43,10 @@ typedef enum
CMD_ANSI
} astate;
typedef enum
{ HDL_CONSOLE = 0,
HDL_FILE
} htype;
typedef struct
{ int magic;
@ -57,6 +61,7 @@ typedef struct
int argstat;
astate cmdstat; /* State for sequence processing */
WORD def_attr; /* Default attributes */
htype handletype; /* Type of stream handle */
} ansi_stream;
@ -85,11 +90,19 @@ flush_ansi(ansi_stream *as)
{ BOOL rc;
DWORD done;
rc = WriteConsoleW(as->hConsole,
&as->buffer[written],
(DWORD)(as->buffered-written),
&done,
NULL);
if (as->handletype == HDL_CONSOLE)
{ rc = WriteConsoleW(as->hConsole,
&as->buffer[written],
(DWORD)(as->buffered-written),
&done,
NULL);
} else
{ rc = WriteFile(as->hConsole,
&as->buffer[written],
(DWORD)(as->buffered-written),
&done,
NULL);
}
if ( rc )
{ written += done;
@ -347,7 +360,20 @@ control_ansi(void *handle, int op, void *data)
case SIO_SETENCODING:
return -1; /* We cannot change the encoding! */
case SIO_LASTERROR:
return 0; /* TBD */
{ const char *s;
if ( (s = WinError()) );
{ const char **sp = data;
*sp = s;
return 0;
}
return -1;
}
case SIO_GETFILENO:
{ int *fp = data;
*fp = (int)(intptr_t)as->saved_handle; /* is one of 0,1,2 */
return 0;
}
default:
return -1;
}
@ -402,10 +428,16 @@ error:
static int
wrap_console(HANDLE h, IOSTREAM *s, IOFUNCTIONS *funcs)
{ ansi_stream *as;
DWORD mode;
as = PL_malloc(sizeof(*as));
memset(as, 0, sizeof(*as));
if (GetConsoleMode(h, &mode))
as->handletype = HDL_CONSOLE;
else
as->handletype = HDL_FILE;
as->hConsole = h;
as->pStream = s;
as->saved_handle = s->handle;
@ -413,6 +445,7 @@ wrap_console(HANDLE h, IOSTREAM *s, IOFUNCTIONS *funcs)
s->handle = as;
s->encoding = ENC_WCHAR;
s->functions = funcs;
s->flags &= ~SIO_FILE;
return TRUE;
}

View File

@ -1,11 +1,10 @@
/* $Id$
Part of SWI-Prolog
/* Part of SWI-Prolog
Author: Jan Wielemaker
E-mail: jan@swi.psy.uva.nl
E-mail: J.Wielemaker@cs.vu.nl
WWW: http://www.swi-prolog.org
Copyright (C): 1985-2002, University of Amsterdam
Copyright (C): 1985-2013, University of Amsterdam
VU University Amsterdam
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@ -19,9 +18,18 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#define _UNICODE 1
#define UNICODE 1
#ifdef WIN64
#include "config/win64.h"
#else
#include "config/win32.h"
#endif
#include <windows.h>
#include <tchar.h>
#include <malloc.h>
@ -45,19 +53,22 @@
#define streq(s,q) (strcmp((s), (q)) == 0)
#endif
#ifndef _TINT
typedef wint_t _TINT;
#endif
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Main program for running SWI-Prolog from a window. The window provides
X11-xterm like features: scrollback for a predefined number of lines,
cut/paste and the GNU readline library for command-line editing.
This module combines libpl.dll and plterm.dll with some glue to produce
This module combines swipl.dll and plterm.dll with some glue to produce
the final executable swipl-win.exe.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
__declspec(dllexport) rlc_console PL_current_console();
static int type_error(term_t actual, const char *expected);
static int domain_error(term_t actual, const char *expected);
static HWND create_prolog_hidden_window(rlc_console c);
__declspec(dllexport) rlc_console PL_current_console(void);
__declspec(dllexport) int PL_set_menu_thread(void);
static HWND create_prolog_hidden_window(rlc_console c, int replace);
static int get_chars_arg_ex(int a, term_t t, TCHAR **v);
#define RLC_PROLOG_WINDOW RLC_VALUE(0) /* GetCurrentThreadID() */
@ -67,10 +78,10 @@ static int get_chars_arg_ex(int a, term_t t, TCHAR **v);
#define RLC_REGISTER RLC_VALUE(4) /* Trap destruction */
/*******************************
* CONSOLE ADM *
* CONSOLE ADMIN *
*******************************/
CRITICAL_SECTION mutex;
static CRITICAL_SECTION mutex;
#define LOCK() EnterCriticalSection(&mutex)
#define UNLOCK() LeaveCriticalSection(&mutex)
@ -125,7 +136,7 @@ registerConsole(rlc_console c)
void
closeConsoles()
closeConsoles(void)
{ int i;
rlc_console *p;
@ -151,11 +162,12 @@ static ssize_t
Srlc_read(void *handle, char *buffer, size_t size)
{ rlc_console c = handle;
size_t bytes;
int is_user_input = (Suser_input && Suser_input->handle == c);
term_t ex;
PL_write_prompt(TRUE);
if ( Suser_input &&
Suser_input->handle == c &&
if ( is_user_input &&
PL_ttymode(Suser_input) == PL_RAWTTY )
{ int chr = getkey(c);
TCHAR *tbuf = (TCHAR*)buffer;
@ -171,6 +183,11 @@ Srlc_read(void *handle, char *buffer, size_t size)
bytes *= sizeof(TCHAR);
}
if ( is_user_input && (ex=PL_exception(0)) )
{ Sset_exception(Suser_input, ex);
return -1;
}
if ( bytes == 0 || buffer[bytes-1] == '\n' )
PL_prompt_next(0);
@ -186,6 +203,10 @@ The flushing code will remember `half' characters and re-send them as
more data comes ready. This means however that after a put_byte(X), the
wchar_t stream is out-of-sync and produces unreadable output. We will
therefore pad it with '?' characters to re-sync the stream.
The downside of this is that Sputc() and Sputcode() do not work on
unbuffered streams and thus Serror must be locked before using these
functions.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
static ssize_t
@ -193,18 +214,7 @@ Srlc_write(void *handle, char *buffer, size_t size)
{ rlc_console c = handle;
ssize_t n;
if (size==1) {
TCHAR buf ='\0';
char *bufp = (char *)&buf;
if (!buffer[0]) return 1;
bufp[0] = buffer[0];
size = sizeof(TCHAR);
n = rlc_write(c, &buf, size/sizeof(TCHAR));
return (n ? 1 : 0);
} else {
n = rlc_write(c, (TCHAR*)buffer, size/sizeof(TCHAR));
}
n = rlc_write(c, (TCHAR*)buffer, size/sizeof(TCHAR));
n *= sizeof(TCHAR);
if ( n < (ssize_t)size && size-n < sizeof(TCHAR) )
@ -285,6 +295,10 @@ rlc_bind_terminal(rlc_console c)
Sinput->encoding = ENC_WCHAR;
Soutput->encoding = ENC_WCHAR;
Serror->encoding = ENC_WCHAR;
Sinput->flags &= ~SIO_FILE;
Soutput->flags &= ~SIO_FILE;
Serror->flags &= ~SIO_FILE;
}
@ -299,7 +313,7 @@ process_console_options(rlc_console_attr *attr, term_t options)
int arity;
if ( !PL_get_name_arity(opt, &name, &arity) )
return type_error(opt, "compound");
return PL_type_error("compound", opt);
s = PL_atom_chars(name);
if ( streq(s, "registry_key") && arity == 1 )
{ TCHAR *key;
@ -309,10 +323,10 @@ process_console_options(rlc_console_attr *attr, term_t options)
attr->key = key;
} else
return domain_error(opt, "window_option");
return PL_domain_error("window_option", opt);
}
if ( !PL_get_nil(tail) )
return type_error(tail, "list");
if ( !PL_get_nil_ex(tail) )
return FALSE;
return TRUE;
}
@ -336,18 +350,18 @@ pl_win_open_console(term_t title, term_t input, term_t output, term_t error,
size_t len;
memset(&attr, 0, sizeof(attr));
if ( !PL_get_wchars(title, &len, &s, CVT_ALL|BUF_RING) )
return type_error(title, "text");
if ( !PL_get_wchars(title, &len, &s, CVT_ALL|BUF_RING|CVT_EXCEPTION) )
return FALSE;
attr.title = (const TCHAR*) s;
if ( !process_console_options(&attr, options) )
return FALSE;
c = rlc_create_console(&attr);
create_prolog_hidden_window(c); /* for sending messages */
create_prolog_hidden_window(c, FALSE); /* for sending messages */
registerConsole(c);
#define STREAM_COMMON (SIO_TEXT| /* text-stream */ \
#define STREAM_COMMON (SIO_TEXT| /* text-stream */ \
SIO_NOCLOSE| /* do no close on abort */ \
SIO_ISATTY| /* terminal */ \
SIO_NOFEOF) /* reset on end-of-file */
@ -394,7 +408,7 @@ pl_rl_add_history(term_t text)
{ atom_t a;
static atom_t last = 0;
if ( PL_get_atom(text, &a) )
if ( PL_get_atom_ex(text, &a) )
{ if ( a != last )
{ TCHAR *s;
@ -403,9 +417,8 @@ pl_rl_add_history(term_t text)
last = a;
PL_register_atom(last);
PL_get_wchars(text, NULL, &s, CVT_ATOM);
rlc_add_history(PL_current_console(), s);
if ( PL_get_wchars(text, NULL, &s, CVT_ATOM) )
rlc_add_history(PL_current_console(), s);
}
return TRUE;
@ -415,6 +428,35 @@ pl_rl_add_history(term_t text)
}
static int
add_line(void *h, int no, const TCHAR *line)
{ term_t tail = (term_t)h;
term_t head = PL_new_term_ref();
if ( !PL_unify_wchars(head, PL_ATOM, (size_t)-1, line) ||
!PL_cons_list(tail, head, tail) )
return -1;
PL_reset_term_refs(head);
return 0;
}
static foreign_t
pl_rl_history(term_t list)
{ term_t tail = PL_new_term_ref();
if ( !PL_unify_nil(tail) )
return FALSE;
if ( rlc_for_history(PL_current_console(), add_line, (void*)tail) == 0 )
return PL_unify(tail, list);
return FALSE;
}
static foreign_t
pl_rl_read_init_file(term_t file)
{ PL_succeed;
@ -506,13 +548,26 @@ PL_current_console(void)
}
static rlc_console main_console;
int
PL_set_menu_thread(void)
{ if ( main_console )
{ create_prolog_hidden_window(main_console, TRUE);
return TRUE;
}
return FALSE;
}
foreign_t
pl_window_title(term_t old, term_t new)
{ TCHAR buf[256];
TCHAR *n;
if ( !PL_get_wchars(new, NULL, &n, CVT_ALL) )
return type_error(new, "atom");
if ( !PL_get_wchars(new, NULL, &n, CVT_ALL|CVT_EXCEPTION) )
return FALSE;
rlc_title(PL_current_console(), n, buf, sizeof(buf)/sizeof(TCHAR));
@ -520,41 +575,15 @@ pl_window_title(term_t old, term_t new)
}
static int
type_error(term_t actual, const char *expected)
{ term_t ex = PL_new_term_ref();
PL_unify_term(ex, PL_FUNCTOR_CHARS, "error", 2,
PL_FUNCTOR_CHARS, "type_error", 2,
PL_CHARS, expected,
PL_TERM, actual,
PL_VARIABLE);
return PL_raise_exception(ex);
}
static int
domain_error(term_t actual, const char *expected)
{ term_t ex = PL_new_term_ref();
PL_unify_term(ex, PL_FUNCTOR_CHARS, "error", 2,
PL_FUNCTOR_CHARS, "domain_error", 2,
PL_CHARS, expected,
PL_TERM, actual,
PL_VARIABLE);
return PL_raise_exception(ex);
}
static int
get_chars_arg_ex(int a, term_t t, TCHAR **v)
{ term_t arg = PL_new_term_ref();
if ( PL_get_arg(a, t, arg) &&
PL_get_wchars(arg, NULL, v, CVT_ALL|BUF_RING) )
PL_get_wchars(arg, NULL, v, CVT_ALL|BUF_RING|CVT_EXCEPTION) )
return TRUE;
return type_error(arg, "text");
return FALSE;
}
@ -562,11 +591,11 @@ static int
get_int_arg_ex(int a, term_t t, int *v)
{ term_t arg = PL_new_term_ref();
PL_get_arg(a, t, arg);
if ( PL_get_integer(arg, v) )
_PL_get_arg(a, t, arg);
if ( PL_get_integer_ex(arg, v) )
return TRUE;
return type_error(arg, "integer");
return FALSE;
}
@ -574,11 +603,11 @@ static int
get_bool_arg_ex(int a, term_t t, int *v)
{ term_t arg = PL_new_term_ref();
PL_get_arg(a, t, arg);
if ( PL_get_bool(arg, v) )
_PL_get_arg(a, t, arg);
if ( PL_get_bool_ex(arg, v) )
return TRUE;
return type_error(arg, "boolean");
return FALSE;
}
@ -596,7 +625,7 @@ pl_window_pos(term_t options)
int arity;
if ( !PL_get_name_arity(opt, &name, &arity) )
return type_error(opt, "compound");
return PL_type_error("compound", opt);
s = PL_atom_chars(name);
if ( streq(s, "position") && arity == 2 )
{ if ( !get_int_arg_ex(1, opt, &x) ||
@ -612,9 +641,9 @@ pl_window_pos(term_t options)
{ term_t t = PL_new_term_ref();
char *v;
PL_get_arg(1, opt, t);
if ( !PL_get_atom_chars(t, &v) )
return type_error(t, "atom");
_PL_get_arg(1, opt, t);
if ( !PL_get_chars(t, &v, CVT_ATOM|CVT_EXCEPTION) )
return FALSE;
if ( streq(v, "top") )
z = HWND_TOP;
else if ( streq(v, "bottom") )
@ -624,7 +653,7 @@ pl_window_pos(term_t options)
else if ( streq(v, "notopmost") )
z = HWND_NOTOPMOST;
else
return domain_error(t, "hwnd_insert_after");
return PL_domain_error("hwnd_insert_after", t);
flags &= ~SWP_NOZORDER;
} else if ( streq(s, "show") && arity == 1 )
@ -640,10 +669,10 @@ pl_window_pos(term_t options)
} else if ( streq(s, "activate") && arity == 0 )
{ flags &= ~SWP_NOACTIVATE;
} else
return domain_error(opt, "window_option");
return PL_domain_error("window_option", opt);
}
if ( !PL_get_nil(tail) )
return type_error(tail, "list");
if ( !PL_get_nil_ex(tail) )
return FALSE;
rlc_window_pos(PL_current_console(), z, x, y, w, h, flags);
@ -654,20 +683,20 @@ pl_window_pos(term_t options)
static void
call_menu(const TCHAR *name)
{ fid_t fid = PL_open_foreign_frame();
predicate_t pred = PL_predicate("on_menu", 1, "system");
module_t m = PL_new_module(PL_new_atom("system"));
predicate_t pred = PL_predicate("on_menu", 1, "prolog");
module_t m = PL_new_module(PL_new_atom("prolog"));
term_t a0 = PL_new_term_ref();
size_t len = _tcslen(name);
PL_unify_wchars(a0, PL_ATOM, len, name);
PL_call_predicate(m, PL_Q_NORMAL, pred, a0);
if ( PL_unify_wchars(a0, PL_ATOM, len, name) )
PL_call_predicate(m, PL_Q_NORMAL, pred, a0);
PL_discard_foreign_frame(fid);
}
foreign_t
pl_win_insert_menu_item(term_t menu, term_t label, term_t before)
pl_win_insert_menu_item(foreign_t menu, foreign_t label, foreign_t before)
{ TCHAR *m, *l, *b;
if ( !PL_get_wchars(menu, NULL, &m, CVT_ATOM) ||
@ -685,7 +714,7 @@ pl_win_insert_menu_item(term_t menu, term_t label, term_t before)
foreign_t
pl_win_insert_menu(term_t label, term_t before)
pl_win_insert_menu(foreign_t label, foreign_t before)
{ TCHAR *l, *b;
if ( !PL_get_wchars(label, NULL, &l, CVT_ATOM) ||
@ -713,8 +742,10 @@ free_interactor(void *closure)
static void *
run_interactor(void *closure)
{ predicate_t pred;
PL_thread_attr_t attr = {0};
PL_thread_attach_engine(NULL);
attr.flags = PL_THREAD_NO_DEBUG;
PL_thread_attach_engine(&attr);
pthread_cleanup_push(free_interactor, NULL);
@ -765,13 +796,14 @@ pl_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
static TCHAR *
HiddenFrameClass(void)
HiddenFrameClass()
{ static TCHAR winclassname[32];
static WNDCLASS wndClass;
HINSTANCE instance = rlc_hinstance();
if ( !winclassname[0] )
{ _stprintf(winclassname, _T("YAP-hidden-win%d"), instance);
{ snwprintf(winclassname, sizeof(winclassname)/sizeof(TCHAR),
_T("SWI-Prolog-hidden-win%d"), instance);
wndClass.style = 0;
wndClass.lpfnWndProc = (LPVOID) pl_wnd_proc;
@ -780,7 +812,7 @@ HiddenFrameClass(void)
wndClass.hInstance = instance;
wndClass.hIcon = NULL;
wndClass.hCursor = NULL;
// wndClass.hbrBackground = GetStockObject(WHITE_BRUSH);
wndClass.hbrBackground = GetStockObject(WHITE_BRUSH);
wndClass.lpszMenuName = NULL;
wndClass.lpszClassName = winclassname;
@ -798,11 +830,15 @@ destroy_hidden_window(uintptr_t hwnd)
static HWND
create_prolog_hidden_window(rlc_console c)
create_prolog_hidden_window(rlc_console c, int replace)
{ uintptr_t hwnd;
if ( rlc_get(c, RLC_PROLOG_WINDOW, &hwnd) && hwnd )
return (HWND)hwnd;
{ if ( replace )
DestroyWindow((HWND)hwnd);
else
return (HWND)hwnd;
}
hwnd = (uintptr_t)CreateWindow(HiddenFrameClass(),
_T("YAP hidden window"),
@ -842,7 +878,7 @@ fatalSignal(int sig)
static void
initSignals(void)
initSignals()
{ signal(SIGABRT, fatalSignal);
signal(SIGFPE, fatalSignal);
signal(SIGILL, fatalSignal);
@ -888,7 +924,7 @@ menu_select(rlc_console c, const TCHAR *name)
{ uintptr_t hwnd;
if ( rlc_get(c, RLC_PROLOG_WINDOW, &hwnd) )
PostMessage((HWND)hwnd, WM_MENU, 0, (LONG)name);
PostMessage((HWND)hwnd, WM_MENU, 0, (LPARAM)name);
}
}
@ -925,7 +961,8 @@ set_window_title(rlc_console c)
TCHAR *w64 = _T("");
#endif
_stprintf(title, _T("YAP (%s%sversion %d.%d.%d)"),
snwprintf(title, sizeof(title)/sizeof(TCHAR),
_T("SWI-Prolog (%s%sversion %d.%d.%d)"),
w64, mt, major, minor, patch);
rlc_title(c, title, NULL, 0);
@ -954,8 +991,12 @@ install_readline(rlc_console c)
{ rlc_init_history(c, 50);
file_completer = rlc_complete_hook(do_complete);
PL_register_foreign_in_module("system", "rl_add_history", 1, pl_rl_add_history, 0);
PL_register_foreign_in_module("system", "rl_read_init_file", 1, pl_rl_read_init_file, 0);
PL_register_foreign_in_module(
"system", "rl_add_history", 1, pl_rl_add_history, 0);
PL_register_foreign_in_module(
"system", "rl_read_init_file", 1, pl_rl_read_init_file, 0);
PL_register_foreign_in_module(
"system", "$rl_history", 1, pl_rl_history, 0);
PL_set_prolog_flag("tty_control", PL_BOOL, TRUE);
PL_set_prolog_flag("readline", PL_BOOL, TRUE);
@ -968,7 +1009,7 @@ install_readline(rlc_console c)
static rlc_console main_console;
static void
static int
closeWin(int s, void *a)
{ rlc_console c = a;
@ -978,6 +1019,8 @@ closeWin(int s, void *a)
{ main_console = NULL;
rlc_close(c);
}
return 0;
}
#define MAX_ARGC 100
@ -1002,11 +1045,31 @@ win32main(rlc_console c, int argc, TCHAR **argv)
{ char *av[MAX_ARGC+1];
int i;
main_console = c;
set_window_title(c);
rlc_bind_terminal(c);
/* YAP has to initialize before doing anything else */
#ifdef _YAP_NOT_INSTALLED_
PL_register_extensions_in_module("system", extensions);
install_readline(c);
PL_action(PL_ACTION_GUIAPP, TRUE);
main_console = c;
PL_on_halt(closeWin, c);
create_prolog_hidden_window(c, FALSE);
PL_set_prolog_flag("hwnd", PL_INTEGER, (intptr_t)rlc_hwnd(c));
rlc_interrupt_hook(interrupt);
rlc_menu_hook(menu_select);
rlc_message_hook(message_proc);
PL_set_prolog_flag("console_menu", PL_BOOL, TRUE);
#ifdef O_PLMT
rlc_insert_menu_item(c, _T("&Run"), _T("&New thread"), NULL);
#endif
#if !defined(O_DEBUG) && !defined(_DEBUG)
initSignals();
#endif
PL_register_foreign_in_module("system", "win_open_console", 5,
pl_win_open_console, 0);
if ( argc > MAX_ARGC )
argc = MAX_ARGC;
for(i=0; i<argc; i++)
@ -1023,30 +1086,7 @@ win32main(rlc_console c, int argc, TCHAR **argv)
if ( !PL_initialise(argc, av) )
PL_halt(1);
#endif
PL_register_extensions_in_module("system", extensions);
install_readline(c);
PL_action(PL_ACTION_GUIAPP, TRUE);
main_console = c;
PL_on_halt(closeWin, c);
create_prolog_hidden_window(c);
PL_set_prolog_flag("hwnd", PL_INTEGER, (intptr_t)rlc_hwnd(c));
rlc_interrupt_hook(interrupt);
rlc_menu_hook(menu_select);
rlc_message_hook(message_proc);
PL_set_prolog_flag("console_menu", PL_BOOL, TRUE);
#ifdef O_PLMT
rlc_insert_menu_item(c, _T("&Run"), _T("&New thread"), NULL);
#endif
#if !defined(O_DEBUG) && !defined(_DEBUG)
initSignals();
#endif
PL_register_foreign_in_module("prolog", "win_open_console", 5,
pl_win_open_console, 0);
rlc_bind_terminal(c);
PL_halt(PL_toplevel() ? 0 : 1);
return 0;
@ -1058,10 +1098,10 @@ And this is the real application's main as Windows sees it. See
console.c for further details.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
int WINAPI
wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPWSTR lpszCmdLine, int nCmdShow)
{ LPWSTR cmdline;
int PASCAL
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
{ LPTSTR cmdline;
InitializeCriticalSection(&mutex);

View File

@ -104,7 +104,7 @@ DIALECT_BP= \
all:
install: $(PROGRAMS) install-examples
install: $(PROGRAMS) $(DIALECT_PROGRAMS) $(DIALECT_SWI) $(DIALECT_BP) install-examples
mkdir -p $(DESTDIR)$(SHAREDIR)/Yap
mkdir -p $(DESTDIR)$(SHAREDIR)/Yap/dialect
mkdir -p $(DESTDIR)$(SHAREDIR)/Yap/dialect/swi
@ -121,3 +121,11 @@ clean:
distclean: clean
rm -f *def Makefile
##########
FULL_PATH_PL_SOURCES=$(PROGRAMS) $(DIALECT_PROGRAMS) $(DIALECT_SWI) $(DIALECT_BP)
TAGS: $(PROGRAMS) $(DIALECT_PROGRAMS) $(DIALECT_SWI) $(DIALECT_BP)
etags --append ../TAGS $(FULL_PATH_PL_SOURCES)

View File

@ -49,7 +49,7 @@ SOBJS=yap_mpi.@SO@
all: $(SOBJS)
yap_mpi.o: $(srcdir)/yap_mpi.c $(srcdir)/yap_mpi.c
yap_mpi.o: $(srcdir)/yap_mpi.c
$(MPI_CC) $(CFLAGS) $(MPICF) -c $(srcdir)/yap_mpi.c -o yap_mpi.o
prologterms2c.o: $(srcdir)/prologterms2c.c $(srcdir)/prologterms2c.h
@ -74,3 +74,10 @@ install-examples:
distclean: clean
rm -f Makefile
FULL_PATH_C_SOURCES= $(srcdir)/yap_mpi.c $(srcdir)/prologterms2c.c $(srcdir)/hash.c
FULL_PATH_PL_SOURCES=
FULL_PATH_HEADERS=$(srcdir)/hash.h $(srcdir)/prologterms2c.h
TAGS: $(C_SOURCES) $(PL_SOURCES) $(HEADERS)
etags --append ../../TAGS $(FULL_PATH_C_SOURCES) $(FULL_PATH_PL_SOURCES) $(FULL_PATH_HEADERS)

View File

@ -64,3 +64,4 @@ install-examples:
distclean: clean
rm -f Makefile

View File

@ -209,6 +209,7 @@ true :- true.
'$swi_current_prolog_flag'(break_level, BreakLevel),
( Breaklevel \= 0 -> true ; '$pred_exists'(halt(_), user) -> halt(0) ; '$halt'(0) ).
'$enter_top_level' :-
flush_output,
'$run_toplevel_hooks',
prompt1(' ?- '),
'$read_toplevel'(Command,Varnames),

View File

@ -1,75 +1,53 @@
#
# default base directory for YAP installation
# (EROOT for architecture-dependent files)
#
prefix = @prefix@
exec_prefix = @exec_prefix@
ROOTDIR = $(prefix)
EROOTDIR = @exec_prefix@
#
# where YAP should look for libraries
#
LIBDIR=@libdir@/Yap
#
#
CC=@CC@ -municode -DUNICODE -D_UNICODE
CPPFLAGS=@CPPFLAGS@
CFLAGS= @CFLAGS@ $(DEFS) $(CPPFLAGS) -I$(srcdir) -DRLC_VENDOR="\"YAP\""
#
#
# You shouldn't need to change what follows.
#
INSTALL=@INSTALL@
INSTALL_DATA=@INSTALL_DATA@
INSTALL_PROGRAM=@INSTALL_PROGRAM@
RANLIB=@RANLIB@
AR=@AR@
################################################################
# Makefile for the SWI-Prolog console window.
################################################################
srcdir=@srcdir@
@VPATH@ @srcdir@
SOURCES= \
$(srcdir)/complete.c $(srcdir)/console.c \
$(srcdir)/edit.c $(srcdir)/history.c \
$(srcdir)/menu.c
HEADERS= \
$(srcdir)/common.h $(srcdir)/console.h \
$(srcdir)/console_i.h $(srcdir)/history.h \
$(srcdir)/menu.h
CC=@CC@
LDEXE=@LDEXE@
PLARCH=@PLARCH@
XLIBS=@XLIBS@
SOEXT=@SO_EXT@
OBJECTS= complete.o console.o edit.o history.o menu.o
COFLAGS=@COFLAGS@
CWFLAGS=@CWFLAGS@
CIFLAGS=@CIFLAGS@
CMFLAGS=@CMFLAGS@ -DUNICODE -D_UNICODE
CPFLAGS=
CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) $(CPFLAGS)
LDFLAGS=@LDFLAGS@ $(CPFLAGS)
LIBS=-lgdi32 -lcomdlg32
PLHOME=../../..
all: ../../plterm.dll
include $(srcdir)/../../common.mk
../../plterm.dll: libplterm.a
$(CC) $(CFLAGS) -shared -o ../../plterm.dll \
-Wl,--export-all-symbols \
-Wl,--enable-auto-import \
-Wl,--whole-archive libplterm.a \
-Wl,--no-whole-archive $(LIBS) $(LDFLAGS)
OBJ= complete.o console.o edit.o history.o menu.o
OUT= $(PLHOME)/lib/$(PLARCH)/plterm.$(SOEXT)
INCLDIR=$(PLHOME)/include
HDR= $(INCLDIR)/console.h
libplterm.a: $(OBJECTS) $(SOURCES) $(HEADERS)
-rm -f libplterm.a
$(AR) rc libplterm.a $(OBJECTS)
$(RANLIB) libplterm.a
all: $(OUT) $(HDR)
install:
$(OUT): $(OBJ)
$(CC) -shared $(COFLAGS) -o $@ -Wl,--out-implib,$@.a $(OBJ) $(XLIBS)
$(HDR): $(INCLDIR)
$(INCLDIR):
mkdir -p $@
$(PLHOME)/include/console.h: $(srcdir)/console.h
cp -f $< $@
console.o: $(srcdir)/console_i.h $(srcdir)/console.h
clean:
rm -f *.o *~ *.dll
complete.o: $(srcdir)/complete.c
$(CC) -c $(CFLAGS) $(SHLIB_CFLAGS) $(srcdir)/complete.c -o complete.o
console.o: $(srcdir)/console.c
$(CC) -c $(CFLAGS) $(SHLIB_CFLAGS) $(srcdir)/console.c -o console.o
history.o: $(srcdir)/history.c
$(CC) -c $(CFLAGS) $(SHLIB_CFLAGS) $(srcdir)/history.c -o history.o
menu.o: $(srcdir)/menu.c
$(CC) -c $(CFLAGS) $(SHLIB_CFLAGS) $(srcdir)/menu.c -o menu.o
edit.o: $(srcdir)/edit.c
$(CC) -c $(CFLAGS) $(SHLIB_CFLAGS) $(srcdir)/edit.c -o edit.o
rm -f *.o
rm -f *~
distclean: clean
rm -f $(PLHOME)/lib/$(PLARCH)/plterm.$(SOEXT)
rm -f $(PLHOME)/lib/$(PLARCH)/plterm.$(SOEXT).a
rm -f $(INCLDIR)/console.h

View File

@ -1,4 +1,4 @@
/* $Id: common.h,v 1.1 2008-04-01 08:50:48 vsc Exp $
/* $Id$
Part of SWI-Prolog
@ -19,7 +19,7 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#define IMODE_SWITCH_CHAR -2

View File

@ -1,4 +1,4 @@
/* $Id: complete.c,v 1.1 2008-03-27 00:41:33 vsc Exp $
/* $Id$
Part of SWI-Prolog
@ -19,21 +19,21 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <windows.h>
#include <tchar.h>
#include "console.h"
#ifndef __TCHAR_DEFINED
typedef wint_t _TINT;
#endif
#ifndef EOS
#define EOS 0
#endif
#ifndef _TINT
typedef wint_t _TINT;
#endif
static TCHAR *completion_chars = TEXT("~:\\/-.");
static size_t
@ -77,7 +77,7 @@ rlc_complete_file_function(RlcCompleteData data)
for( ; n < ln->point; n++)
{ int c = ln->data[n];
if ( c == '/' )
c = '\\';
if ( c == '\\' )
@ -108,7 +108,7 @@ rlc_complete_file_function(RlcCompleteData data)
{ _tcscpy(data->candidate, fdata.cFileName);
return TRUE;
}
return FALSE;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
/* $Id: console.h,v 1.1 2008-04-01 08:45:42 vsc Exp $
/* $Id$
Part of SWI-Prolog
@ -19,7 +19,7 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _CONSOLE_H_INCLUDED
@ -41,21 +41,21 @@
#include <signal.h>
#include <stddef.h>
#if __GNUC__
#include <stdint.h>
#else
#ifdef _MSC_VER
#if (_MSC_VER < 1300)
typedef long intptr_t;
typedef unsigned long uintptr_t;
#endif
#else
#include <stdint.h>
#endif
#define RLC_APPTIMER_ID 100 /* >=100: application timer */
typedef struct
{ int first;
int last;
int size; /* size of the buffer */
{ int first;
int last;
int size; /* size of the buffer */
TCHAR *buffer; /* character buffer */
int flags; /* flags for the queue */
} rlc_queue, *RlcQueue;
@ -75,7 +75,7 @@ typedef struct
int x; /* # pixels (0: default) */
int y; /* # pixels (0: default) */
int savelines; /* # lines to save (0: default) */
TCHAR face_name[32]; /* font name */
TCHAR face_name[32]; /* font name */
int font_family; /* family id */
int font_size;
int font_weight;
@ -94,7 +94,7 @@ typedef void (*RlcResizeHook)(int, int); /* Hook for window change */
typedef void (*RlcMenuHook)(rlc_console, const TCHAR *id); /* Hook for menu-selection */
typedef void (*RlcFreeDataHook)(uintptr_t data); /* release data */
#if defined(_WINDOWS_) || defined(_WINDOWS_H) /* <windows.h> is included */
#ifdef __WINDOWS__ /* <windows.h> is included */
/* rlc_color(which, ...) */
#define RLC_WINDOW (0) /* window background */
#define RLC_TEXT (1) /* text color */
@ -116,7 +116,7 @@ typedef LRESULT (*RlcMessageHook)(HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam);
_export RlcMessageHook rlc_message_hook(RlcMessageHook hook);
#endif /*_WINDOWS_*/
#endif /*__WINDOWS__*/
_export RlcUpdateHook rlc_update_hook(RlcUpdateHook updatehook);
_export RlcTimerHook rlc_timer_hook(RlcTimerHook timerhook);
@ -182,9 +182,9 @@ _export int rlc_set(rlc_console c, int what,
typedef struct _line
{ rlc_mark origin; /* origin of edit */
size_t point; /* location of the caret */
size_t point; /* location of the caret */
size_t size; /* # characters in buffer */
size_t allocated; /* # characters allocated */
size_t allocated; /* # characters allocated */
size_t change_start; /* start of change */
int complete; /* line is completed */
int reprompt; /* repeat the prompt */
@ -199,6 +199,8 @@ typedef struct _line
#define COMPLETE_ENUMERATE 1
#define COMPLETE_CLOSE 2
struct _complete_data;
typedef int (*RlcCompleteFunc)(struct _complete_data *);
typedef struct _complete_data
@ -221,5 +223,9 @@ _export int rlc_complete_file_function(RlcCompleteData data);
_export void rlc_init_history(rlc_console c, int size);
_export void rlc_add_history(rlc_console c, const TCHAR *line);
_export int rlc_bind(int chr, const char *fname);
_export int rlc_for_history(
rlc_console b,
int (*handler)(void *ctx, int no, const TCHAR *line),
void *ctx);
#endif /* _CONSOLE_H_INCLUDED */

View File

@ -1,4 +1,4 @@
/* $Id: console_i.h,v 1.1 2008-04-01 08:50:44 vsc Exp $
/* $Id$
Part of SWI-Prolog
@ -19,7 +19,7 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -45,7 +45,7 @@ typedef struct _history
#define ANSI_MAX_ARGC 10 /* Ansi-escape sequence argv */
#define MAXPROMPT 80 /* max size of prompt */
#define OQSIZE 4096 /* output queue size */
#define OQSIZE 4096 /* output queue size */
#define MAX_USER_VALUES 10 /* max user data-handles */
typedef struct lqueued
@ -53,8 +53,29 @@ typedef struct lqueued
struct lqueued* next; /* Next in queue */
} lqueued, *LQueued;
typedef unsigned short text_flags;
#define ANSI_COLOR_DEFAULT 31
#define TF_FG(f) ((f)&0x1f) /* foreground */
#define TF_BG(f) (((f)>>5)&0x1f) /* background */
#define TF_BOLD(f) ((f)&(1<<10)) /* bold */
#define TF_UNDERLINE(f) ((f)&(1<<11)) /* underline */
#define TF_DEFAULT (ANSI_COLOR_DEFAULT | ANSI_COLOR_DEFAULT<<5)
#define TF_SET_FG(f,c) (((f)&~0x1f)|(c))
#define TF_SET_BG(f,c) (((f)&~(0x1f<<5))|((c)<<5))
#define TF_SET_BOLD(f,v) (((f)&~(1<<10))|((v)<<10))
#define TF_SET_UNDERLINE(f,v) (((f)&~(1<<11))|((v)<<11))
typedef struct
{ TCHAR * text; /* the storage */
{ TCHAR code; /* character code */
text_flags flags; /* flags for the text */
} text_char;
typedef struct
{ text_char *text; /* the storage */
unsigned short size; /* #characters in line */
unsigned adjusted : 1; /* line has been adjusted? */
unsigned changed : 1; /* line needs redraw */
@ -78,7 +99,7 @@ typedef struct
int caret_y; /* its line */
int window_start; /* start line of the window */
int window_size; /* #lines on the window */
TextLine lines; /* the actual lines */
TextLine lines; /* the actual lines */
int sel_unit; /* SEL_CHAR, SEL_WORD, SEL_LINE */
int sel_org_line; /* line origin of the selection */
int sel_org_char; /* char origin of the selection */
@ -100,6 +121,8 @@ typedef struct
COLORREF background; /* Background color */
COLORREF sel_foreground; /* Selection foreground */
COLORREF sel_background; /* Selection background */
COLORREF ansi_color[16]; /* ANSI colors (8 normal + 8 bright) */
text_flags sgr_flags; /* Current SGR flags */
int cw; /* character width */
int ch; /* character height */
int cb; /* baseline */
@ -139,7 +162,7 @@ typedef struct
DWORD console_thread_id; /* I/O thread id */
DWORD application_thread_id;
HWND kill_window; /* window in app thread for destroy */
user_data values[MAX_USER_VALUES]; /* associated user data */
} rlc_data, *RlcData;

View File

@ -1,4 +1,4 @@
/* $Id: edit.c,v 1.1 2008-03-27 00:41:33 vsc Exp $
/* $Id$
Part of SWI-Prolog
@ -19,13 +19,13 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#define _MAKE_DLL 1
#undef _export
#include <windows.h>
#include <tchar.h>
#define _MAKE_DLL 1
#undef _export
#include "console.h"
#include "console_i.h"
#include "common.h"
@ -127,7 +127,7 @@ delete(Line ln, size_t from, size_t len)
_tcsncpy(&ln->data[from], &ln->data[from+len], ln->size - (from+len));
ln->size -= len;
}
}
/*******************************
@ -232,7 +232,7 @@ forward_word(Line ln, int chr)
static void
backward_delete_word(Line ln, int chr)
{ size_t from = back_word(ln, ln->point);
memmove(&ln->data[from], &ln->data[ln->point],
(ln->size - ln->point)*sizeof(TCHAR));
ln->size -= ln->point - from;
@ -244,7 +244,7 @@ backward_delete_word(Line ln, int chr)
static void
forward_delete_word(Line ln, int chr)
{ size_t to = forw_word(ln, ln->point);
memmove(&ln->data[ln->point], &ln->data[to], (ln->size - to)*sizeof(TCHAR));
ln->size -= to - ln->point;
changed(ln, ln->point);
@ -258,7 +258,7 @@ transpose_chars(Line ln, int chr)
ln->data[ln->point-1] = ln->data[ln->point];
ln->data[ln->point] = c0;
changed(ln, ln->point-1);
}
}
}
@ -291,7 +291,7 @@ empty_line(Line ln, int chr)
static void
enter(Line ln, int chr)
{ ln->point = ln->size;
#ifdef DOS_CRNL
#ifdef DOS_CRNL
make_room(ln, 2);
ln->data[ln->point++] = '\r';
ln->data[ln->point++] = '\n';
@ -325,7 +325,7 @@ delete_character_or_eof(Line ln, int chr)
static void
undefined(Line ln, int chr)
{
{
}
@ -442,7 +442,7 @@ complete(Line ln, int chr)
}
data->call_type = COMPLETE_CLOSE;
(*data->function)(data);
delete(ln, data->replace_from, patlen);
ln->point = data->replace_from;
make_room(ln, ncommon);
@ -487,7 +487,7 @@ list_completions(Line ln, int chr)
if ( nmatches > COMPLETE_MAX_MATCHES )
{ TCHAR *msg = _T("\r\n! Too many matches\r\n");
while(*msg)
rlc_putchar(ln->console, *msg++);
ln->reprompt = TRUE;
@ -511,7 +511,7 @@ list_completions(Line ln, int chr)
{ len++;
rlc_putchar(ln->console, *s++);
}
rlc_free(buf[n++]);
if ( n % cols == 0 )
@ -552,7 +552,7 @@ update_display(Line ln)
{ if ( ln->reprompt )
{ const TCHAR *prompt = rlc_prompt(ln->console, NULL);
const TCHAR *s = prompt;
rlc_putchar(ln->console, '\r');
while(*s)
rlc_putchar(ln->console, *s++);
@ -646,7 +646,7 @@ init_dispatch_table()
dispatch_table[n] = insert_self;
for(n=0; n<256; n++)
dispatch_meta[n] = undefined;
bind_actions();
done = TRUE;
@ -704,7 +704,7 @@ int
rlc_bind(int chr, const char *fname)
{ if ( chr >= 0 && chr <= 256 )
{ Action a = actions;
for( ; a->name; a++ )
{ if ( strcmp(a->name, fname) == 0 )
{ if ( chr > META_OFFSET )

View File

@ -1,4 +1,4 @@
/* $Id: history.c,v 1.1 2008-03-27 00:41:33 vsc Exp $
/* $Id$
Part of SWI-Prolog
@ -19,13 +19,13 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#define _MAKE_DLL 1
#undef _export
#include <windows.h>
#include <tchar.h>
#define _MAKE_DLL 1
#undef _export
#include "console.h" /* public stuff */
#include "console_i.h" /* internal stuff */
#include <string.h>
@ -100,7 +100,7 @@ rlc_add_history(rlc_console c, const TCHAR *line)
{ b->history.current = -1;
return; /* same as last line added */
}
if ( i == b->history.tail ) /* this one is lost */
b->history.tail = next(b, b->history.tail);
b->history.head = i;
@ -120,6 +120,25 @@ rlc_add_history(rlc_console c, const TCHAR *line)
}
int
rlc_for_history(rlc_console c,
int (*handler)(void *ctx, int no, const TCHAR *line),
void *ctx)
{ RlcData b = rlc_get_data(c);
int here = b->history.head;
int no = 1;
for( ; here != b->history.tail; here = prev(b, here))
{ int rc;
if ( (rc=(*handler)(ctx, no++, b->history.lines[here])) != 0 )
return rc;
}
return 0;
}
int
rlc_at_head_history(RlcData b)
{ return b->history.current == -1 ? TRUE : FALSE;

View File

@ -1,4 +1,4 @@
/* $Id: history.h,v 1.1 2008-04-01 08:52:50 vsc Exp $
/* $Id$
Part of SWI-Prolog
@ -19,7 +19,7 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/* history.c */

View File

@ -1,4 +1,4 @@
/* $Id: menu.c,v 1.1 2008-03-27 00:41:33 vsc Exp $
/* $Id$
Part of SWI-Prolog
@ -19,12 +19,13 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <windows.h>
#include <tchar.h>
#define _MAKE_DLL
#define _MAKE_DLL 1
#undef _export
#include "console.h"
#include "console_i.h"
#include "menu.h"
@ -83,7 +84,7 @@ lookupMenuLabel(const TCHAR *label)
llen = _tcslen(label);
menuids[nmenus] = rlc_malloc((llen+1)*sizeof(TCHAR));
_tcsncpy(menuids[nmenus], label, llen+1);
return nmenus++ + IDM_USER;
}
@ -109,7 +110,7 @@ insertMenu(HMENU in, const TCHAR *label, const TCHAR *before)
AppendMenu(in, MF_SEPARATOR, 0, NULL);
else
{ UINT id = lookupMenuLabel(label);
AppendMenu(in, MF_STRING, id, label);
}
} else
@ -199,15 +200,15 @@ rlc_add_menu_bar(HWND cwin)
/*append_builtin(edit, IDM_CUT);*/
append_builtin(edit, IDM_COPY);
append_builtin(edit, IDM_PASTE);
append_builtin(settings, IDM_FONT);
append_builtin(run, IDM_BREAK);
AppendMenu(menu, MF_POPUP, (UINT)file, _T("&File"));
AppendMenu(menu, MF_POPUP, (UINT)edit, _T("&Edit"));
AppendMenu(menu, MF_POPUP, (UINT)settings, _T("&Settings"));
AppendMenu(menu, MF_POPUP, (UINT)run, _T("&Run"));
AppendMenu(menu, MF_POPUP, (UINT_PTR)file, _T("&File"));
AppendMenu(menu, MF_POPUP, (UINT_PTR)edit, _T("&Edit"));
AppendMenu(menu, MF_POPUP, (UINT_PTR)settings, _T("&Settings"));
AppendMenu(menu, MF_POPUP, (UINT_PTR)run, _T("&Run"));
SetMenu(cwin, menu);
}
@ -218,13 +219,22 @@ rlc_add_menu_bar(HWND cwin)
#define MEN_MAGIC 0x6c4a58e0
typedef struct menu_data
{ intptr_t magic; /* safety */
const TCHAR *menu; /* menu to operate on */
const TCHAR *label; /* new label */
const TCHAR *before; /* add before this one */
int rc; /* result */
} menu_data;
void
rlc_menu_action(rlc_console c, menu_data *data)
{ RlcData b = rlc_get_data(c);
if ( !data || !data->magic == MEN_MAGIC )
return;
if ( data->menu ) /* rlc_insert_menu_item() */
{ HMENU popup;
@ -255,7 +265,7 @@ rlc_menu_action(rlc_console c, menu_data *data)
info.hSubMenu = CreatePopupMenu();
info.dwTypeData = (TCHAR *)data->label;
info.cch = (int)_tcslen(data->label);
InsertMenuItem(mb, bid, TRUE, &info);
/* force redraw; not automatic! */
DrawMenuBar(hwnd);

View File

@ -1,4 +1,4 @@
/* $Id: menu.h,v 1.1 2008-04-01 08:50:44 vsc Exp $
/* $Id$
Part of SWI-Prolog
@ -19,7 +19,7 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/* see also console.c */
@ -35,14 +35,7 @@
#define IDM_BREAK 14
#define IDM_FONT 15
typedef struct menu_data
{ intptr_t magic; /* safety */
const TCHAR *menu; /* menu to operate on */
const TCHAR *label; /* new label */
const TCHAR *before; /* add before this one */
int rc; /* result */
} menu_data;
struct menu_data;
const TCHAR *lookupMenuId(UINT id);
void rlc_add_menu_bar(HWND win);

View File

@ -1,4 +1,4 @@
/* $Id: registry.c,v 1.1 2008-03-27 00:41:33 vsc Exp $
/* $Id$
Part of SWI-Prolog
@ -19,7 +19,7 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <windows.h>