/*
        Copyright (C), 1993 SEIKO EPSON Corp.
                ALL RIGHTS RESERVED
 
        file name : string.h
 
 
        revision history
                1st release     1993/10/1       mizutani
                modify to work on native environment
                                1993/12/17      shinozuka
              * /usr/PIECE/include にあるファイルよりも、このファイルが優先されるよう、
                clip.mkにて、インクルードパスを設定してあります。
              * コンパイル時に引数型を検査するため、関数宣言をK&R→ANSIに変更しました。
                変更においては、『MSDN ライブラリ Visual Studio 6.0』を参考にしました。
              * 多くの関数宣言において、変更前の戻り値と引数型コメントが誤っています。
                戻り値と引数型を変更しても、バイナリは変更不要ですので、修正しました。
                                2006/02/22      Naoyuki Sawa
              * strsep()の宣言を追加しました。実装は、clippce.cにあります。
                clippce.cの、実装部のコメントを参照してください。
                                2013/03/27      Naoyuki Sawa
              * strverscmp()の宣言を追加しました。実装は、clipdire.cにあります。
                clipdire.cの、実装部のコメントを参照してください。
                                2014/08/11      Naoyuki Sawa
              * strcasestr()の宣言を追加しました。実装は、clippce.cにあります。
                clippce.cの、実装部のコメントを参照してください。
                                2014/10/12      Naoyuki Sawa
              * strlcpy(),strlcat()の宣言を追加しました。実装は、clippce.cにあります。
                clippce.cの、実装部のコメントを参照してください。
                                2014/10/31      Naoyuki Sawa
              * strdup(),strcasecmp(),strncasecmp()の宣言をclippce.h⇒include/string.hへ，実装をclippce.c⇒cliplibc.cへ移動しました。
                strcasecmp(),strncasecmp()は本当はstrings.hで宣言すべきなのですが、P/ECEにはstrings.hが無いのでinclude/string.hで宣言することにしました。
                                2015/01/07      Naoyuki Sawa
              * strnlen(),strndup()の宣言をclippce.h⇒include/string.hへ，実装をclippce.c⇒cliplibc.cへ移動しました。
                                2015/01/07      Naoyuki Sawa
              * strupr(),strlwr()の宣言をclippce.h⇒include/string.hへ，実装をclippce.c⇒cliplibc.cへ移動しました。
                                2015/01/07      Naoyuki Sawa
              * ffs()の宣言をclippce.h⇒include/string.hへ，実装をclippce.c⇒cliplibc.cへ移動しました。
                ffs()は本当はstrings.hで宣言すべきなのですが、P/ECEにはstrings.hが無いのでinclude/string.hで宣言することにしました。
                                2015/01/07      Naoyuki Sawa
              * memcmp(),memcpy()のANSI形式の関数宣言を有効にしました。
                                2015/01/08      Naoyuki Sawa
              * size_tの定義をunsigned型に統一しました。
                NULLの定義を(void*)型に統一しました。
                                2015/01/20      Naoyuki Sawa
              * memccpy(),mempcpy(),stpncpy(),stpcpy()の宣言を追加しました。実装は、cliplibc.cにあります。
                cliplibc.cの、実装部のコメントを参照してください。
                                2015/04/29      Naoyuki Sawa
*/

#ifndef _STRING_H
#define _STRING_H

#ifndef NULL
//{{2015/01/20変更:NULLの定義を(void*)型に統一しました。
//#define NULL	0
//↓2015/01/20変更:NULLの定義を(void*)型に統一しました。
// * Tue Jan 20 23:26:57 JST 2015 Naoyuki Sawa
// - P/ECE開発環境の標準インクルードファイルのうち、string.hだけNULLの定義が違っています。
//   C言語のNULLは(void*)型が正しい(POSIX.1-2008)ので、(void*)型に統一することにしました。
#define NULL ((void*)0)
//}}2015/01/20変更:NULLの定義を(void*)型に統一しました。
#endif

