/*
 * @author fenrir (http://fenrir.naruoka.org/)
 * 
 * reg_char.c
 * 文字全般に関して
 */

#include "reg_char.h"

#ifdef __cplusplus
extern "C"{
#endif

/**
 * 文字列で現在位置から後の文字に進みます。
 * 2byte以上の文字の場合は必要に応じて書き換えてください。
 * 
 * @param string 現在位置
 * @param shift 進む量
 * @return shiftで指定した量だけ後の文字、文字列の終端文字(NULL)を越えた場合は終端文字(NULL)のポインタ
 */
char *reg_char_shift(char *string, int shift){
  for(; shift > 0; shift--){
    if(*string == NULL_CHAR){break;}
    string = (*string < 0 ? string + 2 : string + 1);
  }
  return string;
}

/**
 * 文字列で現在位置から前の文字にさかのぼります。
 * 2byte以上の文字の場合は必要に応じて書き換えてください。
 * (実は未使用)
 * 
 * @param string 現在位置
 * @param border 文字列の先頭
 * @param unshift 元に戻る量
 * @return unshiftで指定した量だけ前の文字、borderを越える以上のunshiftが指定された場合はborder
 */
char *reg_char_unshift(char *string, char *border, int unshift){
  for(; unshift > 0; unshift--){
    if((string -= 2) < border){string = border; break;}
    if(*string > 0){string++;}
  }
  return string;
}

/**
 * 文字の比較を行います。
 * 2byte以上の文字にも対応できるようにしてあります。
 * 必要に応じてコードを書き換えてください。
 * 
 * @param char1 比較文字1
 * @param char2 比較文字2
 * @return 一致した場合は0、しない場合は0以外
 */
int reg_char_compare(char *char1, char *char2){
  if(*char1 < 0){
    return *char1 == *char2 ? *(char1+1) - *(char2+1) : *char1 - *char2;
  }else{
    return *char1 - *char2;
  }
}

#ifdef __cplusplus
};
#endif
