aboutsummaryrefslogtreecommitdiff
path: root/main.c
blob: d5e36179989f5f833e9fc473b19c4fe7cf1a3426 (plain)
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
/* Copyright (C) 2025 Aryadev Chavali

 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the Unlicense for details.

 * You may distribute and modify this code under the terms of the Unlicense,
 * which you should have received a copy of along with this program.  If not,
 * please go to <https://unlicense.org/>.

 * Created: 2025-08-19
 * Description: Entrypoint
 */

#include <malloc.h>
#include <stdio.h>
#include <string.h>

#include "./alisp.h"

sv_t sv_copy(sv_t old)
{
  char *newstr = calloc(1, (old.size + 1) * sizeof(*newstr));
  memcpy(newstr, old.data, old.size);
  newstr[old.size] = '\0';
  return SV(newstr, old.size);
}

char *words[] = {
    "aliquam",      "erat",      "volutpat",  "nunc",      "eleifend",
    "leo",          "vitae",     "magna",     "in",        "id",
    "erat",         "non",       "orci",      "commodo",   "lobortis",
    "proin",        "neque",     "massa",     "cursus",    "ut",
    "gravida",      "ut",        "lobortis",  "eget",      "lacus",
    "sed",          "diam",      "praesent",  "fermentum", "tempor",
    "tellus",       "nullam",    "tempus",    "mauris",    "ac",
    "felis",        "vel",       "velit",     "tristique", "imperdiet",
    "donec",        "at",        "pede",      "etiam",     "vel",
    "neque",        "nec",       "dui",       "dignissim", "bibendum",
    "vivamus",      "id",        "enim",      "phasellus", "neque",
    "orci",         "porta",     "a",         "aliquet",   "quis",
    "semper",       "a",         "massa",     "phasellus", "purus",
    "pellentesque", "tristique", "imperdiet", "tortor",    "nam",
    "euismod",      "tellus",    "id",        "erat",
};

void vec_test(void)
{
  vec_t vec = {0};
  vec_init(&vec, 0);

  for (u64 i = 0; i < ARRSIZE(words); ++i)
  {
    vec_append(&vec, words[i], strlen(words[i]));
    vec_append(&vec, " ", 1);
    printf("[vec_test]: %lu/%lu, inlined?: %s\n", vec.size, vec.capacity,
           vec.is_inlined ? "yes" : "no");
  }

  printf("[vec_test]: Final: %lu/%lu: %.*s\n", vec.size, vec.capacity,
         (int)vec.size, (char *)vec_data(&vec));

  vec_free(&vec);
}

void symtable_test(void)
{
  sym_table_t table = {0};
  sym_table_init(&table);
  for (u64 i = 0; i < ARRSIZE(words); ++i)
  {
    char *ptr = sym_table_find(&table, SV(words[i], strlen(words[i])));
    printf("[symtable_test]: %s => %p\n", words[i], ptr);
  }

  printf(
      "[symtable_test]: |words|=%lu, |table|= %lu => Unique word ratio: %lf\n",
      ARRSIZE(words), table.count, table.count / (double)ARRSIZE(words));

  sym_table_cleanup(&table);
}

void make_int_test(void)
{
  i64 ints[] = {
      1,       -1,      (1 << 10) - 1, (-1) * ((1 << 10) - 1),
      INT_MIN, INT_MAX, INT64_MAX,     INT64_MIN,
  };

  for (u64 i = 0; i < ARRSIZE(ints); ++i)
  {
    i64 in       = ints[i];
    lisp_t *lisp = make_int(in);
    i64 out      = as_int(lisp);

    printf("[make_int_test]: %#16lx => %#16lx => %#16lx\n", in, (u64)lisp, out);
  }
}

void intern_test(void)
{
  sys_t system = {0};
  sys_init(&system);
  for (u64 i = 0; i < ARRSIZE(words); ++i)
  {
    char *in     = words[i];
    lisp_t *lisp = intern(&system, SV(in, strlen(in)));
    char *out    = as_sym(lisp);
    printf("[intern test]: `%s` -> %p -> `%s`\n", in, lisp, out);
  }
  sys_cleanup(&system);
}

int main(void)
{
  vec_test();
  printf("\n");
  symtable_test();
  printf("\n");
  make_int_test();
  printf("\n");
  intern_test();
  return 0;
}