R_API char *r_core_bin_method_flags_str(RBinSymbol *sym, int mode) {
	char *str;
	RStrBuf *buf;
	int i, len = 0;

	buf = r_strbuf_new ("");
	if (IS_MODE_SET (mode) || IS_MODE_RAD (mode)) {
		if (!sym->method_flags) {
			goto out;
		}

		for (i = 0; i != 64; i++) {
			ut64 flag = sym->method_flags & (1L << i);
			if (flag) {
				const char *flag_string = r_bin_get_meth_flag_string (flag, false);
				if (flag_string) {
					r_strbuf_appendf (buf, ".%s", flag_string);
				}
			}
		}
	} else if (IS_MODE_JSON (mode)) {
		if (!sym->method_flags) {
			r_strbuf_append (buf, "[]");
			goto out;
		}

		r_strbuf_append (buf, "[");

		for (i = 0; i != 64; i++) {
			ut64 flag = sym->method_flags & (1L << i);
			if (flag) {
				const char *flag_string = r_bin_get_meth_flag_string (flag, false);

				if (len != 0) {
					r_strbuf_append (buf, ",");
				}
				if (flag_string) {
					r_strbuf_appendf (buf, "\"%s\"", flag_string);
				} else {
					r_strbuf_appendf (buf, "\"0x%08"PFMT64x"\"", flag);
				}
				len++;
			}
		}

		r_strbuf_append (buf, "]");
	} else {
		int pad_len = 4; //TODO: move to a config variable

		if (!sym->method_flags) {
			goto padding;
		}
		for (i = 0; i != 64; i++) {
			ut64 flag = sym->method_flags & (1L << i);
			if (flag) {
				const char *flag_string = r_bin_get_meth_flag_string (flag, true);

				if (flag_string) {
					r_strbuf_append (buf, flag_string);
				} else {
					r_strbuf_append (buf, "?");
				}

				len++;
			}
		}
padding:
		for ( ; len < pad_len; len++) {
			r_strbuf_append (buf, " ");
		}
	}

out:
	str = strdup (r_strbuf_get (buf));
	r_strbuf_free (buf);

	return str;
}
R_API char *r_core_bin_method_flags_str(RBinSymbol *sym, int mode) {
	char *str;
	RStrBuf *buf;
	int i, len = 0;

	buf = r_strbuf_new ("");
	if (IS_MODE_SET (mode) || IS_MODE_RAD (mode)) {
		if (!sym->method_flags) {
			goto out;
		}

		for (i = 0; i != 64; i++) {
			ut64 flag = sym->method_flags & (1L << i);
			if (flag) {
				const char *flag_string = r_bin_get_meth_flag_string (flag, false);
				if (flag_string) {
					r_strbuf_appendf (buf, ".%s", flag_string);
				}
			}
		}
	} else if (IS_MODE_JSON (mode)) {
		if (!sym->method_flags) {
			r_strbuf_append (buf, "[]");
			goto out;
		}

		r_strbuf_append (buf, "[");

		for (i = 0; i != 64; i++) {
			ut64 flag = sym->method_flags & (1L << i);
			if (flag) {
				const char *flag_string = r_bin_get_meth_flag_string (flag, false);

				if (len != 0) {
					r_strbuf_append (buf, ",");
				}
				if (flag_string) {
					r_strbuf_appendf (buf, "\"%s\"", flag_string);
				} else {
					r_strbuf_appendf (buf, "\"0x%08"PFMT64x"\"", flag);
				}
				len++;
			}
		}

		r_strbuf_append (buf, "]");
	} else {
		int pad_len = 4;  

		if (!sym->method_flags) {
			goto padding;
		}
		for (i = 0; i != 64; i++) {
			ut64 flag = sym->method_flags & (1L << i);
			if (flag) {
				const char *flag_string = r_bin_get_meth_flag_string (flag, true);

				if (flag_string) {
					r_strbuf_append (buf, flag_string);
				} else {
					r_strbuf_append (buf, "?");
				}

				len++;
			}
		}
padding:
		for ( ; len < pad_len; len++) {
			r_strbuf_append (buf, " ");
		}
	}

out:
	str = strdup (r_strbuf_get (buf));
	r_strbuf_free (buf);

	return str;
}