*** old-octave/src/oct-stream.cc 2007-06-13 08:40:49.000000000 +0200 --- octave/src/oct-stream.cc 2007-06-25 06:56:15.000000000 +0200 *************** *** 3888,3894 **** } int ! octave_stream_list::insert (const octave_stream& os) { return (instance_ok ()) ? instance->do_insert (os) : -1; } --- 3888,3894 ---- } int ! octave_stream_list::insert (octave_stream& os) { return (instance_ok ()) ? instance->do_insert (os) : -1; } *************** *** 3956,3995 **** } int ! octave_stream_list::do_insert (const octave_stream& os) { ! octave_value retval; ! int stream_number = -1; ! // Insert item in first open slot, increasing size of list if ! // necessary. ! for (int i = 0; i < curr_len; i++) ! { ! octave_stream tmp = list(i); ! ! if (! tmp.is_open ()) ! { ! list(i) = os; ! stream_number = i; ! break; ! } ! } ! if (stream_number < 0) { ! int total_len = list.length (); ! ! if (curr_len == total_len) ! list.resize (total_len * 2); ! ! list(curr_len) = os; ! stream_number = curr_len; ! curr_len++; } return stream_number; } static void --- 3956,3990 ---- } int ! octave_stream_list::do_insert (octave_stream& os) { ! // Insert item with key corresponding to file-descriptor. ! int stream_number; ! if ((stream_number = os.file_number ()) == -1) ! return stream_number; ! // Should we test for "(list.find (stream_number) != list.end ()) && ! // list[stream_number].is_open ()" and respond with "error ! // ("internal error: ...")"? It should not happen except for some ! // bug or if the user has opened a stream with an interpreted ! // command, but closed it directly with a system call in an ! // oct-file; then the kernel knows the fd is free, but Octave does ! // not know. If it happens, it should not do harm here to simply ! // overwrite this entry, although the wrong entry might have done ! // harm before. ! if (list.size () < list.max_size ()) ! list[stream_number] = os; ! else { ! stream_number = -1; ! error ("could not create file id"); } return stream_number; + } static void *************** *** 4006,4013 **** { octave_stream retval; ! if (fid >= 0 && fid < curr_len) ! retval = list(fid); else gripe_invalid_file_id (fid, who); --- 4001,4013 ---- { octave_stream retval; ! if (fid >= 0) { ! ostrl_map::const_iterator iter = list.find (fid); ! if (iter != list.end ()) ! retval = iter->second; ! else ! gripe_invalid_file_id (fid, who); ! } else gripe_invalid_file_id (fid, who); *************** *** 4036,4054 **** // Can't remove stdin (std::cin), stdout (std::cout), or stderr // (std::cerr). ! if (fid > 2 && fid < curr_len) ! { ! octave_stream os = list(fid); if (os.is_valid ()) { os.close (); ! list(fid) = octave_stream (); retval = 0; } else gripe_invalid_file_id (fid, who); } else gripe_invalid_file_id (fid, who); --- 4036,4058 ---- // Can't remove stdin (std::cin), stdout (std::cout), or stderr // (std::cerr). ! if (fid > 2) { ! ostrl_map::iterator iter = list.find (fid); ! if (iter != list.end ()) { ! octave_stream os = iter->second; if (os.is_valid ()) { os.close (); ! iter->second = octave_stream (); retval = 0; } else gripe_invalid_file_id (fid, who); } + else + gripe_invalid_file_id (fid, who); + } else gripe_invalid_file_id (fid, who); *************** *** 4062,4076 **** if (fid.is_string () && fid.string_value () == "all") { ! // Skip stdin, stdout, and stderr. ! ! for (int i = 3; i < curr_len; i++) ! { ! octave_stream os = list(i); ! if (os.is_valid ()) ! do_remove (i, who); ! } retval = 0; } --- 4066,4082 ---- if (fid.is_string () && fid.string_value () == "all") { ! for (ostrl_map::iterator iter = list.begin (); ! iter != list.end (); ! iter++) ! // Skip stdin, stdout, and stderr. ! if (iter->first > 2) ! { ! octave_stream os = iter->second; ! if (os.is_valid ()) ! do_remove (iter->first, who); ! } retval = 0; } *************** *** 4090,4102 **** { // Do flush stdout and stderr. ! list(0) . flush (); ! list(1) . flush (); // But don't delete them or stdin. ! for (int i = 3; i < curr_len; i++) ! list(i) = octave_stream (); } string_vector --- 4096,4112 ---- { // Do flush stdout and stderr. ! list[0] . flush (); ! list[1] . flush (); // But don't delete them or stdin. ! for (ostrl_map::iterator iter = list.begin (); ! iter != list.end (); ! iter++) ! // Skip stdin, stdout, and stderr. ! if (iter->first > 2) ! iter->second = octave_stream (); } string_vector *************** *** 4148,4160 **** << " number mode arch name\n" << " ------ ---- ---- ----\n"; ! for (int i = 0; i < curr_len; i++) { ! octave_stream os = list(i); buf << " " << std::setiosflags (std::ios::right) ! << std::setw (4) << i << " " << std::setiosflags (std::ios::left) << std::setw (3) << octave_stream::mode_as_string (os.mode ()) --- 4158,4172 ---- << " number mode arch name\n" << " ------ ---- ---- ----\n"; ! for (ostrl_map::const_iterator iter = list.begin (); ! iter != list.end (); ! iter++) { ! octave_stream os = iter->second; buf << " " << std::setiosflags (std::ios::right) ! << std::setw (4) << iter->first << " " << std::setiosflags (std::ios::left) << std::setw (3) << octave_stream::mode_as_string (os.mode ()) *************** *** 4175,4191 **** octave_value octave_stream_list::do_open_file_numbers (void) const { ! Matrix retval (1, curr_len, 0.0); int num_open = 0; ! // Skip stdin, stdout, and stderr. ! ! for (int i = 3; i < curr_len; i++) ! { ! if (list(i)) ! retval (0, num_open++) = i; ! } retval.resize ((num_open > 0), num_open); --- 4187,4203 ---- octave_value octave_stream_list::do_open_file_numbers (void) const { ! Matrix retval (1, list.size (), 0.0); int num_open = 0; ! for (ostrl_map::const_iterator iter = list.begin (); ! iter != list.end (); ! iter++) ! // Skip stdin, stdout, and stderr. ! if (iter->first > 2) ! if (iter->second) ! retval (0, num_open++) = iter->first; retval.resize ((num_open > 0), num_open); *************** *** 4201,4219 **** { std::string nm = fid.string_value (); ! // stdin (std::cin), stdout (std::cout), and stderr (std::cerr) ! // are unnamed. ! ! for (int i = 3; i < curr_len; i++) ! { ! octave_stream os = list(i); ! ! if (os && os.name () == nm) ! { ! retval = i; ! break; ! } ! } } else { --- 4213,4235 ---- { std::string nm = fid.string_value (); ! for (ostrl_map::const_iterator iter = list.begin (); ! iter != list.end (); ! iter++) ! ! // stdin (std::cin), stdout (std::cout), and stderr (std::cerr) ! // are unnamed. ! ! if (iter->first > 2) ! { ! octave_stream os = iter->second; ! ! if (os && os.name () == nm) ! { ! retval = iter->first; ! break; ! } ! } } else {