X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=support%2Flibrarian%2Fsdcclib.c;h=b6760c6d5c96554e49192ca09731d3f24674e000;hb=d7b30120ae115e8929d57e25038ca76dde13974e;hp=913b1f03898609be2b2e6b0a9bb8c294fa543674;hpb=d2d27270cceb98099b7fef26231aef40d9f6156e;p=fw%2Fsdcc diff --git a/support/librarian/sdcclib.c b/support/librarian/sdcclib.c index 913b1f03..b6760c6d 100644 --- a/support/librarian/sdcclib.c +++ b/support/librarian/sdcclib.c @@ -30,14 +30,16 @@ char LibNameTmp[PATH_MAX]; char IndexName[PATH_MAX]; char RelName[PATH_MAX]; char AdbName[PATH_MAX]; +char ListName[PATH_MAX]; -#define version "0.1" +#define version "1.0" #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)) @@ -94,6 +96,7 @@ int set_options (char * opt) "Usage: %s [-options] library relfile\n\n" "available options:\n" "a - Adds relfile to library. If relfile exists, replaces it.\n" + "l - Adds relfile list to library.\n" "d - Deletes relfile from library.\n" "e - Extracts relfile from library.\n" "s - Dumps symbols of library.\n" @@ -118,6 +121,9 @@ int set_options (char * opt) case 'a': action=OPT_ADD_REL; break; + case 'l': + action=OPT_ADD_LIST; + break; case 'e': action=OPT_EXT_REL; break; @@ -160,7 +166,10 @@ void ProcLineOptions (int argc, char **argv) case 1: cont_par++; - strcpy(RelName, argv[j]); + if(action==OPT_ADD_LIST) + strcpy(ListName, argv[j]); + else + strcpy(RelName, argv[j]); break; default: @@ -172,12 +181,12 @@ void ProcLineOptions (int argc, char **argv) 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*/ } } @@ -206,7 +215,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 +225,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 +235,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,8 +376,8 @@ void AddRel(void) fclose(lib); fclose(libindex); - _unlink(LibNameTmp); - _unlink(IndexName); + remove(LibNameTmp); + remove(IndexName); } void ExtractRel(void) @@ -379,14 +388,14 @@ void ExtractRel(void) 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 +404,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; @@ -450,10 +459,19 @@ void DumpSymbols(void) 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,6 +520,86 @@ 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]; + + 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(); + } + } + action=OPT_ADD_LIST; + fclose(list); +} + int main(int argc, char **argv) { ProcLineOptions (argc, argv); @@ -515,6 +613,10 @@ int main(int argc, char **argv) AddRel(); break; + case OPT_ADD_LIST: + AddList(); + break; + case OPT_EXT_REL: ExtractRel(); break;