1// Copyright 2015 Google Inc. All rights reserved
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//      http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package kati
16
17import (
18	"os"
19	"path/filepath"
20)
21
22func exists(filename string) bool {
23	_, err := os.Stat(filename)
24	if os.IsNotExist(err) {
25		return false
26	}
27	return true
28}
29
30type vpath struct {
31	pattern string
32	dirs    []string
33}
34
35type searchPaths struct {
36	vpaths []vpath  // vpath directives
37	dirs   []string // VPATH variable
38}
39
40func (s searchPaths) exists(target string) (string, bool) {
41	if exists(target) {
42		return target, true
43	}
44	for _, vpath := range s.vpaths {
45		if !matchPattern(vpath.pattern, target) {
46			continue
47		}
48		for _, dir := range vpath.dirs {
49			vtarget := filepath.Join(dir, target)
50			if exists(vtarget) {
51				return vtarget, true
52			}
53		}
54	}
55	for _, dir := range s.dirs {
56		vtarget := filepath.Join(dir, target)
57		if exists(vtarget) {
58			return vtarget, true
59		}
60	}
61	return target, false
62}
63