peek support
This commit is contained in:
parent
e95e795e08
commit
5ceb98bdf9
51
os/charsio.c
51
os/charsio.c
@ -26,6 +26,7 @@ static char SccsId[] = "%W% %G%";
|
|||||||
#include "Yap.h"
|
#include "Yap.h"
|
||||||
#include "Yatom.h"
|
#include "Yatom.h"
|
||||||
#include "YapHeap.h"
|
#include "YapHeap.h"
|
||||||
|
#include "YapText.h"
|
||||||
#include "yapio.h"
|
#include "yapio.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#if HAVE_UNISTD_H
|
#if HAVE_UNISTD_H
|
||||||
@ -84,18 +85,66 @@ Int Yap_peek(int sno) {
|
|||||||
Int ch;
|
Int ch;
|
||||||
|
|
||||||
s = GLOBAL_Stream + sno;
|
s = GLOBAL_Stream + sno;
|
||||||
|
if ( s->status & Readline_Stream_f) {
|
||||||
|
ch = Yap_ReadlinePeekChar( sno );
|
||||||
|
if (ch == EOFCHAR) {
|
||||||
|
s->stream_getc = EOFPeek;
|
||||||
|
s->stream_wgetc = EOFWPeek;
|
||||||
|
s->status |= Push_Eof_Stream_f;
|
||||||
|
}
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
ocharcount = s->charcount;
|
ocharcount = s->charcount;
|
||||||
olinecount = s->linecount;
|
olinecount = s->linecount;
|
||||||
olinepos = s->linepos;
|
olinepos = s->linepos;
|
||||||
ch = s->stream_wgetc(sno);
|
ch = s->stream_wgetc(sno);
|
||||||
|
s ->och = ch;
|
||||||
|
if (ch == EOFCHAR) {
|
||||||
|
s->stream_getc = EOFPeek;
|
||||||
|
s->stream_wgetc = EOFWPeek;
|
||||||
|
s->status |= Push_Eof_Stream_f;
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
s->charcount = ocharcount;
|
s->charcount = ocharcount;
|
||||||
s->linecount = olinecount;
|
s->linecount = olinecount;
|
||||||
s->linepos = olinepos;
|
s->linepos = olinepos;
|
||||||
/* buffer the character */
|
/* buffer the character */
|
||||||
if (s->encoding == LOCAL_encoding) {
|
if (s->encoding == LOCAL_encoding) {
|
||||||
ungetwc(ch, s->file);
|
ungetwc(ch, s->file);
|
||||||
} else {
|
} else if (s->encoding == ENC_OCTET ||
|
||||||
|
s->encoding == ENC_ISO_LATIN1||
|
||||||
|
s->encoding == ENC_ISO_ASCII) {
|
||||||
|
ungetc(ch, s->file);
|
||||||
|
} else if (s->encoding == ENC_ISO_UTF8) {
|
||||||
|
unsigned char cs[8];
|
||||||
|
size_t n = put_utf8(cs, ch );
|
||||||
|
while (n--) {
|
||||||
|
ungetc(cs[n-1], s->file);
|
||||||
|
}
|
||||||
|
} else if (s->encoding == ENC_UTF16_BE) {
|
||||||
/* do the ungetc as if a write .. */
|
/* do the ungetc as if a write .. */
|
||||||
|
unsigned long int c = ch;
|
||||||
|
if (c >((1<<16)-1)) {
|
||||||
|
ungetc(c/1<<16, s->file);
|
||||||
|
c %= 1<< 16;
|
||||||
|
}
|
||||||
|
ungetc(c, s->file);
|
||||||
|
} else if (s->encoding == ENC_UTF16_BE) {
|
||||||
|
/* do the ungetc as if a write .. */
|
||||||
|
unsigned long int c = ch;
|
||||||
|
if (c > ((1<<16)-1)) {
|
||||||
|
ungetc(c/1<<16, s->file);
|
||||||
|
c %= 1<< 16;
|
||||||
|
}
|
||||||
|
} else if (s->encoding == ENC_UTF16_LE) {
|
||||||
|
/* do the ungetc as if a write .. */
|
||||||
|
unsigned long int c = ch;
|
||||||
|
if (c >(( 1<<16)-1)) {
|
||||||
|
ungetc(c%1<<16, s->file);
|
||||||
|
c /= 1<< 16;
|
||||||
|
}
|
||||||
|
ungetc(c, s->file);
|
||||||
|
} else {
|
||||||
int (*f)(int, int) = s->stream_putc;
|
int (*f)(int, int) = s->stream_putc;
|
||||||
s->stream_putc = plUnGetc;
|
s->stream_putc = plUnGetc;
|
||||||
put_wchar(sno, ch);
|
put_wchar(sno, ch);
|
||||||
|
1344
os/iopreds.c
1344
os/iopreds.c
File diff suppressed because it is too large
Load Diff
@ -301,6 +301,7 @@ void Yap_InitWriteTPreds(void);
|
|||||||
void Yap_InitReadTPreds(void);
|
void Yap_InitReadTPreds(void);
|
||||||
void Yap_socketStream( StreamDesc *s );
|
void Yap_socketStream( StreamDesc *s );
|
||||||
void Yap_ReadlineFlush( int sno );
|
void Yap_ReadlineFlush( int sno );
|
||||||
|
Int Yap_ReadlinePeekChar( int sno );
|
||||||
int Yap_ReadlineForSIGINT(void);
|
int Yap_ReadlineForSIGINT(void);
|
||||||
bool Yap_ReadlinePrompt( StreamDesc * s );
|
bool Yap_ReadlinePrompt( StreamDesc * s );
|
||||||
|
|
||||||
@ -327,6 +328,8 @@ int DefaultGets( int,UInt,char*);
|
|||||||
int put_wchar(int sno, wchar_t ch);
|
int put_wchar(int sno, wchar_t ch);
|
||||||
Int GetStreamFd(int sno);
|
Int GetStreamFd(int sno);
|
||||||
int ResetEOF(StreamDesc *s);
|
int ResetEOF(StreamDesc *s);
|
||||||
|
int EOFPeek(int sno);
|
||||||
|
int EOFWPeek(int sno);
|
||||||
|
|
||||||
void Yap_SetAlias (Atom arg, int sno);
|
void Yap_SetAlias (Atom arg, int sno);
|
||||||
bool Yap_AddAlias (Atom arg, int sno);
|
bool Yap_AddAlias (Atom arg, int sno);
|
||||||
|
@ -300,6 +300,42 @@ static int ReadlineGetc(int sno) {
|
|||||||
return console_post_process_read_char(ch, s);
|
return console_post_process_read_char(ch, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Yap_ReadlinePeekChar peeks the next char from the
|
||||||
|
readline buffer, but does not actually grab it.
|
||||||
|
|
||||||
|
The idea is to take advantage of the buffering. Special care must be taken with EOF, though.
|
||||||
|
|
||||||
|
*/
|
||||||
|
Int Yap_ReadlinePeekChar( int sno) {
|
||||||
|
StreamDesc *s = &GLOBAL_Stream[sno];
|
||||||
|
int ch;
|
||||||
|
|
||||||
|
if (s->u.irl.buf) {
|
||||||
|
const char *ttyptr = s->u.irl.ptr;
|
||||||
|
ch = *ttyptr;
|
||||||
|
if (ch == '\0') {
|
||||||
|
ch = '\n';
|
||||||
|
}
|
||||||
|
} if (getLine(sno, StdErrStream) ) {
|
||||||
|
CACHE_REGS
|
||||||
|
ch = s->u.irl.ptr[0];
|
||||||
|
if (ch == '\0') {
|
||||||
|
ch = '\n';
|
||||||
|
}
|
||||||
|
if (ch == '\n') {
|
||||||
|
LOCAL_newline = true;
|
||||||
|
} else {
|
||||||
|
LOCAL_newline = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int Yap_ReadlineForSIGINT(void) {
|
int Yap_ReadlineForSIGINT(void) {
|
||||||
CACHE_REGS
|
CACHE_REGS
|
||||||
int ch;
|
int ch;
|
||||||
|
@ -140,6 +140,7 @@ int GetFreeStreamD(void) {
|
|||||||
LOCK(GLOBAL_Stream[sno].streamlock);
|
LOCK(GLOBAL_Stream[sno].streamlock);
|
||||||
UNLOCK(GLOBAL_StreamDescLock);
|
UNLOCK(GLOBAL_StreamDescLock);
|
||||||
GLOBAL_Stream[sno].encoding = LOCAL_encoding;
|
GLOBAL_Stream[sno].encoding = LOCAL_encoding;
|
||||||
|
GLOBAL_Stream[sno].och = '\0';
|
||||||
return sno;
|
return sno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user