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 44 #include "object.h" 45 46 #ifdef HAVE_PYTHON 47 # include <Python.h> 48 #endif 49 50 /* 51 * LIST - list of strings 52 */ 53 54 typedef struct _list { 55 union { 56 int size; 57 struct _list * next; 58 OBJECT * align; 59 } impl; 60 } LIST; 61 62 typedef OBJECT * * LISTITER; 63 64 /* 65 * LOL - list of LISTs 66 */ 67 68 #define LOL_MAX 19 69 typedef struct _lol { 70 int count; 71 LIST * list[ LOL_MAX ]; 72 } LOL; 73 74 LIST * list_new( OBJECT * value ); 75 LIST * list_append( LIST * destination, LIST * source ); 76 LIST * list_copy( LIST * ); 77 LIST * list_copy_range( LIST * destination, LISTITER first, LISTITER last ); 78 void list_free( LIST * head ); 79 LIST * list_push_back( LIST * head, OBJECT * value ); 80 void list_print( LIST * ); 81 int list_length( LIST * ); 82 LIST * list_sublist( LIST *, int start, int count ); 83 LIST * list_pop_front( LIST * ); 84 LIST * list_sort( LIST * ); 85 LIST * list_unique( LIST * sorted_list ); 86 int list_in( LIST *, OBJECT * value ); 87 LIST * list_reverse( LIST * ); 88 int list_cmp( LIST * lhs, LIST * rhs ); 89 int list_is_sublist( LIST * sub, LIST * l ); 90 void list_done(); 91 92 LISTITER list_begin( LIST * ); 93 LISTITER list_end( LIST * ); 94 #define list_next( it ) ((it) + 1) 95 #define list_item( it ) (*(it)) 96 #define list_empty( l ) ((l) == L0) 97 #define list_front( l ) list_item( list_begin( l ) ) 98 99 #define L0 ((LIST *)0) 100 101 void lol_add( LOL *, LIST * ); 102 void lol_init( LOL * ); 103 void lol_free( LOL * ); 104 LIST * lol_get( LOL *, int i ); 105 void lol_print( LOL * ); 106 void lol_build( LOL *, char const * * elements ); 107 108 #ifdef HAVE_PYTHON 109 PyObject * list_to_python( LIST * ); 110 LIST * list_from_python( PyObject * ); 111 #endif 112 113 #endif 114