commit 407da600814524ae5a4dc502d569323b0c09a32c
parent d6e45e4301acfcacdba728dd1ec2868d0a8a8b9b
Author: William Casarin <jb55@jb55.com>
Date:   Thu,  2 Jul 2020 08:17:57 -0700
print scene tree description
Diffstat:
5 files changed, 80 insertions(+), 36 deletions(-)
diff --git a/Makefile b/Makefile
@@ -6,6 +6,9 @@ OBJS = io.o parse.o
 protoverse: protoverse.c $(OBJS)
 	$(CC) $(CFLAGS) $^ $(LDFLAGS) -o $@
 
+libprotoverse.a: $(OBJS)
+	ar rcs $@ $^
+
 clean:
 	rm -f protoverse *.o
 
diff --git a/parse.c b/parse.c
@@ -99,6 +99,25 @@ static const char *token_error_string(enum token_error err)
 	return "unknown";
 }
 
+void print_cell(struct cursor *attributes, struct cell *cell)
+{
+	const char *name;
+	int name_len;
+
+	if (cell->type == C_GROUP) {
+		printf("---\n");
+		return;
+	}
+
+	cell_name(attributes, cell, &name, &name_len);
+
+	printf("%.*s%s%s\n", name_len, name, name_len > 0?" ":"",
+	       cell->type == C_OBJECT
+	       ? object_type_str(cell->obj_type)
+	       : cell_type_str(cell->type));
+}
+
+
 static const char *token_type_str(enum token_type type)
 {
 	switch (type) {
@@ -1024,16 +1043,9 @@ static int push_cell(struct cursor *cells, struct cell *cell, u16 *cell_index)
 	int index;
 	int ok;
 
-	static int group_count = 0;
-
-	if (cell->type == C_GROUP)
-		group_count++;
-
-	assert(group_count != 2);
-
-	tokdebug("push_cell %s\n", cell_type_str(cell->type));
+	index = cursor_index(cells, sizeof(*cell));
 
-	index = cursor_index(cells, sizeof(cell));
+	tokdebug("push_cell %d (%zu) %s\n", index, cells->p - cells->start, cell_type_str(cell->type));
 
 	if (index > 0xFFFF) {
 		/* TODO: actual error message here */
@@ -1280,6 +1292,7 @@ static int parse_object(struct parser *parser, u16 *index)
 	ok = parse_cell_attrs(&backtracked, &ind, &cell);
 	if (!ok) return 0;
 
+	assert(ind < 10);
 	if (index)
 		*index = ind;
 
diff --git a/parse.h b/parse.h
@@ -124,6 +124,7 @@ struct parser {
 
 
 void make_cursor(u8 *start, u8 *end, struct cursor *cursor);
+void print_cell(struct cursor *attributes, struct cell *cell);
 int tokenize_cells(unsigned char *buf, int buf_size, struct cursor *tokens);
 int parse_cell(struct parser *parser, u16 *index);
 void print_token_error(struct cursor *cursor);
diff --git a/protoverse.c b/protoverse.c
@@ -4,6 +4,48 @@
 
 #include <assert.h>
 
+static void print_all_cells(struct parser *parser)
+{
+	struct cell *cell;
+	int i, j;
+	int ncells;
+
+	ncells = cursor_index(parser->cells, sizeof(struct cell));
+	printf("ncells %d\n", ncells);
+	for (i = 0; i < ncells; i++) {
+		cell = get_cell(parser->cells, i);
+		print_cell(parser->attributes, cell);
+
+		for (j = 0; j < cell->n_children; j++) {
+			cell = get_cell(parser->cells, cell->children[j]);
+			assert(cell);
+			printf("  ");
+			print_cell(parser->attributes, cell);
+		}
+	}
+}
+
+static int print_cell_tree(struct parser *parser, u16 root, int depth)
+{
+	int i;
+
+	struct cell *cell = get_cell(parser->cells, root);
+	if (!cell) return 0;
+
+	for (i = 0; i < depth; i++) {
+		printf("  ");
+	}
+
+	print_cell(parser->attributes, cell);
+
+	for (i = 0; i < cell->n_children; i++) {
+		print_cell_tree(parser, cell->children[i], depth+1);
+	}
+
+
+	return 1;
+}
+
 int main(int argc, const char *argv[]) {
 	static u8 file_buf[4096];
 	static u8 token_buf[2048];
@@ -14,17 +56,12 @@ int main(int argc, const char *argv[]) {
 	struct cursor attributes;
 	struct cursor cells;
 
-	struct cell *cell;
-
 	struct parser parser;
 
 	size_t count;
 	const char *space;
-	int ok, i;
+	int ok;
 	u16 root;
-	int ncells;
-	const char *name;
-	int name_len;
 
 	parser.tokens = &tokens;
 	parser.attributes = &attributes;
@@ -58,17 +95,8 @@ int main(int argc, const char *argv[]) {
 		print_token_error(&tokens);
 	}
 
-	ncells = cursor_index(&cells, sizeof(struct cell));
-	printf("ncells %d\n", ncells);
-	for (i = 0; i < ncells; i++) {
-		name_len = 0;
-		cell = get_cell(&cells, i);
-		cell_name(&attributes, cell, &name, &name_len);
-		printf("cell %s %.*s\n",
-		       cell->type == C_OBJECT
-		       ? object_type_str(cell->obj_type)
-		       : cell_type_str(cell->type), name_len, name);
-	}
+	print_cell_tree(&parser, root, 0);
 
 	return 0;
 }
+
diff --git a/satoshis-citadel.space b/satoshis-citadel.space
@@ -1,18 +1,17 @@
-(room (shape rectangle) 
-      (name "\"Satoshi's\" Citadel")
+(room (shape rectangle)
+      (name "Satoshi's Citadel")
       (width 10) (depth 10) (height 100)
       (group
          (table
             (id welcome-desk)
-            (name "Welcome desk")
+            (name "welcome desk")
             (material marble)
             (condition clean)
             (condition new)
             (width 1) (depth 2) (height 1)
-            (location center))
-         (table
-           (name "main")
-           (light (name "lamp")))
-       )
-)
-
+            (location center)
+            (light (name "desk")))
+         (chair (id welcome-desk-chair)
+                (name  "welcome desk chair"))
+         (light (location ceiling)
+                (shape round))))