mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
some rename
This commit is contained in:
parent
c6185c3d9c
commit
4542f23143
@ -10,27 +10,28 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct pk_SStream {
|
typedef struct c11_sbuf {
|
||||||
c11_vector data;
|
c11_vector data;
|
||||||
} pk_SStream;
|
} c11_sbuf;
|
||||||
|
|
||||||
void pk_SStream__ctor(pk_SStream* self);
|
void c11_sbuf__ctor(c11_sbuf* self);
|
||||||
void pk_SStream__dtor(pk_SStream* self);
|
void c11_sbuf__dtor(c11_sbuf* self);
|
||||||
|
|
||||||
void pk_SStream__write_int(pk_SStream* self, int);
|
void c11_sbuf__write_int(c11_sbuf* self, int);
|
||||||
void pk_SStream__write_i64(pk_SStream* self, int64_t);
|
void c11_sbuf__write_i64(c11_sbuf* self, int64_t);
|
||||||
void pk_SStream__write_f64(pk_SStream* self, double, int precision);
|
void c11_sbuf__write_f64(c11_sbuf* self, double, int precision);
|
||||||
void pk_SStream__write_char(pk_SStream* self, char);
|
void c11_sbuf__write_char(c11_sbuf* self, char);
|
||||||
void pk_SStream__write_sv(pk_SStream* self, c11_sv);
|
void c11_sbuf__write_sv(c11_sbuf* self, c11_sv);
|
||||||
void pk_SStream__write_cstr(pk_SStream* self, const char*);
|
void c11_sbuf__write_cstr(c11_sbuf* self, const char*);
|
||||||
void pk_SStream__write_cstrn(pk_SStream* self, const char*, int);
|
void c11_sbuf__write_cstrn(c11_sbuf* self, const char*, int);
|
||||||
void pk_SStream__write_hex(pk_SStream* self, unsigned char, bool non_zero);
|
void c11_sbuf__write_quoted(c11_sbuf* self, c11_sv, char quote);
|
||||||
void pk_SStream__write_ptr(pk_SStream* self, void*);
|
void c11_sbuf__write_hex(c11_sbuf* self, unsigned char, bool non_zero);
|
||||||
|
void c11_sbuf__write_ptr(c11_sbuf* self, void*);
|
||||||
// Submit the stream and return the final string. The stream becomes invalid after this call
|
// Submit the stream and return the final string. The stream becomes invalid after this call
|
||||||
c11_string* pk_SStream__submit(pk_SStream* self);
|
c11_string* c11_sbuf__submit(c11_sbuf* self);
|
||||||
|
|
||||||
void pk_vsprintf(pk_SStream* ss, const char* fmt, va_list args);
|
void pk_vsprintf(c11_sbuf* ss, const char* fmt, va_list args);
|
||||||
void pk_sprintf(pk_SStream* ss, const char* fmt, ...);
|
void pk_sprintf(c11_sbuf* ss, const char* fmt, ...);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,6 @@ c11_sv c11_string__u8_getitem(c11_string* self, int i);
|
|||||||
c11_string* c11_string__u8_slice(c11_string* self, int start, int stop, int step);
|
c11_string* c11_string__u8_slice(c11_string* self, int start, int stop, int step);
|
||||||
|
|
||||||
// general string operations
|
// general string operations
|
||||||
void c11_sv__quote(c11_sv sv, char quote, c11_vector* buf);
|
|
||||||
void c11_sv__lower(c11_sv sv, c11_vector* buf);
|
void c11_sv__lower(c11_sv sv, c11_vector* buf);
|
||||||
void c11_sv__upper(c11_sv sv, c11_vector* buf);
|
void c11_sv__upper(c11_sv sv, c11_vector* buf);
|
||||||
c11_sv c11_sv__slice(c11_sv sv, int start);
|
c11_sv c11_sv__slice(c11_sv sv, int start);
|
||||||
|
@ -320,15 +320,16 @@ bool py_checktype(const py_Ref self, py_Type type);
|
|||||||
/// %i: py_i64 (int64_t)
|
/// %i: py_i64 (int64_t)
|
||||||
/// %f: py_f64 (double)
|
/// %f: py_f64 (double)
|
||||||
/// %s: const char*
|
/// %s: const char*
|
||||||
/// %q: single quoted %s
|
/// %q: c11_sv
|
||||||
|
/// %v: c11_sv
|
||||||
/// %c: char
|
/// %c: char
|
||||||
/// %p: void*
|
/// %p: void*
|
||||||
/// %t: py_Type
|
/// %t: py_Type
|
||||||
/// %n: py_Name
|
/// %n: py_Name
|
||||||
|
|
||||||
|
|
||||||
enum py_MagicMethods{
|
enum py_MagicNames{
|
||||||
py_MagicMethods__NULL, // 0 is reserved
|
py_MagicNames__NULL, // 0 is reserved
|
||||||
#define MAGIC_METHOD(x) x,
|
#define MAGIC_METHOD(x) x,
|
||||||
#include "pocketpy/xmacros/magics.h"
|
#include "pocketpy/xmacros/magics.h"
|
||||||
#undef MAGIC_METHOD
|
#undef MAGIC_METHOD
|
||||||
|
@ -17,15 +17,15 @@ static void pk_SourceData__ctor(struct pk_SourceData* self,
|
|||||||
// Skip utf8 BOM if there is any.
|
// Skip utf8 BOM if there is any.
|
||||||
if(strncmp(source, "\xEF\xBB\xBF", 3) == 0) source += 3;
|
if(strncmp(source, "\xEF\xBB\xBF", 3) == 0) source += 3;
|
||||||
// Drop all '\r'
|
// Drop all '\r'
|
||||||
pk_SStream ss;
|
c11_sbuf ss;
|
||||||
pk_SStream__ctor(&ss);
|
c11_sbuf__ctor(&ss);
|
||||||
while(true) {
|
while(true) {
|
||||||
char c = *source;
|
char c = *source;
|
||||||
if(c == '\0') break;
|
if(c == '\0') break;
|
||||||
if(c != '\r') pk_SStream__write_char(&ss, c);
|
if(c != '\r') c11_sbuf__write_char(&ss, c);
|
||||||
source++;
|
source++;
|
||||||
}
|
}
|
||||||
self->source = pk_SStream__submit(&ss);
|
self->source = c11_sbuf__submit(&ss);
|
||||||
self->is_precompiled = (strncmp(source, "pkpy:", 5) == 0);
|
self->is_precompiled = (strncmp(source, "pkpy:", 5) == 0);
|
||||||
c11_vector__push(const char*, &self->line_starts, self->source->data);
|
c11_vector__push(const char*, &self->line_starts, self->source->data);
|
||||||
}
|
}
|
||||||
@ -74,37 +74,37 @@ c11_string* pk_SourceData__snapshot(const struct pk_SourceData* self,
|
|||||||
int lineno,
|
int lineno,
|
||||||
const char* cursor,
|
const char* cursor,
|
||||||
const char* name) {
|
const char* name) {
|
||||||
pk_SStream ss;
|
c11_sbuf ss;
|
||||||
pk_SStream__ctor(&ss);
|
c11_sbuf__ctor(&ss);
|
||||||
|
|
||||||
pk_sprintf(&ss, " File \"%s\", line %d", self->filename->data, lineno);
|
pk_sprintf(&ss, " File \"%s\", line %d", self->filename->data, lineno);
|
||||||
|
|
||||||
if(name && *name) {
|
if(name && *name) {
|
||||||
pk_SStream__write_cstr(&ss, ", in ");
|
c11_sbuf__write_cstr(&ss, ", in ");
|
||||||
pk_SStream__write_cstr(&ss, name);
|
c11_sbuf__write_cstr(&ss, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!self->is_precompiled) {
|
if(!self->is_precompiled) {
|
||||||
pk_SStream__write_char(&ss, '\n');
|
c11_sbuf__write_char(&ss, '\n');
|
||||||
const char *st = NULL, *ed;
|
const char *st = NULL, *ed;
|
||||||
if(pk_SourceData__get_line(self, lineno, &st, &ed)) {
|
if(pk_SourceData__get_line(self, lineno, &st, &ed)) {
|
||||||
while(st < ed && isblank(*st))
|
while(st < ed && isblank(*st))
|
||||||
++st;
|
++st;
|
||||||
if(st < ed) {
|
if(st < ed) {
|
||||||
pk_SStream__write_cstr(&ss, " ");
|
c11_sbuf__write_cstr(&ss, " ");
|
||||||
pk_SStream__write_cstrn(&ss, st, ed - st);
|
c11_sbuf__write_cstrn(&ss, st, ed - st);
|
||||||
if(cursor && st <= cursor && cursor <= ed) {
|
if(cursor && st <= cursor && cursor <= ed) {
|
||||||
pk_SStream__write_cstr(&ss, "\n ");
|
c11_sbuf__write_cstr(&ss, "\n ");
|
||||||
for(int i = 0; i < (cursor - st); ++i)
|
for(int i = 0; i < (cursor - st); ++i)
|
||||||
pk_SStream__write_char(&ss, ' ');
|
c11_sbuf__write_char(&ss, ' ');
|
||||||
pk_SStream__write_cstr(&ss, "^");
|
c11_sbuf__write_cstr(&ss, "^");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
st = NULL;
|
st = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!st) { pk_SStream__write_cstr(&ss, " <?>"); }
|
if(!st) { c11_sbuf__write_cstr(&ss, " <?>"); }
|
||||||
}
|
}
|
||||||
return pk_SStream__submit(&ss);
|
return c11_sbuf__submit(&ss);
|
||||||
}
|
}
|
||||||
|
@ -12,37 +12,37 @@
|
|||||||
|
|
||||||
const static int C11_STRING_HEADER_SIZE = sizeof(c11_string);
|
const static int C11_STRING_HEADER_SIZE = sizeof(c11_string);
|
||||||
|
|
||||||
void pk_SStream__ctor(pk_SStream* self) {
|
void c11_sbuf__ctor(c11_sbuf* self) {
|
||||||
c11_vector__ctor(&self->data, sizeof(char));
|
c11_vector__ctor(&self->data, sizeof(char));
|
||||||
c11_vector__reserve(&self->data, 100 + C11_STRING_HEADER_SIZE);
|
c11_vector__reserve(&self->data, 100 + C11_STRING_HEADER_SIZE);
|
||||||
self->data.count = C11_STRING_HEADER_SIZE;
|
self->data.count = C11_STRING_HEADER_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pk_SStream__dtor(pk_SStream* self) { c11_vector__dtor(&self->data); }
|
void c11_sbuf__dtor(c11_sbuf* self) { c11_vector__dtor(&self->data); }
|
||||||
|
|
||||||
void pk_SStream__write_char(pk_SStream* self, char c) { c11_vector__push(char, &self->data, c); }
|
void c11_sbuf__write_char(c11_sbuf* self, char c) { c11_vector__push(char, &self->data, c); }
|
||||||
|
|
||||||
void pk_SStream__write_int(pk_SStream* self, int i) {
|
void c11_sbuf__write_int(c11_sbuf* self, int i) {
|
||||||
// len('-2147483648') == 11
|
// len('-2147483648') == 11
|
||||||
c11_vector__reserve(&self->data, self->data.count + 11 + 1);
|
c11_vector__reserve(&self->data, self->data.count + 11 + 1);
|
||||||
int n = snprintf(self->data.data, 11 + 1, "%d", i);
|
int n = snprintf(self->data.data, 11 + 1, "%d", i);
|
||||||
self->data.count += n;
|
self->data.count += n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pk_SStream__write_i64(pk_SStream* self, int64_t val) {
|
void c11_sbuf__write_i64(c11_sbuf* self, int64_t val) {
|
||||||
// len('-9223372036854775808') == 20
|
// len('-9223372036854775808') == 20
|
||||||
c11_vector__reserve(&self->data, self->data.count + 20 + 1);
|
c11_vector__reserve(&self->data, self->data.count + 20 + 1);
|
||||||
int n = snprintf(self->data.data, 20 + 1, "%lld", (long long)val);
|
int n = snprintf(self->data.data, 20 + 1, "%lld", (long long)val);
|
||||||
self->data.count += n;
|
self->data.count += n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pk_SStream__write_f64(pk_SStream* self, double val, int precision) {
|
void c11_sbuf__write_f64(c11_sbuf* self, double val, int precision) {
|
||||||
if(isinf(val)) {
|
if(isinf(val)) {
|
||||||
pk_SStream__write_cstr(self, val > 0 ? "inf" : "-inf");
|
c11_sbuf__write_cstr(self, val > 0 ? "inf" : "-inf");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(isnan(val)) {
|
if(isnan(val)) {
|
||||||
pk_SStream__write_cstr(self, "nan");
|
c11_sbuf__write_cstr(self, "nan");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
char b[32];
|
char b[32];
|
||||||
@ -54,7 +54,7 @@ void pk_SStream__write_f64(pk_SStream* self, double val, int precision) {
|
|||||||
int prec = precision;
|
int prec = precision;
|
||||||
size = snprintf(b, sizeof(b), "%.*f", prec, val);
|
size = snprintf(b, sizeof(b), "%.*f", prec, val);
|
||||||
}
|
}
|
||||||
pk_SStream__write_cstr(self, b);
|
c11_sbuf__write_cstr(self, b);
|
||||||
bool all_is_digit = true;
|
bool all_is_digit = true;
|
||||||
for(int i = 1; i < size; i++) {
|
for(int i = 1; i < size; i++) {
|
||||||
if(!isdigit(b[i])) {
|
if(!isdigit(b[i])) {
|
||||||
@ -62,49 +62,78 @@ void pk_SStream__write_f64(pk_SStream* self, double val, int precision) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(all_is_digit) pk_SStream__write_cstr(self, ".0");
|
if(all_is_digit) c11_sbuf__write_cstr(self, ".0");
|
||||||
}
|
}
|
||||||
|
|
||||||
void pk_SStream__write_sv(pk_SStream* self, c11_sv sv) {
|
void c11_sbuf__write_sv(c11_sbuf* self, c11_sv sv) {
|
||||||
pk_SStream__write_cstrn(self, sv.data, sv.size);
|
c11_sbuf__write_cstrn(self, sv.data, sv.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pk_SStream__write_cstr(pk_SStream* self, const char* str) {
|
void c11_sbuf__write_cstr(c11_sbuf* self, const char* str) {
|
||||||
pk_SStream__write_cstrn(self, str, strlen(str));
|
c11_sbuf__write_cstrn(self, str, strlen(str));
|
||||||
}
|
}
|
||||||
|
|
||||||
void pk_SStream__write_cstrn(pk_SStream* self, const char* str, int n) {
|
void c11_sbuf__write_cstrn(c11_sbuf* self, const char* str, int n) {
|
||||||
c11_vector__extend(char, &self->data, str, n);
|
c11_vector__extend(char, &self->data, str, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pk_SStream__write_hex(pk_SStream* self, unsigned char c, bool non_zero) {
|
void c11_sbuf__write_quoted(c11_sbuf* self, c11_sv sv, char quote) {
|
||||||
|
assert(quote == '"' || quote == '\'');
|
||||||
|
c11_sbuf__write_char(self, quote);
|
||||||
|
for(int i = 0; i < sv.size; i++) {
|
||||||
|
char c = sv.data[i];
|
||||||
|
switch(c) {
|
||||||
|
case '"':
|
||||||
|
case '\'':
|
||||||
|
if(c == quote) c11_sbuf__write_char(self, '\\');
|
||||||
|
c11_sbuf__write_char(self, c);
|
||||||
|
break;
|
||||||
|
case '\\': c11_sbuf__write_cstrn(self, "\\\\", 2); break;
|
||||||
|
case '\n': c11_sbuf__write_cstrn(self, "\\n", 2); break;
|
||||||
|
case '\r': c11_sbuf__write_cstrn(self, "\\r", 2); break;
|
||||||
|
case '\t': c11_sbuf__write_cstrn(self, "\\t", 2); break;
|
||||||
|
case '\b': c11_sbuf__write_cstrn(self, "\\b", 2); break;
|
||||||
|
default:
|
||||||
|
if('\x00' <= c && c <= '\x1f') {
|
||||||
|
c11_sbuf__write_cstrn(self, "\\x", 2);
|
||||||
|
c11_sbuf__write_char(self, PK_HEX_TABLE[c >> 4]);
|
||||||
|
c11_sbuf__write_char(self, PK_HEX_TABLE[c & 0xf]);
|
||||||
|
} else {
|
||||||
|
c11_sbuf__write_char(self, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c11_sbuf__write_char(self, quote);
|
||||||
|
}
|
||||||
|
|
||||||
|
void c11_sbuf__write_hex(c11_sbuf* self, unsigned char c, bool non_zero) {
|
||||||
unsigned char high = c >> 4;
|
unsigned char high = c >> 4;
|
||||||
unsigned char low = c & 0xf;
|
unsigned char low = c & 0xf;
|
||||||
if(non_zero) {
|
if(non_zero) {
|
||||||
if(high) pk_SStream__write_char(self, PK_HEX_TABLE[high]);
|
if(high) c11_sbuf__write_char(self, PK_HEX_TABLE[high]);
|
||||||
if(high || low) pk_SStream__write_char(self, PK_HEX_TABLE[low]);
|
if(high || low) c11_sbuf__write_char(self, PK_HEX_TABLE[low]);
|
||||||
} else {
|
} else {
|
||||||
pk_SStream__write_char(self, PK_HEX_TABLE[high]);
|
c11_sbuf__write_char(self, PK_HEX_TABLE[high]);
|
||||||
pk_SStream__write_char(self, PK_HEX_TABLE[low]);
|
c11_sbuf__write_char(self, PK_HEX_TABLE[low]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void pk_SStream__write_ptr(pk_SStream* self, void* p) {
|
void c11_sbuf__write_ptr(c11_sbuf* self, void* p) {
|
||||||
if(p == NULL) {
|
if(p == NULL) {
|
||||||
pk_SStream__write_cstr(self, "0x0");
|
c11_sbuf__write_cstr(self, "0x0");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pk_SStream__write_cstr(self, "0x");
|
c11_sbuf__write_cstr(self, "0x");
|
||||||
uintptr_t p_t = (uintptr_t)(p);
|
uintptr_t p_t = (uintptr_t)(p);
|
||||||
bool non_zero = true;
|
bool non_zero = true;
|
||||||
for(int i = sizeof(void*) - 1; i >= 0; i--) {
|
for(int i = sizeof(void*) - 1; i >= 0; i--) {
|
||||||
unsigned char cpnt = (p_t >> (i * 8)) & 0xff;
|
unsigned char cpnt = (p_t >> (i * 8)) & 0xff;
|
||||||
pk_SStream__write_hex(self, cpnt, non_zero);
|
c11_sbuf__write_hex(self, cpnt, non_zero);
|
||||||
if(cpnt != 0) non_zero = false;
|
if(cpnt != 0) non_zero = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
c11_string* pk_SStream__submit(pk_SStream* self) {
|
c11_string* c11_sbuf__submit(c11_sbuf* self) {
|
||||||
c11_vector__push(char, &self->data, '\0');
|
c11_vector__push(char, &self->data, '\0');
|
||||||
c11_array arr = c11_vector__submit(&self->data);
|
c11_array arr = c11_vector__submit(&self->data);
|
||||||
c11_string* retval = (c11_string*)arr.data;
|
c11_string* retval = (c11_string*)arr.data;
|
||||||
@ -112,11 +141,11 @@ c11_string* pk_SStream__submit(pk_SStream* self) {
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pk_vsprintf(pk_SStream* ss, const char* fmt, va_list args) {
|
void pk_vsprintf(c11_sbuf* ss, const char* fmt, va_list args) {
|
||||||
while(fmt) {
|
while(fmt) {
|
||||||
char c = *fmt;
|
char c = *fmt;
|
||||||
if(c != '%') {
|
if(c != '%') {
|
||||||
pk_SStream__write_char(ss, c);
|
c11_sbuf__write_char(ss, c);
|
||||||
fmt++;
|
fmt++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -127,53 +156,57 @@ void pk_vsprintf(pk_SStream* ss, const char* fmt, va_list args) {
|
|||||||
switch(c) {
|
switch(c) {
|
||||||
case 'd': {
|
case 'd': {
|
||||||
int i = va_arg(args, int);
|
int i = va_arg(args, int);
|
||||||
pk_SStream__write_int(ss, i);
|
c11_sbuf__write_int(ss, i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'i': {
|
case 'i': {
|
||||||
int64_t i = va_arg(args, int64_t);
|
int64_t i = va_arg(args, int64_t);
|
||||||
pk_SStream__write_i64(ss, i);
|
c11_sbuf__write_i64(ss, i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'f': {
|
case 'f': {
|
||||||
double d = va_arg(args, double);
|
double d = va_arg(args, double);
|
||||||
pk_SStream__write_f64(ss, d, -1);
|
c11_sbuf__write_f64(ss, d, -1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 's': {
|
case 's': {
|
||||||
const char* s = va_arg(args, const char*);
|
const char* s = va_arg(args, const char*);
|
||||||
pk_SStream__write_cstr(ss, s);
|
c11_sbuf__write_cstr(ss, s);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'q': {
|
case 'q': {
|
||||||
const char* s = va_arg(args, const char*);
|
c11_sv sv = va_arg(args, c11_sv);
|
||||||
c11_sv sv = {s, strlen(s)};
|
c11_sbuf__write_quoted(ss, sv, '\'');
|
||||||
c11_sv__quote(sv, '\'', &ss->data);
|
break;
|
||||||
|
}
|
||||||
|
case 'v': {
|
||||||
|
c11_sv sv = va_arg(args, c11_sv);
|
||||||
|
c11_sbuf__write_sv(ss, sv);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'c': {
|
case 'c': {
|
||||||
char c = va_arg(args, int);
|
char c = va_arg(args, int);
|
||||||
pk_SStream__write_char(ss, c);
|
c11_sbuf__write_char(ss, c);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'p': {
|
case 'p': {
|
||||||
void* p = va_arg(args, void*);
|
void* p = va_arg(args, void*);
|
||||||
pk_SStream__write_ptr(ss, p);
|
c11_sbuf__write_ptr(ss, p);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 't': {
|
case 't': {
|
||||||
py_Type t = va_arg(args, int);
|
py_Type t = va_arg(args, int);
|
||||||
pk_SStream__write_cstr(ss, py_tpname(t));
|
c11_sbuf__write_cstr(ss, py_tpname(t));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'n': {
|
case 'n': {
|
||||||
py_Name n = va_arg(args, int);
|
py_Name n = va_arg(args, int);
|
||||||
pk_SStream__write_cstr(ss, py_name2str(n));
|
c11_sbuf__write_cstr(ss, py_name2str(n));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case '%': pk_SStream__write_char(ss, '%'); break;
|
case '%': c11_sbuf__write_char(ss, '%'); break;
|
||||||
default:
|
default:
|
||||||
pk_SStream__write_char(ss, c);
|
c11_sbuf__write_char(ss, c);
|
||||||
assert(false); // invalid format
|
assert(false); // invalid format
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -181,7 +214,7 @@ void pk_vsprintf(pk_SStream* ss, const char* fmt, va_list args) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void pk_sprintf(pk_SStream* ss, const char* fmt, ...) {
|
void pk_sprintf(c11_sbuf* ss, const char* fmt, ...) {
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
pk_vsprintf(ss, fmt, args);
|
pk_vsprintf(ss, fmt, args);
|
||||||
|
@ -58,46 +58,17 @@ c11_sv c11_string__u8_getitem(c11_string* self, int i) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
c11_string* c11_string__u8_slice(c11_string* self, int start, int stop, int step) {
|
c11_string* c11_string__u8_slice(c11_string* self, int start, int stop, int step) {
|
||||||
pk_SStream ss;
|
c11_sbuf ss;
|
||||||
pk_SStream__ctor(&ss);
|
c11_sbuf__ctor(&ss);
|
||||||
assert(step != 0);
|
assert(step != 0);
|
||||||
for(int i = start; step > 0 ? i < stop : i > stop; i += step) {
|
for(int i = start; step > 0 ? i < stop : i > stop; i += step) {
|
||||||
c11_sv unicode = c11_string__u8_getitem(self, i);
|
c11_sv unicode = c11_string__u8_getitem(self, i);
|
||||||
pk_SStream__write_sv(&ss, unicode);
|
c11_sbuf__write_sv(&ss, unicode);
|
||||||
}
|
}
|
||||||
return pk_SStream__submit(&ss);
|
return c11_sbuf__submit(&ss);
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////
|
/////////////////////////////////////////
|
||||||
void c11_sv__quote(c11_sv sv, char quote, c11_vector* buf) {
|
|
||||||
assert(quote == '"' || quote == '\'');
|
|
||||||
c11_vector__push(char, buf, quote);
|
|
||||||
for(int i = 0; i < sv.size; i++) {
|
|
||||||
char c = sv.data[i];
|
|
||||||
switch(c) {
|
|
||||||
case '"':
|
|
||||||
case '\'':
|
|
||||||
if(c == quote) c11_vector__push(char, buf, '\\');
|
|
||||||
c11_vector__push(char, buf, c);
|
|
||||||
break;
|
|
||||||
case '\\': c11_vector__extend(char, buf, "\\\\", 2); break;
|
|
||||||
case '\n': c11_vector__extend(char, buf, "\\n", 2); break;
|
|
||||||
case '\r': c11_vector__extend(char, buf, "\\r", 2); break;
|
|
||||||
case '\t': c11_vector__extend(char, buf, "\\t", 2); break;
|
|
||||||
case '\b': c11_vector__extend(char, buf, "\\b", 2); break;
|
|
||||||
default:
|
|
||||||
if('\x00' <= c && c <= '\x1f') {
|
|
||||||
c11_vector__extend(char, buf, "\\x", 2);
|
|
||||||
c11_vector__push(char, buf, PK_HEX_TABLE[c >> 4]);
|
|
||||||
c11_vector__push(char, buf, PK_HEX_TABLE[c & 0xf]);
|
|
||||||
} else {
|
|
||||||
c11_vector__push(char, buf, c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
c11_vector__push(char, buf, quote);
|
|
||||||
}
|
|
||||||
|
|
||||||
void c11_sv__lower(c11_sv sv, c11_vector* buf) {
|
void c11_sv__lower(c11_sv sv, c11_vector* buf) {
|
||||||
for(int i = 0; i < sv.size; i++) {
|
for(int i = 0; i < sv.size; i++) {
|
||||||
char c = sv.data[i];
|
char c = sv.data[i];
|
||||||
|
@ -276,13 +276,13 @@ static Error* eat_name(pk_Lexer* self){
|
|||||||
static Error* eat_string_until(pk_Lexer* self, char quote, bool raw, c11_string** out) {
|
static Error* eat_string_until(pk_Lexer* self, char quote, bool raw, c11_string** out) {
|
||||||
// previous char is quote
|
// previous char is quote
|
||||||
bool quote3 = match_n_chars(self, 2, quote);
|
bool quote3 = match_n_chars(self, 2, quote);
|
||||||
pk_SStream buff;
|
c11_sbuf buff;
|
||||||
pk_SStream__ctor(&buff);
|
c11_sbuf__ctor(&buff);
|
||||||
while(true) {
|
while(true) {
|
||||||
char c = eatchar_include_newline(self);
|
char c = eatchar_include_newline(self);
|
||||||
if(c == quote) {
|
if(c == quote) {
|
||||||
if(quote3 && !match_n_chars(self, 2, quote)) {
|
if(quote3 && !match_n_chars(self, 2, quote)) {
|
||||||
pk_SStream__write_char(&buff, c);
|
c11_sbuf__write_char(&buff, c);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -297,34 +297,34 @@ static Error* eat_string_until(pk_Lexer* self, char quote, bool raw, c11_string*
|
|||||||
if(!quote3)
|
if(!quote3)
|
||||||
return SyntaxError("EOL while scanning string literal");
|
return SyntaxError("EOL while scanning string literal");
|
||||||
else {
|
else {
|
||||||
pk_SStream__write_char(&buff, c);
|
c11_sbuf__write_char(&buff, c);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!raw && c == '\\') {
|
if(!raw && c == '\\') {
|
||||||
switch(eatchar_include_newline(self)) {
|
switch(eatchar_include_newline(self)) {
|
||||||
case '"': pk_SStream__write_char(&buff, '"'); break;
|
case '"': c11_sbuf__write_char(&buff, '"'); break;
|
||||||
case '\'': pk_SStream__write_char(&buff, '\''); break;
|
case '\'': c11_sbuf__write_char(&buff, '\''); break;
|
||||||
case '\\': pk_SStream__write_char(&buff, '\\'); break;
|
case '\\': c11_sbuf__write_char(&buff, '\\'); break;
|
||||||
case 'n': pk_SStream__write_char(&buff, '\n'); break;
|
case 'n': c11_sbuf__write_char(&buff, '\n'); break;
|
||||||
case 'r': pk_SStream__write_char(&buff, '\r'); break;
|
case 'r': c11_sbuf__write_char(&buff, '\r'); break;
|
||||||
case 't': pk_SStream__write_char(&buff, '\t'); break;
|
case 't': c11_sbuf__write_char(&buff, '\t'); break;
|
||||||
case 'b': pk_SStream__write_char(&buff, '\b'); break;
|
case 'b': c11_sbuf__write_char(&buff, '\b'); break;
|
||||||
case 'x': {
|
case 'x': {
|
||||||
char hex[3] = {eatchar(self), eatchar(self), '\0'};
|
char hex[3] = {eatchar(self), eatchar(self), '\0'};
|
||||||
int code;
|
int code;
|
||||||
if(sscanf(hex, "%x", &code) != 1) {
|
if(sscanf(hex, "%x", &code) != 1) {
|
||||||
return SyntaxError("invalid hex char");
|
return SyntaxError("invalid hex char");
|
||||||
}
|
}
|
||||||
pk_SStream__write_char(&buff, (char)code);
|
c11_sbuf__write_char(&buff, (char)code);
|
||||||
} break;
|
} break;
|
||||||
default: return SyntaxError("invalid escape char");
|
default: return SyntaxError("invalid escape char");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pk_SStream__write_char(&buff, c);
|
c11_sbuf__write_char(&buff, c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*out = pk_SStream__submit(&buff);
|
*out = c11_sbuf__submit(&buff);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -654,14 +654,14 @@ Error* pk_Lexer__process_and_dump(pk_SourceData_ src, c11_string** out) {
|
|||||||
Error* err = pk_Lexer__process(src, &nexts);
|
Error* err = pk_Lexer__process(src, &nexts);
|
||||||
if(err) return err;
|
if(err) return err;
|
||||||
|
|
||||||
pk_SStream ss;
|
c11_sbuf ss;
|
||||||
pk_SStream__ctor(&ss);
|
c11_sbuf__ctor(&ss);
|
||||||
|
|
||||||
// L1: version string
|
// L1: version string
|
||||||
pk_SStream__write_cstr(&ss, "pkpy:" PK_VERSION "\n");
|
c11_sbuf__write_cstr(&ss, "pkpy:" PK_VERSION "\n");
|
||||||
// L2: mode
|
// L2: mode
|
||||||
pk_SStream__write_int(&ss, (int)src->mode);
|
c11_sbuf__write_int(&ss, (int)src->mode);
|
||||||
pk_SStream__write_char(&ss, '\n');
|
c11_sbuf__write_char(&ss, '\n');
|
||||||
|
|
||||||
c11_smallmap_s2n token_indices;
|
c11_smallmap_s2n token_indices;
|
||||||
c11_smallmap_s2n__ctor(&token_indices);
|
c11_smallmap_s2n__ctor(&token_indices);
|
||||||
@ -675,71 +675,71 @@ Error* pk_Lexer__process_and_dump(pk_SourceData_ src, c11_string** out) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// L3: raw string count
|
// L3: raw string count
|
||||||
pk_SStream__write_char(&ss, '=');
|
c11_sbuf__write_char(&ss, '=');
|
||||||
pk_SStream__write_int(&ss, token_indices.count);
|
c11_sbuf__write_int(&ss, token_indices.count);
|
||||||
pk_SStream__write_char(&ss, '\n');
|
c11_sbuf__write_char(&ss, '\n');
|
||||||
|
|
||||||
uint16_t index = 0;
|
uint16_t index = 0;
|
||||||
for(int i=0; i<token_indices.count; i++){
|
for(int i=0; i<token_indices.count; i++){
|
||||||
c11_smallmap_s2n_KV* kv = c11__at(c11_smallmap_s2n_KV, &token_indices, i);
|
c11_smallmap_s2n_KV* kv = c11__at(c11_smallmap_s2n_KV, &token_indices, i);
|
||||||
// L4: raw strings
|
// L4: raw strings
|
||||||
pk_SStream__write_cstrn(&ss, kv->key.data, kv->key.size);
|
c11_sbuf__write_cstrn(&ss, kv->key.data, kv->key.size);
|
||||||
kv->value = index++;
|
kv->value = index++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// L5: token count
|
// L5: token count
|
||||||
pk_SStream__write_char(&ss, '=');
|
c11_sbuf__write_char(&ss, '=');
|
||||||
pk_SStream__write_int(&ss, nexts.count);
|
c11_sbuf__write_int(&ss, nexts.count);
|
||||||
pk_SStream__write_char(&ss, '\n');
|
c11_sbuf__write_char(&ss, '\n');
|
||||||
|
|
||||||
for(int i = 0; i < nexts.count; i++) {
|
for(int i = 0; i < nexts.count; i++) {
|
||||||
const Token* token = c11__at(Token, &nexts, i);
|
const Token* token = c11__at(Token, &nexts, i);
|
||||||
pk_SStream__write_int(&ss, (int)token->type);
|
c11_sbuf__write_int(&ss, (int)token->type);
|
||||||
pk_SStream__write_char(&ss, ',');
|
c11_sbuf__write_char(&ss, ',');
|
||||||
|
|
||||||
if(is_raw_string_used(token->type)) {
|
if(is_raw_string_used(token->type)) {
|
||||||
uint16_t *p = c11_smallmap_s2n__try_get(
|
uint16_t *p = c11_smallmap_s2n__try_get(
|
||||||
&token_indices, (c11_sv){token->start, token->length});
|
&token_indices, (c11_sv){token->start, token->length});
|
||||||
assert(p != NULL);
|
assert(p != NULL);
|
||||||
pk_SStream__write_int(&ss, (int)*p);
|
c11_sbuf__write_int(&ss, (int)*p);
|
||||||
pk_SStream__write_char(&ss, ',');
|
c11_sbuf__write_char(&ss, ',');
|
||||||
}
|
}
|
||||||
if(i > 0 && c11__getitem(Token, &nexts, i-1).line == token->line){
|
if(i > 0 && c11__getitem(Token, &nexts, i-1).line == token->line){
|
||||||
pk_SStream__write_char(&ss, ',');
|
c11_sbuf__write_char(&ss, ',');
|
||||||
}else{
|
}else{
|
||||||
pk_SStream__write_int(&ss, token->line);
|
c11_sbuf__write_int(&ss, token->line);
|
||||||
pk_SStream__write_char(&ss, ',');
|
c11_sbuf__write_char(&ss, ',');
|
||||||
}
|
}
|
||||||
|
|
||||||
if(i > 0 && c11__getitem(Token, &nexts, i-1).brackets_level == token->brackets_level){
|
if(i > 0 && c11__getitem(Token, &nexts, i-1).brackets_level == token->brackets_level){
|
||||||
pk_SStream__write_char(&ss, ',');
|
c11_sbuf__write_char(&ss, ',');
|
||||||
}else{
|
}else{
|
||||||
pk_SStream__write_int(&ss, token->brackets_level);
|
c11_sbuf__write_int(&ss, token->brackets_level);
|
||||||
pk_SStream__write_char(&ss, ',');
|
c11_sbuf__write_char(&ss, ',');
|
||||||
}
|
}
|
||||||
// visit token value
|
// visit token value
|
||||||
switch(token->value.index){
|
switch(token->value.index){
|
||||||
case TokenValue_EMPTY: break;
|
case TokenValue_EMPTY: break;
|
||||||
case TokenValue_I64:
|
case TokenValue_I64:
|
||||||
pk_SStream__write_char(&ss, 'I');
|
c11_sbuf__write_char(&ss, 'I');
|
||||||
pk_SStream__write_int(&ss, token->value._i64);
|
c11_sbuf__write_int(&ss, token->value._i64);
|
||||||
break;
|
break;
|
||||||
case TokenValue_F64:
|
case TokenValue_F64:
|
||||||
pk_SStream__write_char(&ss, 'F');
|
c11_sbuf__write_char(&ss, 'F');
|
||||||
pk_SStream__write_f64(&ss, token->value._f64, -1);
|
c11_sbuf__write_f64(&ss, token->value._f64, -1);
|
||||||
break;
|
break;
|
||||||
case TokenValue_STR: {
|
case TokenValue_STR: {
|
||||||
pk_SStream__write_char(&ss, 'S');
|
c11_sbuf__write_char(&ss, 'S');
|
||||||
c11_sv sv = c11_string__sv(token->value._str);
|
c11_sv sv = c11_string__sv(token->value._str);
|
||||||
for(int i=0; i<sv.size; i++){
|
for(int i=0; i<sv.size; i++){
|
||||||
pk_SStream__write_hex(&ss, sv.data[i], false);
|
c11_sbuf__write_hex(&ss, sv.data[i], false);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pk_SStream__write_char(&ss, '\n');
|
c11_sbuf__write_char(&ss, '\n');
|
||||||
}
|
}
|
||||||
*out = pk_SStream__submit(&ss);
|
*out = c11_sbuf__submit(&ss);
|
||||||
c11_smallmap_s2n__dtor(&token_indices);
|
c11_smallmap_s2n__dtor(&token_indices);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -803,8 +803,8 @@ c11_sv TokenDeserializer__read_string(TokenDeserializer* self, char c){
|
|||||||
c11_string* TokenDeserializer__read_string_from_hex(TokenDeserializer* self, char c){
|
c11_string* TokenDeserializer__read_string_from_hex(TokenDeserializer* self, char c){
|
||||||
c11_sv sv = TokenDeserializer__read_string(self, c);
|
c11_sv sv = TokenDeserializer__read_string(self, c);
|
||||||
const char* s = sv.data;
|
const char* s = sv.data;
|
||||||
pk_SStream ss;
|
c11_sbuf ss;
|
||||||
pk_SStream__ctor(&ss);
|
c11_sbuf__ctor(&ss);
|
||||||
for(int i = 0; i < sv.size; i += 2) {
|
for(int i = 0; i < sv.size; i += 2) {
|
||||||
char c = 0;
|
char c = 0;
|
||||||
if(s[i] >= '0' && s[i] <= '9')
|
if(s[i] >= '0' && s[i] <= '9')
|
||||||
@ -820,9 +820,9 @@ c11_string* TokenDeserializer__read_string_from_hex(TokenDeserializer* self, cha
|
|||||||
c += s[i + 1] - 'a' + 10;
|
c += s[i + 1] - 'a' + 10;
|
||||||
else
|
else
|
||||||
assert(false);
|
assert(false);
|
||||||
pk_SStream__write_char(&ss, c);
|
c11_sbuf__write_char(&ss, c);
|
||||||
}
|
}
|
||||||
return pk_SStream__submit(&ss);
|
return c11_sbuf__submit(&ss);
|
||||||
}
|
}
|
||||||
|
|
||||||
int TokenDeserializer__read_count(TokenDeserializer* self){
|
int TokenDeserializer__read_count(TokenDeserializer* self){
|
||||||
|
18
src/error.c
18
src/error.c
@ -34,26 +34,26 @@
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
// py_Str pkpy_Exception__summary(pkpy_Exception* self){
|
// py_Str pkpy_Exception__summary(pkpy_Exception* self){
|
||||||
// pk_SStream ss;
|
// c11_sbuf ss;
|
||||||
// pk_SStream__ctor(&ss);
|
// c11_sbuf__ctor(&ss);
|
||||||
|
|
||||||
// if(self->is_re){
|
// if(self->is_re){
|
||||||
// pk_SStream__write_cstr(&ss, "Traceback (most recent call last):\n");
|
// c11_sbuf__write_cstr(&ss, "Traceback (most recent call last):\n");
|
||||||
// }
|
// }
|
||||||
// for(int i=self->stacktrace.count-1; i >= 0; i--) {
|
// for(int i=self->stacktrace.count-1; i >= 0; i--) {
|
||||||
// pkpy_ExceptionFrame* frame = c11__at(pkpy_ExceptionFrame, &self->stacktrace, i);
|
// pkpy_ExceptionFrame* frame = c11__at(pkpy_ExceptionFrame, &self->stacktrace, i);
|
||||||
// py_Str s = pk_SourceData__snapshot(frame->src, frame->lineno, frame->cursor, py_Str__data(&frame->name));
|
// py_Str s = pk_SourceData__snapshot(frame->src, frame->lineno, frame->cursor, py_Str__data(&frame->name));
|
||||||
// pk_SStream__write_Str(&ss, &s);
|
// c11_sbuf__write_Str(&ss, &s);
|
||||||
// py_Str__dtor(&s);
|
// py_Str__dtor(&s);
|
||||||
// pk_SStream__write_cstr(&ss, "\n");
|
// c11_sbuf__write_cstr(&ss, "\n");
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// const char* name = pk_StrName__rmap(self->type);
|
// const char* name = pk_StrName__rmap(self->type);
|
||||||
// pk_SStream__write_cstr(&ss, name);
|
// c11_sbuf__write_cstr(&ss, name);
|
||||||
|
|
||||||
// if(self->msg.size > 0){
|
// if(self->msg.size > 0){
|
||||||
// pk_SStream__write_cstr(&ss, ": ");
|
// c11_sbuf__write_cstr(&ss, ": ");
|
||||||
// pk_SStream__write_Str(&ss, &self->msg);
|
// c11_sbuf__write_Str(&ss, &self->msg);
|
||||||
// }
|
// }
|
||||||
// return pk_SStream__submit(&ss);
|
// return c11_sbuf__submit(&ss);
|
||||||
// }
|
// }
|
@ -485,16 +485,16 @@ pk_FrameResult pk_VM__run_top_frame(pk_VM* self) {
|
|||||||
}
|
}
|
||||||
case OP_BUILD_STRING: {
|
case OP_BUILD_STRING: {
|
||||||
py_TValue* begin = SP() - byte.arg;
|
py_TValue* begin = SP() - byte.arg;
|
||||||
pk_SStream ss;
|
c11_sbuf ss;
|
||||||
pk_SStream__ctor(&ss);
|
c11_sbuf__ctor(&ss);
|
||||||
for(int i = 0; i < byte.arg; i++) {
|
for(int i = 0; i < byte.arg; i++) {
|
||||||
if(!py_str(begin + i)) goto __ERROR;
|
if(!py_str(begin + i)) goto __ERROR;
|
||||||
int size;
|
int size;
|
||||||
const char* data = py_tostrn(&self->last_retval, &size);
|
const char* data = py_tostrn(&self->last_retval, &size);
|
||||||
pk_SStream__write_cstrn(&ss, data, size);
|
c11_sbuf__write_cstrn(&ss, data, size);
|
||||||
}
|
}
|
||||||
SP() = begin;
|
SP() = begin;
|
||||||
c11_string* res = pk_SStream__submit(&ss);
|
c11_string* res = c11_sbuf__submit(&ss);
|
||||||
py_newstrn(SP()++, res->data, res->size);
|
py_newstrn(SP()++, res->data, res->size);
|
||||||
c11_string__delete(res);
|
c11_string__delete(res);
|
||||||
DISPATCH();
|
DISPATCH();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user