@@ -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
209197static 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
251234static 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-
345321static 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