1 /* sdcclib.c: sdcc librarian
2 Copyright (C) 2003, Jesus Calvino-Fraga jesusc(at)ece.ubc.ca
4 This program is free software; you can redistribute it and/or modify it
5 under the terms of the GNU General Public License as published by the
6 Free Software Foundation; either version 2, or (at your option) any
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
24 char ProgName[PATH_MAX];
25 char LibName[PATH_MAX];
26 char LibNameTmp[PATH_MAX];
27 char IndexName[PATH_MAX];
28 char RelName[PATH_MAX];
29 char AdbName[PATH_MAX];
36 #define OPT_DUMP_SYM 3
37 #define OPT_DUMP_MOD 4
40 #define EQ(A,B) !strcmp((A),(B))
41 #define NEQ(A,B) strcmp((A),(B))
44 FILE *lib, *newlib, *rel, *adb, *libindex;
45 char FLine[MAXLINE+1];
46 char ModName[MAXLINE+1];
49 void GetNameFromPath(char * path, char * name)
53 for(i=0; path[i]!=0; i++);
54 for(; (path[i]!='\\')&&(path[i]!='/')&&(i>=0); i--);
55 for(j=0, i++; (path[i]!='.')&&(path[i]!=0); i++, j++) name[j]=path[i];
59 void ChangeExtension(char * path, char * ext)
63 for(i=0; path[i]!=0; i++);
64 for(; (path[i]!='.')&&(path[i]!='\\')&&(path[i]!='/')&&(i>=0); i--);
72 printf("ERROR: Filename '%s' must have an extension\n", path);
77 void CleanLine(char * buff)
83 if((buff[j]=='\n')||(buff[j]=='\r')) buff[j]=0;
87 int set_options (char * opt)
90 int rvalue=0, unknown=0;
92 "Usage: %s [-options] library relfile\n\n"
93 "available options:\n"
94 "a - Adds relfile to library. If relfile exists, replaces it.\n"
95 "d - Deletes relfile from library.\n"
96 "e - Extracts relfile from library.\n"
97 "s - Dumps symbols of library.\n"
98 "m - Dumps modules of library.\n"
99 "v - Displays program version.\n"
109 printf("%s: SDCC librarian version %s\n", ProgName, version);
110 printf("by Jesus Calvino-Fraga\n\n");
111 if (unknown) printf("Unknown option: %c\n", opt[0]);
112 if (opt[0]=='v') exit(0);
113 printf(Help, ProgName);
135 void ProcLineOptions (int argc, char **argv)
140 /*Get the program name*/
141 GetNameFromPath(argv[0], ProgName);
143 for (j=1; j<argc; j++)
147 for(i=1; argv[j][i]!=0 ; i++)
148 if (set_options(&argv[j][i])) break;
156 strcpy(LibName, argv[j]);
161 strcpy(RelName, argv[j]);
171 if ( (cont_par!=2) && (action<OPT_DUMP_SYM) )
173 printf("Error: Too %s arguments.\n", cont_par<2?"few":"many");
174 set_options("h"); /*Show help and exit*/
176 else if ( (cont_par!=1) && (action>=OPT_DUMP_SYM) )
178 printf("Error: Too %s arguments.\n", cont_par<1?"few":"many");
179 set_options("h"); /*Show help and exit*/
186 long newlibpos, indexsize;
187 char symname[MAXLINE+1];
190 strcpy(LibNameTmp, LibName);
191 ChangeExtension(LibNameTmp, "__L");
193 strcpy(IndexName, LibName);
194 ChangeExtension(IndexName, "__I");
196 strcpy(AdbName, RelName);
197 ChangeExtension(AdbName, "adb");
199 lib=fopen(LibName, "r");
201 if(action==OPT_ADD_REL)
203 rel=fopen(RelName, "r");
206 printf("ERROR: Couldn't open file '%s'", RelName);
207 if(lib!=NULL) fclose(lib);
211 GetNameFromPath(RelName, ModName);
213 newlib=fopen(LibNameTmp, "w");
216 printf("ERROR: Couldn't create temporary file '%s'", LibNameTmp);
217 if(lib!=NULL) fclose(lib);
221 fprintf(newlib, "<FILES>\n\n");
223 libindex=fopen(IndexName, "w");
226 printf("ERROR: Couldn't create temporary file '%s'", IndexName);
227 if(lib!=NULL) fclose(lib);
233 if(lib!=NULL) while(!feof(lib))
236 fgets(FLine, MAXLINE, lib);
242 if(EQ(FLine, "<FILE>"))
245 fgets(FLine, MAXLINE, lib);
247 if(NEQ(FLine, ModName))
249 newlibpos=ftell(newlib);
250 fprintf(newlib, "<FILE>\n%s\n", FLine);
251 fprintf(libindex, "<MODULE>\n%s %ld\n", FLine, newlibpos);
257 fprintf(newlib, "%s\n", FLine);
258 if(EQ(FLine, "</FILE>"))
260 fprintf(newlib, "\n");
261 fprintf(libindex, "</MODULE>\n\n");
265 else if(EQ(FLine, "<REL>")) inrel=1;
266 else if(EQ(FLine, "</REL>")) inrel=0;
271 sscanf(FLine, "S %s %c", symname, &c);
272 if(c=='D') fprintf(libindex, "%s\n", symname);
279 if(action==OPT_ADD_REL)
281 newlibpos=ftell(newlib);
282 fprintf(newlib, "<FILE>\n%s\n<REL>\n", ModName);
283 fprintf(libindex, "<MODULE>\n%s %ld\n", ModName, newlibpos);
287 fgets(FLine, MAXLINE, rel);
291 fprintf(newlib, "%s\n", FLine);
295 sscanf(FLine, "S %s %c", symname, &c);
296 if(c=='D') fprintf(libindex, "%s\n", symname);
300 fprintf(libindex, "</MODULE>\n");
301 fprintf(newlib, "</REL>\n<ADB>\n");
303 adb=fopen(AdbName, "r");
309 fgets(FLine, MAXLINE, adb);
313 fprintf(newlib, "%s\n", FLine);
318 fprintf(newlib, "</ADB>\n</FILE>\n");
321 /*Put the temporary files together as a new library file*/
322 indexsize=ftell(libindex);
326 if(lib!=NULL) fclose(lib);
329 newlib=fopen(LibNameTmp, "r");
330 lib=fopen(LibName, "w");
331 libindex=fopen(IndexName, "r");
333 fprintf(lib, "<SDCCLIB>\n\n");
334 fprintf(lib, "<INDEX>\n");
336 indexsize+=ftell(lib)+12+14;
337 fprintf(lib, "%10ld\n", indexsize);
339 while(!feof(libindex))
342 fgets(FLine, MAXLINE, libindex);
343 fprintf(lib, "%s", FLine);
345 fprintf(lib, "\n</INDEX>\n\n");
350 fgets(FLine, MAXLINE, newlib);
351 fprintf(lib, "%s", FLine);
353 fprintf(lib, "\n</FILES>\n\n");
354 fprintf(lib, "</SDCCLIB>\n");
364 void ExtractRel(void)
366 strcpy(AdbName, RelName);
367 ChangeExtension(AdbName, "adb");
369 lib=fopen(LibName, "r");
372 printf("ERROR: Couldn't open file '%s'", LibName);
376 rel=fopen(RelName, "w");
379 printf("ERROR: Couldn't create file '%s'", RelName);
383 GetNameFromPath(RelName, ModName);
385 adb=fopen(AdbName, "w");
388 printf("ERROR: Couldn't create file '%s'", AdbName);
398 fgets(FLine, MAXLINE, lib);
404 if(EQ(FLine, "<FILE>"))
407 fgets(FLine, MAXLINE, lib);
409 if(EQ(FLine, ModName)) state=1;
413 if(EQ(FLine, "<REL>")) state=2;
416 if(EQ(FLine, "</REL>"))
419 fprintf(rel, "%s\n", FLine);
422 if(EQ(FLine, "<ADB>")) state=4;
425 if(EQ(FLine, "</ADB>"))
428 fprintf(adb, "%s\n", FLine);
438 void DumpSymbols(void)
440 lib=fopen(LibName, "r");
443 printf("ERROR: Couldn't open file '%s'", LibName);
451 fgets(FLine, MAXLINE, lib);
457 if(EQ(FLine, "<INDEX>")) state=1;
460 if(EQ(FLine, "<MODULE>"))
463 fgets(FLine, MAXLINE, lib);
464 sscanf(FLine, "%s", ModName);
465 if(action==OPT_DUMP_SYM)
467 printf("%s.rel:\n", ModName);
472 printf("%s.rel\n", ModName);
475 else if(EQ(FLine, "</INDEX>")) state=3;
478 if(EQ(FLine, "</MODULE>"))
483 else printf(" %s\n", FLine);
495 int main(int argc, char **argv)
497 ProcLineOptions (argc, argv);
517 return 0; //Success!!!