r5391 - trunk/eda/fped

werner at docs.openmoko.org werner at docs.openmoko.org
Thu Aug 6 06:33:50 CEST 2009


Author: werner
Date: 2009-08-06 06:33:49 +0200 (Thu, 06 Aug 2009)
New Revision: 5391

Modified:
   trunk/eda/fped/README
   trunk/eda/fped/delete.c
   trunk/eda/fped/dump.c
   trunk/eda/fped/fpd.y
   trunk/eda/fped/fped.c
   trunk/eda/fped/gui_tools.c
   trunk/eda/fped/inst.c
   trunk/eda/fped/inst.h
   trunk/eda/fped/obj.h
Log:
- undelete after recursive delete now brings back everything deleted in that
  operation, not just one object at a time
- vector reference counting is not needed now that we have recursive delete.
  Removed it.
- completed recursive delete of vectors
- gridify: give new vectors a minimum length, so that we don't get a weird
  display when starting a new footprint.



Modified: trunk/eda/fped/README
===================================================================
--- trunk/eda/fped/README	2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/README	2009-08-06 04:33:49 UTC (rev 5391)
@@ -403,4 +403,5 @@
 
 To delete an object, select it and press Delete. Deleted objects can
 be undeleted by pressing "u". If any other changes have been made
-since deletion, fped may misbehave.
+since deletion, fped may misbehave. If deleting a vector, all items
+that reference it are deleted.

Modified: trunk/eda/fped/delete.c
===================================================================
--- trunk/eda/fped/delete.c	2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/delete.c	2009-08-06 04:33:49 UTC (rev 5391)
@@ -41,16 +41,24 @@
 			struct obj *prev;
 		} obj;
 	} u;
+	int group;
 	struct deletion *next;
 } *deletions = NULL;
 
+static int groups = 0;
 
