aboutsummaryrefslogtreecommitdiff
path: root/pkg/tbtables/tbtrsi.x
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/tbtables/tbtrsi.x')
-rw-r--r--pkg/tbtables/tbtrsi.x74
1 files changed, 74 insertions, 0 deletions
diff --git a/pkg/tbtables/tbtrsi.x b/pkg/tbtables/tbtrsi.x
new file mode 100644
index 00000000..02a2651c
--- /dev/null
+++ b/pkg/tbtables/tbtrsi.x
@@ -0,0 +1,74 @@
+include <mach.h>
+include <tbset.h>
+include "tbtables.h"
+include "tblerr.h"
+
+define DEF_ALLROWS 100 # initial number of "rows" for text file
+
+# tbtrsi -- read size info
+# This procedure reads the size information record from a table and
+# saves the values in the table descriptor.
+#
+# Phil Hodge, 15-Oct-1987 Seek BOF instead of 1.
+# Phil Hodge, 10-Nov-1987 Check table type to see if it is valid.
+# Phil Hodge, 14-Jan-1992 Add option for text table type.
+# Phil Hodge, 5-Apr-1993 Also read version number.
+# Phil Hodge, 8-Jun-1995 Modify for FITS file.
+# Phil Hodge, 7-Jun-1999 For text tables, don't set TB_ALLROWS,
+# TB_MAXCOLS, TB_MAXPAR, or TB_NPAR.
+# Phil Hodge, 22-Oct-2004 Check for byte-swapped size information record,
+# in order to give a more informative error message.
+
+procedure tbtrsi (tp)
+
+pointer tp # Pointer to table descriptor
+#--
+int sizinfo[LEN_SIZINFO] # Size information record
+long tbtbod()
+int read()
+errchk seek, read, tbfrsi
+
+begin
+ if (TB_TYPE(tp) == TBL_TYPE_TEXT) {
+ TB_BOD(tp) = 0
+ return
+ }
+
+ if (TB_TYPE(tp) == TBL_TYPE_FITS) {
+ # Get number of rows and column in FITS table.
+ call tbfrsi (tp)
+ return
+ }
+
+ call seek (TB_FILE(tp), BOF)
+ if (read (TB_FILE(tp), sizinfo, SZ_SIZINFO) == EOF)
+ call error (ER_TBFILEMPTY, "table data file is empty")
+ if (SZ_INT != SZ_INT32)
+ call iupk32 (sizinfo, sizinfo, SZ_SIZINFO)
+
+ TB_TYPE(tp) = S_TYPE(sizinfo)
+ if ((TB_TYPE(tp) != TBL_TYPE_S_ROW) &&
+ (TB_TYPE(tp) != TBL_TYPE_S_COL)) {
+ # Check whether sizinfo is just byte swapped.
+ call bswap4 (sizinfo, 1, sizinfo, 1, SZ_SIZINFO*SZB_CHAR)
+ if ((S_TYPE(sizinfo) == TBL_TYPE_S_ROW) ||
+ (S_TYPE(sizinfo) == TBL_TYPE_S_COL)) {
+ call error (ER_BYTESWAPPED,
+ "can't open table, it appears to be byte-swapped")
+ } else {
+ call error (ER_TBCORRUPTED, "unknown table type")
+ }
+ }
+
+ TB_NPAR(tp) = S_NPAR(sizinfo)
+ TB_MAXPAR(tp) = S_MAXPAR(sizinfo)
+ TB_NROWS(tp) = S_NROWS(sizinfo)
+ TB_ALLROWS(tp) = S_ALLROWS(sizinfo)
+ TB_NCOLS(tp) = S_NCOLS(sizinfo)
+ TB_MAXCOLS(tp) = S_MAXCOLS(sizinfo)
+ TB_COLUSED(tp) = S_COLUSED(sizinfo)
+ TB_ROWLEN(tp) = S_ROWLEN(sizinfo)
+ TB_VERSION(tp) = S_VERSION(sizinfo)
+
+ TB_BOD(tp) = tbtbod (TB_MAXPAR(tp), TB_MAXCOLS(tp))
+end