/*************************************************************** SVGC CSS TEST Exercise stylesheet inclusion and preservation of input text. ***************************************************************/ #include #include #include #include #include static int write_file( const char *path, const void *data, size_t length ) { FILE *fp; int status; fp = fopen( path, "wb" ); if( !fp ) return( 0 ); status = (fwrite( data, 1, length, fp ) == length); if( fclose( fp ) != 0 ) status = 0; return( status ); } static char * read_file( const char *path ) { FILE *fp; char *data; long length; fp = fopen( path, "rb" ); if( !fp ) return( NULL ); if( fseek( fp, 0L, SEEK_END ) != 0 ) goto failed; length = ftell( fp ); if( length < 0 ) goto failed; if( fseek( fp, 0L, SEEK_SET ) != 0 ) goto failed; if( (unsigned long)length >= (size_t)-1 ) goto failed; data = (char *)malloc( (size_t)length + 1 ); if( !data ) goto failed; if( fread( data, 1, (size_t)length, fp ) != (size_t)length ) { free( data ); goto failed; } data[length] = '\0'; fclose( fp ); return( data ); failed: fclose( fp ); return( NULL ); } int main( void ) { static const char css_text[] = "@font-face { font-family: 'Roboto';\n" " src: url('./fonts/Roboto/Roboto-Regular.woff2') format('woff2'); }\n" ".a::after { content: '\xD0\xAF ]]> test'; }\n"; static const char invalid_utf8[] = { (char)0xC0, (char)0x80 }; char large_css[10000]; static const char invalid_xml[] = { '.', 'a', '{', (char)0x01, '}' }; struct __svg_sheet *sheet; struct __svg_scene *scene = NULL; char *svg = NULL; char css_path[] = "svgc-test-css-XXXXXX"; char svg_path[] = "svgc-test-svg-XXXXXX"; int fd; int status = 1; fd = mkstemp( css_path ); if( fd < 0 ) return( 1 ); close( fd ); fd = mkstemp( svg_path ); if( fd < 0 ) { unlink( css_path ); return( 1 ); } close( fd ); sheet = (struct __svg_sheet *)__svg_new_sheet( 300, 200, 8, 8, 8, 8 ); if( !sheet ) goto done; scene = __svg_new_scene( sheet ); if( !scene ) goto done; if( __svg_sheet_add_css_file( NULL, css_path ) != -1 ) goto done; if( __svg_sheet_add_css_file( sheet, NULL ) != -1 ) goto done; if( __svg_sheet_add_css_file( sheet, "" ) != -1 ) goto done; if( __svg_sheet_add_css_file( sheet, "svgc-file-which-does-not-exist.css" ) != 0 ) goto done; if( !write_file( css_path, invalid_utf8, sizeof( invalid_utf8 ) ) ) goto done; if( __svg_sheet_add_css_file( sheet, css_path ) != 0 ) goto done; if( !write_file( css_path, invalid_xml, sizeof( invalid_xml ) ) ) goto done; if( __svg_sheet_add_css_file( sheet, css_path ) != 0 ) goto done; if( !write_file( css_path, css_text, sizeof( css_text ) - 1 ) ) goto done; if( __svg_sheet_add_css_file( sheet, css_path ) != 1 ) goto done; memset( large_css, 'a', sizeof( large_css ) ); memcpy( large_css, "/*", 2 ); memcpy( large_css + sizeof( large_css ) - 2, "*/", 2 ); if( !write_file( css_path, large_css, sizeof( large_css ) ) ) goto done; if( __svg_sheet_add_css_file( sheet, css_path ) != 1 ) goto done; if( !write_file( css_path, "replaced", 8 ) ) goto done; __svg_paint_scene( scene, 0, svg_path ); svg = read_file( svg_path ); if( !svg ) goto done; if( !strstr( svg, "\n" ) ) goto done; if( !strstr( svg, "*/\n ]]>\n " ) ) goto done; if( !strstr( svg, "/*aaaaaaaa" ) ) goto done; status = 0; done: if( status ) fprintf( stderr, "SVGC CSS regression failed\n" ); if( scene ) __svg_free_scene( scene ); free( svg ); unlink( css_path ); unlink( svg_path ); return( status ); }