|  | @ -29,18 +29,18 @@ import ( | 
			
		
	
		
		
			
				
					|  |  | // an error. If you do not want to check for valid directives,
 |  |  | // an error. If you do not want to check for valid directives,
 | 
			
		
	
		
		
			
				
					|  |  | // pass in nil instead.
 |  |  | // pass in nil instead.
 | 
			
		
	
		
		
			
				
					|  |  | func Parse(filename string, input io.Reader) ([]ServerBlock, error) { |  |  | func Parse(filename string, input io.Reader) ([]ServerBlock, error) { | 
			
		
	
		
		
			
				
					
					|  |  | 	tokens, err := allTokens(input) |  |  | 	tokens, err := allTokens(filename, input) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  | 	if err != nil { |  |  | 	if err != nil { | 
			
		
	
		
		
			
				
					|  |  | 		return nil, err |  |  | 		return nil, err | 
			
		
	
		
		
			
				
					|  |  | 	} |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  | 	p := parser{Dispenser: NewDispenser(filename, tokens)} |  |  | 	p := parser{Dispenser: NewDispenser(tokens)} | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  | 	return p.parseAll() |  |  | 	return p.parseAll() | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | // allTokens lexes the entire input, but does not parse it.
 |  |  | // allTokens lexes the entire input, but does not parse it.
 | 
			
		
	
		
		
			
				
					|  |  | // It returns all the tokens from the input, unstructured
 |  |  | // It returns all the tokens from the input, unstructured
 | 
			
		
	
		
		
			
				
					|  |  | // and in order.
 |  |  | // and in order.
 | 
			
		
	
		
		
			
				
					
					|  |  | func allTokens(input io.Reader) ([]Token, error) { |  |  | func allTokens(filename string, input io.Reader) ([]Token, error) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  | 	l := new(lexer) |  |  | 	l := new(lexer) | 
			
		
	
		
		
			
				
					|  |  | 	err := l.load(input) |  |  | 	err := l.load(input) | 
			
		
	
		
		
			
				
					|  |  | 	if err != nil { |  |  | 	if err != nil { | 
			
		
	
	
		
		
			
				
					|  | @ -48,6 +48,7 @@ func allTokens(input io.Reader) ([]Token, error) { | 
			
		
	
		
		
			
				
					|  |  | 	} |  |  | 	} | 
			
		
	
		
		
			
				
					|  |  | 	var tokens []Token |  |  | 	var tokens []Token | 
			
		
	
		
		
			
				
					|  |  | 	for l.next() { |  |  | 	for l.next() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		l.token.File = filename | 
			
		
	
		
		
			
				
					|  |  | 		tokens = append(tokens, l.token) |  |  | 		tokens = append(tokens, l.token) | 
			
		
	
		
		
			
				
					|  |  | 	} |  |  | 	} | 
			
		
	
		
		
			
				
					|  |  | 	return tokens, nil |  |  | 	return tokens, nil | 
			
		
	
	
		
		
			
				
					|  | @ -265,7 +266,7 @@ func (p *parser) doImport() error { | 
			
		
	
		
		
			
				
					|  |  | 		// list of matching filenames
 |  |  | 		// list of matching filenames
 | 
			
		
	
		
		
			
				
					|  |  | 		absFile, err := filepath.Abs(p.Dispenser.File()) |  |  | 		absFile, err := filepath.Abs(p.Dispenser.File()) | 
			
		
	
		
		
			
				
					|  |  | 		if err != nil { |  |  | 		if err != nil { | 
			
		
	
		
		
			
				
					
					|  |  | 			return p.Errf("Failed to get absolute path of file: %s: %v", p.Dispenser.filename, err) |  |  | 			return p.Errf("Failed to get absolute path of file: %s: %v", p.Dispenser.File(), err) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  | 		} |  |  | 		} | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | 		var matches []string |  |  | 		var matches []string | 
			
		
	
	
		
		
			
				
					|  | @ -327,7 +328,7 @@ func (p *parser) doSingleImport(importFile string) ([]Token, error) { | 
			
		
	
		
		
			
				
					|  |  | 		return nil, p.Errf("Could not import %s: is a directory", importFile) |  |  | 		return nil, p.Errf("Could not import %s: is a directory", importFile) | 
			
		
	
		
		
			
				
					|  |  | 	} |  |  | 	} | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  | 	importedTokens, err := allTokens(file) |  |  | 	importedTokens, err := allTokens(importFile, file) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  | 	if err != nil { |  |  | 	if err != nil { | 
			
		
	
		
		
			
				
					|  |  | 		return nil, p.Errf("Could not read tokens while importing %s: %v", importFile, err) |  |  | 		return nil, p.Errf("Could not read tokens while importing %s: %v", importFile, err) | 
			
		
	
		
		
			
				
					|  |  | 	} |  |  | 	} | 
			
		
	
	
		
		
			
				
					|  | @ -336,7 +337,7 @@ func (p *parser) doSingleImport(importFile string) ([]Token, error) { | 
			
		
	
		
		
			
				
					|  |  | 	// (we use full, absolute path to avoid bugs: issue #1892)
 |  |  | 	// (we use full, absolute path to avoid bugs: issue #1892)
 | 
			
		
	
		
		
			
				
					|  |  | 	filename, err := filepath.Abs(importFile) |  |  | 	filename, err := filepath.Abs(importFile) | 
			
		
	
		
		
			
				
					|  |  | 	if err != nil { |  |  | 	if err != nil { | 
			
		
	
		
		
			
				
					
					|  |  | 		return nil, p.Errf("Failed to get absolute path of file: %s: %v", p.Dispenser.filename, err) |  |  | 		return nil, p.Errf("Failed to get absolute path of file: %s: %v", importFile, err) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  | 	} |  |  | 	} | 
			
		
	
		
		
			
				
					|  |  | 	for i := 0; i < len(importedTokens); i++ { |  |  | 	for i := 0; i < len(importedTokens); i++ { | 
			
		
	
		
		
			
				
					|  |  | 		importedTokens[i].File = filename |  |  | 		importedTokens[i].File = filename | 
			
		
	
	
		
		
			
				
					|  | @ -497,7 +498,7 @@ func (sb ServerBlock) DispenseDirective(dir string) *Dispenser { | 
			
		
	
		
		
			
				
					|  |  | 			tokens = append(tokens, seg...) |  |  | 			tokens = append(tokens, seg...) | 
			
		
	
		
		
			
				
					|  |  | 		} |  |  | 		} | 
			
		
	
		
		
			
				
					|  |  | 	} |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  | 	return NewDispenser("", tokens) |  |  | 	return NewDispenser(tokens) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | // Segment is a list of tokens which begins with a directive
 |  |  | // Segment is a list of tokens which begins with a directive
 | 
			
		
	
	
		
		
			
				
					|  | @ -513,9 +514,3 @@ func (s Segment) Directive() string { | 
			
		
	
		
		
			
				
					|  |  | 	} |  |  | 	} | 
			
		
	
		
		
			
				
					|  |  | 	return "" |  |  | 	return "" | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  | // NewDispenser returns a dispenser for this
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  | // segment's tokens.
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  | func (s Segment) NewDispenser() *Dispenser { |  |  |  | 
			
		
	
		
		
			
				
					|  |  | 	return NewDispenser("", s) |  |  |  | 
			
		
	
		
		
			
				
					|  |  | } |  |  |  | 
			
		
	
	
		
		
			
				
					|  | 
 |