summaryrefslogtreecommitdiff
path: root/dmake/struct.h
blob: 3c1c350a8a06cb3fa2533e2216277fe51831568f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
/* RCS  $Id: struct.h,v 1.2 2006-06-29 11:24:50 ihi Exp $
--
-- SYNOPSIS
--      Structure definitions
--
-- DESCRIPTION
--  dmake main data structure definitions.  See each of the individual
--  struct declarations for more detailed information on the defined
--  fields and their use.
--
-- AUTHOR
--      Dennis Vadura, dvadura@dmake.wticorp.com
--
-- WWW
--      http://dmake.wticorp.com/
--
-- COPYRIGHT
--      Copyright (c) 1996,1997 by WTI Corp.  All rights reserved.
--
--      This program is NOT free software; you can redistribute it and/or
--      modify it under the terms of the Software License Agreement Provided
--      in the file <distribution-root>/readme/license.txt.
--
-- LOG
--      Use cvs log to obtain detailed change logs.
*/

#ifndef _STRUCT_INCLUDED_
#define _STRUCT_INCLUDED_

typedef uint32 t_attr;

/* The following struct is the cell used in the hash table.
 * NOTE:  It contains the actual hash value.  This allows the hash table
 *        insertion to compare hash values and to do a string compare only
 *        for entries that have matching hash_key values.  This elliminates
 *        99.9999% of all extraneous string compare operations when searching
 *        a hash table chain for matching entries.  */

typedef struct hcell {
    struct hcell    *ht_next;   /* next entry in the hash table */
        struct hcell    *ht_link;       /* for temporary lists */
    char        *ht_name;   /* name of this cell */
    char        *ht_value;  /* cell value if any */
    uint32      ht_hash;    /* actual hash_key of cell */
    int     ht_flag;    /* flags belonging to hash entry */

    /* NOTE: some macros have corresponding variables defined
     * that control program behaviour.  For these macros a
     * bit of ht_flag indicates the variable value will be set, and the
     * type of the value that will be set.
     *
     * The struct below contains a mask for bit variables, and a
     * pointer to the global STATIC location for that variable.
     * String and char variables point to the same place as ht_value
     * and must be updated when ht_value changes, bit variables must
     * have their value recomputed. See Def_macro code for more
     * details.
     *
     * NOTE:  Macro variables and Targets are always distinct.  Thus
     * the value union contains pointers back at cells that own
     * a particular name entry.  A conflict in this can never
     * arise, ie pointers at cells will never be used as
     * values for a macro variable, since the cell and macro
     * name spaces are completely distinct. */

    struct {
        int mv_mask;    /* bit mask for bit variable      */
        union {
             char** mv_svar;/* ptr to string valued glob var  */
            char*   mv_cvar;/* ptr to char   valued glob var */
            t_attr* mv_bvar;/* ptr to bit    valued glob var */
             int*    mv_ivar;/* ptr to int    valued glob var  */

            struct {
               struct tcell* ht_owner;/* ptr to CELL owning name */
               struct tcell* ht_root; /* root ptr for explode */
            } ht;
        } val;
    } var;              /* variable's static equivalent */
} HASH, *HASHPTR;

#define MV_MASK   var.mv_mask
#define MV_SVAR   var.val.mv_svar
#define MV_CVAR   var.val.mv_cvar
#define MV_BVAR   var.val.mv_bvar
#define MV_IVAR   var.val.mv_ivar
#define CP_OWNR   var.val.ht.ht_owner
#define CP_ROOT   var.val.ht.ht_root



/* This struct holds the list of temporary files that have been created.
 * It gets unlinked when Quit is called due to an execution error */
typedef struct flst {
   char     *fl_name;   /* file name        */
   FILE     *fl_file;   /* the open file    */
   struct flst  *fl_next;   /* pointer to next file */
} FILELIST, *FILELISTPTR;


/* The next struct is used to link together prerequisite lists. It
 * is also used to link multiple targets together. */
typedef struct lcell {
    struct tcell    *cl_prq;    /* link to a prerequisite   */
    struct lcell    *cl_next;   /* next cell on dependency list */
    int     cl_flag;    /* flags for link cell      */
} LINK, *LINKPTR;


/* This is the structure of a target cell in the dag which represents the
 * graph of dependencies.  Each possible target is represented as a cell.
 *
 * Each cell contains a pointer to the hash table entry for this cell.
 * The hash table entry records the name of the cell. */

