1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef CRAZY_LINKER_SEARCH_PATH_LIST_H
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define CRAZY_LINKER_SEARCH_PATH_LIST_H
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <string.h>
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "crazy_linker_util.h"  // for String
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace crazy {
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// A simple class to model a list of search paths, and perform
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// file system probing with it.
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class SearchPathList {
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SearchPathList() : list_(), env_list_(), full_path_() {}
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Reset the list, i.e. make it empty.
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void Reset();
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Reset the list from an environment variable value.
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void ResetFromEnv(const char* var_name);
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Add one or more paths to the list.
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |path_list| contains a list of paths separated by columns.
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |path_list_end| points after the list's last character.
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void AddPaths(const char* path_list, const char* path_list_end);
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Convenience function that takes a 0-terminated string.
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void AddPaths(const char* path_list) {
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    AddPaths(path_list, path_list + ::strlen(path_list));
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Try to find a file named |file_name| by probing the file system
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // with every item in the list as a suffix. On success, returns the
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // full path string, or NULL on failure.
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const char* FindFile(const char* file_name);
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  String list_;
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  String env_list_;
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  String full_path_;
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace crazy
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // CRAZY_LINKER_SEARCH_PATH_LIST_H