@@ -2093,6 +2093,11 @@ int mg_strcmp(const struct mg_str str1, const struct mg_str str2);
20932093 */
20942094int mg_strncmp (const struct mg_str str1 , const struct mg_str str2 , size_t n );
20952095
2096+ /*
2097+ * Compare two `mg_str`s ignoreing case; return value is the same as `strcmp`.
2098+ */
2099+ int mg_strcasecmp (const struct mg_str str1 , const struct mg_str str2 );
2100+
20962101/*
20972102 * Free the string (assuming it was heap allocated).
20982103 */
@@ -5639,8 +5644,10 @@ int mg_strcmp(const struct mg_str str1, const struct mg_str str2) WEAK;
56395644int mg_strcmp (const struct mg_str str1 , const struct mg_str str2 ) {
56405645 size_t i = 0 ;
56415646 while (i < str1 .len && i < str2 .len ) {
5642- if (str1 .p [i ] < str2 .p [i ]) return -1 ;
5643- if (str1 .p [i ] > str2 .p [i ]) return 1 ;
5647+ int c1 = str1 .p [i ];
5648+ int c2 = str2 .p [i ];
5649+ if (c1 < c2 ) return -1 ;
5650+ if (c1 > c2 ) return 1 ;
56445651 i ++ ;
56455652 }
56465653 if (i < str1 .len ) return 1 ;
@@ -5662,6 +5669,21 @@ int mg_strncmp(const struct mg_str str1, const struct mg_str str2, size_t n) {
56625669 return mg_strcmp (s1 , s2 );
56635670}
56645671
5672+ int mg_strcasecmp (const struct mg_str str1 , const struct mg_str str2 ) WEAK ;
5673+ int mg_strcasecmp (const struct mg_str str1 , const struct mg_str str2 ) {
5674+ size_t i = 0 ;
5675+ while (i < str1 .len && i < str2 .len ) {
5676+ int c1 = tolower ((int ) str1 .p [i ]);
5677+ int c2 = tolower ((int ) str2 .p [i ]);
5678+ if (c1 < c2 ) return -1 ;
5679+ if (c1 > c2 ) return 1 ;
5680+ i ++ ;
5681+ }
5682+ if (i < str1 .len ) return 1 ;
5683+ if (i < str2 .len ) return -1 ;
5684+ return 0 ;
5685+ }
5686+
56655687void mg_strfree (struct mg_str * s ) WEAK ;
56665688void mg_strfree (struct mg_str * s ) {
56675689 char * sp = (char * ) s -> p ;
0 commit comments