148cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner// Copyright (c) 2013 The Chromium Authors. All rights reserved. 248cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner// Use of this source code is governed by a BSD-style license that can be 348cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner// found in the LICENSE file. 448cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner 548cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner#ifndef CRAZY_LINKER_SEARCH_PATH_LIST_H 648cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner#define CRAZY_LINKER_SEARCH_PATH_LIST_H 748cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner 848cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner#include <string.h> 948cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner 1048cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner#include "crazy_linker_util.h" // for String 1148cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner 1248cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turnernamespace crazy { 1348cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner 1448cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner// A simple class to model a list of search paths, and perform 1548cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner// file system probing with it. 1648cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turnerclass SearchPathList { 1748cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner public: 1848cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner SearchPathList() : list_(), env_list_(), full_path_() {} 1948cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner 2048cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner // Reset the list, i.e. make it empty. 2148cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner void Reset(); 2248cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner 2348cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner // Reset the list from an environment variable value. 2448cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner void ResetFromEnv(const char* var_name); 2548cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner 2648cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner // Add one or more paths to the list. 2748cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner // |path_list| contains a list of paths separated by columns. 2848cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner // |path_list_end| points after the list's last character. 2948cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner void AddPaths(const char* path_list, const char* path_list_end); 3048cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner 3148cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner // Convenience function that takes a 0-terminated string. 3248cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner void AddPaths(const char* path_list) { 3348cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner AddPaths(path_list, path_list + ::strlen(path_list)); 3448cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner } 3548cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner 3648cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner // Try to find a file named |file_name| by probing the file system 3748cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner // with every item in the list as a suffix. On success, returns the 3848cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner // full path string, or NULL on failure. 3948cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner const char* FindFile(const char* file_name); 4048cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner 4148cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner private: 4248cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner String list_; 4348cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner String env_list_; 4448cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner String full_path_; 4548cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner}; 4648cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner 4748cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner} // namespace crazy 4848cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner 4948cdce8c044f6e7d11aa2b5eb97635c922e0bc58David 'Digit' Turner#endif // CRAZY_LINKER_SEARCH_PATH_LIST_H