/********************************************************************/
/*                標準入出力関数拡張ライブラリ  ヘッダ              */
/********************************************************************/

#ifndef _STDEXT_H
#define _STDEXT_H

#include <stdio.h>

#if 0
	#include "system.h"
#endif

/**** マクロ定義 ****/
#define DEFLT_BUFSIZ 512					/* デフォルトバッファサイズ */
#ifndef TRUE
	/* 条件演算子の返す値 */
	#define TRUE 1							/* 真 */
	#define FALSE 0							/* 偽 */
#endif

#ifndef iskanji
	/* 指定位置が漢字かどうか判定 */
	#define iskanji(c) (0x81<=(c)&&(c)<=0xff||0xe0<=(c)&&(c)<=0xfc)
#endif /* iskanji */

#ifndef BYTE
	#define DWORD(x) *((unsigned *)(x))
	#define WORD(x) *((unsigned short *)(x))
	#define BYTE(x) *((unsigned char *)(x))
#endif /* BYTE */
#define DBLE(x) *((double *)(x))

/**** 構造体の定義 ****/
typedef struct								/* 連立方程式で使う作業領域 */
{
	double *matrix;							/* 行列 */
	double *vect;							/* ベクトル */
	size_t psize;							/* パラメーターのサイズ */
}
ECL_EQU;

typedef struct								/* 引数ありオプション */
{
	int option;								/* オプション文字コード */
	char *optarg;							/* オプション引数 */
}
ESG_OPTARG;

typedef struct								/* 引数なしオプション */
{
	int option;								/* オプション文字コード */
	int flg;								/* オプションの有無 */
}
ESG_OPTSING;

/**** 関数プロトタイプ宣言（マクロも含む） ****/
/*-- システム依存関数 --*/
/* バイトの内容を交換する */
void ess_byteSwap(char *a,char *b);

/* ワードの内容を交換する */
void ess_wordSwap(short *a,short *b);

/* ダブルワードの内容を交換する */
void ess_dwordSwap(long *a,long *b);

/* クワッドワードの内容を交換する */
void ess_qwordSwap(double *a,double *b);

/* メモリ確保・解放関数の取得 */
void ess_getMemFunc(void *(**pmalloc)(),void *(**pcalloc)(),
													void (**pfree)());

/* メモリ確保・解放関数の設定 */
void ess_setMemFunc(void *(*pmalloc)(),void *(*pcalloc)(),void (*pfree)());

/*-- ファイル操作関数 --*/
/* バッファ容量の取得 */
size_t efl_getBuffer(void);

/* バッファ容量の設定 */
int efl_setBuffer(size_t size);

/* ファイルのコピー */
int efl_copy(char *ps,char *send);

/* ファイルの移動（複写元は削除） */
int efl_move(char *ps,char *send);

/* 標準入力から整数を読み込む */
int efl_getd(void);

/* ファイルデータを全てバッファに格納 */
int efl_allRead(FILE *fp,char **buf);

/* 自プログラムのディレクトリからフルパスを生成 */
char *efl_curPath(char *file);

/* ディレクトリを削除 */
int efl_deleteDir(char *dir);

/* ファイルポインタを１加算 */
#define efl_sinc(fp) (fseek(fp,1,SEEK_CUR))

/* ファイルポインタを１減算 */
#define efl_sdec(fp) (fseek(fp,-1,SEEK_CUR))

/*-- 文字列操作関数 --*/
/* 半角文字を全角文字に変換 */
char *esg_halfAll(const char *str);

/* 全角文字を半角文字に変換 */
char *esg_allHalf(const char *str);

/* 区切り文字を取得 */
char esg_getPunctChar(void);

/* 区切り文字を設定 */
int esg_setPunctChar(char punct);

/* 区切ってある数を取得 */
int esg_getStringMax(char *str);

/* 指定した区切りの文字数を調べる */
int esg_getStringSize(char *str,int n);

/* 指定した区切りの文字列を返す */
char *esg_readString(char *set,const char *str,int n);

/* 文字列中の引数を分割する（コマンドライン引数取得に特に有効） */
int esg_getOption(int argc,char **argv,ESG_OPTSING *optSing,
						ESG_OPTARG *optArg,char **othArg,int *othArgc);

/*-- 数値演算関数 --*/
/* 部分選択関数 */
int ecl_partial(int n,int p,double *a,double *b);

/* 漸化式nＣrを返す */
int ecl_combi(int n,int r);

/* 連立方程式計算前の初期化 */
ECL_EQU *ecl_equ_open(int x);

/* 連立方程式計算後の終了処理 */
void ecl_equ_close(ECL_EQU *eq);

/* 連立一次方程式の計算開始（ガウス法）*/
int ecl_equ_Gauss(ECL_EQU *eq,char *para);

/* 連立方程式の答えを返す */
#define ecl_equ_answer(eq,n) (*((eq)->vect+((n)-1)))

#endif /* _STDEXT_H */
