Post

DarkNet 시리즈 - Option List

option_list

read_data_cfg

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
list *read_data_cfg(char *filename)
{
    FILE *file = fopen(filename, "r");
    if(file == 0) file_error(filename);
    char *line;
    int nu = 0;
    list *options = make_list();
    while((line=fgetl(file)) != 0){
        ++ nu;
        strip(line);
        switch(line[0]){
            case '\0':
            case '#':
            case ';':
                free(line);
                break;
            default:
                if(!read_option(line, options)){
                    fprintf(stderr, "Config file error line %d, could parse: %s\n", nu, line);
                    free(line);
                }
                break;
        }
    }
    fclose(file);
    return options;
}

함수 이름: read_data_cfg

입력:

  • filename (char *): 읽을 파일의 이름

동작:

  • 지정된 파일에서 데이터 구성 파일을 읽어들이고 각 설정 옵션을 구문 분석하여 연결 리스트로 반환한다.

설명:

  • 지정된 파일을 열고 파일을 성공적으로 열지 못한 경우 오류 메시지를 출력한다.
  • 파일에서 한 줄씩 읽으며 각 줄의 첫 문자를 확인하여 옵션을 구문 분석한다.
  • 읽은 옵션을 옵션 연결 리스트에 추가하고 이를 반환한다.

get_metadata

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
metadata get_metadata(char *file)
{
    metadata m = {0};
    list *options = read_data_cfg(file);

    char *name_list = option_find_str(options, "names", 0);
    if(!name_list) name_list = option_find_str(options, "labels", 0);
    if(!name_list) {
        fprintf(stderr, "No names or labels found\n");
    } else {
        m.names = get_labels(name_list);
    }
    m.classes = option_find_int(options, "classes", 2);
    free_list(options);
    return m;
}

함수 이름: get_metadata

입력:

  • char *file (메타데이터 파일 이름)

동작:

  • 지정된 메타데이터 파일을 읽고, 이름 또는 레이블 목록을 찾아서 가져와서 metadata 구조체를 반환함.

설명:

  • 함수는 metadata 구조체를 반환하며, 이 구조체는 클래스 수와 레이블 이름을 저장함.
  • 함수는 지정된 메타데이터 파일을 읽어들이고, “names” 또는 “labels” 필드에서 레이블 이름을 찾음.
  • 레이블 이름은 쉼표(,)로 구분된 문자열로 구성되며, get_labels() 함수를 사용하여 리스트로 변환함.
  • 함수는 “classes” 필드에서 클래스 수를 찾음.
  • 함수는 메타데이터 파일에서 읽은 모든 필드를 해제함.

read_option

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int read_option(char *s, list *options)
{
    size_t i;
    size_t len = strlen(s);
    char *val = 0;
    for(i = 0; i < len; ++i){
        if(s[i] == '='){
            s[i] = '\0';
            val = s+i+1;
            break;
        }
    }
    if(i == len-1) return 0;
    char *key = s;
    option_insert(options, key, val);
    return 1;
}

함수 이름: read_option

입력:

  • char 포인터 s (설정 파일에서 읽은 한 줄의 문자열)
  • list 포인터 options (설정 값을 저장하는 연결 리스트)

동작:

  • 입력으로 받은 문자열 s를 key-value 쌍으로 분리하고, key와 value를 options 리스트에 추가한다.

설명:

  • s 문자열에서 ‘=’ 문자를 찾아 그 위치를 기준으로 key와 value를 구분한다.
  • key와 value를 options 리스트에 추가한다.
  • 설정 파일에서 한 줄을 잘못 읽거나 ‘=’ 문자가 없는 경우에는 0을 반환하여 오류를 나타낸다.

option_insert

1
2
3
4
5
6
7
8
void option_insert(list *l, char *key, char *val)
{
    kvp *p = malloc(sizeof(kvp));
    p->key = key;
    p->val = val;
    p->used = 0;
    list_insert(l, p);
}

함수 이름: option_insert

입력:

  • l: option_insert를 수행할 list 구조체 포인터
  • key: 삽입할 key 문자열 포인터
  • val: 삽입할 value 문자열 포인터

동작:

  • 주어진 key와 val을 새로운 kvp 구조체에 저장하고, used는 0으로 초기화한 뒤, list l에 새로운 kvp 구조체를 삽입한다.

설명:

  • option_insert 함수는 key와 value를 갖는 새로운 kvp 구조체를 생성하여, 입력받은 list l에 삽입하는 함수이다.
  • kvp 구조체는 key와 val, 그리고 이 kvp가 사용되었는지를 나타내는 used 필드로 이루어져 있다.
  • option_insert 함수는 주어진 key와 val로 새로운 kvp 구조체를 생성하고, used를 0으로 초기화한 뒤, 이를 list l에 삽입한다.

