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; }
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); }