41 #define BUFSIZE 1000000 
   55   char **targv=0,**ptr,**phelp;
 
   59   actualdir=opendir(directory);
 
   61   if(!actualdir) 
return targv;
 
   64   for(entry=readdir(actualdir);entry!=NULL;entry=readdir(actualdir))
 
   67       if(strcmp(entry->d_name,
".")==0 ||
 
   68      strcmp(entry->d_name,
"..")==0) 
continue;
 
   70       if(buffer) 
free(buffer);
 
   71       buffer=(
char*) 
malloc((strlen(directory)+
 
   72                  strlen(entry->d_name)+2)*
sizeof(char));
 
   73       strcpy(buffer,directory);
 
   74       strncat(buffer,
"/",1);
 
   75       strncat(buffer,entry->d_name,strlen(entry->d_name));
 
   76       s=stat(buffer,&status);
 
   79       if(S_ISDIR(status.st_mode))
 
   87           targv=(
char**) 
malloc((*argc+targc)*
sizeof(
char*));
 
   88           memcpy(targv,phelp,*argc*
sizeof(
char*));
 
   89           memcpy(&targv[*argc],ptr,targc*
sizeof(
char*));
 
   95       else if(S_ISREG(status.st_mode))
 
   98           len=strlen(entry->d_name);
 
   99           if(entry->d_name[len-2]==
'.' && entry->d_name[len-1]==
'd')
 
  102           targv=(
char**) 
malloc((*argc+1)*
sizeof(
char*));
 
  103           memcpy(targv,phelp,*argc*
sizeof(
char*));
 
  104           targv[*argc]=strdup(buffer);
 
  114          "  No status - perhaps file %s does not exist.\n",
 
  120   if(buffer) 
free(buffer);
 
  127 int main (
int argc, 
char** argv) {
 
  130   char *ptr,*
p,**
pp,**pp1,**pp2,*directory=0,*libpath=0;
 
  133   int i,optl=0,optm=0,swapping,
c,rargc;
 
  136 #if defined ( _WIN32 ) || defined ( __CYGWIN__ ) || defined ( __CYGWIN32__ ) 
  137   char *ntg4tmp=0,*ntg4tmp1=0;
 
  147       struct libmap_ *next;
 
  150   struct libmap_ *libmap=0,*libmapPtr=0,*libmapPtr1=0,*libmapPtr2=0,
 
  151     *prevPtr1,*prevPtr2,*tmpp,*userLibmapPtr;
 
  153   while((c=getopt(argc,argv,
"ld: m:"))!=EOF)
 
  193          "  ERROR: If you specify a directory don't also specify files\n");
 
  198   if(optl)fprintf(stderr,
"  Reading library name map file...\n");
 
  203       if(feof(stdin)) 
