PageRenderTime 47ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/tags/rel-1-3-23/SWIG/Source/DOH/list.c

#
C | 363 lines | 247 code | 39 blank | 77 comment | 39 complexity | bc5e1da0b74c2d21b3da4c40a92fed57 MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
  1. /* -----------------------------------------------------------------------------
  2. * list.c
  3. *
  4. * Implements a simple list object.
  5. *
  6. * Author(s) : David Beazley (beazley@cs.uchicago.edu)
  7. *
  8. * Copyright (C) 1999-2000. The University of Chicago
  9. * See the file LICENSE for information on usage and redistribution.
  10. * ----------------------------------------------------------------------------- */
  11. char cvsroot_list_c[] = "$Header$";
  12. #include "dohint.h"
  13. typedef struct List {
  14. int maxitems; /* Max size */
  15. int nitems; /* Num items */
  16. DOH *file;
  17. int line;
  18. DOH **items;
  19. } List;
  20. extern DohObjInfo DohListType;
  21. /* Doubles amount of memory in a list */
  22. static
  23. void more(List *l) {
  24. l->items = (void **) DohRealloc(l->items, l->maxitems*2*sizeof(void *));
  25. assert(l->items);
  26. l->maxitems *= 2;
  27. }
  28. /* -----------------------------------------------------------------------------
  29. * CopyList()
  30. *
  31. * Make a shallow copy of a list.
  32. * ----------------------------------------------------------------------------- */
  33. static DOH *
  34. CopyList(DOH *lo) {
  35. List *l,*nl;
  36. int i;
  37. l = (List *) ObjData(lo);
  38. nl = (List *) DohMalloc(sizeof(List));
  39. nl->nitems = l->nitems;
  40. nl->maxitems = l->maxitems;
  41. nl->items = (void **) DohMalloc(l->maxitems*sizeof(void *));
  42. for (i = 0; i < l->nitems; i++) {
  43. nl->items[i] = l->items[i];
  44. Incref(nl->items[i]);
  45. }
  46. nl->file = l->file;
  47. if (nl->file) Incref(nl->file);
  48. nl->line = l->line;
  49. return DohObjMalloc(&DohListType, nl);
  50. }
  51. /* -----------------------------------------------------------------------------
  52. * DelList()
  53. *
  54. * Delete a list.
  55. * ----------------------------------------------------------------------------- */
  56. static void
  57. DelList(DOH *lo) {
  58. List *l = (List *) ObjData(lo);
  59. int i;
  60. for (i = 0; i < l->nitems; i++)
  61. Delete(l->items[i]);
  62. DohFree(l->items);
  63. DohFree(l);
  64. }
  65. /* -----------------------------------------------------------------------------
  66. * List_clear()
  67. *
  68. * Remove all of the list entries, but keep the list object intact.
  69. * ----------------------------------------------------------------------------- */
  70. static void
  71. List_clear(DOH *lo) {
  72. List *l = (List *) ObjData(lo);
  73. int i;
  74. for (i = 0; i < l->nitems; i++) {
  75. Delete(l->items[i]);
  76. }
  77. l->nitems = 0;
  78. }
  79. /* -----------------------------------------------------------------------------
  80. * List_insert()
  81. *
  82. * Insert an item into the list. If the item is not a DOH object, it is assumed
  83. * to be a 'char *' and is used to construct an equivalent string object.
  84. * ----------------------------------------------------------------------------- */
  85. static int
  86. List_insert(DOH *lo, int pos, DOH *item) {
  87. List *l = (List *) ObjData(lo);
  88. int i;
  89. if (!item) return -1;
  90. if (!DohCheck(item)) {
  91. item = NewString(item);
  92. Decref(item);
  93. }
  94. if (pos == DOH_END) pos = l->nitems;
  95. if (pos < 0) pos = 0;
  96. if (pos > l->nitems) pos = l->nitems;
  97. if (l->nitems == l->maxitems) more(l);
  98. for (i = l->nitems; i > pos; i--) {
  99. l->items[i] = l->items[i-1];
  100. }
  101. l->items[pos] = item;
  102. Incref(item);
  103. l->nitems++;
  104. return 0;
  105. }
  106. /* -----------------------------------------------------------------------------
  107. * List_remove()
  108. *
  109. * Remove an item from a list.
  110. * ----------------------------------------------------------------------------- */
  111. static int
  112. List_remove(DOH *lo, int pos) {
  113. List *l = (List *) ObjData(lo);
  114. int i;
  115. if (pos == DOH_END) pos = l->nitems-1;
  116. if (pos == DOH_BEGIN) pos = 0;
  117. assert(!((pos < 0) || (pos >= l->nitems)));
  118. Delete(l->items[pos]);
  119. for (i = pos; i < l->nitems-1; i++) {
  120. l->items[i] = l->items[i+1];
  121. }
  122. l->nitems--;
  123. return 0;
  124. }
  125. /* -----------------------------------------------------------------------------
  126. * List_len()
  127. *
  128. * Return the number of elements in the list
  129. * ----------------------------------------------------------------------------- */
  130. static int
  131. List_len(DOH *lo) {
  132. List *l = (List *) ObjData(lo);
  133. return l->nitems;
  134. }
  135. /* -----------------------------------------------------------------------------
  136. * List_get()
  137. *
  138. * Get the nth item from the list.
  139. * ----------------------------------------------------------------------------- */
  140. static DOH *
  141. List_get(DOH *lo, int n) {
  142. List *l = (List *) ObjData(lo);
  143. if (n == DOH_END) n = l->nitems-1;
  144. if (n == DOH_BEGIN) n = 0;
  145. assert(!((n < 0) || (n >= l->nitems)));
  146. return l->items[n];
  147. }
  148. /* -----------------------------------------------------------------------------
  149. * List_set()
  150. *
  151. * Set the nth item in the list replacing any previous item.
  152. * ----------------------------------------------------------------------------- */
  153. static int
  154. List_set(DOH *lo, int n, DOH *val) {
  155. List *l = (List *) ObjData(lo);
  156. if (!val) return -1;
  157. assert(!((n < 0) || (n >= l->nitems)));
  158. if (!DohCheck(val)) {
  159. val = NewString(val);
  160. Decref(val);
  161. }
  162. Delete(l->items[n]);
  163. l->items[n] = val;
  164. Incref(val);
  165. Delete(val);
  166. return 0;
  167. }
  168. /* -----------------------------------------------------------------------------
  169. * List_first()
  170. *
  171. * Return the first item in the list.
  172. * ----------------------------------------------------------------------------- */
  173. static DohIterator
  174. List_first(DOH *lo) {
  175. DohIterator iter;
  176. List *l = (List *) ObjData(lo);
  177. iter.object = lo;
  178. iter._index = 0;
  179. iter.key = 0;
  180. if (l->nitems > 0) {
  181. iter.item = l->items[0];
  182. } else {
  183. iter.item = 0;
  184. }
  185. return iter;
  186. }
  187. /* -----------------------------------------------------------------------------
  188. * List_next()
  189. *
  190. * Return the next item in the list.
  191. * ----------------------------------------------------------------------------- */
  192. static DohIterator
  193. List_next(DohIterator iter) {
  194. List *l = (List *) ObjData(iter.object);
  195. iter._index = iter._index + 1;
  196. if (iter._index >= l->nitems) {
  197. iter.item = 0;
  198. iter.key = 0;
  199. } else {
  200. iter.item = l->items[iter._index];
  201. }
  202. return iter;
  203. }
  204. /* -----------------------------------------------------------------------------
  205. * List_str()
  206. *
  207. * Create a string representation of the list.
  208. * ----------------------------------------------------------------------------- */
  209. static DOH *
  210. List_str(DOH *lo) {
  211. DOH *s;
  212. int i;
  213. List *l = (List *) ObjData(lo);
  214. s = NewString("");
  215. if (ObjGetMark(lo)) {
  216. Printf(s,"List(%x)", lo);
  217. return s;
  218. }
  219. ObjSetMark(lo,1);
  220. Printf(s,"List[ ");
  221. for (i = 0; i < l->nitems; i++) {
  222. Printf(s, "%s", l->items[i]);
  223. if ((i+1) < l->nitems)
  224. Printf(s,", ");
  225. }
  226. Printf(s," ]\n");
  227. ObjSetMark(lo,0);
  228. return s;
  229. }
  230. /* -----------------------------------------------------------------------------
  231. * List_dump()
  232. *
  233. * Dump the items to an output stream.
  234. * ----------------------------------------------------------------------------- */
  235. static int
  236. List_dump(DOH *lo, DOH *out) {
  237. int nsent = 0;
  238. int i,ret;
  239. List *l = (List *) ObjData(lo);
  240. for (i = 0; i < l->nitems; i++) {
  241. ret = Dump(l->items[i],out);
  242. if (ret < 0) return -1;
  243. nsent += ret;
  244. }
  245. return nsent;
  246. }
  247. static void
  248. List_setfile(DOH *lo, DOH *file) {
  249. DOH *fo;
  250. List *l = (List *) ObjData(lo);
  251. if (!DohCheck(file)) {
  252. fo = NewString(file);
  253. Decref(fo);
  254. } else fo = file;
  255. Incref(fo);
  256. Delete(l->file);
  257. l->file = fo;
  258. }
  259. static DOH *
  260. List_getfile(DOH *lo) {
  261. List *l = (List *) ObjData(lo);
  262. return l->file;
  263. }
  264. static void
  265. List_setline(DOH *lo, int line) {
  266. List *l = (List *) ObjData(lo);
  267. l->line = line;
  268. }
  269. static int List_getline(DOH *lo) {
  270. List *l = (List *) ObjData(lo);
  271. return l->line;
  272. }
  273. static DohListMethods ListListMethods = {
  274. List_get,
  275. List_set,
  276. List_remove,
  277. List_insert,
  278. 0, /* delslice */
  279. };
  280. DohObjInfo DohListType = {
  281. "List", /* objname */
  282. DelList, /* doh_del */
  283. CopyList, /* doh_copy */
  284. List_clear, /* doh_clear */
  285. List_str, /* doh_str */
  286. 0, /* doh_data */
  287. List_dump, /* doh_dump */
  288. List_len, /* doh_len */
  289. 0, /* doh_hash */
  290. 0, /* doh_cmp */
  291. List_first, /* doh_first */
  292. List_next, /* doh_next */
  293. List_setfile, /* doh_setfile */
  294. List_getfile, /* doh_getfile */
  295. List_setline, /* doh_setline */
  296. List_getline, /* doh_getline */
  297. 0, /* doh_mapping */
  298. &ListListMethods, /* doh_sequence */
  299. 0, /* doh_file */
  300. 0, /* doh_string */
  301. 0, /* doh_callable */
  302. 0, /* doh_position */
  303. };
  304. /* -----------------------------------------------------------------------------
  305. * NewList()
  306. *
  307. * Create a new list.
  308. * ----------------------------------------------------------------------------- */
  309. #define MAXLISTITEMS 8
  310. DOH *
  311. DohNewList() {
  312. List *l;
  313. int i;
  314. l = (List *) DohMalloc(sizeof(List));
  315. l->nitems = 0;
  316. l->maxitems = MAXLISTITEMS;
  317. l->items = (void **) DohMalloc(l->maxitems*sizeof(void *));
  318. for (i = 0; i < MAXLISTITEMS; i++) {
  319. l->items[i] = 0;
  320. }
  321. l->file = 0;
  322. l->line = 0;
  323. return DohObjMalloc(&DohListType,l);
  324. }