]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /* |
2 | * Copyright 1993, 1995 Christopher Seiwald. | |
3 | * | |
4 | * This file is part of Jam - see jam.c for Copyright information. | |
5 | */ | |
6 | ||
7 | /* This file is ALSO: | |
8 | * Copyright 2001-2004 David Abrahams. | |
9 | * Distributed under the Boost Software License, Version 1.0. | |
10 | * (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) | |
11 | */ | |
12 | ||
13 | /* | |
14 | * lists.h - the LIST structure and routines to manipulate them | |
15 | * | |
16 | * The whole of jam relies on lists of objects as a datatype. This module, in | |
17 | * conjunction with object.c, handles these relatively efficiently. | |
18 | * | |
19 | * Structures defined: | |
20 | * | |
21 | * LIST - list of OBJECTs | |
22 | * LOL - list of LISTs | |
23 | * | |
24 | * External routines: | |
25 | * | |
26 | * list_append() - append a list onto another one, returning total | |
27 | * list_new() - tack an object onto the end of a list of objects | |
28 | * list_copy() - copy a whole list of objects | |
29 | * list_sublist() - copy a subset of a list of objects | |
30 | * list_free() - free a list of objects | |
31 | * list_print() - print a list of objects to stdout | |
32 | * list_length() - return the number of items in the list | |
33 | * | |
34 | * lol_init() - initialize a LOL (list of lists) | |
35 | * lol_add() - append a LIST onto an LOL | |
36 | * lol_free() - free the LOL and its LISTs | |
37 | * lol_get() - return one of the LISTs in the LOL | |
38 | * lol_print() - debug print LISTS separated by ":" | |
39 | */ | |
40 | ||
41 | #ifndef LISTS_DWA20011022_H | |
42 | #define LISTS_DWA20011022_H | |
43 | ||
92f5a8d4 | 44 | #include "config.h" |
7c673cae FG |
45 | #include "object.h" |
46 | ||
47 | #ifdef HAVE_PYTHON | |
48 | # include <Python.h> | |
49 | #endif | |
50 | ||
51 | /* | |
52 | * LIST - list of strings | |
53 | */ | |
54 | ||
55 | typedef struct _list { | |
56 | union { | |
57 | int size; | |
58 | struct _list * next; | |
59 | OBJECT * align; | |
60 | } impl; | |
61 | } LIST; | |
62 | ||
63 | typedef OBJECT * * LISTITER; | |
64 | ||
65 | /* | |
66 | * LOL - list of LISTs | |
67 | */ | |
68 | ||
69 | #define LOL_MAX 19 | |
70 | typedef struct _lol { | |
71 | int count; | |
72 | LIST * list[ LOL_MAX ]; | |
73 | } LOL; | |
74 | ||
75 | LIST * list_new( OBJECT * value ); | |
76 | LIST * list_append( LIST * destination, LIST * source ); | |
77 | LIST * list_copy( LIST * ); | |
78 | LIST * list_copy_range( LIST * destination, LISTITER first, LISTITER last ); | |
79 | void list_free( LIST * head ); | |
80 | LIST * list_push_back( LIST * head, OBJECT * value ); | |
81 | void list_print( LIST * ); | |
82 | int list_length( LIST * ); | |
83 | LIST * list_sublist( LIST *, int start, int count ); | |
84 | LIST * list_pop_front( LIST * ); | |
85 | LIST * list_sort( LIST * ); | |
86 | LIST * list_unique( LIST * sorted_list ); | |
87 | int list_in( LIST *, OBJECT * value ); | |
88 | LIST * list_reverse( LIST * ); | |
89 | int list_cmp( LIST * lhs, LIST * rhs ); | |
90 | int list_is_sublist( LIST * sub, LIST * l ); | |
91 | void list_done(); | |
92 | ||
93 | LISTITER list_begin( LIST * ); | |
94 | LISTITER list_end( LIST * ); | |
95 | #define list_next( it ) ((it) + 1) | |
96 | #define list_item( it ) (*(it)) | |
97 | #define list_empty( l ) ((l) == L0) | |
98 | #define list_front( l ) list_item( list_begin( l ) ) | |
99 | ||
100 | #define L0 ((LIST *)0) | |
101 | ||
102 | void lol_add( LOL *, LIST * ); | |
103 | void lol_init( LOL * ); | |
104 | void lol_free( LOL * ); | |
105 | LIST * lol_get( LOL *, int i ); | |
106 | void lol_print( LOL * ); | |
107 | void lol_build( LOL *, char const * * elements ); | |
108 | ||
109 | #ifdef HAVE_PYTHON | |
110 | PyObject * list_to_python( LIST * ); | |
111 | LIST * list_from_python( PyObject * ); | |
112 | #endif | |
113 | ||
114 | #endif |