#ifndef _SIZE_T
#define _SIZE_T
//{{2015/01/20変更:size_tの定義をunsigned型に統一しました。
//typedef unsigned long   size_t ;
//↓2015/01/20変更:size_tの定義をunsigned型に統一しました。
// * Tue Jan 20 23:26:57 JST 2015 Naoyuki Sawa
// - P/ECE開発環境ではsize_tはunsigned。unsigned longではない。
//   例1:○
//   │typedef unsigned size_t;
//   │extern void* memcpy(void*,const void*,size_t); ← 警告無くコンパイル出来る
//   例2:×
//   │typedef unsigned long size_t;
//   │extern void* memcpy(void*,const void*,size_t); ← warning:conflicting types for built-in function `memcpy'
//   P/ECE開発環境の標準インクルードファイルも間違っているので要注意です。
//   stddef.hでの定義は正しいけれど、stdio.h,stdlib.h,string.h,time.hでの定義は間違っています。
//   たまたまstddef.hを最初にインクルードすると大丈夫なのでした。
// - どのヘッダファイルを最初にインクルードしても大丈夫なように、定義を統一することにしました。
//   自作のP/ECEプログラムならば、stddef.hを最初にインクルードするようにできるのですが、
//   オープンソースのライブラリを変更無くコンパイルしたい時に、stddef.h以外が最初になっている場合があるからです。
//   具体的には、/clip/liblua/をコンパイルするときに警告が出て、この問題に気付きました。
typedef unsigned size_t;
//}}2015/01/20変更:size_tの定義をunsigned型に統一しました。
#endif

