Example #1
0
int
mbbs_wrpnghdr(Ping *png, XDR *xdrs)
/*
   User-callable routine.
   Writes the Ping header png onto the XDR stream pointed to by xdrs.
   Returns BS_SUCCESS, BS_BADARCH or BS_WRITE.
*/
{
	int mbbs_xdrpnghdr(Ping *, XDR *, int);

	if (sizeof(int) < 4)
		return BS_BADARCH;

	if (mbbs_xdrpnghdr(png, xdrs, (int) BS_VERSION_CURR))
		return BS_SUCCESS;
	else
		return BS_WRITE;
}
Example #2
0
int
mbbs_rdpnghdr(Ping *png, XDR *xdrs, int version)
/*
   User-callable routine.
   Gets the next Ping header from the XDR stream pointed
   to by xdrs and returns this header in the structure png.
   xdrs is assumed to be positioned at the next header,
   and does not search. version should be the bs_version value
   from the file header which indicates the version of the file.
   Returns BS_SUCCESS, BS_BADARCH, BS_BADARG or BS_READ.
*/
{
	int mbbs_xdrpnghdr(Ping *, XDR *, int);

	if (sizeof(int) < 4)
		return BS_BADARCH;

	switch (version) {
	case MR1_VERSION_1_0:
		if (mbbs_mr1_xdrpnghdrv1(png, xdrs))
			return BS_SUCCESS;
		else
			return BS_READ;
	case MR1_VERSION_2_0:
		if (mbbs_mr1_xdrpnghdrv2(png, xdrs))
			return BS_SUCCESS;
		else
			return BS_READ;
	case BS_VERSION_1_0:
	case BS_VERSION_1_1:
	case BS_VERSION_1_2:
	case BS_VERSION_1_3:
	case BS_VERSION_1_4:
		if (mbbs_xdrpnghdr(png, xdrs, version))
			return BS_SUCCESS;
		else
			return BS_READ;
	default:
		return BS_BADARG;
	}
}
int
mbbs_setswradius(int version, FILE *fp, long phoffset, int side, unsigned int dtmask, float swradius)
/*
   Flags all samples of the specified datatype on the named side at
   across-track distances greater than swradius with {BTYD,SSD}_SWEDGE for
   the ping whose header is located at an arbitrary file byte offset.
*/
{
	Ping png;
	PingData pngdata;
	XDR xdr;
	int err, i, trimbty, trimss;
	int bsi, nbtyvals, nssvals, ssstart;
	long pdoffset;
	float *bty;
	float sscutoff;
	unsigned int *btyflags;
	unsigned char *ssflags;
	unsigned long datasz;

	switch (version) {
	case MR1_VERSION_1_0:
	case MR1_VERSION_2_0:
		return BS_BADDATA;
	case BS_VERSION_1_0:
	case BS_VERSION_1_1:
	case BS_VERSION_1_2:
	case BS_VERSION_1_3:
	case BS_VERSION_1_4:
		break;
	default:
		return BS_BADDATA;
	}

	if (fp == (FILE *) 0)
		return BS_BADARG;

	switch (side) {
	case ACP_PORT:
	case ACP_STBD:
		break;
	default:
		return BS_BADARG;
	}

	if (!(dtmask & BS_DTM_BATHYMETRY) &&
	    !(dtmask & BS_DTM_SIDESCAN))
		return BS_BADARG;

	if (swradius < 0.)
		return BS_BADARG;

	if (fseek(fp, phoffset, SEEK_SET) != 0)
		return BS_FSEEK;
	xdrstdio_create(&xdr, fp, XDR_DECODE);

	if (!mbbs_xdrpnghdr(&png, &xdr, version)) {
		xdr_destroy(&xdr);
		return BS_READ;
	}
	trimbty= trimss= 0;
	if (dtmask & BS_DTM_BATHYMETRY) {
		if ((nbtyvals= png.png_sides[side].ps_btycount) > 0)
			trimbty= 1;
	}
	if (dtmask & BS_DTM_SIDESCAN) {
		if ((sscutoff= swradius-png.png_sides[side].ps_ssxoffset) < 0.)
			sscutoff= 0.;
		ssstart= sscutoff/png.png_ssincr;
		if ((nssvals= png.png_sides[side].ps_sscount) > ssstart)
			trimss= 1;
	}
	if (!trimbty && !trimss) {
		xdr_destroy(&xdr);
		return BS_SUCCESS;
	}

	/* remember current file offset at end of ping header */
	pdoffset= phoffset+bs_iobytecnt;

	if ((err= mbbs_pngrealloc(&png, &bswsf_databuf, &bswsf_databufsz)) != BS_SUCCESS) {
		xdr_destroy(&xdr);
		return err;
	}
	if ((err= mbbs_rdpngdata(&png, bswsf_databuf, &xdr)) != BS_SUCCESS) {
		xdr_destroy(&xdr);
		return err;
	}
	datasz= bs_iobytecnt;
	xdr_destroy(&xdr);

	if ((err= mbbs_getpngdataptrs(&png, bswsf_databuf, &pngdata)) != BS_SUCCESS)
		return err;

	/* set {BTYD,SSD}_SWEDGE on all desired samples */
	if (dtmask & BS_DTM_BATHYMETRY) {
		if (png.png_flags & PNG_XYZ)
			bsi= 3;
		else
			bsi= 2;
		if ((bty= pngdata.pd_bty[side]) == (float *) 0)
			return BS_BADDATA;
		if ((btyflags= pngdata.pd_btyflags[side]) == (unsigned int *) 0)
			return BS_BADDATA;
		for (i= 0; i < nbtyvals; i++) {
			if (bty[bsi*i] > swradius)
				btyflags[i]|= BTYD_SWEDGE;
		}
	}
	if (dtmask & BS_DTM_SIDESCAN) {
		if ((ssflags= pngdata.pd_ssflags[side]) == (unsigned char *) 0)
			return BS_BADDATA;
		for (i= ssstart; i < nssvals; i++)
			ssflags[i]|= SSD_SWEDGE;
	}

	/* seek to beginning of ping data region and rewrite it */
	if (fseek(fp, pdoffset, SEEK_SET) != 0)
		return BS_FSEEK;
	xdrstdio_create(&xdr, fp, XDR_ENCODE);
	if ((err= mbbs_wrpngdata(&png, bswsf_databuf, &xdr)) != BS_SUCCESS) {
		xdr_destroy(&xdr);
		return err;
	}

	bs_iobytecnt= datasz;
	xdr_destroy(&xdr);
	(void) fflush(fp);

	return BS_SUCCESS;
}