comparison src/load-save.cc @ 1226:2457d4ba0691

[project @ 1995-04-10 00:41:14 by jwe]
author jwe
date Mon, 10 Apr 1995 00:41:32 +0000
parents b6360f2d4fa6
children d607adf5af66
comparison
equal deleted inserted replaced
1225:b013cff15746 1226:2457d4ba0691
37 #include "tree-expr.h" 37 #include "tree-expr.h"
38 #include "tree-const.h" 38 #include "tree-const.h"
39 #include "user-prefs.h" 39 #include "user-prefs.h"
40 #include "unwind-prot.h" 40 #include "unwind-prot.h"
41 #include "load-save.h" 41 #include "load-save.h"
42 #include "sysdep.h"
42 #include "symtab.h" 43 #include "symtab.h"
43 #include "pager.h" 44 #include "pager.h"
44 #include "error.h" 45 #include "error.h"
45 #include "gripes.h" 46 #include "gripes.h"
46 #include "defun.h" 47 #include "defun.h"
84 { 85 {
85 LS_ASCII, 86 LS_ASCII,
86 LS_BINARY, 87 LS_BINARY,
87 LS_MAT_BINARY, 88 LS_MAT_BINARY,
88 LS_UNKNOWN, 89 LS_UNKNOWN,
89 };
90
91 enum floating_point_format
92 {
93 LS_IEEE_LITTLE,
94 LS_IEEE_BIG,
95 LS_VAX_D,
96 LS_VAX_G,
97 LS_CRAY,
98 LS_UNKNOWN_FLT_FMT,
99 }; 90 };
100 91
101 // Not all of the following are currently used. 92 // Not all of the following are currently used.
102 93
103 enum save_type 94 enum save_type
109 LS_SHORT, 100 LS_SHORT,
110 LS_INT, 101 LS_INT,
111 LS_FLOAT, 102 LS_FLOAT,
112 LS_DOUBLE, 103 LS_DOUBLE,
113 }; 104 };
114
115 #if defined (IEEE_LITTLE_ENDIAN)
116 #define NATIVE_FLOAT_FORMAT LS_IEEE_LITTLE
117 #elif defined (IEEE_BIG_ENDIAN)
118 #define NATIVE_FLOAT_FORMAT LS_IEEE_BIG
119 #elif defined (VAX_D_FLOAT)
120 #define NATIVE_FLOAT_FORMAT LS_VAX_D
121 #elif defined (VAX_G_FLOAT)
122 #define NATIVE_FLOAT_FORMAT LS_VAX_G
123 #else
124 LOSE! LOSE!
125 #endif
126 105
127 #define swap_1_bytes(x,y) 106 #define swap_1_bytes(x,y)
128 107
129 #define LS_DO_READ(TYPE,swap,data,size,len,stream) \ 108 #define LS_DO_READ(TYPE,swap,data,size,len,stream) \
130 do \ 109 do \
228 207
229 // XXX FIXME XXX -- assumes sizeof (Complex) == 8 208 // XXX FIXME XXX -- assumes sizeof (Complex) == 8
230 // XXX FIXME XXX -- assumes sizeof (double) == 8 209 // XXX FIXME XXX -- assumes sizeof (double) == 8
231 // XXX FIXME XXX -- assumes sizeof (float) == 4 210 // XXX FIXME XXX -- assumes sizeof (float) == 4
232 211
233 #if defined (IEEE_LITTLE_ENDIAN)
234
235 static void 212 static void
236 IEEE_big_double_to_IEEE_little_double (double *d, int len) 213 IEEE_big_double_to_IEEE_little_double (double *d, int len)
237 { 214 {
238 swap_8_bytes ((char *) d, len); 215 swap_8_bytes ((char *) d, len);
239 } 216 }
278 Cray_to_IEEE_little_float (float *d, int len) 255 Cray_to_IEEE_little_float (float *d, int len)
279 { 256 {
280 gripe_data_conversion ("Cray", "IEEE little endian format"); 257 gripe_data_conversion ("Cray", "IEEE little endian format");
281 } 258 }
282 259
283 #elif defined (IEEE_BIG_ENDIAN)
284
285 static void 260 static void
286 IEEE_little_double_to_IEEE_big_double (double *d, int len) 261 IEEE_little_double_to_IEEE_big_double (double *d, int len)
287 { 262 {
288 swap_8_bytes ((char *) d, len); 263 swap_8_bytes ((char *) d, len);
289 } 264 }
328 Cray_to_IEEE_big_float (float *d, int len) 303 Cray_to_IEEE_big_float (float *d, int len)
329 { 304 {
330 gripe_data_conversion ("Cray", "IEEE big endian format"); 305 gripe_data_conversion ("Cray", "IEEE big endian format");
331 } 306 }
332 307
333 #elif defined (VAX_D_FLOAT)
334
335 static void 308 static void
336 IEEE_little_double_to_VAX_D_double (double *d, int len) 309 IEEE_little_double_to_VAX_D_double (double *d, int len)
337 { 310 {
338 gripe_data_conversion ("IEEE little endian", "VAX D"); 311 gripe_data_conversion ("IEEE little endian", "VAX D");
339 } 312 }
378 Cray_to_VAX_D_float (float *d, int len) 351 Cray_to_VAX_D_float (float *d, int len)
379 { 352 {
380 gripe_data_conversion ("Cray", "VAX D"); 353 gripe_data_conversion ("Cray", "VAX D");
381 } 354 }
382 355
383 #elif defined (VAX_G_FLOAT)
384
385 static void 356 static void
386 IEEE_little_double_to_VAX_G_double (double *d, int len) 357 IEEE_little_double_to_VAX_G_double (double *d, int len)
387 { 358 {
388 gripe_data_conversion ("IEEE little endian", "VAX G"); 359 gripe_data_conversion ("IEEE little endian", "VAX G");
389 } 360 }
427 static void 398 static void
428 Cray_to_VAX_G_float (float *d, int len) 399 Cray_to_VAX_G_float (float *d, int len)
429 { 400 {
430 gripe_data_conversion ("VAX G float", "VAX G"); 401 gripe_data_conversion ("VAX G float", "VAX G");
431 } 402 }
432
433 #endif
434 403
435 static void 404 static void
436 do_double_format_conversion (double *data, int len, 405 do_double_format_conversion (double *data, int len,
437 floating_point_format fmt) 406 floating_point_format fmt)
438 { 407 {
439 switch (fmt) 408 switch (native_float_format)
440 { 409 {
441 #if defined (IEEE_LITTLE_ENDIAN) 410 case OCTAVE_IEEE_LITTLE:
442 411 switch (fmt)
443 case LS_IEEE_LITTLE: 412 {
444 break; 413 case OCTAVE_IEEE_LITTLE:
445 414 break;
446 case LS_IEEE_BIG: 415
447 IEEE_big_double_to_IEEE_little_double (data, len); 416 case OCTAVE_IEEE_BIG:
448 break; 417 IEEE_big_double_to_IEEE_little_double (data, len);
449 418 break;
450 case LS_VAX_D: 419
451 VAX_D_double_to_IEEE_little_double (data, len); 420 case OCTAVE_VAX_D:
452 break; 421 VAX_D_double_to_IEEE_little_double (data, len);
453 422 break;
454 case LS_VAX_G: 423
455 VAX_G_double_to_IEEE_little_double (data, len); 424 case OCTAVE_VAX_G:
456 break; 425 VAX_G_double_to_IEEE_little_double (data, len);
457 426 break;
458 case LS_CRAY: 427
459 Cray_to_IEEE_little_double (data, len); 428 case OCTAVE_CRAY:
460 break; 429 Cray_to_IEEE_little_double (data, len);
461 430 break;
462 #elif defined (IEEE_BIG_ENDIAN) 431
463 432 default:
464 case LS_IEEE_LITTLE: 433 gripe_unrecognized_float_fmt ();
465 IEEE_little_double_to_IEEE_big_double (data, len); 434 break;
466 break; 435 }
467 436
468 case LS_IEEE_BIG: 437 case OCTAVE_IEEE_BIG:
469 break; 438 switch (fmt)
470 439 {
471 case LS_VAX_D: 440 case OCTAVE_IEEE_LITTLE:
472 VAX_D_double_to_IEEE_big_double (data, len); 441 IEEE_little_double_to_IEEE_big_double (data, len);
473 break; 442 break;
474 443
475 case LS_VAX_G: 444 case OCTAVE_IEEE_BIG:
476 VAX_G_double_to_IEEE_big_double (data, len); 445 break;
477 break; 446
478 447 case OCTAVE_VAX_D:
479 case LS_CRAY: 448 VAX_D_double_to_IEEE_big_double (data, len);
480 Cray_to_IEEE_big_double (data, len); 449 break;
481 break; 450
482 451 case OCTAVE_VAX_G:
483 #elif defined (VAX_D_FLOAT) 452 VAX_G_double_to_IEEE_big_double (data, len);
484 453 break;
485 case LS_IEEE_LITTLE: 454
486 IEEE_little_double_to_VAX_D_double (data, len); 455 case OCTAVE_CRAY:
487 break; 456 Cray_to_IEEE_big_double (data, len);
488 457 break;
489 case LS_IEEE_BIG: 458
490 IEEE_big_double_to_VAX_D_double (data, len); 459 default:
491 break; 460 gripe_unrecognized_float_fmt ();
492 461 break;
493 case LS_VAX_D: 462 }
494 break; 463
495 464 case OCTAVE_VAX_D:
496 case LS_VAX_G: 465 switch (fmt)
497 VAX_G_double_to_VAX_D_double (data, len); 466 {
498 break; 467 case OCTAVE_IEEE_LITTLE:
499 468 IEEE_little_double_to_VAX_D_double (data, len);
500 case LS_CRAY: 469 break;
501 Cray_to_VAX_D_double (data, len); 470
502 break; 471 case OCTAVE_IEEE_BIG:
503 472 IEEE_big_double_to_VAX_D_double (data, len);
504 #elif defined (VAX_G_FLOAT) 473 break;
505 474
506 case LS_IEEE_LITTLE: 475 case OCTAVE_VAX_D:
507 IEEE_little_double_to_VAX_G_double (data, len); 476 break;
508 break; 477
509 478 case OCTAVE_VAX_G:
510 case LS_IEEE_BIG: 479 VAX_G_double_to_VAX_D_double (data, len);
511 IEEE_big_double_to_VAX_G_double (data, len); 480 break;
512 break; 481
513 482 case OCTAVE_CRAY:
514 case LS_VAX_D: 483 Cray_to_VAX_D_double (data, len);
515 VAX_D_double_to_VAX_G_double (data, len); 484 break;
516 break; 485
517 486 default:
518 case LS_VAX_G: 487 gripe_unrecognized_float_fmt ();
519 break; 488 break;
520 489 }
521 case LS_CRAY: 490
522 Cray_to_VAX_G_double (data, len); 491 case OCTAVE_VAX_G:
523 break; 492 switch (fmt)
524 493 {
525 #else 494 case OCTAVE_IEEE_LITTLE:
526 LOSE! LOSE! 495 IEEE_little_double_to_VAX_G_double (data, len);
527 #endif 496 break;
497
498 case OCTAVE_IEEE_BIG:
499 IEEE_big_double_to_VAX_G_double (data, len);
500 break;
501
502 case OCTAVE_VAX_D:
503 VAX_D_double_to_VAX_G_double (data, len);
504 break;
505
506 case OCTAVE_VAX_G:
507 break;
508
509 case OCTAVE_CRAY:
510 Cray_to_VAX_G_double (data, len);
511 break;
512
513 default:
514 gripe_unrecognized_float_fmt ();
515 break;
516 }
528 517
529 default: 518 default:
530 gripe_unrecognized_float_fmt (); 519 panic_impossible ();
531 break;
532 } 520 }
533 } 521 }
534 522
535 static void 523 static void
536 do_float_format_conversion (float *data, int len, 524 do_float_format_conversion (float *data, int len,
537 floating_point_format fmt) 525 floating_point_format fmt)
538 { 526 {
539 switch (fmt) 527 switch (native_float_format)
540 { 528 {
541 #if defined (IEEE_LITTLE_ENDIAN) 529 case OCTAVE_IEEE_LITTLE:
542 530 switch (fmt)
543 case LS_IEEE_LITTLE: 531 {
544 break; 532 case OCTAVE_IEEE_LITTLE:
545 533 break;
546 case LS_IEEE_BIG: 534
547 IEEE_big_float_to_IEEE_little_float (data, len); 535 case OCTAVE_IEEE_BIG:
548 break; 536 IEEE_big_float_to_IEEE_little_float (data, len);
549 537 break;
550 case LS_VAX_D: 538
551 VAX_D_float_to_IEEE_little_float (data, len); 539 case OCTAVE_VAX_D:
552 break; 540 VAX_D_float_to_IEEE_little_float (data, len);
553 541 break;
554 case LS_VAX_G: 542
555 VAX_G_float_to_IEEE_little_float (data, len); 543 case OCTAVE_VAX_G:
556 break; 544 VAX_G_float_to_IEEE_little_float (data, len);
557 545 break;
558 case LS_CRAY: 546
559 Cray_to_IEEE_little_float (data, len); 547 case OCTAVE_CRAY:
560 break; 548 Cray_to_IEEE_little_float (data, len);
561 549 break;
562 #elif defined (IEEE_BIG_ENDIAN) 550
563 551 default:
564 case LS_IEEE_LITTLE: 552 gripe_unrecognized_float_fmt ();
565 IEEE_little_float_to_IEEE_big_float (data, len); 553 break;
566 break; 554 }
567 555
568 case LS_IEEE_BIG: 556 case OCTAVE_IEEE_BIG:
569 break; 557 switch (fmt)
570 558 {
571 case LS_VAX_D: 559 case OCTAVE_IEEE_LITTLE:
572 VAX_D_float_to_IEEE_big_float (data, len); 560 IEEE_little_float_to_IEEE_big_float (data, len);
573 break; 561 break;
574 562
575 case LS_VAX_G: 563 case OCTAVE_IEEE_BIG:
576 VAX_G_float_to_IEEE_big_float (data, len); 564 break;
577 break; 565
578 566 case OCTAVE_VAX_D:
579 case LS_CRAY: 567 VAX_D_float_to_IEEE_big_float (data, len);
580 Cray_to_IEEE_big_float (data, len); 568 break;
581 break; 569
582 570 case OCTAVE_VAX_G:
583 #elif defined (VAX_D_FLOAT) 571 VAX_G_float_to_IEEE_big_float (data, len);
584 572 break;
585 case LS_IEEE_LITTLE: 573
586 IEEE_little_float_to_VAX_D_float (data, len); 574 case OCTAVE_CRAY:
587 break; 575 Cray_to_IEEE_big_float (data, len);
588 576 break;
589 case LS_IEEE_BIG: 577
590 IEEE_big_float_to_VAX_D_float (data, len); 578 default:
591 break; 579 gripe_unrecognized_float_fmt ();
592 580 break;
593 case LS_VAX_D: 581 }
594 break; 582
595 583 case OCTAVE_VAX_D:
596 case LS_VAX_G: 584 switch (fmt)
597 VAX_G_float_to_VAX_D_float (data, len); 585 {
598 break; 586 case OCTAVE_IEEE_LITTLE:
599 587 IEEE_little_float_to_VAX_D_float (data, len);
600 case LS_CRAY: 588 break;
601 Cray_to_VAX_D_float (data, len); 589
602 break; 590 case OCTAVE_IEEE_BIG:
603 591 IEEE_big_float_to_VAX_D_float (data, len);
604 #elif defined (VAX_G_FLOAT) 592 break;
605 593
606 case LS_IEEE_LITTLE: 594 case OCTAVE_VAX_D:
607 IEEE_little_float_to_VAX_G_float (data, len); 595 break;
608 break; 596
609 597 case OCTAVE_VAX_G:
610 case LS_IEEE_BIG: 598 VAX_G_float_to_VAX_D_float (data, len);
611 IEEE_big_float_to_VAX_G_float (data, len); 599 break;
612 break; 600
613 601 case OCTAVE_CRAY:
614 case LS_VAX_D: 602 Cray_to_VAX_D_float (data, len);
615 VAX_D_float_to_VAX_G_float (data, len); 603 break;
616 break; 604
617 605 default:
618 case LS_VAX_G: 606 gripe_unrecognized_float_fmt ();
619 break; 607 break;
620 608 }
621 case LS_CRAY: 609
622 Cray_to_VAX_G_float (data, len); 610 case OCTAVE_VAX_G:
623 break; 611 switch (fmt)
624 612 {
625 #else 613 case OCTAVE_IEEE_LITTLE:
626 LOSE! LOSE! 614 IEEE_little_float_to_VAX_G_float (data, len);
627 #endif 615 break;
616
617 case OCTAVE_IEEE_BIG:
618 IEEE_big_float_to_VAX_G_float (data, len);
619 break;
620
621 case OCTAVE_VAX_D:
622 VAX_D_float_to_VAX_G_float (data, len);
623 break;
624
625 case OCTAVE_VAX_G:
626 break;
627
628 case OCTAVE_CRAY:
629 Cray_to_VAX_G_float (data, len);
630 break;
631
632 default:
633 gripe_unrecognized_float_fmt ();
634 break;
635 }
628 636
629 default: 637 default:
630 gripe_unrecognized_float_fmt (); 638 panic_impossible ();
631 break;
632 } 639 }
633 } 640 }
634 641
635 static void 642 static void
636 read_doubles (istream& is, double *data, save_type type, int len, 643 read_doubles (istream& is, double *data, save_type type, int len,
1715 // possible errors. 1722 // possible errors.
1716 1723
1717 static floating_point_format 1724 static floating_point_format
1718 get_floating_point_format (int mach) 1725 get_floating_point_format (int mach)
1719 { 1726 {
1720 floating_point_format flt_fmt = LS_UNKNOWN_FLT_FMT; 1727 floating_point_format flt_fmt = OCTAVE_UNKNOWN_FLT_FMT;
1721 1728
1722 switch (mach) 1729 switch (mach)
1723 { 1730 {
1724 case 0: 1731 case 0:
1725 flt_fmt = LS_IEEE_LITTLE; 1732 flt_fmt = OCTAVE_IEEE_LITTLE;
1726 break; 1733 break;
1727 1734
1728 case 1: 1735 case 1:
1729 flt_fmt = LS_IEEE_BIG; 1736 flt_fmt = OCTAVE_IEEE_BIG;
1730 break; 1737 break;
1731 1738
1732 case 2: 1739 case 2:
1733 flt_fmt = LS_VAX_D; 1740 flt_fmt = OCTAVE_VAX_D;
1734 break; 1741 break;
1735 1742
1736 case 3: 1743 case 3:
1737 flt_fmt = LS_VAX_G; 1744 flt_fmt = OCTAVE_VAX_G;
1738 break; 1745 break;
1739 1746
1740 case 4: 1747 case 4:
1741 flt_fmt = LS_CRAY; 1748 flt_fmt = OCTAVE_CRAY;
1742 break; 1749 break;
1743 1750
1744 default: 1751 default:
1745 flt_fmt = LS_UNKNOWN_FLT_FMT; 1752 flt_fmt = OCTAVE_UNKNOWN_FLT_FMT;
1746 break; 1753 break;
1747 } 1754 }
1748 1755
1749 return flt_fmt; 1756 return flt_fmt;
1750 } 1757 }
1766 // These are initialized here instead of closer to where they are 1773 // These are initialized here instead of closer to where they are
1767 // first used to avoid errors from gcc about goto crossing 1774 // first used to avoid errors from gcc about goto crossing
1768 // initialization of variable. 1775 // initialization of variable.
1769 1776
1770 Matrix re; 1777 Matrix re;
1771 floating_point_format flt_fmt = LS_UNKNOWN_FLT_FMT; 1778 floating_point_format flt_fmt = OCTAVE_UNKNOWN_FLT_FMT;
1772 char *name = 0; 1779 char *name = 0;
1773 int swap = 0, type = 0, prec = 0, mach = 0, dlen = 0; 1780 int swap = 0, type = 0, prec = 0, mach = 0, dlen = 0;
1774 1781
1775 FOUR_BYTE_INT mopt, nr, nc, imag, len; 1782 FOUR_BYTE_INT mopt, nr, nc, imag, len;
1776 1783
1788 prec = mopt % 10; // double, float, int, etc. 1795 prec = mopt % 10; // double, float, int, etc.
1789 mopt /= 100; // Skip unused third digit too. 1796 mopt /= 100; // Skip unused third digit too.
1790 mach = mopt % 10; // IEEE, VAX, etc. 1797 mach = mopt % 10; // IEEE, VAX, etc.
1791 1798
1792 flt_fmt = get_floating_point_format (mach); 1799 flt_fmt = get_floating_point_format (mach);
1793 if (flt_fmt == LS_UNKNOWN_FLT_FMT) 1800 if (flt_fmt == OCTAVE_UNKNOWN_FLT_FMT)
1794 { 1801 {
1795 error ("load: unrecognized binary format!"); 1802 error ("load: unrecognized binary format!");
1796 return 0; 1803 return 0;
1797 } 1804 }
1798 1805
1908 1915
1909 char tmp = 0; 1916 char tmp = 0;
1910 is.read (&tmp, 1); 1917 is.read (&tmp, 1);
1911 1918
1912 flt_fmt = get_floating_point_format (tmp); 1919 flt_fmt = get_floating_point_format (tmp);
1913 if (flt_fmt == LS_UNKNOWN_FLT_FMT) 1920 if (flt_fmt == OCTAVE_UNKNOWN_FLT_FMT)
1914 { 1921 {
1915 if (! quiet) 1922 if (! quiet)
1916 error ("load: unrecognized binary format!"); 1923 error ("load: unrecognized binary format!");
1917 return -1; 1924 return -1;
1918 } 1925 }
1932 error ("load: couldn't open input file `%s'", orig_fname); 1939 error ("load: couldn't open input file `%s'", orig_fname);
1933 return retval; 1940 return retval;
1934 } 1941 }
1935 1942
1936 int swap; 1943 int swap;
1937 floating_point_format flt_fmt = LS_UNKNOWN_FLT_FMT; 1944 floating_point_format flt_fmt = OCTAVE_UNKNOWN_FLT_FMT;
1938 1945
1939 if (read_binary_file_header (file, swap, flt_fmt, 1) == 0) 1946 if (read_binary_file_header (file, swap, flt_fmt, 1) == 0)
1940 retval = LS_BINARY; 1947 retval = LS_BINARY;
1941 else 1948 else
1942 { 1949 {
2156 return retval; 2163 return retval;
2157 } 2164 }
2158 2165
2159 char *orig_fname = *argv; 2166 char *orig_fname = *argv;
2160 2167
2161 floating_point_format flt_fmt = LS_UNKNOWN_FLT_FMT; 2168 floating_point_format flt_fmt = OCTAVE_UNKNOWN_FLT_FMT;
2162 2169
2163 int swap = 0; 2170 int swap = 0;
2164 2171
2165 if (strcmp (*argv, "-") == 0) 2172 if (strcmp (*argv, "-") == 0)
2166 { 2173 {
2443 int fail = 0; 2450 int fail = 0;
2444 2451
2445 FOUR_BYTE_INT mopt = 0; 2452 FOUR_BYTE_INT mopt = 0;
2446 2453
2447 mopt += tc.is_string () ? 1 : 0; 2454 mopt += tc.is_string () ? 1 : 0;
2448 mopt += 1000 * get_floating_point_format (NATIVE_FLOAT_FORMAT); 2455 mopt += 1000 * get_floating_point_format (native_float_format);
2449 2456
2450 os.write (&mopt, 4); 2457 os.write (&mopt, 4);
2451 2458
2452 FOUR_BYTE_INT nr = tc.rows (); 2459 FOUR_BYTE_INT nr = tc.rows ();
2453 os.write (&nr, 4); 2460 os.write (&nr, 4);
2843 stream << "Octave-1-B"; 2850 stream << "Octave-1-B";
2844 #else 2851 #else
2845 stream << "Octave-1-L"; 2852 stream << "Octave-1-L";
2846 #endif 2853 #endif
2847 2854
2848 char tmp = (char) NATIVE_FLOAT_FORMAT; 2855 char tmp = (char) native_float_format;
2849 stream.write (&tmp, 1); 2856 stream.write (&tmp, 1);
2850 } 2857 }
2851 } 2858 }
2852 2859
2853 static void 2860 static void