void* memchr(const void* buf, int c, size_t count);			// char *memchr( /* char *, int, int */ ) ;
//{{2015/01/08変更:memcmp()とmemcpy()のANSI形式の関数宣言を有効にしました。
///*{{ビルトイン関数に対して、ANSI形式の関数宣言を行うと、宣言が正しくても警告が表示されてしまう不具合の回避*/
////int memcmp(const void* buf1, const void* buf2, size_t count);		// int memcmp( /* char *, char *, int */ ) ;
////void* memcpy(void* dest, const void* src, size_t count);		// char *memcpy( /* char *, char *, int */ ) ;
////↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
//// - 本当は、上述のように宣言するのが正しいのですが、実際に、上述の宣言を行うと、GCCが以下のような警告を発します。
////	warning: conflicting types for built-in function `memcmp'
////	warning: conflicting types for built-in function `memcpy'
////   GCCの(一部の？)ビルトイン関数をヘッダファイルで宣言すると、正しい宣言であっても、警告となってしまうようです。
////   仕方が無いので、これらのビルトイン関数の宣言を、コメントアウトしました。
//// - ビルトイン関数の宣言が無くても、GCC本体の機能により、誤った使用法に対して、コンパイル時に警告が発せられます。
////   従って、これらのビルトイン関数の宣言をコメントアウトしたことによる、実害はありません。
///*}}ビルトイン関数に対して、ANSI形式の関数宣言を行うと、宣言が正しくても警告が表示されてしまう不具合の回避*/
//↓2015/01/08変更:memcmp()とmemcpy()のANSI形式の関数宣言を有効にしました。
// * Thu Jan 08 21:27:35 JST 2015 Naoyuki Sawa
// - memcmp(),memcpy()のANSI形式の関数宣言を有効にしました。
//   以前は、memcmp(),memcpy()のANSI形式の関数宣言を有効にすると警告が出ると思っていたのですが、問題無い事が判ったからです。
// - 色々試したところ、上記の警告が出るのは、「pcc33 -g」オプションを指定した場合だけであることが判りました。
//   「pcc33 -g」オプションを指定しなければ、上記の警告は出ません。
//   P/ECE開発環境で「pcc33 -g」オプションを指定しても無意味なので、もう「pcc33 -g」オプションを使用することは無いはずです。
//   従って、memcmp(),memcpy()のANSI形式の関数宣言を有効にしても問題ないと判断し、有効にすることにしました。
// - memcmp(),memcpy()の関数宣言を行わないと、以下の警告が出る事がありました。
//	void* p1=memcpy;//warning: built-in function `memcpy' used without declaration
//	void* p2=memcmp;//warning: built-in function `memcmp' used without declaration
//   今回、memcmp(),memcpy()の関数宣言を行ったので、この警告が出る事も無くなりました。
int memcmp(const void* buf1, const void* buf2, size_t count);		// int memcmp( /* char *, char *, int */ ) ;
void* memcpy(void* dest, const void* src, size_t count);		// char *memcpy( /* char *, char *, int */ ) ;
//}}2015/01/08変更:memcmp()とmemcpy()のANSI形式の関数宣言を有効にしました。
void* memmove(void* dest, const void* src, size_t count);		// char *memmove( /* char *, char *, int */ ) ;
void* memset(void* dest, int c, size_t count);				// char *memset( /* char *, int, int */ ) ;
char* strcat(char* string1, const char* string2);			// char *strcat( /* char *, const char * */ ) ;
char* strchr(const char* string, int c);				// char *strchr( /* const char *, int */ ) ;
int strcmp(const char* string1, const char* string2);			// int strcmp( /* const char *, const char * */ ) ;
char* strcpy(char* string1, const char* string2);			// char *strcpy( /* char *, char * */ ) ;
size_t strcspn(const char* string1, const char* string2);		// size_t strcspn( /* const char *, const char * */ ) ;
char* strerror(int errnum);						// char *strerror( /* int */ ) ;
size_t strlen(const char* string);					// size_t strlen( /* const char * */ ) ;
char* strncat(char* string1, const char* string2, size_t count);	// char *strncat( /* char *, const char *, size_t */ ) ;
int strncmp(const char* string1, const char* string2, size_t count);	// int strncmp( /* const char *, const char *, size_t */ ) ;
char* strncpy(char* string1, const char* string2, size_t count);	// char *strncpy( /* char *, const char *, size_t */ ) ;
char* strpbrk(const char* string1, const char* string2);		// char *strpbrk( /* const char *, const char * */ ) ;
char* strrchr(const char* string, int c);				// char *strrchr( /* const char *, int */ ) ;
size_t strspn(const char* string1, const char* string2);		// size_t strspn( /* const char *, const char * */ ) ;
char* strstr(const char* string1, const char* string2);			// char *strstr( /* const char *, const char * */ ) ;
char* strtok(char* string1, const char* string2);			// char *strtok( /* char *, const char * */ ) ;

/* * Wed Mar 27 22:30:15 JST 2013 Naoyuki Sawa
 * - strsep()の宣言を追加しました。実装は、clippce.cにあります。
 *   clippce.cの、実装部のコメントを参照してください。
 */
char* strsep(char** stringp, const char* delim);

/* * Mon Aug 11 19:48:16 JST 2014 Naoyuki Sawa
 * - strverscmp()の宣言を追加しました。実装は、clipdire.cにあります。
 *   clipdire.cの、実装部のコメントを参照してください。
 */
int strverscmp(const char* s1, const char* s2);

/* Sun Oct 12 18:49:43 JST 2014 Naoyuki Sawa
 * - strcasestr()の宣言を追加しました。実装は、clippce.cにあります。
 *   clippce.cの、実装部のコメントを参照してください。
 */
char* strcasestr(const char* s1, const char* s2);

/* Fri Oct 31 00:45:36 JST 2014 Naoyuki Sawa
 * - strlcpy(),strlcat()の宣言を追加しました。実装は、clippce.cにあります。
 *   clippce.cの、実装部のコメントを参照してください。
 */
size_t strlcpy(char* dst, const char* src, size_t size);
size_t strlcat(char* dst, const char* src, size_t size);

