[ekg2-commit] r4047 - trunk/plugins/ncurses: trunk/plugins/ncurses/old.c

SVN commit svn w toxygen.net
Czw, 3 Lip 2008, 15:22:58 CEST


Author: darkjames
Date: 2008-07-03 15:22:57 +0200 (Thu, 03 Jul 2008)
New Revision: 4047

Modified:
   trunk/plugins/ncurses/old.c
Log:
fix aspell in unicode/unicode.


Modified: trunk/plugins/ncurses/old.c
===================================================================
--- trunk/plugins/ncurses/old.c	2008-07-03 12:42:42 UTC (rev 4046)
+++ trunk/plugins/ncurses/old.c	2008-07-03 13:22:57 UTC (rev 4047)
@@ -2243,82 +2243,91 @@
 	return 0;
 }
 
+#ifdef WITH_ASPELL
+
+static inline int isalpha_locale(int x) {
+#ifdef USE_UNICODE
+	if (config_use_unicode)
+		return (isalpha(x) || (x > 0x7f));	/* moze i nie najlepsze wyjscie... */
+	else
+#endif
+		return isalpha_pl(x);
+}
+
 /* 
  * spellcheck()
  *
  * it checks if the given word is correct
  */
-#ifdef WITH_ASPELL
 static void spellcheck(CHAR_T *what, char *where) {
 	register int i = 0;     /* licznik */
 	register int j = 0;     /* licznik */
 
-	/* Sprawdzamy czy nie mamy doczynienia z 47 (wtedy nie sprawdzamy reszty ) */
-	if (!what || *what == 47)
-		return;       /* konczymy funkcje */
-	    
-	for (i = 0; what[i] != CHAR('\0') && what[i] != CHAR('\n') && what[i] != CHAR('\r'); i++) {
-		if ((!isalpha_pl(what[i]) || i == 0 ) && what[i+1] != CHAR('\0')) { // separator/koniec lini/koniec stringu
-			char *word;             /* aktualny wyraz */
-			size_t wordlen;		/* dlugosc aktualnego wyrazu */
-		
-		/* szukamy jakiejs pierwszej literki */
-			for (; what[i] != CHAR('\0') && what[i] != CHAR('\n') && what[i] != CHAR('\r'); i++) {
-				if (isalpha_pl(what[i]))
+	/* Sprawdzamy czy nie mamy doczynienia z / (wtedy nie sprawdzamy reszty ) */
+	if (!what || *what == '/')
+		return;
+
+	for (i = 0; what[i] != '\0' && what[i] != '\n' && what[i] != '\r';) {
+		if ((!isalpha_locale(what[i]) || i == 0 ) && what[i+1] != '\0') { // separator/koniec lini/koniec stringu
+#if USE_UNICODE
+			CHAR_T what_j; /* zeby nie uzywac wcsndup() ktorego nie mamy. */
+			char *word_mbs;
+#endif
+			char fillznak;	/* do wypelnienia where[] (ASPELLCHAR gdy blednie napisane slowo) */
+
+			/* szukamy jakiejs pierwszej literki */
+			for (; what[i] != '\0' && what[i] != '\n' && what[i] != '\r'; i++) {
+				if (isalpha_locale(what[i]))
 					break;
 			}
 
-		/* trochę poprawiona wydajność */
-			if (what[i] == '\0' || what[i] == '\n' || what[i] == '\r') {
-				i--;
+			/* trochę poprawiona wydajność */
+			if (what[i] == '\0' || what[i] == '\n' || what[i] == '\r')
 				continue;
-			} 
-		/* sprawdzanie czy następny wyraz nie rozpoczyna adresu www */ 
-			if (what[i] == 'h' && what[i + 1] == 't' && what[i + 2] == 't' && what[i + 3] == 'p' && what[i + 4] == ':' && 
-				what[i + 5] == '/' && what[i + 6] == '/') 
-			{
+
+			/* sprawdzanie czy następny wyraz nie rozpoczyna adresu www */
+			if (what[i] == 'h' && what[i + 1] == 't' && what[i + 2] == 't' && what[i + 3] == 'p' && what[i + 4] == ':' &&
+					what[i + 5] == '/' && what[i + 6] == '/') {
 				for(; what[i] != ' ' && what[i] != '\n' && what[i] != '\r' && what[i] != '\0'; i++);
-				i--;
 				continue;
-			} 
-		/* sprawdzanie czy następny wyraz nie rozpoczyna adresu ftp */ 
+			}
+
+			/* sprawdzanie czy następny wyraz nie rozpoczyna adresu ftp */
 			if (what[i] == 'f' && what[i + 1] == 't' && what[i + 2] == 'p' && what[i + 3] == ':' &&
-				what[i + 4] == '/' && what[i + 5] == '/') 
+					what[i + 4] == '/' && what[i + 5] == '/')
 			{
 				for(; what[i] != ' ' && what[i] != '\n' && what[i] != '\r' && what[i] != '\0'; i++);
-				i--;
 				continue;
 			}
 
-/* XXX in unicode/unicode it's wrong... */
-			word = xmalloc((xwcslen(what) + 1)*sizeof(char));
-
-			/* wrzucamy aktualny wyraz do zmiennej word */
-			for (j = 0; what[i] != '\n' && what[i] != '\0' && isalpha_pl(what[i]); i++) {
-				if (isalpha_pl(what[i])) {
-					word[j]= what[i];
-					j++;
-				} else 
+			for (j = i; what[j] != '\n' && what[j] != '\0'; j++) {
+				if (!isalpha_locale(what[j]))
 					break;
 			}
-/*			word[j] = (char) 0; */	/* xmalloc() zero memory */
-			wordlen = j;		/* xstrlen(word) */
 
-			if (i > 0)
-				i--;
+			if (j == i) {		/* Jak dla mnie nie powinno sie wydarzyc. */
+				i++;
+				continue;
+			}
 
-/*			debug(GG_DEBUG_MISC, "Word: %s\n", word);  */
+#if USE_UNICODE
+			what_j = what[j];
+			what[j] = '\0';
 
+			word_mbs = wcs_to_normal(&what[i]);
+			fillznak = (aspell_speller_check(spell_checker, word_mbs, -1) == 0) ? ASPELLCHAR : ' ';
+			free_utf(word_mbs);
+
+			what[j] = what_j;
+#else
 			/* sprawdzamy pisownie tego wyrazu */
-			if (aspell_speller_check(spell_checker, word, xstrlen(word) ) == 0) { /* jesli wyraz jest napisany blednie */
-				for (j = wordlen - 1; j >= 0; j--)
-					where[i - j] = ASPELLCHAR;
-			} else { /* jesli wyraz jest napisany poprawnie */
-				for (j = wordlen - 1; j >= 0; j--)
-					where[i - j] = ' ';
-			}
-			xfree(word);
-		}
+			fillznak = (aspell_speller_check(spell_checker, &what[i], j - i) == 0) ? ASPELLCHAR : ' ';
+#endif
+
+			for (; i < j; i++)
+				where[i] = fillznak;
+		} else
+			i++;
 	}
 }
 #endif



Więcej informacji o liście dyskusyjnej ekg2-commit