X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=support%2Flibrarian%2Fsdcclib.c;h=603146fdf7ed7f212d0b52c8524ee3051d7f6c1b;hb=24d55114962c87bdb732a380f525e5afcdb1c828;hp=70d1bda67935220c6c80b2e33f7be74a27509d76;hpb=8a5910e9d3a976d69cafe3506636a9d51c336f34;p=fw%2Fsdcc diff --git a/support/librarian/sdcclib.c b/support/librarian/sdcclib.c index 70d1bda6..603146fd 100644 --- a/support/librarian/sdcclib.c +++ b/support/librarian/sdcclib.c @@ -28,16 +28,20 @@ char ProgName[PATH_MAX]; char LibName[PATH_MAX]; char LibNameTmp[PATH_MAX]; char IndexName[PATH_MAX]; -char RelName[PATH_MAX]; char AdbName[PATH_MAX]; +char ListName[PATH_MAX]; -#define version "0.1" +char **RelName; +int NumRelFiles=0; + +#define version "1.1" #define OPT_ADD_REL 0 #define OPT_EXT_REL 1 #define OPT_DEL_REL 2 -#define OPT_DUMP_SYM 3 -#define OPT_DUMP_MOD 4 +#define OPT_ADD_LIST 3 +#define OPT_DUMP_SYM 4 +#define OPT_DUMP_MOD 5 #define MAXLINE 254 #define EQ(A,B) !strcmp((A),(B)) @@ -47,7 +51,6 @@ int action=0; FILE *lib, *newlib, *rel, *adb, *libindex; char FLine[MAXLINE+1]; char ModName[MAXLINE+1]; -int state=0; void GetNameFromPath(char * path, char * name) { @@ -91,15 +94,16 @@ int set_options (char * opt) { int rvalue=0, unknown=0; static char Help[] = - "Usage: %s [-options] library relfile\n\n" + "Usage: %s [-options] library relfile1 relfile2 relfile3 ...\n\n" "available options:\n" - "a - Adds relfile to library. If relfile exists, replaces it.\n" - "d - Deletes relfile from library.\n" - "e - Extracts relfile from library.\n" - "s - Dumps symbols of library.\n" - "m - Dumps modules of library.\n" - "v - Displays program version.\n" - "h - This help.\n"; + "a,r - Adds relfile(s) to library. If relfile exists, replaces it.\n" + "l - Adds relfile list to library.\n" + "d - Deletes relfile(s) from library.\n" + "e,x - Extracts relfile(s) from library.\n" + "s - Dumps symbols of library.\n" + "m - Dumps modules of library.\n" + "v - Displays program version.\n" + "h - This help.\n"; switch (opt[0]) { @@ -116,9 +120,14 @@ int set_options (char * opt) exit(1); break; case 'a': + case 'r': action=OPT_ADD_REL; break; + case 'l': + action=OPT_ADD_LIST; + break; case 'e': + case 'x': action=OPT_EXT_REL; break; case 'd': @@ -160,31 +169,64 @@ void ProcLineOptions (int argc, char **argv) case 1: cont_par++; - strcpy(RelName, argv[j]); + if(action==OPT_ADD_LIST) + strcpy(ListName, argv[j]); + else + { + NumRelFiles=1; + RelName = (char **) calloc (1, sizeof (char *)); + if(RelName==NULL) + { + printf("ERROR: Insuficient memory.\n"); + exit(2); + } + RelName[0]=(char *)malloc(PATH_MAX); + if(RelName[0]==NULL) + { + printf("ERROR: Insuficient memory.\n"); + exit(2); + } + strcpy(RelName[0], argv[j]); + } break; default: cont_par++; + NumRelFiles++; + RelName = (char **) realloc (RelName, NumRelFiles * sizeof (char *)); + if(RelName==NULL) + { + printf("ERROR: Insuficient memory.\n"); + exit(2); + } + RelName[NumRelFiles-1]=(char *)malloc(PATH_MAX); + if(RelName[NumRelFiles-1]==NULL) + { + printf("ERROR: Insuficient memory.\n"); + exit(2); + } + strcpy(RelName[NumRelFiles-1], argv[j]); break; } } } - if ( (cont_par!=2) && (action=OPT_DUMP_SYM) ) { - printf("Error: Too %s arguments.\n", cont_par<1?"few":"many"); + printf("ERROR: Too %s arguments.\n", cont_par<1?"few":"many"); set_options("h"); /*Show help and exit*/ } } -void AddRel(void) +void AddRel(char * RelName) { int inrel=0; + int state=0; long newlibpos, indexsize; char symname[MAXLINE+1]; char c; @@ -206,7 +248,7 @@ void AddRel(void) rel=fopen(RelName, "r"); if(rel==NULL) { - printf("ERROR: Couldn't open file '%s'", RelName); + printf("ERROR: Couldn't open file '%s'\n", RelName); if(lib!=NULL) fclose(lib); return; } @@ -216,7 +258,7 @@ void AddRel(void) newlib=fopen(LibNameTmp, "w"); if(newlib==NULL) { - printf("ERROR: Couldn't create temporary file '%s'", LibNameTmp); + printf("ERROR: Couldn't create temporary file '%s'\n", LibNameTmp); if(lib!=NULL) fclose(lib); fclose(rel); return; @@ -226,7 +268,7 @@ void AddRel(void) libindex=fopen(IndexName, "w"); if(libindex==NULL) { - printf("ERROR: Couldn't create temporary file '%s'", IndexName); + printf("ERROR: Couldn't create temporary file '%s'\n", IndexName); if(lib!=NULL) fclose(lib); fclose(newlib); fclose(rel); @@ -367,26 +409,28 @@ void AddRel(void) fclose(lib); fclose(libindex); - unlink(LibNameTmp); - unlink(IndexName); + remove(LibNameTmp); + remove(IndexName); } -void ExtractRel(void) +void ExtractRel(char * RelName) { + int state=0; + strcpy(AdbName, RelName); ChangeExtension(AdbName, "adb"); lib=fopen(LibName, "r"); if(lib==NULL) { - printf("ERROR: Couldn't open file '%s'", LibName); + printf("ERROR: Couldn't open file '%s'\n", LibName); return; } rel=fopen(RelName, "w"); if(rel==NULL) { - printf("ERROR: Couldn't create file '%s'", RelName); + printf("ERROR: Couldn't create file '%s'\n", RelName); fclose(lib); return; } @@ -395,7 +439,7 @@ void ExtractRel(void) adb=fopen(AdbName, "w"); if(adb==NULL) { - printf("ERROR: Couldn't create file '%s'", AdbName); + printf("ERROR: Couldn't create file '%s'\n", AdbName); fclose(lib); fclose(rel); return; @@ -447,13 +491,24 @@ void ExtractRel(void) void DumpSymbols(void) { + int state=0; + lib=fopen(LibName, "r"); if(lib==NULL) { - printf("ERROR: Couldn't open file '%s'", LibName); + printf("ERROR: Couldn't open file '%s'\n", LibName); return; } + FLine[0]=0; + fgets(FLine, MAXLINE, lib); + CleanLine(FLine); + if(NEQ(FLine, "")) + { + printf("ERROR: File '%s' was not created with '%s'\n", LibName, ProgName); + return; + } + while(!feof(lib)) { if(state==3) break; @@ -502,8 +557,90 @@ void DumpSymbols(void) fclose(lib); } +int fileexist(char * fname) +{ + FILE * fp; + + fp=fopen(fname, "r"); + if(fp==NULL) return 0; + fclose(fp); + return 1; +} + +void AddList(void) +{ + FILE * list; + char *cc; + char *as; + char CmdLine[1024]; + char SrcName[PATH_MAX]; + char RelName[PATH_MAX]; + + list=fopen(ListName, "r"); + if(list==NULL) + { + printf("ERROR: Couldn't open list file '%s'\n", ListName); + return; + } + + cc = getenv("SDCCLIB_CC"); + as = getenv("SDCCLIB_AS"); + + action=OPT_ADD_REL; + while(!feof(list)) + { + RelName[0]=0; + fgets(RelName, PATH_MAX, list); + CleanLine(RelName); + if(strlen(RelName)>0) //Skip empty lines + { + if((cc!=NULL)||(as!=NULL)) + { + strcpy(SrcName, RelName); + if(strchr(SrcName,'.')==NULL) + strcat(SrcName,".src"); + } + + if(cc!=NULL) + { + ChangeExtension(SrcName, "c"); + if(fileexist(SrcName)) + { + sprintf(CmdLine, "%s %s", cc, SrcName); + printf("%s\n", CmdLine); + system(CmdLine); + } + } + else if(as!=NULL) + { + ChangeExtension(SrcName, "asm"); + if(fileexist(SrcName)) + { + sprintf(CmdLine, "%s %s", as, SrcName); + printf("%s\n", CmdLine); + system(CmdLine); + } + } + + if(strchr(RelName,'.')==NULL) + { + //Try adding the default sdcc extensions + strcat(RelName,".o"); + if(!fileexist(RelName)) + ChangeExtension(RelName, "rel"); + } + + printf("Adding: %s\n", RelName); + AddRel(RelName); + } + } + action=OPT_ADD_LIST; + fclose(list); +} + int main(int argc, char **argv) { + int j; ProcLineOptions (argc, argv); switch(action) @@ -512,11 +649,21 @@ int main(int argc, char **argv) action=OPT_ADD_REL; case OPT_ADD_REL: case OPT_DEL_REL: - AddRel(); + for(j=0; j