37static Int prompt(USES_REGS1);
38static Int prompt1(USES_REGS1);
40static int ConsoleGetc(
int);
41static int ConsolePutc(
int,
int);
54int console_post_process_read_char(
int ch,
StreamDesc *s) {
56 console_count_output_char(ch, GLOBAL_Stream + LOCAL_c_error_stream);
58 s->linestart = s->charcount;
65 s->linestart = s->charcount;
67 }
else if (ch != EOF) {
70 LOCAL_newline =
false;
75bool is_same_tty(FILE *f1, FILE *f2) {
77 char buf1[MAX_PATH], buf2[MAX_PATH];
78 return ttyname_r(fileno(f1), buf1, MAX_PATH - 1) ==
79 ttyname_r(fileno(f2), buf2, MAX_PATH - 1);
85static Int is_same_tty2(USES_REGS1) {
86 int sni = Yap_CheckStream(ARG1, Input_Stream_f,
"put/2");
87 int sno = Yap_CheckStream(ARG2, Output_Stream_f,
"put/2");
88 bool out = (GLOBAL_Stream[sni].status & Tty_Stream_f) &&
89 (GLOBAL_Stream[sno].status & Tty_Stream_f) &&
90 is_same_tty(GLOBAL_Stream[sno].file, GLOBAL_Stream[sni].file);
91 UNLOCK(GLOBAL_Stream[sno].streamlock);
92 UNLOCK(GLOBAL_Stream[sni].streamlock);
98 s->stream_putc = ConsolePutc;
102 if ((s->status & Readline_Stream_f) && trueGlobalPrologFlag(READLINE_FLAG)) {
103 if (Yap_ReadlineOps(s))
110static int ConsolePutc(
int sno,
int ch) {
114 fputs(
"\n", s->file);
118 LOCAL_newline =
true;
124 console_count_output_char(ch, s);
130static int ConsoleGetc(
int sno) {
137 if (Yap_DoPrompt(s)) {
139 char *cptr = LOCAL_Prompt, ch;
140 Yap_clearInput(LOCAL_c_error_stream);
141 strncpy(LOCAL_Prompt, (
char *)RepAtom(LOCAL_AtPrompt)->StrOfAE, MAX_PROMPT);
143 while ((ch = *cptr++) !=
'\0') {
144 GLOBAL_Stream[StdErrStream].stream_putc(StdErrStream, ch);
150 siginterrupt(SIGINT, TRUE);
152 LOCAL_PrologMode |= ConsoleGetcMode;
155 siginterrupt(SIGINT, FALSE);
157 if (LOCAL_PrologMode & InterruptMode) {
158 Yap_external_signal(0, YAP_INT_SIGNAL);
159 LOCAL_PrologMode &= ~ConsoleGetcMode;
160 LOCAL_newline = TRUE;
161 if (LOCAL_PrologMode & AbortMode) {
162 Yap_Error(ABORT_EVENT, TermNil,
"");
163 LOCAL_ErrorMessage =
"Abort";
168 LOCAL_PrologMode &= ~ConsoleGetcMode;
171 LOCAL_PrologMode |= ConsoleGetcMode;
173 LOCAL_PrologMode |= ConsoleGetcMode;
175 LOCAL_PrologMode &= ~ InterruptMode;
177 return console_post_process_eof(s);
178 return console_post_process_read_char(ch, s);
189static Int prompt1(USES_REGS1) {
190 Term t = Deref(ARG1);
192 if (IsVarTerm(t) || !IsAtomTerm(t))
194 LOCAL_AtPrompt = a = AtomOfTerm(t);
195 if (strlen((
char *)RepAtom(a)->StrOfAE) > MAX_PROMPT) {
196 Yap_Error(SYSTEM_ERROR_INTERNAL, t,
"prompt %s is too long",
197 RepAtom(a)->StrOfAE);
200 strncpy(LOCAL_Prompt, (
char *)RepAtom(a)->StrOfAE, MAX_PROMPT);
210static Int prompt(USES_REGS1) {
211 Term t = Deref(ARG2);
213 if (!Yap_unify_constant(ARG1, MkAtomTerm(LOCAL_AtPrompt)))
215 if (IsVarTerm(t) || !IsAtomTerm(t))
218 if (strlen(RepAtom(a)->StrOfAE) > MAX_PROMPT) {
219 Yap_Error(SYSTEM_ERROR_INTERNAL, t,
"prompt %s is too long",
220 RepAtom(a)->StrOfAE);
223 strncpy(LOCAL_Prompt, (
char *)RepAtom(LOCAL_AtPrompt)->StrOfAE, MAX_PROMPT);
234static Int ensure_prompting(USES_REGS1) {
235 if (!LOCAL_newline) {
236 GLOBAL_Stream[2].stream_wputc(2, 10);
241int Yap_GetCharForSIGINT(
void) {
245 if (trueGlobalPrologFlag(READLINE_FLAG) ||
246 (ch = Yap_ReadlineForSIGINT()) == 0)
249 fprintf(stderr,
"Action (h for help): ");
252 while ((fgetc(stdin)) !=
'\n')
255 LOCAL_newline = TRUE;
260void Yap_InitConsole(
void) {
262 LOCAL_newline =
true;
263 Yap_InitCPred(
"prompt", 1, prompt1, SafePredFlag | SyncPredFlag);
264 Yap_InitCPred(
"prompt1", 1, prompt1, SafePredFlag | SyncPredFlag);
265 Yap_InitCPred(
"$is_same_tty", 2, is_same_tty2,
266 SafePredFlag | SyncPredFlag | HiddenPredFlag);
267 Yap_InitCPred(
"prompt", 2, prompt, SafePredFlag | SyncPredFlag);
268 Yap_InitCPred(
"$ensure_prompting", 0, ensure_prompting,
269 SafePredFlag | SyncPredFlag);
int(* stream_getc)(int)
function the stream uses for writing a character