char* stacktrace_resolve( void** trace, unsigned int max_depth, unsigned int skip_frames )
{
	char** lines;
	char* resolved;

	_initialize_symbol_resolve();
	
	if( !max_depth )
		max_depth = BUILD_SIZE_STACKTRACE_DEPTH;
	if( max_depth + skip_frames > BUILD_SIZE_STACKTRACE_DEPTH )
		max_depth = BUILD_SIZE_STACKTRACE_DEPTH - skip_frames;

	lines = _resolve_stack_frames( trace + skip_frames, max_depth );

	resolved = string_merge( (const char* const*)lines, array_size( lines ), "\n" );

	string_array_deallocate( lines );

	return resolved;
}
// are we _displaying_ preferences or saving them?
static void
handle_simple_preferences(gboolean display)
{
    rc_parse_item * parse_item;

    for (parse_item = parsable_items;
         parse_item->option;
         parse_item++) {

//        printf("%s '%s' ...\n",display ? "Populating" : "Storing", parse_item->option);

        // skip missing variables
        if (!parse_item->variable) continue;

        switch (parse_item->vartype) {
            case RC_TYPE_BOOLEAN:
            {
                gboolean * value = (gboolean*)parse_item->variable;
                GtkWidget * button;
                char *name = string_merge(parse_item->option,"_checkbutton");

                button = lookup_widget( GTK_WIDGET(preferences_window), name );
                if (display) {
                    gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(button),
                                                  (*value == false) ?
                                                    FALSE : TRUE );
                }
                else {
                    *value = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(button) );
                }

                if (name) free(name);
                break;
            }
            case RC_TYPE_INTEGER:
            {
                int * value = (int*)parse_item->variable;
                GtkWidget *spinner, *range;
                char *spin_name  = string_merge(parse_item->option,"_spinner");
                char *slide_name = string_merge(parse_item->option,"_slider");

                spinner = lookup_widget(GTK_WIDGET(preferences_window),
                                        spin_name );
                range = lookup_widget(GTK_WIDGET(preferences_window),
                                      slide_name);
                if (display) {
                    gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner),
                                              (gdouble)*value);
                    gtk_range_set_value(GTK_RANGE(range),
                                        (gdouble)*value);
                }
                else {
                    *value = (int) gtk_range_get_value(GTK_RANGE(range));
                }


                if (spin_name) free(spin_name);
                if (slide_name) free(slide_name);
                break;
            }
            case RC_TYPE_STRING:
            {
                // string combo boxes are not simple...
                break;
            }
            default:
            {
                printf("Unknown parseable vartype: %s:%d\n",
                       parse_item->option,parse_item->vartype);
                break;
            }
        }
    }
}
Beispiel #3
0
DECLARE_TEST( string, utility )
{
	{
		char* path1 = string_clone( "" );
		char* path2 = string_clone( "/" );
		char* path3 = string_clone( "/." );
		char* path4 = string_clone( "./" );
		char* path5 = string_clone( "./." );
		char* path6 = string_clone( "././" );
		char* path7 = string_clone( "././//" );
		char* path8 = string_clone( "././//./////././////.//////.//." );
		char* path9 = string_clone( "http://././//./////././////.//////.//." );
		char* path10 = string_clone( "" );
		char* path11 = string_clone( "\\" );
		char* path12 = string_clone( "/\\." );
		char* path13 = string_clone( ".\\/" );
		char* path14 = string_clone( "./\\." );
		char* path15 = string_clone( ".\\.//\\" );
		char* path16 = string_clone( ".\\.\\\\\\" );
		char* path17 = string_clone( ".\\.\\\\\\.\\\\////\\///\\\\.\\.\\\\\\\\\\.\\\\\\\\\\\\.\\\\." );
		char* path18 = string_clone( "http://\\.\\.\\\\\\.\\\\\\\\//\\.\\.\\\\\\\\//\\.\\\\\\\\\\\\.\\\\." );
		
		char* path19 = string_clone( "testing/path/ext" );
		char* path20 = string_clone( "testing/path/extend" );
		char* path21 = string_clone( "testing/path/extend/dyn" );
		char* path22 = string_clone( "testing/./\\\\/\\/./path/././//./extend/\\\\" );

		path1 = path_clean( path1, true );
		path2 = path_clean( path2, true );
		path3 = path_clean( path3, true );
		path4 = path_clean( path4, true );
		path5 = path_clean( path5, true );
		path6 = path_clean( path6, true );
		path7 = path_clean( path7, true );
		path8 = path_clean( path8, true );
		path9 = path_clean( path9, true );
		path10 = path_clean( path10, true );
		path11 = path_clean( path11, true );
		path12 = path_clean( path12, true );
		path13 = path_clean( path13, true );
		path14 = path_clean( path14, true );
		path15 = path_clean( path15, true );
		path16 = path_clean( path16, true );
		path17 = path_clean( path17, true );
		path18 = path_clean( path18, true );
		path19 = path_clean( path19, true );
		path20 = path_clean( path20, true );
		path21 = path_clean( path21, true );
		path22 = path_clean( path22, true );

		EXPECT_TRUE( string_equal( path1, "/" ) );
		EXPECT_TRUE( string_equal( path2, "/" ) );
		EXPECT_TRUE( string_equal( path3, "/" ) );
		EXPECT_TRUE( string_equal( path4, "/" ) );
		EXPECT_TRUE( string_equal( path5, "/" ) );
		EXPECT_TRUE( string_equal( path6, "/" ) );
		EXPECT_TRUE( string_equal( path7, "/" ) );
		EXPECT_TRUE( string_equal( path8, "/" ) );
		EXPECT_TRUE( string_equal( path9, "http://" ) );
		EXPECT_TRUE( string_equal( path10, "/" ) );
		EXPECT_TRUE( string_equal( path11, "/" ) );
		EXPECT_TRUE( string_equal( path12, "/" ) );
		EXPECT_TRUE( string_equal( path13, "/" ) );
		EXPECT_TRUE( string_equal( path14, "/" ) );
		EXPECT_TRUE( string_equal( path15, "/" ) );
		EXPECT_TRUE( string_equal( path16, "/" ) );
		EXPECT_TRUE( string_equal( path17, "/" ) );
		EXPECT_TRUE( string_equal( path18, "http://" ) );
		EXPECT_TRUE( string_equal( path19, "/testing/path/ext" ) );
		EXPECT_TRUE( string_equal( path20, "/testing/path/extend" ) );
		EXPECT_TRUE( string_equal( path21, "/testing/path/extend/dyn" ) );
		EXPECT_TRUE( string_equal( path22, "/testing/path/extend" ) );

		string_deallocate( path1 );
		string_deallocate( path2 );
		string_deallocate( path3 );
		string_deallocate( path4 );
		string_deallocate( path5 );
		string_deallocate( path6 );
		string_deallocate( path7 );
		string_deallocate( path8 );
		string_deallocate( path9 );
		string_deallocate( path10 );
		string_deallocate( path11 );
		string_deallocate( path12 );
		string_deallocate( path13 );
		string_deallocate( path14 );
		string_deallocate( path15 );
		string_deallocate( path16 );
		string_deallocate( path17 );
		string_deallocate( path18 );
		string_deallocate( path19 );
		string_deallocate( path20 );
		string_deallocate( path21 );
		string_deallocate( path22 );
	}
	{
		char** explodearr = 0;
		char* explodestr = string_clone( "  .,testing,    .,utility.,string  methods ..., like,,,finds  split..merge     .,.explode.and. .., ., similar   .,,,. " );
		
		char* mergestr = string_clone( "    testing   merge string   " );
		char* mergestr2 = string_clone( " ., testing, .merge.string,. " );
		char* merged = 0;
		char** mergearr, **mergearr2, **mergearr3;

		char* splitstr = string_clone( " testing split" );
		char* splitright = 0, *splitleft = 0;
		char* splitright2 = 0, *splitleft2 = 0;

		char* substrtest = string_clone( "testing substr" );
		char* substr = 0;
		
		explodearr = string_explode( explodestr, " ,.", false );
		mergearr = string_explode( mergestr, " .,", true );
		mergearr2 = string_explode( mergestr, " .,", false );
		mergearr3 = string_explode( mergestr, " .,", true );
		merged = string_merge( (const char* const*)mergearr, array_size( mergearr ), " " );

		string_split( splitstr, " ", &splitleft, &splitright, false );
		string_split( splitstr, " ", &splitleft2, &splitright2, true );
		
		EXPECT_EQ( array_size( explodearr ), 11 );
		EXPECT_TRUE( string_equal( explodearr[0], "testing" ) );
		EXPECT_TRUE( string_equal( explodearr[1], "utility" ) );
		EXPECT_TRUE( string_equal( explodearr[2], "string" ) );
		EXPECT_TRUE( string_equal( explodearr[3], "methods" ) );
		EXPECT_TRUE( string_equal( explodearr[4], "like" ) );
		EXPECT_TRUE( string_equal( explodearr[5], "finds" ) );
		EXPECT_TRUE( string_equal( explodearr[6], "split" ) );
		EXPECT_TRUE( string_equal( explodearr[7], "merge" ) );
		EXPECT_TRUE( string_equal( explodearr[8], "explode" ) );
		EXPECT_TRUE( string_equal( explodearr[9], "and" ) );
		EXPECT_TRUE( string_equal( explodearr[10], "similar" ) );

		EXPECT_EQ( array_size( mergearr ), 12 );
		EXPECT_TRUE( string_equal( mergearr[0], "" ) );
		EXPECT_TRUE( string_equal( mergearr[1], "" ) );
		EXPECT_TRUE( string_equal( mergearr[2], "" ) );
		EXPECT_TRUE( string_equal( mergearr[3], "" ) );
		EXPECT_TRUE( string_equal( mergearr[4], "testing" ) );
		EXPECT_TRUE( string_equal( mergearr[5], "" ) );
		EXPECT_TRUE( string_equal( mergearr[6], "" ) );
		EXPECT_TRUE( string_equal( mergearr[7], "merge" ) );
		EXPECT_TRUE( string_equal( mergearr[8], "string" ) );
		EXPECT_TRUE( string_equal( mergearr[9], "" ) );
		EXPECT_TRUE( string_equal( mergearr[10], "" ) );
		EXPECT_TRUE( string_equal( mergearr[11], "" ) );

		EXPECT_EQ( array_size( mergearr2 ), 3 );
		EXPECT_TRUE( string_equal( mergearr2[0], "testing" ) );
		EXPECT_TRUE( string_equal( mergearr2[1], "merge" ) );
		EXPECT_TRUE( string_equal( mergearr2[2], "string" ) );
		EXPECT_TRUE( string_equal( merged, mergestr ) );

		EXPECT_EQ( array_size( mergearr3 ), 12 );
		EXPECT_TRUE( string_equal( mergearr3[0], "" ) );
		EXPECT_TRUE( string_equal( mergearr3[1], "" ) );
		EXPECT_TRUE( string_equal( mergearr3[2], "" ) );
		EXPECT_TRUE( string_equal( mergearr3[3], "" ) );
		EXPECT_TRUE( string_equal( mergearr3[4], "testing" ) );
		EXPECT_TRUE( string_equal( mergearr3[5], "" ) );
		EXPECT_TRUE( string_equal( mergearr3[6], "" ) );
		EXPECT_TRUE( string_equal( mergearr3[7], "merge" ) );
		EXPECT_TRUE( string_equal( mergearr3[8], "string" ) );
		EXPECT_TRUE( string_equal( mergearr3[9], "" ) );
		EXPECT_TRUE( string_equal( mergearr3[10], "" ) );
		EXPECT_TRUE( string_equal( mergearr3[11], "" ) );

		EXPECT_TRUE( string_equal( substr = string_substr( substrtest, 0, 4 ), "test" ) ); string_deallocate( substr );
		EXPECT_TRUE( string_equal( substr = string_substr( substrtest, 0, 14 ), "testing substr" ) ); string_deallocate( substr );
		EXPECT_TRUE( string_equal( substr = string_substr( substrtest, 0, 20 ), "testing substr" ) ); string_deallocate( substr );
		EXPECT_TRUE( string_equal( substr = string_substr( substrtest, 3, 20 ), "ting substr" ) ); string_deallocate( substr );
		EXPECT_TRUE( string_equal( substr = string_substr( substrtest, 3, 11 ), "ting substr" ) ); string_deallocate( substr );
		EXPECT_TRUE( string_equal( substr = string_substr( substrtest, 3, 1 ), "t" ) ); string_deallocate( substr );
		EXPECT_TRUE( string_equal( substr = string_substr( substrtest, 3, 0 ), "" ) ); string_deallocate( substr );
		EXPECT_TRUE( string_equal( substr = string_substr( substrtest, 20, 0 ), "" ) ); string_deallocate( substr );
		EXPECT_TRUE( string_equal( substr = string_substr( substrtest, 20, 20 ), "" ) ); string_deallocate( substr );

		EXPECT_TRUE( string_equal( splitleft, "testing" ) );
		EXPECT_TRUE( string_equal( splitright, "split" ) );
		EXPECT_TRUE( string_equal( splitleft2, "" ) );
		EXPECT_TRUE( string_equal( splitright2, "testing split" ) );
		{
			char* replacestr = string_clone( "testing replace" );
			char* replacestr2 = string_clone( "testing replace" );
			char* replacestr3 = string_clone( "testing replacelace" );
			char* replacestr4 = string_clone( "" );
			char* replacestr5 = string_clone( "repppppppppp" );

			replacestr = string_replace( replacestr, "rep", "testrep", false );
			replacestr2 = string_replace( replacestr2, "rep", "testrep", true );
			replacestr3 = string_replace( replacestr3, "replace", "testrep", true );
			replacestr4 = string_replace( replacestr4, "foo", "bar", true );
			replacestr5 = string_replace( replacestr5, "rep", "re", true );
		
			EXPECT_TRUE( string_equal( replacestr, "testing testreplace" ) );
			EXPECT_TRUE( string_equal( replacestr2, "testing testreplace" ) );
			EXPECT_TRUE( string_equal( replacestr3, "testing testtestrep" ) );
			EXPECT_TRUE( string_equal( replacestr4, "" ) );
			EXPECT_TRUE( string_equal( replacestr5, "re" ) );

			string_deallocate( replacestr );
			string_deallocate( replacestr2 );
			string_deallocate( replacestr3 );
			string_deallocate( replacestr4 );
			string_deallocate( replacestr5 );
		}
		{
			char* stripstr = string_clone( "   testing strip :   " );
			char* stripstr2 = string_clone( "   testing strip :   " );
			char* stripstr3 = string_clone( "   testing strip :   " );

			stripstr = string_strip( stripstr, " tp:   " );
			stripstr2 = string_strip( stripstr2, "" );
			stripstr3 = string_strip( stripstr3, " tesingrp:" );
		
			EXPECT_TRUE( string_equal( stripstr, "esting stri" ) );
			EXPECT_TRUE( string_equal( stripstr2, "   testing strip :   " ) );
			EXPECT_TRUE( string_equal( stripstr3, "" ) );

			string_deallocate( stripstr );
			string_deallocate( stripstr2 );
			string_deallocate( stripstr3 );
		}
		string_array_deallocate( explodearr );
		string_deallocate( explodestr );
		
		string_deallocate( mergestr );
		string_deallocate( mergestr2 );
		string_deallocate( merged );
		string_array_deallocate( mergearr );
		string_array_deallocate( mergearr2 );
		string_array_deallocate( mergearr3 );

		string_deallocate( splitstr );
		string_deallocate( splitright );
		string_deallocate( splitleft );
		string_deallocate( splitright2 );
		string_deallocate( splitleft2 );

		string_deallocate( substrtest );
	}
	{
		#define SHORTSTRING "short"
		#define LONGSTRING  "long string with dynamic buffer storage but with no real useful data"
		char* clonestr = string_clone( "" );
		char* clonestr2 = string_clone( SHORTSTRING );
		char* clonestr3 = string_clone( LONGSTRING );

		char* teststr = string_clone( clonestr );
		char* teststr2 = string_clone( clonestr2 );
		char* teststr3 = string_clone( clonestr3 );

		char* concatstr = string_concat( clonestr, teststr );
		char* concatstr2 = string_concat( clonestr, teststr2 );
		char* concatstr3 = string_concat( teststr2, clonestr );
		char* concatstr4 = string_concat( clonestr2, teststr2 );
		char* concatstr5 = string_concat( clonestr, teststr3 );
		char* concatstr6 = string_concat( teststr3, clonestr );
		char* concatstr7 = string_concat( clonestr2, teststr3 );
		char* concatstr8 = string_concat( teststr3, clonestr2 );
		char* concatstr9 = string_concat( clonestr3, teststr3 );
		char* concatstr10 = string_concat( teststr3, clonestr3 );
		
		EXPECT_NE( teststr, clonestr );
		EXPECT_TRUE( string_equal( teststr, clonestr ) );
		
		EXPECT_NE( teststr2, clonestr2 );
		EXPECT_TRUE( string_equal( teststr2, clonestr2 ) );

		EXPECT_NE( teststr3, clonestr3 );
		EXPECT_TRUE( string_equal( teststr3, clonestr3 ) );

		EXPECT_TRUE( string_equal( concatstr, "" ) );
		EXPECT_TRUE( string_equal( concatstr2, SHORTSTRING ) );
		EXPECT_TRUE( string_equal( concatstr3, SHORTSTRING ) );
		EXPECT_TRUE( string_equal( concatstr4, SHORTSTRING SHORTSTRING ) );
		EXPECT_TRUE( string_equal( concatstr5, LONGSTRING ) );
		EXPECT_TRUE( string_equal( concatstr6, LONGSTRING ) );
		EXPECT_TRUE( string_equal( concatstr7, SHORTSTRING LONGSTRING ) );
		EXPECT_TRUE( string_equal( concatstr8, LONGSTRING SHORTSTRING ) );
		EXPECT_TRUE( string_equal( concatstr9, LONGSTRING LONGSTRING ) );
		EXPECT_TRUE( string_equal( concatstr10, LONGSTRING LONGSTRING ) );
		
		string_deallocate( teststr );
		string_deallocate( clonestr );
		string_deallocate( teststr2 );
		string_deallocate( clonestr2 );
		string_deallocate( teststr3 );
		string_deallocate( clonestr3 );
		string_deallocate( concatstr );
		string_deallocate( concatstr2 );
		string_deallocate( concatstr3 );
		string_deallocate( concatstr4 );
		string_deallocate( concatstr5 );
		string_deallocate( concatstr6 );
		string_deallocate( concatstr7 );
		string_deallocate( concatstr8 );
		string_deallocate( concatstr9 );
		string_deallocate( concatstr10 );
		#undef SHORTSTRING
		#undef LONGSTRING
	}
	return 0;
}