aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-02-12 00:41:49 -0500
committerBruce Hill <bruce@bruce-hill.com>2024-02-12 00:41:49 -0500
commit2c5401aaf731bba58d0db419594068ac24eda143 (patch)
treea5eccd94ad7bd0b1a48f7005fe50356d0f261f6f
parent0f1913353408f46494741b05737d88156b81b7c4 (diff)
Deprecate Char type
-rw-r--r--Makefile4
-rw-r--r--ast.c1
-rw-r--r--ast.h5
-rw-r--r--builtins/char.c86
-rw-r--r--compile.c1
-rw-r--r--nextlang.h2
-rw-r--r--types.c7
-rw-r--r--types.h3
8 files changed, 6 insertions, 103 deletions
diff --git a/Makefile b/Makefile
index 1460ad5b..117ce493 100644
--- a/Makefile
+++ b/Makefile
@@ -36,7 +36,7 @@ libnext.so: metamethods/cord.o util.o SipHash/halfsiphash.o
SipHash/halfsiphash.c:
git submodule update --init --recursive
-tags:
+tags: $(wildcard **/*.[ch])
ctags **/*.[ch]
clean:
@@ -45,4 +45,4 @@ clean:
%.1: %.1.md
pandoc --lua-filter=.pandoc/bold-code.lua -s $< -t man -o $@
-.PHONY: all clean install uninstall test
+.PHONY: all clean install uninstall test tags
diff --git a/ast.c b/ast.c
index 6cb1fd67..b5bb64bc 100644
--- a/ast.c
+++ b/ast.c
@@ -89,7 +89,6 @@ CORD ast_to_cord(ast_t *ast)
T(Var, "(\x1b[36;1m%s\x1b[m)", data.name)
T(Int, "(\x1b[35m%ld\x1b[m, precision=\x1b[35m%ld\x1b[m)", data.i, data.precision)
T(Num, "(\x1b[35m%ld\x1b[m, precision=\x1b[35m%ld\x1b[m)", data.n, data.precision)
- T(Char, "(\x1b[35m'%c'\x1b[m)", data.c)
T(StringLiteral, "\x1b[35m\"%r\"\x1b[m", data.cord)
T(StringJoin, "(%r)", ast_list_to_cord(data.children))
T(Declare, "(var=%s, value=%r)", ast_to_cord(data.var), ast_to_cord(data.value))
diff --git a/ast.h b/ast.h
index c6f97d0c..3bbe086d 100644
--- a/ast.h
+++ b/ast.h
@@ -91,7 +91,7 @@ struct type_ast_s {
typedef enum {
Unknown = 0,
Nil, Bool, Var,
- Int, Num, Char,
+ Int, Num,
StringLiteral, StringJoin,
Declare, Assign,
BinaryOp, UnaryOp, UpdateAssign,
@@ -137,9 +137,6 @@ struct ast_s {
enum { NUM_64BIT, NUM_32BIT } precision;
} Num;
struct {
- char c;
- } Char;
- struct {
CORD cord;
} StringLiteral;
struct {
diff --git a/builtins/char.c b/builtins/char.c
deleted file mode 100644
index 4df519bb..00000000
--- a/builtins/char.c
+++ /dev/null
@@ -1,86 +0,0 @@
-
-#include <gc.h>
-#include <gc/cord.h>
-#include <stdalign.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <sys/param.h>
-#include <err.h>
-
-#include "array.h"
-#include "string.h"
-#include "types.h"
-
-static CORD Char_cord(const char *c, bool colorize, const TypeInfo *type) {
- (void)type;
- CORD cord = 0;
- switch (*c) {
- case '\a': return "\\a";
- case '\b': return "\\b";
- case '\x1b': return "\\e";
- case '\f': return "\\f";
- case '\n': return "\\n";
- case '\t': return "\\t";
- case '\r': return "\\r";
- case '\v': return "\\v";
- case '\\': return "\\\\";
- case '"': return "\\\"";
- default: {
- if (!isprint(*c))
- CORD_sprintf(&cord, "\\x%02X", (int)*c);
- else
- cord = CORD_cat_char(0, *c);
- }
- }
- if (colorize) {
- if (CORD_len(cord) > 1)
- CORD_sprintf(&cord, "\x1b[34m%r\x1b[m", cord);
- else
- CORD_sprintf(&cord, "\x1b[35m%r\x1b[m", cord);
- }
- return cord;
-}
-
-// For some reason, the C functions from ctypes.h return integers instead of
-// booleans, and what's worse, the integers are not limited to [0-1]. So,
-// it's necessary to cast them to bools to clamp them to those values.
-#define BOOLIFY(fn) public bool Char__ ## fn(char c) { return (bool)fn(c); }
-BOOLIFY(isalnum)
-BOOLIFY(isalpha)
-BOOLIFY(iscntrl)
-BOOLIFY(isdigit)
-BOOLIFY(isgraph)
-BOOLIFY(islower)
-BOOLIFY(isprint)
-BOOLIFY(ispunct)
-BOOLIFY(isspace)
-BOOLIFY(isupper)
-BOOLIFY(isxdigit)
-BOOLIFY(isascii)
-BOOLIFY(isblank)
-
-typedef bool (*char_pred_t)(char);
-typedef char (*char_map_t)(char);
-
-public struct {
- TypeInfo type;
- char_pred_t isalnum, isalpha, iscntrl, isdigit, isgraph, islower, isprint, ispunct,
- isspace, isupper, isxdigit, isascii, isblank;
- char_map_t tolower, toupper;
-} Char_type = {
- .type={
- .name="Char",
- .size=sizeof(char),
- .align=alignof(char),
- .tag=CustomInfo,
- .CustomInfo={.cord=(void*)Char_cord},
- },
- .isalnum=Char__isalnum, .isalpha=Char__isalpha, .iscntrl=Char__iscntrl, .isdigit=Char__isdigit, .isgraph=Char__isgraph,
- .islower=Char__islower, .isprint=Char__isprint, .ispunct=Char__ispunct, .isspace=Char__isspace, .isupper=Char__isupper,
- .isxdigit=Char__isxdigit, .isascii=Char__isascii, .isblank=Char__isblank,
- .tolower=(char_map_t)(void*)tolower, .toupper=(char_map_t)(void*)toupper,
-};
-
-// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1,\:0
diff --git a/compile.c b/compile.c
index 7c3871c1..3cbd5a5a 100644
--- a/compile.c
+++ b/compile.c
@@ -35,7 +35,6 @@ CORD compile(ast_t *ast)
case Var: return Match(ast, Var)->name;
case Int: return CORD_asprintf("((Int%ld_t)%ld)", Match(ast, Int)->precision, Match(ast, Int)->i);
case Num: return CORD_asprintf(Match(ast, Num)->precision == 64 ? "%g" : "%gf", Match(ast, Num)->n);
- case Char: return CORD_asprintf("(char)'\\x%02X'", (int)Match(ast, Char)->c);
case UnaryOp: {
auto unop = Match(ast, UnaryOp);
CORD expr = compile(unop->value);
diff --git a/nextlang.h b/nextlang.h
index 8cc68d46..87cdf03e 100644
--- a/nextlang.h
+++ b/nextlang.h
@@ -22,8 +22,6 @@
#define String_t CORD
-#define Char_t char
-
#define Bool_t bool
#define Void_t void
diff --git a/types.c b/types.c
index aa977507..3712a0aa 100644
--- a/types.c
+++ b/types.c
@@ -15,7 +15,6 @@ static CORD type_to_cord(type_t *t) {
case VoidType: return "Void";
case MemoryType: return "Memory";
case BoolType: return "Bool";
- case CharType: return "Char";
case IntType: return CORD_asprintf("Int%ld", Match(t, IntType)->bits);
case NumType: return CORD_asprintf("Num%ld", Match(t, NumType)->bits);
case ArrayType: {
@@ -208,7 +207,7 @@ type_t *type_or_type(type_t *a, type_t *b)
bool is_integral(type_t *t)
{
t = base_variant(t);
- return t->tag == IntType || t->tag == CharType;
+ return t->tag == IntType;
}
bool is_floating_point(type_t *t)
@@ -227,7 +226,6 @@ static inline double type_min_magnitude(type_t *t)
{
switch (t->tag) {
case BoolType: return (double)false;
- case CharType: return (double)CHAR_MIN;
case IntType: {
switch (Match(t, IntType)->bits) {
case 8: return (double)INT8_MIN;
@@ -247,7 +245,6 @@ static inline double type_max_magnitude(type_t *t)
{
switch (t->tag) {
case BoolType: return (double)true;
- case CharType: return (double)CHAR_MAX;
case IntType: {
switch (Match(t, IntType)->bits) {
case 8: return (double)INT8_MAX;
@@ -416,7 +413,7 @@ bool can_leave_uninitialized(type_t *t)
{
switch (t->tag) {
case PointerType: return Match(t, PointerType)->is_optional;
- case ArrayType: case IntType: case NumType: case CharType: case BoolType:
+ case ArrayType: case IntType: case NumType: case BoolType:
return true;
case StructType: {
for (arg_t *field = Match(t, StructType)->fields; field; field = field->next) {
diff --git a/types.h b/types.h
index 001167ab..b744d6b2 100644
--- a/types.h
+++ b/types.h
@@ -35,7 +35,6 @@ struct type_s {
VoidType,
MemoryType,
BoolType,
- CharType,
IntType,
NumType,
ArrayType,
@@ -51,7 +50,7 @@ struct type_s {
union {
struct {
- } UnknownType, AbortType, VoidType, MemoryType, BoolType, CharType;
+ } UnknownType, AbortType, VoidType, MemoryType, BoolType;
struct {
int64_t bits;
} IntType;