86 lines
1.6 KiB
C
86 lines
1.6 KiB
C
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include <getopt.h>
|
||
|
#include <err.h>
|
||
|
|
||
|
#define CHUNK_DEFAULT (0x1000)
|
||
|
|
||
|
#define MIN(a, b) (a < b? a : b)
|
||
|
#define MAX(a, b) (a > b? a : b)
|
||
|
|
||
|
int
|
||
|
usage(const char* progname)
|
||
|
{
|
||
|
fprintf(stderr, "usage: %s [-c chunk] [-m mul] [-s start] [-e end]\n", progname);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
int
|
||
|
main(int argc, char** argv)
|
||
|
{
|
||
|
int optch;
|
||
|
int cflag = 0;
|
||
|
const char* carg = NULL;
|
||
|
int mflag = 0;
|
||
|
const char* marg = NULL;
|
||
|
int sflag = 0;
|
||
|
const char* sarg = NULL;
|
||
|
int eflag = 0;
|
||
|
const char* earg = NULL;
|
||
|
|
||
|
while ((optch = getopt(argc, argv, "c:m:s:e:h")) != -1) {
|
||
|
switch (optch) {
|
||
|
case 'c':
|
||
|
cflag = 1;
|
||
|
carg = optarg;
|
||
|
break;
|
||
|
case 'm':
|
||
|
mflag = 1;
|
||
|
marg = optarg;
|
||
|
break;
|
||
|
case 's':
|
||
|
sflag = 1;
|
||
|
sarg = optarg;
|
||
|
break;
|
||
|
case 'e':
|
||
|
eflag = 1;
|
||
|
earg = optarg;
|
||
|
break;
|
||
|
case 'h':
|
||
|
default:
|
||
|
return usage(*argv);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
size_t chunk = cflag? strtoull(carg, NULL, 10) : CHUNK_DEFAULT;
|
||
|
float mul = mflag? strtof(marg, NULL) : 1.0f;
|
||
|
size_t start = sflag? strtoull(sarg, NULL, 10) : 0;
|
||
|
size_t end = eflag? strtoull(earg, NULL, 10) : chunk;
|
||
|
|
||
|
float* buffer = aligned_alloc(0x40, chunk * sizeof(float));
|
||
|
size_t rd;
|
||
|
|
||
|
if (buffer == NULL)
|
||
|
err(1, "malloc()");
|
||
|
|
||
|
while ((rd = fread(buffer, sizeof(float), chunk, stdin))) {
|
||
|
float min = buffer[start];
|
||
|
float max = buffer[start];
|
||
|
|
||
|
for (size_t i = start; i < MIN(rd, end); ++i) {
|
||
|
min = MIN(min, buffer[i]);
|
||
|
max = MAX(max, buffer[i]);
|
||
|
}
|
||
|
|
||
|
for (size_t i = start; i < MIN(rd, end); ++i) {
|
||
|
buffer[i] = mul * (buffer[i] - min) / (max - min);
|
||
|
}
|
||
|
|
||
|
fwrite(buffer, sizeof(float), rd, stdout);
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|