sub.h 5.22 KB
/*
 * sub.c 
 *
 *    あると便利なオプション関数
 *
 *
 */

#ifndef  __sub_c__
#define  __sub_c__

#ifndef null 
#define null 0
#endif

#define  FORI(j)    for(i=0;i<j;i++) 
#define  FORJ(size) for(j=0;j<size;j++)

#include <stdlib.h>
#include <stdio.h>

typedef unsigned char                   u8;     /* unsigned  8-bit */
typedef unsigned short                  u16;    /* unsigned 16-bit */
typedef unsigned long                   u32;    /* unsigned 32-bit */

typedef signed char                     s8;     /* signed  8-bit */
typedef short                           s16;    /* signed 16-bit */
typedef long                            s32;    /* signed 32-bit */

#define sbErrStop(str) 		sbErrStopSSI(str,NULSTR,NULSTR,0,1)
#define sbErrStopS(str,s1) 	sbErrStopSSI(str,s1,NULSTR,0,1)
#define sbErrStopI(str,i1)	sbErrStopSSI(str,NULSTR,NULSTR,i1,1)
/*
   読み取り専用文字列
   _0 		最後にパターンマッチ成功した文字列
   			(失敗してもヌルにはならないので注意)
   _1 〜 _9 カッコで指定した文字列
 */

#define _0 					sbGetSp(0)
#define _1					sbGetSp(1)
#define _2					sbGetSp(2)
#define _3					sbGetSp(3)
#define _4					sbGetSp(4)
#define _5					sbGetSp(5)
#define _6					sbGetSp(6)
#define _7					sbGetSp(7)
#define _8					sbGetSp(8)
#define _9					sbGetSp(9)

#define _0_(from)			sbStrCopy(from,__0,(sbLength(from)))
#define __1(dest)			sbCopySp(dest,1)
#define __2(dest)			sbCopySp(dest,2)


#define sbMatch(desc,s)		sbMatch3( desc,s ,NULSTR 	,NULSTR ,NULSTR) 
#define sbM(s)				sbMatch3( __0 ,s ,NULSTR 	,NULSTR ,NULSTR) 
#define sbM1(s,s1)			sbMatch3( __0 ,s ,s1     	,NULSTR ,NULSTR)		
#define sbM2(s,s1,s2)		sbMatch3( __0 ,s ,s1     	,s2 	,NULSTR)		
#define sbM3(s,s1,s2,s3)	sbMatch3( __0 ,s ,s1     	,s2 	,s3    )		
#define SB_MAX_REPEATS		255

/*
 * sbGetOpts(**argv,argc,"[parameters]");
 *
 * 以下の環境変数をセットします。
 * OPTIA[]  オプション値(int)    	文字列を得るときはキャストします    
 * OPTIAS   オプション数           	getoptsで指定したパラメータにより決まります。
 * TGTYA[]  ターゲット(ファイル) 	コマンドラインで入力されたターゲット文字列
 * TGTYAS   ターゲット数			コマンドラインで入力されたターゲットの数	
 * 
 * パラメータの説明
 *   パラメータは使用するオプション文字と属性を指定します。
 *     従って必ず二の倍数の長さになります。
 *     OPTIAには指定した順番に従って値がセットされます。
 *    
 *    属性は以下のものがあります
 * 			0 パラメータ無し。指定されると 1
 *			1 数値パラメータ	
 *			- 数値による範囲指定 OPTIAに二つ値が帰ります。
			: 文字列       OPTIA には ARGVへの参照値が入ります。

	注意事項
	  文字列パラメータへの 参照代入を行わないでください。ARGVへの代入は
	  システムにより終了時のエラーを引き起こす場合があります。

	  
	使用例
     dos line
         $$$.exe  target0 -d 400 -c file.txt -b 400-800 -a target1 	  

	 source	 
		int opt_a;        / * bool 	   * /
		int opt_b0;       / * from     * /  
		int opt_b1;       / * to       * /
		char * opt_c;     / * string   * / 
		int opt_d;        / * numeric  * /
		char * filename0,filename1;    /  targets
		
		getopts(**argv,argc,"a0b-c:d1");

		opt_a 	= OPTIA[0];
		opt_b0 	= OPTIA[1];     / * default 0  * /
		opt_b1 	= OPTIA[2];     / * default -1 * /
		opt_c 	= (char *) OPTIA[3]; / * refer to ARGV[5] 
		opt_d 	= OPTIA[4];
		if(TGTYAS == 2){ 
			filename0 = TGTYA[0];   //  refer to ARGV[0]  "target0" 
			filename1 = TGTYA[1];   //  "target1"
		}	
		
*/

extern int 		sbGetOpts(char ** argv ,int argc , char * arglist );

/*
   int sbIsNumeric(char * s)
   		数値変換可能な文字列かを真偽値で返します
*/

extern int 		sbIsNumeric(char *);

/*
 *   sbLength(char * str)
 *
 *  文字列の長さを返します。
 *  ヌル文字列の場合 0 が入ります。
 * 
 */

extern int 		sbLength(char *);

/*
   __0 は sb関数のデフォルトの処理対象になる文字列
 */

extern u8 		__0[];

extern int 		sbIndex(char * str , char target);
extern void * 	sbShift(void ** array , int * size );

extern int   	sbSplit(char * str , char disc , char * first_receipt , ... );
extern int 		OPTIA[16];
extern int 		OPTIAS;
extern char 	*TGTPYA[16];
extern int 		TGTPYAS;
extern u8       EXEPATHYA[];
extern u8       EXENAMEYA[];
extern long		sbStr2Long(char * str);


extern u8 * 	sbGetSp(int no);
extern void		sbCopySp( u8 * dest ,int no );
extern void		sbStrCopy(u8 * from ,u8 * __0 ,int length );
extern void 	sbFillZero(void * dest, size_t size)	   ;

extern int		sbJoin(char * receipt , ... );
extern char    	debug_wait(int line_number);
extern FILE *	sbBinOpen(char * filename , char * mode);
extern void 	sbErrStopSSI(char * str ,char * s1 ,char * s2 ,int i ,int stop);
extern void 	sbPutLong(FILE * p ,int num);
extern char 	NULSTR[1];

extern FILE *	sbOpen(char * filename , char * mode);
extern s32		sbClose(FILE *p);

extern int		sbMatch3( u8 * linepy , u8 * wordpy ,u8 * s1 ,u8 * s2 ,u8 * s3 );

extern s32 sbAssertIIS(int linenum ,int i, char * s, int stop);
extern void sbErrStopIIS(int linenum ,int i, char * s, int stop);

#define es(i,s) sbErrStopIIS(__LINE__,i,s,1)
#define pf(i,s) sbErrStopIIS(__LINE__,i,s,0)
#define sbAssert(s,i) sbAssertIIS(__LINE__,i,s,1)
#define sbWarning(s,i) sbAssertIIS(__LINE__,i,s,0)

#endif

/*
   sbMatch について現在わかっている不具合点

   ・? で両方マッチした場合 ない方が優先される  beer ~=  /be?e/  -> $& = be  
   ・終端マッチは _n にきちんと値が入らない。  kre ~= /k(.*)$/ ->  _1 = NULL; 

*/