/* file: skewedit.c G. Moody 10 August 1994 Last revised: 14 November 2002 ------------------------------------------------------------------------------- skewedit: Edit skew fields of header file(s) Copyright (C) 2002 George B. Moody This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, see . You may contact the author by e-mail (wfdb@physionet.org) or postal mail (MIT Room E25-505A, Cambridge, MA 02139 USA). For updates to this software, please visit PhysioNet (http://www.physionet.org/). _______________________________________________________________________________ */ #include #include static int nskews, *skew; main(argc, argv) int argc; char *argv[]; { char buf[256], *hfname, *p; FILE *hfile; int i; void skewedit(); if (argc < 3) { fprintf(stderr, "usage: %s record skew0 [skew1 ... skewN]\n", argv[0]); fprintf(stderr, " If `record' contains multiple segments, the headers for each segment are\n"); fprintf(stderr," rewritten.\n"); fprintf(stderr, " The `skew0', `skew1', etc. arguments are skews (in samples) for each signal,\n"); fprintf(stderr, " beginning with signal 0.\n"); exit(1); } nskews = argc-2; if ((skew = malloc(nskews * sizeof(int))) == NULL) { fprintf(stderr, "%s: insufficient memory\n", argv[0]); exit(2); } for (i = 2; i < argc; i++) { if ((skew[i-2] = atoi(argv[i])) < 0) { fprintf(stderr, "%s: skew cannot be less than zero\n", argv[0]); exit(1); } } if ((hfname = wfdbfile("header", argv[1])) == NULL) { fprintf(stderr, "%s: can't find header for record %s\n", argv[0], argv[1]); exit(2); } if ((hfile = fopen(hfname, "rt")) == NULL) { fprintf(stderr, "%s: can't read `%s'\n", argv[0], hfname); exit(2); } fgets(buf, 256, hfile); for (p = buf; *p; p++) if (*p == ' ' || *p == '/' || *p == '\t' || *p == '\n' || *p == '\r') break; if (*p == '/') { /* this is a multi-segment record */ char *shfname; FILE *shfile; int nseg = atoi(p+1); for (i = 0; i < nseg; i++) { fgets(buf, 256, hfile); for (p = buf; *p && *p != ' '; p++) ; *p = '\0'; if ((shfname = wfdbfile("header", buf)) == NULL) { fprintf(stderr, "%s: can't find header for segment %s\n", argv[0], buf); continue; } if ((shfile = fopen(shfname, "rt")) == NULL) { fprintf(stderr, "%s: can't read `%s'\n", argv[0], shfname); continue; } skewedit(buf, shfile); } } else { rewind(hfile); skewedit(argv[1], hfile); } exit(0); } void skewedit(record, hfile) char *record; FILE *hfile; { char buf[256], tmpfname[20], hfname[20], *p; int i = 0; FILE *tfile; sprintf(tmpfname, "%s.tmp", record); if ((tfile = fopen(tmpfname, "wt")) == NULL) { fprintf(stderr, "can't create temporary file `%s'\n", tmpfname); return; } do { fgets(buf, 256, hfile); fputs(buf, tfile); } while (strncmp(buf, record, strlen(record))); while (fgets(buf, 256, hfile)) { if (buf[0] == '#' || buf[0] == '\n') { fprintf(tfile, "%s", buf); continue; } for (p = buf; *p != ' '; p++) ; for (p = p+1; *p != ' ' && *p != ':'; p++) ; if (*p == ':') { *p++ = '\0'; while (*p++ != ' ') ; } else *p++ = '\0'; if (i < nskews && skew[i]) fprintf(tfile, "%s:%d %s", buf, skew[i], p); else fprintf(tfile, "%s %s", buf, p); i++; } fclose(tfile); fclose(hfile); sprintf(hfname, "%s.hea", record); if (rename(tmpfname, hfname)) fprintf(stderr, "can't rename `%s' as `%s'\n", tmpfname, hfname); }