/* Tickler Code related to file operations. */

#include <stdio.h>  /* FILE, fopen(), fclose() */
						  /* printf(), fprintf() */
						  /* scanf(), fscanf() */
#include <stdlib.h> /* EXIT_SUCCESS, EXIT_FAILURE, exit() */
#include <limits.h> /* INT_MAX */
#include <math.h>   /* sin() */

#define FALSE (0)
#define TRUE  (!FALSE)

#define READ   (0)
#define WRITE  (1)

#define TEXT   (0)
#define BINARY (1)

#define PI (3.141592654)

#define FREQUENCY (1.0)
#define SAMPLESperSEC (20.0)
#define SAMPLES   (20)

FILE *OpenFile(char *filename, int mode, int type)
{
	char modestr[3];

	switch (mode)
	{
		case READ : modestr[0] = 'r'; break;
		case WRITE: modestr[0] = 'w'; break;
	}

	switch (type)
	{
		case TEXT  : modestr[1] = 't'; break;
		case BINARY: modestr[1] = 'b'; break;
	}

	modestr[2] = '\0';

	return fopen(filename, modestr);
}

int main(void)
{
	FILE *fp, *fp2;
	char *filename;
	double freq_Hz;
	int v;
	double time, value;
	long int pos;
	long int sample;

	filename = "sine.txt";
	if (NULL == (fp = OpenFile(filename, WRITE, TEXT)))
	{
		printf("Failed to open file <%s>\n", filename);
		exit(EXIT_FAILURE);
	}

	/* WRITING SINUSOID TO TEXT FILE */
	freq_Hz = FREQUENCY;

	for (sample = 0; sample < SAMPLES; sample++)
	{
		time = (double) sample / SAMPLESperSEC;
		value = sin(2.0*PI*freq_Hz*time);
		v = INT_MAX * value;
		fprintf(fp, "%i\n", v);
	}

	fclose(fp);

	filename = "sine.txt";
	if (NULL == (fp = OpenFile(filename, READ, TEXT)))
	{
		printf("Failed to open file <%s>\n",filename);
		exit(EXIT_FAILURE);
	}

	filename = "sine.bin";
	if (NULL == (fp2 = OpenFile(filename, WRITE, BINARY)))
	{
		printf("Failed to open file <%s>\n",filename);
		exit(EXIT_FAILURE);
	}

	if (1 == fscanf(fp, "%i", &v))
	{
		do
		{
			fwrite(&v, sizeof(int), 1, fp2);
		} while (1 == fscanf(fp, "%i", &v));
	}

	fclose(fp);
	fclose(fp2);

	filename = "sine.bin";
	if (NULL == (fp2 = OpenFile(filename, READ, BINARY)))
	{
		printf("Failed to open file <%s>\n",filename);
		exit(EXIT_FAILURE);
	}

	fseek(fp2, 0, SEEK_END);
	pos = ftell(fp2);
	printf("The file contains %li bytes.\n", pos);
	pos /= sizeof(int);
	printf("The file contains %li values.\n", pos);

	fseek(fp2, 0, SEEK_SET);
	for (sample = 0; sample < pos; sample++)
	{
		fread(&v, sizeof(int), 1, fp2);
		printf("Sample %04li: %+06i\n", sample, v);
	}

	fclose(fp2);

	return EXIT_SUCCESS;
}