aboutsummaryrefslogtreecommitdiffstats
path: root/Godeps/_workspace/src/github.com/ethereum/serpent-go/serpent/util.h
blob: f7d6744f9e32c4ad6c05e48ce3599d15648c7c10 (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
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
#ifndef ETHSERP_UTIL
#define ETHSERP_UTIL

#include <stdio.h>
#include <iostream>
#include <vector>
#include <map>
#include <fstream>
#include <cerrno>

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;

// 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
struct Node {
    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 simple numeric format
std::string strToNumeric(std::string inp);

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

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

#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>

#endif