/*
 * isvalidemailaddr.c
 * isvalidemailaddr
 *
 * Copyright (c) 2004-2005 Denis Defreyne
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * - Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 * 
 * - Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 * 
 * - The names of isvalidemailaddr's contributors may not be used to endorse or
 *   promote products derived from this software without specific prior
 *   written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * 
 * VERSION HISTORY:
 * 1.0   [2005-01-25]
 *     - initial release
 * 1.1   [2005-04-23]
 *     - isvalidemailaddr() is now known as isvalidemail()
 *     - two adjacent dots before the `@` sign is no longer considered invalid
 *     - miscellaneous tweaks
 */

#include "isvalidemailaddr.h"

inline int isvalidemail(char *email, uint8_t len)
{
	int i;
	int ats, dots;			/* number of @'s and .'s */
	int atloc;				/* loc of @ */
	int prevatloc;			/* location of previous @ */
	int prevdotloc;			/* location of previous . */
	int dotsafterat;		/* number of .'s after the @ */
	
	prevatloc = -1;
	prevdotloc = -1;
	atloc = -1;
	dotsafterat = 0;
	ats = dots = 0;
	
	for(i=0;i<len;i++)
	{
		if(email[i] == '@')
		{
			if(i == 0 || i == len-1)
			{
				return -1;
			}
			if(i == prevatloc + 1)
			{
				return -1;
			}
			prevatloc = i;
			atloc = i;
			ats++;
			if(ats > 1)
			{
				return -1;
			}
		}
		else if(email[i] == '.')
		{
			if(i == len-1)
			{
				return -1;
			}
			if(i == prevdotloc + 1)
			{
				if(ats != 0)
				{
					return -1;
				}
			}
			if(ats != 0)
			{
				dotsafterat++;
			}
			prevdotloc = i;
			dots++;
		}
		else if(email[i] == ' ')
		{
			return -1;
		}
	}
	if(ats == 0)
	{
		return -1;
	}
	if(dots == 0)
	{
		return -1;
	}
	if(dotsafterat == 0)
	{
		return -1;
	}
	
	return 0;
}
