Shammer's Philosophy

My private adversaria

URLからプロトコルを取り出す

HTTP Client 作成の一環で、引数に渡された文字列をURLと想定し、そこからプロトコル部分を抜き出すという処理を書いてみた。Cには、期待する形で使用できるsubstringがなかったのでそれを自作し、その自作したsubstringを使用する形で書いてみた。

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

char * substring(const char str[], int s, int e){
    int start = s;
    int end = e;
    int length = end - start;
    if( length < 0 ){
	int temp = start;
	start = end;
	end = temp;
	length = length * -1;
    }
    if( end > strlen(str) ){
	end = strlen(str);
	length = end - start;
    }
    char * value = (char *)malloc(sizeof(char) * (length + 1));
    int i = 0;
    while( i < length ){
	value[i] = str[start + i];
	i++;
    }
    value[length] = '\0';
    return value;
}

char * get_protocol(const char * url){
    char *value = (char *)malloc(sizeof(char));
    char * delimiter = "://";
    int length = strlen(url);
    int loop = length - strlen(delimiter);
    int i;
    for( i = 0 ; i < loop ; i++ ){
	if( url[i] == delimiter[0] ){
	    i++;
	    if( url[i] == delimiter[1] ){
		i++;
		if( url[i] == delimiter[2] ){
		    i++;
		    break;
		}
		else { continue; }
	    }
	    else { continue; }
	}
	else { continue; }
    }
    if( i != loop ) {
	// url includes "://".
	// substring 2nd argument is less i than delimiter length.
	value = substring(url, 0, (i - strlen(delimiter)));
    }
    else {
	value[0] = '\0';
    }
    
    return value;
}

int main(int argc, char * args[]){
    char * protocol = get_protocol(args[1]);
    printf("%s\n", protocol);
    return 0;
}

単純にstrstr関数を使用できなかったのもイタい。strstr関数は、合致した以降の文字列を返すような実装になっているが、単純に何文字目で合致したかを返す関数があると楽かもしれない。この部分を切り出すべきだろうか。