sub.h
5.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/*
* 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;
*/