/*---------------------------------------------------------------------------*
 *  platform_utils.c  *
 *                                                                           *
 *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
 *                                                                           *
 *  Licensed under the Apache License, Version 2.0 (the 'License');          *
 *  you may not use this file except in compliance with the License.         *
 *                                                                           *
 *  You may obtain a copy of the License at                                  *
 *      http://www.apache.org/licenses/LICENSE-2.0                           *
 *                                                                           *
 *  Unless required by applicable law or agreed to in writing, software      *
 *  distributed under the License is distributed on an 'AS IS' BASIS,        *
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
 *  See the License for the specific language governing permissions and      *
 *  limitations under the License.                                           *
 *                                                                           *
 *---------------------------------------------------------------------------*/



#ifndef NO_STDERR  
#include <stdio.h>
#endif

#include <string.h>
#include "pmemory.h"
#include "platform_utils.h"


/* 
  safe_strtok()
  Use this in place of regular strtok. which is dangerous because it modifies
  a global variable.  This function does not.
  
  Returns the position in NULL terminated input_str where seps are found, 
  and the length of the token
  Seps contains a NULL terminated string of separators
  Returns NULL if error
  
  If no more tokens left, token_len is 0 
*/

char * safe_strtok(char *input_str, char *seps, int * token_len)
{
  int i, j, k, n, m;
  int sep_found;
  char *pos;

  m = strlen(seps);

  if (!m || !input_str)
    return NULL;

  n = strlen(input_str);
  pos = input_str;  

  for (i=0, sep_found = 0; i<n; i++) {
    for (j=0; j<m; j++) {
      if (*pos == seps[j]) {
        /* found seperator */
        sep_found++;
        break;
      }
    }
    if (sep_found == i) {
      /* found first non separator */ 
      break;      
    }
    pos++;
  }

  *token_len = 0;

  /* now find ending position of token */
  for (k=i; k<n; k++) {
    for (j=0; j<m; j++) {
      if (pos[k-i] == seps[j]) {
        /* first occurance equals separator*/
        return pos;
      }
    }
    (*token_len)++;
  }

  /* no more tokens */
  return pos;
}


/* C54 and WinCE does not have strdup or stricmp */
#if defined TI_DSP || defined UNDER_CE 
int stricmp(const char *str1, const char *str2)
{
	if(str1 == NULL || str2 == NULL){
#ifndef NO_STDERR      
		PLogError(L("stricmp: str1 or str2 is NULL\n"));
#endif		
        exit (1);
	}

	for (; *str1 != '\0' && *str2 != '\0' && tolower(*str1) == tolower(*str2);
		str1++, str2++)
		;
	if (*str1 == '\0')
		return *str2 == '\0'? 0 : -1;
	else if (*str2 == '\0')
		return 1;
	else
		return tolower(*str1) < tolower(*str2)? -1 : 1;
}

char * strdup(char *in_string)
{
	char * new_string = NULL;	

	if(in_string == NULL){
#ifndef NO_STDERR
		PLogError(L("strdup: input string is NULL\n"));
#endif		
        return NULL;
	}

	new_string = (char *)MALLOC(sizeof(char)*(strlen(in_string)+1), MTAG);
	if(!new_string)
		return NULL;
	
	strcpy(new_string, in_string);	
	return new_string;	
}
#endif