> -----Original Message----- > From: Joey Ye [mailto:joey.ye...@gmail.com] > Sent: Friday, October 18, 2013 6:37 AM > > I do encourage you to upstream this patch, though I'm not the maintainer of > libiberty to approve it.
OK. Thank you. Here it is. Could you push it to appropriate people? Attaching test for it also. To do tests: - copy patched filename_cmp.c and filenames.h to new dir - touch safe-ctype.h - create hashtab.h with typedef int size_t; typedef int hashval_t; #define TOLOWER(c) (c) This is enough for me to test it on cygwin32. It may be that other platforms will require another fake includes. - gcc -O2 filename_cmp.c main.c -o test1 Best regards Vladimir
gcc-4.8.1-filename-normalize-2.patch
Description: gcc-4.8.1-filename-normalize-2.patch
#include "filenames.h" char *tests[] = { "test", /* 0 */ "test", "./test", /* 1 */ "./test", "/./test", /* 2 */ "/test", ".\\test", /* 3 */ "./test", "\\.\\test", /* 4 */ "/test", "C", /* 5 */ "C", ".", /* 6 */ ".", "", /* 7 */ "", "/../test", /* 8 */ "/test", "C:/test/dir1/dir2", /* 9 */ "C:/test/dir1/dir2", "/test/./dir2", /* 10 */ "/test/dir2", "/test/././dir2", /* 11 */ "/test/dir2", "/test/././/////dir2", /* 12 */ "/test/dir2", "/test/../dir2", /* 13 */ "/dir2", "C:/test/dir1/dir2/../dir3", /* 14 */ "C:/test/dir1/dir3", "/test/dir1/dir2/../../dir3", /* 15 */ "/test/dir3", "/test/dir1/dir2/../../../dir3", /* 16 */ "/dir3", "/test/dir1/dir2/../../../../dir3", /* 17 */ "/dir3", "C:/test/dir1/dir2/../../../../aaa/../../././././dir3", /* 18 */ "C:/dir3", "/../..//././././dir3", /* 19 */ "/dir3", "\\..\\test", /* 20 */ "/test", "C:\\test\\dir1\\dir2", /* 21 */ "C:/test/dir1/dir2", "\\test\\.\\dir2", /* 22 */ "/test/dir2", "\\test\\.\\.\\dir2", /* 23 */ "/test/dir2", "\\test\\.\\.\\\\\\\\\\\\dir2", /* 24 */ "/test/dir2", "\\test\\..\\dir2", /* 25 */ "/dir2", "C:\\test\\dir1\\dir2\\..\\dir3", /* 26 */ "C:/test/dir1/dir3", "\\test\\dir1\\dir2\\..\\..\\dir3", /* 27 */ "/test/dir3", "\\test\\dir1\\dir2\\..\\..\\..\\dir3", /* 28 */ "/dir3", "\\test\\dir1\\dir2\\..\\..\\..\\..\\dir3", /* 29 */ "/dir3", "\\test\\dir1\\dir2\\..\\..\\..\\..\\aaa\\..\\..\\..\\.\\.\\dir3", /* 30 */ "/dir3", "C:\\..\\..\\\\.\\.\\.\\.\\dir3", /* 31 */ "C:/dir3", "../test", /* 32 */ "../test", "C:test/dir1/dir2", /* 33 */ "C:test/dir1/dir2", "test/./dir2", /* 34 */ "test/dir2", "test/././dir2", /* 35 */ "test/dir2", "test/././/////dir2", /* 36 */ "test/dir2", "test/../dir2", /* 37 */ "dir2", "C:test/dir1/dir2/../dir3", /* 38 */ "C:test/dir1/dir3", "test/dir1/dir2/../../dir3", /* 39 */ "test/dir3", "C:test/dir1/dir2/../../../dir3", /* 40 */ "C:dir3", "test/dir1/dir2/../../../../dir3", /* 41 */ "../dir3", "test/dir1/dir2/../../../../aaa/../../././././dir3", /* 42 */ "../../dir3", "../..//././././dir3", /* 43 */ "../../dir3", "../../../../dir3/aaa", /* 44 */ "../../../../dir3/aaa", "..\\test", /* 45 */ "../test", "C:test\\dir1\\dir2", /* 46 */ "C:test/dir1/dir2", "test\\.\\dir2", /* 47 */ "test/dir2", "test\\.\\.\\dir2", /* 48 */ "test/dir2", "test\\.\\.\\\\\\\\\\\\dir2", /* 49 */ "test/dir2", "test\\..\\dir2", /* 50 */ "dir2", "C:test\\dir1\\dir2\\..\\dir3", /* 51 */ "C:test/dir1/dir3", "test\\dir1\\dir2\\..\\..\\dir3", /* 52 */ "test/dir3", "C:test\\dir1\\dir2\\..\\..\\..\\dir3", /* 53 */ "C:dir3", "test\\dir1\\dir2\\..\\..\\..\\..\\dir3", /* 54 */ "../dir3", "test\\dir1\\dir2\\..\\..\\..\\..\\aaa\\..\\..\\.\\.\\.\\.\\dir3", /* 55 */ "../../dir3", "..\\..\\\\.\\.\\.\\.\\dir3", /* 56 */ "../../dir3", "..\\..\\..\\..\\dir3\\aaa", /* 57 */ "../../../../dir3/aaa", "/", /* 58 */ "/", "\\", /* 59 */ "/", "C:test\\dir1\\dir2\\..\\..\\..\\dir3\\", /* 60 */ "C:dir3/", "C:test/dir1/dir2/..\\..\\..\\dir3/", /* 61 */ "C:dir3/", "C:\\test\\dir1\\dir2\\..\\..\\..\\dir3\\", /* 62 */ "C:/dir3/", "C:\\test/dir1/dir2/..\\..\\..\\dir3/", /* 63 */ "C:/dir3/", 0 }; int main(int argc, char **argv) { int i; i = 0; while (tests[i]) { char *p = strdup(tests[i]); filename_normalize (p); if (strcmp(p, tests[i+1])) { printf("Error[%d]: <%s> != <%s>, orig <%s>\n", i/2, p, tests[i+1], tests[i]); } free(p); i += 2; } }