+
+static void do_delete_vec(struct vec *vec);
+static void do_delete_obj(struct obj *obj);
+
+
 static struct deletion *new_deletion(enum del_type type)
 {
 	struct deletion *del;
 
 	del = alloc_type(struct deletion);
 	del->type = type;
+	del->group = groups;
 	del->next = deletions;
 	deletions = del;
 	return del;
@@ -60,38 +68,64 @@
 /* ----- vectors ----------------------------------------------------------- */
 
 
-static void dereference_vec(struct vec *vec)
-{
-	assert(!vec->n_refs);
-	put_vec(vec->base);
-}
-
-
 static void destroy_vec(struct vec *vec)
 {
-	assert(!vec->n_refs);
 	free_expr(vec->x);
 	free_expr(vec->y);
 	free(vec);
 }
 
 
-static void rereference_vec(struct vec *vec)
+static void delete_vecs_by_ref(struct vec *vecs, const struct vec *ref)
 {
-	get_vec(vec->base);
+	while (vecs) {
+		if (vecs->base == ref)
+			do_delete_vec(vecs);
+		vecs = vecs->next;
+	}
 }
 
 
-void delete_vec(struct vec *vec)
+static int obj_has_ref(const struct obj *obj, const struct vec *ref)
 {
+	if (obj->base == ref)
+		return 1;
+	switch (obj->type) {
+	case ot_frame:
+		return 0;
+	case ot_line:
+		return obj->u.line.other == ref;
+	case ot_rect:
+		return obj->u.rect.other == ref;
+	case ot_pad:
+		return obj->u.pad.other == ref;
+	case ot_arc:
+		return obj->u.arc.start == ref || obj->u.arc.end == ref;
+	case ot_meas:
+	default:
+		abort();
+	}
+}
+
+
+static void delete_objs_by_ref(struct obj **objs, const struct vec *ref)
+{
+	struct obj *obj;
+
+	for (obj = *objs; obj; obj = obj->next)
+		if (obj_has_ref(obj, ref))
+			do_delete_obj(obj);
+}
+
+
+static void do_delete_vec(struct vec *vec)
+{
 	struct vec *walk, *prev;
 	struct deletion *del;
 
-	if (vec->n_refs) {
-		fail("vector has %d reference%s", vec->n_refs,
-		    vec->n_refs == 1 ? "" : "s");
-		return;
-	}
+	delete_vecs_by_ref(vec->frame->vecs, vec);
+	delete_objs_by_ref(&vec->frame->objs, vec);
+
 	prev = NULL;
 	for (walk = vec->frame->vecs; walk != vec; walk = walk->next)
 		prev = walk;
@@ -99,13 +133,19 @@
 		prev->next = vec->next;
 	else
 		vec->frame->vecs = vec->next;
-	dereference_vec(vec);
 	del = new_deletion(dt_vec);
 	del->u.vec.ref = vec;
 	del->u.vec.prev = prev;
 }
 
 
+void delete_vec(struct vec *vec)
+{
+	groups++;
+	do_delete_vec(vec);
+}
+
+
 static void undelete_vec(struct vec *vec, struct vec *prev)
 {
 	if (prev) {
@@ -115,42 +155,12 @@
 		assert(vec->next == vec->frame->vecs);
 		vec->frame->vecs = vec;
 	}
-	rereference_vec(vec);
 }
 
 
 /* ----- objects ----------------------------------------------------------- */
 
 
-static void dereference_obj(struct obj *obj)
-{
-	switch (obj->type) {
-	case ot_frame:
-		/* nothing */
-		break;
-	case ot_pad:
-		put_vec(obj->u.pad.other);
-		break;
-	case ot_line:
-		put_vec(obj->u.line.other);
-		break;
-	case ot_rect:
-		put_vec(obj->u.rect.other);
-		break;
-	case ot_arc:
-		put_vec(obj->u.arc.start);
-		put_vec(obj->u.arc.end);
-		break;
-	case ot_meas:
-		put_vec(obj->u.meas.other);
-		break;
-	default:
-		abort();
-	}
-	put_vec(obj->base);
-}
-
-
 static void destroy_obj(struct obj *obj)
 {
 	switch (obj->type) {
@@ -179,37 +189,8 @@
 }
 
 
-static void rereference_obj(struct obj *obj)
+static void do_delete_obj(struct obj *obj)
 {
-	switch (obj->type) {
-	case ot_frame:
-		/* nothing */
-		break;
-	case ot_pad:
-		get_vec(obj->u.pad.other);
-		break;
-	case ot_line:
-		get_vec(obj->u.line.other);
-		break;
-	case ot_rect:
-		get_vec(obj->u.rect.other);
-		break;
-	case ot_arc:
-		get_vec(obj->u.arc.start);
-		get_vec(obj->u.arc.end);
-		break;
-	case ot_meas:
-		get_vec(obj->u.meas.other);
-		break;
-	default:
-		abort();
-	}
-	get_vec(obj->base);
-}
-
-
-void delete_obj(struct obj *obj)
-{
 	struct obj *walk, *prev;
 	struct deletion *del;
 
@@ -220,13 +201,19 @@
 		prev->next = obj->next;
 	else
 		obj->frame->objs = obj->next;
-	dereference_obj(obj);
 	del = new_deletion(dt_obj);
 	del->u.obj.ref = obj;
 	del->u.obj.prev = prev;
 }
 
 
+void delete_obj(struct obj *obj)
+{
+	groups++;
+	do_delete_obj(obj);
+}
+
+
 static void undelete_obj(struct obj *obj, struct obj *prev)
 {
 	if (prev) {
@@ -236,7 +223,6 @@
 		assert(obj->next == obj->frame->objs);
 		obj->frame->objs = obj;
 	}
-	rereference_obj(obj);
 }
 
 
@@ -260,6 +246,7 @@
 {
 	struct deletion *del;
 
+	groups++;
 	delete_references(frame);
 
 	del = new_deletion(dt_frame);
@@ -318,7 +305,7 @@
 }
 
 
-int undelete(void)
+static int undelete_one(void)
 {
 	struct deletion *del;
 
@@ -342,3 +329,16 @@
 	free(del);
 	return 1;
 }
+
+
+int undelete(void)
+{
+	int group;
+
+	if (!deletions)
+		return 0;
+	group = deletions->group;
+	while (deletions && deletions->group == group)
+		undelete_one();
+	return 1;
+}

Modified: trunk/eda/fped/dump.c
===================================================================
--- trunk/eda/fped/dump.c	2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/dump.c	2009-08-06 04:33:49 UTC (rev 5391)
@@ -114,8 +114,6 @@
 	const struct vec *walk;
 	int n;
 
-	if (!vec->n_refs)
-		return 0;
 	n = 0;
 	for (walk = vec->frame->vecs; walk; walk = walk->next)
 		if (walk->base == vec)

Modified: trunk/eda/fped/fpd.y
===================================================================
--- trunk/eda/fped/fpd.y	2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/fpd.y	2009-08-06 04:33:49 UTC (rev 5391)
@@ -345,7 +345,6 @@
 			$$->base = $2;
 			$$->x = $4;
 			$$->y = $6;
-			$$->n_refs = 0;
 			$$->frame = curr_frame;
 			$$->next = NULL;
 			last_vec = $$;
@@ -366,7 +365,6 @@
 				yyerrorf(". without predecessor");
 				YYABORT;
 			}
-			$$->n_refs++;
 		}
 	| ID
 		{
@@ -375,7 +373,6 @@
 				yyerrorf("unknown vector \"%s\"", $1);
 				YYABORT;
 			}
