source: trunk/athena/etc/synctree/synctree.h @ 10717

Revision 10717, 2.3 KB checked in by ghudson, 27 years ago (diff)
Ditch alloca for malloc.
  • Property svn:executable set to *
Line 
1/* Copyright (C) 1988  Tim Shepard   All rights reserved. */
2
3#if defined(_AUX_SOURCE)
4#define NO_RLIMIT
5#define NO_LINEBUF
6#endif
7
8#include <ctype.h>
9#define MAXNRULES 2000
10
11#ifdef FALSE
12#undef FALSE
13#endif
14#ifdef TRUE
15#undef TRUE
16#endif
17typedef enum bool { FALSE, TRUE} bool;
18
19
20typedef struct boolstruct {
21  enum boolexp_type { VARIABLE, UNARY, BINARY } type;
22  enum bool_operator { NOT, AND, OR } op;
23  char *variable;
24  struct boolstruct *left;
25  struct boolstruct *right;
26} *bool_exp;
27
28bool_exp bool_var();
29bool_exp bool_not();
30bool_exp bool_and();
31bool_exp bool_or();
32void bool_free();
33bool bool_eval();
34bool getvar();
35
36
37typedef struct {
38  enum rule_type { R_MAP, R_CHASE, R_ACTION, R_WHEN,
39                     R_IF, R_IF_ELSE, R_SKIP,
40                     R_FRAMEMARKER } type;
41  union { struct { char *globexp;
42                   unsigned int file_types;
43                   char **dests;
44                 } u_map;
45          struct { char *globexp; } u_chase;
46          struct { enum action_type
47                     {  ACTION_COPY, ACTION_LOCAL, ACTION_LINK,
48                          ACTION_DELETE, ACTION_IGNORE } type;
49                   char *globexp;
50                   unsigned int file_types;
51                   unsigned int options;
52                 } u_action;
53          struct { enum when_type { WHEN_SH, WHEN_CSH } type;
54                   char *globexp;
55                   unsigned int file_types;
56                   char **cmds;
57                 } u_when;
58          struct { bool_exp boolexp;
59                   int first;
60                   bool inactive;  /* this is not filled in by readrules */
61                 } u_if;
62          struct { int first;
63                 } u_skip;
64        } u;
65} rule;
66
67#define letternum(c) (c - (isupper(c)? 'A':'a'))
68#define set_option(bf,c) (bf |= (0x01 << letternum(c)))
69#define option_on(rno,c) ((bool) ((rules[rno].type == R_ACTION)? \
70                                  (((rules[rno].u.u_action.options) >> letternum(c)) & 0x01): \
71                                  panic("option_on: rules[rno].type is not R_ACTION")))
72
73/* definitions for 'types' field */
74#define TYPE_D 0x01
75#define TYPE_C 0x02
76#define TYPE_B 0x04
77#define TYPE_R 0x08
78#define TYPE_L 0x10
79#define TYPE_S 0x20
80#define TYPE_X 0x40
81#define TYPE_V 0x80
82#define TYPE_ALL (TYPE_D|TYPE_C|TYPE_B|TYPE_R|TYPE_L|TYPE_S|TYPE_V)
83
84#define hastype(bf,tp) ((bool) ((bf & tp) != 0))
85
86
87/*  now implemented as a procedure in rules.c
88#define newrule()  { if (++lastrule == MAXNRULES) { \
89    fprintf(stderr,"Too many rules.\n"); \
90    exit(1); }}
91*/
92void newrule();
93#define lstrule rules[lastrule]
94
95
96/* definitions for 'rflag' variable */
97#define RFLAG_SCAN_TARGET       0x01    /* Target directory scan necessary */
Note: See TracBrowser for help on using the repository browser.