/* * Mon Jan 03 23:06:46 JST 2011 Naoyuki Sawa
 * - locale.hの追加に伴い、strcoll()を追加しました。「Lua 5.1.4」をコンパイルするために必要です。
 *   現在は"C"ロケールしかサポートしていないため、strcoll()はstrcmp()と同じなので、マクロで定義することにしました。
 */
#define strcoll strcmp

//{{2015/01/07追加:strdup(),strcasecmp(),strncasecmp()の宣言をclippce.h⇒include/string.hへ，実装をclippce.c⇒cliplibc.cへ移動しました。strcasecmp(),strncasecmp()は本当はstrings.hで宣言すべきなのですが、P/ECEにはstrings.hが無いのでinclude/string.hで宣言することにしました。
/* 以下の関数はANSI規格ではなく、BSDまたはSYSV互換の関数のようです。
 * P/ECEのCライブラリには含まれていませんが、便利なので実装しておきます。 */
char* strdup(const char* string);
int strcasecmp(const char* s1, const char* s2);
int strncasecmp(const char* s1, const char* s2, size_t n);
//}}2015/01/07追加:strdup(),strcasecmp(),strncasecmp()の宣言をclippce.h⇒include/string.hへ，実装をclippce.c⇒cliplibc.cへ移動しました。strcasecmp(),strncasecmp()は本当はstrings.hで宣言すべきなのですが、P/ECEにはstrings.hが無いのでinclude/string.hで宣言することにしました。

//{{2015/01/07追加:strnlen(),strndup()の宣言をclippce.h⇒include/string.hへ，実装をclippce.c⇒cliplibc.cへ移動しました。
/* strnlen()とstrndup()は、POSIX.1-2008準拠です。 */
size_t strnlen(const char* string, size_t n);
char* strndup(const char* string, size_t n);
//}}2015/01/07追加:strnlen(),strndup()の宣言をclippce.h⇒include/string.hへ，実装をclippce.c⇒cliplibc.cへ移動しました。

//{{2015/01/07追加:strupr(),strlwr()の宣言をclippce.h⇒include/string.hへ，実装をclippce.c⇒cliplibc.cへ移動しました。
/* strupr()とstrlwr()は、標準関数かどうかよくわからず、VC++特有なのかも知れません。
 * Web上の資料から推測すると、Unix環境のライブラリには含まれていない(?)ようです。
 * P/ECE開発環境のEPSONライブラリにも、strupr()とstrlwr()は、含まれていません。
 * 便利なので、定義しておくことにしました。 */
char* strupr(char* string);
char* strlwr(char* string);
//}}2015/01/07追加:strupr(),strlwr()の宣言をclippce.h⇒include/string.hへ，実装をclippce.c⇒cliplibc.cへ移動しました。

/* * Wed Apr 29 14:30:43 JST 2015 Naoyuki Sawa
 *  - memccpy(),mempcpy(),stpncpy(),stpcpy()の宣言を追加しました。実装は、cliplibc.cにあります。
 *    cliplibc.cの、実装部のコメントを参照してください。
 */
void* memccpy(void* dest, const void* src, int c, size_t n);
void* mempcpy(void* dest, const void* src, size_t n);
char* stpncpy(char* dest, const char* src, size_t n);
char* stpcpy(char* dest, const char* src);

//{{2015/01/07追加:ffs()の宣言をclippce.h⇒include/string.hへ，実装をclippce.c⇒cliplibc.cへ移動しました。ffs()は本当はstrings.hで宣言すべきなのですが、P/ECEにはstrings.hが無いのでinclude/string.hで宣言することにしました。
/* ワードの中で最初にセットされている最下位ビットの位置を返します。(Find first set)
 * 本関数は、ffs(): 4.3BSD, POSIX.1-2001. 準拠です。 */
int ffs(int i);
//}}2015/01/07追加:ffs()の宣言をclippce.h⇒include/string.hへ，実装をclippce.c⇒cliplibc.cへ移動しました。ffs()は本当はstrings.hで宣言すべきなのですが、P/ECEにはstrings.hが無いのでinclude/string.hで宣言することにしました。

#endif
