This is peak.c in view mode; [Download] [Up]
#include <stdio.h>
#include <math.h>
#include <carl/carl.h>
#include <signal.h>
#define ABS 0
#define NEG 1
#define POS 2
float max;
long maxl;
long cnt;
int putout = 0,
dBpeak = 0;
main(narg,argv)
int narg; char *argv[];
{
int die(), i;
float input;
int otty = isatty(1),
direction = ABS;
char ch;
if (isatty(0))
usage(1);
while ((ch = crack(narg, argv, "e|h|d|i|a|n|p|", 0)) != NULL) {
switch (ch) {
case 'e': /* -e(rror) */
putout++;
break;
case 'd': /* -d(B) */
dBpeak++;
break;
case 'i': /* -i(ndex) */
break;
case 'a': /* -a(bsolute) */
direction = ABS;
break;
case 'n': /* -n(egative) */
direction = NEG;
break;
case 'p': /* -p(ositive) */
direction = POS;
break;
case 'h': /* -h(elp) */
usage(0);
default:
usage(1);
}
}
if (otty && putout) {
fprintf(stderr, "peak: for -e, output must be file or pipe.\n");
exit(1);
}
for (i = 0; i < NSIG; i++) /* catch all signals */
signal(i, die); /* set to print peak at time of interrupt */
switch (direction) {
case ABS:
while ( getfloat(&input) > 0) {
if (putout)
putfloat(&input);
if (input < 0)
input = -input;
if (input > max) {
max = input;
maxl = cnt;
}
cnt++;
}
case POS:
while ( getfloat(&input) > 0) {
if (putout)
putfloat(&input);
if (input > max) {
max = input;
maxl = cnt;
}
cnt++;
}
case NEG:
while ( getfloat(&input) > 0) {
if (putout)
putfloat(&input);
if (input < max) {
max = input;
maxl = cnt;
}
cnt++;
}
}
pstat();
exit(0);
}
usage(x)
int x;
{
fprintf(stderr, "%s%s%s%s%s%s%s%s%s%s",
"usage:\n",
"peak [flags] < floatsams > peak (ASCII numbers)\n",
"peak [flags] -e < floatsams > floatsams, and >& peak\n",
"\tflags:\n",
"\t-e\tcopy stdin to stdout, print peak on stderr\n",
"\t-d\tprint peak amplitude as dB amplitude\n",
"\t-a\t(default) detect absolute maximum\n",
"\t-n\tdetect negative maximum\n",
"\t-p\tdetect positive maximum\n",
"input must be a file or pipe of floatsams.\n"
);
exit(x);
}
die()
{
signal(SIGINT, SIG_IGN); /* ignore rubouts */
pstat();
exit(0);
}
pstat()
{
if (putout)
flushfloat();
fprintf(putout?stderr:stdout, "%d\t%f\n",
maxl,
dBpeak?(20.0*log10(max>0?max:-max)):(max));
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.