8000 port some of the JS code to C++ · dragoncoder047/pickle@3a8cca9 · GitHub
[go: up one dir, main page]

Skip to content

Commit 3a8cca9

Browse files
port some of the JS code to C++
[skip actions]
1 parent de6a684 commit 3a8cca9

File tree

4 files changed

+161
-4
lines changed

4 files changed

+161
-4
lines changed

cpp/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ buildtest64:
44
g++ --std=c++11 pickle_test.cpp -g -o pickletest64
55

66
valgrind64: buildtest64
7-
valgrind --track-origins=yes ./pickletest64 > test/out64.txt 2> test/valgrind64.txt
7+
valgrind --track-origins=yes --leak-check=full --show-leak-kinds=all ./pickletest64 > test/out64.txt 2> test/valgrind64.txt
88

99
buildtest32:
1010
g++ --std=c++11 -m32 pickle_test.cpp -g -o pickletest32
1111

1212
valgrind32: buildtest32
13-
valgrind --track-origins=yes ./pickletest32 > test/out32.txt 2> test/valgrind32.txt
13+
valgrind --track-origins=yes --leak-check=full --show-leak-kinds=all ./pickletest32 > test/out32.txt 2> test/valgrind32.txt
1414

1515
clean:
1616
rm -f pickletest64

cpp/pickle.cpp

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,82 @@
22

33
namespace pickle {
44

5+
char unescape(char c) {
6+
switch (c) {
7+
case 'b': return '\b';
8+
case 't': return '\t';
9+
case 'n': return '\n';
10+
case 'v': return '\v';
11+
case 'f': return '\f';
12+
case 'r': return '\r';
13+
case 'a': return '\a';
14+
case 'o': return '{';
15+
case 'c': return '}';
16+
case '\n': return 0;
17+
default: return c;
18+
}
19+
}
20+
21+
char escape(char c) {
22+
switch (c) {
23+
case '\b': return 'b';
24+
case '\t': return 't';
25+
case '\n': return 'n';
26+
case '\v': return 'v';
27+
case '\f': return 'f';
28+
case '\r': return 'r';
29+
case '\a': return 'a';
30+
case '{': return 'o';
31+
case '}': return 'c';
32+
default: return c;
33+
}
34+
}
35+
36+
bool needs_escape(char c) {
37+
return strchr("{}\b\t\n\v\f\r\a\\\"", c) != NULL;
38+
}
39+
40+
loc::loc(size_t line, size_t col)
41+
: line(line),
42+
col(col) {};
543

44+
token::token(token_type type, char* content, loc start, loc end, char* filename, char* message)
45+
: type(type),
46+
content(content ? strdup(content) : NULL),
47+
start(start),
48+
end(end),
49+
filename(filename ? strdup(filename) : NULL),
50+
message(message ? strdup(message) : NULL) {};
51+
52+
token::~token() {
53+
free(this->content);
54+
free(this->filename);
55+
free(this->message);
56+
}
57+
58+
tokenizer::tokenizer(const char* stream, const char* filename)
59+
: filename((char*)filename),
60+
stream((char*)stream),
61+
len(strlen(stream)),
62+
bi(0),
63+
i(0),
64+
last_token(NULL),
65+
buffer(NULL),
66+
bufsz(0),
67+
buflen(0) {};
68+
69+
70+
token* tokenizer::error_token(char* message) {
71+
if (this->bi == this->i) this->i++;
72+
char* message2;
73+
if (message) message2 = strdup(message);
74+
else {
75+
char c = this->at(-1);
76+
asprintf(&message2, "unexpected '%s%c'", needs_escape(c) ? "\\" : "", escape(c));
77+
}
78+
token* foo = this->make_token(ERROR, message2);
79+
free(message2);
80+
return foo;
81+
}
682

783
}

cpp/pickle.hpp

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,92 @@
11
#pragma once
22

33
#include "tinobsy/tinobsy.hpp"
4+
#include <cstdlib>
5+
#include <cctype>
6+
#include <cstdint>
7+
#include <cstring>
8+
#include <csetjmp>
49

510
namespace pickle {
611

12+
char escape(char c);
13+
char unescape(char c);
14+
bool needs_escape(char c);
15+
16+
class loc {
17+
loc(size_t line, size_t col);
18+
public:
19+
size_t line;
20+
size_t col;
21+
friend class tokenizer;
22+
friend class token;
23+
};
24+
25+
typedef enum {
26+
ERROR,
27+
STRING,
28+
PAREN,
29+
EOL,
30+
SYMBOL
31+
} token_type;
32+
33+
class token {
34+
token(token_type type, char* content, loc start, loc end, char* filename, char* message);
35+
36+
public:
37+
token_type type;
38+
char* content;
39+
loc start;
40+
loc end;
41+
char* filename;
42+
char* message;
43+
44+
~token();
45+
46+
friend class tokenizer;
47+
};
48+
749
// Tokenizer
8-
class
50+
class tokenizer {
51+
size_t bi;
52+
size_t i;
53+
size_t len;
54+
token* last_token;
55+
char* buffer;
56+
size_t bufsz;
57+
size_t buflen;
58+
void append_to_buffer(char c);
59+
60+
token* error_token(char* message = NULL);
61+
token* make_token(token_type type, char* message);
62+
loc current_loc();
63+
bool test_str(char* what);
64+
bool test_any(char* what);
65+
bool test(char what);
66+
bool done();
67+
void advance(ssize_t i = 1);
68+
char at(ssize_t i = 0);
69+
char* str_at(ssize_t i = 0);
70+
71+
bool try_colon_block();
72+
bool try_block_comment();
73+
bool try_line_comment();
74+
bool try_paren();
75+
bool try_space();
76+
bool try_eol();
77+
bool try_symbol();
78+
bool try_curly_string();
79+
bool try_quote_string();
80+
81+
public:
82+
char* filename;
83+
char* stream;
84+
85+
tokenizer(const char* stream, const char* filename = "");
86+
~tokenizer();
87+
88+
token* next_token();
89+
};
990

1091

1192

0 commit comments

Comments
 (0)
0