aboutsummaryrefslogtreecommitdiff
path: root/sys/symtab/stopen.x
blob: ede4f7278dbfbd0d4ce84d2a6ca09956b93fc589 (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
57
58
59
60
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.

include	"symtab.h"

# STOPEN -- Create and initialize a new symbol table.  The size of the table
# and the size of the hash index are user defined.  Any number of symbol
# tables may be open simultaneously.  LEN_SYMBTAB is the initial length of
# the symbol table in struct units.  LEN_INDEX is the number of hash threads;
# a good choice for this value is twice the expected number of symbols in the
# table, but good performance can be expected even if the number of symbols
# is several times the size of the index.  The index consumes SZ_INT chars per
# index element.

pointer	procedure stopen (name, len_index, len_stab, sz_sbuf)

char	name[ARB]		# symbol table name (optional)
int	len_index		# number of hash threads in index
int	len_stab		# initial length of STAB
int	sz_sbuf			# initial size of string buffer

pointer	stp
int	stpstr()

begin
	# Allocate symtab descriptor.
	call calloc (stp, LEN_SYMTAB, TY_STRUCT)
	ST_MAGIC(stp) = MAGIC

	# Allocate index.
	call calloc (ST_INDEX(stp), len_index, TY_INT)
	ST_INDEXLEN(stp) = len_index

	# Allocate string buffer.  The first char of storage, at offset 0,
	# is set to EOS so that offset 0 may be used to reference the null
	# string.

	call malloc (ST_SBUFP(stp), sz_sbuf, TY_CHAR)
	ST_SBUFINC(stp) = max (1, nint (sz_sbuf * INC_START))
	ST_SBUFLEN(stp) = sz_sbuf
	ST_SBUFOP(stp)  = 1
	ST_SBUFNGROW(stp) = 0
	Memc[ST_SBUFP(stp)] = EOS

	# Allocate symbol table.  The initial STABOP (offset into STAB) is set
	# to 1 rather than 0 since 0 as an STAB offset is used to mark the end
	# of a list.

	call malloc (ST_STABP(stp), len_stab, TY_STRUCT)
	ST_STABINC(stp) = max (1, nint (len_stab * INC_START))
	ST_STABLEN(stp) = len_stab
	ST_STABOP(stp)  = 1
	ST_STABNGROW(stp) = 0

	# Save the symbol table name in the string buffer.  This name is
	# for documentation purposes only (it is printed by STINFO).

	ST_NAME(stp) = stpstr (stp, name, 0)

	return (stp)
end