Changeset 222b440 for lib


Ignore:
Timestamp:
2012-06-05T20:19:56Z (7 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
15581c1
Parents:
d219296
Message:

Add xt_to_string_i() and use it to get indentation back in saved settings.
Also, use it in xt_print() instead of replicating most of xt_to_string()
in it. This changed four-space indents into tabs but oh well, we'll live.

Location:
lib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • lib/xmltree.c

    rd219296 r222b440  
    277277}
    278278
    279 static void xt_to_string_real( struct xt_node *node, GString *str )
     279static void xt_to_string_real( struct xt_node *node, GString *str, int indent )
    280280{
    281281        char *buf;
     
    283283        int i;
    284284       
     285        if( indent > 1 )
     286                g_string_append_len( str, "\n\t\t\t\t\t\t\t\t",
     287                                     indent < 8 ? indent : 8 );
     288       
    285289        g_string_append_printf( str, "<%s", node->name );
    286290       
     
    307311       
    308312        for( c = node->children; c; c = c->next )
    309                 xt_to_string_real( c, str );
     313                xt_to_string_real( c, str, indent ? indent + 1 : 0 );
     314       
     315        if( indent > 0 && node->children )
     316                g_string_append_len( str, "\n\t\t\t\t\t\t\t\t",
     317                                     indent < 8 ? indent : 8 );
    310318       
    311319        g_string_append_printf( str, "</%s>", node->name );
     
    315323{
    316324        GString *ret;
    317         char *real;
    318325       
    319326        ret = g_string_new( "" );
    320         xt_to_string_real( node, ret );
    321        
    322         real = ret->str;
    323         g_string_free( ret, FALSE );
    324        
    325         return real;
     327        xt_to_string_real( node, ret, 0 );
     328        return g_string_free( ret, FALSE );
     329}
     330
     331/* WITH indentation! */
     332char *xt_to_string_i( struct xt_node *node )
     333{
     334        GString *ret;
     335       
     336        ret = g_string_new( "" );
     337        xt_to_string_real( node, ret, 1 );
     338        return g_string_free( ret, FALSE );
    326339}
    327340
    328341void xt_print( struct xt_node *node )
    329342{
    330         int i;
    331         struct xt_node *c;
    332        
    333         /* Indentation */
    334         for( c = node; c->parent; c = c->parent )
    335                 fprintf( stderr, "    " );
    336        
    337         /* Start the tag */
    338         fprintf( stderr, "<%s", node->name );
    339        
    340         /* Print the attributes */
    341         for( i = 0; node->attr[i].key; i ++ )
    342         {
    343                 char *v = g_markup_escape_text( node->attr[i].value, -1 );
    344                 fprintf( stderr, " %s=\"%s\"", node->attr[i].key, v );
    345                 g_free( v );
    346         }
    347        
    348         /* /> in case there's really *nothing* inside this tag, otherwise
    349            just >. */
    350         /* If this tag doesn't have any content at all... */
    351         if( node->text == NULL && node->children == NULL )
    352         {
    353                 fprintf( stderr, "/>\n" );
    354                 return;
    355                 /* Then we're finished! */
    356         }
    357        
    358         /* Otherwise... */
    359         fprintf( stderr, ">" );
    360        
    361         /* Only print the text if it contains more than whitespace (TEST). */
    362         if( node->text_len > 0 )
    363         {
    364                 for( i = 0; node->text[i] && isspace( node->text[i] ); i ++ );
    365                 if( node->text[i] )
    366                 {
    367                         char *v = g_markup_escape_text( node->text, -1 );
    368                         fprintf( stderr, "%s", v );
    369                         g_free( v );
    370                 }
    371         }
    372        
    373         if( node->children )
    374                 fprintf( stderr, "\n" );
    375        
    376         for( c = node->children; c; c = c->next )
    377                 xt_print( c );
    378        
    379         if( node->children )
    380                 for( c = node; c->parent; c = c->parent )
    381                         fprintf( stderr, "    " );
    382        
    383         /* Non-empty tag is now finished. */
    384         fprintf( stderr, "</%s>\n", node->name );
     343        char *str = xt_to_string_i( node );
     344        fprintf( stderr, "%s", str );
     345        g_free( str );
    385346}
    386347
  • lib/xmltree.h

    rd219296 r222b440  
    8484struct xt_node *xt_from_string( const char *in );
    8585char *xt_to_string( struct xt_node *node );
     86char *xt_to_string_i( struct xt_node *node );
    8687void xt_print( struct xt_node *node );
    8788struct xt_node *xt_dup( struct xt_node *node );
Note: See TracChangeset for help on using the changeset viewer.