break;
 
  204       if (strlen(buffer) >= 
BUFSIZE-1)
 
  207        " Internal ERROR: BUFSIZE too small to read library name map file\n");
 
  211       if ( buffer[strlen(buffer)-1] == 
'\n') 
 
  212         {   buffer[strlen(buffer)-1]=
'\0'; }  
 
  214       ptr=strtok(buffer,
":\n");
 
  217       for(libmapPtr1=libmap;libmapPtr1;libmapPtr1=libmapPtr1->next)
 
  219       if(strcmp(libmapPtr1->lib,ptr)==0)
 
  221           fprintf(stderr,
"  ERROR: Duplicate library name: %s\n",ptr);
 
  223               "  Perhaps a duplicate subdirectory with" 
  224               " a GNUmakefile with the same library name.\n" 
  232       libmapPtr->next=(
struct libmap_*) 
malloc(
sizeof(
struct libmap_));
 
  233       libmapPtr=libmapPtr->next;
 
  237       libmap=(
struct libmap_*) 
malloc(
sizeof(
struct libmap_));
 
  241       libmapPtr->lib=strdup(ptr);
 
  251           ptr=strtok(NULL,
" \n");
 
  256           ptr=strtok(NULL,
" \n");
 
  265       if (strlen(buffer) >= 
BUFSIZE-1)
 
  268            " Internal ERROR: BUFSIZE too small to read directory name\n");
 
  272           if ( buffer[strlen(buffer)-1] == 
'\n') 
 
  273              {   buffer[strlen(buffer)-1]=
'\0'; }  
 
  275           ptr=strtok(buffer,
"/");
 
  278           fprintf(stderr,
"  ERROR: \"/\" before \"source\" expected.\n");
 
  281           while(ptr&&strcmp (ptr,
"source"))ptr=strtok(NULL,
"/");
 
  282           ptr=strtok(NULL,
"/");
 
  285           fprintf(stderr,
"  ERROR: \"source\" expected.\n");
 
  291             fprintf(stderr,
"  ERROR: String overflow for: %s\n", ptr);
 
  294           strcpy(libmapPtr->trigger,ptr);
 
  295           ptr=strtok(NULL,
"/");
 
  296           while(ptr&&strcmp(ptr,
"GNUmakefile"))
 
  298           strncat(libmapPtr->trigger,
"/",1);
 
  299           strncat(libmapPtr->trigger,ptr,strlen(ptr));
 
  300           ptr=strtok(NULL,
"/");
 
  306              "  ERROR: \"source/<unique-sub-path>/GNUmakefile\" expected.\n");
 
  312   if(optl)fprintf(stderr,
"  Reading dependency files...\n");
 
  314 #if defined ( _WIN32 ) || defined ( __CYGWIN__ ) || defined ( __CYGWIN32__ ) 
  315       ntg4tmp=getenv(
"G4TMP");
 
  318            fprintf(stderr,
"  ERROR: Cannot find environment variable G4TMP\n");
 
  321       ntg4tmp1=strdup(ntg4tmp);
 
  326       fp=fopen(rargv[i],
"r");
 
  329 #if defined ( _WIN32 ) || defined ( __CYGWIN__ ) || defined ( __CYGWIN32__ ) 
  330       ptr=strchr(ntg4tmp1,
':');
 
  332       while ( ptr=strchr(buffer,
'\\') ) *ptr=
'/';
 
  334       while (ntg4tmp1!=NULL &&  (ptr=strstr(buffer,ntg4tmp1))!=NULL )
 
  336           for(nti=0;nti<strlen(ntg4tmp1);nti++) ptr[nti]=
' ';
 
  341       ptr=strtok(buffer,
":");
 
  344       for(libmapPtr=libmap;libmapPtr;libmapPtr=libmapPtr->next)
 
  346       if(strlen(libmapPtr->lib)>256)
 
  348             fprintf(stderr,
"  ERROR: String overflow for: %s\n", libmapPtr->lib);
 
  351           strcpy(workbuf,libmapPtr->lib);
 
  353       strncat(workbuf,
"/",1);
 
  354       if(strstr(ptr,workbuf)) 
break;
 
  358       userLibmapPtr=libmapPtr;
 
  368       bufferPtr=strtok(NULL,
"\n");  
 
  371           fprintf(stderr,
"  WARNING: It seems there is nothing after \':\' in dependency file %s.\n", rargv[i]);
 
  376           for(libmapPtr=libmap;libmapPtr;libmapPtr=libmapPtr->next)
 
  379               if(strlen(libmapPtr->trigger)>256)
 
  381                     fprintf(stderr,
"  ERROR: String overflow for: %s\n", libmapPtr->trigger);
 
  384                   strcpy(workbuf,libmapPtr->trigger);
 
  385           strncat(workbuf,
"/include",8);
 
  386           ptr=strstr(bufferPtr,workbuf);
 
  387           if(ptr && (userLibmapPtr != libmapPtr))
 
  392               for(pp=userLibmapPtr->uses;*pp;pp++)
 
  394                   if(strcmp(*pp,libmapPtr->lib)==0)
break;
 
  396               if(!*pp)*pp=libmapPtr->lib;
 
  405               if(strlen(libmapPtr->lib)>256)
 
  407                     fprintf(stderr,
"  ERROR: String overflow for: %s\n", libmapPtr->lib);
 
  410           strcpy(workbuf,libmapPtr->lib);
 
  411           strncat(workbuf,
"/",1);
 
  412           ptr=strstr(bufferPtr,workbuf);
 
  413           if(ptr && (userLibmapPtr != libmapPtr))
 
  418               for(pp=userLibmapPtr->uses;*pp;pp++)
 
  420                   if(strcmp(*pp,libmapPtr->lib)==0)
break;
 
  422               if(!*pp)*pp=libmapPtr->lib;
 
  429 #if defined ( _WIN32 ) || defined ( __CYGWIN__ ) || defined ( __CYGWIN32__ ) 
  430           while ( ptr=strchr(buffer,
'\\') ) *ptr=
'/';
 
  432           while (ntg4tmp1 &&  (ptr=strstr(buffer,ntg4tmp1)) )
 
  434           for(nti=0;nti<strlen(ntg4tmp1);nti++) ptr[nti]=
