int getsuf __P((char as[]));
char *setsuf __P((char *as, int ch));
#ifdef XIFY
-int xify_include __P((char *in_name, char *prev_name));
+int xify_enqueue __P((char *in_name, char *prev_name));
int xify_file __P((char *in_name, struct timespec *in_mtime));
#endif
int callsys __P((char *f, char **v));
)
)
goto nogood;
- if (
- in_queue[in_queue_head].mkdir >= 0 &&
- mkdir(plist[in_queue[in_queue_head].mkdir] + 2, 0777) &&
- errno != EEXIST
- )
- goto nogood;
+ if (in_queue[in_queue_head].mkdir >= 0) {
+ if (debug)
+ fprintf(stderr, "mkdir %s\n", plist[in_queue[in_queue_head].mkdir] + 2);
+ if (mkdir(plist[in_queue[in_queue_head].mkdir] + 2, 0777) && errno != EEXIST)
+ goto nogood;
+ }
++in_queue_head;
}
}
) {
out_path[i + 5] = 0;
+ if (debug)
+ fprintf(stderr, "mkdir %s\n", out_path);
if (mkdir(out_path, 0777) == -1 && errno != EEXIST) {
error("can't mkdir: %s\n", out_path);
return 1;
}
err_line[i] = 0;
/*fprintf(stderr, "found dep: %s\n", err_line);*/
- if (xify_include(err_line + 1, err_line[0] == '"' ? in_name : 0))
+ if (xify_enqueue(err_line + 1, err_line[0] == '"' ? in_name : 0))
break;
}
else {
return 0;
}
-int xify_include(in_name, prev_name) char *in_name; char *prev_name; {
- int i, j;
+int xify_enqueue(in_name, prev_name) char *in_name; char *prev_name; {
+ int i, j, k;
struct stat statbuf;
+ for (i = strlen(in_name); i > 0 && in_name[i - 1] != '/'; --i)
+ ;
if (prev_name) {
- for (i = strlen(prev_name); i > 0 && prev_name[i - 1] != '/'; --i)
+ for (j = strlen(prev_name); j > 0 && prev_name[j - 1] != '/'; --j)
;
- bcopy(prev_name, in_path, i);
- strcpy(in_path + i, in_name);
+ bcopy(prev_name, in_path, j);
+ strcpy(in_path + j, in_name);
if (stat(in_path, &statbuf) == 0) {
- i = -1;
- goto found_relative;
+ j = -1; /* does not require extra mkdir */
+ goto found;
+ }
+
+ strcpy(in_path + j + i, ".xify/x_");
+ strcat(in_path + j + i, in_name + i);
+ if (debug)
+ fprintf(stderr, "unlink %s\n", in_path);
+ if (unlink(in_path)) {
+ if (errno != ENOENT)
+ goto cant_unlink;
+ }
+ else {
+ strcat(in_path, ".deps");
+ if (debug)
+ fprintf(stderr, "unlink %s\n", in_path);
+ if (unlink(in_path) && errno != ENOENT)
+ goto cant_unlink;
}
}
- for (i = 0; i < np; ++i)
- if (/*plist[i][0] == '-' &&*/ plist[i][1] == 'I') {
- j = strlen(plist[i] + 2) - 5; /* remove ".xify" */
- bcopy(plist[i] + 2, in_path, j);
- strcpy(in_path + j, in_name);
+ for (j = 0; j < np; ++j)
+ if (/*plist[j][0] == '-' &&*/ plist[j][1] == 'I') {
+ k = strlen(plist[j] + 2) - 5; /* remove ".xify" */
+ bcopy(plist[j] + 2, in_path, k);
+ strcpy(in_path + k, in_name);
if (stat(in_path, &statbuf) == 0)
- goto found_in_path;
+ goto found;
+
+ strcpy(in_path + k + i, ".xify/x_");
+ strcat(in_path + k + i, in_name + i);
+ if (debug)
+ fprintf(stderr, "unlink %s\n", in_path);
+ if (unlink(in_path)) {
+ if (errno != ENOENT)
+ goto cant_unlink;
+ }
+ else {
+ strcat(in_path, ".deps");
+ if (debug)
+ fprintf(stderr, "unlink %s\n", in_path);
+ if (unlink(in_path) && errno != ENOENT) {
+ cant_unlink:
+ error("can't unlink: %s\n", in_path);
+ return 1;
+ }
+ }
}
error("not found: %s\n", in_name);
return 1;
-found_in_path:
- /* see if it requires extra mkdir */
- for (; in_path[j]; ++j)
- if (in_path[j] == '/')
- goto found_relative;
-
- /* it does not require extra mkdir */
- i = -1;
-
-found_relative:
- for (j = 0; j < in_queue_tail; ++j)
- if (strcmp(in_queue[j].path, in_path) == 0)
+found:
+ for (k = 0; k < in_queue_tail; ++k)
+ if (strcmp(in_queue[k].path, in_path) == 0)
return 0;
if (in_queue_tail >= IN_QUEUE_SIZE) {
in_queue[in_queue_tail].path = savestr(in_path);
in_queue[in_queue_tail].mtime = statbuf.st_mtim;
- in_queue[in_queue_tail].mkdir = i;
+ in_queue[in_queue_tail].mkdir = i ? j : -1;
++in_queue_tail;
return 0;
}