aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/llvm12/tools/llvm-rc/ResourceScriptToken.h
blob: d821f101387a94f5a006bba60d82eb0b0a4f824c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//===-- ResourceScriptToken.h -----------------------------------*- C++-*-===// 
// 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 
// See https://llvm.org/LICENSE.txt for license information. 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 
// 
//===---------------------------------------------------------------------===// 
// 
// This declares the .rc script tokens and defines an interface for tokenizing 
// the input data. The list of available tokens is located at 
// ResourceScriptTokenList.def. 
// 
// Note that the tokenizer does not support preprocessor directives. The 
// preprocessor should do its work on the .rc file before running llvm-rc. 
// 
// As for now, it is possible to parse ASCII files only (the behavior on 
// UTF files might be undefined). However, it already consumes UTF-8 BOM, if 
// there is any. Thus, ASCII-compatible UTF-8 files are tokenized correctly. 
// 
// Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa380599(v=vs.85).aspx 
// 
//===---------------------------------------------------------------------===// 
 
#ifndef LLVM_TOOLS_LLVMRC_RESOURCESCRIPTTOKEN_H 
#define LLVM_TOOLS_LLVMRC_RESOURCESCRIPTTOKEN_H 
 
#include "llvm/ADT/StringRef.h" 
#include "llvm/Support/Error.h" 
 
#include <cstdint> 
#include <map> 
#include <string> 
#include <vector> 
 
namespace llvm { 
 
// A definition of a single resource script token. Each token has its kind 
// (declared in ResourceScriptTokenList) and holds a value - a reference 
// representation of the token. 
// RCToken does not claim ownership on its value. A memory buffer containing 
// the token value should be stored in a safe place and cannot be freed 
// nor reallocated. 
class RCToken { 
public: 
  enum class Kind { 
#define TOKEN(Name) Name, 
#define SHORT_TOKEN(Name, Ch) Name, 
#include "ResourceScriptTokenList.def" 
  }; 
 
  RCToken(RCToken::Kind RCTokenKind, StringRef Value); 
 
  // Get an integer value of the integer token. 
  uint32_t intValue() const; 
  bool isLongInt() const; 
 
  StringRef value() const; 
  Kind kind() const; 
 
  // Check if a token describes a binary operator. 
  bool isBinaryOp() const; 
 
private: 
  Kind TokenKind; 
  StringRef TokenValue; 
}; 
 
// Tokenize Input. 
// In case no error occurred, the return value contains 
//   tokens in order they were in the input file. 
// In case of any error, the return value contains 
//   a textual representation of error. 
// 
// Tokens returned by this function hold only references to the parts 
// of the Input. Memory buffer containing Input cannot be freed, 
// modified or reallocated. 
Expected<std::vector<RCToken>> tokenizeRC(StringRef Input); 
 
} // namespace llvm 
 
#endif