@@ -594,6 +594,50 @@ STOID Mold_All_String(REBVAL *value, REB_MOLD *mold)
594
594
Post_Mold (value , mold );
595
595
}
596
596
597
+ // Same as Mold_All_String, but forcing contruction syntax like #[file ...]
598
+ STOID Mold_All_Constr_String (REBVAL * value , REB_MOLD * mold )
599
+ {
600
+ // The string that is molded for /all option:
601
+ REBVAL val ;
602
+ // prep...
603
+ Emit (mold , "#[T " , value ); // #[file! part
604
+ // string...
605
+ val = * value ;
606
+ VAL_INDEX (& val ) = 0 ;
607
+ VAL_SET (& val , REB_STRING );
608
+ Mold_String_Series (& val , mold );
609
+ // post...
610
+ if (VAL_INDEX (value )) {
611
+ Append_Byte (mold -> series , ' ' );
612
+ Append_Int (mold -> series , VAL_INDEX (value )+ 1 );
613
+ }
614
+ Append_Byte (mold -> series , ']' );
615
+ }
616
+
617
+ STOID Mold_Ref (REBVAL * value , REB_MOLD * mold )
618
+ {
619
+ if (GET_MOPT (mold , MOPT_MOLD_ALL )) goto mold_ref_all ;
620
+
621
+ // Scan to find out what special chars the string contains?
622
+ REBYTE * bp = VAL_BIN (value );
623
+ REBUNI * up = (REBUNI * )bp ;
624
+ REBUNI c ;
625
+ REBCNT n ;
626
+
627
+ for (n = VAL_INDEX (value ); n < VAL_TAIL (value ); n ++ ) {
628
+ c = (BYTE_SIZE (VAL_SERIES (value ))) ? (REBUNI )(bp [n ]) : up [n ];
629
+ if (c == '@' ) goto mold_ref_all ;
630
+ if (IS_LEX_WORD (c ) || IS_LEX_NUMBER (c )) continue ;
631
+ if (c < 21 || IS_LEX_ANY_SPACE (c ) || IS_LEX_DELIMIT (c )) goto mold_ref_all ;
632
+ }
633
+
634
+ Append_Byte (mold -> series , '@' );
635
+ Insert_String (mold -> series , AT_TAIL , VAL_SERIES (value ), VAL_INDEX (value ), VAL_LEN (value ), 0 );
636
+ return ;
637
+ mold_ref_all :
638
+ Mold_All_Constr_String (value , mold );
639
+ }
640
+
597
641
598
642
/***********************************************************************
599
643
************************************************************************
@@ -1258,6 +1302,11 @@ STOID Mold_Error(REBVAL *value, REB_MOLD *mold, REBFLG molded)
1258
1302
Append_UTF8 (ser , Get_Sym_Name (VAL_WORD_SYM (value )), -1 );
1259
1303
break ;
1260
1304
1305
+ case REB_REF :
1306
+ // FORM happens in top section.
1307
+ Mold_Ref (value , mold );
1308
+ break ;
1309
+
1261
1310
case REB_REFINEMENT :
1262
1311
if (molded )
1263
1312
Emit (mold , "/W" , value );
0 commit comments