api refactoring
[m6w6/ext-psi] / src / token.h
1 #ifndef _PSI_TOKEN_H
2 #define _PSI_TOKEN_H
3
4 #include <stddef.h>
5 #include <stdarg.h>
6 #include <stdint.h>
7 #include <assert.h>
8
9 #include "parser_proc.h"
10
11 #define PSI_T_POINTER PSI_T_ASTERISK
12 #define PSI_T_LONG_DOUBLE (PSI_T_DOUBLE << 16)
13
14 typedef int token_t;
15
16 static inline size_t psi_t_alignment(token_t t)
17 {
18 #define PSI_ALIGNOF(T) case PSI_T_## T: return ALIGNOF_## T ##_T;
19 switch (t) {
20 PSI_ALIGNOF(INT8);
21 PSI_ALIGNOF(UINT8);
22 PSI_ALIGNOF(INT16);
23 PSI_ALIGNOF(UINT16);
24 PSI_ALIGNOF(INT32);
25 PSI_ALIGNOF(UINT32);
26 PSI_ALIGNOF(INT64);
27 PSI_ALIGNOF(UINT64);
28 case PSI_T_FLOAT:
29 return ALIGNOF_FLOAT;
30 case PSI_T_DOUBLE:
31 return ALIGNOF_DOUBLE;
32 case PSI_T_POINTER:
33 case PSI_T_FUNCTION:
34 return ALIGNOF_VOID_P;
35 case PSI_T_ENUM:
36 return ALIGNOF_INT;
37 default:
38 assert(0);
39 }
40 return 0;
41 }
42
43 static inline size_t psi_t_size(token_t t)
44 {
45 #define PSI_SIZEOF(T) case PSI_T_## T : return SIZEOF_## T ##_T;
46 switch (t) {
47 PSI_SIZEOF(INT8);
48 PSI_SIZEOF(UINT8);
49 PSI_SIZEOF(INT16);
50 PSI_SIZEOF(UINT16);
51 PSI_SIZEOF(INT32);
52 PSI_SIZEOF(UINT32);
53 PSI_SIZEOF(INT64);
54 PSI_SIZEOF(UINT64);
55 case PSI_T_FLOAT:
56 return SIZEOF_FLOAT;
57 case PSI_T_DOUBLE:
58 return SIZEOF_DOUBLE;
59 case PSI_T_POINTER:
60 case PSI_T_FUNCTION:
61 return SIZEOF_VOID_P;
62 case PSI_T_ENUM:
63 return SIZEOF_INT;
64 default:
65 assert(0);
66 }
67 return 0;
68 }
69
70 struct psi_token {
71 token_t type;
72 unsigned size, line, col;
73 char *text, *file;
74 char buf[1];
75 };
76
77 struct psi_parser;
78
79 struct psi_token *psi_token_alloc(struct psi_parser *P);
80 size_t psi_token_alloc_size(size_t token_len, size_t fname_len);
81 struct psi_token *psi_token_copy(struct psi_token *src);
82 struct psi_token *psi_token_cat(unsigned argc, ...);
83 struct psi_token *psi_token_append(struct psi_token *T, unsigned argc, ...);
84 struct psi_token *psi_token_translit(struct psi_token *T, char *from, char *to);
85 uint64_t psi_token_hash(struct psi_token *t, char *digest_buf);
86
87 #endif