PageRenderTime 36ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/tags/ttn-pre-libtool-1-4-3-upgrade/SWIG/Source/DOH/Doh/list.c

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