Mercurial > hg > octave-nkf
comparison src/oct-stream.cc @ 2572:5c2be7c820ed
[project @ 1996-12-08 04:02:46 by jwe]
author | jwe |
---|---|
date | Sun, 08 Dec 1996 04:02:46 +0000 |
parents | 3be97fe02051 |
children | c454cd888ada |
comparison
equal
deleted
inserted
replaced
2571:2480ef198c46 | 2572:5c2be7c820ed |
---|---|
854 invalid_operation ("fread", "reading"); | 854 invalid_operation ("fread", "reading"); |
855 | 855 |
856 return retval; | 856 return retval; |
857 } | 857 } |
858 | 858 |
859 #define do_scanf_conv(is, fmt, valptr, mval, data, idx, max_size, discard) \ | 859 template <class T> |
860 do \ | 860 void |
861 { \ | 861 do_scanf_conv (istream& is, const char *fmt, T valptr, Matrix& mval, |
862 is.scan (fmt, valptr); \ | 862 double *data, int& idx, int nr, int max_size, |
863 \ | 863 bool discard) |
864 if (is) \ | 864 { |
865 { \ | 865 is.scan (fmt, valptr); |
866 if (idx == max_size && ! discard) \ | 866 |
867 { \ | 867 if (is) |
868 max_size *= 2; \ | 868 { |
869 \ | 869 if (idx == max_size && ! discard) |
870 if (nr > 0) \ | 870 { |
871 mval.resize (nr, max_size / nr, 0.0); \ | 871 max_size *= 2; |
872 else \ | 872 |
873 mval.resize (max_size, 1, 0.0); \ | 873 if (nr > 0) |
874 \ | 874 mval.resize (nr, max_size / nr, 0.0); |
875 data = mval.fortran_vec (); \ | 875 else |
876 } \ | 876 mval.resize (max_size, 1, 0.0); |
877 \ | 877 |
878 if (! discard) \ | 878 data = mval.fortran_vec (); |
879 data[idx++] = *(valptr); \ | 879 } |
880 } \ | 880 |
881 } \ | 881 if (! discard) |
882 while (0) | 882 data[idx++] = *(valptr); |
883 } | |
884 } | |
885 | |
886 template void | |
887 do_scanf_conv (istream&, const char*, int*, Matrix&, double*, int&, | |
888 int, int, bool); | |
889 | |
890 template void | |
891 do_scanf_conv (istream&, const char*, float*, Matrix&, double*, int&, | |
892 int, int, bool); | |
893 | |
894 template void | |
895 do_scanf_conv (istream&, const char*, double*, Matrix&, double*, int&, | |
896 int, int, bool); | |
897 | |
883 | 898 |
884 octave_value | 899 octave_value |
885 octave_base_stream::do_scanf (scanf_format_list& fmt_list, | 900 octave_base_stream::do_scanf (scanf_format_list& fmt_list, |
886 int nr, int nc, int& count) | 901 int nr, int nc, int& count) |
887 { | 902 { |
959 case 'd': case 'i': case 'o': case 'u': case 'x': | 974 case 'd': case 'i': case 'o': case 'u': case 'x': |
960 { | 975 { |
961 int tmp; | 976 int tmp; |
962 | 977 |
963 do_scanf_conv (is, fmt, &tmp, mval, data, count, | 978 do_scanf_conv (is, fmt, &tmp, mval, data, count, |
964 max_size, discard); | 979 nr, max_size, discard); |
965 } | 980 } |
966 break; | 981 break; |
967 | 982 |
968 case 'e': case 'f': case 'g': | 983 case 'e': case 'f': case 'g': |
969 { | 984 { |
970 if (elt->modifier == 'l') | 985 if (elt->modifier == 'l') |
971 { | 986 { |
972 double tmp; | 987 double tmp; |
973 | 988 |
974 do_scanf_conv (is, fmt, &tmp, mval, data, | 989 do_scanf_conv (is, fmt, &tmp, mval, data, |
975 count, max_size, discard); | 990 count, nr, max_size, discard); |
976 } | 991 } |
977 else | 992 else |
978 { | 993 { |
979 float tmp; | 994 float tmp; |
980 | 995 |
981 do_scanf_conv (is, fmt, &tmp, mval, data, | 996 do_scanf_conv (is, fmt, &tmp, mval, data, |
982 count, max_size, discard); | 997 count, nr, max_size, discard); |
983 } | 998 } |
984 } | 999 } |
985 break; | 1000 break; |
986 | 1001 |
987 case 'c': | 1002 case 'c': |
1192 invalid_operation ("fscanf", "writing"); | 1207 invalid_operation ("fscanf", "writing"); |
1193 | 1208 |
1194 return retval; | 1209 return retval; |
1195 } | 1210 } |
1196 | 1211 |
1197 #define do_oscanf_num_conv(is, fmt, valptr) \ | 1212 template <class T> |
1198 do \ | 1213 octave_value |
1199 { \ | 1214 do_oscanf_num_conv (istream& is, const char *fmt, T valptr, bool discard) |
1200 streambuf *isb = is.rdbuf (); \ | 1215 { |
1201 \ | 1216 octave_value retval; |
1202 if (isb->scan (fmt, valptr) > 0) \ | 1217 |
1203 { \ | 1218 is.scan (fmt, valptr); |
1204 if (! discard && is) \ | 1219 |
1205 retval = (double) (*valptr); \ | 1220 if (is) |
1206 } \ | 1221 { |
1207 else \ | 1222 if (! discard) |
1208 error ("fscanf: conversion failed"); \ | 1223 retval = (double) (*valptr); |
1209 } \ | 1224 } |
1210 while (0) | 1225 else |
1211 | 1226 error ("fscanf: conversion failed"); |
1212 #define do_oscanf_str_conv(is, fmt, sptr, maxlen) \ | 1227 |
1213 do \ | 1228 return retval; |
1214 { \ | 1229 } |
1215 streambuf *isb = is.rdbuf (); \ | 1230 |
1216 \ | 1231 template octave_value |
1217 if (isb->scan (fmt, sptr) > 0) \ | 1232 do_oscanf_num_conv (istream&, const char*, int*, bool); |
1218 { \ | 1233 |
1219 if (! discard && is) \ | 1234 template octave_value |
1220 { \ | 1235 do_oscanf_num_conv (istream&, const char*, float*, bool); |
1221 sptr[maxlen] = '\0'; \ | 1236 |
1222 retval = sptr; \ | 1237 template octave_value |
1223 } \ | 1238 do_oscanf_num_conv (istream&, const char*, double*, bool); |
1224 } \ | 1239 |
1225 else \ | 1240 static inline octave_value |
1226 error ("fscanf: conversion failed"); \ | 1241 do_oscanf_str_conv (istream& is, const char *fmt, char *sptr, |
1227 } \ | 1242 int maxlen, bool discard) |
1228 while (0) | 1243 { |
1244 octave_value retval; | |
1245 | |
1246 is.scan (fmt, sptr); | |
1247 | |
1248 if (is) | |
1249 { | |
1250 if (! discard) | |
1251 { | |
1252 sptr[maxlen] = '\0'; | |
1253 retval = sptr; | |
1254 } | |
1255 } | |
1256 else | |
1257 error ("fscanf: conversion failed"); | |
1258 | |
1259 return retval; | |
1260 } | |
1229 | 1261 |
1230 octave_value | 1262 octave_value |
1231 octave_base_stream::do_oscanf (const scanf_format_elt *elt) | 1263 octave_base_stream::do_oscanf (const scanf_format_elt *elt) |
1232 { | 1264 { |
1233 octave_value retval = Matrix (); | 1265 octave_value retval; |
1234 | 1266 |
1235 istream *isp = input_stream (); | 1267 istream *isp = input_stream (); |
1236 | 1268 |
1237 if (isp) | 1269 if (isp) |
1238 { | 1270 { |
1258 | 1290 |
1259 case 'd': case 'i': case 'o': case 'u': case 'x': | 1291 case 'd': case 'i': case 'o': case 'u': case 'x': |
1260 { | 1292 { |
1261 int tmp; | 1293 int tmp; |
1262 | 1294 |
1263 do_oscanf_num_conv (is, fmt, &tmp); | 1295 retval = do_oscanf_num_conv (is, fmt, &tmp, discard); |
1264 } | 1296 } |
1265 break; | 1297 break; |
1266 | 1298 |
1267 case 'e': case 'f': case 'g': | 1299 case 'e': case 'f': case 'g': |
1268 { | 1300 { |
1269 if (elt->modifier == 'l') | 1301 if (elt->modifier == 'l') |
1270 { | 1302 { |
1271 double tmp; | 1303 double tmp; |
1272 | 1304 |
1273 do_oscanf_num_conv (is, fmt, &tmp); | 1305 retval = do_oscanf_num_conv (is, fmt, &tmp, discard); |
1274 } | 1306 } |
1275 else | 1307 else |
1276 { | 1308 { |
1277 float tmp; | 1309 float tmp; |
1278 | 1310 |
1279 do_oscanf_num_conv (is, fmt, &tmp); | 1311 retval = do_oscanf_num_conv (is, fmt, &tmp, discard); |
1280 } | 1312 } |
1281 } | 1313 } |
1282 break; | 1314 break; |
1283 | 1315 |
1284 case 'c': | 1316 case 'c': |
1287 | 1319 |
1288 int width = elt->width ? elt->width : 1; | 1320 int width = elt->width ? elt->width : 1; |
1289 | 1321 |
1290 char *tmp = new char[width + 1]; | 1322 char *tmp = new char[width + 1]; |
1291 | 1323 |
1292 do_oscanf_str_conv (is, fmt, tmp, width); | 1324 retval = do_oscanf_str_conv (is, fmt, tmp, width, discard); |
1293 | 1325 |
1294 is.setf (flags); | 1326 is.setf (flags); |
1295 | 1327 |
1296 delete [] tmp; | 1328 delete [] tmp; |
1297 } | 1329 } |
1301 { | 1333 { |
1302 // XXX FIXME XXX -- this must be fixed! | 1334 // XXX FIXME XXX -- this must be fixed! |
1303 | 1335 |
1304 int width = elt->width ? elt->width : 65535; | 1336 int width = elt->width ? elt->width : 65535; |
1305 char *tmp = new char [width+1]; | 1337 char *tmp = new char [width+1]; |
1306 do_oscanf_str_conv (is, fmt, tmp, width); | 1338 |
1339 retval = do_oscanf_str_conv (is, fmt, tmp, width, discard); | |
1340 | |
1307 delete [] tmp; | 1341 delete [] tmp; |
1308 } | 1342 } |
1309 break; | 1343 break; |
1310 | 1344 |
1311 case 'p': case '[': | 1345 case 'p': case '[': |
1400 | 1434 |
1401 retval.resize (nconv, Matrix ()); | 1435 retval.resize (nconv, Matrix ()); |
1402 | 1436 |
1403 const scanf_format_elt *elt = fmt_list.first (); | 1437 const scanf_format_elt *elt = fmt_list.first (); |
1404 | 1438 |
1439 int num_values = 0; | |
1440 | |
1405 for (int i = 0; i < nconv; i++) | 1441 for (int i = 0; i < nconv; i++) |
1406 { | 1442 { |
1407 retval (i) = do_oscanf (elt); | 1443 octave_value tmp = do_oscanf (elt); |
1444 | |
1445 if (tmp.is_defined ()) | |
1446 retval (num_values++) = tmp; | |
1408 | 1447 |
1409 if (! ok ()) | 1448 if (! ok ()) |
1410 break; | 1449 break; |
1411 | 1450 |
1412 elt = fmt_list.next (); | 1451 elt = fmt_list.next (); |
1413 } | 1452 } |
1453 | |
1454 retval.resize (num_values); | |
1414 | 1455 |
1415 // Pick up any trailing stuff. | 1456 // Pick up any trailing stuff. |
1416 if (ok () && len > nconv) | 1457 if (ok () && len > nconv) |
1417 do_oscanf (elt); | 1458 do_oscanf (elt); |
1418 } | 1459 } |
1640 return retval; | 1681 return retval; |
1641 } | 1682 } |
1642 | 1683 |
1643 // Ugh again and again. | 1684 // Ugh again and again. |
1644 | 1685 |
1645 #define do_printf_conv(os, fmt, nsa, sa_1, sa_2, have_arg, arg) \ | 1686 template <class T> |
1646 do \ | 1687 void |
1647 { \ | 1688 do_printf_conv (ostream& os, const char *fmt, int nsa, int sa_1, |
1648 switch (nsa) \ | 1689 int sa_2, bool have_arg, T arg) |
1649 { \ | 1690 { |
1650 case 2: \ | 1691 switch (nsa) |
1651 if (have_arg) \ | 1692 { |
1652 os.form (fmt, sa_1, sa_2, arg); \ | 1693 case 2: |
1653 else \ | 1694 if (have_arg) |
1654 os.form (fmt, sa_1, sa_2); \ | 1695 os.form (fmt, sa_1, sa_2, arg); |
1655 break; \ | 1696 else |
1656 \ | 1697 os.form (fmt, sa_1, sa_2); |
1657 case 1: \ | 1698 break; |
1658 if (have_arg) \ | 1699 |
1659 os.form (fmt, sa_1, arg); \ | 1700 case 1: |
1660 else \ | 1701 if (have_arg) |
1661 os.form (fmt, sa_1); \ | 1702 os.form (fmt, sa_1, arg); |
1662 break; \ | 1703 else |
1663 \ | 1704 os.form (fmt, sa_1); |
1664 case 0: \ | 1705 break; |
1665 if (have_arg) \ | 1706 |
1666 os.form (fmt, arg); \ | 1707 case 0: |
1667 else \ | 1708 if (have_arg) |
1668 os.form (fmt); \ | 1709 os.form (fmt, arg); |
1669 break; \ | 1710 else |
1670 \ | 1711 os.form (fmt); |
1671 default: \ | 1712 break; |
1672 ::error ("fprintf: internal error handling format"); \ | 1713 |
1673 break; \ | 1714 default: |
1674 } \ | 1715 ::error ("fprintf: internal error handling format"); |
1675 } \ | 1716 break; |
1676 while (0) | 1717 } |
1718 } | |
1719 | |
1720 template void | |
1721 do_printf_conv (ostream&, const char*, int, int, int, bool, int); | |
1722 | |
1723 template void | |
1724 do_printf_conv (ostream&, const char*, int, int, int, bool, long); | |
1725 | |
1726 template void | |
1727 do_printf_conv (ostream&, const char*, int, int, int, bool, double); | |
1728 | |
1729 template void | |
1730 do_printf_conv (ostream&, const char*, int, int, int, bool, const char*); | |
1677 | 1731 |
1678 int | 1732 int |
1679 octave_base_stream::do_printf (printf_format_list& fmt_list, | 1733 octave_base_stream::do_printf (printf_format_list& fmt_list, |
1680 const octave_value_list& args) | 1734 const octave_value_list& args) |
1681 { | 1735 { |
1725 } | 1779 } |
1726 | 1780 |
1727 const char *fmt = elt->text; | 1781 const char *fmt = elt->text; |
1728 | 1782 |
1729 if (doing_percent || args == 0) | 1783 if (doing_percent || args == 0) |
1730 do_printf_conv (os, fmt, nsa, sa_1, sa_2, 0, 0.0); | 1784 do_printf_conv (os, fmt, nsa, sa_1, sa_2, false, 0.0); |
1731 else | 1785 else |
1732 { | 1786 { |
1733 if (elt->type == 's' && val_cache.looking_at_string ()) | 1787 if (elt->type == 's' && val_cache.looking_at_string ()) |
1734 { | 1788 { |
1735 string val = val_cache.string_value (); | 1789 string val = val_cache.string_value (); |
1736 | 1790 |
1737 if (val_cache) | 1791 if (val_cache) |
1738 do_printf_conv (os, fmt, nsa, sa_1, sa_2, 1, | 1792 do_printf_conv (os, fmt, nsa, sa_1, sa_2, true, |
1739 val.c_str ()); | 1793 val.c_str ()); |
1740 else | 1794 else |
1741 break; | 1795 break; |
1742 } | 1796 } |
1743 else | 1797 else |
1751 case 'd': case 'i': case 'o': case 'x': | 1805 case 'd': case 'i': case 'o': case 'x': |
1752 case 'X': case 'u': case 'c': | 1806 case 'X': case 'u': case 'c': |
1753 { | 1807 { |
1754 if (elt->modifier == 'l') | 1808 if (elt->modifier == 'l') |
1755 do_printf_conv (os, fmt, nsa, sa_1, | 1809 do_printf_conv (os, fmt, nsa, sa_1, |
1756 sa_2, 1, (long) val); | 1810 sa_2, true, (long) val); |
1757 else | 1811 else |
1758 do_printf_conv (os, fmt, nsa, sa_1, | 1812 do_printf_conv (os, fmt, nsa, sa_1, |
1759 sa_2, 1, (int) val); | 1813 sa_2, true, (int) val); |
1760 } | 1814 } |
1761 break; | 1815 break; |
1762 | 1816 |
1763 case 'f': case 'e': case 'E': | 1817 case 'f': case 'e': case 'E': |
1764 case 'g': case 'G': | 1818 case 'g': case 'G': |
1765 do_printf_conv (os, fmt, nsa, sa_1, | 1819 do_printf_conv (os, fmt, nsa, sa_1, |
1766 sa_2, 1, val); | 1820 sa_2, true, val); |
1767 break; | 1821 break; |
1768 | 1822 |
1769 default: | 1823 default: |
1770 error ("fprintf: invalid format specifier"); | 1824 error ("fprintf: invalid format specifier"); |
1771 return -1; | 1825 return -1; |