aboutsummaryrefslogtreecommitdiff
path: root/sys/etc/nmireadc.x
blob: be65b9dd28f27f1c6c412e7ef7795836dcd2f59c (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
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.

include <nmi.h>

# NMIREADC -- Read a block of character data stored externally in NMI format.
# Data is returned in the native machine character format.

int procedure nmi_readc (fd, spp, maxchars)

int	fd			# input file
int	spp[ARB]		# receives data
int	maxchars		# max number of chars to be read

pointer	sp, bp
int	pksize, nchars
int	nmipksize(), nminelem(), read()
errchk	read()

long	note()

begin
	pksize = nmipksize (maxchars, NMI_BYTE)
	nchars = max (maxchars, pksize)

	if (nchars > maxchars) {
	    # Read data into local buffer and unpack into user buffer.

	    call smark (sp)
	    call salloc (bp, nchars, TY_CHAR)

	    nchars = read (fd, Memc[bp], pksize)
	    if (nchars != EOF) {
		nchars = min (maxchars, nminelem (nchars, NMI_BYTE))
		call nmiupk8 (Memc[bp], spp, nchars, TY_CHAR)
	    }

	    call sfree (sp)
	
	} else {
	    # Read data into user buffer and unpack in place.

	    nchars = read (fd, spp, pksize)
	    if (nchars != EOF) {
		nchars = min (maxchars, nminelem (nchars, NMI_BYTE))
		call nmiupk8 (spp, spp, nchars, TY_CHAR)
	    }
	}

	return (nchars)
end