/vqdr/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/vqdr/trunk
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
1
/*
2
 * The contects of this file is in the Public Domain.
3
 *
4
 * Created by Gustav Hartivgsson.
5
 */
54 by Gustav Hartvigsson
More work torwards inperementing the parser.
6
[CCode (cname = "V", cprefix = "v_")]
36 by Gustav Hartvigsson
Refactoring.
7
namespace Utils {
54 by Gustav Hartvigsson
More work torwards inperementing the parser.
8
  [CCode (cname = "v_str_cmp")]
1 by Gustav Hartvigsson
* Initial code - far from done
9
  public int str_cmp (string a, string b) {
10
    return a.collate (b);
11
  }
12
  
54 by Gustav Hartvigsson
More work torwards inperementing the parser.
13
  [CCode (cname = "v_print_ln")]
1 by Gustav Hartvigsson
* Initial code - far from done
14
  public void print_ln (string str, ...) {
15
    var va = va_list ();
43 by Gustav Hartvigsson
* Added err_print_ln.
16
    var tmp = str + "\n";
17
    stdout.vprintf (tmp, va);
18
  }
19
54 by Gustav Hartvigsson
More work torwards inperementing the parser.
20
  [CCode (cname = "v_err_print_ln")]
43 by Gustav Hartvigsson
* Added err_print_ln.
21
  public void err_print_ln (string str, ...) {
22
    var va = va_list ();
23
    var tmp = str + "\n";
24
    stderr.vprintf (tmp, va);
1 by Gustav Hartvigsson
* Initial code - far from done
25
  }
54 by Gustav Hartvigsson
More work torwards inperementing the parser.
26
27
  [CCode (cname = "v_object_to_string")]
1 by Gustav Hartvigsson
* Initial code - far from done
28
  public string object_to_string (GLib.Object obj) {
39 by Gustav Hartvigsson
Made objcet_to_string () recursive when dealing with GObjects.
29
     StringBuilder strbldr = new StringBuilder ();
30
     internal_object_to_string (obj, ref strbldr);
31
     return strbldr.str;
32
  }
33
43 by Gustav Hartvigsson
* Added err_print_ln.
34
  string collect_string (string[] segments) {
35
    if (segments.length == 0) {
36
      return "";
37
    }
38
    if (segments.length == 1) {
39
      return segments[0];
40
    }
41
    StringBuilder strbldr = new StringBuilder ();
42
    foreach (var segment in segments) {
43
      strbldr.append (segment);
44
    }
45
    return strbldr.str;
46
  }
47
54 by Gustav Hartvigsson
More work torwards inperementing the parser.
48
  [CCode (cname = "v_internal_object_to_string")]
49
  internal unowned StringBuilder internal_object_to_string (GLib.Object obj,
40 by Gustav Hartvigsson
Sort of fixed object_to_string ()...
50
                                                  ref StringBuilder str_builder,
52.1.3 by Gustav Hartvigsson
int -> int32
51
                                                  int32 nesting = 0) {
40 by Gustav Hartvigsson
Sort of fixed object_to_string ()...
52
    GLib.ObjectClass obj_class = (GLib.ObjectClass) obj.get_type ().class_ref ();
53
    
54
    for (var i = 0; i < nesting; i++) {
55
     str_builder.append ("\t");
56
    }
57
    
58
    str_builder.append ("((")
1 by Gustav Hartvigsson
* Initial code - far from done
59
               .append (obj.get_type().name ())
40 by Gustav Hartvigsson
Sort of fixed object_to_string ()...
60
               .append_printf (")->(%p):\n", obj);
1 by Gustav Hartvigsson
* Initial code - far from done
61
    
40 by Gustav Hartvigsson
Sort of fixed object_to_string ()...
62
    foreach (GLib.ParamSpec ps in obj_class.list_properties ()) {
1 by Gustav Hartvigsson
* Initial code - far from done
63
      
64
      if (ps.value_type == 0 || ps.value_type == GLib.Type.INVALID) {
65
        continue;
66
      }
67
      
68
      var prop_name = ps.get_name ();
69
      
70
      Value prop_val = GLib.Value (ps.value_type);
71
      
72
      if (prop_val.type () == GLib.Type.INVALID || prop_val.type () == 0) {
73
        continue;
74
      }
40 by Gustav Hartvigsson
Sort of fixed object_to_string ()...
75
1 by Gustav Hartvigsson
* Initial code - far from done
76
      obj.get_property (prop_name, ref prop_val);
77
      
40 by Gustav Hartvigsson
Sort of fixed object_to_string ()...
78
      for (var i = 0; i < nesting; i++) {
79
        str_builder.append ("\t");
80
      }
81
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
82
      str_builder.append ("\t(")
1 by Gustav Hartvigsson
* Initial code - far from done
83
                 .append (prop_val.type_name ())
84
                 .append (") ")
85
                 .append (prop_name)
40 by Gustav Hartvigsson
Sort of fixed object_to_string ()...
86
                 .append (":");
87
88
1 by Gustav Hartvigsson
* Initial code - far from done
89
      
90
      
91
      switch (prop_val.type ()) {
92
        case (GLib.Type.STRING):
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
93
          if (prop_val.dup_string () == null) {
94
            str_builder.append ("(null)");
8 by Gustav Hartvigsson
* Fixed string handling in gobject_to_string ().
95
          } else {
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
96
            str_builder.append (prop_val.dup_string ());
8 by Gustav Hartvigsson
* Fixed string handling in gobject_to_string ().
97
          }
1 by Gustav Hartvigsson
* Initial code - far from done
98
        break;
99
        case (GLib.Type.INT):
100
          str_builder.append (prop_val.get_int ().to_string ());
101
        break;
102
        case (GLib.Type.BOOLEAN):
103
          str_builder.append (prop_val.get_boolean ().to_string ());
104
        break;
105
        case (GLib.Type.CHAR):
106
          var v = prop_val.get_schar ();
107
          str_builder.append_c (v)
108
                     .append (" (")
109
                     .append_printf ("%hhx", v);
110
          str_builder.append (")");
111
        break;
112
        case (GLib.Type.DOUBLE):
113
          str_builder.append (prop_val.get_double ().to_string ());
114
        break;
115
        case (GLib.Type.ENUM):
116
          str_builder.append (prop_val.get_enum ().to_string ());
117
        break;
118
        case (GLib.Type.FLAGS):
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
119
          // TODO: Probobly needs better handling, but this will do.
1 by Gustav Hartvigsson
* Initial code - far from done
120
          str_builder.append (prop_val.get_flags ().to_string ());
121
        break;
122
        case (GLib.Type.FLOAT):
123
          str_builder.append (prop_val.get_float ().to_string ());
124
        break;
125
        case (GLib.Type.INT64):
126
          str_builder.append (prop_val.get_int64 ().to_string ());
127
        break;
128
        case (GLib.Type.LONG):
129
          str_builder.append (prop_val.get_long ().to_string ());
130
        break;
131
        case (GLib.Type.POINTER):
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
132
          str_builder.append ("(")
39 by Gustav Hartvigsson
Made objcet_to_string () recursive when dealing with GObjects.
133
                     .append_printf ("%p", prop_val.get_pointer ());
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
134
          str_builder.append (")");
135
        break;
136
        case (GLib.Type.BOXED):
137
          str_builder.append ("(")
39 by Gustav Hartvigsson
Made objcet_to_string () recursive when dealing with GObjects.
138
                     .append_printf ("%p", prop_val.get_boxed ());
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
139
          str_builder.append (")");
1 by Gustav Hartvigsson
* Initial code - far from done
140
        break;
141
        case (GLib.Type.UCHAR):
142
          var v = prop_val.get_uchar ();
143
          str_builder.append_c ((char) v)
144
                     .append (" (")
145
                     .append_printf ("%hhx", v);
146
          str_builder.append (")");
147
        break;
148
        case (GLib.Type.UINT):
149
          str_builder.append (prop_val.get_uint ().to_string ());
150
        break;
151
        case (GLib.Type.UINT64):
152
          str_builder.append (prop_val.get_uint64 ().to_string ());
153
        break;
154
        case (GLib.Type.ULONG):
155
          str_builder.append (prop_val.get_ulong ().to_string ());
156
        break;
157
        case (GLib.Type.VARIANT):
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
158
          GLib.Variant v = prop_val.dup_variant ();
159
          GLib.Variant? tv = null;
160
          unowned string ts1 = v.get_type_string ();
161
          str_builder.append ("")
162
                     .append (ts1)
163
                     .append ("\n\t(\n");
164
          GLib.VariantIter iter = v.iterator ();
165
          tv = iter.next_value ();
166
          while (tv != null) {
167
            unowned string ts2 = tv.get_type_string ();
168
            string tp = tv.print (true);
169
            str_builder.append ("\t\t((")
170
                       .append (ts2)
171
                       .append ("): ")
172
                       .append (tp)
173
                       .append (")\n");
174
            tv = iter.next_value ();
175
          }
176
          
1 by Gustav Hartvigsson
* Initial code - far from done
177
        break;
40 by Gustav Hartvigsson
Sort of fixed object_to_string ()...
178
179
      }
180
      if (prop_val.type ().is_a (typeof (GLib.Object))) {
181
        var new_nesting = nesting + 1;
182
        GLib.Object? dup_obj = prop_val.dup_object ();
183
        str_builder.append_printf ("->(%p):\n", dup_obj);
184
        internal_object_to_string (dup_obj, ref str_builder, new_nesting);
185
      }
186
1 by Gustav Hartvigsson
* Initial code - far from done
187
      str_builder.append ("\n");
188
    }
40 by Gustav Hartvigsson
Sort of fixed object_to_string ()...
189
    for (var i = 0; i < nesting; i++) {
190
      str_builder.append ("\t");
191
    }
192
    str_builder.append (")\n");
39 by Gustav Hartvigsson
Made objcet_to_string () recursive when dealing with GObjects.
193
    return str_builder;
1 by Gustav Hartvigsson
* Initial code - far from done
194
  }
195
  
196
}