X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Ftoken.c;h=ec8c4e93ca764c182ad38e73d9be1fa9a1cb1e2f;hp=01c45f10e0b1932e5a5bbcdf5920c290c0fe6fab;hb=6509a2053456d0e63b6f383b757289d3016ed1a5;hpb=ef48feab1da9d7a419980294bcbf03ceefd81d1c diff --git a/src/token.c b/src/token.c index 01c45f1..ec8c4e9 100644 --- a/src/token.c +++ b/src/token.c @@ -25,6 +25,8 @@ #include "php_psi_stdinc.h" +#include + #include "token.h" #include "parser.h" @@ -59,6 +61,15 @@ struct psi_token *psi_token_alloc(struct psi_parser *P) { return T; } +void psi_token_free(struct psi_token **token_ptr) { + if (*token_ptr) { + struct psi_token *token = *token_ptr; + + *token_ptr = NULL; + free(token); + } +} + struct psi_token *psi_token_copy(struct psi_token *src) { size_t strct_len = psi_token_alloc_size(src->size, strlen(src->file)); struct psi_token *ptr = malloc(strct_len); @@ -71,6 +82,10 @@ struct psi_token *psi_token_copy(struct psi_token *src) { return ptr; } +void psi_token_copy_ctor(struct psi_token **tok) { + *tok = psi_token_copy(*tok); +} + struct psi_token *psi_token_cat(unsigned argc, ...) { va_list argv; unsigned i; @@ -162,3 +177,49 @@ uint64_t psi_token_hash(struct psi_token *t, char *digest_buf) { sprintf(loc_buf, "%u%u", t->line, t->col); return psi_hash(digest_buf, t->file, loc_buf, (char *) NULL); } + +void psi_token_dump(int fd, struct psi_token *t) +{ + size_t i; + + dprintf(fd, "TOKEN %p (%d) \"", t, t->type); + for (i = 0; i < MIN(t->size, 16); ++i) { + switch (t->text[i]) { + case '\0': + dprintf(fd, "\\0"); + break; + case '\a': + dprintf(fd, "\\a"); + break; + case '\b': + dprintf(fd, "\\b"); + break; + case '\f': + dprintf(fd, "\\f"); + break; + case '\n': + dprintf(fd, "\\n"); + break; + case '\r': + dprintf(fd, "\\r"); + break; + case '\t': + dprintf(fd, "\\t"); + break; + case '\v': + dprintf(fd, "\\v"); + break; + case '"': + dprintf(fd, "\\\""); + break; + default: + if (isprint(t->text[i])) { + dprintf(fd, "%c", t->text[i]); + } else { + dprintf(fd, "\\%03hho", t->text[i]); + } + break; + } + } + dprintf(fd, "\" at col %u in %s on line %u\n", t->col, t->file, t->line); +}