Index: trunk/src/gui_act.c =================================================================== --- trunk/src/gui_act.c (revision 12028) +++ trunk/src/gui_act.c (revision 12029) @@ -1478,7 +1478,7 @@ for(n = 0; n < argc; n++) { if (!explicit && (*argv[n] == '@')) { - pcb_layer_id_t lid = pcb_layer_by_name(argv[n]+1); + pcb_layer_id_t lid = pcb_layer_by_name(PCB->Data, argv[n]+1); if (lid < 0) { pcb_message(PCB_MSG_ERROR, "Can't find layer named %s\n", argv[n]+1); return 1; Index: trunk/src/layer.c =================================================================== --- trunk/src/layer.c (revision 12028) +++ trunk/src/layer.c (revision 12029) @@ -295,11 +295,11 @@ return used; } -pcb_layer_id_t pcb_layer_by_name(const char *name) +pcb_layer_id_t pcb_layer_by_name(pcb_data_t *data, const char *name) { pcb_layer_id_t n; - for (n = 0; n < PCB->Data->LayerN; n++) - if (strcmp(PCB->Data->Layer[n].name, name) == 0) + for (n = 0; n < data->LayerN; n++) + if (strcmp(data->Layer[n].name, name) == 0) return n; return -1; } Index: trunk/src/layer.h =================================================================== --- trunk/src/layer.h (revision 12028) +++ trunk/src/layer.h (revision 12029) @@ -179,8 +179,10 @@ /* Return the layer pointer (or NULL on invalid or virtual layers) for an id */ pcb_layer_t *pcb_get_layer(pcb_layer_id_t id); -/* Return the name of a layer (real or virtual) or NULL on error */ -const char *pcb_layer_name(pcb_layer_id_t id); +/* Return the name of a layer (real or virtual) or NULL on error + NOTE: layer names may not be unique; returns the first case sensitive hit; + slow linear search */ +pcb_layer_id_t pcb_layer_by_name(pcb_data_t *data, const char *name); /* Returns pcb_true if the given layer is empty (there are no objects on the layer) */ pcb_bool pcb_layer_is_empty_(pcb_board_t *pcb, pcb_layer_t *ly); @@ -221,9 +223,6 @@ int pcb_layer_list(pcb_layer_type_t mask, pcb_layer_id_t *res, int res_len); int pcb_layer_list_any(pcb_layer_type_t mask, pcb_layer_id_t *res, int res_len); -/* Slow linear search for a layer by name */ -pcb_layer_id_t pcb_layer_by_name(const char *name); - /**** layer creation (for load/import code) ****/ /* Reset layers to the bare minimum (double sided board) */ Index: trunk/src_plugins/import_dsn/dsn.c =================================================================== --- trunk/src_plugins/import_dsn/dsn.c (revision 12028) +++ trunk/src_plugins/import_dsn/dsn.c (revision 12029) @@ -65,7 +65,7 @@ return; } - lid = pcb_layer_by_name(slayer); + lid = pcb_layer_by_name(PCB->Data, slayer); if (lid < 0) { pcb_message(PCB_MSG_ERROR, "import_dsn: skipping polyline because layer name is invalid: %s\n", slayer); return; Index: trunk/src_plugins/io_hyp/parser.c =================================================================== --- trunk/src_plugins/io_hyp/parser.c (revision 12028) +++ trunk/src_plugins/io_hyp/parser.c (revision 12029) @@ -486,7 +486,7 @@ pcb_layer_t *outline_layer; /* get outline layer */ - outline_id = pcb_layer_by_name("outline"); + outline_id = pcb_layer_by_name(PCB->Data, "outline"); if (outline_id < 0) { pcb_message(PCB_MSG_ERROR, "no outline layer.\n"); return; @@ -914,7 +914,7 @@ layer_id = -1; if (lname != NULL) { /* we have a layer name. check whether layer already exists */ - layer_id = pcb_layer_by_name(lname); + layer_id = pcb_layer_by_name(PCB->Data, lname); if (layer_id >= 0) return layer_id; /* found. return existing layer. */ } @@ -922,7 +922,7 @@ /* no layer name given. find unused layer name in range 1..PCB_MAX_LAYER */ for (n = 1; n < PCB_MAX_LAYER; n++) { pcb_sprintf(new_layer_name, "%i", n); - if (pcb_layer_by_name(new_layer_name) < 0) { + if (pcb_layer_by_name(PCB->Data, new_layer_name) < 0) { lname = new_layer_name; break; } @@ -988,7 +988,7 @@ pcb_bool_t hyp_is_bottom_layer(char *layer_name) { - return ((layer_name != NULL) && (pcb_layer_flags(PCB, pcb_layer_by_name(layer_name)) & PCB_LYT_BOTTOM)); + return ((layer_name != NULL) && (pcb_layer_flags(PCB, pcb_layer_by_name(PCB->Data, layer_name)) & PCB_LYT_BOTTOM)); } /* @@ -1592,7 +1592,7 @@ { pcb_layer_id_t signal_layer_id; - if ((h->layer_name != NULL) && (pcb_layer_by_name(h->layer_name) >= 0)) + if ((h->layer_name != NULL) && (pcb_layer_by_name(PCB->Data, h->layer_name) >= 0)) pcb_message(PCB_MSG_WARNING, "duplicate SIGNAL layer name \"%s\"\n", h->layer_name); signal_layer_id = hyp_create_layer(h->layer_name); @@ -1631,7 +1631,7 @@ { pcb_layer_id_t plane_layer_id; - if ((h->layer_name != NULL) && (pcb_layer_by_name(h->layer_name) >= 0)) + if ((h->layer_name != NULL) && (pcb_layer_by_name(PCB->Data, h->layer_name) >= 0)) pcb_message(PCB_MSG_WARNING, "duplicate PLANE layer name \"%s\"\n", h->layer_name); plane_layer_id = hyp_create_layer(h->layer_name); Index: trunk/src_plugins/io_lihata/read.c =================================================================== --- trunk/src_plugins/io_lihata/read.c (revision 12028) +++ trunk/src_plugins/io_lihata/read.c (revision 12029) @@ -298,7 +298,7 @@ data set to the flag. Look up layer info and fill in thermal flags. This needs to be done in a separate pass at the end of parsing because vias may precede layers in the lihata input file. */ -static int post_thermal_assign(vtp0_t *pt) +static int post_thermal_assign(pcb_board_t *pcb, vtp0_t *pt) { int i; @@ -313,7 +313,7 @@ fh.Flags = *f; for(n = lht_dom_first(&it, thr); n != NULL; n = lht_dom_next(&it)) { if (n->type == LHT_TEXT) { - int layer = pcb_layer_by_name(n->name); + int layer = pcb_layer_by_name(pcb->Data, n->name); if (layer < 0) { pcb_message(PCB_MSG_ERROR, "#LHT10 Invalid layer name in thermal: '%s'\n", n->name); return -1; @@ -1341,7 +1341,7 @@ return -1; post_ids_assign(&post_ids); - if (post_thermal_assign(&post_thermal) != 0) + if (post_thermal_assign(pcb, &post_thermal) != 0) return -1; /* Run poly clipping at the end so we have all IDs and we can