This repository has been archived by the owner on Dec 31, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 108
/
Copy pathutil.h
178 lines (140 loc) · 4.11 KB
/
util.h
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#ifndef ETHSERP_UTIL
#define ETHSERP_UTIL
#include <stdio.h>
#include <iostream>
#include <vector>
#include <map>
#include <fstream>
#include <cerrno>
#include <stdint.h>
const int TOKEN = 0,
ASTNODE = 1,
SPACE = 2,
BRACK = 3,
SQUOTE = 4,
DQUOTE = 5,
SYMB = 6,
ALPHANUM = 7,
LPAREN = 8,
RPAREN = 9,
COMMA = 10,
COLON = 11,
UNARY_OP = 12,
BINARY_OP = 13,
COMPOUND = 14,
TOKEN_SPLITTER = 15;
const int STATIC = 16,
ARRAY = 17,
BYTES = 18;
// Stores metadata about each token
class Metadata {
public:
Metadata(std::string File="main", int Ln=-1, int Ch=-1) {
file = File;
ln = Ln;
ch = Ch;
fixed = false;
}
std::string file;
int ln;
int ch;
bool fixed;
};
std::string mkUniqueToken();
// type can be TOKEN or ASTNODE
class Node {
public:
int type;
std::string val;
std::vector<Node> args;
Metadata metadata;
};
Node token(std::string val, Metadata met=Metadata());
Node astnode(std::string val, std::vector<Node> args, Metadata met=Metadata());
Node astnode(std::string val, Metadata met=Metadata());
Node astnode(std::string val, Node a, Metadata met=Metadata());
Node astnode(std::string val, Node a, Node b, Metadata met=Metadata());
Node astnode(std::string val, Node a, Node b, Node c, Metadata met=Metadata());
Node astnode(std::string val, Node a, Node b,
Node c, Node d, Metadata met=Metadata());
// Number of tokens in a tree
int treeSize(Node prog);
// Print token list
std::string printTokens(std::vector<Node> tokens);
// Prints a lisp AST on one line
std::string printSimple(Node ast);
// Pretty-prints a lisp AST
std::string printAST(Node ast, bool printMetadata=false);
// Splits text by line
std::vector<std::string> splitLines(std::string s);
// Inverse of splitLines
std::string joinLines(std::vector<std::string> lines);
// Indent all lines by 4 spaces
std::string indentLines(std::string inp);
// Converts binary to simple numeric format
std::string binToNumeric(std::string inp);
// Converts string to list of bytes
std::vector<uint8_t> strToBytes(std::string inp);
// Converts string to simple numeric format
std::string strToNumeric(std::string inp, int strpad);
// Does the node contain a number (eg. 124, 0xf012c, "george")
bool isNumberLike(Node node);
//Normalizes number representations
Node nodeToNumeric(Node node);
//If a node is numeric, normalize its representation
Node tryNumberize(Node node);
//Converts a value to an array of byte number nodes
std::vector<Node> toByteArr(std::string val, Metadata metadata, int minLen=1);
//Reads a file
std::string get_file_contents(std::string filename);
//Does a file exist?
bool exists(std::string fileName);
//Report error
void err(std::string errtext, Metadata met);
//Report warning
void warn(std::string errtext, Metadata met);
//Bin to hex
std::string binToHex(std::string inp);
//Hex to bin
std::string hexToBin(std::string inp);
//Lower to upper
std::string upperCase(std::string inp);
//Three-int vector
std::vector<int> triple(int a, int b, int c);
//Empty hash
std::vector<uint8_t> zeroes(int n);
//Empty boolean vector
std::vector<bool> falses(int n);
//Extend node vector
std::vector<Node> extend(std::vector<Node> a, std::vector<Node> b);
//Converts a byte array into a value
std::string bytesToDecimal(std::vector<uint8_t> b);
// Is the number decimal?
bool isDecimal(std::string inp);
#define asn astnode
#define tkn token
#define msi std::map<std::string, int>
#define msn std::map<std::string, Node>
#define mss std::map<std::string, std::string>
#define strvec std::vector<std::string>
template <typename T, typename U>
class create_map
{
private:
std::map<T, U> m_map;
public:
create_map(const T& key, const U& val)
{
m_map[key] = val;
}
create_map<T, U>& operator()(const T& key, const U& val)
{
m_map[key] = val;
return *this;
}
operator std::map<T, U>()
{
return m_map;
}
};
#endif