Exemple #1
0
int
mbbs_splitfile(char *dirnm, char *bsfnm0, char *bsfnm1, int pngid, char *logprefix)
{
	int chngdir, origdirfd, err;
	char tmpfilenm[80], prefix[80], newlogtail[120];
	char *lp, *tailstr;
	FILE *ifp, *ofp;
	XDR xdri, xdro;
	BSFile bsfi, bsfo;

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

	if ((bsfnm0 == (char *) 0) ||
	    ((int) strlen(bsfnm0) == 0) ||
	    (bsfnm1 == (char *) 0) ||
	    ((int) strlen(bsfnm1) == 0) ||
	    (pngid < 0))
		return BS_BADARG;

	if ((dirnm == (char *) 0) ||
	    ((int) strlen(dirnm) == 0))
		chngdir= 0;
	else
		chngdir= 1;

	if (chngdir) {
		if ((origdirfd= open(".", O_RDONLY)) < 0)
			return BS_OPEN;
		if (chdir(dirnm) < 0) {
			(void) close(origdirfd);
			return BS_CHDIR;
		}
	}

	/* rename original file to temporary name */
	(void) strcpy(tmpfilenm, "BSLIBsplittmp");
	if (access(tmpfilenm, F_OK) == 0) {
		if (chngdir) {
			(void) fchdir(origdirfd);
			(void) close(origdirfd);
		}
		return BS_ACCESS;
	}
	if (rename(bsfnm0, tmpfilenm) < 0) {
		if (chngdir) {
			(void) fchdir(origdirfd);
			(void) close(origdirfd);
		}
		return BS_RENAME;
	}

	if ((ifp= fopen(tmpfilenm, "r")) == (FILE *) 0) {
		(void) rename(tmpfilenm, bsfnm0);
		if (chngdir) {
			(void) fchdir(origdirfd);
			(void) close(origdirfd);
		}
		return BS_OPEN;
	}
	xdrstdio_create(&xdri, ifp, XDR_DECODE);
	if ((err= mbbs_rdbsfhdr(&bsfi, &xdri)) != BS_SUCCESS) {
		(void) fclose(ifp);
		(void) rename(tmpfilenm, bsfnm0);
		if (chngdir) {
			(void) fchdir(origdirfd);
			(void) close(origdirfd);
		}
		return err;
	}
	if (pngid >= bsfi.bsf_count) {
		(void) mbbs_freebsfmem(&bsfi);
		(void) fclose(ifp);
		(void) rename(tmpfilenm, bsfnm0);
		if (chngdir) {
			(void) fchdir(origdirfd);
			(void) close(origdirfd);
		}
		return BS_BADARG;
	}
	MemCopy(&bsfi, &bsfo, sizeof(BSFile));

	/* these strings now belong to the output header! */
	bsfi.bsf_srcfilenm= (char *) 0;
	bsfi.bsf_log= (char *) 0;

	if ((logprefix == (char *) 0) ||
	    ((int) strlen(logprefix) == 0)) {
		(void) sprintf(prefix, "BSLIB::bs_split()");
		lp= prefix;
	}
	else if ((int) strlen(logprefix) > 50) {
		(void) strncpy(prefix, logprefix, 47);
		prefix[47]= '\0';
		(void) strcat(prefix, "...");
		lp= prefix;
	}
	else
		lp= logprefix;
	if ((int) strlen(bsfo.bsf_log) > 0)
		(void) sprintf(newlogtail, "\n%s [ BreakFile @ Ping%1d HEAD ] ;", lp, pngid);
	else
		(void) sprintf(newlogtail, "%s [ BreakFile @ Ping%1d HEAD ] ;", lp, pngid);
	if ((err= mbbs_appendstr(&(bsfo.bsf_log), newlogtail)) != BS_SUCCESS) {
		(void) mbbs_freebsfmem(&bsfo);
		(void) fclose(ifp);
		(void) rename(tmpfilenm, bsfnm0);
		if (chngdir) {
			(void) fchdir(origdirfd);
			(void) close(origdirfd);
		}
		return err;
	}

	/* eventually we will replace the "HEAD ] ;" substring just
	   appended to the log with "TAIL ] ;", so locate it now */
	tailstr= bsfo.bsf_log;
	tailstr+= (int) strlen(bsfo.bsf_log);
	for ( ; *tailstr != 'H'; tailstr--);

	/* copy first part of original file */
	if ((ofp= fopen(bsfnm0, "w")) == (FILE *) 0) {
		(void) mbbs_freebsfmem(&bsfo);
		(void) fclose(ifp);
		(void) rename(tmpfilenm, bsfnm0);
		if (chngdir) {
			(void) fchdir(origdirfd);
			(void) close(origdirfd);
		}
		return BS_OPEN;
	}
	xdrstdio_create(&xdro, ofp, XDR_ENCODE);
	bsfo.bsf_count= pngid;
	if ((err= mbbs_wrbsfhdr(&bsfo, &xdro)) != BS_SUCCESS) {
		(void) fclose(ofp);
		(void) mbbs_freebsfmem(&bsfo);
		(void) fclose(ifp);
		(void) rename(tmpfilenm, bsfnm0);
		if (chngdir) {
			(void) fchdir(origdirfd);
			(void) close(origdirfd);
		}
		return err;
	}
	if ((err= mbbs_copypng(bsfo.bsf_count, &xdri, &xdro, bsfi.bsf_version)) != BS_SUCCESS) {
		(void) fclose(ofp);
		(void) mbbs_freebsfmem(&bsfo);
		(void) fclose(ifp);
		(void) rename(tmpfilenm, bsfnm0);
		if (chngdir) {
			(void) fchdir(origdirfd);
			(void) close(origdirfd);
		}
		return err;
	}
	xdr_destroy(&xdro);
	(void) fclose(ofp);

	/* copy second part of original file */
	if ((ofp= fopen(bsfnm1, "w")) == (FILE *) 0) {
		(void) mbbs_freebsfmem(&bsfo);
		(void) fclose(ifp);
		(void) rename(tmpfilenm, bsfnm0);
		if (chngdir) {
			(void) fchdir(origdirfd);
			(void) close(origdirfd);
		}
		return BS_OPEN;
	}
	xdrstdio_create(&xdro, ofp, XDR_ENCODE);
	bsfo.bsf_count= bsfi.bsf_count-pngid;
	(void) strcpy(tailstr, "TAIL ] ;");
	if ((err= mbbs_wrbsfhdr(&bsfo, &xdro)) != BS_SUCCESS) {
		(void) fclose(ofp);
		(void) mbbs_freebsfmem(&bsfo);
		(void) fclose(ifp);
		(void) rename(tmpfilenm, bsfnm0);
		if (chngdir) {
			(void) fchdir(origdirfd);
			(void) close(origdirfd);
		}
		return err;
	}
	if ((err= mbbs_copypng(bsfo.bsf_count, &xdri, &xdro, bsfi.bsf_version)) != BS_SUCCESS) {
		(void) fclose(ofp);
		(void) mbbs_freebsfmem(&bsfo);
		(void) fclose(ifp);
		(void) rename(tmpfilenm, bsfnm0);
		if (chngdir) {
			(void) fchdir(origdirfd);
			(void) close(origdirfd);
		}
		return err;
	}
	xdr_destroy(&xdro);
	(void) fclose(ofp);

	(void) mbbs_freebsfmem(&bsfo);
	(void) fclose(ifp);
	(void) unlink(tmpfilenm);
	if (chngdir) {
		if (fchdir(origdirfd) != 0) {
			(void) close(origdirfd);
			return BS_CHDIR;
		}
		(void) close(origdirfd);
	}

	return BS_SUCCESS;
}
Exemple #2
0
int
main(int argc, char **argv)
{
	char *cp;
	Ping png, *pngp;
	int err, i, j, side, npts, bsi;
	PingData pd;
	float *bty, *ss;
	AuxBeamInfo *abi;
	void usage();
	void pr_bsfhdr(BSFile *), pr_pnghdr(Ping *);

	if ((progname= strrchr(*argv, (int) '/')) != (char *) NULL)
		progname++;
	else
		progname= *argv;

	skip= 0;
	count= BS_UNDEFINED;
	iomode= BS_FILEIO;
	fp= stdout;
	output= OUTPUT_ALL;
	ignorecnt= 0;
	showivisping= 1;
	showsns= showbty= showss= 1;
	showbtyd= showbtyfl= showabi= 1;
	showssd= showssfl= 1;
	pngcntonly= 0;
	tmmode= TM_JULIAN;

	databuf= (MemType *) 0;
	databufsz= 0;

	for (argc--, argv++; argc > 0; argc--, argv++) {
		if (!strcmp(*argv, "-s")) {
			if (argc < 2)
				usage();
			argc--, argv++;
			skip= (int) strtol(*argv, &cp, 10);
			if ((cp == *argv) || (*cp != '\0')) {
				(void) fprintf(stderr, "%s: invalid skip value\n", progname);
				exit(BS_BADARG);
			}
			if (skip < 0) {
				(void) fprintf(stderr, "%s: skip value may not be less than 0\n", progname);
				exit(BS_BADARG);
			}
		}
		else if (!strcmp(*argv, "-c")) {
			if (argc < 2)
				usage();
			argc--, argv++;
			count= (int) strtol(*argv, &cp, 10);
			if ((cp == *argv) || (*cp != '\0')) {
				(void) fprintf(stderr, "%s: invalid count value\n", progname);
				exit(BS_BADARG);
			}
			if (count < 0) {
				(void) fprintf(stderr, "%s: count value may not be less than 0\n", progname);
				exit(BS_BADARG);
			}
		}
		else if (!strcmp(*argv, "-sm")) {
			if (argc < 2)
				usage();
			iomode= BS_SHAREDMEM;
			argc--, argv++;
			smcid= (int) strtol(*argv, &cp, 10);
			if ((cp == *argv) || (*cp != '\0')) {
				(void) fprintf(stderr, "%s: invalid shared memory control block ID\n", progname);
				exit(BS_BADARG);
			}
		}
		else if (!strcmp(*argv, "-f")) {
			if (argc < 2)
				usage();
			argc--, argv++;
			if ((fp= fopen(*argv, "w")) == (FILE *) NULL) {
				(void) fprintf(stderr, "%s: cannot open file '%s'\n", progname, *argv);
				exit(BS_OPEN);
			}
		}
		else if (!strcmp(*argv, "-h"))
			output= OUTPUT_HDRSONLY;
		else if (!strcmp(*argv, "-d"))
			output= OUTPUT_DATAONLY;
		else if (!strcmp(*argv, "-nip"))
			showivisping= 0;
		else if (!strcmp(*argv, "-nsns"))
			showsns= 0;
		else if (!strcmp(*argv, "-nb"))
			showbty= 0;
		else if (!strcmp(*argv, "-nbd"))
			showbtyd= 0;
		else if (!strcmp(*argv, "-nbf"))
			showbtyfl= 0;
		else if (!strcmp(*argv, "-nabi"))
			showabi= 0;
		else if (!strcmp(*argv, "-ns"))
			showss= 0;
		else if (!strcmp(*argv, "-nsd"))
			showssd= 0;
		else if (!strcmp(*argv, "-nsf"))
			showssfl= 0;
		else if (!strcmp(*argv, "-i"))
			ignorecnt= 1;
		else if (!strcmp(*argv, "-pco"))
			pngcntonly= 1;
		else if (!strcmp(*argv, "-jt"))
			tmmode= TM_JULIAN;
		else if (!strcmp(*argv, "-ct"))
			tmmode= TM_CALENDAR;
		else if (!strcmp(*argv, "-H"))
			usage();

		/* ignored options */
		else if (!strcmp(*argv, "-tv")) {
			if (argc < 3)
				usage();
			argc-= 2, argv+= 2;
		}
		else if (!strcmp(*argv, "-spm"))
			continue;
		else if (!strcmp(*argv, "-ppm"))
			continue;
		else if (!strncmp(*argv, "-pb", 3))
			continue;
		else if (!strncmp(*argv, "-pp", 3))
			continue;
		else if (!strncmp(*argv, "-ps", 3))
			continue;
	}

	switch (iomode) {
	case BS_FILEIO:
		xdrstdio_create(&xdri, stdin, XDR_DECODE);

		if ((err= mbbs_rdbsfhdr(&bsf, &xdri)) != BS_SUCCESS) {
			(void) fprintf(stderr, "%s: cannot read BS file header\n", progname);
			exit(err);
		}
		if (bsf.bsf_flags & BS_SSSLANTRNG)
			slantrng= 1;
		else
			slantrng= 0;
		if (pngcntonly) {
			(void) fprintf(fp, "%1d\n", bsf.bsf_count);
			(void) fflush(fp);
			exit(BS_SUCCESS);
		}
		if (ignorecnt == 1)
			;
		else if (count == BS_UNDEFINED) {
			if ((count= bsf.bsf_count-skip) < 0) {
				(void) fprintf(stderr, "%s: skip request exceeds number of available pings\n", progname);
				exit(BS_BADARG);
			}
		}
		else {
			if (skip+count > bsf.bsf_count) {
				(void) fprintf(stderr, "%s: skip and count requests exceed number of available pings\n", progname);
				exit(BS_BADARG);
			}
		}
		if ((err= mbbs_seekpng(skip, &xdri, bsf.bsf_version)) != BS_SUCCESS) {
			(void) fprintf(stderr, "%s: ping seek error\n", progname);
			exit(err);
		}
		if (output != OUTPUT_DATAONLY)
			pr_bsfhdr(&bsf);

		break;
	case BS_SHAREDMEM:
		if (pngcntonly) {
			(void) fprintf(fp, "%1d\n", smctl->sm_count);
			(void) fflush(fp);
			exit(BS_SUCCESS);
		}
		if (ignorecnt == 1) {
			(void) fprintf(stderr, "%s: count cannot be ignored in shared memory mode\n", progname);
			exit(BS_BADARG);
		}
		if ((smctl= (SMControl *) shmat(smcid, (MemType *) 0, (int) 0)) == (SMControl *) -1) {
			(void) fprintf(stderr, "%s: shared memory attach failure\n", progname);
			exit(BS_SYSVIPC);
		}
		if (smctl->sm_slantrng)
			slantrng= 1;
		else
			slantrng= 0;
		if (count == BS_UNDEFINED) {
			if ((count= smctl->sm_count-skip) < 0) {
				(void) fprintf(stderr, "%s: skip request exceeds number of available pings\n", progname);
				smctl->sm_status= BS_BADARG;
				exit(BS_BADARG);
			}
		}
		else if (skip+count > smctl->sm_count) {
			(void) fprintf(stderr, "%s: skip and count requests exceed number of available pings\n", progname);
			smctl->sm_status= BS_BADARG;
			exit(BS_BADARG);
		}
		if ((smind= (int *) shmat(smctl->sm_shmiid, (MemType *) 0, (int) 0)) == (int *) -1) {
			(void) fprintf(stderr, "%s: shared memory attach failure\n", progname);
			smctl->sm_status= BS_SYSVIPC;
			exit(BS_SYSVIPC);
		}
		if ((smbuf= (void *) shmat(smctl->sm_shmdid, (MemType *) 0, (int) 0)) == (void *) -1) {
			(void) fprintf(stderr, "%s: shared memory attach failure\n", progname);
			smctl->sm_status= BS_SYSVIPC;
			exit(BS_SYSVIPC);
		}
		(void) strcpy(smctl->sm_msg, "ASCII output");
		smctl->sm_msgtype= SMC_MSGALTPCT;
		cp= (char *) smbuf;
		cp+= smind[skip];
		pngp= (Ping *) cp;
		break;
	}

	for (i= 0; (i < count) || ((count == BS_UNDEFINED) && (ignorecnt == 1)); i++) {
		switch (iomode) {
		case BS_FILEIO:
			if ((err= mbbs_rdpnghdr(&png, &xdri, bsf.bsf_version)) != BS_SUCCESS) {
				(void) fprintf(stderr, "%s: cannot read header from ping %1d\n", progname, (int) (skip+i));
				exit(err);
			}
			if ((err= mbbs_pngrealloc(&png, &databuf, &databufsz)) != BS_SUCCESS) {
				(void) fprintf(stderr, "%s: memory allocation error for ping %1d\n", progname, (int) (skip+i));
				exit(err);
			}
			if ((err= mbbs_rdpngdata(&png, databuf, &xdri)) != BS_SUCCESS) {
				(void) fprintf(stderr, "%s: cannot read data from ping %1d\n", progname, (int) (skip+i));
				exit(err);
			}
			pngp= &png;
			break;
		case BS_SHAREDMEM:
			cp= (char *) pngp;
			cp+= sizeof(Ping);
			databuf= (float *) cp;
			break;
		}
		if ((err= mbbs_getpngdataptrs(pngp, databuf, &pd)) != BS_SUCCESS) {
			(void) fprintf(stderr, "%s: cannot get ping data pointers\n", progname);
			exit(err);
		}

		(void) fprintf(fp, "\n\nPing %1d ****\n\n", (int) (i+skip));
		if (output != OUTPUT_DATAONLY)
			pr_pnghdr(pngp);

		if ((output != OUTPUT_HDRSONLY) &&
		    (showivisping || mbbs_pngvisible(pngp->png_flags))) {
			if (showsns) {
				(void) fprintf(fp, "\nCompass Data:\n");
				for (j= 0; j < pngp->png_compass.sns_nsamps; j++) {
					if (mbbs_isnanf(pd.pd_compass[j]))
						(void) fprintf(fp, "   ?\n");
					else
						(void) fprintf(fp, "%4.2f\n", pd.pd_compass[j]);
				}

				(void) fprintf(fp, "\nDepth Data:\n");
				for (j= 0; j < pngp->png_depth.sns_nsamps; j++) {
					if (mbbs_isnanf(pd.pd_depth[j]))
						(void) fprintf(fp, "   ?\n");
					else
						(void) fprintf(fp, "%4.2f\n", pd.pd_depth[j]);
				}

				(void) fprintf(fp, "\nPitch Data:\n");
				for (j= 0; j < pngp->png_pitch.sns_nsamps; j++) {
					if (mbbs_isnanf(pd.pd_pitch[j]))
						(void) fprintf(fp, "   ?\n");
					else
						(void) fprintf(fp, "%4.2f\n", pd.pd_pitch[j]);
				}

				(void) fprintf(fp, "\nRoll Data:\n");
				for (j= 0; j < pngp->png_roll.sns_nsamps; j++) {
					if (mbbs_isnanf(pd.pd_roll[j]))
						(void) fprintf(fp, "   ?\n");
					else
						(void) fprintf(fp, "%4.2f\n", pd.pd_roll[j]);
				}
			}

			if (showbty) {
				if (pngp->png_flags & PNG_XYZ)
					bsi= 3;
				else
					bsi= 2;
				for (side= ACP_PORT; side < ACP_NSIDES; side++) {
					(void) fprintf(fp, "\n%s Bathymetry Data:\n[Index]        X        ", side == ACP_PORT ? "Port" : "Starboard");
					if (bsi == 3)
						(void) fprintf(fp, "Y        ");
					(void) fprintf(fp, "Z    ");
					if (showbtyfl)
						(void) fprintf(fp, "Flag    ");
					if ((pngp->png_flags & PNG_ABI) && showabi)
						(void) fprintf(fp, "Beam    SSAT0    SSAT1 ABIFlag");
					(void) fprintf(fp, "\n");
					if ((npts= pngp->png_sides[side].ps_btycount) == 0)
						continue;
					bty= pd.pd_bty[side];
					for (j= 0; j < npts; j++) {
						if (!showbtyd && pd.pd_btyflags[side][j])
							continue;
						(void) fprintf(fp, "[%5d]   %8.2f ", j, bty[bsi*j]);
						if (bsi == 3)
							(void) fprintf(fp, "%8.2f %8.2f", bty[(bsi*j)+1], bty[(bsi*j)+2]);
						else
							(void) fprintf(fp, "%8.2f", bty[(bsi*j)+1]);
						if (showbtyfl)
							(void) fprintf(fp, "%#6x  ", pd.pd_btyflags[side][j]);
						if ((pngp->png_flags & PNG_ABI) && showabi) {
							abi= &(pd.pd_abi[side][j]);
							(void) fprintf(fp, "%6d ", abi->abi_id);
							if (mbbs_isnanf(abi->abi_ssat0))
								(void) fprintf(fp, "       ? ");
							else
								(void) fprintf(fp, "%8.2f ", abi->abi_ssat0);
							if (mbbs_isnanf(abi->abi_ssat1))
								(void) fprintf(fp, "       ?  ");
							else
								(void) fprintf(fp, "%8.2f  ", abi->abi_ssat1);
							(void) fprintf(fp, "%#6x", abi->abi_flags);
						}
						(void) fprintf(fp, "\n");
					}
				}
			}

			if (showss) {
				for (side= ACP_PORT; side < ACP_NSIDES; side++) {
					(void) fprintf(fp, "\n%s Sidescan Data:\n[Index]      Intensity", side == ACP_PORT ? "Port" : "Starboard");
					if (showssfl)
						(void) fprintf(fp, "     Flag");
					(void) fprintf(fp, "\n");
					npts= pngp->png_sides[side].ps_sscount;
					ss= pd.pd_ss[side];
					for (j= 0; j < npts; j++) {
						if (!showssd && pd.pd_ssflags[side][j])
							continue;
						(void) fprintf(fp, "[%5d]   %12.2f", j, ss[j]);
						if (showssfl)
							(void) fprintf(fp, "   %#6x", (unsigned int) pd.pd_ssflags[side][j]);
						(void) fprintf(fp, "\n");
					}
				}
			}
		}

		(void) fprintf(fp, "\n");

		switch (iomode) {
		case BS_FILEIO:
			break;
		case BS_SHAREDMEM:
			smctl->sm_ping= skip+i;
			if (i < count-1) {
				cp= (char *) smbuf;
				cp+= smind[skip+i+1];
				pngp= (Ping *) cp;
			}
			break;
		}
	}

	switch (iomode) {
	case BS_FILEIO:
		break;
	case BS_SHAREDMEM:
		smctl->sm_status= BS_SUCCESS;
		smctl->sm_redraw= SMC_RDRNONE;
		break;
	}

	exit(BS_SUCCESS);
}