1. [CNN classifier / YOLO DARKNET] classifier code review :: Intro- [1]
2. [CNN classifier / YOLO DARKNET] classifier code review :: load_network- [2.1]
저번 포스팅에서는 load_network함수의 parse_network_cfg 함수까지 개략적으로 살펴보았습니다.
이번 포스팅은 parse_network_cfg함수의 한줄한줄씩, 코드 리뷰를 진행하도록 하겠습니다.
1. read_cfg:: src/parse.c
read_cfg함수는 parse.c 파일에 위치하고 있습니다.
parse_network_cfg 함수안에서는 1번째 라인에 read_cfg 코드가 다음과 같이 나타나있습니다.
1. filename이라는 인자를 받아 read_cfg를 통과하고 나온 반환값을 list구조체 포인터 section에 대입합니다.
즉, read_cfg함수를 통해서 반환되는 것은 list구조체라는 것을 알 수 있습니다.
network *parse_network_cfg(char *filename) { list *sections = read_cfg(filename); ... }
이제 read_cfg 함수의 전체 코드를 보도록 하겠습니다.
1. 인자로 받은 filename(*.cfg 파일의 file location)을 read 모드로 open합니다.
2. options이라는 빈 리스트 구조체를 생성합니다.
3. current라는 빈 section 구조체를 생성합니다.
4. *.cfg파일을 읽어들이면서, 공백 및 불필요한 문자를 제거해줍니다.
5. 문자 '['가 나오면 section을 초기화합니다.
6. 그리고 section구조체 멤버인 option 리스트도 초기화합니다.
7. options리스트에 section구조체를 insert합니다.
8. section구조체 멤버변수 type에는 문자 '['가 나타난 line을 넣어줍니다.
9. 그 외의 경우에는 line을 읽어들이고, 문자'='를 기점으로 {key:value}상을 만들어서 section구조체의 멤버 변수 option리스트에 넣어줍니다.
10. 그렇게 반복이 끝나면, options 리스트를 반환합니다.
list *read_cfg(char *filename) { FILE *file = fopen(filename, "r"); if(file == 0) file_error(filename); char *line; int nu = 0; list *options = make_list(); section *current = 0; while((line=fgetl(file)) != 0){ ++ nu; strip(line); switch(line[0]){ case '[': current = malloc(sizeof(section)); list_insert(options, current); current->options = make_list(); current->type = line; break; case '\0': case '#': case ';': free(line); break; default: if(!read_option(line, current->options)){ fprintf(stderr, "Config file error line %d, could parse: %s\n", nu, line); free(line); } break; } } fclose(file); return options; }