/****************************************************************************** * * Copyright (c) 2017-2019 by Löwenware Ltd * Please, refer LICENSE file for legal information * ******************************************************************************/ /** * @file validate.c * @author Ilja Kartašov * @brief Validation component source file * * @see https://lowenware.com/aisl/ */ #include #include #include #include "validate.h" int aislx_validate_email(const char *value) { const char *at = NULL, *dot = NULL, *i = value; char c; while ( (c = *i) != 0 ) { switch(c) { case '@': if (at || i == value) break; at = i++; dot = NULL; continue; case '"': case '(': case ')': case ',': case ';': case ':': case '<': case '>': case '[': case '\\': case ']': case ' ': /* These characters are allowed in double quotes only, but it is not * implemented in this validator, so we count them as forbidden */ break; case '!': case '#': case '$': case '%': case '&': case '\'': case '*': case '+': case '/': case '=': case '?': case '^': case '_': case '`': case '{': case '|': case '}': case '~': /* Allowed special local-part characters */ if (!at) { i++; continue; } break; case '-': /* Allowed characters */ i++; continue; case '.': if (dot && i == dot+1) break; if (at) { if (i == at+1 || *(i+1) == 0) break; } else { if (i == value || *(i+1) == '@') break; } dot = i++; continue; default: if ( isalnum(c) == 0 ) continue; break; } return (int)(i-value)+1; } if (!at || !dot) return -1; return 0; }