// See the file "COPYING" in the main distribution directory for copyright.

// Utility functions for compile-to-C++ compiler.

#pragma once

#include "zeek/script_opt/ProfileFunc.h"

namespace zeek::detail
	{

// Conversions to strings.
inline std::string Fmt(int i)
	{
	return std::to_string(i);
	}
inline std::string Fmt(p_hash_type u)
	{
	return std::to_string(u) + "ULL";
	}
extern std::string Fmt(double d);

// Returns the prefix for the scoping used by the compiler.
extern std::string scope_prefix(const std::string& scope);

// Same, but for scopes identified with numbers.
extern std::string scope_prefix(int scope);

// True if the given function is compilable to C++.  If it isn't, and
// the second argument is non-nil, then on return it points to text
// explaining why not.
extern bool is_CPP_compilable(const ProfileFunc* pf, const char** reason = nullptr);

// Helper utilities for file locking, to ensure that hash files
// don't receive conflicting writes due to concurrent compilations.
extern void lock_file(const std::string& fname, FILE* f);
extern void unlock_file(const std::string& fname, FILE* f);

// For the given byte array / string, returns a version expanded
// with escape sequences in order to represent it as a C++ string.
extern std::string CPPEscape(const char* b, int len);
inline std::string CPPEscape(const char* s)
	{
	return CPPEscape(s, strlen(s));
	}

	} // zeek::detail
