/vqdr/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/vqdr/trunk

« back to all changes in this revision

Viewing changes to src/libvee/utils.vala

  • Committer: Gustav Hartvigsson
  • Date: 2024-12-22 00:30:29 UTC
  • Revision ID: gustav.hartvigsson@gmail.com-20241222003029-k74ogrm32zobz325
[General] Split libvee into it's own library.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
namespace VQDR.Common.Utils {
 
1
/*
 
2
 * The contects of this file is in the Public Domain.
 
3
 *
 
4
 * Created by Gustav Hartivgsson.
 
5
 */
 
6
 
 
7
namespace Vee {
 
8
  public delegate void FreeFunc (void * ptr);
 
9
 
 
10
 
2
11
  public int str_cmp (string a, string b) {
3
12
    return a.collate (b);
4
13
  }
5
14
  
 
15
 
6
16
  public void print_ln (string str, ...) {
7
17
    var va = va_list ();
8
 
    
9
 
    // Reallocate the string as it is not owned by the function.
10
 
    var tmp = str + "\n";
11
 
    
12
 
    // Hopefully this does not create any memony leaks. :-)
13
 
    print (tmp.vprintf (va));
14
 
  }
15
 
  
 
18
    var tmp = str + "\n";
 
19
    stdout.vprintf (tmp, va);
 
20
  }
 
21
 
 
22
 
 
23
  public void err_print_ln (string str, ...) {
 
24
    var va = va_list ();
 
25
    var tmp = str + "\n";
 
26
    stderr.vprintf (tmp, va);
 
27
  }
 
28
 
 
29
 
16
30
  public string object_to_string (GLib.Object obj) {
17
 
    GLib.ObjectClass real_obj = (GLib.ObjectClass) obj.get_type ().class_ref ();
18
 
    
19
 
    var str_builder = new GLib.StringBuilder ();
20
 
    
21
 
    
22
 
    str_builder.append ("(")
 
31
     StringBuilder strbldr = new StringBuilder ();
 
32
     internal_object_to_string (obj, ref strbldr);
 
33
     return strbldr.str;
 
34
  }
 
35
 
 
36
 
 
37
  string collect_string (string[] segments, string? separator = null) {
 
38
    var _len = segments.length;
 
39
    if (_len == 0) {
 
40
      return "";
 
41
    }
 
42
    if (_len == 1) {
 
43
      return segments[0];
 
44
    }
 
45
    StringBuilder strbldr = new StringBuilder ();
 
46
    if (separator != null) {
 
47
      for (var i = 0; i <= _len; i++) {
 
48
        strbldr.append (segments[i]);
 
49
        if (i < _len) {
 
50
          strbldr.append (separator);
 
51
        }
 
52
      }
 
53
    } else {
 
54
      for (var i = 0; i <= _len; i++) {
 
55
        strbldr.append (segments[i]);
 
56
      }
 
57
    } 
 
58
    return strbldr.str;
 
59
  }
 
60
 
 
61
 
 
62
  internal unowned StringBuilder internal_object_to_string (GLib.Object obj,
 
63
                                                  ref StringBuilder str_builder,
 
64
                                                  int32 nesting = 0) {
 
65
    GLib.ObjectClass obj_class =
 
66
      (GLib.ObjectClass) obj.get_type ().class_ref ();
 
67
    
 
68
    for (var i = 0; i < nesting; i++) {
 
69
     str_builder.append ("\t");
 
70
    }
 
71
    
 
72
    str_builder.append ("((")
23
73
               .append (obj.get_type().name ())
24
 
               .append ("):\n");
 
74
               .append_printf (")->(%p):\n", obj);
25
75
    
26
 
    foreach (GLib.ParamSpec ps in real_obj.list_properties ()) {
 
76
    foreach (GLib.ParamSpec ps in obj_class.list_properties ()) {
27
77
      
28
78
      if (ps.value_type == 0 || ps.value_type == GLib.Type.INVALID) {
29
79
        continue;
36
86
      if (prop_val.type () == GLib.Type.INVALID || prop_val.type () == 0) {
37
87
        continue;
38
88
      }
39
 
      
 
89
 
40
90
      obj.get_property (prop_name, ref prop_val);
41
91
      
42
 
      
43
 
      str_builder.append ("\t (")
 
92
      for (var i = 0; i < nesting; i++) {
 
93
        str_builder.append ("\t");
 
94
      }
 
95
 
 
96
      str_builder.append ("\t(")
44
97
                 .append (prop_val.type_name ())
45
98
                 .append (") ")
46
99
                 .append (prop_name)
47
 
                 .append (": ");
48
 
      
49
 
      
 
100
                 .append (":");
 
101
 
50
102
      switch (prop_val.type ()) {
51
103
        case (GLib.Type.STRING):
52
 
          str_builder.append (prop_val.get_string ());
 
104
          if (prop_val.dup_string () == null) {
 
105
            str_builder.append ("(null)");
 
106
          } else {
 
107
            str_builder.append (prop_val.dup_string ());
 
108
          }
53
109
        break;
54
110
        case (GLib.Type.INT):
55
111
          str_builder.append (prop_val.get_int ().to_string ());
71
127
          str_builder.append (prop_val.get_enum ().to_string ());
72
128
        break;
73
129
        case (GLib.Type.FLAGS):
74
 
          // Probobly needs better handling, but this will do.
 
130
          // TODO: Probobly needs better handling, but this will do.
75
131
          str_builder.append (prop_val.get_flags ().to_string ());
76
132
        break;
77
133
        case (GLib.Type.FLOAT):
83
139
        case (GLib.Type.LONG):
84
140
          str_builder.append (prop_val.get_long ().to_string ());
85
141
        break;
86
 
        case (GLib.Type.OBJECT):
87
 
          str_builder.append_printf ("%llX", (((long)((pointer)prop_val.get_object ()))));
88
 
        break;
89
 
        case (GLib.Type.PARAM):
90
 
          var spsc = prop_val.get_param ();
91
 
          str_builder.append ("name: ")
92
 
                     .append (spsc.name)
93
 
                     .append (" type: ")
94
 
                     .append (spsc.value_type.name ());
95
 
        break;
96
142
        case (GLib.Type.POINTER):
97
 
          str_builder.append_printf ("%llX", (((long)prop_val.get_pointer ())));
 
143
          str_builder.append ("(")
 
144
                     .append_printf ("%p", prop_val.get_pointer ());
 
145
          str_builder.append (")");
 
146
        break;
 
147
        case (GLib.Type.BOXED):
 
148
          str_builder.append ("(")
 
149
                     .append_printf ("%p", prop_val.get_boxed ());
 
150
          str_builder.append (")");
98
151
        break;
99
152
        case (GLib.Type.UCHAR):
100
153
          var v = prop_val.get_uchar ();
113
166
          str_builder.append (prop_val.get_ulong ().to_string ());
114
167
        break;
115
168
        case (GLib.Type.VARIANT):
116
 
          GLib.Variant v = prop_val.get_variant ();
117
 
          str_builder.append ("(\n")
118
 
                     .append (v.print (true))
119
 
                     .append ("\n)");
 
169
          GLib.Variant v = prop_val.dup_variant ();
 
170
          GLib.Variant? tv = null;
 
171
          unowned string ts1 = v.get_type_string ();
 
172
          str_builder.append ("")
 
173
                     .append (ts1)
 
174
                     .append ("\n\t(\n");
 
175
          GLib.VariantIter iter = v.iterator ();
 
176
          tv = iter.next_value ();
 
177
          while (tv != null) {
 
178
            unowned string ts2 = tv.get_type_string ();
 
179
            string tp = tv.print (true);
 
180
            str_builder.append ("\t\t((")
 
181
                       .append (ts2)
 
182
                       .append ("): ")
 
183
                       .append (tp)
 
184
                       .append (")\n");
 
185
            tv = iter.next_value ();
 
186
          }
 
187
          
120
188
        break;
121
 
      }
 
189
 
 
190
      }
 
191
      if (prop_val.type ().is_a (typeof (GLib.Object))) {
 
192
        var new_nesting = nesting + 1;
 
193
        GLib.Object? dup_obj = prop_val.dup_object ();
 
194
        str_builder.append_printf ("->(%p):\n", dup_obj);
 
195
        internal_object_to_string (dup_obj, ref str_builder, new_nesting);
 
196
      }
 
197
 
122
198
      str_builder.append ("\n");
123
 
      
124
 
    }
125
 
    
126
 
    return str_builder.str;
 
199
    }
 
200
    for (var i = 0; i < nesting; i++) {
 
201
      str_builder.append ("\t");
 
202
    }
 
203
    str_builder.append (")\n");
 
204
    return str_builder;
127
205
  }
128
206
  
129
207
}