srclist.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #include <lib9.h>
  2. #include <bio.h>
  3. #include <mach.h>
  4. int conly;
  5. int exists;
  6. enum {
  7. Maxroot = 10,
  8. };
  9. int nroot;
  10. char *root[Maxroot];
  11. int rootlen[Maxroot];
  12. void usage(void);
  13. void error(char *);
  14. void addroot(char *);
  15. void addroots(char *);
  16. void chomp(char *);
  17. extern char *mygetwd(char*, int);
  18. void
  19. main(int argc, char **argv)
  20. {
  21. char buf[1024], *cwd;
  22. cwd = mygetwd(buf, sizeof(buf));
  23. ARGBEGIN {
  24. case 'c':
  25. conly = 1;
  26. break;
  27. case 'e':
  28. exists = 1;
  29. break;
  30. case 'r':
  31. addroots(EARGF(usage()));
  32. break;
  33. default:
  34. usage();
  35. } ARGEND
  36. if(argc != 1)
  37. usage();
  38. if(cwd != nil)
  39. chdir(cwd);
  40. setbinmode();
  41. chomp(argv[0]);
  42. exits(0);
  43. }
  44. void
  45. addroot(char *x)
  46. {
  47. if(nroot >= Maxroot){
  48. fprint(2, "srclist: too many root directories\n");
  49. exits("usage");
  50. }
  51. root[nroot] = x;
  52. rootlen[nroot] = strlen(x);
  53. nroot++;
  54. }
  55. void
  56. addrootnt(char *r)
  57. {
  58. addroot(r);
  59. if(r[1] != ':')
  60. return; /* phew! */
  61. if(*r >= 'a' && *r <= 'z' || *r >= 'A' && *r <= 'Z')
  62. addroot(r+2);
  63. }
  64. void
  65. addroots(char *r)
  66. {
  67. char buf[1024], *r2;
  68. addrootnt(r);
  69. if(chdir(r) < 0)
  70. return;
  71. r2 = mygetwd(buf, sizeof(buf));
  72. if(r2 && strcmp(r2, r) != 0)
  73. addrootnt(r2);
  74. }
  75. void
  76. chomp(char *file)
  77. {
  78. int fd, i, j, len;
  79. Fhdr fhdr;
  80. Dir *td;
  81. char fname[1024];
  82. fd = open(file, OREAD);
  83. if(fd < 0)
  84. error("open");
  85. if(crackhdr(fd, &fhdr) == 0)
  86. error("crackhdr");
  87. if(syminit(fd, &fhdr) < 0)
  88. error("syminit");
  89. for(i = 0; i < 1000; i++)
  90. if(filesym(i, fname, sizeof(fname)-1)){
  91. cleanname(fname);
  92. if(conly){
  93. len = strlen(fname);
  94. if(len < 2 || strcmp(fname+len-2, ".c") != 0)
  95. continue;
  96. }
  97. if(exists){
  98. if((td = dirstat(fname)) == nil)
  99. continue;
  100. free(td);
  101. }
  102. if(nroot){
  103. for(j = 0; j < nroot; j++)
  104. if(strncmp(fname, root[j], rootlen[j]) == 0)
  105. break;
  106. if(j == nroot)
  107. continue;
  108. }
  109. print("%s\n", fname);
  110. }
  111. }
  112. void
  113. usage(void)
  114. {
  115. fprint(2, "usage: srclist [-ce] [-r root] <objfile>\n");
  116. exits("usage");
  117. }
  118. void
  119. error(char *s)
  120. {
  121. fprint(2, "srclist: %s: %r\n", s);
  122. exits(s);
  123. }