-			$$->n_refs++;
 		}
 	;
 
@@ -406,7 +403,7 @@
 			$$ = new_obj(ot_arc);
 			$$->base = $2;
 			$$->u.arc.start = $3;
-			$$->u.arc.end = get_vec($3);
+			$$->u.arc.end = $3;
 			$$->u.arc.width = $4;
 		}
 	| TOK_ARC base base base opt_expr

Modified: trunk/eda/fped/fped.c
===================================================================
--- trunk/eda/fped/fped.c	2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/fped.c	2009-08-06 04:33:49 UTC (rev 5391)
@@ -54,7 +54,7 @@
 	if (error)
 		return error;
 
-//	dump(stdout);
+	dump(stdout);
 
 	return 0;
 }

Modified: trunk/eda/fped/gui_tools.c
===================================================================
--- trunk/eda/fped/gui_tools.c	2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/gui_tools.c	2009-08-06 04:33:49 UTC (rev 5391)
@@ -80,8 +80,7 @@
 
 	vec = alloc_type(struct vec);
 	vec->name = NULL;
-	vec->base = inst_get_ref(base);
-	vec->n_refs = 0;
+	vec->base = inst_get_vec(base);
 	vec->next = NULL;
 	vec->frame = active_frame;
 	for (walk = &active_frame->vecs; *walk; walk = &(*walk)->next);
@@ -97,7 +96,7 @@
 	obj = alloc_type(struct obj);
 	obj->type = type;
 	obj->frame = active_frame;
-	obj->base = inst_get_ref(base);
+	obj->base = inst_get_vec(base);
 	obj->next = NULL;
 	obj->lineno = 0;
 	for (walk = &active_frame->objs; *walk; walk = &(*walk)->next);
@@ -164,10 +163,20 @@
 /* ----- vec --------------------------------------------------------------- */
 
 
-static void gridify(struct coord base, struct coord *pos)
+static struct coord gridify(struct coord base, struct coord pos)
 {
-	pos->x -= fmod(pos->x-base.x, mm_to_units(0.1));
-	pos->y -= fmod(pos->y-base.y, mm_to_units(0.1));
+	struct coord new;
+	unit_type unit = mm_to_units(0.1);
+
+	new.x = pos.x-(pos.x-base.x % unit);
+	new.y = pos.y-(pos.y-base.y % unit);
+	if (new.x != base.x || new.y != base.y)
+		return new;
+	if (fabs(pos.x-base.x) > fabs(pos.y-base.y))
+		new.x += pos.x > base.x ? unit : -unit;
+	else
+		new.y += pos.y > base.y ? unit : -unit;
+	return new;
 }
 
 
@@ -178,7 +187,7 @@
 	struct pix_buf *buf;
 
 	pos = inst_get_point(from);
-	gridify(pos, &to);
+	to = gridify(pos, to);
 	status_set_type_x("dX =");
 	status_set_type_y("dX =");
 	status_set_x("%lg mm", units_to_mm(to.x-pos.x));
@@ -207,7 +216,7 @@
 
 	vec = new_vec(from);
 	pos = inst_get_point(from);
-	gridify(pos, &to);
+	to = gridify(pos, to);
 	vec->x = new_num(make_mm(units_to_mm(to.x-pos.x)));
 	vec->y = new_num(make_mm(units_to_mm(to.y-pos.y)));
 	return 1;
@@ -252,7 +261,7 @@
 	if (from == to)
 		return 0;
 	obj = new_obj(ot_line, from);
-	obj->u.line.other = inst_get_ref(to);
+	obj->u.line.other = inst_get_vec(to);
 	obj->u.line.width = NULL;
 	return 1;
 }
@@ -298,7 +307,7 @@
 	if (from == to)
 		return 0;
 	obj = new_obj(ot_rect, from);
-	obj->u.rect.other = inst_get_ref(to);
+	obj->u.rect.other = inst_get_vec(to);
 	obj->u.rect.width = NULL;
 	return 1;
 }
@@ -321,7 +330,7 @@
 	if (from == to)
 		return 0;
 	obj = new_obj(ot_pad, from);
