| 
									
										
										
										
											2018-10-28 08:54:20 +01:00
										 |  |  | #include "FileSystemPath.h"
 | 
					
						
							|  |  |  | #include "Vector.h"
 | 
					
						
							|  |  |  | #include "kstdio.h"
 | 
					
						
							|  |  |  | #include "StringBuilder.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace AK { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FileSystemPath::FileSystemPath(const String& s) | 
					
						
							|  |  |  |     : m_string(s) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_isValid = canonicalize(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool FileSystemPath::canonicalize(bool resolveSymbolicLinks) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // FIXME: Implement "resolveSymbolicLinks"
 | 
					
						
							| 
									
										
										
										
											2018-11-09 10:09:46 +01:00
										 |  |  |     (void) resolveSymbolicLinks; | 
					
						
							| 
									
										
										
										
											2018-10-28 08:54:20 +01:00
										 |  |  |     auto parts = m_string.split('/'); | 
					
						
							|  |  |  |     Vector<String> canonicalParts; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (auto& part : parts) { | 
					
						
							|  |  |  |         if (part == ".") | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |         if (part == "..") { | 
					
						
							|  |  |  |             if (!canonicalParts.isEmpty()) | 
					
						
							|  |  |  |                 canonicalParts.takeLast(); | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-11-10 15:46:39 +01:00
										 |  |  |         if (!part.isEmpty()) | 
					
						
							|  |  |  |             canonicalParts.append(part); | 
					
						
							| 
									
										
										
										
											2018-10-28 08:54:20 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |     if (canonicalParts.isEmpty()) { | 
					
						
							| 
									
										
										
										
											2018-11-18 14:57:41 +01:00
										 |  |  |         m_string = m_basename = m_dirname = "/"; | 
					
						
							| 
									
										
										
										
											2018-10-28 08:54:20 +01:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-11-18 14:57:41 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     m_basename = canonicalParts.last(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (canonicalParts.size() == 1) { | 
					
						
							|  |  |  |         m_dirname = "/"; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         StringBuilder builder; | 
					
						
							|  |  |  |         for (size_t i = 0; i < canonicalParts.size() - 1; ++i) { | 
					
						
							|  |  |  |             auto& cpart = canonicalParts[i]; | 
					
						
							|  |  |  |             builder.append('/'); | 
					
						
							|  |  |  |             builder.append(cpart); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         m_dirname = builder.build(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         StringBuilder builder; | 
					
						
							|  |  |  |         for (auto& cpart : canonicalParts) { | 
					
						
							|  |  |  |             builder.append('/'); | 
					
						
							|  |  |  |             builder.append(move(cpart)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         m_string = builder.build(); | 
					
						
							| 
									
										
										
										
											2018-10-28 08:54:20 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |