[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