' ';
 
  444 #if defined ( _WIN32 ) || defined ( __CYGWIN__ ) || defined ( __CYGWIN32__ ) 
  451       fprintf(stderr,
"  Checking for circular dependencies...\n");
 
  452       for(libmapPtr=libmap;libmapPtr;libmapPtr=libmapPtr->next)
 
  454       for(pp=libmapPtr->uses;*pp;pp++)
 
  456           for(libmapPtr1=libmap;libmapPtr1!=libmapPtr;
 
  457           libmapPtr1=libmapPtr1->next)
 
  459           if(strcmp(libmapPtr1->lib,*pp)==0)
 
  461               for(pp1=libmapPtr1->uses;*pp1;pp1++)
 
  463               if(strcmp(*pp1,libmapPtr->lib)==0)
break;
 
  469                  "  WARNING: %s and %s use each other.\n",
 
  501       fprintf(stderr,
"  Reordering according to dependencies...\n");
 
  506       for(libmapPtr=libmap;libmapPtr;libmapPtr=libmapPtr->next)
 
  508           for(pp=libmapPtr->uses;*pp;pp++)
 
  511           for(libmapPtr1=libmap;libmapPtr1!=libmapPtr;
 
  512               libmapPtr1=libmapPtr1->next)
 
  514               if(strcmp(libmapPtr1->lib,*pp)==0)
 
  517               for(pp1=libmapPtr1->uses;*pp1;pp1++)
 
  519                   if(strcmp(*pp1,libmapPtr->lib)==0)
break;
 
  527                   prevPtr1->next=libmapPtr;
 
  536                   tmpp=libmapPtr->next;
 
  537                   if(libmapPtr1->next==libmapPtr)
 
  539                   libmapPtr->next=libmapPtr1;
 
  543                   libmapPtr->next=libmapPtr1->next;
 
  547                   if(libmapPtr1->next!=libmapPtr)
 
  549                   prevPtr2->next=libmapPtr1;
 
  552                   libmapPtr1->next=tmpp;
 
  565       fprintf(stderr,
"  Writing new library map file...\n");
 
  566       for(libmapPtr=libmap;libmapPtr;libmapPtr=libmapPtr->next)
 
  568       printf(
"%s:",libmapPtr->lib);
 
  569       for(pp=libmapPtr->uses;*pp;pp++)
 
  574       printf(
"source/%s/GNUmakefile\n",libmapPtr->trigger);
 
  580       int libname_usable_size=24;
 
  581       if ( ! libname ) libname=
malloc(libname_usable_size+16);
 
  584       for(libmapPtr=libmap;libmapPtr;libmapPtr=libmapPtr->next)
 
  586     if ( strlen(libpath)+strlen(libmapPtr->lib) > libname_usable_size ) {
 
  587       libname_usable_size=(strlen(libpath)+strlen(libmapPtr->lib))*2;
 
  589       libname=
malloc(libname_usable_size+16);
 
  594     sprintf(libname, 
"%s/lib%s.a", libpath, libmapPtr->lib);
 
  595         if (access(libname,R_OK))
 
  597       sprintf(libname, 
"%s/lib%s.so", libpath, libmapPtr->lib);
 
  598           if (!access(libname,R_OK))
 
  600             printf(
"-l%s ",libmapPtr->lib);
 
  604         sprintf(libname, 
"%s/lib%s.dylib", libpath, libmapPtr->lib);
 
  605             if (!access(libname,R_OK))
 
  607               printf(
"-l%s ",libmapPtr->lib);
 
  613           printf(
"-l%s ",libmapPtr->lib);
 
  615     libmapPtr=libmapPtr->next;
 
  621       for(libmapPtr=libmap;libmapPtr;libmapPtr=libmapPtr->next)
 
  625           for(pp=libmapPtr->uses;*pp;pp++)
 
  627           for(libmapPtr1=libmap;libmapPtr1;libmapPtr1=libmapPtr1->next)
 
  629               if(strcmp(libmapPtr1->lib,*pp)==0)
 
  639       for(libmapPtr=libmap;libmapPtr;libmapPtr=libmapPtr->next)
 
  643           printf(
"-l%s ",libmapPtr->lib);
 
void * calloc(size_t __nmemb, size_t __size)
 
int main(int argc, char **argv)
 
printf("%d Experimental points found\n", nlines)
 
char ** parsedir(char *directory, int *argc)
 
void * malloc(size_t __size)