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));
46 tab_t
*copy_tab (tab_t
*tab
)
51 tab_t
*new = alloc_tab (tab
->size
);
52 memcpy (new->data
, tab
->data
, tab
->size
* sizeof (double));
58 void free_tab (tab_t
*tab
)
70 int size_tab (tab_t
*tab
)
79 /* set an element into a tab at position id [1..N] */
81 double set_tab (tab_t
*tab
, int id
, double val
)
84 if ((!tab
) || (id
< 1) || (id
> tab
->size
)) {
85 VERBOSE (WARNING
, fprintf (stdout
, "error out of bounds (%d/%d)\n", id
, (tab
) ? tab
->size
: 0));
87 ret
= tab
->data
[id
- 1] = val
;
92 /* get an element from a tab at position id [1..N] */
94 double get_tab (tab_t
*tab
, int id
)
97 if ((!tab
) || (id
< 1) || (id
> tab
->size
)) {
98 VERBOSE (WARNING
, fprintf (stdout
, "error out of bounds (%d/%d)\n", id
, (tab
) ? tab
->size
: 0));
100 ret
= tab
->data
[id
- 1];
105 /* push an element into a tab at position id [1.. N](-1 means end) resulting to a tab of N+1 elements */
107 double push_tab (tab_t
*tab
, int id
, double val
)
110 if ((!tab
) || (((id
< 1) || (id
> tab
->size
+ 1)) && (id
!= -1))) {
111 VERBOSE (WARNING
, fprintf (stdout
, "error out of bounds (%d/%d)\n", id
, (tab
) ? tab
->size
: 0));
114 /* special case for inserting an element at the end */
115 id
= (id
== -1) ? tab
->size
+ 1 : id
;
117 /* create larger tab */
118 double *tmp
= (double *) callocordie (tab
->size
+ 1, sizeof (double));
119 memcpy (tmp
, tab
->data
, (id
- 1) * sizeof (double));
120 ret
= tmp
[id
- 1] = val
;
121 memcpy (tmp
+ id
, tab
->data
+ id
- 1, (tab
->size
- id
+ 1) * sizeof (double));
123 /* update structure */
131 /* pop an element from a tab at position id [1.. N](-1 means last) resulting to a tab of N-1 elements */
133 double pop_tab (tab_t
*tab
, int id
)
136 if ((!tab
) || (((id
< 1) || (id
> tab
->size
)) && (id
!= -1))) {
137 VERBOSE (WARNING
, fprintf (stdout
, "error out of bounds (%d/%d)\n", id
, (tab
) ? tab
->size
: 0));
140 /* special case for inserting an element at the end */
141 id
= (id
== -1) ? tab
->size
: id
;
144 ret
= tab
->data
[id
- 1];
146 /* create larger tab */
147 double *tmp
= (double *) callocordie (tab
->size
- 1, sizeof (double));
148 memcpy (tmp
, tab
->data
, (id
- 1) * sizeof (double));
149 memcpy (tmp
+ id
- 1, tab
->data
+ id
, (tab
->size
- id
) * sizeof (double));
151 /* update structure */
161 void order_tab (tab_t
*tab
)
164 if ((!tab
) || (tab
->size
< 2)) {
165 VERBOSE (WARNING
, fprintf (stdout
, "error not enough element in stack (%d)\n", (tab
) ? tab
->size
: 0));
170 for (i
= 0; i
< tab
->size
- 1; i
++) {
172 for (j
= 0; j
< tab
->size
- 1; j
++) {
173 double tab_j
= tab
->data
[j
];
174 double tab_jp1
= tab
->data
[j
+ 1];
175 if (tab_j
> tab_jp1
) {
176 tab
->data
[j
] = tab_jp1
;
177 tab
->data
[j
+ 1] = tab_j
;
187 /* vim: set ts=4 sw=4 et: */