forked from dolphin-emu/dolphin
		
	
		
			
	
	
		
			149 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			149 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /***************************************************************************
 | ||
|  |  *                                  _   _ ____  _ | ||
|  |  *  Project                     ___| | | |  _ \| | | ||
|  |  *                             / __| | | | |_) | | | ||
|  |  *                            | (__| |_| |  _ <| |___ | ||
|  |  *                             \___|\___/|_| \_\_____| | ||
|  |  * | ||
|  |  * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. | ||
|  |  * | ||
|  |  * This software is licensed as described in the file COPYING, which | ||
|  |  * you should have received as part of this distribution. The terms | ||
|  |  * are also available at https://curl.haxx.se/docs/copyright.html.
 | ||
|  |  * | ||
|  |  * You may opt to use, copy, modify, merge, publish, distribute and/or sell | ||
|  |  * copies of the Software, and permit persons to whom the Software is | ||
|  |  * furnished to do so, under the terms of the COPYING file. | ||
|  |  * | ||
|  |  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
|  |  * KIND, either express or implied. | ||
|  |  * | ||
|  |  ***************************************************************************/ | ||
|  | 
 | ||
|  | #include "curl_setup.h"
 | ||
|  | 
 | ||
|  | #include "rawstr.h"
 | ||
|  | 
 | ||
|  | /* Portable, consistent toupper (remember EBCDIC). Do not use toupper() because
 | ||
|  |    its behavior is altered by the current locale. */ | ||
|  | char Curl_raw_toupper(char in) | ||
|  | { | ||
|  | #if !defined(CURL_DOES_CONVERSIONS)
 | ||
|  |   if(in >= 'a' && in <= 'z') | ||
|  |     return (char)('A' + in - 'a'); | ||
|  | #else
 | ||
|  |   switch (in) { | ||
|  |   case 'a': | ||
|  |     return 'A'; | ||
|  |   case 'b': | ||
|  |     return 'B'; | ||
|  |   case 'c': | ||
|  |     return 'C'; | ||
|  |   case 'd': | ||
|  |     return 'D'; | ||
|  |   case 'e': | ||
|  |     return 'E'; | ||
|  |   case 'f': | ||
|  |     return 'F'; | ||
|  |   case 'g': | ||
|  |     return 'G'; | ||
|  |   case 'h': | ||
|  |     return 'H'; | ||
|  |   case 'i': | ||
|  |     return 'I'; | ||
|  |   case 'j': | ||
|  |     return 'J'; | ||
|  |   case 'k': | ||
|  |     return 'K'; | ||
|  |   case 'l': | ||
|  |     return 'L'; | ||
|  |   case 'm': | ||
|  |     return 'M'; | ||
|  |   case 'n': | ||
|  |     return 'N'; | ||
|  |   case 'o': | ||
|  |     return 'O'; | ||
|  |   case 'p': | ||
|  |     return 'P'; | ||
|  |   case 'q': | ||
|  |     return 'Q'; | ||
|  |   case 'r': | ||
|  |     return 'R'; | ||
|  |   case 's': | ||
|  |     return 'S'; | ||
|  |   case 't': | ||
|  |     return 'T'; | ||
|  |   case 'u': | ||
|  |     return 'U'; | ||
|  |   case 'v': | ||
|  |     return 'V'; | ||
|  |   case 'w': | ||
|  |     return 'W'; | ||
|  |   case 'x': | ||
|  |     return 'X'; | ||
|  |   case 'y': | ||
|  |     return 'Y'; | ||
|  |   case 'z': | ||
|  |     return 'Z'; | ||
|  |   } | ||
|  | #endif
 | ||
|  | 
 | ||
|  |   return in; | ||
|  | } | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * Curl_raw_equal() is for doing "raw" case insensitive strings. This is meant | ||
|  |  * to be locale independent and only compare strings we know are safe for | ||
|  |  * this.  See https://daniel.haxx.se/blog/2008/10/15/strcasecmp-in-turkish/ for
 | ||
|  |  * some further explanation to why this function is necessary. | ||
|  |  * | ||
|  |  * The function is capable of comparing a-z case insensitively even for | ||
|  |  * non-ascii. | ||
|  |  */ | ||
|  | 
 | ||
|  | int Curl_raw_equal(const char *first, const char *second) | ||
|  | { | ||
|  |   while(*first && *second) { | ||
|  |     if(Curl_raw_toupper(*first) != Curl_raw_toupper(*second)) | ||
|  |       /* get out of the loop as soon as they don't match */ | ||
|  |       break; | ||
|  |     first++; | ||
|  |     second++; | ||
|  |   } | ||
|  |   /* we do the comparison here (possibly again), just to make sure that if the
 | ||
|  |      loop above is skipped because one of the strings reached zero, we must not | ||
|  |      return this as a successful match */ | ||
|  |   return (Curl_raw_toupper(*first) == Curl_raw_toupper(*second)); | ||
|  | } | ||
|  | 
 | ||
|  | int Curl_raw_nequal(const char *first, const char *second, size_t max) | ||
|  | { | ||
|  |   while(*first && *second && max) { | ||
|  |     if(Curl_raw_toupper(*first) != Curl_raw_toupper(*second)) { | ||
|  |       break; | ||
|  |     } | ||
|  |     max--; | ||
|  |     first++; | ||
|  |     second++; | ||
|  |   } | ||
|  |   if(0 == max) | ||
|  |     return 1; /* they are equal this far */ | ||
|  | 
 | ||
|  |   return Curl_raw_toupper(*first) == Curl_raw_toupper(*second); | ||
|  | } | ||
|  | 
 | ||
|  | /* Copy an upper case version of the string from src to dest.  The
 | ||
|  |  * strings may overlap.  No more than n characters of the string are copied | ||
|  |  * (including any NUL) and the destination string will NOT be | ||
|  |  * NUL-terminated if that limit is reached. | ||
|  |  */ | ||
|  | void Curl_strntoupper(char *dest, const char *src, size_t n) | ||
|  | { | ||
|  |   if(n < 1) | ||
|  |     return; | ||
|  | 
 | ||
|  |   do { | ||
|  |     *dest++ = Curl_raw_toupper(*src); | ||
|  |   } while(*src++ && --n); | ||
|  | } |