const char * UsageLines [] = {
	"Usage: swsample (upsample factor) (downsample factor)",
	"Reads two-byte samples from standard input.",
	"Writes resampled version to standard output.",
	"The two factors must be integers > 0.",
	"The samples are not changed, simply repeated 0 or more times per",
	"the specified ratio.  Filtering may be needed after upsampling.",
	"May 16, 2011.  Newest is at gopher -p users/julianbr sdf.org",
	};
const int NumUsageLines = sizeof (UsageLines)/sizeof (UsageLines [0] );

#include <stdio.h>
#define SampleSize 2


void Sample (unsigned long int up, unsigned long int down)
	{
	unsigned long int remainder;
	unsigned char sample [SampleSize];

	remainder = down/2;
	while (fread (sample, sizeof (sample), 1, stdin) == 1) {
		remainder += up;
		while (remainder >= down) {
			fwrite (sample, sizeof (sample), 1, stdout);
			remainder -= down;
			}
		}
	}


int main (int argc, char * argv [] )
	{
	unsigned long int up, down;
	int i, ok;
	char c;

	if (argc < 2) {
		for (i = 0; i < NumUsageLines; i++)
			printf ("%s\n", UsageLines [i] );
		}
	else if (argc == 3) {
		ok = 1;
		if (sscanf (argv [1], "%lu%c", & up, & c) != 1
					|| up < 1) {
			fprintf (stderr, "***swsample: Expecting number > 0");
			fprintf (stderr, " for upsample factor, found");
			fprintf (stderr, " \"%s\".\n", argv [1] );
			ok = 0;
			}
		if (sscanf (argv [2], "%lu%c", & down, & c) != 1
					|| down < 1) {
			fprintf (stderr, "***swsample: Expecting number > 0");
			fprintf (stderr, " for upsample factor, found");
			fprintf (stderr, " \"%s\".\n", argv [2] );
			ok = 0;
			}
		if (ok)
			Sample (up, down);
		}
	else {
		fprintf (stderr, "Usage: swsample");
		fprintf (stderr, " (upsample factor) (downsample factor)\n");
		}
	return 0;
	}