da13174a32680bd49450921de492e355a39b3a42
[platform/core/uifw/at-spi2-atk.git] / spi-common / bitarray.c
1 /*
2  * AT-SPI - Assistive Technology Service Provider Interface
3  * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
4  *
5  * Copyright 2008 Novell, Inc.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public
18  * License along with this library; if not, write to the
19  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22
23 #include "bitarray.h"
24
25 gint bitarray_to_seq(dbus_uint32_t *array, gint array_size, gint **out)
26 {
27   gint *seq = NULL;
28   gint seq_size = 0;
29   int i, j;
30
31   for (i = 0; i < array_size; i++)
32   {
33     for (j = 0; j < 32; j++)
34     {
35       if (array[i] & (1 << j))
36       {
37         if (!(seq_size % 4))
38         {
39           gint *new_seq = (gint *)realloc(seq, (seq_size + 4) * sizeof(gint));
40           if (!new_seq)
41           {
42             *out = seq;
43             return seq_size;
44           }
45           seq = new_seq;
46         }
47         seq[++seq_size] = i * 32 + j;
48       }
49     }
50   }
51   *out = seq;
52   return seq_size;
53 }
54
55 dbus_uint32_t bitarray_from_seq(gint *seq, dbus_uint32_t **out)
56 {
57   dbus_uint32_t *array = NULL;
58   dbus_uint32_t array_size = 0;
59   dbus_uint32_t array_max_size = 0;
60   int i;
61
62   for (i = 0; seq[i] != BITARRAY_SEQ_TERM; i++)
63   {
64     gint pos = seq[i] / 32, val = seq[i] % 32;
65     if (pos >= array_max_size)
66     {
67       gint *new_array;
68       while (array_max_size <= pos) array_max_size += 4;
69       new_array = (dbus_uint32_t *)realloc(array, array_max_size * sizeof(dbus_uint32_t));
70       if (!new_array)
71       {
72         *out = array;
73         return array_size;
74       }
75       array = new_array;
76     }
77     array[pos] &= (1 << val);
78     if (pos > array_size) array_size = pos;
79   }
80   *out = array;
81   return array_size;
82 }