tinycc-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Tinycc-devel] "mormalize_inc_dirs"


From: avih
Subject: Re: [Tinycc-devel] "mormalize_inc_dirs"
Date: Sat, 7 Nov 2015 15:45:11 +0000 (UTC)

I will, if and after there's an understanding and an indication that this is indeed what's
missing with the new code.

Also, note that GetFullPathName needs to be unicode aware. I don't know how tcc
handles unicode file/path names on windows, but using this function if it wasn't used
before adds another failure vector, which is unicode names.

Also, from the MSDN page about it:
"Note  The GetFullPathName function is not recommended for multithreaded
applications or shared library code. For more information, see the Remarks section."

So using could possibly affect programs which use libtcc.dll.

I still hold the opinion that if the previous code was correct without needing to use
such functionality, then even if it was less "normalized", it was still better as cross
platform code.



On Saturday, November 7, 2015 5:34 PM, Christian Jullien <address@hidden> wrote:


Since you know you’re on Windows, you can call GetFullPathName on two dirs and compare results. It is available since XP and present in kernel32
 
DWORD WINAPI GetFullPathName(
  _In_  LPCTSTR lpFileName,
  _In_  DWORD   nBufferLength,
  _Out_ LPTSTR  lpBuffer,
  _Out_ LPTSTR  *lpFilePart
);
 
 
 
From: address@hidden [mailto:address@hidden On Behalf Of avih
Sent: samedi 7 novembre 2015 16:11
To: address@hidden
Subject: Re: [Tinycc-devel] "mormalize_inc_dirs"
 
To check whether or not two dirs are the same without stat, one could cdhir to each
dir (from the base dir) and then getcwd. As far as I know this always returns the
canonicalized path, therefore makes the two path comparable. This can work on
Windows too.
 
But let's backtrace a bit:
 
As far as I can tell, the sequence of events was as follows:
 
1. seyko commits "mormalize_inc_dirs"
 
2. I said (and now adding: on windows 8.1 with msys2 and gcc 5.2.0):
 
Prior to this commit, when building tcc itself (configure and make), after successfully
building the tcc executable (on windows for windows), it starts building libtcc1.a using
the just-compiled tcc.exe, and succeeded.
This process now fails for me (missing stddef.h for libtcc1.a) ...
 
3. Roy Tam said:
 
BTW this commit breaks tcc compiling itself afterwards.
WinXP SP3 32bit, MinGW(tcc self compilation test)
Using the compiled tcc to recompile tcc itself fails with windows.h not found.
I have to reverting this commit to recover.
 
----------
So far, from these two comment, it's apparent that the newly built windows tcc
executable does not resolve dirs the same as it used to. It's unclear whether
other platforms are affected.
----------
 
4. seyko responds to Toy Tam:
 
Anyone know solution for stat? From Google:

  "stat" not working on Windows XP using v14_xp platform ...
  stat() does not work for me on Cygwin/Windows - C / C++
  Portable way to check if directory exists?
 
5. (now) A discussion goes on how to compare dirs on XP.
 
So, do we know for a fact that this is the actual problem? I.e. that the current
dir resolution failure is due to missing code which needs to check if two dirs
are the same?
 
If such required dir comparison was missing from the code, then I'd expect that
other platforms are affected as well. But as far as I can tell there wasn't indication
for that so far.
 
Though it's possible that other platforms are affected, but the issue doesn't affect
the tcc build process on those platforms, but it does on windows.
 
However, how come the old code did not need to compare such two dirs, and still
worked correctly? If the old code was working correctly without needing to compare
two actual dirs, despite it not being "n[m]ormalized", maybe it's still the better
solution because it depends less on features which are harder to use reliably on
different platforms?
 
 
On Saturday, November 7, 2015 3:59 PM, Edmund Grimley Evans <address@hidden> wrote:
 
> Hum! You can:
> fopen("dir-to-test/__deleteme__", "w");
> If it succeeds, dir-to-test exists then call fclose and
> remove("dir-to-test/__deleteme__").

As I understand it, the problem to be solved is not determining
whether a directory exists, but determining whether two directories
are the same (even though the paths might look quite different). You
can do that under POSIX by comparing st_dev and st_ino.

I suppose you could check that neither PATH1/RANDOM_NAME nor
PATH2/RANDOM_NAME exists, then create one of them and see if the other
now exists. But in most cases the directories are not writable!

Does GCC have an alternative implementation for systems without stat?

Edmund


_______________________________________________
Tinycc-devel mailing list
address@hidden
https://lists.nongnu.org/mailman/listinfo/tinycc-devel
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]