Index: vendor.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/vendor.c,v retrieving revision 1.20 diff -p -U2 -r1.20 vendor.c --- vendor.c 10 Feb 2007 16:57:32 -0000 1.20 +++ vendor.c 10 Feb 2007 17:14:15 -0000 @@ -76,4 +76,7 @@ static int *vendor_drills = NULL; static int n_vendor_drills = 0; +static int cached_drill = -1; +static int cached_map = -1; + /* lists of elements to ignore */ static char **ignore_refdes = NULL; @@ -228,4 +231,5 @@ int ActionUnloadVendor (int argc, char **argv, int x, int y) { + cached_drill = -1; /* Unload any vendor table we may have had */ @@ -271,4 +275,6 @@ ActionLoadVendorFrom (int argc, char **a int type; + cached_drill = -1; + fname = argc ? argv[0] : 0; @@ -601,14 +607,24 @@ int vendorDrillMap (int in) { - int i; + int i, min, max; + + if (in == cached_drill) + return cached_map; + cached_drill = in; /* skip the mapping if we don't have a vendor drill table */ if ((n_vendor_drills == 0) || (vendor_drills == NULL) || (vendorMapEnable == False)) - return in; + { + cached_map = in; + return in; + } /* are we smaller than the smallest drill? */ if (in <= vendor_drills[0]) - return vendor_drills[0]; + { + cached_map = vendor_drills[0]; + return vendor_drills[0]; + } /* are we larger than the largest drill? */ @@ -618,11 +634,20 @@ vendorDrillMap (int in) "Using %6.2f mil instead.\n"), 0.01 * in, 0.01 * vendor_drills[n_vendor_drills - 1]); + cached_map = vendor_drills[n_vendor_drills - 1]; return vendor_drills[n_vendor_drills - 1]; } /* figure out which 2 drills are closest in size */ - i = 0; - while (in > vendor_drills[i]) - i++; + min = 0; + max = n_vendor_drills - 1; + while (max - min > 1) + { + i = (max+min) / 2; + if (in > vendor_drills[i]) + min = i; + else + max = i; + } + i = max; /* now round per the rounding mode */ @@ -631,11 +656,18 @@ vendorDrillMap (int in) /* find the closest drill size */ if ((in - vendor_drills[i - 1]) > (vendor_drills[i] - in)) - return vendor_drills[i]; + { + cached_map = vendor_drills[i]; + return vendor_drills[i]; + } else - return vendor_drills[i - 1]; + { + cached_map = vendor_drills[i - 1]; + return vendor_drills[i - 1]; + } } else { /* always round up */ + cached_map = vendor_drills[i]; return vendor_drills[i]; }