+struct psi_plist *psi_number_tokens(struct psi_number *exp,
+ struct psi_plist *list)
+{
+ struct psi_token *ntoken;
+ if (!list) {
+ list = psi_plist_init((psi_plist_dtor) psi_token_free);
+ }
+
+ switch (exp->type) {
+ case PSI_T_NAME:
+ /* decl_var */
+ ntoken = psi_token_copy(exp->data.dvar->token);
+
+ if (exp->data.dvar->pointer_level > 1 || !exp->data.dvar->array_size) {
+ struct psi_token *temp = ntoken;
+ unsigned pl = exp->data.dvar->pointer_level - !!exp->data.dvar->array_size;
+
+ while (pl--) {
+ ntoken = psi_token_init(PSI_T_POINTER, "*", 1, ntoken->col+ntoken->text->len, ntoken->line, ntoken->file);
+ list = psi_plist_add(list, &ntoken);
+ }
+ ntoken = temp;
+ }
+
+ list = psi_plist_add(list, &ntoken);
+
+ if (exp->data.dvar->array_size) {
+ char buf[0x20], *ptr;
+
+ ntoken = psi_token_init(PSI_T_LBRACKET, "[", 1, ntoken->col+ntoken->text->len, ntoken->line, ntoken->file);
+ list = psi_plist_add(list, &ntoken);
+ ptr = zend_print_ulong_to_buf(&buf[sizeof(buf) - 1], exp->data.dvar->array_size);
+
+ ntoken = psi_token_init(PSI_T_NUMBER, ptr, strlen(ptr), ntoken->col+ntoken->text->len, ntoken->line, ntoken->file);
+ list = psi_plist_add(list, &ntoken);
+ }
+ break;
+
+ case PSI_T_SIZEOF:
+ /* decl_type */
+ ntoken = psi_token_copy(exp->token);
+ list = psi_plist_add(list, &ntoken);
+ ntoken = psi_token_init(PSI_T_LPAREN, "(", 1, ntoken->col+ntoken->text->len, ntoken->line, ntoken->file);
+ list = psi_plist_add(list, &ntoken);
+ ntoken = psi_token_copy(exp->data.dtyp->token);
+ list = psi_plist_add(list, &ntoken);
+ ntoken = psi_token_init(PSI_T_RPAREN, ")", 1, ntoken->col+ntoken->text->len, ntoken->line, ntoken->file);
+ list = psi_plist_add(list, &ntoken);
+ break;
+
+ default:
+ ntoken = psi_token_copy(exp->token);
+ list = psi_plist_add(list, &ntoken);
+ break;
+ }
+
+ return list;
+}
+