@@ -66,6 +66,8 @@ along with LiveCode. If not see <http://www.gnu.org/licenses/>. */
6666#include " exec-interface.h"
6767#include " resolution.h"
6868
69+ #include " scriptpt.h"
70+
6971// //////////////////////////////////////////////////////////////////////////////
7072
7173MC_EXEC_DEFINE_GET_METHOD (Interface, DialogData, 1 )
@@ -2395,36 +2397,25 @@ void MCInterfaceEvalFocusedObjectAsObject(MCExecContext& ctxt, MCObjectPtr& r_ob
23952397 ctxt . LegacyThrow (EE_CHUNK_NOTARGET);
23962398}
23972399
2398- static MCStack *MCInterfaceTryToEvalBinaryStack (MCStringRef p_data, bool & r_binary_fail )
2400+ MCStack *MCInterfaceTryToEvalStackFromString (MCStringRef p_data)
23992401{
2400- uint4 offset;
2401- MCStack *t_stack;
2402- bool t_binary_fail;
2402+ char_t * t_string;
2403+ uindex_t t_length;
2404+ if (!MCStringConvertToNative (p_data, t_string, t_length))
2405+ return nil;
2406+
2407+ MCStack *t_stack = nil;
2408+ IO_handle stream = MCS_fakeopen (t_string, t_length);
2409+ /* UNCHECKED */ MCdispatcher->readfile (NULL , NULL , stream, t_stack);
2410+ MCS_close (stream);
24032411
2404- t_stack = nil;
2405- t_binary_fail = false ;
2406-
2407- if (MCStringFirstIndexOf (p_data, MCSTR (kMCStackFileMetaCardSignature ), 0 , kMCCompareExact , offset) && (MCStringGetLength (p_data) > 8 && MCStringBeginsWithCString (p_data, (const char_t *)" REVO" , kMCCompareExact )))
2408- {
2409- char_t * t_string;
2410- uindex_t t_length;
2411- /* UNCHECKED */ MCStringConvertToNative (p_data, t_string, t_length);
2412- IO_handle stream = MCS_fakeopen (t_string, t_length);
2413- /* UNCHECKED */ MCdispatcher->readfile (NULL , NULL , stream, t_stack);
2414- MCS_close (stream);
2415- t_binary_fail = t_stack == nil;
2416- }
2417-
2418- r_binary_fail = t_binary_fail;
24192412 return t_stack;
24202413}
24212414
24222415void MCInterfaceEvalBinaryStackAsObject (MCExecContext& ctxt, MCStringRef p_data, MCObjectPtr& r_object)
24232416{
24242417 MCStack *t_stack;
2425- bool t_binary_fail;
2426-
2427- t_stack = MCInterfaceTryToEvalBinaryStack (p_data, t_binary_fail);
2418+ t_stack = MCInterfaceTryToEvalStackFromString (p_data);
24282419
24292420 if (t_stack != nil)
24302421 {
@@ -2477,11 +2468,37 @@ void MCInterfaceEvalStackOfStackById(MCExecContext& ctxt, MCObjectPtr p_parent,
24772468 ctxt . LegacyThrow (EE_CHUNK_NOSTACK);
24782469}
24792470
2471+ bool MCInterfaceStringCouldBeStack (MCStringRef p_string)
2472+ {
2473+ // Check if it could be a binary stack
2474+ uindex_t t_offset;
2475+ if (MCStringFirstIndexOf (p_string,
2476+ MCSTR (kMCStackFileMetaCardSignature ), 0 ,
2477+ kMCCompareExact , t_offset) ||
2478+ (MCStringGetLength (p_string) > 8 &&
2479+ MCStringBeginsWithCString (p_string, (const char_t *)" REVO" ,
2480+ kMCCompareExact )))
2481+ return true ;
2482+
2483+ // Check if it could be a script-only stack
2484+ MCScriptPoint sp (p_string);
2485+ // Parse 'script' token.
2486+ if (sp . skip_token (SP_FACTOR, TT_PROPERTY, P_SCRIPT) != PS_NORMAL)
2487+ return false ;
2488+
2489+ // Parse <string> token.
2490+ Symbol_type t_type;
2491+ if (sp . next (t_type) != PS_NORMAL || t_type != ST_LIT)
2492+ return false ;
2493+
2494+ // Parse end of line.
2495+ Parse_stat t_stat = sp . next (t_type);
2496+ return (t_stat == PS_EOL || t_stat == PS_EOF);
2497+ }
2498+
24802499void MCInterfaceEvalStackByValue (MCExecContext& ctxt, MCValueRef p_value, MCObjectPtr& r_stack)
24812500{
2482- uint4 offset;
2483-
2484- if (MCStringFirstIndexOf ((MCStringRef)p_value, MCSTR (kMCStackFileMetaCardSignature ), 0 , kMCCompareExact , offset) && MCStringGetLength ((MCStringRef)p_value) > 8 && MCStringBeginsWithCString ((MCStringRef)p_value, (const char_t *)" REVO" , kMCCompareExact ))
2501+ if (MCInterfaceStringCouldBeStack ((MCStringRef)p_value))
24852502 {
24862503 MCInterfaceEvalBinaryStackAsObject (ctxt, (MCStringRef)p_value, r_stack);
24872504 return ;
@@ -3270,51 +3287,6 @@ void MCInterfaceEvalStackOfOptionalStackById(MCExecContext& ctxt, MCObjectPtr p_
32703287 r_stack . part_id = p_parent . part_id;
32713288}
32723289
3273- void MCInterfaceEvalOptionalStackOrCardByValue (MCExecContext& ctxt, MCValueRef p_value, MCObjectPtr& r_object)
3274- {
3275- ctxt . SetTheResultToEmpty ();
3276-
3277- MCStack *t_stack;
3278- bool t_binary_fail;
3279-
3280- t_stack = MCInterfaceTryToEvalBinaryStack ((MCStringRef)p_value, t_binary_fail);
3281-
3282- if (t_binary_fail)
3283- {
3284- ctxt . SetTheResultToStaticCString (" can't build stack from string" );
3285- r_object . object = nil;
3286- r_object . part_id = 0 ;
3287- return ;
3288- }
3289-
3290- if (t_stack == nil)
3291- {
3292- integer_t t_id;
3293- if (MCU_stoi4 ((MCStringRef)p_value, t_id))
3294- t_stack = MCdefaultstackptr -> findstackid (t_id);
3295- }
3296-
3297- if (t_stack == nil)
3298- t_stack = MCdefaultstackptr -> findstackname ((MCNameRef)p_value);
3299-
3300- if (t_stack != nil)
3301- {
3302- r_object . object = t_stack;
3303- r_object . part_id = 0 ;
3304- return ;
3305- }
3306-
3307- bool t_parse_error;
3308-
3309- if (!MCEngineEvalValueAsObject (p_value, false , r_object, t_parse_error))
3310- {
3311- if (t_parse_error)
3312- ctxt . SetTheResultToStaticCString (" no such card" );
3313- r_object . object = nil;
3314- r_object . part_id = 0 ;
3315- }
3316- }
3317-
33183290void MCInterfaceEvalSubstackOfOptionalStackByName (MCExecContext& ctxt, MCObjectPtr p_parent, MCNameRef p_name, MCObjectPtr& r_stack)
33193291{
33203292 MCStack *t_stack;
0 commit comments