#include <stdio.h>
#include <string.h>
#include <ctype.h>

int
password_validate(const char *pass)
{
    int upper = 0, lower = 0, digit = 0;
    if (pass == NULL || strlen(pass) == 0)
        return -1;

    printf("checking password: ");
    do
    {
    	printf("%c", *pass);
        if (isupper(*pass))
            upper = 1;
        if (islower(*pass))
            lower = 1;
        if (isdigit(*pass))
            digit = 1;
    } while ((!lower || !upper || !digit) && *(++pass));
    printf("\n");
    return (*pass != '\0' ? 0 : (upper == 0 ? -2 : (lower == 0 ? -3 : -4)));
}

int main(void) {
	int err;
	const char *pass = "Password";
	err = password_validate(pass);
	printf("[1][%d]\n", err);
	
	pass = "Pass678word";
	err = password_validate(pass);
	printf("[2][%d]\n", err);
	
	pass = "password1";
	err = password_validate(pass);
	printf("[3][%d]\n", err);
	
	pass = "1password";
	err = password_validate(pass);
	printf("[4][%d]\n", err);

    pass = "Password1";
	err = password_validate(pass);
	printf("[5][%d]\n", err);
	
	pass = "password1D";
	err = password_validate(pass);
	printf("[6][%d]\n", err);
	
	pass = "pAssword1";
	err = password_validate(pass);
	printf("[7][%d]\n", err);
	
	pass = "1Password";
	err = password_validate(pass);
	printf("[8][%d]\n", err);

	pass = "aA1";
	err = password_validate(pass);
	printf("[9][%d]\n", err);
	
	// expected to check "a" and return -2 due to no uppercase.
	// ends up checking "aa" and returns 0.
	pass = "aa";
	err = password_validate(pass);
	printf("[10][%d]\n", err); 
	
	// expected to only check "hi1" and return -2
	// ends up checking "hi1N" and returns 0.
	pass = "hi1NOTINCLUDED";
	err = password_validate(pass);
	printf("[11][%d]\n", err);

	return 0;
}
