home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume27 / genmake / part01 / build.c next >
Encoding:
C/C++ Source or Header  |  1992-01-17  |  3.6 KB  |  164 lines

  1. /* build.c */
  2.  
  3. #include <stdio.h>
  4. #include <sys/types.h>
  5. #ifdef NODIRECT
  6. #include <dirent.h>
  7. #else
  8. #include <sys/dir.h>
  9. #endif
  10. #include "types.h"
  11.  
  12. DNODE     *add_dep_node();
  13. FNODE    *add_file_node();
  14.  
  15. /* goes through the current directory build the dep list for each file */
  16.  
  17. build_depends(make_list,opts,mname)
  18. DNODE        **make_list;
  19. OPTS        *opts;
  20. char        *mname;
  21. {
  22.     DIR        *dirp;
  23.     struct direct    *dp;
  24.     DNODE        *new;
  25.     int        is_dep;
  26.     char        ask[BUFSIZE];
  27.  
  28.     if ((dirp = opendir(".")) == NULL) {
  29.         fprintf(stderr,"build_depends(): can't open directory\n");
  30.         return(0);
  31.     }
  32.     /* for each file in the directory */
  33.     for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
  34.         /* is it a recognisable source file */
  35.         if (!valid_source_file(dp->d_name))
  36.             continue;
  37.         if ((new = add_dep_node(make_list,dp->d_name)) == NULL) {
  38.             closedir(dirp);
  39.             return(0);
  40.         }
  41.         /* a file depends on itself */
  42.         add_file_node(new,dp->d_name);
  43.         /* create the dependency list for the current file */
  44.         if ((is_dep = build_dep_list(new,opts)) == 0) {
  45.             closedir(dirp);
  46.             return(0);
  47.         }
  48.         if (opts->exhaustive == 1 && is_dep == 1 && strcmp(new->name,mname)) {
  49.             fprintf(stderr,"Warning:  no one else uses file %s\n",new->name);
  50.             if (opts->interactive) {
  51.                 printf("Include file in Makefile(Y/N)? ");
  52.                 gets(ask);
  53.                 if (ask[0] != 'Y' && ask[0] != 'y')
  54.                     new->use_it = 0;
  55.             }
  56.             else
  57.                 new->use_it = 0;
  58.         }
  59.     }
  60.     closedir(dirp);
  61.     return(1);
  62. }
  63.  
  64. build_dep_list(dnode,opts)
  65. DNODE        *dnode;
  66. OPTS        *opts;
  67. {
  68.     FILE        *fp;
  69.     int        count = 0;
  70.     int        cp = 0;
  71.     int        stype;
  72.     int        cont;
  73.     char        buf[BUFSIZE];
  74.     char        func_name[BUFSIZE];
  75.     int        aok;
  76.     int        is_dep = 0;
  77.     CPPN        **cpp_stack;
  78.     SYMENT        **symtab;
  79.  
  80.     stype = valid_source_file(dnode->name);    
  81.     if (opts->exhaustive == 0 && stype == CSOURCE)
  82.         return(1);
  83.     if ((fp = fopen(dnode->name,"r")) == NULL) {
  84.         fprintf(stderr,"build_dep_list: can't open %s\n",dnode->name);
  85.         return(0);
  86.     }
  87.     cpp_stack = (CPPN **)malloc(sizeof(CPPN *));
  88.     *cpp_stack = NULL;
  89.     symtab = (SYMENT **)malloc(sizeof(SYMENT *));
  90.     *symtab = NULL;
  91.     buf[0] = NULL;
  92.     func_name[0] = NULL;
  93.     /* forever */
  94.     for (;;) {
  95.         cont = 1;
  96.         switch (stype) {
  97.             /* get the next function definition */    
  98.             case CSOURCE:    cont = parse_file(fp,func_name,&count,buf,&cp,cpp_stack,symtab);
  99.                     break;
  100.             case YACCSOURCE:
  101.             case LEXSOURCE:    cont = 0;
  102.                     break;
  103.             default:    ;
  104.         }
  105.         /* if we are done with the file, stop */
  106.         if (!cont)
  107.             break;
  108.         /* add the dependencies */
  109.         if ((aok = depend_on_it(dnode,func_name)) == 0) {
  110.             cpp_rel(cpp_stack,symtab);
  111.             fclose(fp);
  112.             return(0);
  113.         }
  114.         if (aok == 2)
  115.             is_dep = 1;
  116.         if (stype == CHEADER || stype == YACCSOURCE || stype == LEXSOURCE)
  117.             break;
  118.     }
  119.     cpp_rel(cpp_stack,symtab);
  120.     fclose(fp);
  121.     return(is_dep+1);
  122. }
  123.  
  124. depend_on_it(dnode,func_name)
  125. DNODE        *dnode;
  126. char        *func_name;
  127. {
  128.     DIR        *dirp;
  129.     struct direct    *dp;
  130.     int        stype;
  131.     int        aok;
  132.     int        is_dep = 0;
  133.  
  134. #ifdef DEBUG
  135.     printf("depend_on_it():  dnode->name= '%s'\nfunc_name= '%s'\n",dnode->name,func_name);
  136. #endif
  137.     stype = valid_source_file(dnode->name);    
  138.     if ((dirp = opendir(".")) == NULL) {
  139.         fprintf(stderr,"depend_on_it():  Can't open directory\n");
  140.         return(0);
  141.     }
  142.     /* for each file in the directory */
  143.     for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
  144.         if (!valid_source_file(dp->d_name) || in_file_list(dnode,dp->d_name))
  145.             continue;
  146.         switch (stype) {
  147.             case CSOURCE:    aok = depends(dp->d_name,func_name);
  148.                     break;
  149.             case CHEADER:    aok = hdepends(dp->d_name,dnode->name);
  150.                     break;
  151.         }
  152.         /* if we found a dependency, add the current file to list */
  153.         if (aok) {
  154.             is_dep = 1;
  155.             if (add_file_node(dnode,dp->d_name) == NULL) {
  156.                 closedir(dirp);
  157.                 return(0);
  158.             }
  159.         }
  160.     }
  161.     closedir(dirp);
  162.     return(is_dep+1);
  163. }
  164.