1
0
mirror of git://projects.qi-hardware.com/fped.git synced 2024-11-25 18:01:54 +02:00

Cleaned up the disgusting mess that was the list of frames. The changes:

- removed root_frame. "frames" now takes its place.
- removed frame->prev. In those few cases where we need the previous frame (for
  deletion and dumping), we walk the list or recurse.
- the list of frames is now in GUI order, not file order.
- when reading the .fpd file, put the root frame first and leave it there.
- instead of walking the frames list and excluding the root frame by testing
  frame->name, just start at frames->next
- likewise, instead of testing !frame->name just use frame == frames



git-svn-id: http://svn.openmoko.org/trunk/eda/fped@5948 99fdad57-331a-0410-800a-d7fa5415bdb3
This commit is contained in:
werner 2010-04-28 00:34:32 +00:00
parent ac535d6e03
commit dbace0b2fa
11 changed files with 58 additions and 86 deletions

View File

@ -177,7 +177,12 @@ static void do_delete_vec(struct vec *vec)
delete_vecs_by_ref(vec->frame->vecs, vec);
delete_objs_by_ref(&vec->frame->objs, vec);
delete_objs_by_ref(&root_frame->objs, vec); /* catch measurements */
/*
* Catch measurements. During final cleanup, we may operate on an empty
* list of frames, hence the test.
*/
if (frames)
delete_objs_by_ref(&frames->objs, vec);
}
@ -546,19 +551,18 @@ static void delete_references(const struct frame *ref)
void delete_frame(struct frame *frame)
{
struct deletion *del;
struct frame *walk;
groups++;
del = new_deletion(dt_frame);
del->u.frame.ref = frame;
del->u.frame.prev = frame->prev;
if (frame->next)
frame->next->prev = frame->prev;
if (frame->prev)
frame->prev->next = frame->next;
del->u.frame.prev = NULL;
for (walk = frames; walk != frame; walk = walk->next)
del->u.frame.prev = walk;
if (del->u.frame.prev)
del->u.frame.prev->next = frame->next;
else
frames = frame->next;
frames = frame->next; /* hmm, deleting the root frame ? */
delete_references(frame);
}
@ -573,7 +577,6 @@ static void undelete_frame(struct frame *frame, struct frame *prev)
assert(frame->next == frames);
frames = frame;
}
frame->next->prev = frame;
}

26
dump.c
View File

@ -394,7 +394,7 @@ static char *print_meas_base(struct vec *base)
const char *name;
name = base_name(base, NULL);
if (base->frame == root_frame)
if (base->frame == frames)
return stralloc(name);
return stralloc_printf("%s.%s", base->frame->name, name);
}
@ -546,6 +546,15 @@ static void dump_unit(FILE *file)
}
static void reverse_frames(FILE *file, struct frame *last)
{
if (last) {
reverse_frames(file, last->next);
dump_frame(file, last, "\t");
}
}
int dump(FILE *file)
{
struct frame *frame;
@ -553,15 +562,12 @@ int dump(FILE *file)
fprintf(file, "%s\n", MACHINE_GENERATED);
for (frame = frames; frame; frame = frame->next)
frame->dumped = 0;
for (frame = frames; frame; frame = frame->next) {
if (!frame->name) {
fprintf(file, "package \"%s\"\n", pkg_name);
dump_unit(file);
dump_frame(file, frame, "");
} else {
dump_frame(file, frame, "\t");
}
}
reverse_frames(file, frames->next);
fprintf(file, "package \"%s\"\n", pkg_name);
dump_unit(file);
dump_frame(file, frames, "");
fflush(file);
return !ferror(file);
}

43
fpd.y
View File

