#include #include void main(int argc, char *argv[]){ double f, Δ, s, e, exp; vlong u, a, n; uchar *b = nil; switch(argc){ default: sysfatal("usage: %s [startamp [endamp [exponent]]]", argv[0]); case 1: s = 1.0; e = 0.0; exp = 1.0; break; case 2: s = e = atof(argv[1]); exp = 1.0; break; case 3: s = atof(argv[1]); e = atof(argv[2]); exp = 1.0; break; case 4: s = atof(argv[1]); e = atof(argv[2]); exp = atof(argv[3]); break; } a = u = 0; while(9){ if(a - u < 1024UL){ b = realloc(b, a += 0x100000UL); if(b == nil) sysfatal("realloc: %r"); } n = read(0, b + u, a - u); if(n < 1) break; u += n; } if(n) sysfatal("read: %r"); if(u & 3) sysfatal("read not a multiple of four bytes"); b = realloc(b, u); if(b == nil) sysfatal("realloc: %r"); Δ = e - s; e = u; for(n = 0; n < u; n += 4){ f = s + pow(n / e, exp) * Δ; a = (s16int)(b[n] | b[n | 1] << 8); a *= f; if(a < -0x8000) a = -0x8000; if(a > 0x7fff) a = 0x7fff; b[n] = a; b[n | 1] = a >> 8; a = (s16int)(b[n | 2] | b[n | 3] << 8); a *= f; if(a < -0x8000) a = -0x8000; if(a > 0x7fff) a = 0x7fff; b[n | 2] = a; b[n | 3] = a >> 8; } if(write(1, b, u) != u) sysfatal("write: %r"); exits(nil); }