Skip to content

Commit 2b11b5c

Browse files
committed
le
1 parent 6d99031 commit 2b11b5c

1 file changed

Lines changed: 37 additions & 62 deletions

File tree

libr/core/p/core_prj.c

Lines changed: 37 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -185,25 +185,13 @@ static void write_le32(RBuffer *b, ut32 v) {
185185
r_buf_write (b, buf, sizeof (buf));
186186
}
187187

188-
// Appends s to the string table and writes its ut32 index, but only if s is non-NULL.
189-
static void write_str_if(Cursor *cur, const char *s) {
190-
if (s) {
191-
write_le32 (cur->b, rprj_st_append (cur->st, s));
188+
// Emits a string-table idx when s is non-empty; returns bit (or 0 when skipped).
189+
static ut8 emit_str(Cursor *cur, ut8 bit, const char *s) {
190+
if (!R_STR_ISNOTEMPTY (s)) {
191+
return 0;
192192
}
193-
}
194-
195-
// Returns s if non-empty and distinct from both a and b (NULL-safe), else NULL.
196-
static const char *keep_if_new(const char *s, const char *a, const char *b) {
197-
if (!R_STR_ISNOTEMPTY (s) || s == a || s == b) {
198-
return NULL;
199-
}
200-
if (a && !strcmp (s, a)) {
201-
return NULL;
202-
}
203-
if (b && !strcmp (s, b)) {
204-
return NULL;
205-
}
206-
return s;
193+
write_le32 (cur->b, rprj_st_append (cur->st, s));
194+
return bit;
207195
}
208196

209197
static void rprj_flag_write_one(Cursor *cur, RFlagItem *fi) {
@@ -215,37 +203,32 @@ static void rprj_flag_write_one(Cursor *cur, RFlagItem *fi) {
215203
}
216204
const ut32 space_id = space_id_for (cur, fi->space);
217205
RFlagItemMeta *fim = r_flag_get_meta (cur->core->flags, fi->id);
218-
const char *realname = keep_if_new (fi->realname, fi->name, NULL);
219-
const char *rawname = keep_if_new (fi->rawname, fi->name, realname);
220-
const char *type_s = fim? keep_if_new (fim->type, NULL, NULL): NULL;
221-
const char *color = fim? keep_if_new (fim->color, NULL, NULL): NULL;
222-
const char *comment = fim? keep_if_new (fim->comment, NULL, NULL): NULL;
223-
const char *alias = fim? keep_if_new (fim->alias, NULL, NULL): NULL;
224-
ut8 extras = 0;
225-
if (space_id != UT32_MAX) extras |= RPRJ_FLAG_SPACE;
226-
if (fi->demangled) extras |= RPRJ_FLAG_DEMANGLED;
227-
if (realname) extras |= RPRJ_FLAG_REALNAME;
228-
if (rawname) extras |= RPRJ_FLAG_RAWNAME;
229-
if (type_s) extras |= RPRJ_FLAG_TYPE;
230-
if (color) extras |= RPRJ_FLAG_COLOR;
231-
if (comment) extras |= RPRJ_FLAG_COMMENT;
232-
if (alias) extras |= RPRJ_FLAG_ALIAS;
233-
ut8 head[21];
206+
const char *rn = (fi->realname && fi->realname != fi->name
207+
&& strcmp (fi->realname, fi->name))? fi->realname: NULL;
208+
const char *rw = (R_STR_ISNOTEMPTY (fi->rawname)
209+
&& strcmp (fi->rawname, fi->name)
210+
&& (!rn || strcmp (fi->rawname, rn)))? fi->rawname: NULL;
211+
// Reserve head, emit tail (accumulating extras), patch head.
212+
ut64 head_at = r_buf_at (cur->b);
213+
ut8 head[21] = {0};
214+
r_buf_write (cur->b, head, sizeof (head));
215+
ut8 extras = fi->demangled? RPRJ_FLAG_DEMANGLED: 0;
216+
if (space_id != UT32_MAX) {
217+
extras |= RPRJ_FLAG_SPACE;
218+
write_le32 (cur->b, space_id);
219+
}
220+
extras |= emit_str (cur, RPRJ_FLAG_REALNAME, rn);
221+
extras |= emit_str (cur, RPRJ_FLAG_RAWNAME, rw);
222+
extras |= emit_str (cur, RPRJ_FLAG_TYPE, fim? fim->type: NULL);
223+
extras |= emit_str (cur, RPRJ_FLAG_COLOR, fim? fim->color: NULL);
224+
extras |= emit_str (cur, RPRJ_FLAG_COMMENT, fim? fim->comment: NULL);
225+
extras |= emit_str (cur, RPRJ_FLAG_ALIAS, fim? fim->alias: NULL);
234226
r_write_le32 (head + 0, rprj_st_append (cur->st, fi->name));
235227
r_write_le32 (head + 4, mid);
236228
r_write_le64 (head + 8, delta);
237229
r_write_le32 (head + 16, fi->size);
238230
head[20] = extras;
239-
r_buf_write (cur->b, head, sizeof (head));
240-
if (space_id != UT32_MAX) {
241-
write_le32 (cur->b, space_id);
242-
}
243-
write_str_if (cur, realname);
244-
write_str_if (cur, rawname);
245-
write_str_if (cur, type_s);
246-
write_str_if (cur, color);
247-
write_str_if (cur, comment);
248-
write_str_if (cur, alias);
231+
r_buf_write_at (cur->b, head_at, head, sizeof (head));
249232
}
250233

251234
static bool flag_foreach_cb(RFlagItem *fi, void *user) {
@@ -335,13 +318,6 @@ static bool read_le32(RBuffer *b, ut32 *out) {
335318
return true;
336319
}
337320

338-
// Consumes a ut32 from b when extras has bit set, and returns the string at
339-
// that table offset (NULL on bit-unset, short read, or bad index).
340-
static const char *read_opt_str(RBuffer *b, R2ProjectStringTable *st, ut8 extras, ut8 bit) {
341-
ut32 idx;
342-
return ((extras & bit) && read_le32 (b, &idx))? rprj_st_get (st, idx): NULL;
343-
}
344-
345321
static void rprj_hint_read(RBuffer *b, R2ProjectHint *hint) {
346322
ut8 buf[sizeof (R2ProjectHint)];
347323
r_buf_read (b, buf, sizeof (buf));
@@ -949,17 +925,16 @@ static void prj_load(RCore *core, const char *file, int mode) {
949925
R_LOG_WARN ("Truncated flag record %u/%u", i, fcount);
950926
break;
951927
}
952-
const char *space_name = NULL;
953-
ut32 space_idx;
954-
if ((flag.extras & RPRJ_FLAG_SPACE) && read_le32 (b, &space_idx) && space_idx != UT32_MAX) {
955-
space_name = r_list_get_n (cur.space_names, space_idx);
956-
}
957-
const char *realname = read_opt_str (b, &st, flag.extras, RPRJ_FLAG_REALNAME);
958-
const char *rawname = read_opt_str (b, &st, flag.extras, RPRJ_FLAG_RAWNAME);
959-
const char *type_s = read_opt_str (b, &st, flag.extras, RPRJ_FLAG_TYPE);
960-
const char *color = read_opt_str (b, &st, flag.extras, RPRJ_FLAG_COLOR);
961-
const char *comment = read_opt_str (b, &st, flag.extras, RPRJ_FLAG_COMMENT);
962-
const char *alias = read_opt_str (b, &st, flag.extras, RPRJ_FLAG_ALIAS);
928+
ut32 idx;
929+
const char *space_name = NULL, *realname = NULL, *rawname = NULL;
930+
const char *type_s = NULL, *color = NULL, *comment = NULL, *alias = NULL;
931+
if ((flag.extras & RPRJ_FLAG_SPACE) && read_le32 (b, &idx) && idx != UT32_MAX) space_name = r_list_get_n (cur.space_names, idx);
932+
if ((flag.extras & RPRJ_FLAG_REALNAME) && read_le32 (b, &idx)) realname = rprj_st_get (&st, idx);
933+
if ((flag.extras & RPRJ_FLAG_RAWNAME) && read_le32 (b, &idx)) rawname = rprj_st_get (&st, idx);
934+
if ((flag.extras & RPRJ_FLAG_TYPE) && read_le32 (b, &idx)) type_s = rprj_st_get (&st, idx);
935+
if ((flag.extras & RPRJ_FLAG_COLOR) && read_le32 (b, &idx)) color = rprj_st_get (&st, idx);
936+
if ((flag.extras & RPRJ_FLAG_COMMENT) && read_le32 (b, &idx)) comment = rprj_st_get (&st, idx);
937+
if ((flag.extras & RPRJ_FLAG_ALIAS) && read_le32 (b, &idx)) alias = rprj_st_get (&st, idx);
963938
const char *flag_name = rprj_st_get (&st, flag.name);
964939
if (!flag_name) {
965940
R_LOG_WARN ("Invalid flag string index %u", flag.name);

0 commit comments

Comments
 (0)