PageRenderTime 42ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/tags/mkoeppe-1-3-mzscheme/SWIG/Source/DOH/Doh/list.c

#
C | 373 lines | 250 code | 43 blank | 80 comment | 38 complexity | 61ab9ef850a934a27dcb3b9f35a1a2af 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. /* 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. nl->iter = 0;
  43. for (i = 0; i < l->nitems; i++) {
  44. nl->items[i] = l->items[i];
  45. Incref(nl->items[i]);
  46. }
  47. nl->file = l->file;
  48. if (nl->file) Incref(nl->file);
  49. nl->line = l->line;
  50. return DohObjMalloc(DOHTYPE_LIST, nl);
  51. }
  52. /* -----------------------------------------------------------------------------
  53. * DelList()
  54. *
  55. * Delete a list.
  56. * ----------------------------------------------------------------------------- */
  57. static void
  58. DelList(DOH *lo) {
  59. List *l = (List *) ObjData(lo);
  60. int i;
  61. for (i = 0; i < l->nitems; i++)
  62. Delete(l->items[i]);
  63. DohFree(l->items);
  64. DohFree(l);
  65. }
  66. /* -----------------------------------------------------------------------------
  67. * List_clear()
  68. *
  69. * Remove all of the list entries, but keep the list object intact.
  70. * ----------------------------------------------------------------------------- */
  71. static void
  72. List_clear(DOH *lo) {
  73. List *l = (List *) ObjData(lo);
  74. int i;
  75. for (i = 0; i < l->nitems; i++) {
  76. Delete(l->items[i]);
  77. }
  78. l->nitems = 0;
  79. }
  80. /* -----------------------------------------------------------------------------
  81. * List_insert()
  82. *
  83. * Insert an item into the list. If the item is not a DOH object, it is assumed
  84. * to be a 'char *' and is used to construct an equivalent string object.
  85. * ----------------------------------------------------------------------------- */
  86. static int
  87. List_insert(DOH *lo, int pos, DOH *item) {
  88. List *l = (List *) ObjData(lo);
  89. int i;
  90. if (!item) return -1;
  91. if (!DohCheck(item)) {
  92. item = NewString(item);
  93. Decref(item);
  94. }
  95. if (pos == DOH_END) pos = l->nitems;
  96. if (pos < 0) pos = 0;
  97. if (pos > l->nitems) pos = l->nitems;
  98. if (l->nitems == l->maxitems) more(l);
  99. for (i = l->nitems; i > pos; i--) {
  100. l->items[i] = l->items[i-1];
  101. }
  102. l->items[pos] = item;
  103. Incref(item);
  104. l->nitems++;
  105. return 0;
  106. }
  107. /* -----------------------------------------------------------------------------
  108. * List_remove()
  109. *
  110. * Remove an item from a list.
  111. * ----------------------------------------------------------------------------- */
  112. static int
  113. List_remove(DOH *lo, int pos) {
  114. List *l = (List *) ObjData(lo);
  115. int i;
  116. if (pos == DOH_END) pos = l->nitems-1;
  117. if (pos == DOH_BEGIN) pos = 0;
  118. assert(!((pos < 0) || (pos >= l->nitems)));
  119. Delete(l->items[pos]);
  120. for (i = pos; i < l->nitems-1; i++) {
  121. l->items[i] = l->items[i+1];
  122. }
  123. l->nitems--;
  124. return 0;
  125. }
  126. /* -----------------------------------------------------------------------------
  127. * List_len()
  128. *
  129. * Return the number of elements in the list
  130. * ----------------------------------------------------------------------------- */
  131. static int
  132. List_len(DOH *lo) {
  133. List *l = (List *) ObjData(lo);
  134. return l->nitems;
  135. }
  136. /* -----------------------------------------------------------------------------
  137. * List_get()
  138. *
  139. * Get the nth item from the list.
  140. * ----------------------------------------------------------------------------- */
  141. static DOH *
  142. List_get(DOH *lo, int n) {
  143. List *l = (List *) ObjData(lo);
  144. if (n == DOH_END) n = l->nitems-1;
  145. if (n == DOH_BEGIN) n = 0;
  146. assert(!((n < 0) || (n >= l->nitems)));
  147. return l->items[n];
  148. }
  149. /* -----------------------------------------------------------------------------
  150. * List_set()
  151. *
  152. * Set the nth item in the list replacing any previous item.
  153. * ----------------------------------------------------------------------------- */
  154. static int
  155. List_set(DOH *lo, int n, DOH *val) {
  156. List *l = (List *) ObjData(lo);
  157. if (!val) return -1;
  158. assert(!((n < 0) || (n >= l->nitems)));
  159. if (!DohCheck(val)) {
  160. val = NewString(val);
  161. Decref(val);
  162. }
  163. Delete(l->items[n]);
  164. l->items[n] = val;
  165. Incref(val);
  166. Delete(val);
  167. return 0;
  168. }
  169. /* -----------------------------------------------------------------------------
  170. * List_first()
  171. *
  172. * Return the first item in the list.
  173. * ----------------------------------------------------------------------------- */
  174. static DOH *
  175. List_first(DOH *lo) {
  176. List *l = (List *) ObjData(lo);
  177. l->iter = 0;
  178. if (l->iter >= l->nitems) return 0;
  179. return l->items[l->iter];
  180. }
  181. /* -----------------------------------------------------------------------------
  182. * List_next()
  183. *
  184. * Return the next item in the list.
  185. * ----------------------------------------------------------------------------- */
  186. static DOH *
  187. List_next(DOH *lo) {
  188. List *l = (List *) ObjData(lo);
  189. l->iter++;
  190. if (l->iter >= l->nitems) return 0;
  191. return l->items[l->iter];
  192. }
  193. /* -----------------------------------------------------------------------------
  194. * List_str()
  195. *
  196. * Create a string representation of the list.
  197. * ----------------------------------------------------------------------------- */
  198. static DOH *
  199. List_str(DOH *lo) {
  200. DOH *s;
  201. int i;
  202. List *l = (List *) ObjData(lo);
  203. s = NewString("");
  204. if (ObjGetMark(lo)) {
  205. Printf(s,"List(%x)", lo);
  206. return s;
  207. }
  208. ObjSetMark(lo,1);
  209. Printf(s,"List[ ");
  210. for (i = 0; i < l->nitems; i++) {
  211. Printf(s, "%s", l->items[i]);
  212. if ((i+1) < l->nitems)
  213. Printf(s,", ");
  214. }
  215. Printf(s," ]\n");
  216. ObjSetMark(lo,0);
  217. return s;
  218. }
  219. /* -----------------------------------------------------------------------------
  220. * List_dump()
  221. *
  222. * Dump the items to an output stream.
  223. * ----------------------------------------------------------------------------- */
  224. static int
  225. List_dump(DOH *lo, DOH *out) {
  226. int nsent = 0;
  227. int i,ret;
  228. List *l = (List *) ObjData(lo);
  229. for (i = 0; i < l->nitems; i++) {
  230. ret = Dump(l->items[i],out);
  231. if (ret < 0) return -1;
  232. nsent += ret;
  233. }
  234. return nsent;
  235. }
  236. /* -----------------------------------------------------------------------------
  237. * List_sort()
  238. * ----------------------------------------------------------------------------- */
  239. static int objcmp(const void *s1, const void *s2) {
  240. DOH **so1, **so2;
  241. so1 = (DOH **) s1;
  242. so2 = (DOH **) s2;
  243. return Cmp(*so1,*so2);
  244. }
  245. void
  246. List_sort(DOH *lo, int opt) {
  247. List *l = (List *) ObjData(lo);
  248. qsort(l->items,l->nitems,sizeof(DOH *),objcmp);
  249. }
  250. void List_setfile(DOH *lo, DOH *file) {
  251. DOH *fo;
  252. List *l = (List *) ObjData(lo);
  253. if (!DohCheck(file)) {
  254. fo = NewString(file);
  255. Decref(fo);
  256. } else fo = file;
  257. Incref(fo);
  258. Delete(l->file);
  259. l->file = fo;
  260. }
  261. DOH *List_getfile(DOH *lo) {
  262. List *l = (List *) ObjData(lo);
  263. return l->file;
  264. }
  265. void List_setline(DOH *lo, int line) {
  266. List *l = (List *) ObjData(lo);
  267. l->line = line;
  268. }
  269. 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. List_first,
  279. List_next,
  280. List_sort
  281. };
  282. static DohObjInfo ListType = {
  283. "List", /* objname */
  284. DelList, /* doh_del */
  285. CopyList, /* doh_copy */
  286. List_clear, /* doh_clear */
  287. List_str, /* doh_str */
  288. 0, /* doh_data */
  289. List_dump, /* doh_dump */
  290. List_len, /* doh_len */
  291. 0, /* doh_hash */
  292. 0, /* doh_cmp */
  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. NewList() {
  312. List *l;
  313. int i;
  314. static int init = 0;
  315. if (!init) {
  316. DohRegisterType(DOHTYPE_LIST, &ListType);
  317. init = 1;
  318. }
  319. l = (List *) DohMalloc(sizeof(List));
  320. l->nitems = 0;
  321. l->maxitems = MAXLISTITEMS;
  322. l->items = (void **) DohMalloc(l->maxitems*sizeof(void *));
  323. for (i = 0; i < MAXLISTITEMS; i++) {
  324. l->items[i] = 0;
  325. }
  326. l->iter = 0;
  327. l->file = 0;
  328. l->line = 0;
  329. return DohObjMalloc(DOHTYPE_LIST,l);
  330. }