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

include	<mach.h>
include	"fmio.h"

# FM_LFAWRITE -- Asynchronous blocked write to an lfile.  The differences
# between text and binary lfiles are not visible above this level; both
# appear as binary files to FIO.

procedure fm_lfawrite (lf, buf, nbytes, offset)

pointer	lf			#I lfile descriptor
char	buf[ARB]		#O input data buffer
int	nbytes			#I nbytes to write
long	offset			#I lfile offset

int	status, nb
pointer	sp, pk_buf

begin
	if (and (LF_FLAGS(lf), LFF_TEXTFILE) == 0)
	    call fm_lfbinwrite (lf, buf, nbytes, offset)
	else {
	    call smark (sp)
	    call salloc (pk_buf, nbytes / SZB_CHAR, TY_CHAR)

	    # Wait for i/o to complete before freeing buffer!
	    nb = (nbytes + SZB_CHAR-1) / SZB_CHAR
	    call chrpak (buf, 1, Memc[pk_buf], 1, nb)
	    call fm_lfbinwrite (lf, Memc[pk_buf], nb, (offset-1)/SZB_CHAR+1)
	    call fm_lfbinwait (lf, status)

	    call sfree (sp)
	}
end