1// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4//
5// This file defines preprocessor macros for stringizing preprocessor
6// symbols (or their output) and manipulating preprocessor symbols
7// that define strings.
8
9#ifndef BASE_STRINGIZE_MACROS_H_
10#define BASE_STRINGIZE_MACROS_H_
11#pragma once
12
13#include "build/build_config.h"
14
15// This is not very useful as it does not expand defined symbols if
16// called directly. Use its counterpart without the _NO_EXPANSION
17// suffix, below.
18#define STRINGIZE_NO_EXPANSION(x) #x
19
20// Use this to quote the provided parameter, first expanding it if it
21// is a preprocessor symbol.
22//
23// For example, if:
24//   #define A FOO
25//   #define B(x) myobj->FunctionCall(x)
26//
27// Then:
28//   STRINGIZE(A) produces "FOO"
29//   STRINGIZE(B(y)) produces "myobj->FunctionCall(y)"
30#define STRINGIZE(x) STRINGIZE_NO_EXPANSION(x)
31
32// The following are defined only on Windows (for use when interacting
33// with Windows APIs) as wide strings are otherwise deprecated.
34#if defined(OS_WIN)
35
36// Second-level utility macros to let us expand symbols.
37#define LSTRINGIZE_NO_EXPANSION(x) L ## #x
38#define TO_L_STRING_NO_EXPANSION(x) L ## x
39
40// L version of STRINGIZE(). For examples above,
41//   LSTRINGIZE(A) produces L"FOO"
42//   LSTRINGIZE(B(y)) produces L"myobj->FunctionCall(y)"
43#define LSTRINGIZE(x) LSTRINGIZE_NO_EXPANSION(x)
44
45// Adds an L in front of an existing ASCII string constant (after
46// expanding symbols). Does not do any quoting.
47//
48// For example, if:
49//   #define C "foo"
50//
51// Then:
52//   TO_L_STRING(C) produces L"foo"
53#define TO_L_STRING(x) TO_L_STRING_NO_EXPANSION(x)
54
55#endif  // defined(OS_WIN)
56
57#endif  // BASE_STRINGIZE_MACROS_H_
58