// 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;

struct PreprocessorSettings
{
	PreprocessorSettings() : maxMacroExpansionDepth(1000) {}
	int maxMacroExpansionDepth;
};

class Preprocessor
{
public:
	Preprocessor(Diagnostics *diagnostics,
	             DirectiveHandler *directiveHandler,
	             const PreprocessorSettings &settings);
	~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(size_t count, const char *const string[], const int length[]);
	// Adds a pre-defined macro.
	void predefineMacro(const char *name, int value);

	void lex(Token *token);

	// Set maximum preprocessor token size
	void setMaxTokenSize(size_t maxTokenSize);

private:
	PP_DISALLOW_COPY_AND_ASSIGN(Preprocessor);

	PreprocessorImpl *mImpl;
};

}  // namespace pp
#endif  // COMPILER_PREPROCESSOR_PREPROCESSOR_H_