@ -35,7 +35,6 @@ static struct frame *curr_frame;
static struct table *curr_table;
static struct row *curr_row;
static struct frame *last_frame = NULL;
static struct vec *last_vec = NULL;
static struct table **next_table;
@ -54,7 +53,7 @@ static struct frame *find_frame(const char *name)
{
struct frame *f;
for (f = frames; f; f = f->next)
for (f = frames->next; f; f = f->next)
if (f->name == name)
return f;
return NULL;
@ -210,8 +209,6 @@ static int dbg_delete(const char *frame_name, const char *name)
yyerrorf("a frame can't delete itself");
return 0;
}
if (last_frame == frame)
last_frame = frame->prev;
delete_frame(frame);
return 1;
}
@ -317,16 +314,6 @@ static int dbg_print(const struct expr *expr)
}
static void append_root_frame(void)
{
root_frame->prev = last_frame;
if (last_frame)
last_frame->next = root_frame;
else
frames = root_frame;
}
%}
@ -387,16 +374,13 @@ static void append_root_frame(void)
all:
START_FPD
{
root_frame = zalloc_type(struct frame);
set_frame(root_frame);
frames = zalloc_type(struct frame);
set_frame(frames);
id_sin = unique("sin");
id_cos = unique("cos");
id_sqrt = unique("sqrt");
}
fpd
{
append_root_frame();
}
| START_EXPR expr
{
expr_result = $2;
@ -471,16 +455,12 @@ frame_def:
curr_frame = zalloc_type(struct frame);
curr_frame->name = $2;
set_frame(curr_frame);
curr_frame->prev = last_frame;
if (last_frame)
last_frame->next = curr_frame;
else
frames = curr_frame;
last_frame = curr_frame;
curr_frame->next = frames->next;
frames->next = curr_frame;
}
opt_frame_items '}'
{
set_frame(root_frame);
set_frame(frames);
}
;
@ -535,13 +515,11 @@ frame_item:
debug_item:
TOK_DBG_DEL ID
{
append_root_frame();
if (!dbg_delete(NULL, $2))
YYABORT;
}
| TOK_DBG_DEL ID '.' ID
{
append_root_frame();
if (!dbg_delete($2, $4))
YYABORT;
}
@ -562,13 +540,6 @@ debug_item:
}
| TOK_DBG_DUMP
{
/*
* It's okay to do append the root frame multiple
* times. If more frames are added afterwards, they
* just replace the root frame until it gets appended a
* final time when parsing ends.
*/
append_root_frame();
if (!dump(stdout)) {
perror("stdout");
exit(1);
@ -929,7 +900,7 @@ meas:
qbase:
ID
{
$$ = find_vec(root_frame, $1);
$$ = find_vec(frames, $1);
if (!$$) {
yyerrorf("unknown vector \"%s\"", $1);
YYABORT;

2
gui.c
View File

@ -393,7 +393,7 @@ int gui_main(void)
gui_setup_style(root->window);
init_canvas();
edit_nothing();
select_frame(root_frame);
select_frame(frames);
make_popups();
gtk_main();

View File

@ -114,13 +114,8 @@ static void popup_add_frame(void)
new = zalloc_type(struct frame);
new->name = unique("_");
new->next = parent;
new->prev = parent->prev;
if (parent->prev)
parent->prev->next = new;
else
frames = new;
parent->prev = new;
new->next = parent->next;
parent->next = new;
change_world();
}
@ -129,10 +124,10 @@ static void popup_del_frame(void)
{
struct frame *frame = popup_data;
assert(frame != root_frame);
assert(frame != frames);
delete_frame(frame);
if (active_frame == frame)
select_frame(root_frame);
select_frame(frames);
change_world();
}
@ -166,8 +161,8 @@ static gboolean can_add_frame(void)
{
const struct frame *frame;
for (frame = frames; frame; frame = frame->next)
if (frame->name && !strcmp(frame->name, "_"))
for (frame = frames->next; frame; frame = frame->next)
if (!strcmp(frame->name, "_"))
return FALSE;
return TRUE;
}
@ -206,7 +201,7 @@ static void pop_up_frame(struct frame *frame, GdkEventButton *event)
{
gtk_widget_set_sensitive(
gtk_item_factory_get_item(factory_frame, "/Delete frame"),
frame != root_frame);
frame != frames);
gtk_widget_set_sensitive(
gtk_item_factory_get_item(factory_frame, "/Add frame"),
@ -1638,8 +1633,8 @@ static int validate_frame_name(const char *s, void *ctx)
if (!is_id(s))
return 0;
for (f = frames; f; f = f->next)
if (f->name && !strcmp(f->name, s))
for (f = frames->next; f; f = f->next)
if (!strcmp(f->name, s))
return 0;
return 1;
}
@ -1818,7 +1813,7 @@ void build_frames(GtkWidget *vbox, int wrap_width)
gtk_table_attach_defaults(GTK_TABLE(tab), packages, 1, 2, 0, 1);
n = 0;
for (frame = root_frame; frame; frame = frame->prev) {
for (frame = frames; frame; frame = frame->next) {
label = build_frame_label(frame);
gtk_table_attach_defaults(GTK_TABLE(tab), label,
0, 1, n*2+1, n*2+2);
@ -1830,7 +1825,7 @@ void build_frames(GtkWidget *vbox, int wrap_width)
wrap_width -= max_name_width+FRAME_AREA_MISC_WIDTH;
n = 0;
for (frame = root_frame; frame; frame = frame->prev) {
for (frame = frames; frame; frame = frame->next) {
refs = build_frame_refs(frame);
gtk_table_attach_defaults(GTK_TABLE(tab), refs,
1, 2, n*2+1, n*2+2);
@ -1850,7 +1845,7 @@ void build_frames(GtkWidget *vbox, int wrap_width)
}
if (!show_vars) {
meas = build_meas(root_frame);
meas = build_meas(frames);
gtk_table_attach_defaults(GTK_TABLE(tab), meas,
1, 2, n*2+2, n*2+3);
}

View File

@ -650,7 +650,7 @@ void gui_draw_frame(struct inst *self)
gc = self->u.frame.active ? gc_active_frame : gc_frame[get_mode(self)];
draw_eye(gc, center, FRAME_EYE_R1, FRAME_EYE_R2);
if (!self->u.frame.ref->name)
if (self->u.frame.ref == frames)
return;
corner = translate(corner);
corner.x -= FRAME_CLEARANCE;

View File

@ -277,7 +277,7 @@ static int end_new_meas(struct inst *from, struct inst *to)
return 0;
/* it's safe to pass "from" here, but we may change it later */
obj = new_obj_unconnected(ot_meas, from);
connect_obj(root_frame, obj);
connect_obj(frames, obj);
meas = &obj->u.meas;
meas->label = NULL;
switch (mode) {

2
inst.c
View File

@ -82,7 +82,7 @@ static int show_this(const struct inst *inst)
if (inst->ops == &frame_ops && inst->u.frame.ref == active_frame)
return 1;
if (!inst->outer)
return active_frame == root_frame;
return active_frame == frames;
return inst->outer->u.frame.ref == active_frame;
}

2
meas.c
View File

@ -232,7 +232,7 @@ static int instantiate_meas_pkg(void)
struct coord a0, b0;
lt_op_type lt;
for (obj = root_frame->objs; obj; obj = obj->next) {
for (obj = frames->objs; obj; obj = obj->next) {
if (obj->type != ot_meas)
continue;
meas = &obj->u.meas;

7
obj.c
View File

@ -34,7 +34,6 @@
char *pkg_name = NULL;
struct frame *frames = NULL;
struct frame *root_frame = NULL;
struct frame *active_frame = NULL;
void *instantiation_error = NULL;
@ -255,7 +254,7 @@ static int generate_objs(struct frame *frame, struct coord base, int active)
goto error;
break;
case ot_meas:
assert(frame == root_frame);
assert(frame == frames);
offset = eval_unit_default(obj->u.meas.offset, frame,
DEFAULT_OFFSET);
if (is_undef(offset))
@ -278,7 +277,7 @@ static int generate_items(struct frame *frame, struct coord base, int active)
char *s;
int ok;
if (!frame->name) {
if (frame == frames) {
s = expand(pkg_name, frame);
inst_select_pkg(s);
free(s);
@ -471,7 +470,7 @@ int instantiate(void)
reset_found();
found = 0;
search_suspended = 0;
ok = generate_frame(root_frame, zero, NULL, NULL, 1);
ok = generate_frame(frames, zero, NULL, NULL, 1);
if (ok && (find_vec || find_obj) && found)
activate_found();
find_vec = NULL;

6
obj.h
View File

@ -156,7 +156,6 @@ struct frame {
struct vec *vecs;
struct obj *objs;
struct frame *next;
struct frame *prev; /* for the list of frames in the GUI */
/* used during generation */
const struct frame *curr_parent;
@ -236,9 +235,8 @@ struct obj {
};
extern char *pkg_name;
extern struct frame *frames;
extern struct frame *root_frame;
extern char *pkg_name; /* anonymous common package first */
extern struct frame *frames; /* root frame first */
extern struct frame *active_frame;
extern void *instantiation_error;