aboutsummaryrefslogtreecommitdiff
path: root/pkg/tbtables/tbznll.x
blob: 2f45b88db965e0f785367185ff1b81d06b583b70 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
include "tbtables.h"
include "tblerr.h"

# tbznll -- set rows to null
# This procedure sets all columns in a range of rows to INDEF.
# If the first row to be deleted is greater than the last row, or if
# the range of rows is outside the allocated size of the table, nothing
# is done.  It is not considered an error if the first row is less than
# one or the last row is greater than the number of allocated rows in
# the table.
#
# Phil Hodge,  3-Feb-1992  Subroutine created.

procedure tbznll (tp, firstrow, lastrow)

pointer tp			# i: pointer to table descriptor
int	firstrow		# i: first row to be set to INDEF
int	lastrow			# i: last row to be set to INDEF
#--
pointer cp			# pointer to a column descriptor
int	row1, row2		# firstrow, lastrow truncated to 1, nrows
int	row			# loop index for row number
int	col			# loop index for column number
int	datatype		# data type of a column
int	lenstr			# length of a string table element
int	ip			# offset to a string in Memc
pointer tbcnum()

begin
	row1 = max (1, firstrow)
	row2 = min (TB_ALLROWS(tp), lastrow)

	# Set each column value in each row to INDEF.
	do col = 1, TB_NCOLS(tp) {
	    cp = tbcnum (tp, col)
	    datatype = COL_DTYPE(cp)

	    if (datatype == TBL_TY_DOUBLE) {
		do row = row1, row2
		    Memd[COL_OFFSET(cp) + row - 1] = INDEFD

	    } else if (datatype == TBL_TY_INT) {
		do row = row1, row2
		    Memi[COL_OFFSET(cp) + row - 1] = INDEFI

	    } else if (datatype < 0) {
		do row = row1, row2 {
		    lenstr = -COL_DTYPE(cp)		# not including EOS
		    ip = (row - 1) * (lenstr + 1)	# including EOS
		    Memc[COL_OFFSET(cp) + ip] = EOS
		}
	    } else {
		call error (ER_TBCOLBADTYP, "tbznll:  bad datatype")
	    }
	}
end