typedef struct tcell {
    struct hcell    *ce_name;   /* name of this cell                */
        struct hcell    *ce_pushed;     /* local pushed macro definitions   */

    /* Def_cell sets ce_all.cl_prq to point back to itself. .UPDATEALL
     * uses ce_all.cl_next to link the cells together. */
    struct lcell    ce_all;

    /* If set it points to first element of the list linked by ce_all. */
        struct tcell    *ce_set;
    struct tcell    *ce_setdir; /* SETDIR ROOT pointer for this cell*/
    struct tcell    *ce_link;   /* link for temporary list making   */
        struct tcell    *ce_parent;     /* used by inner loop, not a static */

    struct lcell    *ce_prq;    /* list of prerequisites for cell   */
    struct lcell    *ce_prqorg; /* list of original prerequisites   */
    struct lcell    *ce_indprq; /* indirect prerequisites for % cell*/

    struct str      *ce_recipe; /* recipe for making this cell      */
    FILELISTPTR     ce_files;   /* list of temporary files for cell */
        struct str      *ce_cond;       /* conditional macro assignments    */

    char        *ce_per;    /* value of % in %-meta expansion   */
    char        *ce_fname;  /* file name associated with target */
    char        *ce_lib;    /* archive name, if A_LIBRARYM      */
    char        *ce_dir;    /* value for .SETDIR attribute      */

    int     ce_count;   /* value for :: recipe set          */
    int     ce_index;   /* value of count for next :: child */
    int         ce_flag;    /* all kinds of goodies         */
    t_attr      ce_attr;    /* attributes for this target       */
    time_t      ce_time;    /* time stamp value of target if any*/
} CELL, *CELLPTR;

#define CE_NAME     ce_name->ht_name
#define CE_RECIPE       ce_recipe
#define CE_PRQ          ce_prq
#define CeMeToo(C)      &((C)->ce_all)
#define CeNotMe(C)      (C)->ce_all.cl_next


/* This struct represents that used by Get_token to return and control
 * access to a token list inside a particular string.  This gives the
 * ability to access non overlapping tokens simultaneously from
 * multiple strings. */

typedef struct {
    char *tk_str;              /* the string to search for tokens  */
    char tk_cchar;             /* current char under *str          */
    int  tk_quote;             /* if we are scanning a quoted str  */
}  TKSTR, *TKSTRPTR;



/* Below is the struct used to represent a string.  It points at possibly
 * another string, since the set of rules for making a target is a collection
 * of strings. */


typedef struct str {
    char        *st_string; /* the string value */
    struct str  *st_next;   /* pointer to the next string */
    t_attr      st_attr;    /* attr for rule operations */
} STRING, *STRINGPTR;



/* These structs are used in processing of the % rules, and in building
 * the NFA machine that is used to match an arbitrary target string to
 * one of the % rules that is represented by each DFA */

typedef int16 statecnt;     /* limits the max number of dfa states  */


/* Each state of the DFA contains four pieces of information. */
typedef struct st {
    struct st   *no_match;  /* state to go to if no match */
    struct st   *match;     /* state to go to if we do match */
    char        symbol;     /* symbol on which we transit */
    char        action;     /* action to perform if match */
} STATE, *STATEPTR;


/* Each DFA machine looks like this.  It must have two pointers that represent
 * the value of % in the matched string, and it contains a pointer into the
 * current state, as well as the array of all states. */
typedef struct {
    char        *pstart;    /* start of % string match */
    char        *pend;      /* end of % string match */
    STATEPTR    c_state;    /* current DFA state */
    CELLPTR     node;       /* % target represented by this DFA */
    STATEPTR    states;     /* table of states for the DFA */
} DFA, *DFAPTR;


/* An NFA is a collection of DFA's.  For each DFA we must know it's current
 * state and where the next NFA is. */
typedef struct nfa_machine {
    DFAPTR      dfa;        /* The DFA for this eps transition */
    char        status;     /* DFA state */
    struct nfa_machine *next;   /* the next DFA in NFA */
} NFA, *NFAPTR;



/* The next struct is used to link together DFA nodes for inference. */

typedef struct dfal {
    struct tcell    *dl_meta;   /* link to %-meta cell      */
    struct dfal *dl_next;   /* next cell on matched DFA list*/
    struct dfal *dl_prev;   /* prev cell on matched DFA list*/
    struct dfal *dl_member; /* used during subset calc  */
    char        dl_delete;  /* used during subset calc  */
    char        *dl_per;    /* value of % for matched DFA   */
    statecnt        dl_state;   /* matched state of the DFA */
    int     dl_prep;    /* repetion count for the cell  */
} DFALINK, *DFALINKPTR;


/* This struct is used to store the stack of DFA sets during inference */
typedef struct dfst {
   DFALINKPTR   df_set;         /* pointer to the set       */
   struct dfst *df_next;        /* next element in the stack    */
} DFASET, *DFASETPTR;


/* We need sets of items during inference, here is the item, we form sets
 * by linking them together. */

typedef struct ic {
   CELLPTR  ic_meta;        /* Edge we used to make this cell*/
   DFALINKPTR   ic_dfa;         /* Dfa that we matched against   */
   CELLPTR  ic_setdirroot;      /* setdir root pointer for cell  */
   DFASET       ic_dfastack;        /* set of dfas we're working with*/
   int      ic_dmax;        /* max depth of cycles in graph  */
   char        *ic_name;        /* name of the cell to insert    */
   char        *ic_dir;         /* dir to CD to prior to recurse */
   struct ic   *ic_next;        /* next pointer to link      */
   struct ic   *ic_link;        /* link all ICELL'S together     */
   struct ic   *ic_parent;      /* pointer to post-requisite     */
   char     ic_flag;        /* flag, used for NOINFER only   */
   char         ic_exists;      /* TRUE if prerequisite exists   */
} ICELL, *ICELLPTR;

#endif