+ switch(binexpr->expression.kind) {
+ case EXPR_BINARY_COMMA: fputs(",", out); break;
+ case EXPR_BINARY_ASSIGN: fputs("=", out); break;
+ case EXPR_BINARY_ADD: fputs("+", out); break;
+ case EXPR_BINARY_SUB: fputs("-", out); break;
+ case EXPR_BINARY_MUL: fputs("*", out); break;
+ case EXPR_BINARY_MOD: fputs("%", out); break;
+ case EXPR_BINARY_DIV: fputs("/", out); break;
+ case EXPR_BINARY_BITWISE_OR: fputs("|", out); break;
+ case EXPR_BINARY_BITWISE_AND: fputs("&", out); break;
+ case EXPR_BINARY_BITWISE_XOR: fputs("^", out); break;
+ case EXPR_BINARY_LOGICAL_OR: fputs("||", out); break;
+ case EXPR_BINARY_LOGICAL_AND: fputs("&&", out); break;
+ case EXPR_BINARY_NOTEQUAL: fputs("!=", out); break;
+ case EXPR_BINARY_EQUAL: fputs("==", out); break;
+ case EXPR_BINARY_LESS: fputs("<", out); break;
+ case EXPR_BINARY_LESSEQUAL: fputs("<=", out); break;
+ case EXPR_BINARY_GREATER: fputs(">", out); break;
+ case EXPR_BINARY_GREATEREQUAL: fputs(">=", out); break;
+ case EXPR_BINARY_SHIFTLEFT: fputs("<<", out); break;
+ case EXPR_BINARY_SHIFTRIGHT: fputs(">>", out); break;
+
+ case EXPR_BINARY_ADD_ASSIGN: fputs("+=", out); break;
+ case EXPR_BINARY_SUB_ASSIGN: fputs("-=", out); break;
+ case EXPR_BINARY_MUL_ASSIGN: fputs("*=", out); break;
+ case EXPR_BINARY_MOD_ASSIGN: fputs("%=", out); break;
+ case EXPR_BINARY_DIV_ASSIGN: fputs("/=", out); break;
+ case EXPR_BINARY_BITWISE_OR_ASSIGN: fputs("|=", out); break;
+ case EXPR_BINARY_BITWISE_AND_ASSIGN: fputs("&=", out); break;
+ case EXPR_BINARY_BITWISE_XOR_ASSIGN: fputs("^=", out); break;
+ case EXPR_BINARY_SHIFTLEFT_ASSIGN: fputs("<<=", out); break;
+ case EXPR_BINARY_SHIFTRIGHT_ASSIGN: fputs(">>=", out); break;
+ default: panic("invalid binexpression found");
+ }
+ fprintf(out, " ");
+ print_expression(binexpr->right);
+ fprintf(out, ")");
+}
+
+static void print_unary_expression(const unary_expression_t *unexpr)
+{
+ switch(unexpr->expression.kind) {
+ case EXPR_UNARY_NEGATE: fputs("-", out); break;
+ case EXPR_UNARY_PLUS: fputs("+", out); break;
+ case EXPR_UNARY_NOT: fputs("!", out); break;
+ case EXPR_UNARY_BITWISE_NEGATE: fputs("~", out); break;
+ case EXPR_UNARY_PREFIX_INCREMENT: fputs("++", out); break;
+ case EXPR_UNARY_PREFIX_DECREMENT: fputs("--", out); break;
+ case EXPR_UNARY_DEREFERENCE: fputs("*", out); break;
+ case EXPR_UNARY_TAKE_ADDRESS: fputs("&", out); break;
+
+ case EXPR_UNARY_BITFIELD_EXTRACT:
+ print_expression(unexpr->value);
+ return;
+
+ case EXPR_UNARY_POSTFIX_INCREMENT:
+ fputs("(", out);
+ print_expression(unexpr->value);
+ fputs(")", out);
+ fputs("++", out);
+ return;
+ case EXPR_UNARY_POSTFIX_DECREMENT:
+ fputs("(", out);
+ print_expression(unexpr->value);
+ fputs(")", out);
+ fputs("--", out);
+ return;
+ case EXPR_UNARY_CAST_IMPLICIT:
+ if(!print_implicit_casts) {
+ print_expression(unexpr->value);
+ return;
+ }
+ /* fallthrough */
+ case EXPR_UNARY_CAST:
+ fputs("(", out);
+ print_type(unexpr->expression.datatype);
+ fputs(")", out);