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

#define NAME "isprime 0.1b"

/* isprime(int n) -- find out if n is prime.
 * returns: positive number (divisible by) if not prime or 0 if prime.
 */
int isprime(int n)
{
	int t, i;	/* check up to t, counter */
	
	if(n == 0 || n == 1 || n == 2){
		/* prime */
		return 0;
	}

	/* we only need do check up to the square root of the number + 1 */
	t = (int) sqrt(n) + 1;

	for(i = 2; i < t; i++){
		if(n % i == 0){
			/* divisible by i */
			return i;
		}
	}

	/* prime */
	return 0;
}

/* help(pname) -- display help information */
void help(char *pname)
{
	printf("%s\n\n", NAME);
	printf("Usage: %s [options] NUMBER\n", pname);
	printf("Test to see if NUMBER is prime.\n");
	printf("Returns 0 if prime, or a positive number which of NUMBER is divisible by.\n\n");
	printf("Options\n");
	printf("-s\t\tSilent mode. Output nothing, just return result.\n");
	printf("\n-h\t\tDisplay this help information and exit.\n\n");
}

int main(int argc, char *argv[])
{
	int n, r;	/* number to check, result of isprime() */

	char *pname;	/* saved program name */

	/* options */
	int silent = 0;	/* silent mode? (no output) */

	pname = argv[0];
	argv++;

	if(argc < 2){
		fprintf(stderr, "%s: I've got no number to check!\n", pname);
		help(pname);
		exit(1);
	}

	for(; argc > 1 && argv[0][0] == '-'; argc--, argv++){
		switch(argv[0][1]){
			case 's':
				/* silent mode */
				silent = 1;
				break;
			case 'h':
				/* help message */
				help(pname);
				exit(0);
				break;
			default:
				fprintf(stderr, "%s: Err: Invalid option '%c'.\n", pname, argv[0][1]);
				exit(1);
				break;
		}
	}

	sscanf(argv[0], "%d", &n);

	r = isprime(n);

	if(r != 0){
		if(!silent){
			printf("%d is NOT prime, it is divisible by %d.\n", n, r);
		}
		return r;
	}
	
	if(!silent){
		printf("%d IS prime.\n", n);
	}
	return 0;
}