option_unused

1
2
3
4
5
6
7
8
9
10
11
void option_unused(list *l)
{
    node *n = l->front;
    while(n){
        kvp *p = (kvp *)n->val;
        if(!p->used){
            fprintf(stderr, "Unused field: '%s = %s'\n", p->key, p->val);
        }
        n = n->next;
    }
}

함수 이름: option_unused

입력:

  • list 포인터 l

동작:

  • l 리스트에 있는 모든 kvp(key-value pair)들 중에 사용되지 않은 kvp들을 찾아서 stderr로 출력한다.

설명:

  • 이 함수는 list l에 있는 kvp들 중에 사용되지 않은 kvp들을 찾아서 출력하는 함수이다.
  • l은 linked list 구조체의 포인터이다.
  • kvp 구조체는 key-value pair를 나타내는 구조체로 key와 val로 이루어져 있다.
  • n은 linked list에서 현재 검사 중인 노드를 가리키는 포인터이다.
  • while문은 linked list의 모든 노드를 검사한다.
  • p는 현재 노드의 kvp를 가리키는 포인터이다.
  • 만약 현재 kvp가 사용되지 않았으면, 해당 kvp의 key와 val을 stderr로 출력한다.
  • n은 다음 노드를 가리키는 포인터로 업데이트된다.

option_find

1
2
3
4
5
6
7
8
9
10
11
12
13
char *option_find(list *l, char *key)
{
    node *n = l->front;
    while(n){
        kvp *p = (kvp *)n->val;
        if(strcmp(p->key, key) == 0){
            p->used = 1;
            return p->val;
        }
        n = n->next;
    }
    return 0;
}

함수 이름: option_find

입력:

  • list 포인터 l
  • char 포인터 key

동작:

  • 주어진 key로 list l에서 kvp 구조체의 key와 비교하여 일치하는 key를 찾고 해당하는 kvp 구조체의 val 포인터를 반환하고, 사용된 kvp 구조체의 used 값을 1로 설정한다.

설명:

  • option_find 함수는 주어진 key에 해당하는 값(val)을 찾는 함수로, 이를 위해 key-value pair(kvp) 구조체를 활용한다.
  • l은 kvp 구조체를 모아둔 list를 가리키는 포인터이며, key는 찾고자 하는 값의 key를 가리키는 포인터이다.
  • 반환값은 찾은 값(val)의 포인터이며, 해당하는 key가 없을 경우 0을 반환한다.

option_find_str

1
2
3
4
5
6
7
char *option_find_str(list *l, char *key, char *def)
{
    char *v = option_find(l, key);
    if(v) return v;
    if(def) fprintf(stderr, "%s: Using default '%s'\n", key, def);
    return def;
}

함수 이름: option_find_str

입력:

  • list *l: 옵션 리스트
  • char *key: 검색할 옵션 키
  • char *def: 옵션이 없을 경우 반환할 기본값

동작:

  • 주어진 리스트에서 주어진 키를 검색하고 해당하는 값이 있다면 반환한다.
  • 값이 없는 경우, 기본값(def)을 반환하고 해당하는 키와 기본값을 에러 메시지로 출력한다.

설명:

  • 이 함수는 주어진 리스트에서 특정 옵션의 값을 검색하는 함수이다.
  • 만약 해당하는 옵션의 값이 있다면 문자열 형태로 반환한다.
  • 옵션이 없는 경우, 기본값(def)을 반환하고 해당하는 키와 기본값을 에러 메시지로 출력한다.
  • 이 함수는 YOLO와 같은 딥러닝 모델에서 사용되는 옵션 값을 가져오는 데 사용된다.

option_find_int

1
2
3
4
5
6
7
int option_find_int(list *l, char *key, int def)
{
    char *v = option_find(l, key);
    if(v) return atoi(v);
    fprintf(stderr, "%s: Using default '%d'\n", key, def);
    return def;
}

함수 이름: option_find_int

입력:

  • list *l: 연결 리스트 포인터
  • char *key: 찾으려는 옵션 키 문자열 포인터
  • int def: 기본값

동작:

  • 입력된 연결 리스트에서 주어진 옵션 키를 찾아 해당 값의 정수형을 반환한다.
  • 해당 옵션 키가 없을 경우 기본값을 반환하고 표준 오류 출력에 해당 옵션 키와 기본값을 출력한다.

설명:

  • 입력된 연결 리스트는 옵션 키와 값의 쌍을 저장하고 있다.
  • option_find 함수를 이용해 주어진 옵션 키에 해당하는 값 문자열 포인터를 찾는다.
  • 찾은 문자열 포인터를 atoi 함수를 이용해 정수형으로 변환하고 반환한다.
  • 해당 옵션 키가 없을 경우 표준 오류 출력에 해당 옵션 키와 기본값을 출력하고 기본값을 반환한다.

