2001-04-09 20:54:03 +01:00
|
|
|
/*************************************************************************
|
|
|
|
* *
|
|
|
|
* Yap Prolog *
|
|
|
|
* *
|
|
|
|
* Yap Prolog Was Developed At Nccup - Universidade Do Porto *
|
|
|
|
* *
|
|
|
|
* Copyright L.Damas, V.S.Costa And Universidade Do Porto 1985-1997 *
|
|
|
|
* *
|
|
|
|
**************************************************************************
|
|
|
|
* *
|
|
|
|
* File: Yap.C *
|
|
|
|
* Last Rev: *
|
|
|
|
* Mods: *
|
|
|
|
* Comments: Yap's Main File *
|
|
|
|
* *
|
|
|
|
*************************************************************************/
|
|
|
|
/* static char SccsId[] = "X 4.3.3"; */
|
|
|
|
|
|
|
|
#include "config.h"
|
2002-09-09 18:40:12 +01:00
|
|
|
#include "YapInterface.h"
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2005-11-18 18:52:41 +00:00
|
|
|
#ifdef CUT_C
|
|
|
|
#include "cut_c.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2002-06-18 18:02:19 +01:00
|
|
|
#if (DefTrailSpace < MinTrailSpace)
|
|
|
|
#undef DefTrailSpace
|
|
|
|
#define DefTrailSpace MinTrailSpace
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if (DefStackSpace < MinStackSpace)
|
|
|
|
#undef DefStackSpace
|
|
|
|
#define DefStackSpace MinStackSpace
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if (DefHeapSpace < MinHeapSpace)
|
|
|
|
#undef DefHeapSpace
|
|
|
|
#define DefHeapSpace MinHeapSpace
|
|
|
|
#endif
|
|
|
|
|
2002-12-06 20:03:26 +00:00
|
|
|
#define DEFAULT_NUMBERWORKERS 1
|
|
|
|
#define DEFAULT_SCHEDULERLOOP 10
|
|
|
|
#define DEFAULT_DELAYEDRELEASELOAD 3
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
#ifdef _MSC_VER /* Microsoft's Visual C++ Compiler */
|
|
|
|
#ifdef HAVE_UNISTD_H
|
|
|
|
#undef HAVE_UNISTD_H
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#if HAVE_SYS_TYPES_H
|
|
|
|
#include <sys/types.h>
|
|
|
|
#endif
|
|
|
|
#if HAVE_SYS_STAT_H
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#endif
|
|
|
|
#if HAVE_FCNTL_H
|
|
|
|
#include <fcntl.h>
|
|
|
|
#endif
|
|
|
|
#if HAVE_STDARG_H
|
|
|
|
#include <stdarg.h>
|
|
|
|
#endif
|
|
|
|
#include <stdlib.h>
|
|
|
|
#if HAVE_UNISTD_H
|
|
|
|
#include <unistd.h>
|
|
|
|
#endif
|
|
|
|
#if HAVE_ERRNO_H
|
|
|
|
#include <errno.h>
|
|
|
|
#endif
|
2008-10-16 17:19:14 +01:00
|
|
|
#if HAVE_CTYPE_H
|
|
|
|
#include <ctype.h>
|
|
|
|
#endif
|
2001-04-09 20:54:03 +01:00
|
|
|
#if HAVE_STRING_H
|
|
|
|
#include <string.h>
|
|
|
|
#endif
|
|
|
|
|
2002-09-09 18:40:12 +01:00
|
|
|
static void PROTO(do_top_goal,(YAP_Term));
|
2002-10-30 17:27:19 +00:00
|
|
|
static void PROTO(exec_top_level,(int, YAP_init_args *));
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
static int output_msg;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef lint
|
|
|
|
/* VARARGS1 */
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef M_WILLIAMS
|
|
|
|
long _stksize = 32000;
|
|
|
|
#endif
|
|
|
|
|
2005-06-06 06:08:14 +01:00
|
|
|
/* nf: Begin preprocessor code */
|
|
|
|
#define MAXDEFS 100
|
|
|
|
static char *def_var[MAXDEFS];
|
|
|
|
static char *def_value[MAXDEFS];
|
|
|
|
static int def_c=0;
|
|
|
|
/* End preprocessor code */
|
|
|
|
|
2008-03-25 22:03:14 +00:00
|
|
|
#ifdef USE_MYPUTC
|
2003-05-20 20:11:59 +01:00
|
|
|
static void
|
|
|
|
myputc (int ch)
|
2001-04-09 20:54:03 +01:00
|
|
|
{
|
|
|
|
putc(ch,stderr);
|
|
|
|
}
|
2004-05-14 17:34:49 +01:00
|
|
|
#endif
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
static void
|
2002-09-09 18:40:12 +01:00
|
|
|
do_top_goal (YAP_Term Goal)
|
2001-04-09 20:54:03 +01:00
|
|
|
{
|
|
|
|
#ifdef DEBUG
|
|
|
|
if (output_msg)
|
|
|
|
fprintf(stderr,"Entering absmi\n");
|
|
|
|
#endif
|
2008-06-04 14:58:42 +01:00
|
|
|
YAP_RunGoalOnce(Goal);
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
2002-06-18 18:02:19 +01:00
|
|
|
static void
|
2002-12-06 20:03:26 +00:00
|
|
|
print_usage(void)
|
2002-06-18 18:02:19 +01:00
|
|
|
{
|
|
|
|
fprintf(stderr,"\n[ Valid switches for command line arguments: ]\n");
|
|
|
|
fprintf(stderr," -? Shows this screen\n");
|
2002-10-30 17:27:19 +00:00
|
|
|
fprintf(stderr," -b Boot file \n");
|
2009-10-23 14:22:17 +01:00
|
|
|
fprintf(stderr," -dump-runtime-variables\n");
|
2008-08-24 00:30:25 +01:00
|
|
|
fprintf(stderr," -f initialization file or \"none\"\n");
|
2005-10-21 17:09:03 +01:00
|
|
|
fprintf(stderr," -g Run Goal Before Top-Level \n");
|
|
|
|
fprintf(stderr," -z Run Goal Before Top-Level \n");
|
2008-03-13 18:41:52 +00:00
|
|
|
fprintf(stderr," -q start with informational messages off\n");
|
2005-10-21 17:09:03 +01:00
|
|
|
fprintf(stderr," -l load Prolog file\n");
|
|
|
|
fprintf(stderr," -L run Prolog file and exit\n");
|
2005-10-28 18:55:30 +01:00
|
|
|
fprintf(stderr," -p extra path for file-search-path\n");
|
2010-04-12 17:22:03 +01:00
|
|
|
fprintf(stderr," -hSize Heap area in Kbytes (default: %d, minimum: %d)\n",
|
2002-06-18 18:02:19 +01:00
|
|
|
DefHeapSpace, MinHeapSpace);
|
2010-04-12 17:22:03 +01:00
|
|
|
fprintf(stderr," -sSize Stack area in Kbytes (default: %d, minimum: %d)\n",
|
2002-06-18 18:02:19 +01:00
|
|
|
DefStackSpace, MinStackSpace);
|
2010-04-12 17:22:03 +01:00
|
|
|
fprintf(stderr," -tSize Trail area in Kbytes (default: %d, minimum: %d)\n",
|
2002-06-18 18:02:19 +01:00
|
|
|
DefTrailSpace, MinTrailSpace);
|
2010-04-12 17:22:03 +01:00
|
|
|
fprintf(stderr," -GSize Max Area for Global Stack\n");
|
|
|
|
fprintf(stderr," -LSize Max Area for Local Stack (number must follow L)\n");
|
|
|
|
fprintf(stderr," -TSize Max Area for Trail (number must follow L)\n");
|
2009-04-08 00:32:36 +01:00
|
|
|
fprintf(stderr,"\n[Execution Modes]\n");
|
|
|
|
fprintf(stderr," -J0 Interpreted mode (default)\n");
|
|
|
|
fprintf(stderr," -J1 Mixed mode only for user predicates\n");
|
|
|
|
fprintf(stderr," -J2 Mixed mode for all predicates\n");
|
|
|
|
fprintf(stderr," -J3 Compile all user predicates\n");
|
|
|
|
fprintf(stderr," -J4 Compile all predicates\n");
|
|
|
|
|
2005-08-04 16:45:56 +01:00
|
|
|
#ifdef TABLING
|
|
|
|
fprintf(stderr," -ts Maximum table space area in Mbytes (default: unlimited)\n");
|
|
|
|
#endif /* TABLING */
|
2008-04-11 17:30:28 +01:00
|
|
|
#if defined(ENV_COPY) || defined(ACOW) || defined(SBA)
|
2005-08-04 16:45:56 +01:00
|
|
|
fprintf(stderr," -w Number of workers (default: %d)\n",
|
2002-12-06 20:03:26 +00:00
|
|
|
DEFAULT_NUMBERWORKERS);
|
2005-08-04 16:45:56 +01:00
|
|
|
fprintf(stderr," -sl Loop scheduler executions before look for hiden shared work (default: %d)\n",
|
|
|
|
DEFAULT_SCHEDULERLOOP);
|
|
|
|
fprintf(stderr," -d Value of delayed release of load (default: %d)\n",
|
2002-12-06 20:03:26 +00:00
|
|
|
DEFAULT_DELAYEDRELEASELOAD);
|
2008-04-11 17:30:28 +01:00
|
|
|
#endif /* ENV_COPY || ACOW || SBA */
|
2005-08-04 16:45:56 +01:00
|
|
|
/* nf: Preprocessor */
|
2008-04-11 17:30:28 +01:00
|
|
|
/* fprintf(stderr," -DVar=Name Persistent definition\n"); */
|
2002-06-18 18:02:19 +01:00
|
|
|
fprintf(stderr,"\n");
|
|
|
|
}
|
|
|
|
|
2008-10-16 17:19:14 +01:00
|
|
|
static int
|
|
|
|
myisblank(int c)
|
|
|
|
{
|
|
|
|
switch (c) {
|
|
|
|
case ' ':
|
|
|
|
case '\t':
|
|
|
|
case '\n':
|
|
|
|
case '\r':
|
|
|
|
return TRUE;
|
|
|
|
default:
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-08-23 17:26:41 +01:00
|
|
|
static char *
|
|
|
|
add_end_dot(char arg[])
|
|
|
|
{
|
|
|
|
int sz = strlen(arg), i;
|
|
|
|
i = sz;
|
2008-10-16 17:19:14 +01:00
|
|
|
while (i && myisblank(arg[--i]));
|
2008-08-23 17:26:41 +01:00
|
|
|
if (i && arg[i] != ',') {
|
|
|
|
char *p = (char *)malloc(sz+2);
|
|
|
|
if (!p)
|
|
|
|
return NULL;
|
|
|
|
strncpy(p,arg,sz);
|
|
|
|
p[sz] = '.';
|
|
|
|
p[sz+1] = '\0';
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
return arg;
|
|
|
|
}
|
|
|
|
|
2009-10-23 09:09:16 +01:00
|
|
|
static int
|
|
|
|
dump_runtime_variables(void)
|
|
|
|
{
|
2010-04-13 00:30:15 +01:00
|
|
|
fprintf(stdout,"CC=\"%s\"\n",YAP_CC);
|
|
|
|
fprintf(stdout,"YAP_ROOTDIR=\"%s\"\n",YAP_ROOTDIR);
|
|
|
|
fprintf(stdout,"YAP_LIBS=\"%s\"\n",YAP_LIBS);
|
|
|
|
fprintf(stdout,"YAP_SHLIB_SUFFIX=\"%s\"\n",YAP_SHLIB_SUFFIX);
|
|
|
|
fprintf(stdout,"YAP_VERSION=%d\n",YAP_VERSION);
|
2009-10-23 14:22:17 +01:00
|
|
|
exit(0);
|
|
|
|
return 1;
|
2009-10-23 09:09:16 +01:00
|
|
|
}
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
/*
|
|
|
|
* proccess command line arguments: valid switches are: -b boot -s
|
|
|
|
* stack area size (K) -h heap area size -a aux stack size -e
|
2005-06-06 06:08:14 +01:00
|
|
|
* emacs_mode -m -DVar=Value reserved memory for alloc IF DEBUG -p if you
|
2001-04-09 20:54:03 +01:00
|
|
|
* want to check out startup IF MAC -mpw if we are using the mpw
|
|
|
|
* shell
|
|
|
|
*/
|
2002-06-18 18:02:19 +01:00
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
static int
|
2002-10-30 17:27:19 +00:00
|
|
|
parse_yap_arguments(int argc, char *argv[], YAP_init_args *iap)
|
2001-04-09 20:54:03 +01:00
|
|
|
{
|
|
|
|
char *p;
|
2008-03-25 22:03:14 +00:00
|
|
|
#ifdef USE_SYSTEM_MALLOC
|
2004-01-23 02:23:51 +00:00
|
|
|
int BootMode = YAP_FULL_BOOT_FROM_PROLOG;
|
|
|
|
#else
|
2001-04-09 20:54:03 +01:00
|
|
|
int BootMode = YAP_BOOT_FROM_SAVED_CODE;
|
2006-02-08 17:29:55 +00:00
|
|
|
#endif
|
|
|
|
#ifdef MYDDAS_MYSQL
|
|
|
|
char *myddas_temp;
|
2004-01-23 02:23:51 +00:00
|
|
|
#endif
|
2009-03-27 15:15:54 +00:00
|
|
|
unsigned long int *ssize;
|
2009-05-10 18:36:55 +01:00
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
while (--argc > 0)
|
|
|
|
{
|
|
|
|
p = *++argv;
|
|
|
|
if (*p == '-')
|
|
|
|
switch (*++p)
|
|
|
|
{
|
|
|
|
case 'b':
|
|
|
|
BootMode = YAP_BOOT_FROM_PROLOG;
|
2002-10-30 17:27:19 +00:00
|
|
|
iap->YapPrologBootFile = *++argv;
|
|
|
|
argc--;
|
2001-04-09 20:54:03 +01:00
|
|
|
break;
|
|
|
|
case '?':
|
2002-12-06 20:03:26 +00:00
|
|
|
print_usage();
|
2002-06-18 18:02:19 +01:00
|
|
|
exit(EXIT_SUCCESS);
|
2008-03-13 18:41:52 +00:00
|
|
|
case 'q':
|
|
|
|
iap->QuietMode = TRUE;
|
|
|
|
break;
|
2008-04-11 17:30:28 +01:00
|
|
|
#if defined(ENV_COPY) || defined(ACOW) || defined(SBA)
|
2001-04-09 20:54:03 +01:00
|
|
|
case 'w':
|
2002-10-30 17:27:19 +00:00
|
|
|
ssize = &(iap->NumberWorkers);
|
2001-04-09 20:54:03 +01:00
|
|
|
goto GetSize;
|
|
|
|
case 'd':
|
2009-10-23 09:09:16 +01:00
|
|
|
if (!strcmp("dump-runtime-variables",p))
|
|
|
|
return dump_runtime_variables();
|
2002-10-30 17:27:19 +00:00
|
|
|
ssize = &(iap->DelayedReleaseLoad);
|
2001-04-09 20:54:03 +01:00
|
|
|
goto GetSize;
|
2009-10-23 09:09:16 +01:00
|
|
|
#else
|
2009-10-23 14:22:17 +01:00
|
|
|
case 'd':
|
2009-10-23 09:09:16 +01:00
|
|
|
if (!strcmp("dump-runtime-variables",p))
|
|
|
|
return dump_runtime_variables();
|
2008-04-11 17:30:28 +01:00
|
|
|
#endif /* ENV_COPY || ACOW || SBA */
|
2001-04-09 20:54:03 +01:00
|
|
|
#ifdef USE_SOCKET
|
|
|
|
case 'c': /* running as client */
|
|
|
|
{
|
|
|
|
char *host, *p1;
|
|
|
|
long port;
|
|
|
|
char *ptr;
|
|
|
|
|
|
|
|
host = *++argv;
|
|
|
|
argc--;
|
2003-09-15 02:25:29 +01:00
|
|
|
if (host == NULL || host[0] == '-')
|
2005-03-02 18:35:49 +00:00
|
|
|
YAP_Error(0,0L,"sockets must receive host to connect to");
|
2001-04-09 20:54:03 +01:00
|
|
|
p1 = *++argv;
|
|
|
|
argc--;
|
2003-09-15 02:25:29 +01:00
|
|
|
if (p1 == NULL || p1[0] == '-')
|
2005-03-02 18:35:49 +00:00
|
|
|
YAP_Error(0,0L,"sockets must receive port to connect to");
|
2001-04-09 20:54:03 +01:00
|
|
|
port = strtol(p1, &ptr, 10);
|
|
|
|
if (ptr == NULL || ptr[0] != '\0')
|
2005-03-02 18:35:49 +00:00
|
|
|
YAP_Error(0,0L,"port argument to socket must be a number");
|
2002-09-09 18:40:12 +01:00
|
|
|
YAP_InitSocks(host,port);
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
#endif
|
|
|
|
#ifdef EMACS
|
|
|
|
case 'e':
|
|
|
|
emacs_mode = TRUE;
|
|
|
|
{
|
|
|
|
File fd;
|
|
|
|
strcpy (emacs_tmp, ++p);
|
|
|
|
if ((fd = fopen (emacs_tmp, "w")) == NIL)
|
|
|
|
fprintf(stderr, "[ Warning: unable to communicate with emacs: failed to open %s ]\n", emacs_tmp);
|
|
|
|
fclose (fd);
|
|
|
|
unlink (emacs_tmp);
|
|
|
|
p = *++argv;
|
|
|
|
--argc;
|
|
|
|
strcpy (emacs_tmp2, p);
|
|
|
|
if ((fd = fopen (emacs_tmp2, "w")) == NIL)
|
|
|
|
fprintf(stderr, "Unable to communicate with emacs: failed to open %s\n", emacs_tmp2);
|
|
|
|
fclose (fd);
|
|
|
|
unlink (emacs_tmp2);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
#endif /* EMACS */
|
2002-01-27 20:40:10 +00:00
|
|
|
case 'f':
|
2009-06-09 02:23:55 +01:00
|
|
|
if (argc > 1 && argv[1][0] != '-') {
|
2008-08-24 00:30:25 +01:00
|
|
|
argc--;
|
|
|
|
argv++;
|
|
|
|
if (!strcmp(*argv,"none")) {
|
|
|
|
iap->FastBoot = TRUE;
|
|
|
|
} else {
|
|
|
|
iap->YapPrologRCFile = *argv;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2002-10-30 17:27:19 +00:00
|
|
|
iap->FastBoot = TRUE;
|
2002-01-27 20:40:10 +00:00
|
|
|
break;
|
2006-02-08 17:29:55 +00:00
|
|
|
#ifdef MYDDAS_MYSQL
|
|
|
|
case 'm':
|
|
|
|
if (strncmp(p,"myddas_",7) == 0)
|
|
|
|
{
|
|
|
|
iap->myddas = 1;
|
|
|
|
if ((*argv)[0] == '\0')
|
|
|
|
myddas_temp = *argv;
|
|
|
|
else {
|
|
|
|
argc--;
|
|
|
|
if (argc == 0) {
|
|
|
|
fprintf(stderr," [ YAP unrecoverable error: missing file name with option 'l' ]\n");
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
argv++;
|
|
|
|
myddas_temp = *argv;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (strstr(p,"user") != NULL)
|
|
|
|
iap->myddas_user = myddas_temp;
|
|
|
|
else if (strstr(p,"pass") != NULL)
|
|
|
|
iap->myddas_pass = myddas_temp;
|
|
|
|
else if (strstr(p,"db") != NULL)
|
|
|
|
iap->myddas_db = myddas_temp;
|
|
|
|
else if (strstr(p,"host") != NULL)
|
|
|
|
iap->myddas_host = myddas_temp;
|
|
|
|
else
|
|
|
|
goto myddas_error_print;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
#endif
|
2001-04-09 20:54:03 +01:00
|
|
|
#ifdef MPWSHELL
|
|
|
|
case 'm':
|
|
|
|
if (*++p == 'p' && *++p == 'w' && *++p == '\0')
|
|
|
|
mpwshell = TRUE;
|
|
|
|
break;
|
|
|
|
#endif
|
2009-04-08 00:32:36 +01:00
|
|
|
// execution mode
|
|
|
|
case 'J':
|
|
|
|
switch (p[1]) {
|
|
|
|
case '0':
|
|
|
|
iap->ExecutionMode = YAPC_INTERPRETED;
|
|
|
|
break;
|
|
|
|
case '1':
|
|
|
|
iap->ExecutionMode = YAPC_MIXED_MODE_USER;
|
|
|
|
break;
|
|
|
|
case '2':
|
|
|
|
iap->ExecutionMode = YAPC_MIXED_MODE_ALL;
|
|
|
|
break;
|
|
|
|
case '3':
|
|
|
|
iap->ExecutionMode = YAPC_COMPILE_USER;
|
|
|
|
break;
|
|
|
|
case '4':
|
|
|
|
iap->ExecutionMode = YAPC_COMPILE_ALL;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
fprintf(stderr,"[ YAP unrecoverable error: unknown switch -%c%c ]\n", *p, p[1]);
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
p++;
|
|
|
|
break;
|
2009-05-10 18:36:55 +01:00
|
|
|
case 'G':
|
|
|
|
ssize = &(iap->MaxGlobalSize);
|
|
|
|
goto GetSize;
|
|
|
|
break;
|
2001-04-09 20:54:03 +01:00
|
|
|
case 's':
|
2002-06-18 05:30:57 +01:00
|
|
|
case 'S':
|
2002-10-30 17:27:19 +00:00
|
|
|
ssize = &(iap->StackSize);
|
2008-04-11 17:30:28 +01:00
|
|
|
#if defined(ENV_COPY) || defined(ACOW) || defined(SBA)
|
2001-04-09 20:54:03 +01:00
|
|
|
if (p[1] == 'l') {
|
|
|
|
p++;
|
2002-10-30 17:27:19 +00:00
|
|
|
ssize = &(iap->SchedulerLoop);
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
2008-04-11 17:30:28 +01:00
|
|
|
#endif /* ENV_COPY || ACOW || SBA */
|
2001-04-09 20:54:03 +01:00
|
|
|
goto GetSize;
|
2009-03-27 15:15:54 +00:00
|
|
|
case 'a':
|
|
|
|
case 'A':
|
|
|
|
ssize = &(iap->AttsSize);
|
|
|
|
goto GetSize;
|
2002-06-18 05:30:57 +01:00
|
|
|
case 'T':
|
2009-05-10 18:36:55 +01:00
|
|
|
ssize = &(iap->MaxTrailSize);
|
|
|
|
goto get_trail_size;
|
|
|
|
case 't':
|
2002-10-30 17:27:19 +00:00
|
|
|
ssize = &(iap->TrailSize);
|
2008-04-11 17:30:28 +01:00
|
|
|
#ifdef TABLING
|
2005-08-04 16:45:56 +01:00
|
|
|
if (p[1] == 's') {
|
|
|
|
p++;
|
|
|
|
ssize = &(iap->MaxTableSpaceSize);
|
|
|
|
}
|
2008-08-24 00:30:25 +01:00
|
|
|
#endif /* TABLING */
|
2009-05-10 18:36:55 +01:00
|
|
|
get_trail_size:
|
2008-08-23 17:26:41 +01:00
|
|
|
if (*++p == '\0')
|
|
|
|
{
|
|
|
|
if (argc > 1)
|
|
|
|
--argc, p = *++argv;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
fprintf(stderr,"[ YAP unrecoverable error: missing size in flag %s ]", argv[0]);
|
|
|
|
print_usage();
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
{
|
2009-03-27 15:15:54 +00:00
|
|
|
unsigned long int i = 0, ch;
|
2008-08-23 17:26:41 +01:00
|
|
|
while ((ch = *p++) >= '0' && ch <= '9')
|
|
|
|
i = i * 10 + ch - '0';
|
2008-08-23 17:48:38 +01:00
|
|
|
switch(ch) {
|
|
|
|
case 'M':
|
|
|
|
case 'm':
|
|
|
|
i *= 1024;
|
|
|
|
ch = *p++;
|
|
|
|
break;
|
|
|
|
case 'g':
|
|
|
|
i *= 1024*1024;
|
|
|
|
ch = *p++;
|
|
|
|
break;
|
|
|
|
case 'k':
|
|
|
|
case 'K':
|
|
|
|
ch = *p++;
|
|
|
|
break;
|
|
|
|
}
|
2008-08-23 17:26:41 +01:00
|
|
|
if (ch) {
|
|
|
|
iap->YapPrologTopLevelGoal = add_end_dot(*argv);
|
|
|
|
} else {
|
|
|
|
*ssize = i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'h':
|
|
|
|
case 'H':
|
|
|
|
ssize = &(iap->HeapSize);
|
2001-04-09 20:54:03 +01:00
|
|
|
GetSize:
|
|
|
|
if (*++p == '\0')
|
|
|
|
{
|
|
|
|
if (argc > 1)
|
|
|
|
--argc, p = *++argv;
|
|
|
|
else
|
|
|
|
{
|
2002-06-18 05:27:33 +01:00
|
|
|
fprintf(stderr,"[ YAP unrecoverable error: missing size in flag %s ]", argv[0]);
|
2002-12-06 20:03:26 +00:00
|
|
|
print_usage();
|
2002-06-18 18:02:19 +01:00
|
|
|
exit(EXIT_FAILURE);
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
{
|
2009-03-27 15:15:54 +00:00
|
|
|
unsigned long int i = 0, ch;
|
2001-04-09 20:54:03 +01:00
|
|
|
while ((ch = *p++) >= '0' && ch <= '9')
|
|
|
|
i = i * 10 + ch - '0';
|
2008-08-23 17:48:38 +01:00
|
|
|
switch(ch) {
|
|
|
|
case 'M':
|
|
|
|
case 'm':
|
|
|
|
i *= 1024;
|
|
|
|
ch = *p++;
|
|
|
|
break;
|
|
|
|
case 'g':
|
|
|
|
case 'G':
|
|
|
|
i *= 1024*1024;
|
|
|
|
ch = *p++;
|
|
|
|
break;
|
|
|
|
case 'k':
|
|
|
|
case 'K':
|
|
|
|
ch = *p++;
|
|
|
|
break;
|
|
|
|
}
|
2001-04-09 20:54:03 +01:00
|
|
|
if (ch)
|
|
|
|
{
|
|
|
|
fprintf(stderr,"[ YAP unrecoverable error: illegal size specification %s ]", argv[-1]);
|
2002-09-09 18:40:12 +01:00
|
|
|
YAP_Exit(1);
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
*ssize = i;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
#ifdef DEBUG
|
2005-10-28 18:55:30 +01:00
|
|
|
case 'P':
|
2002-09-09 18:40:12 +01:00
|
|
|
YAP_SetOutputMessage();
|
2001-04-09 20:54:03 +01:00
|
|
|
output_msg = TRUE;
|
|
|
|
break;
|
|
|
|
#endif
|
|
|
|
case 'L':
|
2008-10-16 17:19:14 +01:00
|
|
|
if (p[1] && p[1] >= '0' && p[1] <= '9') /* hack to emulate SWI's L local option */
|
2009-05-10 18:36:55 +01:00
|
|
|
{
|
|
|
|
ssize = &(iap->MaxStackSize);
|
|
|
|
goto GetSize;
|
|
|
|
}
|
2008-03-13 18:41:52 +00:00
|
|
|
iap->QuietMode = TRUE;
|
|
|
|
iap->HaltAfterConsult = TRUE;
|
2001-05-28 20:54:53 +01:00
|
|
|
case 'l':
|
2006-06-02 16:21:35 +01:00
|
|
|
p++;
|
|
|
|
if (!*++argv) {
|
2008-10-16 17:19:14 +01:00
|
|
|
fprintf(stderr,"%% YAP unrecoverable error: missing load file name\n");
|
2006-06-02 16:21:35 +01:00
|
|
|
exit(1);
|
2008-10-16 17:19:14 +01:00
|
|
|
} else if (!strcmp("--",*argv)) {
|
|
|
|
/* shell script, the next entry should be the file itself */
|
|
|
|
iap->YapPrologRCFile = argv[1];
|
|
|
|
argc = 1;
|
|
|
|
break;
|
2006-06-02 16:21:35 +01:00
|
|
|
} else {
|
|
|
|
iap->YapPrologRCFile = *argv;
|
|
|
|
argc--;
|
|
|
|
}
|
|
|
|
if (*p) {
|
|
|
|
/* we have something, usually, of the form:
|
|
|
|
-L --
|
|
|
|
FileName
|
|
|
|
ExtraArgs
|
|
|
|
*/
|
|
|
|
/* being called from a script */
|
|
|
|
while (*p && (*p == ' ' || *p == '\t'))
|
|
|
|
p++;
|
|
|
|
if (p[0] == '-' && p[1] == '-') {
|
|
|
|
/* ignore what is next */
|
|
|
|
argc = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
/* run goal before top-level */
|
2005-10-21 17:09:03 +01:00
|
|
|
case 'g':
|
|
|
|
if ((*argv)[0] == '\0')
|
2005-10-28 18:55:30 +01:00
|
|
|
iap->YapPrologGoal = *argv;
|
2005-10-21 17:09:03 +01:00
|
|
|
else {
|
|
|
|
argc--;
|
|
|
|
if (argc == 0) {
|
2005-10-28 18:55:30 +01:00
|
|
|
fprintf(stderr," [ YAP unrecoverable error: missing initialization goal for option 'g' ]\n");
|
2005-10-21 17:09:03 +01:00
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
argv++;
|
|
|
|
iap->YapPrologGoal = *argv;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
/* run goal as top-level */
|
|
|
|
case 'z':
|
|
|
|
if ((*argv)[0] == '\0')
|
2005-10-28 18:55:30 +01:00
|
|
|
iap->YapPrologTopLevelGoal = *argv;
|
2005-10-21 17:09:03 +01:00
|
|
|
else {
|
|
|
|
argc--;
|
|
|
|
if (argc == 0) {
|
2005-10-28 18:55:30 +01:00
|
|
|
fprintf(stderr," [ YAP unrecoverable error: missing goal for option 'z' ]\n");
|
2005-10-21 17:09:03 +01:00
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
argv++;
|
2008-08-23 17:26:41 +01:00
|
|
|
iap->YapPrologTopLevelGoal = add_end_dot(*argv);
|
2005-10-21 17:09:03 +01:00
|
|
|
}
|
|
|
|
break;
|
2005-10-28 18:55:30 +01:00
|
|
|
case 'p':
|
|
|
|
if ((*argv)[0] == '\0')
|
|
|
|
iap->YapPrologAddPath = *argv;
|
|
|
|
else {
|
|
|
|
argc--;
|
|
|
|
if (argc == 0) {
|
|
|
|
fprintf(stderr," [ YAP unrecoverable error: missing paths for option 'p' ]\n");
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
argv++;
|
|
|
|
iap->YapPrologAddPath = *argv;
|
|
|
|
}
|
|
|
|
break;
|
2005-06-06 06:08:14 +01:00
|
|
|
/* nf: Begin preprocessor code */
|
|
|
|
case 'D':
|
|
|
|
{
|
|
|
|
char *var, *value;
|
|
|
|
++p;
|
|
|
|
var = p;
|
|
|
|
if (var == NULL || *var=='\0')
|
|
|
|
break;
|
|
|
|
while(*p!='=' && *p!='\0') ++p;
|
|
|
|
if ( *p=='\0' ) break;
|
|
|
|
*p='\0';
|
|
|
|
++p;
|
|
|
|
value=p;
|
|
|
|
if ( *value == '\0' ) break;
|
|
|
|
++def_c;
|
|
|
|
def_var[def_c-1]=var;
|
|
|
|
def_value[def_c-1]=value;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
/* End preprocessor code */
|
2001-04-09 20:54:03 +01:00
|
|
|
case '-':
|
|
|
|
/* skip remaining arguments */
|
|
|
|
argc = 1;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
{
|
2006-02-08 17:29:55 +00:00
|
|
|
#ifdef MYDDAS_MYSQL
|
|
|
|
myddas_error_print :
|
|
|
|
#endif
|
2001-04-09 20:54:03 +01:00
|
|
|
fprintf(stderr,"[ YAP unrecoverable error: unknown switch -%c ]\n", *p);
|
2006-02-08 17:29:55 +00:00
|
|
|
#ifdef MYDDAS_MYSQL
|
|
|
|
myddas_error :
|
|
|
|
#endif
|
2002-12-06 20:03:26 +00:00
|
|
|
print_usage();
|
2002-06-18 18:02:19 +01:00
|
|
|
exit(EXIT_FAILURE);
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
2002-10-30 17:27:19 +00:00
|
|
|
iap->SavedState = p;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
}
|
2006-02-08 17:29:55 +00:00
|
|
|
#ifdef MYDDAS_MYSQL
|
|
|
|
/* Check MYDDAS Arguments */
|
|
|
|
if (iap->myddas_user != NULL || iap->myddas_pass != NULL
|
|
|
|
|| iap->myddas_db != NULL || iap->myddas_host != NULL)
|
|
|
|
if (iap->myddas_user == NULL || iap->myddas_db == NULL){
|
|
|
|
fprintf(stderr,"[ YAP unrecoverable error: Missing Mandatory Arguments for MYDDAS ]\n");
|
|
|
|
goto myddas_error;
|
|
|
|
}
|
|
|
|
#endif
|
2008-03-27 00:41:33 +00:00
|
|
|
return BootMode;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2002-10-30 17:27:19 +00:00
|
|
|
init_standard_system(int argc, char *argv[], YAP_init_args *iap)
|
2001-04-09 20:54:03 +01:00
|
|
|
{
|
|
|
|
int BootMode;
|
|
|
|
|
2002-10-30 17:27:19 +00:00
|
|
|
iap->SavedState = NULL;
|
|
|
|
iap->HeapSize = 0;
|
|
|
|
iap->StackSize = 0;
|
|
|
|
iap->TrailSize = 0;
|
2009-03-31 13:51:44 +01:00
|
|
|
iap->AttsSize = 0;
|
2009-05-10 18:36:55 +01:00
|
|
|
iap->MaxAttsSize = 0;
|
|
|
|
iap->MaxHeapSize = 0;
|
|
|
|
iap->MaxStackSize = 0;
|
|
|
|
iap->MaxGlobalSize = 0;
|
|
|
|
iap->MaxTrailSize = 0;
|
2002-10-30 17:27:19 +00:00
|
|
|
iap->YapLibDir = NULL;
|
|
|
|
iap->YapPrologBootFile = NULL;
|
2004-01-23 02:23:51 +00:00
|
|
|
iap->YapPrologInitFile = NULL;
|
2002-10-30 17:27:19 +00:00
|
|
|
iap->YapPrologRCFile = NULL;
|
2005-10-21 17:09:03 +01:00
|
|
|
iap->YapPrologGoal = NULL;
|
|
|
|
iap->YapPrologTopLevelGoal = NULL;
|
2005-10-28 18:55:30 +01:00
|
|
|
iap->YapPrologAddPath = NULL;
|
2002-10-30 17:27:19 +00:00
|
|
|
iap->HaltAfterConsult = FALSE;
|
|
|
|
iap->FastBoot = FALSE;
|
2005-08-04 16:45:56 +01:00
|
|
|
iap->MaxTableSpaceSize = 0;
|
2002-12-06 20:03:26 +00:00
|
|
|
iap->NumberWorkers = DEFAULT_NUMBERWORKERS;
|
|
|
|
iap->SchedulerLoop = DEFAULT_SCHEDULERLOOP;
|
|
|
|
iap->DelayedReleaseLoad = DEFAULT_DELAYEDRELEASELOAD;
|
2004-11-18 22:32:40 +00:00
|
|
|
iap->PrologShouldHandleInterrupts = TRUE;
|
2009-04-08 00:32:36 +01:00
|
|
|
iap->ExecutionMode = YAPC_INTERPRETED;
|
2002-10-30 17:27:19 +00:00
|
|
|
iap->Argc = argc;
|
|
|
|
iap->Argv = argv;
|
2006-02-08 17:29:55 +00:00
|
|
|
#ifdef MYDDAS_MYSQL
|
|
|
|
iap->myddas = 0;
|
|
|
|
iap->myddas_user = NULL;
|
|
|
|
iap->myddas_pass = NULL;
|
|
|
|
iap->myddas_db = NULL;
|
|
|
|
iap->myddas_host = NULL;
|
|
|
|
#endif
|
2005-03-02 18:35:49 +00:00
|
|
|
iap->ErrorNo = 0;
|
|
|
|
iap->ErrorCause = NULL;
|
2008-03-13 18:41:52 +00:00
|
|
|
iap->QuietMode = FALSE;
|
2002-10-30 17:27:19 +00:00
|
|
|
|
|
|
|
BootMode = parse_yap_arguments(argc,argv,iap);
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
/* init memory */
|
2004-01-23 02:23:51 +00:00
|
|
|
if (BootMode == YAP_BOOT_FROM_PROLOG ||
|
|
|
|
BootMode == YAP_FULL_BOOT_FROM_PROLOG) {
|
2005-03-09 06:35:52 +00:00
|
|
|
int NewBootMode = YAP_Init(iap);
|
|
|
|
if (NewBootMode != YAP_BOOT_FROM_PROLOG && BootMode != YAP_FULL_BOOT_FROM_PROLOG)
|
|
|
|
BootMode = NewBootMode;
|
2002-10-30 17:27:19 +00:00
|
|
|
} else {
|
|
|
|
BootMode = YAP_Init(iap);
|
|
|
|
}
|
2005-03-02 18:35:49 +00:00
|
|
|
if (iap->ErrorNo) {
|
|
|
|
/* boot failed */
|
|
|
|
YAP_Error(iap->ErrorNo,0L,iap->ErrorCause);
|
|
|
|
}
|
2005-03-09 06:35:52 +00:00
|
|
|
return BootMode;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
2002-10-30 17:27:19 +00:00
|
|
|
exec_top_level(int BootMode, YAP_init_args *iap)
|
2001-04-09 20:54:03 +01:00
|
|
|
{
|
2002-09-09 18:40:12 +01:00
|
|
|
YAP_Term atomfalse;
|
|
|
|
YAP_Atom livegoal;
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
if (BootMode == YAP_BOOT_FROM_SAVED_STACKS)
|
|
|
|
{
|
|
|
|
/* continue executing from the frozen stacks */
|
2002-09-09 18:40:12 +01:00
|
|
|
YAP_ContinueGoal();
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
2007-03-22 11:12:22 +00:00
|
|
|
/* the top-level is now ready */
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
/* read it before case someone, that is, Ashwin, hides
|
|
|
|
the atom false away ;-).
|
|
|
|
*/
|
2009-10-23 16:50:43 +01:00
|
|
|
livegoal = YAP_FullLookupAtom("$live");
|
2003-02-19 16:43:24 +00:00
|
|
|
atomfalse = YAP_MkAtomTerm (YAP_FullLookupAtom("$false"));
|
2002-09-09 18:40:12 +01:00
|
|
|
while (YAP_GetValue (livegoal) != atomfalse) {
|
2002-10-08 15:32:42 +01:00
|
|
|
YAP_Reset();
|
2002-09-09 18:40:12 +01:00
|
|
|
do_top_goal (YAP_MkAtomTerm (livegoal));
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
2002-09-09 18:40:12 +01:00
|
|
|
YAP_Exit(EXIT_SUCCESS);
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef LIGHT
|
|
|
|
int
|
|
|
|
_main (int argc, char **argv)
|
|
|
|
#else
|
|
|
|
int
|
|
|
|
main (int argc, char **argv)
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
int BootMode;
|
2002-10-30 17:27:19 +00:00
|
|
|
YAP_init_args init_args;
|
2005-06-06 06:08:14 +01:00
|
|
|
int i;
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2005-11-18 18:52:41 +00:00
|
|
|
|
2002-10-30 17:27:19 +00:00
|
|
|
BootMode = init_standard_system(argc, argv, &init_args);
|
2005-03-02 18:35:49 +00:00
|
|
|
if (BootMode == YAP_BOOT_ERROR) {
|
2001-04-09 20:54:03 +01:00
|
|
|
fprintf(stderr,"[ FATAL ERROR: could not find saved state ]\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
2005-06-06 06:08:14 +01:00
|
|
|
/* Begin preprocessor code */
|
|
|
|
{
|
|
|
|
// load the module
|
|
|
|
YAP_Term mod_arg[1];
|
|
|
|
mod_arg[0] = YAP_MkAtomTerm(YAP_LookupAtom("ypp"));
|
2008-06-04 14:58:42 +01:00
|
|
|
YAP_RunGoalOnce(YAP_MkApplTerm(YAP_MkFunctor(YAP_LookupAtom("use_module"),1), 1, mod_arg));
|
2005-06-06 06:08:14 +01:00
|
|
|
// process the definitions
|
|
|
|
for(i=0;i<def_c;++i) {
|
|
|
|
YAP_Term t_args[2],t_goal;
|
|
|
|
t_args[0] = YAP_MkAtomTerm(YAP_LookupAtom(def_var[i]));
|
|
|
|
t_args[1] = YAP_MkAtomTerm(YAP_LookupAtom(def_value[i]));
|
|
|
|
t_goal = YAP_MkApplTerm(YAP_MkFunctor(YAP_LookupAtom("ypp_define"),2), 2, t_args);
|
2008-06-04 14:58:42 +01:00
|
|
|
YAP_RunGoalOnce(t_goal);
|
2005-06-06 06:08:14 +01:00
|
|
|
}
|
|
|
|
}
|
2005-08-17 14:35:52 +01:00
|
|
|
YAP_ClearExceptions();
|
2005-06-06 06:08:14 +01:00
|
|
|
/* End preprocessor code */
|
2003-11-05 18:31:49 +00:00
|
|
|
|
2002-10-30 17:27:19 +00:00
|
|
|
exec_top_level(BootMode, &init_args);
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
|