> -----Original Message----- > From: Joey Ye [mailto:[email protected]] > 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;
}
}
