18static char SccsId[] =
"%W% %G%";
94#if HAVE_SYS_SELECT_H && !_MSC_VER && !defined(__MINGW32__)
95#include <sys/select.h>
111#if _MSC_VER || defined(__MINGW32__)
119#if _MSC_VER || defined(__MINGW32__)
120#define SYSTEM_STAT _stat
122#define SYSTEM_STAT stat
127extern int GLOBAL_NOfFileAliases;
128extern int GLOBAL_SzOfFileAliases;
130 static Atom FetchAlias (
int sno);
131static bool ExistsAliasForStream (
int sno,
Atom al);
143static Int add_alias_to_stream (USES_REGS1)
145 Term tname = Deref(ARG1);
146 Term tstream = Deref(ARG2);
150 if (IsVarTerm(tname)) {
151 Yap_Error(INSTANTIATION_ERROR, tname,
"$add_alias_to_stream");
153 }
else if (!IsAtomTerm (tname)) {
154 Yap_Error(TYPE_ERROR_ATOM, tname,
"$add_alias_to_stream");
157 if (IsVarTerm(tstream)) {
158 Yap_Error(INSTANTIATION_ERROR, tstream,
"$add_alias_to_stream");
160 }
else if (!IsApplTerm (tstream) || FunctorOfTerm (tstream) != FunctorStream ||
161 !IsIntTerm(ArgOfTerm(1,tstream))) {
162 Yap_Error(DOMAIN_ERROR_STREAM_OR_ALIAS, tstream,
"$add_alias_to_stream");
165 at = AtomOfTerm(tname);
166 sno = (int)IntOfTerm(ArgOfTerm(1,tstream));
167 if (Yap_AddAlias(at, sno))
170 Yap_CloseStream(sno);
171 Yap_Error(PERMISSION_ERROR_NEW_ALIAS_FOR_STREAM, tname,
"open/3");
175static Int check_if_valid_new_alias (USES_REGS1)
177 Term tname = Deref(ARG1);
180 if (IsVarTerm(tname)) {
181 Yap_Error(INSTANTIATION_ERROR, tname,
"$add_alias_to_stream");
183 }
else if (!IsAtomTerm (tname)) {
184 Yap_Error(TYPE_ERROR_ATOM, tname,
"$add_alias_to_stream");
187 at = AtomOfTerm(tname);
188 return(Yap_CheckAlias(at) == -1);
193Yap_FetchStreamAlias (
int sno, Term t2 USES_REGS)
197 Atom at = FetchAlias(sno);
201 return Yap_unify_constant(t2, MkAtomTerm(at));
203 }
else if (IsAtomTerm(t2)) {
204 Atom at = AtomOfTerm(t2);
205 return ExistsAliasForStream(sno,at);
207 Yap_Error(TYPE_ERROR_ATOM, t2,
"stream_property(_,alias( ))");
212static void pack_aliases(
void)
217 if (src->alias_stream < 0)
223 if (src->alias_stream < 0) {
226 dst->name = src->name;
227 dst->alias_stream = src->alias_stream;
236ExtendAliasArray(
void)
240 UInt new_size = GLOBAL_SzOfFileAliases+ALIASES_BLOCK_SIZE;
244 GLOBAL_SzOfFileAliases = new_size;
247static void set_system_alias(
Atom al,
int sno){
248 if (al == AtomUserIn) {
249 LOCAL_c_input_stream = sno;
250 }
else if (al == AtomUserOut) {
251 LOCAL_c_output_stream = sno;
252 }
else if (al == AtomUserErr) {
253 LOCAL_c_error_stream = sno;
262 Yap_AddAlias(arg,sno);
271 while( --aliasp >= aliasp0+5) {
272 if (aliasp->alias_stream == sno) {
275 aliasp->alias_stream = -1;
276 if (aliasp->name == AtomUserIn ||
277 aliasp->name == AtomUserOut ||
278 aliasp->name == AtomUserErr) {
279 set_system_alias(aliasp->name, Yap_FindStreamForAlias(aliasp->name));
291Yap_CheckAlias (
Atom arg)
293 return Yap_FindStreamForAlias(arg);
304 while (aliasp-- >= aliasp0) {
305 if (aliasp->alias_stream == sno &&
307 return(aliasp->name);
315ExistsAliasForStream (
int sno,
Atom al)
320 while (--aliasp > aliasp0) {
321 if (aliasp->name == al) {
322 return aliasp->alias_stream == sno;
332Yap_FindStreamForAlias (
Atom al)
339 while (--aliasp >= aliasp0) {
340 if (aliasp->name == al && aliasp->alias_stream >= 0) {
342 return aliasp->alias_stream;
358 while( --aliasp >= aliasp0+5) {
359 if (aliasp->alias_stream == sno &&
360 aliasp->name == arg) {
362 aliasp->alias_stream = -1;
363 if (aliasp->name == AtomUserIn ||
364 aliasp->name == AtomUserOut ||
365 aliasp->name == AtomUserErr) {
366 set_system_alias(aliasp->name, Yap_FindStreamForAlias(aliasp->name));
379Yap_AddAlias (
Atom arg,
int sno)
384 if (ExistsAliasForStream(sno,arg)) {
388 if (GLOBAL_SzOfFileAliases >= (GLOBAL_NOfFileAliases+5))
393 aliasp->alias_stream = sno;
395 set_system_alias(arg,sno);
396 GLOBAL_NOfFileAliases++;
402Yap_InitStandardAliases(
void)
424 GLOBAL_NOfFileAliases = 5;
425 GLOBAL_SzOfFileAliases = ALIASES_BLOCK_SIZE+5;
433 Yap_InitStandardAliases();
434 Yap_InitCPred (
"$check_if_valid_new_alias", 1, check_if_valid_new_alias, TestPredFlag|SafePredFlag|SyncPredFlag|HiddenPredFlag);
435 Yap_InitCPred (
"$add_alias_to_stream", 2, add_alias_to_stream, SafePredFlag|SyncPredFlag|HiddenPredFlag);
void Yap_SetAlias(Atom arg, int sno)
set arg as an alias to sno, but first check if not done before
struct AliasDescS * GLOBAL_FileAliases
alias table access
bool Yap_DeleteAliases(int sno)
purge all aliases for stream sno
int Yap_RemoveAlias(Atom arg, int sno)
remove an alias arg for a stream