/* file: pscgen.c G. Moody 26 November 1990 Last revised: 20 May 2002 ------------------------------------------------------------------------------- pscgen: Generate a script for pschart 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/). _______________________________________________________________________________ This program reads an annotation file and generates a `pschart' script for printing strips which (by default) are centered on each annotation. The argument of the -l option specifies the length of each strip, and that of the -d option specifies the delay from the beginning of each strip to the annotation (this delay may be negative if desired; in this case, the strips begin at the specified interval AFTER each annotation). Other options are interpreted as for `rdann'. */ #include #include #include main(argc, argv) int argc; char *argv[]; { static char *record, *ts, save_aux[255]; int delay_ann, i, j; long from = 0L, to = 0L, delay = 0L, length = 0L; static char flag[ACMAX+1]; WFDB_Anninfo ai; WFDB_Annotation annot; if (argc < 3) { fprintf(stderr, "usage: %s annotator record [options]\n", argv[0]); exit(1); } ai.name = argv[1]; ai.stat = WFDB_READ; record = argv[2]; if (annopen(record, &ai, 1) < 0) exit(2); if ((sampfreq(record)) <= 0.) setsampfreq(WFDB_DEFFREQ); flag[0] = 1; delay = strtim("0.5"); for (i = 3; i < argc; i++) { if (*argv[i] == '-') switch (*(argv[i] + 1)) { case 'd': /* specify delay time */ if (++i >= argc) { fprintf(stderr, "%s: delay time must follow -d\n", argv[0]); exit(1); } if (*argv[i] == '-') delay = -strtim(argv[i]+1); else delay = strtim(argv[i]); break; case 'D': /* specify delay in annotations */ if (++i >= argc) { fprintf(stderr, "%s: delay in annotations must follow -D\n", argv[0]); exit(1); } delay_ann = atoi(argv[i]); break; case 'f': /* specify starting time */ if (++i >= argc) { fprintf(stderr, "%s: starting time must follow -f\n", argv[0]); exit(1); } from = strtim(argv[i]); if (from < (WFDB_Time)0) from = -from; break; case 'l': /* specify strip length */ if (++i >= argc) { fprintf(stderr, "%s: strip length must follow -l\n", argv[0]); exit(1); } length = strtim(argv[i]); break; case 't': /* specify ending time */ if (++i >= argc) { fprintf(stderr, "%s: ending time must follow -t\n", argv[0]); exit(1); } to = strtim(argv[i]); if (to < (WFDB_Time)0) to = -to; break; } else { flag[0] = 0; if (isann(j = strann(argv[i]))) flag[j] = 1; } } if (from && iannsettime(from) < 0) exit(2); if (length <= 0L) length = strtim("1"); if (to < 0L) to = 0L; while (getann(0, &annot) == 0 && (to == 0L || annot.time <= to)) if (flag[0] || (isann(annot.anntyp) && flag[annot.anntyp])) { long t0, t1; if (annot.aux) strcpy(save_aux, annot.aux+1); else save_aux[0] = '\0'; if (delay_ann) { for (j = 0; j < delay_ann; j++) if (getann(0, &annot)) exit(0); } t0 = annot.time - delay; if (t0 < 0L) t0 = 0L; t1 = t0 + length; ts = mstimstr(t0); while (*ts == ' ') ts++; printf("%s %s-", record, ts); ts = mstimstr(t1); while (*ts == ' ') ts++; printf("%s", ts); if (save_aux[0]) printf(" %s", save_aux); printf("\n"); } exit(0); }