mainbranch fixes to:
- fix quoted characters output - fix line position in read_term and friends - make messages look a bit better - CLP(BN) EM improvements.
This commit is contained in:
@@ -1781,7 +1781,7 @@ YAP_EndConsult(void)
|
||||
X_API Term
|
||||
YAP_Read(int (*mygetc)(void))
|
||||
{
|
||||
Term t;
|
||||
Term t, tpos = TermNil;
|
||||
int sno;
|
||||
TokEntry *tokstart;
|
||||
|
||||
@@ -1794,7 +1794,8 @@ YAP_Read(int (*mygetc)(void))
|
||||
return TermNil;
|
||||
}
|
||||
Stream[sno].stream_getc = do_yap_getc;
|
||||
tokstart = Yap_tokptr = Yap_toktide = Yap_tokenizer(sno);
|
||||
Stream[sno].status |= Tty_Stream_f;
|
||||
tokstart = Yap_tokptr = Yap_toktide = Yap_tokenizer(sno, &tpos);
|
||||
Stream[sno].status = Free_Stream_f;
|
||||
if (Yap_ErrorMessage)
|
||||
{
|
||||
|
||||
2
C/init.c
2
C/init.c
@@ -946,7 +946,7 @@ InitFlags(void)
|
||||
yap_flags[LANGUAGE_MODE_FLAG] = 0;
|
||||
yap_flags[STRICT_ISO_FLAG] = FALSE;
|
||||
yap_flags[SOURCE_MODE_FLAG] = FALSE;
|
||||
yap_flags[CHARACTER_ESCAPE_FLAG] = SICSTUS_CHARACTER_ESCAPES;
|
||||
yap_flags[CHARACTER_ESCAPE_FLAG] = ISO_CHARACTER_ESCAPES;
|
||||
yap_flags[WRITE_QUOTED_STRING_FLAG] = FALSE;
|
||||
#if (defined(YAPOR) || defined(THREADS)) && PUREe_YAPOR
|
||||
yap_flags[ALLOW_ASSERTING_STATIC_FLAG] = FALSE;
|
||||
|
||||
14
C/iopreds.c
14
C/iopreds.c
@@ -3827,8 +3827,7 @@ static Int
|
||||
old_H = H;
|
||||
Yap_eot_before_eof = FALSE;
|
||||
tpos = StreamPosition(inp_stream);
|
||||
StartLine = Stream[inp_stream].linecount;
|
||||
tokstart = Yap_tokptr = Yap_toktide = Yap_tokenizer(inp_stream);
|
||||
tokstart = Yap_tokptr = Yap_toktide = Yap_tokenizer(inp_stream, &tpos);
|
||||
if (Yap_Error_TYPE != YAP_NO_ERROR && seekable) {
|
||||
H = old_H;
|
||||
Yap_clean_tokenizer(tokstart, Yap_VarTable, Yap_AnonVarTable);
|
||||
@@ -4181,13 +4180,19 @@ StreamPosition(int sno)
|
||||
else
|
||||
sargs[0] = MkIntTerm (YP_ftell (Stream[sno].u.file.file));
|
||||
}
|
||||
sargs[1] = MkIntegerTerm (Stream[sno].linecount);
|
||||
sargs[1] = MkIntegerTerm (StartLine = Stream[sno].linecount);
|
||||
sargs[2] = MkIntegerTerm (Stream[sno].linepos);
|
||||
sargs[3] = sargs[4] = MkIntTerm (0);
|
||||
return Yap_MkApplTerm (FunctorStreamPos, 5, sargs);
|
||||
}
|
||||
|
||||
|
||||
Term
|
||||
Yap_StreamPosition(int sno)
|
||||
{
|
||||
return StreamPosition(sno);
|
||||
}
|
||||
|
||||
static Int
|
||||
p_show_stream_position (void)
|
||||
{ /* '$show_stream_position'(+Stream,Pos) */
|
||||
@@ -5971,12 +5976,13 @@ Yap_StringToTerm(char *s,Term *tp)
|
||||
Term t;
|
||||
TokEntry *tokstart;
|
||||
tr_fr_ptr TR_before_parse;
|
||||
Term tpos = TermNil;
|
||||
|
||||
if (sno < 0)
|
||||
return FALSE;
|
||||
UNLOCK(Stream[sno].streamlock);
|
||||
TR_before_parse = TR;
|
||||
tokstart = Yap_tokptr = Yap_toktide = Yap_tokenizer(sno);
|
||||
tokstart = Yap_tokptr = Yap_toktide = Yap_tokenizer(sno, &tpos);
|
||||
if (tokstart == NIL && tokstart->Tok == Ord (eot_tok)) {
|
||||
if (tp) {
|
||||
*tp = MkAtomTerm(Yap_LookupAtom("end of file found before end of term"));
|
||||
|
||||
@@ -145,13 +145,13 @@ static Int
|
||||
p_stream_to_terms(void)
|
||||
{
|
||||
int sno = Yap_CheckStream (ARG1, Input_Stream_f, "read_line_to_codes/2");
|
||||
Term t = Deref(ARG3);
|
||||
Term t = Deref(ARG3), tpos = TermNil;
|
||||
|
||||
if (sno < 0)
|
||||
return FALSE;
|
||||
while (!(Stream[sno].status & Eof_Stream_f)) {
|
||||
/* skip errors */
|
||||
TokEntry *tokstart = Yap_tokptr = Yap_toktide = Yap_tokenizer(sno);
|
||||
TokEntry *tokstart = Yap_tokptr = Yap_toktide = Yap_tokenizer(sno, &tpos);
|
||||
if (!Yap_ErrorMessage)
|
||||
{
|
||||
Term th = Yap_Parse();
|
||||
|
||||
20
C/scanner.c
20
C/scanner.c
@@ -732,7 +732,7 @@ ch_to_wide(char *base, char *charp)
|
||||
}
|
||||
|
||||
TokEntry *
|
||||
Yap_tokenizer(int inp_stream)
|
||||
Yap_tokenizer(int inp_stream, Term *tposp)
|
||||
{
|
||||
TokEntry *t, *l, *p;
|
||||
enum TokenKinds kind;
|
||||
@@ -753,6 +753,10 @@ Yap_tokenizer(int inp_stream)
|
||||
p = NULL; /* Just to make lint happy */
|
||||
LOCK(Stream[inp_stream].streamlock);
|
||||
ch = Nxtch(inp_stream);
|
||||
while (chtype(ch) == BS) {
|
||||
ch = Nxtch(inp_stream);
|
||||
}
|
||||
*tposp = Yap_StreamPosition(inp_stream);
|
||||
do {
|
||||
wchar_t och;
|
||||
int quote, isvar;
|
||||
@@ -789,6 +793,13 @@ Yap_tokenizer(int inp_stream)
|
||||
while ((ch = Nxtch(inp_stream)) != 10 && chtype(ch) != EF);
|
||||
if (chtype(ch) != EF) {
|
||||
/* blank space */
|
||||
if (t == l) {
|
||||
/* we found a comment before reading characters */
|
||||
while (chtype(ch) == BS) {
|
||||
ch = Nxtch(inp_stream);
|
||||
}
|
||||
*tposp = Yap_StreamPosition(inp_stream);
|
||||
}
|
||||
goto restart;
|
||||
} else {
|
||||
t->Tok = Ord(kind = eot_tok);
|
||||
@@ -1114,6 +1125,13 @@ Yap_tokenizer(int inp_stream)
|
||||
t->Tok = Ord(kind = eot_tok);
|
||||
}
|
||||
ch = Nxtch(inp_stream);
|
||||
if (t == l) {
|
||||
/* we found a comment before reading characters */
|
||||
while (chtype(ch) == BS) {
|
||||
ch = Nxtch(inp_stream);
|
||||
}
|
||||
*tposp = Yap_StreamPosition(inp_stream);
|
||||
}
|
||||
goto restart;
|
||||
}
|
||||
enter_symbol:
|
||||
|
||||
98
C/write.c
98
C/write.c
@@ -178,17 +178,18 @@ legalAtom(unsigned char *s) /* Is this a legal atom ? */
|
||||
else if (Yap_chtype[ch] == SL)
|
||||
return (!*++s);
|
||||
else if ((ch == ',' || ch == '.') && !s[1])
|
||||
return (FALSE);
|
||||
return FALSE;
|
||||
else
|
||||
while (ch) {
|
||||
if (Yap_chtype[ch] != SY) return (FALSE);
|
||||
if (Yap_chtype[ch] != SY || ch == '\\')
|
||||
return FALSE;
|
||||
ch = *++s;
|
||||
}
|
||||
return (TRUE);
|
||||
return TRUE;
|
||||
} else
|
||||
while ((ch = *++s) != 0)
|
||||
if (Yap_chtype[ch] > NU)
|
||||
return (FALSE);
|
||||
return FALSE;
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
@@ -219,6 +220,73 @@ AtomIsSymbols(unsigned char *s) /* Is this atom just formed by symbols ? */
|
||||
return(symbol);
|
||||
}
|
||||
|
||||
static void
|
||||
write_quoted(int ch, int quote, wrf writewch)
|
||||
{
|
||||
if (yap_flags[CHARACTER_ESCAPE_FLAG] == CPROLOG_CHARACTER_ESCAPES) {
|
||||
wrputc(ch, writewch);
|
||||
if (ch == '\'')
|
||||
wrputc('\'', writewch); /* be careful about quotes */
|
||||
return;
|
||||
}
|
||||
if (!(ch < 0xff && chtype(ch) == BS) && ch != '\'' && ch != '\\') {
|
||||
wrputc(ch, writewch);
|
||||
} else {
|
||||
switch (ch) {
|
||||
case '\\':
|
||||
case '\'':
|
||||
wrputc('\\', writewch);
|
||||
wrputc(ch, writewch);
|
||||
break;
|
||||
case 7:
|
||||
wrputc('\\', writewch);
|
||||
wrputc('a', writewch);
|
||||
break;
|
||||
case '\b':
|
||||
wrputc('\\', writewch);
|
||||
wrputc('b', writewch);
|
||||
break;
|
||||
case '\t':
|
||||
wrputc('\\', writewch);
|
||||
wrputc('t', writewch);
|
||||
break;
|
||||
case ' ':
|
||||
case 160:
|
||||
wrputc(' ', writewch);
|
||||
break;
|
||||
case '\n':
|
||||
wrputc('\\', writewch);
|
||||
wrputc('n', writewch);
|
||||
break;
|
||||
case 11:
|
||||
wrputc('\\', writewch);
|
||||
wrputc('v', writewch);
|
||||
break;
|
||||
case '\r':
|
||||
wrputc('\\', writewch);
|
||||
wrputc('r', writewch);
|
||||
break;
|
||||
case '\f':
|
||||
wrputc('\\', writewch);
|
||||
wrputc('f', writewch);
|
||||
break;
|
||||
default:
|
||||
if ( ch <= 0xff ) {
|
||||
char esc[8];
|
||||
|
||||
if (yap_flags[CHARACTER_ESCAPE_FLAG] == SICSTUS_CHARACTER_ESCAPES) {
|
||||
sprintf(esc, "\\%03o", ch);
|
||||
} else {
|
||||
/* last backslash in ISO mode */
|
||||
sprintf(esc, "\\%03o\\", ch);
|
||||
}
|
||||
wrputs(esc, writewch);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
putAtom(Atom atom, int Quote_illegal, wrf writewch) /* writes an atom */
|
||||
|
||||
@@ -242,11 +310,7 @@ putAtom(Atom atom, int Quote_illegal, wrf writewch) /* writes an atom */
|
||||
wrputc('\'', writewch);
|
||||
while (*ws) {
|
||||
wchar_t ch = *ws++;
|
||||
wrputc(ch, writewch);
|
||||
if (ch == '\\' && yap_flags[CHARACTER_ESCAPE_FLAG] != CPROLOG_CHARACTER_ESCAPES)
|
||||
wrputc('\\', writewch); /* be careful about backslashes */
|
||||
else if (ch == '\'')
|
||||
wrputc('\'', writewch); /* be careful about quotes */
|
||||
write_quoted(ch, '\'', writewch);
|
||||
}
|
||||
wrputc('\'', writewch);
|
||||
} else {
|
||||
@@ -261,11 +325,7 @@ putAtom(Atom atom, int Quote_illegal, wrf writewch) /* writes an atom */
|
||||
wrputc('\'', writewch);
|
||||
while (*s) {
|
||||
wchar_t ch = *s++;
|
||||
wrputc(ch, writewch);
|
||||
if (ch == '\\' && yap_flags[CHARACTER_ESCAPE_FLAG] != CPROLOG_CHARACTER_ESCAPES)
|
||||
wrputc('\\', writewch); /* be careful about backslashes */
|
||||
else if (ch == '\'')
|
||||
wrputc('\'', writewch); /* be careful about quotes */
|
||||
write_quoted(ch, '\'', writewch);
|
||||
}
|
||||
wrputc('\'', writewch);
|
||||
} else {
|
||||
@@ -276,7 +336,8 @@ putAtom(Atom atom, int Quote_illegal, wrf writewch) /* writes an atom */
|
||||
static int
|
||||
IsStringTerm(Term string) /* checks whether this is a string */
|
||||
{
|
||||
if (IsVarTerm(string)) return(FALSE);
|
||||
if (IsVarTerm(string))
|
||||
return FALSE;
|
||||
do {
|
||||
Term hd;
|
||||
int ch;
|
||||
@@ -301,12 +362,7 @@ putString(Term string, wrf writewch) /* writes a string */
|
||||
wrputc('"', writewch);
|
||||
while (string != TermNil) {
|
||||
int ch = IntOfTerm(HeadOfTerm(string));
|
||||
wrputc(ch, writewch);
|
||||
if (ch == '\\' && yap_flags[CHARACTER_ESCAPE_FLAG] != CPROLOG_CHARACTER_ESCAPES)
|
||||
wrputc('\\', writewch); /* be careful about backslashes */
|
||||
else if (ch == '"')
|
||||
wrputc('"', writewch); /* be careful about quotes */
|
||||
string = TailOfTerm(string);
|
||||
write_quoted(ch, '"', writewch);
|
||||
}
|
||||
wrputc('"', writewch);
|
||||
lastw = alphanum;
|
||||
|
||||
Reference in New Issue
Block a user