summaryrefslogtreecommitdiff
path: root/src/util/config/serializers.cpp
blob: 15ddae07fc10779b7bb4b36928029d5d61058a46 (plain)
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "../config.h"

STR serialize_node( CFG_SERIALIZER* s, CFG_NODE* n ) {
  STR ret{};
  for( U32 i = 0; i < s->tabc * 2; ++i ) ret.append( " " );
  ret.fmt( "%s %s", cfg_types[n->type].def, n->name.data );

  return ret;
}

STR cfg_serialize_section( CFG_SERIALIZER* s, CFG_NODE *n ) {
  CFG_SECTION* sec = (CFG_SECTION*)n;
  STR buf;
  if( sec->parent ) {
    buf += serialize_node( s, n );
    buf += " {\n";
    s->tabc++;
  }

  for( U32 i = 0; i < sec->children.size; ++i ) {
    CFG_NODE* c = sec->children[i];
    if( c->type == CFGT_SECTION ) {
      buf += cfg_serialize_section( s, c );
      continue;
    }

    buf += cfg_types[c->type].serializer( s, c );
    buf += "\n";
  }

  if( sec->parent ) {
    s->tabc--;
    for( U32 i = 0 ; i < s->tabc * 2; ++i ) buf += ' ';
    buf += "}";
    if( sec->parent )
      buf += "\n";
  }

  return buf;
}

STR cfg_serialize_bytes( CFG_SERIALIZER* s, CFG_NODE* n ) {
  CFG_BYTES* b = (CFG_BYTES*)n;
  U32 size = b->size;
  U8* bytes = b->bytes;

  STR buf{};

  buf += serialize_node( s, n );
  buf.fmt( "[%d] = \"", size );
  for( U32 i = 0; i < size; ++i ) {
    buf.fmt( "%02X", bytes[i] );
  }
  buf += "\";";
  return buf;
}

STR cfg_serialize_str( CFG_SERIALIZER* s, CFG_NODE* n ) {
  CFG_STR* sn = (CFG_STR*)n;
  char* str = sn->str;

  STR buf{};

  buf += serialize_node( s, n );
  buf.fmt( "[%d] = \"%s\";", sn->len, str );
  return buf;
}

STR cfg_serialize_int( CFG_SERIALIZER* s, CFG_NODE* n ) {
  CFG_INT* i = (CFG_INT*)n;
  I32 ival = i->value;

  STR buf{};

  buf += serialize_node( s, n );
  buf.fmt( " = %d;", ival );
  return buf;
}

STR cfg_serialize_float( CFG_SERIALIZER* s, CFG_NODE* n ) {
  CFG_FLOAT* f = (CFG_FLOAT*)n;
  F32 fval = f->value;

  STR buf{};

  buf += serialize_node( s, n );
  buf.fmt( " = %g;", fval );
  return buf;
}

STR cfg_serialize_vec2( CFG_SERIALIZER* s, CFG_NODE* n ) {
  CFG_VEC2* v = (CFG_VEC2*)n;
  VEC2 val = v->value;

  STR buf{};

  buf += serialize_node( s, n );
  buf.fmt( " = { %g, %g };", val.x, val.y );
  return buf;
}

STR cfg_serialize_vec3( CFG_SERIALIZER* s, CFG_NODE* n ) {
  CFG_VEC3* v = (CFG_VEC3*)n;
  VEC3 val = v->value;

  STR buf{};

  buf += serialize_node( s, n );
  buf.fmt( " = { %g, %g, %g };", val.x, val.y, val.z );
  return buf;
}

STR cfg_serialize_clr( CFG_SERIALIZER* s, CFG_NODE* n ) {
  CFG_CLR* v = (CFG_CLR*)n;
  CLR val = v->value;

  STR buf{};

  buf += serialize_node( s, n );
  buf.fmt( " = { %g, %g, %g, %g };", val.r, val.g, val.b, val.a );
  return buf;
}