option_find_int_quiet

1
2
3
4
5
6
int option_find_int_quiet(list *l, char *key, int def)
{
    char *v = option_find(l, key);
    if(v) return atoi(v);
    return def;
}

함수 이름: option_find_int_quiet

입력:

  • list *l: 설정 파일에서 읽어온 설정들이 저장된 list 구조체 포인터
  • char *key: 읽어올 설정의 이름
  • int def: 설정 파일에서 해당 key에 대한 값을 찾지 못했을 경우 사용할 기본값

동작:

  • 입력으로 받은 key에 해당하는 값을 설정 파일에서 찾습니다.
  • 해당 값이 존재할 경우 int 형태로 변환하여 반환합니다.
  • 해당 값이 존재하지 않을 경우 기본값 def를 사용합니다.
  • 출력을 하지 않습니다.

설명:

  • 이 함수는 설정 파일에서 int 형태의 값을 읽어오기 위해 사용됩니다.
  • 입력으로 받은 설정 파일(list 구조체)에서 key에 해당하는 값을 찾습니다.
  • 찾은 값을 atoi 함수를 이용하여 int 형태로 변환합니다.
  • 만약 key에 해당하는 값이 존재하지 않을 경우 기본값 def를 사용합니다.
  • 이 함수는 설정 파일에서 읽어온 int 값을 반환합니다.
  • 만약 설정 파일에서 해당 key에 대한 값을 찾지 못했을 경우, 기본값 def를 사용합니다.
  • 이 함수는 출력을 하지 않습니다.

option_find_float_quiet

1
2
3
4
5
6
float option_find_float_quiet(list *l, char *key, float def)
{
    char *v = option_find(l, key);
    if(v) return atof(v);
    return def;
}

함수 이름: option_find_float_quiet

입력:

  • list *l: 설정 파일에서 읽어온 설정들이 저장된 list 구조체 포인터
  • char *key: 읽어올 설정의 이름
  • float def: 설정 파일에서 해당 key에 대한 값을 찾지 못했을 경우 사용할 기본값

동작:

  • 입력으로 받은 key에 해당하는 값을 설정 파일에서 찾습니다.
  • 해당 값이 존재할 경우 float 형태로 변환하여 반환합니다.
  • 해당 값이 존재하지 않을 경우 기본값 def를 사용합니다.
  • 출력을 하지 않습니다.

설명:

  • 이 함수는 설정 파일에서 float 형태의 값을 읽어오기 위해 사용됩니다.
  • 입력으로 받은 설정 파일(list 구조체)에서 key에 해당하는 값을 찾습니다.
  • 찾은 값을 atof 함수를 이용하여 float 형태로 변환합니다.
  • 만약 key에 해당하는 값이 존재하지 않을 경우 기본값 def를 사용합니다.
  • 이 함수는 설정 파일에서 읽어온 float 값을 반환합니다.
  • 만약 설정 파일에서 해당 key에 대한 값을 찾지 못했을 경우, 기본값 def를 사용합니다.
  • 이 함수는 출력을 하지 않습니다.

option_find_float

1
2
3
4
5
6
7
float option_find_float(list *l, char *key, float def)
{
    char *v = option_find(l, key);
    if(v) return atof(v);
    fprintf(stderr, "%s: Using default '%lf'\n", key, def);
    return def;
}

함수 이름: option_find_float

입력:

  • list *l: 설정 파일에서 읽어온 설정들이 저장된 list 구조체 포인터
  • char *key: 읽어올 설정의 이름
  • float def: 설정 파일에서 해당 key에 대한 값을 찾지 못했을 경우 사용할 기본값

동작:

  • 입력으로 받은 key에 해당하는 값을 설정 파일에서 찾습니다.
  • 해당 값이 존재할 경우 float 형태로 변환하여 반환합니다.
  • 해당 값이 존재하지 않을 경우 기본값 def를 사용합니다.

설명:

  • 이 함수는 설정 파일에서 float 형태의 값을 읽어오기 위해 사용됩니다.
  • 입력으로 받은 설정 파일(list 구조체)에서 key에 해당하는 값을 찾습니다.
  • 찾은 값을 atof 함수를 이용하여 float 형태로 변환합니다.
  • 만약 key에 해당하는 값이 존재하지 않을 경우 기본값 def를 사용합니다.
  • 이 함수는 설정 파일에서 읽어온 float 값을 반환합니다.
  • 만약 설정 파일에서 해당 key에 대한 값을 찾지 못했을 경우, 기본값 def를 사용하고 사용한 값을 stderr에 출력합니다.
This post is licensed under CC BY 4.0 by the author.