forked from mirrors/gecko-dev
		
	 265e672179
			
		
	
	
		265e672179
		
	
	
	
	
		
			
			# ignore-this-changeset --HG-- extra : amend_source : 4d301d3b0b8711c4692392aa76088ba7fd7d1022
		
			
				
	
	
		
			123 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | |
| /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 | |
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| /**
 | |
|  * MODULE NOTES:
 | |
|  * @update  gess7/30/98
 | |
|  *
 | |
|  * Much as I hate to do it, we were using string compares wrong.
 | |
|  * Often, programmers call functions like strcmp(s1,s2), and pass
 | |
|  * one or more null strings. Rather than blow up on these, I've
 | |
|  * added quick checks to ensure that cases like this don't cause
 | |
|  * us to fail.
 | |
|  *
 | |
|  * In general, if you pass a null into any of these string compare
 | |
|  * routines, we simply return 0.
 | |
|  */
 | |
| 
 | |
| #include "nsCRT.h"
 | |
| #include "nsDebug.h"
 | |
| 
 | |
| //----------------------------------------------------------------------
 | |
| 
 | |
| ////////////////////////////////////////////////////////////////////////////////
 | |
| // My lovely strtok routine
 | |
| 
 | |
| #define IS_DELIM(m, c) ((m)[(c) >> 3] & (1 << ((c)&7)))
 | |
| #define SET_DELIM(m, c) ((m)[(c) >> 3] |= (1 << ((c)&7)))
 | |
| #define DELIM_TABLE_SIZE 32
 | |
| 
 | |
| char* nsCRT::strtok(char* aString, const char* aDelims, char** aNewStr) {
 | |
|   NS_ASSERTION(aString,
 | |
|                "Unlike regular strtok, the first argument cannot be null.");
 | |
| 
 | |
|   char delimTable[DELIM_TABLE_SIZE];
 | |
|   uint32_t i;
 | |
|   char* result;
 | |
|   char* str = aString;
 | |
| 
 | |
|   for (i = 0; i < DELIM_TABLE_SIZE; ++i) {
 | |
|     delimTable[i] = '\0';
 | |
|   }
 | |
| 
 | |
|   for (i = 0; aDelims[i]; i++) {
 | |
|     SET_DELIM(delimTable, static_cast<uint8_t>(aDelims[i]));
 | |
|   }
 | |
|   NS_ASSERTION(aDelims[i] == '\0', "too many delimiters");
 | |
| 
 | |
|   // skip to beginning
 | |
|   while (*str && IS_DELIM(delimTable, static_cast<uint8_t>(*str))) {
 | |
|     str++;
 | |
|   }
 | |
|   result = str;
 | |
| 
 | |
|   // fix up the end of the token
 | |
|   while (*str) {
 | |
|     if (IS_DELIM(delimTable, static_cast<uint8_t>(*str))) {
 | |
|       *str++ = '\0';
 | |
|       break;
 | |
|     }
 | |
|     str++;
 | |
|   }
 | |
|   *aNewStr = str;
 | |
| 
 | |
|   return str == result ? nullptr : result;
 | |
| }
 | |
| 
 | |
| ////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| /**
 | |
|  * Compare unichar string ptrs, stopping at the 1st null
 | |
|  * NOTE: If both are null, we return 0.
 | |
|  * NOTE: We terminate the search upon encountering a nullptr
 | |
|  *
 | |
|  * @update  gess 11/10/99
 | |
|  * @param   s1 and s2 both point to unichar strings
 | |
|  * @return  0 if they match, -1 if s1<s2; 1 if s1>s2
 | |
|  */
 | |
| int32_t nsCRT::strcmp(const char16_t* aStr1, const char16_t* aStr2) {
 | |
|   if (aStr1 && aStr2) {
 | |
|     for (;;) {
 | |
|       char16_t c1 = *aStr1++;
 | |
|       char16_t c2 = *aStr2++;
 | |
|       if (c1 != c2) {
 | |
|         if (c1 < c2) {
 | |
|           return -1;
 | |
|         }
 | |
|         return 1;
 | |
|       }
 | |
|       if (c1 == 0 || c2 == 0) {
 | |
|         break;
 | |
|       }
 | |
|     }
 | |
|   } else {
 | |
|     if (aStr1) {  // aStr2 must have been null
 | |
|       return -1;
 | |
|     }
 | |
|     if (aStr2) {  // aStr1 must have been null
 | |
|       return 1;
 | |
|     }
 | |
|   }
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| // This should use NSPR but NSPR isn't exporting its PR_strtoll function
 | |
| // Until then...
 | |
| int64_t nsCRT::atoll(const char* aStr) {
 | |
|   if (!aStr) {
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   int64_t ll = 0;
 | |
| 
 | |
|   while (*aStr && *aStr >= '0' && *aStr <= '9') {
 | |
|     ll *= 10;
 | |
|     ll += *aStr - '0';
 | |
|     aStr++;
 | |
|   }
 | |
| 
 | |
|   return ll;
 | |
| }
 |