|
|
1.1 root 1: /* $Id: tmesh-impl.h,v 1.1 2003/05/16 21:48:16 fredette Exp $ */
2:
3: /* tmesh/tmesh-impl.h - private header file for the tmesh implementation: */
4:
5: /*
6: * Copyright (c) 2003 Matt Fredette
7: * All rights reserved.
8: *
9: * Redistribution and use in source and binary forms, with or without
10: * modification, are permitted provided that the following conditions
11: * are met:
12: * 1. Redistributions of source code must retain the above copyright
13: * notice, this list of conditions and the following disclaimer.
14: * 2. Redistributions in binary form must reproduce the above copyright
15: * notice, this list of conditions and the following disclaimer in the
16: * documentation and/or other materials provided with the distribution.
17: * 3. All advertising materials mentioning features or use of this software
18: * must display the following acknowledgement:
19: * This product includes software developed by Matt Fredette.
20: * 4. The name of the author may not be used to endorse or promote products
21: * derived from this software without specific prior written permission.
22: *
23: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26: * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
27: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32: * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33: * POSSIBILITY OF SUCH DAMAGE.
34: */
35:
36: #ifndef _TMESH_IMPL_H
37: #define _TMESH_IMPL_H
38:
39: #include <tme/common.h>
40: _TME_RCSID("$Id: tmesh-impl.h,v 1.1 2003/05/16 21:48:16 fredette Exp $");
41:
42: /* includes: */
43: #include <tme/element.h>
44: #include <tme/tmesh.h>
45: #include <errno.h>
46:
47: /* macros: */
48:
49: /* commands: */
50: #define TMESH_COMMAND_NOP (0)
51: #define TMESH_COMMAND_SOURCE (1)
52: #define TMESH_COMMAND_MKDIR (2)
53: #define TMESH_COMMAND_RMDIR (3)
54: #define TMESH_COMMAND_CD (4)
55: #define TMESH_COMMAND_PWD (5)
56: #define TMESH_COMMAND_LS (6)
57: #define TMESH_COMMAND_CONNECT (7)
58: #define TMESH_COMMAND_RM (8)
59: #define TMESH_COMMAND_MV (9)
60: #define TMESH_COMMAND_COMMAND (10)
61:
62: /* directory entry types: */
63: #define TMESH_FS_DIRENT_DIR (0)
64: #define TMESH_FS_DIRENT_ELEMENT (1)
65:
66: /* lookup/find flags: */
67: #define TMESH_SEARCH_NORMAL (0)
68: #define TMESH_SEARCH_LAST_PART_OK TME_BIT(0)
69: #define TMESH_SEARCH_NO_RECURSE TME_BIT(1)
70:
71: /* memory allocation: */
72: #define _tmesh_gc_new(s, t, x) ((t *) _tmesh_gc_malloc(s, sizeof(t) * (x)))
73: #define _tmesh_gc_renew(s, t, m, x) ((t *) _tmesh_gc_realloc(s, m, sizeof(t) * (x)))
74:
75: /* a garbage collection record: */
76: struct tmesh_gc_record {
77:
78: /* the next and previous records on the list: */
79: struct tmesh_gc_record *tmesh_gc_record_next;
80: struct tmesh_gc_record **tmesh_gc_record_prev;
81:
82: /* the memory to garbage collect: */
83: void *tmesh_gc_record_mem;
84: };
85:
86: /* a stack of ios: */
87: struct tmesh_io_stack {
88:
89: /* the next io on the stack: */
90: struct tmesh_io_stack *tmesh_io_stack_next;
91:
92: /* the io itself: */
93: struct tmesh_io tmesh_io_stack_io;
94: };
95:
96: /* the scanner state: */
97: struct tmesh_scanner {
98:
99: /* nonzero iff we need to increment the line number: */
100: unsigned int tmesh_scanner_next_line;
101:
102: /* any next token to return: */
103: int tmesh_scanner_token_next;
104:
105: /* any next character to get: */
106: int tmesh_scanner_c_next;
107:
108: /* nonzero iff we are inside a comment: */
109: int tmesh_scanner_in_comment;
110:
111: /* nonzero iff we are inside quotes: */
112: int tmesh_scanner_in_quotes;
113:
114: /* nonzero iff we are in arguments: */
115: int tmesh_scanner_in_args;
116:
117: /* the collected token: */
118: char *tmesh_scanner_token_string;
119: unsigned int tmesh_scanner_token_string_len;
120: unsigned int tmesh_scanner_token_string_size;
121: };
122:
123: /* a parser argv: */
124: struct tmesh_parser_argv {
125:
126: /* the argument count: */
127: unsigned int tmesh_parser_argv_argc;
128:
129: /* the size of the argument vector: */
130: unsigned int tmesh_parser_argv_size;
131:
132: /* the argument vector: */
133: char **tmesh_parser_argv_argv;
134: };
135:
136: /* the parser value structure: */
137: struct tmesh_parser_value {
138:
139: /* a token: */
140: int tmesh_parser_value_token;
141: #define tmesh_parser_value_command tmesh_parser_value_token
142:
143: /* up to two strings: */
144: char *tmesh_parser_value_strings[2];
145: #define tmesh_parser_value_pathname0 tmesh_parser_value_strings[0]
146: #define tmesh_parser_value_pathname1 tmesh_parser_value_strings[1]
147: #define tmesh_parser_value_arg tmesh_parser_value_strings[0]
148:
149: /* up to three argument vectors: */
150: struct tmesh_parser_argv tmesh_parser_value_argvs[3];
151: };
152:
153: /* a directory entry: */
154: struct tmesh_fs_dirent {
155:
156: /* the next and previous entries in this directory: */
157: struct tmesh_fs_dirent *tmesh_fs_dirent_next;
158: struct tmesh_fs_dirent **tmesh_fs_dirent_prev;
159:
160: /* the type of this directory entry: */
161: int tmesh_fs_dirent_type;
162:
163: /* the name in this directory entry: */
164: char *tmesh_fs_dirent_name;
165:
166: /* the value in this directory entry: */
167: void *tmesh_fs_dirent_value;
168: };
169:
170: /* an element: */
171: struct tmesh_fs_element {
172:
173: /* the parent directory of this element: */
174: struct tmesh_fs_dirent *tmesh_fs_element_parent;
175:
176: /* the real element: */
177: struct tme_element tmesh_fs_element_element;
178:
179: /* the generation number of this element: */
180: unsigned long tmesh_fs_element_gen;
181:
182: /* the arguments for this element: */
183: struct tmesh_parser_argv tmesh_fs_element_argv;
184:
185: /* the element connections: */
186: struct tmesh_fs_element_conn {
187:
188: /* the next element connection: */
189: struct tmesh_fs_element_conn *tmesh_fs_element_conn_next;
190:
191: /* backpointer to the element: */
192: struct tmesh_fs_element *tmesh_fs_element_conn_element;
193:
194: /* the generation number of this connection: */
195: unsigned long tmesh_fs_element_conn_gen;
196:
197: /* the other side of this element connection: */
198: struct tmesh_fs_element_conn *tmesh_fs_element_conn_other;
199:
200: /* the arguments for this side of the connection: */
201: struct tmesh_parser_argv tmesh_fs_element_conn_argv;
202: } *tmesh_fs_element_conns;
203: };
204:
205: /* the tmesh structure: */
206: struct tmesh {
207:
208: /* the stack of ios: */
209: struct tmesh_io_stack *tmesh_io_stack;
210:
211: /* the scanner: */
212: struct tmesh_scanner tmesh_scanner;
213:
214: /* the root directory: */
215: struct tmesh_fs_dirent *tmesh_root;
216:
217: /* the current working directory: */
218: struct tmesh_fs_dirent *tmesh_cwd;
219:
220: /* garbage-collectable memory: */
221: struct tmesh_gc_record *tmesh_gc_record;
222:
223: /* the last generation number: */
224: unsigned long tmesh_gen_last;
225:
226: /* the support: */
227: struct tmesh_support tmesh_support;
228: };
229:
230: /* prototypes: */
231: int _tmesh_yyparse _TME_P((struct tmesh *, struct tmesh_parser_value *, char **, int *));
232: void _tmesh_io_collect_output _TME_P((char **, const char *));
233: void _tmesh_io_collect_outputn _TME_P((char **, const char *, unsigned int));
234: int _tmesh_fs_lookup _TME_P((struct tmesh *, char **, struct tmesh_fs_dirent **, struct tmesh_fs_dirent **, char **, int));
235: struct tmesh_fs_dirent * _tmesh_fs_link _TME_P((struct tmesh_fs_dirent *, char *, int, void *));
236: void _tmesh_fs_unlink _TME_P((struct tmesh_fs_dirent *));
237: struct tmesh_fs_dirent * _tmesh_fs_mkdir _TME_P((struct tmesh_fs_dirent *, char *));
238: void _tmesh_fs_pathname_dir _TME_P((struct tmesh_fs_dirent *, char **, struct tmesh_fs_dirent *));
239: void _tmesh_fs_pathname_element _TME_P((struct tmesh_fs_element *, char **, struct tmesh_fs_dirent *));
240: void *_tmesh_gc_malloc _TME_P((struct tmesh *, unsigned int));
241: void *_tmesh_gc_realloc _TME_P((struct tmesh *, void *, unsigned int));
242: void _tmesh_gc_free _TME_P((struct tmesh *, void *));
243: void _tmesh_gc_release _TME_P((struct tmesh *, void *));
244: void _tmesh_gc_release_argv _TME_P((struct tmesh *, struct tmesh_parser_argv *));
245: void _tmesh_gc_gc _TME_P((struct tmesh *));
246:
247: #endif /* !_TMESH_IMPL_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.