> -----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

Attachment: 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;
    }
}

Reply via email to