[ekg2-devel] Problem z wprowadzaniem regexpów
Jakub Zawadzki
darkjames w darkjames.ath.cx
Pią, 27 Lut 2009, 12:04:32 CET
On Tue, Feb 24, 2009 at 11:25:33PM +0100, Jakub Zawadzki wrote:
> Hej,
>
> bug od dmilitha:
> po wklejeniu:
> "< *(([bh]r)\\ */|([uo]l|li)) *>"
> otrzymujemy pokrzaczony output w oknie ncurses (jak na http://haystack.pl/ekg2/ekg2_bug_with_regexp.png)
>
> Mój komentarz:
> Powodem jest prawdopodobnie /|
> (ktoś już to kiedyś zgłaszał)
W załaczniku moja łatka, przeniosłem kod z fstring_new() do va_format_string()
(czyli nie powinno się nic popsuć chyba że jakaś formatka _nie_ jest wcześniej formatowana)
Ja jestem za tym żeby w ogóle dropnąc wsparcie dla marginesów. (chyba nawet źle działają, używa ktoś?)
Jest jeszcze problem z tym że wszystko co przychodzi z sieci powinno być
sanityzowane - (chodzi mi o sekwencje ansi) na gg/ircu można spokojnie
przesłac nam sekwencje zawierająca \033 która potem zostanie przetworzona przez fstring_new() -
w sumie nic _bardzo_ groźnego nie może się stać
(dawno dawno temu, tak dredzikowi zawieszałem ekg2 ^^) (r2055)
Ale jednak.
Pozdrawiam.
-------------- następna część ---------
Index: ekg/themes.c
===================================================================
--- ekg/themes.c (wersja 4783)
+++ ekg/themes.c (kopia robocza)
@@ -466,6 +466,10 @@
for (i = 0; i < fill_length; i++)
string_append_c(buf, fill_char);
}
+ } else if (*p == '/' && p[1] == '|' && (p == format || p[-1] != '/')) { /* match /| but don't match //| */ /* (don't know why, sorry :)) */
+ /* this sequence is marking res->margin_left */
+ string_append(buf, "\033[666m");
+ p++;
} else
string_append_c(buf, *p);
p++;
@@ -613,6 +617,10 @@
attr &= ~(FSTR_NORMAL+FSTR_BACKMASK);
attr |= (cur - 40) << 3;
}
+
+ /* internal ekg2 sequence */
+ if (cur == 666)
+ res->margin_left = j;
}
}
// else debug("Invalid/unsupported by ekg2 ECMA-48 CSI seq? (npar: %d)\n", npar); /* sequence not ended with m */
@@ -622,15 +630,6 @@
if (str[i] == 13)
continue;
- if (str[i] == ('/') && str[i + 1] == ('|')) {
- if (i == 0 || str[i - 1] != ('/')) {
- res->margin_left = j;
- i++;
- continue;
- }
- continue;
- }
-
if (str[i] == 9) {
int k = 0, l = 8 - (j % 8);
Więcej informacji o liście dyskusyjnej ekg2-devel