mirror of
https://github.com/eddyem/eddys_snippets.git
synced 2025-12-06 10:45:12 +03:00
116 lines
3.1 KiB
C
116 lines
3.1 KiB
C
/*
|
|
* copy_pcb.c - copy kicad PCBs
|
|
*
|
|
* Copyright 2014 Edward V. Emelianov <eddy@sao.ru, edward.emelianoff@gmail.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
* MA 02110-1301, USA.
|
|
*/
|
|
|
|
#include "copy_pcb.h"
|
|
|
|
char **List;
|
|
|
|
/**
|
|
* Printout string from ptr0 (including) to ptr1 (excluding) and return ptr1
|
|
*/
|
|
char *printdata(char *ptr0, char *ptr1){
|
|
char *ptr = ptr0;
|
|
while(ptr < ptr1) printf("%c", *ptr++);
|
|
return ptr1;
|
|
}
|
|
|
|
int build_list(){
|
|
char *tok;
|
|
int L, i;
|
|
tok = G.list;
|
|
for(L = 0; strchr(tok, ','); L++, tok++);
|
|
DBG("found: %d commas\n", L);
|
|
if(G.nparts > 0 && G.nparts < L) L = G.nparts;
|
|
List = MALLOC(char*, L);
|
|
tok = strtok(G.list, ",");
|
|
if(!tok) return 0;
|
|
i = 0;
|
|
do{
|
|
List[i++] = strdup(tok);
|
|
}while((tok = strtok(NULL, ",")) && i < L);
|
|
return i;
|
|
}
|
|
|
|
int main(int argc, char **argv){
|
|
int i, j, L;
|
|
mmapbuf *input;
|
|
initial_setup();
|
|
parce_args(argc, argv);
|
|
if(!G.ifile){
|
|
ERRX("You shold give input file name\n");
|
|
return(-1);
|
|
}
|
|
if(G.format) DBG("Format: %s\n", G.format);
|
|
else{
|
|
DBG("No format defined, use \"%%s.%%d\"\n");
|
|
G.format = "%s.%d";
|
|
}
|
|
if(G.nparts) DBG("Use first %d copies of list\n", G.nparts);
|
|
else DBG("Use all list given\n");
|
|
if(!G.list){
|
|
WARNX("Error! You should say\n\t\t%s -L list\n", __progname);
|
|
ERR("\twhere \"list\" is a comma-separated list of sheets\n");
|
|
return(-1);
|
|
}
|
|
L = build_list();
|
|
DBG("Found %d sheets in list:\n", L);
|
|
if(L == 0){
|
|
ERRX("Error: empty list\n");
|
|
return(-1);
|
|
}
|
|
for(i = 0; i < L; i++) DBG("\titem %d: %s\n", i, List[i]);
|
|
if(!(input = My_mmap(G.ifile))){
|
|
ERRX("A strange error: can't mmap input file\n");
|
|
return(-1);
|
|
}
|
|
char *iptr = input->data, *oldptr = iptr;
|
|
|
|
i = 0;
|
|
char comp[32], val[32];
|
|
int N1, N2;
|
|
while((iptr = strstr(iptr, "$Comp\n"))){
|
|
DBG("%dth component: ", ++i);
|
|
iptr = strstr(iptr, "\nL ");
|
|
if(!iptr) break; iptr += 3;
|
|
if(sscanf(iptr, "%s %s\n", comp, val) != 2) continue;
|
|
DBG("component %s with label %s\n", comp, val);
|
|
iptr = strstr(iptr, "\nU ");
|
|
if(!iptr) break; iptr += 3;
|
|
if(sscanf(iptr, "%d %d %s\n",&N1,&N2,comp) != 3) continue;
|
|
DBG("N1 = %d; N2 = %d; comp label: %s\n",N1,N2,comp);
|
|
iptr = strstr(iptr, "\nF"); // go to line "F 0"
|
|
if(!iptr) break; iptr++;
|
|
// printout all what was before:
|
|
oldptr = printdata(oldptr, iptr);
|
|
for(j = 0; j < L; j++){
|
|
printf("AR Path=\"/%s/%s\" Ref=\"", List[j], comp);
|
|
printf(G.format, val, j+1);
|
|
printf("\" Part=\"1\"\n");
|
|
}
|
|
}
|
|
// printout the rest of file
|
|
if(!iptr) iptr = input->data + input->len;
|
|
printdata(oldptr, iptr);
|
|
My_munmap(input);
|
|
return 0;
|
|
}
|
|
|