Introduced own scripted test framework to replace fct.h and reduce
compile time

The new test framework generates a data file parsing engine plus the
templated function code. In order to 'understand' defines, during
the generation phase, a mapping is made to check for dependencies and
result code mappings.
diff --git a/tests/suites/helpers.function b/tests/suites/helpers.function
index 66af8af..881a0ac 100644
--- a/tests/suites/helpers.function
+++ b/tests/suites/helpers.function
@@ -9,6 +9,10 @@
 #include <inttypes.h>
 #endif
 
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
 /*
  * 32-bit integer manipulation macros (big endian)
  */
diff --git a/tests/suites/main_test.function b/tests/suites/main_test.function
new file mode 100644
index 0000000..ca2e252
--- /dev/null
+++ b/tests/suites/main_test.function
@@ -0,0 +1,283 @@
+#include <stdio.h>
+#include <string.h>
+
+static int test_errors = 0;
+
+static int test_assert( int correct, char *test )
+{
+    if( correct )
+        return( 0 );
+
+    test_errors++;
+//    if( test_errors == 1 )
+        printf( "FAILED\n  %s\n\n", test );
+
+    return( 1 );
+}
+
+#define TEST_ASSERT( TEST ) (test_assert((TEST) ? 1 : 0, #TEST))
+
+int verify_string( char **str )
+{
+    if( (*str)[0] != '"' ||
+        (*str)[strlen( *str ) - 1] != '"' )
+    {
+        printf( "Expected string (with \"\") for parameter and got: %s\n", *str );
+        return( -1 );
+    }
+
+    (*str)++;
+    (*str)[strlen( *str ) - 1] = '\0';
+
+    return( 0 );
+}
+
+int verify_int( char *str, int *value )
+{
+    size_t i;
+    int minus = 0;
+    int digits = 1;
+    int hex = 0;
+
+    for( i = 0; i < strlen( str ); i++ )
+    {
+        if( i == 0 && str[i] == '-' )
+        {
+            minus = 1;
+            continue;
+        }
+
+        if( ( ( minus && i == 2 ) || ( !minus && i == 1 ) ) &&
+            str[i - 1] == '0' && str[i] == 'x' )
+        {
+            hex = 1;
+            continue;
+        }
+
+        if( str[i] < '0' || str[i] > '9' )
+        {
+            digits = 0;
+            break;
+        }
+    }
+
+    if( digits )
+    {
+        if( hex )
+            *value = strtol( str, NULL, 16 );
+        else
+            *value = strtol( str, NULL, 10 );
+
+        return( 0 );
+    }
+
+MAPPING_CODE
+
+    printf( "Expected integer for parameter and got: %s\n", str );
+    return( -1 );
+}
+
+int dep_check( char *str )
+{
+    if( str == NULL )
+        return( 1 );
+
+DEP_CHECK_CODE
+
+    return( 1 );
+}
+
+FUNCTION_CODE
+int dispatch_test(int cnt, char *params[50])
+{
+    int ret;
+
+DISPATCH_FUNCTION
+    {
+        fprintf( stdout, "FAILED\nSkipping unknown test function '%s'\n", params[0] );
+        fflush( stdout );
+        return( 1 );
+    }
+
+    return( ret );
+}
+
+int get_line( FILE *f, char *buf, size_t len )
+{
+    char *ret;
+
+    ret = fgets( buf, len, f );
+    if( ret == NULL )
+        return( -1 );
+
+    if( strlen( buf ) && buf[strlen(buf) - 1] == '\n' )
+        buf[strlen(buf) - 1] = '\0';
+    if( strlen( buf ) && buf[strlen(buf) - 1] == '\r' )
+        buf[strlen(buf) - 1] = '\0';
+
+    return( 0 );
+}
+
+int parse_arguments( char *buf, size_t len, char *params[50] )
+{
+    int cnt = 0, i;
+    char *cur = buf;
+    char *p = buf, *q;
+
+    params[cnt++] = cur;
+
+    while( *p != '\0' && p < buf + len )
+    {
+        if( *p == '\\' )
+        {
+           *p++;
+           *p++;
+            continue;
+        }
+        if( *p == ':' )
+        {
+            if( p + 1 < buf + len )
+            {
+                cur = p + 1;
+                params[cnt++] = cur;
+            }
+            *p = '\0';
+        }
+
+        *p++;
+    }
+
+    // Replace newlines, question marks and colons in strings
+    for( i = 0; i < cnt; i++ )
+    {
+        p = params[i];
+        q = params[i];
+
+        while( *p != '\0' )
+        {
+            if( *p == '\\' && *(p + 1) == 'n' )
+            {
+                p += 2;
+                *(q++) = '\n';
+            }
+            else if( *p == '\\' && *(p + 1) == ':' )
+            {
+                p += 2;
+                *(q++) = ':';
+            }
+            else if( *p == '\\' && *(p + 1) == '?' )
+            {
+                p += 2;
+                *(q++) = '?';
+            }
+            else
+                *(q++) = *(p++);
+        }
+        *q = '\0';
+    }
+
+    return( cnt );
+}
+
+int main()
+{
+    int ret, i, cnt, total_errors = 0, total_tests = 0, total_skipped = 0;
+    const char *filename = "TEST_FILENAME";
+    FILE *file;
+    char buf[5000];
+    char *params[50];
+
+#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C)
+    unsigned char buf[1000000];
+    memory_buffer_alloc_init( buf, sizeof(buf) );
+#endif
+
+    file = fopen( filename, "r" );
+    if( file == NULL )
+    {
+        fprintf( stderr, "Failed to open\n" );
+        return( 1 );
+    }
+
+    while( !feof( file ) )
+    {
+        int skip = 0;
+
+        if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
+            break;
+        fprintf( stdout, "%.66s", buf );
+        fprintf( stdout, " " );
+        for( i = strlen( buf ) + 1; i < 67; i++ )
+            fprintf( stdout, "." );
+        fprintf( stdout, " " );
+        fflush( stdout );
+
+        total_tests++;
+
+        if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
+            break;
+        cnt = parse_arguments( buf, strlen(buf), params );
+
+        if( strcmp( params[0], "depends_on" ) == 0 )
+        {
+            for( i = 1; i < cnt; i++ )
+                if( dep_check( params[i] ) != 0 )
+                    skip = 1;
+
+            if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
+                break;
+            cnt = parse_arguments( buf, strlen(buf), params );
+        }
+
+        if( skip == 0 )
+        {
+            test_errors = 0;
+            ret = dispatch_test( cnt, params );
+        }
+
+        if( skip == 1 || ret == 3 )
+        {
+            total_skipped++;
+            fprintf( stdout, "-------\n" );
+            fflush( stdout );
+        }
+        else if( ret == 0  && test_errors == 0 )
+        {
+            fprintf( stdout, "PASS\n" );
+            fflush( stdout );
+        }
+        else if( ret == 2 )
+        {
+            fprintf( stderr, "FAILED: FATAL PARSE ERROR\n" );
+            fclose(file);
+            exit( 2 );
+        }
+        else
+            total_errors++;
+
+        if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
+            break;
+        if( strlen(buf) != 0 )
+        {
+            fprintf( stderr, "Should be empty %d\n", strlen(buf) );
+            return( 1 );
+        }
+    }
+    fclose(file);
+
+    fprintf( stdout, "\n----------------------------------------------------------------------------\n\n");
+    if( total_errors == 0 )
+        fprintf( stdout, "PASSED" );
+    else
+        fprintf( stdout, "FAILED" );
+
+    fprintf( stdout, " (%d / %d tests (%d skipped))\n",
+             total_tests - total_errors, total_tests, total_skipped );
+
+#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && defined(POLARSSL_MEMORY_DEBUG)
+    memory_buffer_alloc_status();
+#endif
+
+    return( total_errors != 0 );
+}
+