This is getheader.c in view mode; [Download] [Up]
/* getheader.c 1.3 (CARL) 9/12/86 16:29:11 */ #include <stdio.h> #include <carl/defaults.h> #include <carl/carl.h> #include <carl/procom.h> #include <ctype.h> /* * getheader - get header from file. * takes: * iop - pointer to open file descriptor * side effects: * If header exists, parses header into fb[fileno(iop)]->p. * Sets fb[fileno(iop)]->prop to HAS_HEADER on success. * Aligns fb[fileno(iop)]->pos to read first sample. * If a header symbol is too long, a diagnostic is printed to stderr. * returns: * pointer to property list if header exists and was read successfully, * NULL on i/o errors or malformed header, * NULL if no header exists on stream, and no i/o errors. * (You may examine errno for i/o errors.) * notes: * Multiple calls to getheader for the same iop return: * pointer to property list if header was read, * NULL if no header was present, or error occurred. * It can be called at any point during the time the iop is open, * whether or not fgetfloat() has been called on this iop. */ extern short _samplesize; PROP * getheader(iop) FILE *iop; { register struct fltbuf *fbp; register int n; register char *c; if (finitbuf(iop)) return(NULL); fbp = &fb[fileno(iop)]; if (fbp->prop == HAS_HEADER) /* parsed header already exists */ return(fbp->p); /* yes */ # ifdef NOTDEF else if (fbp->prop == NO_HEADER) return(NULL); /* looked already and not found one */ # endif NOTDEF fbp->prop = NO_HEADER; /* looking for header the first time */ if (fbp->cpos >= fbp->n) { if ((fbp->n = read(fileno(iop),(char *)fbp->fbuf,P_BUFSIZE))<=0) return(NULL); fbp->pos = fbp->cpos = 0; } c = (char *) &fbp->fbuf[fbp->pos]; /* peek at data */ if (!strcmp(c, H_HEAD)) { /* yes, Virginia, there is a header */ if ((n = parseprop(iop)) <= 0) {/* go get it */ fbp->ssize = _samplesize; fbp->n /= fbp->ssize; return(NULL); /* failure */ } else { fbp->prop = HAS_HEADER; return(fbp->p); /* success */ } } fbp->ssize = _samplesize; fbp->n /= fbp->ssize; return(NULL); /* no header */ } parseprop(iop) FILE *iop; { register int n, sum = 0; while ((n = getpair(iop)) > 0) sum++; if (n < 0) return(-1); else return(sum); } getpair(iop) FILE *iop; { char c; /* may not be register */ register int toggle = 0, i = 0; char name[BUFSIZ], /* these can be standard size */ value[BUFSIZ]; while (gchar(&c, iop) > 0) { if (i >= BUFSIZ) { fprintf(stderr, "symbol too long: %s\n", toggle ? value : name); return(-1); } if (toggle) { /* parsing value */ value[i++] = c; } else { /* parsing name */ name[i++] = c; } if (c == '\0') { toggle = toggle ? 0 : 1; i = 0; if (toggle == 0) { if (putprop(iop, name, value) != 0) return(-1); if (!strcmp(name, H_TAIL)) { register char *c; register short ssize = _samplesize; if ((c = getprop(iop, H_FORMAT))!=NULL){ if (!strcmp(c, H_FLOATSAM)) ssize = sizeof(float); else ssize = sizeof(short); } bump(iop, ssize); return(0); /* finished */ } else return(1); /* got pair */ } } } return(-1); } /* * gchar - get char from floatsam header. */ gchar(cp, iop) char *cp; FILE *iop; { register struct fltbuf *fbp; register char *x; fbp = &fb[fileno(iop)]; if (fbp->cpos >= fbp->n) { if ((fbp->n = read(fileno(iop),(char *)fbp->fbuf,P_BUFSIZE))<=0) return(fbp->n); fbp->pos = fbp->cpos = 0; } x = (char *) &fbp->fbuf[0]; *cp = x[fbp->cpos++]; fbp->pos = fbp->cpos / fbp->ssize; return(fbp->ssize); } bump(iop, samplesize) FILE *iop; short samplesize; { register struct fltbuf *fbp; fbp = &fb[fileno(iop)]; fbp->ssize = samplesize; fbp->n /= fbp->ssize; /* compute how many samps are left */ fbp->pos = fbp->cpos / fbp->ssize; if ((fbp->cpos % fbp->ssize) > 0) fbp->pos++; /* round up */ }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.