/* Last edited on 2024-12-25 10:13:37 by stolfi */ #include #include #include #include int main(int argc, char **argv); int dir_is_local(char *h, char *a); int cmp_dirs(char *h, char *a, char *b); int fprintf(FILE *, const char *, ...); int _flsbuf(unsigned char, FILE*); int fclose(FILE *); int fflush(FILE *); int main(int argc, char *argv[]) { char *a; char *b; int which, ndirs; if (argc != 4) { fflush(stdout); fprintf(stderr, "argc = %d\n", argc); fprintf(stderr, "usage: merge-paths \n"); exit(1); } a = argv[2]; b = argv[3]; ndirs = 0; while ((*a != '\0') || (*b != '\0')) { if ((*a) == ':') a++; else if ((*b) == ':') b++; else { /* Insert ':' if needed: */ if ( ndirs != 0 ) { putchar(':'); } ndirs++; /* Decide which directory should come first: */ if ((*a) == '\0') { which = 1; } else if ((*b) == '\0') { which = 0; } else { which = cmp_dirs(argv[1], a, b); } /* Output and skip selected directory: */ if ( which == 0 ) { while (((*a) != '\0') && ((*a) != ':')) { putchar(*a); a++; } } else { while (((*b) != '\0') && ((*b) != ':')) { putchar(*b); b++; } } } } putchar('\n'); fclose(stdout); return (0); } int cmp_dirs(char *h, char *a, char *b) /* Returns 0 if directory "*a" should precede "*b" in the path, else 1. Assumes that directories that begin with "." or "h" must come first, else "a" must come first. */ { int a_local = dir_is_local(h, a); int b_local = dir_is_local(h, b); if ( a_local ) { return (0); } else if ( b_local ) { return (1); } else { return (0); } } int dir_is_local(char *h, char *a) /* Returns TRUE iff "*a" begins with ".", "~", or "*h" */ { if (((*a) == '\0') || ((*a) == ':')) { fflush(stdout); fprintf(stderr, "merge-paths: internal error\n"); exit(1); } else if (((*a) == '.') || ((*a) == '~')) { return (1); } else { while ((*h) != '\0') { if ((*a) != (*h)) return (0); else { a++; h++; } } return (1); } }