comparison src/oct-stream.cc @ 2317:8c09c04f7747

[project @ 1996-07-14 22:30:15 by jwe]
author jwe
date Sun, 14 Jul 1996 22:40:35 +0000
parents 5a3f1d00a474
children 6ee55c0f25a9
comparison
equal deleted inserted replaced
2316:fbc76f6e4893 2317:8c09c04f7747
815 octave_base_stream::gets (int max_len, bool& err) 815 octave_base_stream::gets (int max_len, bool& err)
816 { 816 {
817 return do_gets (max_len, err, false, "fgets"); 817 return do_gets (max_len, err, false, "fgets");
818 } 818 }
819 819
820 // XXX FIXME XXX -- need to handle architecture type conversions.
821
822 #define do_read_elem(is, type, val) \
823 do \
824 { \
825 type tmp_val; \
826 is.read ((char *) &tmp_val, sizeof (type)); \
827 val = tmp_val; \
828 } \
829 while (0)
830
831 octave_value 820 octave_value
832 octave_base_stream::do_read (int nr, int nc, data_type dt, int skip, 821 octave_base_stream::read (const Matrix& size,
833 arch_type at, int& count) 822 oct_data_conv::data_type dt, int skip,
834 { 823 oct_mach_info::float_format flt_fmt, int& count)
824 {
825 Matrix retval;
826
835 count = 0; 827 count = 0;
836 828
837 octave_value retval = Matrix ();
838
839 istream *isp = input_stream (); 829 istream *isp = input_stream ();
840 830
841 Matrix mval;
842 double *data = 0;
843 int max_size = 0;
844
845 int final_nr = 0;
846 int final_nc = 0;
847
848 if (nr > 0)
849 {
850 if (nc > 0)
851 {
852 mval.resize (nr, nc, 0.0);
853 data = mval.fortran_vec ();
854 max_size = nr * nc;
855 }
856 else
857 {
858 mval.resize (nr, 32, 0.0);
859 data = mval.fortran_vec ();
860 max_size = nr * 32;
861 }
862 }
863 else
864 {
865 mval.resize (32, 1, 0.0);
866 data = mval.fortran_vec ();
867 max_size = 32;
868 }
869
870 if (isp) 831 if (isp)
871 { 832 {
872 istream& is = *isp; 833 istream& is = *isp;
873 834
874 for (;;)
875 {
876 // XXX FIXME XXX -- maybe there should be a special case for
877 // skip == 0.
878
879 if (is)
880 {
881 if (nr > 0 && nc > 0 && count == max_size)
882 {
883 final_nr = nr;
884 final_nc = nc;
885
886 break;
887 }
888
889 if (skip != 0)
890 seek (skip, ios::cur);
891
892 if (is)
893 {
894 double tmp = 0.0;
895
896 switch (dt)
897 {
898 case dt_char:
899 do_read_elem (is, char, tmp);
900 break;
901
902 case dt_schar:
903 do_read_elem (is, signed char, tmp);
904 break;
905
906 case dt_uchar:
907 do_read_elem (is, unsigned char, tmp);
908 break;
909
910 case dt_short:
911 do_read_elem (is, short, tmp);
912 break;
913
914 case dt_ushort:
915 do_read_elem (is, unsigned short, tmp);
916 break;
917
918 case dt_int:
919 do_read_elem (is, int, tmp);
920 break;
921
922 case dt_uint:
923 do_read_elem (is, unsigned int, tmp);
924 break;
925
926 case dt_long:
927 do_read_elem (is, long, tmp);
928 break;
929
930 case dt_ulong:
931 do_read_elem (is, unsigned long, tmp);
932 break;
933
934 case dt_float:
935 do_read_elem (is, float, tmp);
936 break;
937
938 case dt_double:
939 do_read_elem (is, double, tmp);
940 break;
941
942 default:
943 error ("fread: invalid type specification");
944 }
945
946 if (is && ok ())
947 {
948 if (count == max_size)
949 {
950 max_size *= 2;
951
952 if (nr > 0)
953 mval.resize (nr, max_size / 2, 0.0);
954 else
955 mval.resize (max_size, 1, 0.0);
956
957 data = mval.fortran_vec ();
958 }
959
960 data[count++] = tmp;
961 }
962 else
963 {
964 if (is.eof ())
965 {
966 if (nr > 0)
967 {
968 if (count > nr)
969 {
970 final_nr = nr;
971 final_nc = (count - 1) / nr + 1;
972 }
973 else
974 {
975 final_nr = count;
976 final_nc = 1;
977 }
978 }
979 else
980 {
981 final_nr = count;
982 final_nc = 1;
983 }
984 }
985
986 break;
987 }
988 }
989 else
990 {
991 error ("fread: read error");
992 break;
993 }
994 }
995 else
996 {
997 error ("fread: read error");
998 break;
999 }
1000 }
1001 }
1002
1003 if (ok ())
1004 {
1005 mval.resize (final_nr, final_nc, 0.0);
1006
1007 retval = mval;
1008 }
1009
1010 return retval;
1011 }
1012
1013 octave_value
1014 octave_base_stream::read (const Matrix& size, data_type dt, int skip,
1015 arch_type at, int& count)
1016 {
1017 octave_value retval;
1018
1019 count = 0;
1020
1021 istream *is = input_stream ();
1022
1023 if (is)
1024 {
1025 int nr = -1; 835 int nr = -1;
1026 int nc = -1; 836 int nc = -1;
1027 837
1028 get_size (size, nr, nc, "fread"); 838 get_size (size, nr, nc, "fread");
1029 839
1030 if (! error_state) 840 if (! error_state)
1031 retval = do_read (nr, nc, dt, skip, at, count); 841 {
842 if (flt_fmt == oct_mach_info::unknown)
843 flt_fmt = float_format ();
844
845 int tmp = retval.read (is, nr, nc, dt, skip, flt_fmt);
846
847 if (tmp < 0)
848 error ("fread: read error");
849 else
850 count = tmp;
851 }
1032 } 852 }
1033 else 853 else
1034 invalid_operation ("fread", "reading"); 854 invalid_operation ("fread", "reading");
1035 855
1036 return retval; 856 return retval;
1626 invalid_operation ("fflush", "writing"); 1446 invalid_operation ("fflush", "writing");
1627 1447
1628 return retval; 1448 return retval;
1629 } 1449 }
1630 1450
1631 // XXX FIXME XXX -- need to handle architecture type conversions.
1632
1633 #define do_write_elem(os, type, val) \
1634 do \
1635 { \
1636 type tmp_val = (type) val; \
1637 os.write ((char *) &tmp_val, sizeof (type)); \
1638 } \
1639 while (0)
1640
1641 int 1451 int
1642 octave_base_stream::do_write (const double *data, int n, data_type dt, 1452 octave_base_stream::write (const octave_value& data,
1643 int skip, arch_type at) 1453 oct_data_conv::data_type dt, int skip,
1454 oct_mach_info::float_format flt_fmt)
1644 { 1455 {
1645 int retval = -1; 1456 int retval = -1;
1646 1457
1647 int count = 0;
1648
1649 ostream *osp = output_stream (); 1458 ostream *osp = output_stream ();
1650 1459
1651 if (osp) 1460 if (osp)
1652 { 1461 {
1653 ostream& os = *osp; 1462 ostream& os = *osp;
1654 1463
1655 // XXX FIXME XXX -- maybe there should be a special case for 1464 Matrix mval = data.matrix_value ();
1656 // skip == 0. 1465
1657 1466 if (! error_state)
1658 for (int i = 0; i < n; i++) 1467 {
1659 { 1468 if (flt_fmt == oct_mach_info::unknown)
1660 if (os) 1469 flt_fmt = float_format ();
1661 { 1470
1662 if (skip != 0) 1471 int tmp = mval.write (os, dt, skip, flt_fmt);
1663 seek (skip, ios::cur); 1472
1664 1473 if (tmp < 0)
1665 if (os) 1474 error ("fwrite: write error");
1666 {
1667 double tmp = data[i];
1668
1669 switch (dt)
1670 {
1671 case dt_char:
1672 do_write_elem (os, char, tmp);
1673 break;
1674
1675 case dt_schar:
1676 do_write_elem (os, signed char, tmp);
1677 break;
1678
1679 case dt_uchar:
1680 do_write_elem (os, unsigned char, tmp);
1681 break;
1682
1683 case dt_short:
1684 do_write_elem (os, short, tmp);
1685 break;
1686
1687 case dt_ushort:
1688 do_write_elem (os, unsigned short, tmp);
1689 break;
1690
1691 case dt_int:
1692 do_write_elem (os, int, tmp);
1693 break;
1694
1695 case dt_uint:
1696 do_write_elem (os, unsigned int, tmp);
1697 break;
1698
1699 case dt_long:
1700 do_write_elem (os, long, tmp);
1701 break;
1702
1703 case dt_ulong:
1704 do_write_elem (os, unsigned long, tmp);
1705 break;
1706
1707 case dt_float:
1708 do_write_elem (os, float, tmp);
1709 break;
1710
1711 case dt_double:
1712 do_write_elem (os, double, tmp);
1713 break;
1714
1715 default:
1716 error ("fwrite: invalid type specification");
1717 }
1718
1719 if (os && ok ())
1720 count++;
1721 else
1722 break;
1723 }
1724 else
1725 {
1726 error ("fwrite: write error");
1727 break;
1728 }
1729 }
1730 else 1475 else
1731 { 1476 retval = tmp;
1732 error ("fwrite: write error");
1733 break;
1734 }
1735 }
1736 }
1737
1738 if (ok ())
1739 retval = count;
1740
1741 return retval;
1742 }
1743
1744 int
1745 octave_base_stream::write (const octave_value& data, data_type dt,
1746 int skip, arch_type at)
1747 {
1748 int retval = -1;
1749
1750 ostream *os = output_stream ();
1751
1752 if (os)
1753 {
1754 Matrix mval = data.matrix_value ();
1755
1756 if (! error_state)
1757 {
1758 int n = mval.length ();
1759
1760 const double *d = mval.data ();
1761
1762 retval = octave_base_stream::do_write (d, n, dt, skip, at);
1763 } 1477 }
1764 } 1478 }
1765 else 1479 else
1766 invalid_operation ("fwrite", "writing"); 1480 invalid_operation ("fwrite", "writing");
1767 1481
2366 return retval; 2080 return retval;
2367 } 2081 }
2368 2082
2369 octave_value 2083 octave_value
2370 octave_stream::read (const Matrix& size, 2084 octave_stream::read (const Matrix& size,
2371 octave_base_stream::data_type dt, int skip, 2085 oct_data_conv::data_type dt, int skip,
2372 octave_base_stream::arch_type at, int& count) 2086 oct_mach_info::float_format flt_fmt, int& count)
2373 { 2087 {
2374 octave_value retval; 2088 octave_value retval;
2375 2089
2376 if (stream_ok ("fread")) 2090 if (stream_ok ("fread"))
2377 retval = rep->read (size, dt, skip, at, count); 2091 retval = rep->read (size, dt, skip, flt_fmt, count);
2378 2092
2379 return retval; 2093 return retval;
2380 } 2094 }
2381 2095
2382 int 2096 int
2383 octave_stream::write (const octave_value& data, 2097 octave_stream::write (const octave_value& data,
2384 octave_base_stream::data_type dt, int skip, 2098 oct_data_conv::data_type dt, int skip,
2385 octave_base_stream::arch_type at) 2099 oct_mach_info::float_format flt_fmt)
2386 { 2100 {
2387 int retval = -1; 2101 int retval = -1;
2388 2102
2389 if (stream_ok ("fwrite")) 2103 if (stream_ok ("fwrite"))
2390 retval = rep->write (data, dt, skip, at); 2104 retval = rep->write (data, dt, skip, flt_fmt);
2391 2105
2392 return retval; 2106 return retval;
2393 } 2107 }
2394 2108
2395 octave_value 2109 octave_value
2496 retval = rep->mode (); 2210 retval = rep->mode ();
2497 2211
2498 return retval; 2212 return retval;
2499 } 2213 }
2500 2214
2501 octave_base_stream::arch_type 2215 oct_mach_info::float_format
2502 octave_stream::architecture (void) 2216 octave_stream::float_format (void)
2503 { 2217 {
2504 octave_base_stream::arch_type retval = octave_base_stream::at_unknown; 2218 oct_mach_info::float_format retval = oct_mach_info::unknown;
2505 2219
2506 if (stream_ok ("architecture")) 2220 if (stream_ok ("float_format"))
2507 retval = rep->architecture (); 2221 retval = rep->float_format ();
2508 2222
2509 return retval; 2223 return retval;
2510 } 2224 }
2511 2225
2512 string 2226 string
2567 break; 2281 break;
2568 2282
2569 default: 2283 default:
2570 break; 2284 break;
2571 } 2285 }
2572
2573 return retval;
2574 }
2575
2576 string
2577 octave_stream::arch_as_string (octave_base_stream::arch_type at)
2578 {
2579 string retval = "unknown";
2580
2581 switch (at)
2582 {
2583 case octave_base_stream::at_native:
2584 retval = "native";
2585 break;
2586
2587 default:
2588 break;
2589 }
2590
2591 return retval;
2592 }
2593
2594 octave_base_stream::data_type
2595 octave_stream::string_to_data_type (const string& s)
2596 {
2597 octave_base_stream::data_type retval = octave_base_stream::dt_unknown;
2598
2599 // XXX FINISHME XXX
2600
2601 /*
2602 int16
2603 integer*2
2604 int32
2605 integer*4 */
2606
2607 // XXX FIXME XXX -- before checking s, need to strip spaces and downcase.
2608
2609 if (s == "char" || s == "char*1" || s == "integer*1" || s == "int8")
2610 retval = octave_base_stream::dt_char;
2611 else if (s == "schar" || s == "signedchar")
2612 retval = octave_base_stream::dt_schar;
2613 else if (s == "uchar" || s == "unsignedchar")
2614 retval = octave_base_stream::dt_uchar;
2615 else if (s == "short")
2616 retval = octave_base_stream::dt_short;
2617 else if (s == "ushort" || s == "unsignedshort")
2618 retval = octave_base_stream::dt_ushort;
2619 else if (s == "int")
2620 retval = octave_base_stream::dt_int;
2621 else if (s == "uint" || s == "unsignedint")
2622 retval = octave_base_stream::dt_uint;
2623 else if (s == "long")
2624 retval = octave_base_stream::dt_long;
2625 else if (s == "ulong" || s == "unsignedlong")
2626 retval = octave_base_stream::dt_ulong;
2627 else if (s == "float" || s == "float32" || s == "real*4")
2628 retval = octave_base_stream::dt_float;
2629 else if (s == "double" || s == "float64" || s == "real**")
2630 retval = octave_base_stream::dt_double;
2631 else
2632 ::error ("invalid data type specified");
2633
2634 return retval;
2635 }
2636
2637 octave_base_stream::arch_type
2638 octave_stream::string_to_arch_type (const string& s)
2639 {
2640 octave_base_stream::arch_type retval = octave_base_stream::at_unknown;
2641
2642 if (s == "native")
2643 retval = octave_base_stream::at_native;
2644 else
2645 ::error ("invalid architecture type specified");
2646 2286
2647 return retval; 2287 return retval;
2648 } 2288 }
2649 2289
2650 void 2290 void
2854 { 2494 {
2855 retval.resize (3); 2495 retval.resize (3);
2856 2496
2857 retval(0) = os->name (); 2497 retval(0) = os->name ();
2858 retval(1) = octave_stream::mode_as_string (os->mode ()); 2498 retval(1) = octave_stream::mode_as_string (os->mode ());
2859 retval(2) = octave_stream::arch_as_string (os->architecture ()); 2499 retval(2) = oct_mach_info::float_format_as_string (os->float_format ());
2860 } 2500 }
2861 else 2501 else
2862 ::error ("invalid file id"); 2502 ::error ("invalid file id");
2863 2503
2864 return retval; 2504 return retval;
2921 octave_stream *os = list (i); 2561 octave_stream *os = list (i);
2922 2562
2923 if (os) 2563 if (os)
2924 { 2564 {
2925 string mode = octave_stream::mode_as_string (os->mode ()); 2565 string mode = octave_stream::mode_as_string (os->mode ());
2926 string arch = octave_stream::arch_as_string (os->architecture ()); 2566
2567 string arch =
2568 oct_mach_info::float_format_as_string (os->float_format ());
2569
2927 string name = os->name (); 2570 string name = os->name ();
2928 2571
2929 buf.form (" %4d %-3s %-9s %s\n", 2572 buf.form (" %4d %-3s %-9s %s\n",
2930 i, mode.c_str (), arch.c_str (), name.c_str ()); 2573 i, mode.c_str (), arch.c_str (), name.c_str ());
2931 } 2574 }