0252a8e8ec1bf82aad5e3f6a723db40644fe35de
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
)
46 tab_t
*new = alloc_tab (tab
->size
);
47 memcpy (new->data
, tab
->data
, tab
->size
* sizeof (double));
53 void free_tab (tab_t
*tab
)
65 int size_tab (tab_t
*tab
)
74 /* set an element into a tab at position id [1..N] */
76 double set_tab (tab_t
*tab
, int id
, double val
)
79 if ((!tab
) || (id
< 1) || (id
> tab
->size
)) {
80 VERBOSE (WARNING
, fprintf (stdout
, "error out of bounds (%d/%d)\n", id
, (tab
) ? tab
->size
: 0));
82 ret
= tab
->data
[id
- 1] = val
;
87 /* get an element from a tab at position id [1..N] */
89 double get_tab (tab_t
*tab
, int id
)
92 if ((!tab
) || (id
< 1) || (id
> tab
->size
)) {
93 VERBOSE (WARNING
, fprintf (stdout
, "error out of bounds (%d/%d)\n", id
, (tab
) ? tab
->size
: 0));
95 ret
= tab
->data
[id
- 1];
100 /* push an element into a tab at position id [1.. N](-1 means end) resulting to a tab of N+1 elements */
102 double push_tab (tab_t
*tab
, int id
, double val
)
105 if ((!tab
) || (((id
< 1) || (id
> tab
->size
+ 1)) && (id
!= -1))) {
106 VERBOSE (WARNING
, fprintf (stdout
, "error out of bounds (%d/%d)\n", id
, (tab
) ? tab
->size
: 0));
109 /* special case for inserting an element at the end */
110 id
= (id
== -1) ? tab
->size
+ 1 : id
;
112 /* create larger tab */
113 double *tmp
= (double *) callocordie (tab
->size
+ 1, sizeof (double));
114 memcpy (tmp
, tab
->data
, (id
- 1) * sizeof (double));
115 ret
= tmp
[id
- 1] = val
;
116 memcpy (tmp
+ id
, tab
->data
+ id
- 1, (tab
->size
- id
+ 1) * sizeof (double));
118 /* update structure */
126 /* pop an element from a tab at position id [1.. N](-1 means last) resulting to a tab of N-1 elements */
128 double pop_tab (tab_t
*tab
, int id
)
131 if ((!tab
) || (((id
< 1) || (id
> tab
->size
)) && (id
!= -1))) {
132 VERBOSE (WARNING
, fprintf (stdout
, "error out of bounds (%d/%d)\n", id
, (tab
) ? tab
->size
: 0));
134 ret
= tab
->data
[id
- 1];
136 /* special case for inserting an element at the end */
137 id
= (id
== -1) ? tab
->size
: id
;
139 /* create larger tab */
140 double *tmp
= (double *) callocordie (tab
->size
- 1, sizeof (double));
141 memcpy (tmp
, tab
->data
, (id
- 1) * sizeof (double));
142 memcpy (tmp
+ id
- 1, tab
->data
+ id
, (tab
->size
- id
) * sizeof (double));
144 /* update structure */
154 void order_tab (tab_t
*tab
)
157 if ((!tab
) || (tab
->size
< 3)) {
158 VERBOSE (WARNING
, fprintf (stdout
, "error not enough element in stack (%d)\n", tab
->size
));
163 for (i
= 0; i
< tab
->size
- 1; i
++) {
165 for (j
= 0; j
< tab
->size
- 1; j
++) {
166 double tab_j
= tab
->data
[j
];
167 double tab_jp1
= tab
->data
[j
+ 1];
168 if (tab_j
> tab_jp1
) {
169 tab
->data
[j
] = tab_jp1
;
170 tab
->data
[j
+ 1] = tab_j
;
180 /* vim: set ts=4 sw=4 et: */