-	obj->u.pad.other = inst_get_ref(to);
+	obj->u.pad.other = inst_get_vec(to);
 	obj->u.pad.name = stralloc("?");
 	return 1;
 }
@@ -367,8 +376,8 @@
 	if (from == to)
 		return 0;
 	obj = new_obj(ot_arc, from);
-	obj->u.arc.start = inst_get_ref(to);
-	obj->u.arc.end = inst_get_ref(to);
+	obj->u.arc.start = inst_get_vec(to);
+	obj->u.arc.end = inst_get_vec(to);
 	obj->u.arc.width = NULL;
 	return 1;
 }
@@ -417,16 +426,6 @@
 }
 
 
-static void replace(struct vec **anchor, struct vec *new)
-{
-	if (*anchor)
-		(*anchor)->n_refs--;
-	*anchor = new;
-	if (new)
-		new->n_refs++;
-}
-
-
 void do_move_to_arc(struct inst *inst, struct vec *vec, int i)
 {
 	struct obj *obj = inst->obj;
@@ -435,15 +434,15 @@
 	is_circle = obj->u.arc.start == obj->u.arc.end;
 	switch (i) {
 	case 0:
-		replace(&obj->base, vec);
+		obj->base = vec;
 		break;
 	case 1:
-		replace(&obj->u.arc.start, vec);
+		obj->u.arc.start = vec;
 		if (!is_circle)
 			break;
 		/* fall through */
 	case 2:
-		replace(&obj->u.arc.end, vec);
+		obj->u.arc.end = vec;
 		break;
 	default:
 		abort();
@@ -475,7 +474,7 @@
 	if (from == to)
 		return 0;
 	obj = new_obj(ot_meas, from);
-	obj->u.meas.other = inst_get_ref(to);
+	obj->u.meas.other = inst_get_vec(to);
 	obj->u.meas.offset = parse_expr("0mm");
 	return 1;
 }
@@ -643,13 +642,8 @@
 
 static void do_move_to(struct drag_state *state, struct inst *curr)
 {
-	struct vec *old;
-
 	assert(may_move_to(state, curr));
-	old = *state->anchors[state->anchor_i];
-	if (old)
-		old->n_refs--;
-	*state->anchors[state->anchor_i] = inst_get_ref(curr);
+	*state->anchors[state->anchor_i] = inst_get_vec(curr);
 }
 
 

Modified: trunk/eda/fped/inst.c
===================================================================
--- trunk/eda/fped/inst.c	2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/inst.c	2009-08-06 04:33:49 UTC (rev 5391)
@@ -219,18 +219,6 @@
 }
 
 
-struct vec *inst_get_ref(const struct inst *inst)
-{
-	if (inst->ops == &vec_ops) {
-		inst->vec->n_refs++;
-		return inst->vec;
-	}
-	if (inst->ops == &frame_ops)
-		return NULL;
-	abort();
-}
-
-
 struct vec *inst_get_vec(const struct inst *inst)
 {
 	if (inst->ops == &vec_ops)

Modified: trunk/eda/fped/inst.h
===================================================================
--- trunk/eda/fped/inst.h	2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/inst.h	2009-08-06 04:33:49 UTC (rev 5391)
@@ -87,7 +87,6 @@
 struct inst *inst_find_point(const struct draw_ctx *ctx, struct coord pos);
 struct coord inst_get_point(const struct inst *inst);
 int inst_anchors(struct inst *inst, struct vec ***anchors);
-struct vec *inst_get_ref(const struct inst *inst);
 struct vec *inst_get_vec(const struct inst *inst);
 
 int inst_vec(struct vec *vec, struct coord base);

Modified: trunk/eda/fped/obj.h
===================================================================
--- trunk/eda/fped/obj.h	2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/obj.h	2009-08-06 04:33:49 UTC (rev 5391)
@@ -88,7 +88,6 @@
 	struct expr *x;
 	struct expr *y;
 	struct vec *base; /* NULL if frame */
-	int n_refs;
 	struct vec *next;
 
 	/* used during generation */
@@ -174,23 +173,6 @@
 extern struct frame *active_frame;
 
 
-static inline struct vec *get_vec(struct vec *vec)
-{
-	if (vec)
-		vec->n_refs++;
-	return vec;
-}
-
-
-static inline void put_vec(struct vec *vec)
-{
-	if (vec) {
-		assert(vec->n_refs);
-		vec->n_refs--;
-	}
-}
-
-
 int instantiate(void);
 
 #endif /* !OBJ_H */




More information about the commitlog mailing list