Witam
Pisze edytor dla programistów C & C++ na zaliczenie z JiTP.
Edytor ma wyświetlać tekst w kolorach. Np. komentarze na zielono, słowa kluczowe na niebiesko. Ma obsługiwać tabulatory itp.
Plik źródłowy jest wczytywany do struktury PLIK_ZRODLOWY, która wygląda tak
/
typedef struct LiniaTekstu
{
unsigned int iIloscZnakowWLini;
TCHAR* szTekst;
void* pPoprzedniaLiniaTekstu;
void* pNastepnaLiniaTekstu;
} LINIA_TEKSTU;
typedef struct PlikZrodlowy
{
TCHAR szSciezkaDoPliku[MAX_PATH];
LINIA_TEKSTU* pLinieTekstu;
unsigned int iIloscLiniTekstu;
} PLIK_ZRODLOWY;
Plik jest zapisany w pamięci linia po lini. I teraz pytanie. Jak najwydajniej napisać funkcje, która bedzie wyświetlała tekst w okienku?
udało mi się napisac funkcję, która wyświetla tekst znak po znaku. Sprawdza, czy kolejne dwa znaki są /* wtedy zmienai kolor na zielony a gdy */ na czarny. Gdy '//' to znów nazielony do końca lini. I niby okej, ale jest mało wydajna.
Gdy plik jest złożony z tysiąca lini lub więcej, funkcja itak drukuje je wszystkie w przypadku, gdy jest na ekranie jest wyswietlonych kilka ostatnich lini. (inaczej jest gdy wyswietla tylko poczatkowe linie). Wysweitla wszystkie dlatego, ze przy wyswietlaniu znaków sprawdza jakim kolorem je wydrukowac. Np. jesli w pierwszej lini byłby znak '/' a zamykający '/' w 1000 lini, to funkcja musiałaby widzieć o tym jesli chce wyswietlic linie z zakresu od 990 do 1010.
Jak to napisać optymalnie?
Kolejny problem to znaki tabulacji. Gdy funkcja napotka znak '\t' przesuwa licznik pozycji o 4*8 (gdzie 8 to szerokość jednegoznaku). Ale zobaczmy na dwa przykłady:
"przykład numer 1\t la la la"
"przykład dwa\t la la la"
zostaną wyświetlone tak
"przykład numer 1 la la la"
"przykład dwa la la la"
tabulatory nie sa wyrównane, jak to obejść w najprostszy sposób