📄 grant.c
字号:
if (mode_string->len) APPEND (result, mode_string->str); FREE (mode_string); } else { mode_string = get_type_selective (TREE_TYPE (type), all_decls); if (mode_string->len) APPEND (result, mode_string->str); FREE (mode_string); } } break; case REAL_TYPE: return result; break; case SET_TYPE: if (CH_BOOLS_TYPE_P (type)) mode_string = grant_array_type_selective (type, all_decls); else mode_string = get_type_selective (TYPE_DOMAIN (type), all_decls); if (mode_string->len) APPEND (result, mode_string->str); FREE (mode_string); break; case REFERENCE_TYPE: mode_string = get_type_selective (TREE_TYPE (type), all_decls); if (mode_string->len) APPEND (result, mode_string->str); FREE (mode_string); break; default: APPEND (result, "/* ---- not implemented ---- */"); break; } return (result);}static MYSTRING *get_type (type) tree type;{ if (type == NULL_TREE || TREE_CODE (type) == ERROR_MARK) return newstring (""); return (decode_mode (type));}static MYSTRING *get_type_selective (type, all_decls) tree type; tree all_decls;{ if (type == NULL_TREE || TREE_CODE (type) == ERROR_MARK) return newstring (""); return (decode_mode_selective (type, all_decls));}#if 0static intis_forbidden (str, forbid) tree str; tree forbid;{ if (forbid == NULL_TREE) return (0); if (TREE_CODE (forbid) == INTEGER_CST) return (1); while (forbid != NULL_TREE) { if (TREE_VALUE (forbid) == str) return (1); forbid = TREE_CHAIN (forbid); } /* nothing found */ return (0);}#endifstatic MYSTRING *decode_constant (init) tree init;{ MYSTRING *result = newstring (""); MYSTRING *tmp_string; tree type = TREE_TYPE (init); tree val = init; char *op; char wrk[256]; MYSTRING *mode_string; switch ((enum chill_tree_code)TREE_CODE (val)) { case CALL_EXPR: tmp_string = decode_constant (TREE_OPERAND (val, 0)); APPEND (result, tmp_string->str); FREE (tmp_string); val = TREE_OPERAND (val, 1); /* argument list */ if (val != NULL_TREE && TREE_CODE (val) != TREE_LIST) { APPEND (result, " "); tmp_string = decode_constant (val); APPEND (result, tmp_string->str); FREE (tmp_string); } else { APPEND (result, " ("); if (val != NULL_TREE) { for (;;) { tmp_string = decode_constant (TREE_VALUE (val)); APPEND (result, tmp_string->str); FREE (tmp_string); val = TREE_CHAIN (val); if (val == NULL_TREE) break; APPEND (result, ", "); } } APPEND (result, ")"); } return result; case NOP_EXPR: /* Generate an "expression conversion" expression (a cast). */ tmp_string = decode_mode (type); APPEND (result, tmp_string->str); FREE (tmp_string); APPEND (result, "("); val = TREE_OPERAND (val, 0); type = TREE_TYPE (val); /* If the coercee is a tuple, make sure it is prefixed by its mode. */ if (TREE_CODE (val) == CONSTRUCTOR && !CH_BOOLS_TYPE_P (type) && !chill_varying_type_p (type)) { tmp_string = decode_mode (type); APPEND (result, tmp_string->str); FREE (tmp_string); APPEND (result, " "); } tmp_string = decode_constant (val); APPEND (result, tmp_string->str); FREE (tmp_string); APPEND (result, ")"); return result; case IDENTIFIER_NODE: APPEND (result, IDENTIFIER_POINTER (val)); return result; case PAREN_EXPR: APPEND (result, "("); tmp_string = decode_constant (TREE_OPERAND (val, 0)); APPEND (result, tmp_string->str); FREE (tmp_string); APPEND (result, ")"); return result; case UNDEFINED_EXPR: APPEND (result, "*"); return result; case PLUS_EXPR: op = "+"; goto binary; case MINUS_EXPR: op = "-"; goto binary; case MULT_EXPR: op = "*"; goto binary; case TRUNC_DIV_EXPR: op = "/"; goto binary; case FLOOR_MOD_EXPR: op = " MOD "; goto binary; case TRUNC_MOD_EXPR: op = " REM "; goto binary; case CONCAT_EXPR: op = "//"; goto binary; case BIT_IOR_EXPR: op = " OR "; goto binary; case BIT_XOR_EXPR: op = " XOR "; goto binary; case TRUTH_ORIF_EXPR: op = " ORIF "; goto binary; case BIT_AND_EXPR: op = " AND "; goto binary; case TRUTH_ANDIF_EXPR: op = " ANDIF "; goto binary; case GT_EXPR: op = ">"; goto binary; case GE_EXPR: op = ">="; goto binary; case SET_IN_EXPR: op = " IN "; goto binary; case LT_EXPR: op = "<"; goto binary; case LE_EXPR: op = "<="; goto binary; case EQ_EXPR: op = "="; goto binary; case NE_EXPR: op = "/="; goto binary; case RANGE_EXPR: if (TREE_OPERAND (val, 0) == NULL_TREE) { APPEND (result, TREE_OPERAND (val, 1) == NULL_TREE ? "*" : "ELSE"); return result; } op = ":"; goto binary; binary: tmp_string = decode_constant (TREE_OPERAND (val, 0)); APPEND (result, tmp_string->str); FREE (tmp_string); APPEND (result, op); tmp_string = decode_constant (TREE_OPERAND (val, 1)); APPEND (result, tmp_string->str); FREE (tmp_string); return result; case REPLICATE_EXPR: APPEND (result, "("); tmp_string = decode_constant (TREE_OPERAND (val, 0)); APPEND (result, tmp_string->str); FREE (tmp_string); APPEND (result, ")"); tmp_string = decode_constant (TREE_OPERAND (val, 1)); APPEND (result, tmp_string->str); FREE (tmp_string); return result; case NEGATE_EXPR: op = "-"; goto unary; case BIT_NOT_EXPR: op = " NOT "; goto unary; case ADDR_EXPR: op = "->"; goto unary; unary: APPEND (result, op); tmp_string = decode_constant (TREE_OPERAND (val, 0)); APPEND (result, tmp_string->str); FREE (tmp_string); return result; case INTEGER_CST: APPEND (result, display_int_cst (val)); return result; case REAL_CST:#ifndef REAL_IS_NOT_DOUBLE sprintf (wrk, "%.20g", TREE_REAL_CST (val));#else REAL_VALUE_TO_DECIMAL (TREE_REAL_CST (val), "%.20g", wrk);#endif APPEND (result, wrk); return result; case STRING_CST: { char *ptr = TREE_STRING_POINTER (val); int i = TREE_STRING_LENGTH (val); APPEND (result, "\""); while (--i >= 0) { char buf[10]; unsigned char c = *ptr++; if (c == '^') APPEND (result, "^^"); else if (c == '"') APPEND (result, "\"\""); else if (c == '\n') APPEND (result, "^J"); else if (c < ' ' || c > '~') { sprintf (buf, "^(%u)", c); APPEND (result, buf); } else { buf[0] = c; buf[1] = 0; APPEND (result, buf); } } APPEND (result, "\""); return result; } case CONSTRUCTOR: val = TREE_OPERAND (val, 1); if (type != NULL && TREE_CODE (type) == SET_TYPE && CH_BOOLS_TYPE_P (type)) { /* It's a bitstring. */ tree domain = TYPE_DOMAIN (type); tree domain_max = TYPE_MAX_VALUE (domain); char *buf; register char *ptr; int len; if (TREE_CODE (domain_max) != INTEGER_CST || (val && TREE_CODE (val) != TREE_LIST)) goto fail; len = TREE_INT_CST_LOW (domain_max) + 1; if (TREE_CODE (init) != CONSTRUCTOR) goto fail; buf = (char *) alloca (len + 10); ptr = buf; *ptr++ = ' '; *ptr++ = 'B'; *ptr++ = '\''; if (get_set_constructor_bits (init, ptr, len)) goto fail; for (; --len >= 0; ptr++) *ptr += '0'; *ptr++ = '\''; *ptr = '\0'; APPEND (result, buf); return result; } else { /* It's some kind of tuple */ if (type != NULL_TREE) { mode_string = get_type (type); APPEND (result, mode_string->str); FREE (mode_string); APPEND (result, " "); } if (val == NULL_TREE || TREE_CODE (val) == ERROR_MARK) APPEND (result, "[ ]"); else if (TREE_CODE (val) != TREE_LIST) goto fail; else { APPEND (result, "["); for ( ; ; ) { tree lo_val = TREE_PURPOSE (val); tree hi_val = TREE_VALUE (val); MYSTRING *val_string; if (TUPLE_NAMED_FIELD (val)) APPEND(result, "."); if (lo_val != NULL_TREE) { val_string = decode_constant (lo_val); APPEND (result, val_string->str); FREE (val_string); APPEND (result, ":"); } val_string = decode_constant (hi_val); APPEND (result, val_string->str); FREE (val_string); val = TREE_CHAIN (val); if (val == NULL_TREE) break; APPEND (result, ", "); } APPEND (result, "]"); } } return result; case COMPONENT_REF: { tree op1; mode_string = decode_constant (TREE_OPERAND (init, 0)); APPEND (result, mode_string->str); FREE (mode_string); op1 = TREE_OPERAND (init, 1); if (TREE_CODE (op1) != IDENTIFIER_NODE) { error ("decode_constant: invalid component_ref"); break; } APPEND (result, "."); APPEND (result, IDENTIFIER_POINTER (op1)); return result; } fail: error ("decode_constant: mode and value mismatch"); break; default: error ("decode_constant: cannot decode this mode"); break; } return result;}static MYSTRING *decode_constant_selective (init, all_decls) tree init; tree all_decls;{ MYSTRING *result = newstring (""); MYSTRING *tmp_string; tree type = TREE_TYPE (init); tree val = init; MYSTRING *mode_string; switch ((enum chill_tree_code)TREE_CODE (val)) { case CALL_EXPR: tmp_string = decode_constant_selective (TREE_OPERAND (val, 0), all_decls); if (tmp_string->len) APPEND (result, tmp_string->str); FREE (tmp_string); val = TREE_OPERAND (val, 1); /* argument list */ if (val != NULL_TREE && TREE_CODE (val) != TREE_LIST) { tmp_string = decode_constant_selective (val, all_decls); if (tmp_string->len) { MAYBE_NEWLINE (result); APPEND (result, tmp_string->str); } FREE (tmp_string); } else { if (val != NULL_TREE) { for (;;) { tmp_string = decode_constant_selective (TREE_VALUE (val), all_decls); if (tmp_string->len) { MAYBE_NEWLINE (result); APPEND (result, tmp_string->str); } FREE (tmp_string); val = TREE_CHAIN (val); if (val == NULL_TREE) break; } } } return result; case NOP_EXPR: /* Generate an "expression conversion" expression (a cast). */ tmp_string = decode_mode_selective (type, all_decls); if (tmp_string->len) APPEND (result, tmp_string->str); FREE (tmp_string); val = TREE_OPERAND (val, 0); type = TREE_TYPE (val); /* If the coercee is a tuple, make sure it is prefixed by its mode. */ if (TREE_CODE (val) == CONSTRUCTOR && !CH_BOOLS_TYPE_P (type) && !chill_varying_type_p (type)) { tmp_string = decode_mode_selective (type, all_decls); if (tmp_string->len) APPEND (result, tmp_string->str); FREE (tmp_string); } tmp_string = decode_constant_selective (val, all_decls); if (tmp_string->len) APPEND (result, tmp_string->str); FREE (tmp_string); return result; case IDENTIFIER_NODE: tmp_string = decode_mode_selective (val, all_decls); if (tmp_string->len) APPEND (result, tmp_string->str); FREE (tmp_string); return result; case PAREN_EXPR: tmp_string = decode_constant_selective (TREE_OPERAND (val, 0), all_decls); if (tmp_string->len) APPEND (result, tmp_string->str); FREE (tmp_string); return result; case UNDEFINED_EXPR: return result; case PLUS_EXPR: case MINUS_EXPR: case MULT_EXPR: case TRUNC_DIV_EXPR: case FLOOR_MOD_EXPR: case TRUNC_MOD_EXPR: case CONCAT_EXPR: case BIT_IOR_EXPR: case BIT_XOR_EXPR: case TRUTH_ORIF_EXPR: case BIT_AND_EXPR: case TRUTH_ANDIF_EXPR: case GT_EXPR: case GE_EXPR: case SET_IN_EXPR: case LT_EXPR: case LE_EXPR: case EQ_EXPR: case NE_EXPR: goto binary; case RANGE_EXPR: if (TREE_OPERAND (val, 0) == NULL_TREE) return result; binary: tmp_string = decode_constant_selective (TREE_OPERAND (val, 0), all_decls); if (tmp_string->len) APPEND (result, tmp_string->str); FREE (tmp_string); tmp_string = decode_constant_selective (TREE_OPERAND (val, 1), all_decls); if (tmp_string->len) { MAYBE_NEWLINE (result); APPEND (result, tmp_string->str); } FREE (tmp_string); return result; case REPLICATE_EXPR: tmp_string = decode_constant_selective (TREE_OPERAND (val, 0), all_decls); if (tmp_string->len) APPEND (result, tmp_string->str); FREE (tmp_string); tmp_string = decode_constant_selective (TREE_OPERAND (val, 1), all_decls); if (tmp_string->len) { MAYBE_NEWLINE (result); APPEND (result, tmp_string->str); } FREE (tmp_string); return result; case NEGATE_EXPR: case BIT_NOT_EXPR: case ADDR_EXPR: tmp_string = decode_constant_selective (TREE_OPERAND (val, 0), all_decls); if (tmp_string->len) APPEND (result, tmp_string->str); FREE (tmp_string); return result;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -