/** @brief reading from the console is complicated because we need to know whether to prompt and so on... EOF must be handled by resetting the file. */ static int ReadlineGetc(int sno) { StreamDesc *s = &GLOBAL_Stream[sno]; int ch; bool fetch = (s->u.irl.buf == NULL); if (!fetch || getLine(sno)) { const unsigned char *ttyptr = s->u.irl.ptr++, *myrl_line = s->u.irl.buf; ch = *ttyptr; if (ch == '\0') { ch = '\n'; free((void *)myrl_line); s->u.irl.ptr = s->u.irl.buf = NULL; } } else { return EOF; } return console_post_process_read_char(ch, s); }
/* Basically, the same as console but also sends a prompt and takes care of finding out whether we are at the start of a LOCAL_newline. */ static int ConsolePipeGetc(int sno) { CACHE_REGS StreamDesc *s = &GLOBAL_Stream[sno]; int ch; char c; #if _MSC_VER || defined(__MINGW32__) DWORD count; #else int count; #endif /* send the prompt away */ if (LOCAL_newline) { char *cptr = LOCAL_Prompt, ch; /* use the default routine */ while ((ch = *cptr++) != '\0') { GLOBAL_Stream[StdErrStream].stream_putc(StdErrStream, ch); } strncpy(LOCAL_Prompt, RepAtom (LOCAL_AtPrompt)->StrOfAE, MAX_PROMPT); LOCAL_newline = false; } /* should be able to use a buffer */ LOCAL_PrologMode |= ConsoleGetcMode; count = read(s->u.pipe.fd, &c, sizeof(char)); LOCAL_PrologMode &= ~ConsoleGetcMode; if (count == 0) { return console_post_process_eof(s); } else if (count > 0) { ch = c; } else { Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil, "read"); return console_post_process_eof(s); } return console_post_process_read_char(ch, s); }