typedef int token_t;
+static inline int psi_num_exp_op_cmp(token_t op1, token_t op2)
+{
+ assert(!op1 || op1 == PSI_T_LPAREN || (op1 <= PSI_T_NOT && op1 >= PSI_T_PIPE));
+ assert(!op2 || op2 == PSI_T_LPAREN || (op2 <= PSI_T_NOT && op2 >= PSI_T_PIPE));
+
+ if (PSI_T_LPAREN == op2) {
+ return -1;
+ } else if (PSI_T_LPAREN == op1) {
+ return 1;
+ } else if (op1 == op2) {
+ return 0;
+ } else if (!op1) {
+ return 1;
+ } else if (!op2) {
+ return -1;
+ }
+
+ switch (op1) {
+ case PSI_T_PIPE:
+ return op2 > PSI_T_PIPE ? 1 : (op2 < PSI_T_PIPE ? -1 : 0);
+ case PSI_T_CARET:
+ return op2 > PSI_T_CARET ? 1 : (op2 < PSI_T_CARET ? -1 : 0);
+ case PSI_T_AMPERSAND:
+ return op2 > PSI_T_AMPERSAND ? 1 : (op2 < PSI_T_AMPERSAND ? -1 : 0);
+
+ case PSI_T_LSHIFT:
+ case PSI_T_RSHIFT:
+ return op2 > PSI_T_RSHIFT ? 1 : (op2 < PSI_T_LSHIFT ? -1 : 0);
+
+ case PSI_T_PLUS:
+ case PSI_T_MINUS:
+ return op2 > PSI_T_MINUS ? 1 : (op2 < PSI_T_PLUS ? -1 : 0);
+
+ case PSI_T_ASTERISK:
+ case PSI_T_SLASH:
+ case PSI_T_MODULO:
+ return op2 > PSI_T_MODULO ? 1 : (op2 < PSI_T_ASTERISK ? -1 : 0);
+
+ case PSI_T_NOT:
+ case PSI_T_TILDE:
+ return op2 > PSI_T_TILDE ? 1 : (op2 < PSI_T_NOT ? -1 : 0);
+ }
+
+ return 0;
+}
+
static inline size_t psi_t_alignment(token_t t)
{
#define PSI_ALIGNOF(T) case PSI_T_## T: return ALIGNOF_## T ##_T;
return ALIGNOF_VOID_P;
case PSI_T_ENUM:
return ALIGNOF_INT;
+#ifdef HAVE_LONG_DOUBLE
+ case PSI_T_LONG_DOUBLE:
+ return ALIGNOF_LONG_DOUBLE;
+#endif
default:
assert(0);
}
return SIZEOF_FLOAT;
case PSI_T_DOUBLE:
return SIZEOF_DOUBLE;
+ case PSI_T_VOID:
case PSI_T_POINTER:
case PSI_T_FUNCTION:
return SIZEOF_VOID_P;
case PSI_T_ENUM:
return SIZEOF_INT;
+#ifdef HAVE_LONG_DOUBLE
+ case PSI_T_LONG_DOUBLE:
+ return SIZEOF_LONG_DOUBLE;
+#endif
default:
- assert(0);
+ assert(!t);
}
return 0;
}
static inline const char *psi_t_indent(unsigned level) {
static const char indent[] =
"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
- return &indent[32 - MAX(0, MIN(32, level))];
+ return &indent[32 - MIN(32, level)];
}
static inline const char *psi_t_indirection(unsigned pointer_level) {
static const char indir[] = "********************************";
- return &indir[32 - MAX(0, MIN(32, pointer_level))];
+ return &indir[32 - MIN(32, pointer_level)];
}
struct psi_token {