000
19.01.2006, 11:53 Uhr
dirweis
|
hi,
ich hoffe natürlich, dass die lösung nicht wirklich knifflig sein wird, aber mir bereitet es schon einiges kopfzerbrechen: ich habe ein ganz kleines programm für die nicht wirklich gesprochene sprache snowball in c implementiert, das den snowball-code mit html-tags versehen soll, um sowas wie einen hervorhebungsmodus in meinem browser zu haben. naja, bisher soweit problemlos bis auf die sache mit kommentaren. sobald ich die kommentare in dem code mit tags wie <span style='color:#808080'><i> versehen will, funktioniert das zwar, aber die umkonvertierung der kommentare findet trotzdem statt - als wäre es richtiger code. ich habe mich an flag-variablen bedient und dachte, daran könnte mein programm merken, wann etwas von dem code auskommentiert ist und wann nicht...
Code: |
if(!flag_kk && !flag_kl) //flag_kk steht fuer flag_kommentar_kurz{
|
das 2. problem ist die tatsache, dass der 'kommetar-modus' nie beendet wird (was natürlich schwerwiegender ist als das 1.). wenn mein programm in diesem 'modus' ist, hat die entsprechende flag-variable natürlich einen wahrheitswert. wenn dann ein zeilenumbruch (für den fall des einzeiligen kommentars - die syntax ist c-identisch) kommt, sollte das den modus beenden.
Code: |
if(flag_kk && '\n' == z){ flag_kk = 0; fputs("</i></span>", ziel); } //z ist das aktuelle zeichen aus der quelldatei
|
und mittlerweile erhalte ich sogar eine speicherverletzung, die ich mir überhaupt nicht erklären kann. hier kommt mal der ganze code der problematischen funktion 'konvertieren':
Code: |
void konvertieren(FILE *quelle, FILE *ziel, const char *quellname){ int z, zlr = 0, letztes; char wort[MAX_WORD_LEN], flag_s = 0, flag_kk = 0, flag_kl = 0; fputs("<html>\n<head>\n<title>", ziel); fputs(quellname, ziel); fputs("</title>\n</head>\n\n<body>\n<pre>\n", ziel); while(EOF != (z = getc(quelle))){ if(!flag_kk && !flag_kl){ switch(z){ case '<' : {fputs("<", ziel);continue;} case '&' : {fputs("&", ziel);continue;} case ' ' : case '(' : case '\n' : case ')' : case '[' : case ']' : {zlr = wort[zlr] = 0; if(strlen(wort)>1){ fseek(ziel, -strlen(wort), SEEK_CUR); fputs(res_wort(wort), ziel); } fputc(z, ziel); letztes = z; /* **!Not-working check for comment ending!** */ if(flag_kk && '\n' == z){ flag_kk = 0; fputs("</i></span>", ziel); } continue;} case 39 : {if(flag_s){ fputc(z, ziel); fputs("</span>", ziel); zlr = wort[zlr] = 0; flag_s = 0; letztes = z; continue; } else if(!isalpha(letztes)) {fputs("<span style='color : #ff0000'>", ziel);flag_s=1;}} /* **!Not-working check for comment beginning!** */ /*case 47 : {if(47 == letztes){ flag_kk = 1; fseek(ziel, -1, SEEK_CUR); fputs("<span style='color : #808080'><i>/", ziel); }} /*case '*' : {if(47 == letztes){ flag_kl = 1; fseek(ziel, -1, SEEK_CUR); fputs("<span style='color : #808080'><i>/", ziel); }}*/ } } /* **!Not-working check for comment ending!** */ if(flag_kl && '/' == z && '*' == letztes){ flag_kl = 0; fputs("</i></span>", ziel); } wort[zlr++] = z; fputc(z, ziel); letztes=z; } fputs("</pre>\n</body>\n</html>\n", ziel); }
|
besten dank schonmal! -- main(){int x=0,y=1228443207;for(;x<105;++x,y=x<32?y:x<64?3392743058u:x<96?611502372:137)putchar((x+1)%21?y&1<<x?64:32:10);} |