/*-------------------------------------------------------------------------* * PL_SR_OPEN_FILE_2 * * * *-------------------------------------------------------------------------*/ void Pl_SR_Open_File_2(WamWord file_name_word, WamWord from_stream_word) { SRInf *sr = cur_sr; int atom_file_name; int stm; SRFile *file; Bool from_stream = Pl_Rd_Boolean(from_stream_word); Bool master_file = (sr->file_top == NULL); StmInf *pstm, *pstm_tmp; if (sr->next_to_reread == NULL) { if (from_stream) { stm = Pl_Get_Stream_Or_Alias(file_name_word, STREAM_CHECK_INPUT); Pl_Check_Stream_Type(stm, TRUE, TRUE); atom_file_name = pl_stm_tbl[stm]->atom_file_name; } else { atom_file_name = Pl_Rd_Atom(file_name_word); if (strcmp(pl_atom_tbl[atom_file_name].name, "user") == 0) #if 0 stm = pl_stm_input; #else { stm = Pl_Add_Stream(0, (long) 0, pl_stm_tbl[pl_stm_input]->prop, NULL, NULL, NULL, NULL, NULL, NULL, NULL); *pl_stm_tbl[stm] = *pl_stm_tbl[pl_stm_input]; } #endif else { stm = Pl_Add_Stream_For_Stdio_File(pl_atom_tbl[atom_file_name].name, STREAM_MODE_READ, TRUE); if (stm < 0) { if (errno == ENOENT || errno == ENOTDIR) Pl_Err_Existence(pl_existence_source_sink, file_name_word); else Pl_Err_Permission(pl_permission_operation_open, pl_permission_type_source_sink, file_name_word); } } } pstm = pl_stm_tbl[stm]; file = (SRFile *) Malloc(sizeof(SRFile)); file->atom_file_name = atom_file_name; file->stm = stm; file->reposition = pstm->prop.reposition; if (!file->reposition) { file->tmp_path = Pl_M_Tempnam(NULL, NULL); file->tmp_stm = Pl_Add_Stream_For_Stdio_File(file->tmp_path, STREAM_MODE_WRITE, TRUE); if (file->tmp_stm < 0) Pl_Fatal_Error("cannot create tmp file %s in %s:%d", file->tmp_path, __FILE__, __LINE__); /* try to be similar to original file */ pstm_tmp = pl_stm_tbl[file->tmp_stm]; pstm_tmp->atom_file_name = atom_file_name; pstm_tmp->prop.eof_action = pstm->prop.eof_action; if (pstm_tmp->prop.buffering != pstm->prop.buffering) { pstm_tmp->prop.buffering = pstm->prop.buffering; Pl_Stdio_Set_Buffering((FILE *) pstm_tmp->file, pstm_tmp->prop.buffering); } Pl_Add_Mirror_To_Stream(stm, file->tmp_stm); } else { file->tmp_path = NULL; file->tmp_stm = -1; } file->next = NULL; if (sr->file_first == NULL) sr->file_first = file; else sr->file_last->next = file; sr->file_last = file; }
/*-------------------------------------------------------------------------* * PL_OPEN_3 * * * *-------------------------------------------------------------------------*/ void Pl_Open_3(WamWord source_sink_word, WamWord mode_word, WamWord stm_word) { WamWord word, tag_mask; int atom; int mode; Bool text; StmProp prop; char *path; int atom_file_name; int stm; FILE *f; int mask = SYS_VAR_OPTION_MASK; Bool reposition; DEREF(source_sink_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask != TAG_ATM_MASK) Pl_Err_Domain(pl_domain_source_sink, source_sink_word); atom_file_name = UnTag_ATM(word); path = pl_atom_tbl[atom_file_name].name; if ((path = Pl_M_Absolute_Path_Name(path)) == NULL) Pl_Err_Existence(pl_existence_source_sink, source_sink_word); text = mask & 1; mask >>= 1; atom = Pl_Rd_Atom_Check(mode_word); if (atom == pl_atom_read) mode = STREAM_MODE_READ; else if (atom == pl_atom_write) mode = STREAM_MODE_WRITE; else if (atom == pl_atom_append) mode = STREAM_MODE_APPEND; else Pl_Err_Domain(pl_domain_io_mode, mode_word); stm = Pl_Add_Stream_For_Stdio_File(path, mode, text); if (stm < 0) { if (errno == ENOENT || errno == ENOTDIR) Pl_Err_Existence(pl_existence_source_sink, source_sink_word); else Pl_Err_Permission(pl_permission_operation_open, pl_permission_type_source_sink, source_sink_word); } prop = pl_stm_tbl[stm]->prop; f = (FILE *) pl_stm_tbl[stm]->file; /* change properties wrt to specified ones */ if ((mask & 2) != 0) /* reposition specified */ { reposition = mask & 1; if (reposition && !prop.reposition) { fclose(f); word = Pl_Put_Structure(pl_atom_reposition, 1); Pl_Unify_Atom(pl_atom_true); Pl_Err_Permission(pl_permission_operation_open, pl_permission_type_source_sink, word); } prop.reposition = reposition; } mask >>= 2; if ((mask & 4) != 0) /* eof_action specified */ prop.eof_action = mask & 3; mask >>= 3; if ((mask & 4) != 0) /* buffering specified */ if (prop.buffering != (unsigned) (mask & 3)) /* cast for MSVC warning */ { prop.buffering = mask & 3; Pl_Stdio_Set_Buffering(f, prop.buffering); } mask >>= 3; pl_stm_tbl[stm]->atom_file_name = atom_file_name; pl_stm_tbl[stm]->prop = prop; Pl_Get_Integer(stm, stm_word); }