/*
 * checkzero - programa para buscar bytes no nulos en un fichero
 *
 * Modo de uso: checkzero fichero
 *
 * Este programa lee el fichero dado por parámetro en la línea de comandos
 * byte a byte, cuenta la cantidad de bytes no nulos y presenta los
 * resultados en una estadística como la que sigue:
 * Número de bytes analizados: 4311982080
 * Número de bytes no nulos:          517
 * Primer byte no nulo:                23
 * Último byte no nulo:               600
 *
 * Mayo 2006, Miguel Angel Vilela [miguev.net]
 */

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char **argv) {
	int n;
	char buf;
	FILE *fd;
	double curr, nonz, first, last, total;
	if (argc < 2) {
		printf ("Modo de uso: %s fichero\n", argv[0]);
		exit (EXIT_FAILURE);
	}
	printf ("Analizando '%s'...\n", argv[1]);
	curr = nonz = last = total = 0;
	first = -1;
	fd = fopen (argv[1], "r");
	while (!feof (fd)) {
		n = fread (&buf, 1, 1, fd);
		if ((n != 1) && (!feof (fd))) {
			printf ("\rERROR leyendo el byte %d\n", curr);
			exit (EXIT_FAILURE);
		} else {
			curr += 1;
			total += 1;
			if (buf != '\0') {
				nonz += 1;
				last = curr;
				if (first == -1) {
					first = curr;
					printf ("Primer byte no nulo encontrado: %15g\n", first);
				}
			}
		}
	}
	fclose (fd);
	printf ("Fichero %s leido sin problemas\n", argv[1]);
	printf ("Número de bytes analizados: %15g\n", total);
	printf ("Número de bytes no nulos:   %15g (%13.10g %)\n", nonz, 100 * nonz / total);
	printf ("Primer byte no nulo:        %15g\n", first);
	printf ("Último byte no nulo:        %15g\n", last);
	exit (EXIT_SUCCESS);
	return 0;
}
