手抜きです
バグなど少しでもパフォーマンス改善できる所を教えてくれると嬉しいです
出来ればurl解析機バージョン0.1作りたいと思う
設計
1. 日本語文字列を配列にしまう
2. 配列にした文字列をfor分でワイド文字に変換する
3:1. "/'をカウントする
2. '/"二個になったらrhostを+=で増えるようにする
2:0. '/"が三個になったらcontinueで処理をスキップする
3. '/"が三個以上になったらrpathを+=で増えるようにする
4. 最後にリフレッシュする
参考にしたサイト
viewtopic.php?f=3&t=21106&sid=c2e081fe9 ... aaaeed9a47
https://programming-place.net/ppp/conte ... toc32.html
https://www.ibm.com/support/knowledgece ... m#mbrtoc32
環境 {
cコンパイラ: MinGW-W64 8.1.0,
os: windows 10 20hb,
ライブラリ{
stdio.h,
string.h,
uchar.h,
limits.h,
stdlib.h,
}
}
#include <stdio.h>
#include <string.h>
#include <uchar.h>
#include <limits.h>
#include <stdlib.h>
int geturlparserfunc(const char*, char*, char*);
int main(void)
{
char hostname, pathname;
geturlparserfunc("", &hostname, &pathname);
printf("ホスト名; %s\n", hostname);
printf("パッチ名: %s\n", pathname);
}
int geturlparserfunc(const char* name, char* rhost, char* rpath)
{
size_t bmfunc_rlen;
char32_t inp32b[MB_LEN_MAX * 5];
int inputlen = strlen(name) + 5;
char input[(int)inputlen];
int arraycount1 = 0, arraycount2 = 0;
int slashconunt = 0, colon = 0;
char temppath[MB_LEN_MAX * 5];
char temphost[MB_LEN_MAX * 5];
strcpy_s(input, inputlen+3, (char*)(name));
input[inputlen] = '\0';
for (int n = 0; inputlen > n ; ++n){
bmfunc_rlen = mbrtoc32(&inp32b[arraycount1], &input[arraycount2],MB_LEN_MAX * 5, NULL);
if (( (size_t)(0) == bmfunc_rlen ) ){
break;
} else if ( (size_t)(0) < bmfunc_rlen ){
arraycount1++;
arraycount2 += (int)(bmfunc_rlen);
} else if ( (size_t)(-3) == bmfunc_rlen ){
arraycount1++;
continue;
} else if ( (size_t)(-1) == bmfunc_rlen ){
printf("エラーが発生しました\n");
printf("エンコードエラー又はバイト数が足りませんの可能性があります。");
printf("エラーコード: %s\n", bmfunc_rlen);
break;
} else if ( (size_t)(-2) == bmfunc_rlen ){
printf("エラーが発生しました\n");
printf("マルチバイト文字の可能性があります。");
printf("エラーコード: %s\n", bmfunc_rlen);
break;
}
}
for ( int n = 0; n < arraycount1; n++ ){
if (inp32b[n] == ':' || inp32b[n] == '/'){
if (inp32b[n] == ':'){
colon = 1;
}
if (inp32b[n] == '/'){
slashconunt += 1;
}
}
if (colon == 1 && slashconunt == 2){
// rhost 処理
bmfunc_rlen = c32rtomb(temphost ,inp32b[n], NULL);
if (bmfunc_rlen == -1){
printf("エラーが発生しました\n");
printf("有効なワイド文字ではありません\n");
printf("エラーコード: %s\n", bmfunc_rlen);
break;
}
*rhost += *(char*)(temphost);
if (slashconunt == 3) {
continue;
}
} else if (colon == 1 && slashconunt > 3) {
bmfunc_rlen = c32rtomb(temppath ,inp32b[n], NULL);
if (bmfunc_rlen == -1){
printf("エラーが発生しました\n");
printf("有効なワイド文字ではありません\n");
printf("エラーコード: %s\n", bmfunc_rlen);
break;
}
*rpath += *(char*)(temppath);
}
}
arraycount1 = 0, arraycount2 = 0, slashconunt = 0, colon = 0 , bmfunc_rlen = 0;
memset(inp32b, '\0', sizeof(inp32b)), memset(input, '\0', sizeof(input));
return 0;
}