1 | /* |
1 | /* |
2 | list.h - Part of psiconv, a PSION 5 file formats converter |
2 | list.h - Part of psiconv, a PSION 5 file formats converter |
3 | Copyright (c) 1999 Frodo Looijaard <frodol@dds.nl> |
3 | Copyright (c) 1999, 2000 Frodo Looijaard <frodol@dds.nl> |
4 | |
4 | |
5 | This program is free software; you can redistribute it and/or modify |
5 | This program is free software; you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by |
6 | it under the terms of the GNU General Public License as published by |
7 | the Free Software Foundation; either version 2 of the License, or |
7 | the Free Software Foundation; either version 2 of the License, or |
8 | (at your option) any later version. |
8 | (at your option) any later version. |
… | |
… | |
30 | extern "C" { |
30 | extern "C" { |
31 | #endif /* __cplusplus */ |
31 | #endif /* __cplusplus */ |
32 | |
32 | |
33 | /* Always use psiconv_list, never struct psiconv_list */ |
33 | /* Always use psiconv_list, never struct psiconv_list */ |
34 | /* No need to export the actual internal format */ |
34 | /* No need to export the actual internal format */ |
35 | typedef struct psiconv_list *psiconv_list; |
35 | typedef struct psiconv_list_s *psiconv_list; |
36 | |
36 | |
37 | /* Before using a list, call list_new. It takes the size of a single element |
37 | /* Before using a list, call list_new. It takes the size of a single element |
38 | as its argument. Always compute it with a sizeof() expression, just to be |
38 | as its argument. Always compute it with a sizeof() expression, just to be |
39 | safe. The returned list is empty. */ |
39 | safe. The returned list is empty. |
|
|
40 | If there is not enough memory available, NULL is returned. You should |
|
|
41 | always test for this explicitely, because the other functions do not |
|
|
42 | like a psiconv_list argument that is equal to NULL */ |
40 | extern psiconv_list psiconv_list_new(int element_size); |
43 | extern psiconv_list psiconv_list_new(int element_size); |
41 | |
44 | |
42 | /* This frees the list. If elements contain pointers that need to be freed |
45 | /* This frees the list. If elements contain pointers that need to be freed |
43 | separately, call list_free_el below. */ |
46 | separately, call list_free_el below. */ |
44 | extern void psiconv_list_free(psiconv_list l); |
47 | extern void psiconv_list_free(psiconv_list l); |
… | |
… | |
54 | /* Return 1 if the list is empty, 0 if not */ |
57 | /* Return 1 if the list is empty, 0 if not */ |
55 | extern int psiconv_list_is_empty(const psiconv_list l); |
58 | extern int psiconv_list_is_empty(const psiconv_list l); |
56 | |
59 | |
57 | /* Get an element from the list, and return a pointer to it. Note: you can |
60 | /* Get an element from the list, and return a pointer to it. Note: you can |
58 | directly modify this element, but be careful not to write beyond the |
61 | directly modify this element, but be careful not to write beyond the |
59 | element memory space. */ |
62 | element memory space. |
|
|
63 | If indx is out of range, NULL is returned. */ |
60 | extern void * psiconv_list_get(const psiconv_list l, unsigned int indx); |
64 | extern void * psiconv_list_get(const psiconv_list l, unsigned int indx); |
61 | |
65 | |
62 | /* Add an element at the end of the list. The element is copied from the |
66 | /* Add an element at the end of the list. The element is copied from the |
63 | supplied element. Of course, this does not help if the element contains |
67 | supplied element. Of course, this does not help if the element contains |
64 | pointers. */ |
68 | pointers. |
|
|
69 | As the lists extends itself, it may be necessary to allocate new |
|
|
70 | memory. If this fails, a negative error-code is returned. If everything, |
|
|
71 | succeeds, 0 is returned. */ |
65 | extern void psiconv_list_add(psiconv_list l, void *el); |
72 | extern int psiconv_list_add(psiconv_list l, const void *el); |
66 | |
73 | |
67 | /* Do some action for each element. Note: you can directly modify the |
74 | /* Do some action for each element. Note: you can directly modify the |
68 | elements supplied to action, and they will be changed in the list, |
75 | elements supplied to action, and they will be changed in the list, |
69 | but never try a free(el)! */ |
76 | but never try a free(el)! */ |
70 | extern void psiconv_list_foreach_el(psiconv_list l, void action(void *el)); |
77 | extern void psiconv_list_foreach_el(psiconv_list l, void action(void *el)); |
71 | |
78 | |
72 | /* Clone the list, that is, copy it. If elements contain pointers, you |
79 | /* Clone the list, that is, copy it. If elements contain pointers, you |
73 | should call the next routine. */ |
80 | should call the next routine. If not enough memory is available, |
|
|
81 | NULL is returned. */ |
74 | extern psiconv_list psiconv_list_clone(const psiconv_list l); |
82 | extern psiconv_list psiconv_list_clone(const psiconv_list l); |
75 | |
|
|
76 | /* Clone the list. For each element, clone_el is called. The elements which |
|
|
77 | are given to clone_el must be modified in place, as needed. */ |
|
|
78 | extern psiconv_list psiconv_list_clone_el(const psiconv_list l, |
|
|
79 | void clone_el(void *el)); |
|
|
80 | |
83 | |
81 | /* Read upto size_t elements from file f, and put them at the end of list l. |
84 | /* Read upto size_t elements from file f, and put them at the end of list l. |
82 | Returned is the actual number of elements added. This assumes the file |
85 | Returned is the actual number of elements added. This assumes the file |
83 | layout and the memory layout of elements is the same. */ |
86 | layout and the memory layout of elements is the same. Note that if |
|
|
87 | not enough memory could be allocated, 0 is simply returned. */ |
84 | extern size_t psiconv_list_fread(psiconv_list l,size_t size, FILE *f); |
88 | extern size_t psiconv_list_fread(psiconv_list l,size_t size, FILE *f); |
|
|
89 | |
85 | |
90 | |
86 | #ifdef __cplusplus |
91 | #ifdef __cplusplus |
87 | } |
92 | } |
88 | #endif /* __cplusplus */ |
93 | #endif /* __cplusplus */ |
89 | |
94 | |