/*
 * This file handles string copy/search/comparison/etc.
 */
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdarg.h>
/* include main header file */
#include "mud.h"
#include "utils.h"
/*
 * Compares two strings, and returns TRUE
 * if they match 100% (not case sensetive).
 */
bool compares(const char *aStr, const char *bStr)
{
  int i = 0;
  /* NULL strings never compares */
  if (aStr == NULL || bStr == NULL) return FALSE;
  while (aStr[i] != '\0' && bStr[i] != '\0' && toupper(aStr[i]) == toupper(bStr[i]))
    i++;
  /* if we terminated for any reason except the end of both strings return FALSE */
  if (aStr[i] != '\0' || bStr[i] != '\0')
    return FALSE;
  /* success */
  return TRUE;
}
/*
 * Checks if aStr is a prefix of bStr.
 */
bool is_prefix(const char *aStr, const char *bStr)
{
  /* NULL strings never compares */
  if (aStr == NULL || bStr == NULL) return FALSE;
  /* empty strings never compares */
  if (aStr[0] == '\0' || bStr[0] == '\0') return FALSE;
  /* check if aStr is a prefix of bStr */
  while (*aStr)
  {
    if (tolower(*aStr++) != tolower(*bStr++))
      return FALSE;
  }
  /* success */
  return TRUE;
}
// same as one_arg, but can take constants
const char *one_arg_safe(const char *fStr, char *bStr) {
  /* skip leading spaces */
  while (isspace(*fStr))
    fStr++; 
  /* copy the beginning of the string */
  while (*fStr != '\0')
  {
    /* have we reached the end of the first word ? */
    if (isspace(*fStr))
    {
      fStr++;
      break;
    }
    /* copy one char */
    *bStr++ = *fStr++;
  }
  /* terminate string */
  *bStr = '\0';
  /* skip past any leftover spaces */
  while (isspace(*fStr))
    fStr++;
  /* return the leftovers */
  return fStr;
}
char *one_arg(char *fStr, char *bStr)
{
  /* skip leading spaces */
  while (isspace(*fStr))
    fStr++; 
  /* copy the beginning of the string */
  while (*fStr != '\0')
  {
    /* have we reached the end of the first word ? */
    if (isspace(*fStr))
    {
      fStr++;
      break;
    }
    /* copy one char */
    *bStr++ = *fStr++;
  }
  /* terminate string */
  *bStr = '\0';
  /* skip past any leftover spaces */
  while (isspace(*fStr))
    fStr++;
  /* return the leftovers */
  return fStr;
}
char *two_args(char *from, char *arg1, char *arg2) {
  return one_arg(one_arg(from, arg1), arg2);
}
char *three_args(char *from, char *arg1, char *arg2, char *arg3) {
  return one_arg(one_arg(one_arg(from, arg1), arg2), arg3);
}
//
// pull out the argument of the specified number
//
void arg_num(const char *from, char *to, int num) {
  int count = 1;
  while(count < num && *from != '\0') {
    if(isspace(*from))
      count++;
    from++;
  }
  int i;
  // copy up to the first space
  for(i = 0; !isspace(from[i]) && from[i] != '\0'; i++)
    to[i] = from[i];
  // now cap our string
  to[i] = '\0';
}
char *capitalize(char *txt)
{
  static char buf[MAX_BUFFER];
  int size, i;
  buf[0] = '\0';
  if (txt == NULL || txt[0] == '\0')
    return buf;
  size = strlen(txt);
  for (i = 0; i < size; i++)
    buf[i] = toupper(txt[i]);
  buf[size] = '\0';
  return buf;
}
char *strfind(char *txt, char *sub)
{
  int i, j;
  int len = strlen(txt) - strlen(sub);
  for(i = 0; i <= len; i++) {
    if(txt[i] == sub[0]) {
      bool found = TRUE;
      for(j = 1; sub[j] != '\0'; j++) {
	if(sub[j] != txt[i+j]) {
	  found = FALSE;
	  break;
	}
      }
      if(found)
	return &txt[i];
      i += j;
    }
  }
  return NULL;
}