ansi "c" code zu html konvertieren. Zeile ins richtige Format bringen
-
Hallo an alle,
Ich bin dabei mir ein Programm zu basteln das mir aus einem Ansi C code eine Html Seite generiert die Kommentare sowie Schlüsselwörter einfärbt bzw formatiert.
Ich lese den Code zeilenweise ein und Bearbeite ihn dann. Mein Problem ist das vor und hinter jedem Schlüsselwort das in einem Char-Array gespeichert ist ein html tag stehen muss <h1>s_wort</h1>.
Teilweise funktioniert mein Code aber völlig unzuverlässig. Mal steht alles richtig da mal stimmt gar nichts mehr.Ich hab zwei ansätze aber beide wollen nicht richtig
Also hier nur für Kommentare aber ist nicht universal
/*Schleife zum Prüfen auf formatier bedürftige Werte*/ for(i=0,j=1,h=0;zeile[i] >31;i++,j++){ /*Wenn Zeile Kommentar Anfang enthält wird ein Html Tag zur Formatierung beigefügt*/ if (zeile[i]=='/' && zeile[j]=='*'){ strcat(formatierte_zeile,"<h2>"); /*Ermittlung der Aktuellen länge zum Anhängen von Zeichen*/ h=strlen(formatierte_zeile); } /*Wenn Zeile Kommentar Ende enthält wird ein Html Tag zur Formatierung beigefügt*/ if (zeile[i]=='*' && zeile[j]=='/'){ /*Das Kommentar Ende wird gesetzt*/ formatierte_zeile[h++] =zeile[i]; formatierte_zeile[h++] =zeile[j]; /*Null Terminierung*/ formatierte_zeile[h] = NULL; strcat(formatierte_zeile,"</h2>\n"); /*Ermittlung der Aktuellen länge zum Anhängen von Zeichen*/ h=strlen(formatierte_zeile); /*Jeweils erhöhen für den Ausgleich zwei beigefügten werten*/ i=i+1; j=j+1; } else{ /*Aktuelles Zeichen wird der Variabel Beigefügt*/ formatierte_zeile[h++] = zeile[i]; /*Null Terminierung*/ formatierte_zeile[h] = NULL; } } /*Übergabe zur Funktion Ausgabe um die formatierte Zeile auszugeben*/ konvertierung_ausgabe(formatierte_zeile,aus,1);
und hier der universale ansatz
void konvertierung_verarbeitung(char *zeile,FILE *aus){ char *y,formatierte_zeile[max],zeile_puffer[max]; int i,n,j,l,ist_s_wort; struct befehle{ char s_wort[max]; }lib[11]; strcpy(lib[0].s_wort,"/*"); strcpy(lib[1].s_wort,"*/"); strcpy(lib[2].s_wort,"case"); strcpy(lib[3].s_wort,"break"); strcpy(lib[4].s_wort,"struct "); strcpy(lib[5].s_wort,"continue"); strcpy(lib[6].s_wort,"do"); strcpy(lib[7].s_wort,"else"); strcpy(lib[8].s_wort,"for"); strcpy(lib[9].s_wort,"if"); strcpy(lib[10].s_wort,"int "); for(i=0;i!=11;i++){ y=NULL; y=strstr(zeile,lib[i].s_wort); if(y != NULL){ if(i==0){ y=strstr(zeile,lib[i].s_wort); memcpy(y+strlen(lib[i].s_wort)+2,zeile,max); memcpy(y,"<h2>",4); memcpy(y+4,lib[i].s_wort,strlen(lib[i].s_wort)); continue; } if(i==1){ strcat(zeile,"</h2>"); break; } y=strstr(zeile,lib[i].s_wort); n=strlen(lib[i].s_wort); memmove(y+n+5,zeile,max); memmove(y,"<h3>",4); memmove(y+4,lib[i].s_wort,strlen(lib[i].s_wort)); memmove(y+strlen(lib[i].s_wort)+4,"</h3>",5); } } }
Ich komm einfach nicht weiter
-
Schau dir mal gVim an.
Da gibt es eine Funktion unter Syntax: Convert to HTML. Gibt es auch fuer Windows.
-
Danke für die Antwort.
Aber der Sinn dahinter ist das ich es verstehen und daraus lernen kann.
-
Aber: "It doesn't work" ist keine ausreichende Fehlerbeschreibung.
-
Ich hab jetzt soviele Ansätze versucht das ich gar nicht mehr weis wo mir der Kopf steht.
Wäre hilfreich wenn mir jemand einen Ansatz geben würde mit dem ich neu Anfangen kann.
Sprich wie es am Sinnvolsten ist die Zeile nach Schlüsselwörtern zu durchsuchen bzw diese zu ersetzen.
-
Bin mir nicht sicher Aber ich glaub ich habe es jetzt.
Verbessert mich jemand wenn es nicht stimmt// temp.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung. // #include "stdafx.h" /*Benötigt für Befehl 'printf' etc.*/ #include "stdio.h" /*Benötigt für String Vergleich(strcmp) etc.*/ #include "string.h" /*Für den 'getch()' Befehl*/ #include "conio.h" int main(int argc, char* argv[]) { char *teil_s,n_zeile[200],f_zeile[200]; int anfang_i,end_i,diff_i,j; char zeile[]="bla drdr bla do dda while"; struct befehle{ char s_wort[200]; int position; }lib[3]; strcpy(lib[0].s_wort,"while"); strcpy(lib[1].s_wort,"do"); strcpy(lib[2].s_wort,"case"); strcpy(f_zeile,zeile); /*Initialisierung*/ n_zeile[0]=0; for(j=0;j<3;j++){ /*Zeiger auf S-wort*/ teil_s=strstr(f_zeile,lib[j].s_wort); /*Länge des teil String*/ anfang_i=strlen(teil_s); /*Länge der gesamt zeile*/ end_i=strlen(f_zeile); /*differnz der beiden also Anzahl vor dem String*/ diff_i= end_i-anfang_i; /*Anfangs String kopieren*/ strncpy(n_zeile,f_zeile,diff_i); /*Null Terminierung*/ n_zeile[diff_i]=0; /*tags hinzugügen*/ strcat(n_zeile,"<tag>"); strcat(n_zeile,lib[j].s_wort); strcat(n_zeile,"</tag>"); /*Rest string anfügen*/ strcat(n_zeile,teil_s+strlen(lib[j].s_wort)); strcpy(f_zeile,n_zeile); } return 0; }
-
Wäre hilfreich wenn mir jemand einen Ansatz geben würde mit dem ich neu Anfangen kann.
Was mir auf die Schnelle einfällt:
1.)
n_zeile könnte überlaufen.
Da wäre es unter Umständen praktisch, gar nicht nach n_zeile zu schreiben, sondern gleich auszugeben.
2.)
Anstatt für jedes Schlüsselwort einzeln die Zeilen zu durchsuchen könntest du auch Token für Token holen (man: strtok oder so) und entscheiden, wie du ihn ausgeben willst.
3.)
Wahrscheinlich wirst du deshalb zeilenweise einlesen, weil du bemerkt hast, dass nach jeder Zeile zumindest ein <br /> angebracht sein wird. Das könnte man auch lösen, indem man '\n' als Token auffasst.PS:
4.)
Aber die beste Idee wäre es, sowas nicht mit nacktem C zu machen, denke ich.