1
0
mirror of git://projects.qi-hardware.com/fped.git synced 2024-09-30 15:09:47 +03:00

inst.c: zero-sized pads and holes now cause instantiation to fail

Before, they were silently ignored but still included in output.
This produced invalid Postscript (attempts to fit the pad name into
the zero-sized pad failed) and may also have produced artefacts
that could confuse KiCad.
This commit is contained in:
Werner Almesberger 2012-07-12 16:21:59 -03:00
parent 59b90b3054
commit e2ce0eecf7

24
inst.c
View File

@ -16,6 +16,7 @@
#include <math.h> #include <math.h>
#include "util.h" #include "util.h"
#include "error.h"
#include "coord.h" #include "coord.h"
#include "expr.h" #include "expr.h"
#include "layer.h" #include "layer.h"
@ -592,6 +593,25 @@ static void grow_bbox_by_width(struct bbox *bbox, unit_type width)
} }
static int zero_sized(struct coord a, struct coord b, const char *fmt,
const char *arg)
{
if (a.x == b.x && a.y == b.y) {
fail(fmt, "zero-sized", arg);
return 1;
}
if (a.x == b.x) {
fail(fmt, "zero-width", arg);
return 1;
}
if (a.y == b.y) {
fail(fmt, "zero-height", arg);
return 1;
}
return 0;
}
static struct inst *add_inst(const struct inst_ops *ops, enum inst_prio prio, static struct inst *add_inst(const struct inst_ops *ops, enum inst_prio prio,
struct coord base) struct coord base)
{ {
@ -896,6 +916,8 @@ int inst_pad(struct obj *obj, const char *name, struct coord a, struct coord b)
{ {
struct inst *inst; struct inst *inst;
if (zero_sized(a, b, "%s pad \"%s\"", name))
return 0;
inst = add_inst(obj->u.pad.rounded ? &rpad_ops : &pad_ops, inst = add_inst(obj->u.pad.rounded ? &rpad_ops : &pad_ops,
obj->u.pad.type == pt_normal || obj->u.pad.type == pt_bare || obj->u.pad.type == pt_normal || obj->u.pad.type == pt_bare ||
obj->u.pad.type == pt_trace ? obj->u.pad.type == pt_trace ?
@ -932,6 +954,8 @@ int inst_hole(struct obj *obj, struct coord a, struct coord b)
{ {
struct inst *inst; struct inst *inst;
if (zero_sized(a, b, "%s hole", NULL))
return 0;
inst = add_inst(&hole_ops, ip_hole, a); inst = add_inst(&hole_ops, ip_hole, a);
inst->obj = obj; inst->obj = obj;
inst->u.hole.other = b; inst->u.hole.other = b;