====== Vollständiger Quelltext: XML ====== ===== Anleitung ===== Zu kompilieren mit gcc html.c ===== Download ====== * {{:c:tutorial:html.c|}} ===== Ansicht ===== #include #include #include struct Parameter { struct Parameter * Next; char * Name; char * Value; }; void parameter_delete( struct Parameter * toDelete ) { if( toDelete ) { printf( "-Parameter: %s\n", toDelete->Name ); free( toDelete->Name ); free( toDelete->Value ); free( toDelete ); } } struct Parameter * parameter_newWithLength( char const * name, unsigned int nameLength, char const * value, unsigned int valueLength ) { struct Parameter * result = malloc( sizeof( struct Parameter ) ); printf( "+Parameter: %*s\n", nameLength, name ); if( result ) { result->Next = NULL; result->Name = malloc( 1 + nameLength ); result->Value = malloc( 1 + valueLength ); if( result->Name && result->Value ) { memcpy( result->Name, name, nameLength ); result->Name[nameLength] = '\0'; memcpy( result->Value, value, valueLength ); result->Value[valueLength] = '\0'; return result; } /* Parameter konnte nicht angelegt werden */ parameter_delete( result ); } return NULL; } struct Parameter * parameter_new( char const * name, char const * value ) { return parameter_newWithLength( name, strlen( name ), value, strlen( value ) ); } struct Node { struct Node * Next; char * Text; // Falls es ein Textknoten, wie "proggen.org" ist. char * Name; // Name des Knotens struct Parameter * Parameter; // Parameter wie bei struct Node * SubNodes; // H1 ist der erste Subknoten von body. }; void node_delete( struct Node * toDelete ) { if( toDelete ) { struct Parameter *tempP, *p = toDelete->Parameter; struct Node *tempN, *n = toDelete->SubNodes; printf( "-%s: \"%s\"\n", ( toDelete->Name ) ? "Node" : "Text", ( toDelete->Name ) ? toDelete->Name : toDelete->Text ); free( toDelete->Name ); // Falls Name vorhanden, dann löschen free( toDelete->Text ); // Falls Text vorhanden, dann löschen // Parameter löschen while( p ) { tempP = p->Next; parameter_delete( p ); p = tempP; } // Unterknoten löschen while( n ) { tempN = n->Next; node_delete( n ); // Rekursiver Aufruf n = tempN; } // Diese Node löschen free( toDelete ); } } struct Node * node_newWithLength( char const * name, unsigned int nameLength ) { struct Node * result = malloc( sizeof( struct Node ) ); printf( "+Node: %*s\n", nameLength, name ); if( result ) { result->Name = malloc( 1 + nameLength ); if( result ) { memcpy( result->Name, name, nameLength ); result->Name[nameLength] = '\0'; result->Next = NULL; result->Text = NULL; result->Parameter = NULL; result->SubNodes = NULL; return result; } node_delete( result ); } return NULL; } struct Node * node_new( char const * name ) { return node_newWithLength( name, strlen( name ) ); } struct Node * node_textWithLength( char const * text, unsigned int textLength ) { struct Node * result = malloc( sizeof( struct Node ) ); printf( "+Text: %*s\n", textLength, text ); if( result ) { result->Text = malloc( 1 + textLength ); if( result ) { memcpy( result->Text, text, textLength ); result->Text[textLength] = '\0'; result->Next = NULL; result->Name = NULL; result->Parameter = NULL; result->SubNodes = NULL; return result; } node_delete( result ); } return NULL; } struct Node * node_text( char const * text ) { return node_textWithLength( text, strlen( text ) ); } void node_addParameter( struct Node * node, struct Parameter * parameter ) { if( node ) { struct Parameter ** parameterPtr = &node->Parameter; /* Letzten Parameter finden */ while( *parameterPtr ) parameterPtr = &(*parameterPtr)->Next; *parameterPtr = parameter; } } void node_addSubNode( struct Node * node, struct Node * subnode ) { if( node ) { struct Node ** nodePtr = &node->SubNodes; /* Letzte Node finden */ while( *nodePtr ) nodePtr = &(*nodePtr)->Next; *nodePtr = subnode; } } int main( void ) { /* Variablendeklarationen */ struct Node * html; struct Node * body; struct Parameter * par; struct Node * text; struct Node * headline; /* Programmteil */ html = node_new( "html" ); body = node_new( "body" ); node_addSubNode( html, body ); par = parameter_new( "background", "white" ); node_addParameter( body, par ); text = node_text( "proggen.org" ); headline = node_new( "h1" ); node_addSubNode( headline, text ); node_addSubNode( body, headline ); text = node_text( "C-Tutorial" ); node_addSubNode( body, text ); /* Datenstruktur fertig */ node_delete( html ); return 0; }