// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COMPILER_PREPROCESSOR_PREPROCESSOR_H_
#define COMPILER_PREPROCESSOR_PREPROCESSOR_H_

#include "pp_utils.h"

namespace pp
{

class Diagnostics;
class DirectiveHandler;
struct PreprocessorImpl;
struct Token;

class Preprocessor
{
public:
	Preprocessor(Diagnostics* diagnostics, DirectiveHandler* directiveHandler);
	~Preprocessor();

	// count: specifies the number of elements in the string and length arrays.
	// string: specifies an array of pointers to strings.
	// length: specifies an array of string lengths.
	// If length is NULL, each string is assumed to be null terminated.
	// If length is a value other than NULL, it points to an array containing
	// a string length for each of the corresponding elements of string.
	// Each element in the length array may contain the length of the
	// corresponding string or a value less than 0 to indicate that the string
	// is null terminated.
	bool init(int count, const char* const string[], const int length[]);
	// Adds a pre-defined macro.
	void predefineMacro(const char* name, int value);

	void lex(Token* token);

private:
	PP_DISALLOW_COPY_AND_ASSIGN(Preprocessor);

	PreprocessorImpl* mImpl;
};

}  // namespace pp
#endif  // COMPILER_PREPROCESSOR_PREPROCESSOR_H_

