Replace heap_strn() with GC_strndup()
This commit is contained in:
parent
87785555ec
commit
cfe46ee393
@ -11,20 +11,10 @@
|
||||
|
||||
public bool USE_COLOR;
|
||||
|
||||
public char *heap_strn(const char *str, size_t len)
|
||||
{
|
||||
if (!str) return NULL;
|
||||
if (len == 0) return "";
|
||||
char *heaped = GC_MALLOC_ATOMIC(len + 1);
|
||||
memcpy(heaped, str, len);
|
||||
heaped[len] = '\0';
|
||||
return heaped;
|
||||
}
|
||||
|
||||
public char *heap_str(const char *str)
|
||||
{
|
||||
if (!str) return NULL;
|
||||
return heap_strn(str, strlen(str));
|
||||
return GC_strndup(str, strlen(str));
|
||||
}
|
||||
|
||||
public char *heap_strf(const char *fmt, ...)
|
||||
@ -35,7 +25,7 @@ public char *heap_strf(const char *fmt, ...)
|
||||
int len = vasprintf(&tmp, fmt, args);
|
||||
if (len < 0) return NULL;
|
||||
va_end(args);
|
||||
char *ret = heap_strn(tmp, (size_t)len);
|
||||
char *ret = GC_strndup(tmp, (size_t)len);
|
||||
free(tmp);
|
||||
return ret;
|
||||
}
|
||||
|
@ -25,7 +25,6 @@
|
||||
|
||||
extern bool USE_COLOR;
|
||||
|
||||
char *heap_strn(const char *str, size_t len);
|
||||
char *heap_str(const char *str);
|
||||
char *heap_strf(const char *fmt, ...);
|
||||
CORD CORD_asprintf(CORD fmt, ...);
|
||||
|
22
parse.c
22
parse.c
@ -165,20 +165,20 @@ const char *unescape(const char **out) {
|
||||
uint8_t buf[bufsize];
|
||||
(void)u32_to_u8(ustr, bufsize, buf, &bufsize);
|
||||
*endpos = endptr;
|
||||
return heap_strn((char*)buf, bufsize);
|
||||
return GC_strndup((char*)buf, bufsize);
|
||||
} else if (escape[1] == 'x' && escape[2] && escape[3]) {
|
||||
char *endptr = NULL;
|
||||
char c = (char)strtol(escape+2, &endptr, 16);
|
||||
*endpos = escape + 4;
|
||||
return heap_strn(&c, 1);
|
||||
return GC_strndup(&c, 1);
|
||||
} else if ('0' <= escape[1] && escape[1] <= '7' && '0' <= escape[2] && escape[2] <= '7' && '0' <= escape[3] && escape[3] <= '7') {
|
||||
char *endptr = NULL;
|
||||
char c = (char)strtol(escape+1, &endptr, 8);
|
||||
*endpos = escape + 4;
|
||||
return heap_strn(&c, 1);
|
||||
return GC_strndup(&c, 1);
|
||||
} else {
|
||||
*endpos = escape + 2;
|
||||
return heap_strn(escape+1, 1);
|
||||
return GC_strndup(escape+1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -356,7 +356,7 @@ const char *get_word(const char **inout) {
|
||||
break;
|
||||
}
|
||||
*inout = (const char*)pos;
|
||||
return heap_strn(word, (size_t)((const char*)pos - word));
|
||||
return GC_strndup(word, (size_t)((const char*)pos - word));
|
||||
}
|
||||
|
||||
const char *get_id(const char **inout) {
|
||||
@ -2015,7 +2015,7 @@ PARSER(parse_inline_c) {
|
||||
CORD c_code = CORD_EMPTY;
|
||||
while (get_indent(ctx, pos) > indent) {
|
||||
size_t line_len = strcspn(pos, "\r\n");
|
||||
c_code = CORD_all(c_code, heap_strn(pos, line_len), "\n");
|
||||
c_code = CORD_all(c_code, GC_strndup(pos, line_len), "\n");
|
||||
pos += line_len;
|
||||
if (whitespace(&pos) == 0) break;
|
||||
}
|
||||
@ -2043,7 +2043,7 @@ PARSER(parse_doctest) {
|
||||
*output_end = pos + strcspn(pos, "\r\n");
|
||||
if (output_end <= output_start)
|
||||
parser_err(ctx, output_start, output_end, "You're missing expected output here");
|
||||
output = heap_strn(output_start, (size_t)(output_end - output_start));
|
||||
output = GC_strndup(output_start, (size_t)(output_end - output_start));
|
||||
pos = output_end;
|
||||
} else {
|
||||
pos = expr->end;
|
||||
@ -2107,7 +2107,7 @@ PARSER(parse_use) {
|
||||
size_t name_len = strcspn(pos, " \t\r\n;");
|
||||
if (name_len < 1)
|
||||
parser_err(ctx, start, pos, "There is no module name here to use");
|
||||
char *name = heap_strn(pos, name_len);
|
||||
char *name = GC_strndup(pos, name_len);
|
||||
pos += name_len;
|
||||
while (match(&pos, ";")) continue;
|
||||
return NewAST(ctx->file, start, pos, Use, .name=name);
|
||||
@ -2120,7 +2120,7 @@ PARSER(parse_import) {
|
||||
size_t path_len = strcspn(pos, " \t\r\n;");
|
||||
if (path_len < 1)
|
||||
parser_err(ctx, start, pos, "There is no path here to import");
|
||||
char *path = heap_strn(pos, path_len);
|
||||
char *path = GC_strndup(pos, path_len);
|
||||
pos += path_len;
|
||||
while (match(&pos, ";")) continue;
|
||||
return NewAST(ctx->file, start, pos, Import, .path=path);
|
||||
@ -2131,7 +2131,7 @@ PARSER(parse_linker) {
|
||||
if (!match_word(&pos, "!link")) return NULL;
|
||||
spaces(&pos);
|
||||
size_t len = strcspn(pos, "\r\n");
|
||||
const char *directive = heap_strn(pos, len);
|
||||
const char *directive = GC_strndup(pos, len);
|
||||
pos += len;
|
||||
return NewAST(ctx->file, start, pos, LinkerDirective, .directive=directive);
|
||||
}
|
||||
@ -2149,7 +2149,7 @@ ast_t *parse_file(const char *path, jmp_buf *on_err) {
|
||||
if (path[0] == '<') {
|
||||
const char *endbracket = strchr(path, '>');
|
||||
if (!endbracket) return NULL;
|
||||
file = spoof_file(heap_strn(path, (size_t)(endbracket + 1 - path)), endbracket + 1);
|
||||
file = spoof_file(GC_strndup(path, (size_t)(endbracket + 1 - path)), endbracket + 1);
|
||||
} else {
|
||||
file = load_file(path);
|
||||
if (!file) return NULL;
|
||||
|
4
tomo.c
4
tomo.c
@ -282,7 +282,7 @@ int main(int argc, char *argv[])
|
||||
if (mode == MODE_COMPILE_EXE || executable_status != 0)
|
||||
return executable_status;
|
||||
|
||||
char *exe_name = heap_strn(filename, strlen(filename) - strlen(".tm"));
|
||||
char *exe_name = GC_strndup(filename, strlen(filename) - strlen(".tm"));
|
||||
int num_args = argc - after_flags - 1;
|
||||
char *prog_args[num_args + 2];
|
||||
prog_args[0] = exe_name;
|
||||
@ -459,7 +459,7 @@ int compile_executable(env_t *base_env, const char *filename, CORD object_files)
|
||||
errx(1, "No main() function has been defined for %s, so it can't be run!", filename);
|
||||
}
|
||||
|
||||
const char *bin_name = heap_strn(filename, strlen(filename) - strlen(".tm"));
|
||||
const char *bin_name = GC_strndup(filename, strlen(filename) - strlen(".tm"));
|
||||
FILE *runner = CORD_RUN(autofmt, " | ", cc, " ", cflags, " ", ldflags, " ", ldlibs, " ", object_files, " -x c - -o ", bin_name);
|
||||
|
||||
CORD program = CORD_all(
|
||||
|
@ -22,7 +22,7 @@ type_t *parse_type_ast(env_t *env, type_ast_t *ast)
|
||||
type_t *t = Table$str_get(*env->types, name);
|
||||
if (t) return t;
|
||||
while (strchr(name, '.')) {
|
||||
char *module_name = heap_strn(name, strcspn(name, "."));
|
||||
char *module_name = GC_strndup(name, strcspn(name, "."));
|
||||
binding_t *b = get_binding(env, module_name);
|
||||
if (!b || b->type->tag != ModuleType)
|
||||
code_err(ast, "I don't know a module with the name '%s'", module_name);
|
||||
@ -139,7 +139,7 @@ static env_t *load_module(env_t *env, ast_t *module_ast)
|
||||
*module_env->libname = (CORD)libname_id;
|
||||
for (int64_t i = 1; i <= files_f->num_lines; i++) {
|
||||
const char *line = get_line(files_f, i);
|
||||
line = heap_strn(line, strcspn(line, "\r\n"));
|
||||
line = GC_strndup(line, strcspn(line, "\r\n"));
|
||||
if (!line || line[0] == '\0') continue;
|
||||
const char *tm_path = resolve_path(line, resolved_path, ".");
|
||||
if (!tm_path) errx(1, "Couldn't find library %s dependency: %s", libname, line);
|
||||
|
Loading…
Reference in New Issue
Block a user