deps.cc 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /********************************************************************** <BR>
  2. This file is part of Crack dot Com's free source code release of
  3. Golgotha. <a href="http://www.crack.com/golgotha_release"> <BR> for
  4. information about compiling & licensing issues visit this URL</a>
  5. <PRE> If that doesn't help, contact Jonathan Clark at
  6. golgotha_source@usa.net (Subject should have "GOLG" in it)
  7. ***********************************************************************/
  8. enum { MAX_SRC=10000 };
  9. name_table src_files;
  10. name_table src_deps[MAX_SRC];
  11. int find_src(char *filename)
  12. {
  13. for (int i=0; i<src_files.size(); i++)
  14. {
  15. if (strcmp(src_files[i],filename)==0)
  16. return i;
  17. }
  18. return -1;
  19. }
  20. name_table *get_deps(char *filename, name_table *includes)
  21. {
  22. int f=find_src(filename);
  23. if (f!=-1)
  24. return &src_deps[f];
  25. else
  26. {
  27. FILE *fp=fopen(filename,"rb");
  28. if (!fp)
  29. return 0;
  30. fseek(fp, 0, SEEK_END);
  31. int size=ftell(fp);
  32. fseek(fp, 0, SEEK_SET);
  33. char *mem=(char *)malloc(size+1);
  34. fread(mem, 1, size, fp);
  35. fclose(fp);
  36. mem[size]=0;
  37. int x = src_files.add(strdup(filename));
  38. src_deps[x].add(strdup(filename));
  39. char *p=mem, name2[100], *s;
  40. while (*p)
  41. {
  42. if (p[0]=='#' &&
  43. p[1]=='i' &&
  44. p[2]=='n' &&
  45. p[3]=='c' &&
  46. p[4]=='l' &&
  47. p[5]=='u' &&
  48. p[6]=='d' &&
  49. p[7]=='e' &&
  50. p[8]==' ')
  51. {
  52. p+=9;
  53. while (*p==' ') p++;
  54. if (*p=='"')
  55. {
  56. p++; s=p;
  57. while (*p && *p!='"')
  58. p++;
  59. if (*p)
  60. {
  61. *p=0;
  62. p++;
  63. }
  64. name_table *ret=get_deps(s, includes);
  65. for (int j=0; !ret && j<includes->size(); j++)
  66. {
  67. sprintf(name2,"%s/%s",(*includes)[j],s);
  68. ret=get_deps(name2, includes);
  69. }
  70. if (ret)
  71. {
  72. for (int i=0;i<ret->size(); i++)
  73. {
  74. int found=0;
  75. for (int j=0; j<src_deps[x].size(); j++)
  76. if (strcmp(src_deps[x][j],(*ret)[i])==0)
  77. found=1;
  78. if (!found)
  79. src_deps[x].add((*ret)[i]);
  80. }
  81. } else
  82. {
  83. // ignore files with a '~' because they are for name mangled 8.3 systems
  84. int t=0;
  85. for (char *q=s; *q; q++)
  86. if (*q=='~') t=1;
  87. if (!t)
  88. fprintf(stderr,"%s : couldn't find include %s\n",filename,s);
  89. }
  90. }
  91. }
  92. else p++;
  93. }
  94. free(mem);
  95. return src_deps+x;
  96. }
  97. }