darknet  v3
option_list.c
Go to the documentation of this file.
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include "option_list.h"
5 #include "utils.h"
6 
7 list *read_data_cfg(char *filename)
8 {
9  FILE *file = fopen(filename, "r");
10  if(file == 0) file_error(filename);
11  char *line;
12  int nu = 0;
13  list *options = make_list();
14  while((line=fgetl(file)) != 0){
15  ++ nu;
16  strip(line);
17  switch(line[0]){
18  case '\0':
19  case '#':
20  case ';':
21  free(line);
22  break;
23  default:
24  if(!read_option(line, options)){
25  fprintf(stderr, "Config file error line %d, could parse: %s\n", nu, line);
26  free(line);
27  }
28  break;
29  }
30  }
31  fclose(file);
32  return options;
33 }
34 
36 {
37  metadata m = {0};
38  list *options = read_data_cfg(file);
39 
40  char *name_list = option_find_str(options, "names", 0);
41  if(!name_list) name_list = option_find_str(options, "labels", 0);
42  if(!name_list) {
43  fprintf(stderr, "No names or labels found\n");
44  } else {
45  m.names = get_labels(name_list);
46  }
47  m.classes = option_find_int(options, "classes", 2);
48  free_list(options);
49  return m;
50 }
51 
52 int read_option(char *s, list *options)
53 {
54  size_t i;
55  size_t len = strlen(s);
56  char *val = 0;
57  for(i = 0; i < len; ++i){
58  if(s[i] == '='){
59  s[i] = '\0';
60  val = s+i+1;
61  break;
62  }
63  }
64  if(i == len-1) return 0;
65  char *key = s;
66  option_insert(options, key, val);
67  return 1;
68 }
69 
70 void option_insert(list *l, char *key, char *val)
71 {
72  kvp *p = malloc(sizeof(kvp));
73  p->key = key;
74  p->val = val;
75  p->used = 0;
76  list_insert(l, p);
77 }
78 
80 {
81  node *n = l->front;
82  while(n){
83  kvp *p = (kvp *)n->val;
84  if(!p->used){
85  fprintf(stderr, "Unused field: '%s = %s'\n", p->key, p->val);
86  }
87  n = n->next;
88  }
89 }
90 
91 char *option_find(list *l, char *key)
92 {
93  node *n = l->front;
94  while(n){
95  kvp *p = (kvp *)n->val;
96  if(strcmp(p->key, key) == 0){
97  p->used = 1;
98  return p->val;
99  }
100  n = n->next;
101  }
102  return 0;
103 }
104 char *option_find_str(list *l, char *key, char *def)
105 {
106  char *v = option_find(l, key);
107  if(v) return v;
108  if(def) fprintf(stderr, "%s: Using default '%s'\n", key, def);
109  return def;
110 }
111 
112 int option_find_int(list *l, char *key, int def)
113 {
114  char *v = option_find(l, key);
115  if(v) return atoi(v);
116  fprintf(stderr, "%s: Using default '%d'\n", key, def);
117  return def;
118 }
119 
120 int option_find_int_quiet(list *l, char *key, int def)
121 {
122  char *v = option_find(l, key);
123  if(v) return atoi(v);
124  return def;
125 }
126 
127 float option_find_float_quiet(list *l, char *key, float def)
128 {
129  char *v = option_find(l, key);
130  if(v) return atof(v);
131  return def;
132 }
133 
134 float option_find_float(list *l, char *key, float def)
135 {
136  char *v = option_find(l, key);
137  if(v) return atof(v);
138  fprintf(stderr, "%s: Using default '%lf'\n", key, def);
139  return def;
140 }
void list_insert(list *l, void *val)
Definition: list.c:40
Definition: darknet.h:596
void option_insert(list *l, char *key, char *val)
Definition: option_list.c:70
struct node * next
Definition: darknet.h:598
int classes
Definition: darknet.h:36
void option_unused(list *l)
Definition: option_list.c:79
void free_list(list *l)
Definition: list.c:67
char ** names
Definition: darknet.h:37
char * key
Definition: option_list.h:6
int read_option(char *s, list *options)
Definition: option_list.c:52
Definition: option_list.h:5
char * option_find(list *l, char *key)
Definition: option_list.c:91
list * read_data_cfg(char *filename)
Definition: option_list.c:7
int used
Definition: option_list.h:8
void file_error(char *s)
Definition: utils.c:281
int option_find_int(list *l, char *key, int def)
Definition: option_list.c:112
char * fgetl(FILE *fp)
Definition: utils.c:335
metadata get_metadata(char *file)
Definition: option_list.c:35
float option_find_float_quiet(list *l, char *key, float def)
Definition: option_list.c:127
void * val
Definition: darknet.h:597
char ** get_labels(char *filename)
Definition: data.c:657
node * front
Definition: darknet.h:604
int option_find_int_quiet(list *l, char *key, int def)
Definition: option_list.c:120
char * option_find_str(list *l, char *key, char *def)
Definition: option_list.c:104
Definition: darknet.h:602
float option_find_float(list *l, char *key, float def)
Definition: option_list.c:134
list * make_list()
Definition: list.c:5
void strip(char *s)
Definition: utils.c:302
char * val
Definition: option_list.h:7