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; } } } }
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; }