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