11 /* management function */
13 /* allocate a tab of N elements */
15 tab_t
*alloc_tab (int nb
)
17 tab_t
*tab
= (tab_t
*) callocordie (1, sizeof (tab_t
));
19 tab
->data
= (double *) callocordie (nb
, sizeof (double));
25 /* resize a tab to size N */
27 tab_t
*resize_tab (tab_t
*tab
, int nb
)
30 tab
= (tab
) ? tab
: (tab_t
*) callocordie (1, sizeof (tab_t
));
31 nb
= (nb
> 0) ? nb
: 0;
33 tmp
= (double *) callocordie (nb
, sizeof (double));
34 memcpy (tmp
, tab
->data
, ((tab
->size
< nb
) ? tab
->size
: nb
) * sizeof (double));
44 tab_t
*copy_tab (tab_t
*tab
)
49 tab_t
*new = alloc_tab (tab
->size
);
50 memcpy (new->data
, tab
->data
, tab
->size
* sizeof (double));
56 void free_tab (tab_t
*tab
)
68 int size_tab (tab_t
*tab
)
77 /* set an element into a tab at position id [1..N] */
79 double set_tab (tab_t
*tab
, int id
, double val
)
82 if ((!tab
) || (id
< 1) || (id
> tab
->size
)) {
83 VERBOSE (WARNING
, fprintf (stdout
, "error out of bounds (%d/%d)\n", id
, (tab
) ? tab
->size
: 0));
85 ret
= tab
->data
[id
- 1] = val
;
90 /* get an element from a tab at position id [1..N] */
92 double get_tab (tab_t
*tab
, int id
)
95 if ((!tab
) || (id
< 1) || (id
> tab
->size
)) {
96 VERBOSE (WARNING
, fprintf (stdout
, "error out of bounds (%d/%d)\n", id
, (tab
) ? tab
->size
: 0));
98 ret
= tab
->data
[id
- 1];
103 /* push an element into a tab at position id [1.. N](-1 means end) resulting to a tab of N+1 elements */
105 double push_tab (tab_t
*tab
, int id
, double val
)
108 if ((!tab
) || (((id
< 1) || (id
> tab
->size
+ 1)) && (id
!= -1))) {
109 VERBOSE (WARNING
, fprintf (stdout
, "error out of bounds (%d/%d)\n", id
, (tab
) ? tab
->size
: 0));
112 /* special case for inserting an element at the end */
113 id
= (id
== -1) ? tab
->size
+ 1 : id
;
115 /* create larger tab */
116 double *tmp
= (double *) callocordie (tab
->size
+ 1, sizeof (double));
117 memcpy (tmp
, tab
->data
, (id
- 1) * sizeof (double));
118 ret
= tmp
[id
- 1] = val
;
119 memcpy (tmp
+ id
, tab
->data
+ id
- 1, (tab
->size
- id
+ 1) * sizeof (double));
121 /* update structure */
129 /* pop an element from a tab at position id [1.. N](-1 means last) resulting to a tab of N-1 elements */
131 double pop_tab (tab_t
*tab
, int id
)
134 if ((!tab
) || (((id
< 1) || (id
> tab
->size
)) && (id
!= -1))) {
135 VERBOSE (WARNING
, fprintf (stdout
, "error out of bounds (%d/%d)\n", id
, (tab
) ? tab
->size
: 0));
137 ret
= tab
->data
[id
- 1];
139 /* special case for inserting an element at the end */
140 id
= (id
== -1) ? tab
->size
: id
;
142 /* create larger tab */
143 double *tmp
= (double *) callocordie (tab
->size
- 1, sizeof (double));
144 memcpy (tmp
, tab
->data
, (id
- 1) * sizeof (double));
145 memcpy (tmp
+ id
- 1, tab
->data
+ id
, (tab
->size
- id
) * sizeof (double));
147 /* update structure */
157 void order_tab (tab_t
*tab
)
160 if ((!tab
) || (tab
->size
< 2)) {
161 VERBOSE (WARNING
, fprintf (stdout
, "error not enough element in stack (%d)\n", (tab
) ? tab
->size
: 0));
166 for (i
= 0; i
< tab
->size
- 1; i
++) {
168 for (j
= 0; j
< tab
->size
- 1; j
++) {
169 double tab_j
= tab
->data
[j
];
170 double tab_jp1
= tab
->data
[j
+ 1];
171 if (tab_j
> tab_jp1
) {
172 tab
->data
[j
] = tab_jp1
;
173 tab
->data
[j
+ 1] = tab_j
;
183 /* vim: set ts=4 sw=4 et: */