Преглед на файлове

ToLower() and ToUpper() optmisations.

woollybah преди 5 години
родител
ревизия
b9ad8c7d8c
променени са 1 файла, в които са добавени 42 реда и са изтрити 2 реда
  1. 42 2
      blitz.mod/blitz_string.c

+ 42 - 2
blitz.mod/blitz_string.c

@@ -703,8 +703,28 @@ BBString *bbStringFromLParam( LPARAM n ){
 BBString *bbStringToLower( BBString *str ){
 	int k;
 	BBString *t;
+	int n = 0;
+	
+	while (n < str->length) {
+		int c=str->buf[n];
+		// ascii upper or other unicode char
+		if (c >= 192 || (c>='A' && c<='Z')) {
+			break;
+		}
+		++n;
+	}
+	
+	if (n == str->length) {
+		return str;
+	}
+	
 	t=bbStringNew( str->length );
-	for( k=0;k<str->length;++k ){
+
+	if (n > 0) {
+		memcpy(t->buf, str->buf, n * sizeof(BBChar));
+	}
+	
+	for( k=n;k<str->length;++k ){
 		int c=str->buf[k];
 		if( c<192 ){
 			c=(c>='A' && c<='Z') ? (c|32) : c;
@@ -730,8 +750,28 @@ BBString *bbStringToLower( BBString *str ){
 BBString *bbStringToUpper( BBString *str ){
 	int k;
 	BBString *t;
+	int n = 0;
+	
+	while (n < str->length) {
+		int c=str->buf[n];
+		// ascii lower or other unicode char
+		if (c >= 181 || (c>='a' && c<='z')) {
+			break;
+		}
+		++n;
+	}
+	
+	if (n == str->length) {
+		return str;
+	}
+	
 	t=bbStringNew( str->length );
-	for( k=0;k<str->length;++k ){
+
+	if (n > 0) {
+		memcpy(t->buf, str->buf, n * sizeof(BBChar));
+	}
+
+	for( k=n;k<str->length;++k ){
 		int c=str->buf[k];
 		if( c<181 ){
 			c=(c>='a' && c<='z') ? (c&~32) : c;