[clang-tools-extra] r230665 - Fixed canonical path function.

Sean Silva chisophugis at gmail.com
Fri Feb 27 14:34:19 PST 2015


On Fri, Feb 27, 2015 at 10:56 AM, John Thompson <
john.thompson.jtsoftware at gmail.com> wrote:

> +    if (B->compare(".") == 0) {
> +    }
>
> Hopefully this clause causes paths like ./node.h and node1/./node2.h to
> become node.h and node1/node2.h, respectively.
>
> I'm not sure what you mean by filesystem TS.
>

That is the name of the ISO C++ document I pointed you to:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3803.pdf


>
> One question is whether a "normalization" function should convert relative
> paths to absolute.  In this case I opted not to make it absolute.
>
> I decided to put it locally for now, due to time constraints.  Later I can
> move it when I can take more time to write a test and so forth.  Actually I
> think if might be an inefficient function, as I think it might do array
> resizing as it builds up the new path and allocates a new string for the
> return, but it's sufficient for my needs.
>

Ok, if it is just a local modification, then I would avoid naming it the
same thing as in the filesystem TS.

-- Sean Silva


>
> Comments about suitability for path.h/cpp would be appreciated.
>
> -John
>
>
> On Thu, Feb 26, 2015 at 3:51 PM, Sean Silva <chisophugis at gmail.com> wrote:
>
>> +    if (B->compare(".") == 0) {
>> +    }
>>
>> ?
>>
>> Also, does this function implement the corresponding function of the
>> filesystem TS correctly? If so, we should probably move it to sys::path.
>>
>> -- Sean Silva
>>
>> On Thu, Feb 26, 2015 at 11:31 AM, John Thompson <
>> John.Thompson.JTSoftware at gmail.com> wrote:
>>
>>> Author: jtsoftware
>>> Date: Thu Feb 26 13:31:10 2015
>>> New Revision: 230665
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=230665&view=rev
>>> Log:
>>> Fixed canonical path function.
>>>
>>> Modified:
>>>     clang-tools-extra/trunk/modularize/ModularizeUtilities.cpp
>>>     clang-tools-extra/trunk/modularize/PreprocessorTracker.cpp
>>>
>>> Modified: clang-tools-extra/trunk/modularize/ModularizeUtilities.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/modularize/ModularizeUtilities.cpp?rev=230665&r1=230664&r2=230665&view=diff
>>>
>>> ==============================================================================
>>> --- clang-tools-extra/trunk/modularize/ModularizeUtilities.cpp (original)
>>> +++ clang-tools-extra/trunk/modularize/ModularizeUtilities.cpp Thu Feb
>>> 26 13:31:10 2015
>>> @@ -341,13 +341,31 @@ bool ModularizeUtilities::collectUmbrell
>>>    }
>>>    return true;
>>>  }
>>> +
>>> +std::string normalize(StringRef Path) {
>>> +  SmallString<128> Buffer;
>>> +  llvm::sys::path::const_iterator B = llvm::sys::path::begin(Path),
>>> +    E = llvm::sys::path::end(Path);
>>> +  while (B != E) {
>>> +    if (B->compare(".") == 0) {
>>> +    }
>>> +    else if (B->compare("..") == 0)
>>> +      llvm::sys::path::remove_filename(Buffer);
>>> +    else
>>> +      llvm::sys::path::append(Buffer, *B);
>>> +    ++B;
>>> +  }
>>> +  if (Path.endswith("/") || Path.endswith("\\"))
>>> +    Buffer.append(1, Path.back());
>>> +  return Buffer.c_str();
>>> +}
>>>
>>>  // Convert header path to canonical form.
>>>  // The canonical form is basically just use forward slashes, and remove
>>> "./".
>>>  // \param FilePath The file path, relative to the module map directory.
>>>  // \returns The file path in canonical form.
>>>  std::string ModularizeUtilities::getCanonicalPath(StringRef FilePath) {
>>> -  std::string Tmp(FilePath);
>>> +  std::string Tmp(normalize(FilePath));
>>>    std::replace(Tmp.begin(), Tmp.end(), '\\', '/');
>>>    StringRef Tmp2(Tmp);
>>>    if (Tmp2.startswith("./"))
>>>
>>> Modified: clang-tools-extra/trunk/modularize/PreprocessorTracker.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/modularize/PreprocessorTracker.cpp?rev=230665&r1=230664&r2=230665&view=diff
>>>
>>> ==============================================================================
>>> --- clang-tools-extra/trunk/modularize/PreprocessorTracker.cpp (original)
>>> +++ clang-tools-extra/trunk/modularize/PreprocessorTracker.cpp Thu Feb
>>> 26 13:31:10 2015
>>> @@ -251,6 +251,7 @@
>>>  #include "llvm/ADT/SmallSet.h"
>>>  #include "llvm/Support/StringPool.h"
>>>  #include "llvm/Support/raw_ostream.h"
>>> +#include "ModularizeUtilities.h"
>>>
>>>  namespace Modularize {
>>>
>>> @@ -930,8 +931,8 @@ public:
>>>      // and block statement.
>>>      clang::FileID FileID =
>>> PP.getSourceManager().getFileID(BlockStartLoc);
>>>      std::string SourcePath = getSourceLocationFile(PP, BlockStartLoc);
>>> +    SourcePath = ModularizeUtilities::getCanonicalPath(SourcePath);
>>>      HeaderHandle SourceHandle = findHeaderHandle(SourcePath);
>>> -    // FIXME: Go back and fix getSourceLocation to use a canonical form.
>>>      if (SourceHandle == -1)
>>>        return true;
>>>      int BlockStartLine, BlockStartColumn, BlockEndLine, BlockEndColumn;
>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>>
>>
>>
>
>
> --
> John Thompson
> John.Thompson.JTSoftware at gmail.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150227/f350fbc2/attachment.html>


More information about the cfe-commits mailing list