diff options
| author | 2025-12-15 22:39:52 +0100 | |
|---|---|---|
| committer | 2025-12-15 22:39:52 +0100 | |
| commit | 302e24671942051d70707586cf8c605a5815edac (patch) | |
| tree | 51e25fb6cd7e828c82ce5f17ffc775117121acee /io.c | |
| parent | c6c0f2ef35175075e91169113cfe856f29b3eb9a (diff) | |
create distinct interned string type
Interned strings are used pervasively, so it's a good idea to add a
layer of type safety to differentiate them from general cstrs and avoid
potential bugs from comparing non-interned and interned strings. Not
that that's happened so far that I can remember, but it could.
I'm 90% sure it's legal to alias `struct {char c;}` pointers with `char`
pointers. This specific typedef gives type safety but with a simple
one-way `internstr -> const char *` typecast (with `&istr->c`).
Converting the other way around is more intentional: a straight up cast
`(internstr)cstr` which sticks out as unchecked and probably wrong, or
calling the intern(cstr) function, which is the right way.
Diffstat (limited to 'io.c')
| -rw-r--r-- | io.c | 12 |
1 files changed, 6 insertions, 6 deletions
@@ -226,7 +226,7 @@ pritypebefore(struct wbuf *buf, union type ty, int qual) case TYSTRUCT: s = "struct"; Tagged: - n = bfmt(buf, "%s %s", s, (s2 = ttypenames[typedata[ty.dat].id]) ? s2 : "(anonymous)"); + n = bfmt(buf, "%s %s", s, (s2 = &ttypenames[typedata[ty.dat].id]->c) ? s2 : "(anonymous)"); return n + priquals(buf, qual); case TYUNION: s = "union"; @@ -530,7 +530,7 @@ vbfmt(struct wbuf *out, const char *fmt, va_list ap) case TKPPMACARG: case TKIDENT: if (quote) n += bputc(buf, '`'); - n += bfmt(buf, "%s", tok->s); + n += bfmt(buf, "%s", tok->name); if (quote) n += bputc(buf, '\''); break; case TKEOF: @@ -562,7 +562,7 @@ vbfmt(struct wbuf *out, const char *fmt, va_list ap) default: if (quote) n += bputc(buf, '`'); if (in_range(tok->t, TKWBEGIN_, TKWEND_)) { - iowrite(buf, tok->s, tok->len); + iowrite(buf, tok->name, tok->len); n += tok->len; } else if (aisprint(tok->t)) { n += bputc(buf, tok->t); @@ -809,7 +809,7 @@ static struct file { vec_of(struct linemap) linemap; bool once; bool seen; - const char *guardmac; + internstr guardmac; } *fileht[1<<SPANFILEBITS]; static int nfiles; @@ -971,7 +971,7 @@ getfilepos(int *pline, int *pcol, int id, uint off) } bool -isoncefile(int id, const char **guard) +isoncefile(int id, internstr *guard) { assert(id < countof(fileht) && fileht[id]); *guard = fileht[id]->guardmac; @@ -979,7 +979,7 @@ isoncefile(int id, const char **guard) } void -markfileonce(int id, const char *guard) +markfileonce(int id, internstr guard) { assert(id < countof(fileht) && fileht[id]); fileht[id]->once = 1; |