3 public class StringEx {
\r
4 public static int InStrEx(int uStart, char[] sText1, char[] sText2)
\r
11 uLen1 = StdLib.strlen(sText1);
\r
12 uLen2 = StdLib.strlen(sText2);
\r
13 if(!(uLen1 > 0) || !(uLen2 > 0) || !(uStart > 0) || uStart > (uLen1 - uLen2 + 1))
\r
16 sFound = StdLib.strstr(sText1, uStart - 1, sText2);
\r
18 //return sFound - sText1 + 1;
\r
24 public static int TextToIntArray(char[] sText, int[] pdwValue, int iSize, boolean bCompress){
\r
34 char[] sNum = new char[10];
\r
45 iLen = StdLib.strlen(sText);
\r
46 if(!StdLib.toBoolean(iLen))
\r
48 // for(i = 0; i < iLen; i++)
\r
49 // // 2バイト文字が含まれていたら中止
\r
50 // if(_ismbblead(sText[i]))
\r
54 sBuff = new char[iLen * 4 + 1];
\r
56 for(i = 0; i < iLen; i++){
\r
57 if(StdLib.isalpha(sText[i])){
\r
59 sBuff[iCount] = '\0';
\r
60 //wsprintf(sNum, " %02d ", StdLib.tolower(sText[i]) - 'a' + 10);
\r
61 StdLib.wsprintf(sNum, StdLib.tolower(sText[i]) - 'a' + 10);
\r
62 StdLib.strcat(sBuff, sNum);
\r
66 sBuff[iCount] = sText[i];
\r
72 sTrans = new char[iLen + 1];
\r
75 // 内部状態 ch が取りうる値は '0'、'1'、' '、'-' の4つで、それぞれ
\r
76 // 「区切られた数字」「区切られていない数字」「区切り」「継続」を表す
\r
77 for(i = 0; i < iLen; i++){
\r
93 // 内部状態が区切られた数字なら空白を出力
\r
94 sTrans[iCount] = ' ';
\r
97 // 数字を出力して、内部状態を区切られていない数字に変更
\r
98 sTrans[iCount] = sBuff[i];
\r
106 // 内部状態が区切られていない数字なら、これを区切られた数字に変更
\r
113 // 内部状態が区切りでなければ空白を出力
\r
114 sTrans[iCount] = ' ';
\r
124 // 内部状態が継続でなければ範囲記号を出力
\r
125 sTrans[iCount] = '-';
\r
142 sTrans[iCount] = '\0';
\r
145 iIndex = InStrEx(1, sTrans, StdLib.stoc(" - "));
\r
147 sTrans[iIndex] = '\0';
\r
148 StdLib.strcpy(sBuff, sTrans);
\r
149 //StdLib.strcat(sBuff, sTrans + iIndex + 2);
\r
150 StdLib.strcat(sBuff, sTrans, iIndex + 2);
\r
151 StdLib.strcpy(sTrans, sBuff);
\r
152 iIndex = InStrEx(1, sTrans, StdLib.stoc(" - "));
\r
154 if(sTrans[0] == '-' && sTrans[1] == ' '){
\r
156 //StdLib.strcpy(sBuff, sTrans + 2);
\r
157 StdLib.strcpy(sBuff, sTrans, 2);
\r
158 StdLib.strcpy(sTrans, sBuff);
\r
160 iCount = StdLib.strlen(sTrans);
\r
162 if(sTrans[iCount - 1] == '-' && sTrans[iCount - 2] == ' ')
\r
164 sTrans[iCount - 2] = '\0';
\r
165 if(!StdLib.toBoolean(StdLib.strlen(sTrans))){
\r
166 // 文字列に数字が指定されていなければ関数を抜ける
\r
178 iIndex = InStrEx(1, sTrans, StdLib.stoc(" "));
\r
181 iIndex = InStrEx(iIndex + 2, sTrans, StdLib.stoc(" "));
\r
184 pdwBuff = new int[iBlock];
\r
185 // 整形された文字列を自然数の配列に変換
\r
187 for(i = 0; i < iBlock; i++){
\r
188 //strcpy(sBuff, sTrans + iStart);
\r
189 StdLib.strcpy(sBuff, sTrans, iStart);
\r
190 iEnd = InStrEx(1, sBuff, StdLib.stoc(" "));
\r
191 iIndex = InStrEx(1, sBuff, StdLib.stoc("-"));
\r
192 if(StdLib.toBoolean(iEnd))
\r
194 sBuff[iEnd - 1] = '\0';
\r
197 iEnd = StdLib.strlen(sBuff) + 1;
\r
198 if(StdLib.toBoolean(iIndex) && iIndex < iEnd){
\r
200 sBuff[iIndex - 1] = '\0';
\r
201 wFirst = StdLib.atoi(sBuff);
\r
202 //wLast = StdLib.atoi(sBuff + iIndex);
\r
203 wLast = StdLib.atoi(sBuff, iIndex);
\r
204 if(iIndex == iEnd - 1)
\r
206 if(wFirst > wLast){
\r
207 // 範囲の開始数が終了数より大きければこれを交換
\r
212 if(wFirst == wLast)
\r
213 // 範囲の開始数と終了数が同じなら単独の数値とみなす
\r
214 pdwBuff[i] = wFirst;
\r
216 pdwBuff[i] = StdLib.MAKELONG(wFirst, wLast);
\r
220 pdwBuff[i] = StdLib.atoi(sBuff);
\r
225 for(i = 0; i < iBlock - 1; i++){
\r
226 for(j = i + 1; j < iBlock; j++){
\r
227 if(StdLib.LOWORD(pdwBuff[j]) < StdLib.LOWORD(pdwBuff[i])){
\r
228 dwSwap = pdwBuff[j];
\r
229 pdwBuff[j] = pdwBuff[i];
\r
230 pdwBuff[i] = dwSwap;
\r
234 // 単独の 0 があるかどうか調べる
\r
235 if(StdLib.toBoolean(pdwBuff[0]))
\r
243 for(i = 0; i < iBlock - 1; i++){
\r
244 for(j = i + 1; j < iBlock; j++){
\r
245 if(StdLib.toBoolean(pdwBuff[j]) && pdwBuff[j] == pdwBuff[i])
\r
249 // 連続する単独の数字を範囲に変換する
\r
250 for(i = 0; i < iBlock - 1; i++){
\r
251 if(!StdLib.toBoolean(StdLib.HIWORD(pdwBuff[i]))){
\r
252 wFirst = StdLib.LOWORD(pdwBuff[i]);
\r
254 for(j = i + 1; j < iBlock; j++){
\r
255 if(!StdLib.toBoolean(StdLib.HIWORD(pdwBuff[j]))){
\r
256 wLast = StdLib.LOWORD(pdwBuff[j]);
\r
257 if(wLast == wSwap + 1){
\r
258 pdwBuff[i] = StdLib.MAKELONG(wFirst, wLast);
\r
266 // 範囲内に単独の数字、重なる範囲、およびその前後の数字を取り込む
\r
267 for(i = 0; i < iBlock; i++){
\r
268 wFirst = StdLib.LOWORD(pdwBuff[i]);
\r
269 wLast = StdLib.HIWORD(pdwBuff[i]);
\r
270 if(StdLib.toBoolean(wLast)){
\r
272 for(j = 0; j < iBlock; j++){
\r
273 wSwap = StdLib.LOWORD(pdwBuff[j]);
\r
274 if(j != i && (StdLib.toBoolean(wSwap) || bZero)){
\r
275 // 自分自身や指定されていない 0 はチェックしない
\r
276 if(StdLib.toBoolean(StdLib.HIWORD(pdwBuff[j]))){
\r
278 if(wFirst <= wSwap && wSwap <= wLast){
\r
279 wLast = Math.max(wLast, StdLib.HIWORD(pdwBuff[j]));
\r
280 pdwBuff[i] = StdLib.MAKELONG(wFirst, wLast);
\r
286 if(wFirst - 1 <= wSwap && wSwap <= wLast + 1){
\r
287 wFirst = Math.min(wFirst, wSwap);
\r
288 wLast = Math.max(wLast, wSwap);
\r
289 pdwBuff[i] = StdLib.MAKELONG(wFirst, wLast);
\r
299 while(i < iBlock - 1){
\r
300 if(StdLib.toBoolean(pdwBuff[i]))
\r
303 for(j = i + 1; j < iBlock; j++)
\r
304 pdwBuff[j - 1] = pdwBuff[j];
\r
306 pdwBuff[iBlock] = 0;
\r
310 while(i < iBlock && StdLib.toBoolean(pdwBuff[i]))
\r
315 wFirst = StdLib.LOWORD(pdwBuff[0]);
\r
316 if(StdLib.toBoolean(wFirst)){
\r
318 wLast = StdLib.HIWORD(pdwBuff[0]);
\r
319 if(StdLib.toBoolean(wLast)){
\r
322 pdwBuff[0] = StdLib.MAKELONG(0, wLast);
\r
324 for(i = iBlock; i > 0; i--)
\r
325 pdwBuff[i] = pdwBuff[i - 1];
\r
331 // 最初の数字が単独の数字だった場合
\r
333 pdwBuff[0] = StdLib.MAKELONG(0, 1);
\r
335 for(i = iBlock; i > 0; i--)
\r
336 pdwBuff[i] = pdwBuff[i - 1];
\r
348 // 整数配列が指定されていればここに値を格納
\r
349 if(pdwValue != null && StdLib.toBoolean(iSize)){
\r
350 iBlock = Math.min(iBlock, iSize);
\r
351 for(i = 0; i < iBlock; i++)
\r
352 pdwValue[i] = pdwBuff[i];
\r