Skip to content

Commit cfcf787

Browse files
committed
Migrated all 7 additional calls to the MCStringNormalizeLineEndings function.
Existing calls to the "to" version retained the PS/LS conversion. Existing "from" versions were configured to use CRLF for Windows and LF otherwise. Script only stacks will retain line endings that they originate in. Default for new files is LF. Made the requested style/format changes. Removed LFCR detection (treated as LF, but will yield double spaced lines). Compiled and verified on my Sierra system to open/save CR and CRLF files and retain line endings.
1 parent 2bf7293 commit cfcf787

File tree

10 files changed

+183
-168
lines changed

10 files changed

+183
-168
lines changed

engine/src/clipboard.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1476,7 +1476,11 @@ bool MCClipboard::CopyAsEncodedText(const MCRawClipboardItem* p_item, MCRawClipb
14761476
if (!MCStringDecode(*t_encoded, p_encoding, false, &t_string))
14771477
return false;
14781478

1479-
return MCStringConvertLineEndingsToLiveCode(*t_string, r_text);
1479+
return MCStringNormalizeLineEndings(*t_string,
1480+
kMCStringLineEndingStyleLF,
1481+
true,
1482+
r_text,
1483+
nullptr);
14801484
}
14811485

14821486
bool MCClipboard::CopyAsData(MCRawClipboardKnownType p_type, MCDataRef& r_data) const

engine/src/dispatch.cpp

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -672,22 +672,23 @@ static MCStack* script_only_stack_from_bytes(uint8_t *p_bytes,
672672
uindex_t p_size,
673673
MCStringEncoding p_encoding)
674674
{
675-
MCAutoStringRef t_raw_script_string, t_LC_script_string;
675+
MCAutoStringRef t_raw_script_string, t_lc_script_string;
676676
MCStringLineEndingStyle t_line_encoding_style;
677677

678678
if (!MCStringCreateWithBytes(p_bytes, p_size, p_encoding, false,
679679
&t_raw_script_string) ||
680680
!MCStringNormalizeLineEndings(*t_raw_script_string,
681-
kMCStringLineEndingStyleLF,
682-
&t_LC_script_string,
681+
kMCStringLineEndingStyleLF,
682+
true,
683+
&t_lc_script_string,
683684
&t_line_encoding_style))
684685
{
685686
return nullptr;
686687
}
687688

688689
// Now attempt to parse the header line:
689690
// 'script' <string>
690-
MCScriptPoint sp(*t_LC_script_string);
691+
MCScriptPoint sp(*t_lc_script_string);
691692

692693
// Parse 'script' token.
693694
if (sp . skip_token(SP_FACTOR, TT_PROPERTY, P_SCRIPT) != PS_NORMAL)
@@ -722,7 +723,7 @@ static MCStack* script_only_stack_from_bytes(uint8_t *p_bytes,
722723
uint32_t t_index = 0;
723724

724725
// Jump over the possible lines before the string token
725-
while (MCStringFirstIndexOfChar(*t_LC_script_string, '\n', t_index,
726+
while (MCStringFirstIndexOfChar(*t_lc_script_string, '\n', t_index,
726727
kMCStringOptionCompareExact, t_index)
727728
&& t_lines > 0)
728729
{
@@ -733,13 +734,13 @@ static MCStack* script_only_stack_from_bytes(uint8_t *p_bytes,
733734
t_index += 1;
734735

735736
// t_line now has the last LineFeed of the token
736-
MCAutoStringRef t_LC_script_body;
737+
MCAutoStringRef t_lc_script_body;
737738

738739
// We copy the body of the stack script
739-
if (!MCStringCopySubstring(*t_LC_script_string,
740+
if (!MCStringCopySubstring(*t_lc_script_string,
740741
MCRangeMake(t_index,
741-
MCStringGetLength(*t_LC_script_string)
742-
- t_index), &t_LC_script_body))
742+
MCStringGetLength(*t_lc_script_string)
743+
- t_index), &t_lc_script_body))
743744
{
744745
return nullptr;
745746
}
@@ -750,7 +751,7 @@ static MCStack* script_only_stack_from_bytes(uint8_t *p_bytes,
750751
return nullptr;
751752

752753
// Set it up as script only.
753-
t_stack -> setasscriptonly(*t_LC_script_body);
754+
t_stack -> setasscriptonly(*t_lc_script_body);
754755

755756
// Set its name.
756757
t_stack -> setname(*t_script_name);
@@ -1126,7 +1127,6 @@ IO_stat MCDispatch::dosavescriptonlystack(MCStack *sptr, const MCStringRef p_fna
11261127

11271128
// Compute the body of the script file.
11281129
MCAutoStringRef t_converted;
1129-
//MCStringLineEndingStyle t_line_encoding_style;
11301130

11311131
// MW-2014-10-24: [[ Bug 13791 ]] We need to post-process the generated string on some
11321132
// platforms for line-ending conversion so temporarily need a stringref - hence we
@@ -1140,8 +1140,11 @@ IO_stat MCDispatch::dosavescriptonlystack(MCStack *sptr, const MCStringRef p_fna
11401140
// Write out the standard script stack header, and then the script itself
11411141
MCStringFormat(&t_script_body, "script \"%@\"\n%@", sptr -> getname(), sptr->_getscript());
11421142

1143-
MCStringNormalizeLineEndings(*t_script_body, sptr -> getlineencodingstyle(),
1144-
&t_converted, nullptr);
1143+
MCStringNormalizeLineEndings(*t_script_body,
1144+
sptr -> getlineencodingstyle(),
1145+
false,
1146+
&t_converted,
1147+
nullptr);
11451148
}
11461149

11471150
// Open the output stream.

engine/src/exec-files.cpp

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1953,8 +1953,19 @@ static void MCFilesReadComplete(MCExecContext& ctxt, MCValueRef p_output, IO_sta
19531953
if (t_textmode)
19541954
{
19551955
MCAutoStringRef t_output;
1956-
/* UNCHECKED*/ MCStringConvertLineEndingsToLiveCode((MCStringRef)p_output, &t_output);
1957-
ctxt . SetItToValue(*t_output);
1956+
if (!MCStringNormalizeLineEndings((MCStringRef)p_output,
1957+
kMCStringLineEndingStyleLF,
1958+
true,
1959+
&t_output,
1960+
nullptr))
1961+
{
1962+
// handle error condition?
1963+
// ctxt . SetTheResultToStaticCString("error normalizing line endings");
1964+
}
1965+
else
1966+
{
1967+
ctxt . SetItToValue(*t_output);
1968+
}
19581969
}
19591970
else
19601971
{
@@ -2447,12 +2458,23 @@ void MCFilesExecWriteToFileOrDriver(MCExecContext& ctxt, MCNameRef p_file, MCStr
24472458
}
24482459

24492460
if (t_encoding != kMCFileEncodingBinary)
2450-
{
2451-
MCAutoStringRef t_text_data;
2452-
/* UNCHECKED */ MCStringConvertLineEndingsFromLiveCode(p_data, &t_text_data);
2461+
{
2462+
MCAutoStringRef t_text_data;
2463+
if (!MCStringNormalizeLineEndings(p_data,
2464+
#ifdef __CRLF__
2465+
kMCStringLineEndingStyleCRLF,
2466+
#else
2467+
kMCStringLineEndingStyleLF,
2468+
#endif
2469+
false,
2470+
&t_text_data,
2471+
nullptr))
2472+
{
2473+
return;
2474+
}
24532475
MCFilesExecWriteToStream(ctxt, t_stream, *t_text_data, p_unit_type, t_encoding, t_stat);
2454-
}
2455-
else
2476+
}
2477+
else
24562478
MCFilesExecWriteToStream(ctxt, t_stream, p_data, p_unit_type, t_encoding, t_stat);
24572479

24582480
if (t_stat != IO_NORMAL)
@@ -2510,7 +2532,18 @@ void MCFilesExecWriteToProcess(MCExecContext& ctxt, MCNameRef p_process, MCStrin
25102532
if (MCprocesses[t_index].encoding != EN_BINARY)
25112533
{
25122534
MCStringRef t_text_data;
2513-
/* UNCHECKED */ MCStringConvertLineEndingsFromLiveCode(p_data, t_text_data);
2535+
if (!MCStringNormalizeLineEndings(p_data,
2536+
#ifdef __CRLF__
2537+
kMCStringLineEndingStyleCRLF,
2538+
#else
2539+
kMCStringLineEndingStyleLF,
2540+
#endif
2541+
false,
2542+
t_text_data,
2543+
nullptr))
2544+
{
2545+
return;
2546+
}
25142547
// MW-2004-11-17: EOD should only happen when writing to processes in text-mode
25152548
if (MCStringFirstIndexOfChar(t_text_data, '\004', 0, kMCCompareExact, t_offset))
25162549
{

engine/src/foundation-legacy.cpp

Lines changed: 0 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -314,93 +314,6 @@ bool MCCStringFromUnicode(const unichar_t *p_unicode_string, char*& r_string)
314314

315315
////////////////////////////////////////////////////////////////////////////////
316316

317-
// BWM-2017-08-16: [[ Bug 17810 ]] Restore line endings of script-only-stack to
318-
// match how they were when originally imported.
319-
bool MCStringConvertLineEndingsFromLiveCode(MCStringRef p_input,
320-
bool p_use_LF_line_endings, bool p_use_CR_line_endings, MCStringRef& r_output)
321-
{
322-
if (p_use_CR_line_endings)
323-
{
324-
MCStringRef t_mutable_input;
325-
if (p_use_LF_line_endings)
326-
{
327-
/* UNCHECKED */ MCStringMutableCopy(p_input, t_mutable_input);
328-
/* UNCHECKED */ MCStringFindAndReplace(t_mutable_input, MCSTR("\n"), MCSTR("\r\n"), kMCStringOptionCompareExact);
329-
}
330-
else
331-
{
332-
/* UNCHECKED */ MCStringMutableCopy(p_input, t_mutable_input);
333-
/* UNCHECKED */ MCStringFindAndReplaceChar(t_mutable_input, '\n', '\r', kMCStringOptionCompareExact);
334-
}
335-
/* UNCHECKED */ MCStringCopyAndRelease(t_mutable_input, r_output);
336-
}
337-
else
338-
{
339-
r_output = MCValueRetain(p_input);
340-
}
341-
342-
return true;
343-
}
344-
345-
bool MCStringConvertLineEndingsFromLiveCode(MCStringRef p_input, MCStringRef& r_output)
346-
{
347-
348-
#ifdef __CRLF__
349-
MCStringRef t_mutable_input;
350-
/* UNCHECKED */ MCStringMutableCopy(p_input, t_mutable_input);
351-
/* UNCHECKED */ MCStringFindAndReplace(t_mutable_input, MCSTR("\n"), MCSTR("\r\n"), kMCStringOptionCompareExact);
352-
/* UNCHECKED */ MCStringCopyAndRelease(t_mutable_input, r_output);
353-
#elif defined(__CR__)
354-
MCStringRef t_mutable_input;
355-
/* UNCHECKED */ MCStringMutableCopy(p_input, t_mutable_input);
356-
/* UNCHECKED */ MCStringFindAndReplaceChar(t_mutable_input, '\n', '\r', kMCStringOptionCompareExact);
357-
/* UNCHECKED */ MCStringCopyAndRelease(t_mutable_input, r_output);
358-
#else
359-
r_output = MCValueRetain(p_input);
360-
#endif
361-
362-
return true;
363-
}
364-
365-
bool MCStringConvertLineEndingsFromLiveCodeAndRelease(MCStringRef p_input, MCStringRef& r_output)
366-
{
367-
if (MCStringConvertLineEndingsFromLiveCode(p_input, r_output))
368-
{
369-
MCValueRelease(p_input);
370-
return true;
371-
}
372-
return false;
373-
}
374-
375-
bool MCStringConvertLineEndingsToLiveCode(MCStringRef p_input, MCStringRef& r_output)
376-
{
377-
MCStringRef t_mutable_input;
378-
/* UNCHECKED */ MCStringMutableCopy(p_input, t_mutable_input);
379-
/* UNCHECKED */ MCStringFindAndReplace(t_mutable_input, MCSTR("\r\n"), MCSTR("\n\r"), kMCStringOptionCompareExact);
380-
/* UNCHECKED */ MCStringFindAndReplace(t_mutable_input, MCSTR("\n\r"), MCSTR("\n"), kMCStringOptionCompareExact);
381-
/* UNCHECKED */ MCStringFindAndReplace(t_mutable_input, MCSTR("\r"), MCSTR("\n"), kMCStringOptionCompareExact);
382-
383-
// AL-2014-07-21: [[ Bug 12162 ]] Convert PS to LF, and LS to VT on text import.
384-
/* UNCHECKED */ MCStringFindAndReplaceChar (t_mutable_input, 0x2028, 0x0B, kMCStringOptionCompareExact);
385-
/* UNCHECKED */ MCStringFindAndReplaceChar (t_mutable_input, 0x2029, 0x0A, kMCStringOptionCompareExact);
386-
387-
388-
/* UNCHECKED */ MCStringCopyAndRelease(t_mutable_input, r_output);
389-
return true;
390-
}
391-
392-
bool MCStringConvertLineEndingsToLiveCodeAndRelease(MCStringRef p_input, MCStringRef& r_output)
393-
{
394-
if (MCStringConvertLineEndingsToLiveCode(p_input, r_output))
395-
{
396-
MCValueRelease(p_input);
397-
return true;
398-
}
399-
return false;
400-
}
401-
402-
////////////////////////////////////////////////////////////////////////////////
403-
404317
// Convert the given UTF-8 string to Unicode. Both counts are in bytes.
405318
// Returns the number of bytes used.
406319
int32_t UTF8ToUnicode(const char *p_src, int32_t p_src_count, uint16_t *p_dst, int32_t p_dst_count)

engine/src/foundation-legacy.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -149,14 +149,6 @@ bool MCListAppendUnsignedInteger(MCListRef self, uinteger_t p_value);
149149
int UTF8ToUnicode(const char * lpSrcStr, int cchSrc, uint16_t * lpDestStr, int cchDest);
150150
int UnicodeToUTF8(const uint16_t *lpSrcStr, int cchSrc, char *lpDestStr, int cchDest);
151151

152-
////////////////////////////////////////////////////////////////////////////////
153-
154-
bool MCStringConvertLineEndingsFromLiveCode(MCStringRef p_input, bool p_use_LF_line_endings, bool p_use_CR_line_endings, MCStringRef& r_output);
155-
bool MCStringConvertLineEndingsFromLiveCode(MCStringRef input, MCStringRef& r_output);
156-
bool MCStringConvertLineEndingsFromLiveCodeAndRelease(MCStringRef input, MCStringRef& r_output);
157-
bool MCStringConvertLineEndingsToLiveCode(MCStringRef input, MCStringRef& r_output);
158-
bool MCStringConvertLineEndingsToLiveCodeAndRelease(MCStringRef input, MCStringRef& r_output);
159-
160152
////////////////////////////////////////////////////////////////////////////////
161153
bool MCCStringClone(const char *s, char*& r_s);
162154
bool MCCStringCloneSubstring(const char *p_string, uint32_t p_length, char*& r_new_string);

engine/src/stack.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2047,14 +2047,6 @@ void MCStack::setasscriptonly(MCStringRef p_script)
20472047
}
20482048
}
20492049

2050-
// BWM-2017-08-16: [[ Bug 17810 ]] Retain line endings used when importing a
2051-
// script-only-stack.
2052-
void MCStack::setlineencodingstyle(MCStringLineEndingStyle p_line_encoding_style)
2053-
{
2054-
m_line_encoding_style = p_line_encoding_style;
2055-
}
2056-
2057-
20582050
MCPlatformControlType MCStack::getcontroltype()
20592051
{
20602052
MCPlatformControlType t_type;

engine/src/stack.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ class MCStack : public MCObject, public MCMixinObjectHandle<MCStack>
302302
bool m_is_script_only : 1;
303303

304304
// BWM-2017-08-16: [[ Bug 17810 ]] Line endings for imported script-only-stack.
305-
MCStringLineEndingStyle m_line_encoding_style;
305+
MCStringLineEndingStyle m_line_encoding_style : 2;
306306

307307
bool m_is_ide_stack : 1;
308308

@@ -951,8 +951,15 @@ class MCStack : public MCObject, public MCMixinObjectHandle<MCStack>
951951
void setasscriptonly(MCStringRef p_script);
952952

953953
// BWM-2017-08-16: [[ Bug 17810 ]] Get/set line endings for imported script-only-stack.
954-
MCStringLineEndingStyle getlineencodingstyle(void) const { return m_line_encoding_style; }
955-
void setlineencodingstyle(MCStringLineEndingStyle p_line_encoding_style);
954+
MCStringLineEndingStyle getlineencodingstyle(void) const
955+
{
956+
return m_line_encoding_style;
957+
}
958+
959+
void setlineencodingstyle(MCStringLineEndingStyle p_line_encoding_style)
960+
{
961+
m_line_encoding_style = p_line_encoding_style;
962+
}
956963

957964
inline bool getextendedstate(uint4 flag) const
958965
{

engine/src/sysspec.cpp

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1462,7 +1462,11 @@ bool MCS_loadtextfile(MCStringRef p_filename, MCStringRef& r_text)
14621462
t_success = MCStringCreateWithBytes((byte_t*)t_buffer.Chars() + t_bom_size, t_buffer.CharCount() - t_bom_size, MCS_file_to_string_encoding(t_file_encoding), false, &t_text);
14631463

14641464
if (t_success)
1465-
t_success = MCStringConvertLineEndingsToLiveCode(*t_text, r_text);
1465+
t_success = MCStringNormalizeLineEndings(*t_text,
1466+
kMCStringLineEndingStyleLF,
1467+
true,
1468+
r_text,
1469+
nullptr);
14661470

14671471
MCresult -> clear();
14681472
}
@@ -1564,7 +1568,15 @@ bool MCS_savetextfile(MCStringRef p_filename, MCStringRef p_string)
15641568
// convert the line endings before writing
15651569
MCAutoStringRef t_converted;
15661570
if (t_success)
1567-
t_success = MCStringConvertLineEndingsFromLiveCode(p_string, &t_converted);
1571+
t_success = MCStringNormalizeLineEndings(p_string,
1572+
#ifdef __CRLF__
1573+
kMCStringLineEndingStyleCRLF,
1574+
#else
1575+
kMCStringLineEndingStyleLF,
1576+
#endif
1577+
false,
1578+
&t_converted,
1579+
nullptr);
15681580

15691581
// Need to convert the string to a binary string
15701582
MCAutoDataRef t_data;
@@ -1789,8 +1801,14 @@ IO_stat MCS_runcmd(MCStringRef p_command, MCStringRef& r_output)
17891801
// SN-2014-10-14: [[ Bug 13658 ]] Get the behaviour back to what it was in 6.x:
17901802
// line-ending conversion for servers and Windows only
17911803
#if defined(_SERVER) || defined(_WINDOWS)
1792-
if (!MCStringConvertLineEndingsToLiveCode(*t_data_string, r_output))
1804+
if (!MCStringNormalizeLineEndings(*t_data_string,
1805+
kMCStringLineEndingStyleLF,
1806+
true,
1807+
r_output,
1808+
nullptr))
1809+
{
17931810
r_output = MCValueRetain(kMCEmptyString);
1811+
}
17941812
#else
17951813
r_output = MCValueRetain(*t_data_string);
17961814
#endif

libfoundation/include/foundation.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2730,11 +2730,15 @@ enum MCStringLineEndingStyle
27302730
kMCStringLineEndingStyleCRLF
27312731
};
27322732

2733-
MC_DLLEXPORT bool MCStringNormalizeLineEndings(
2734-
MCStringRef p_input,
2735-
MCStringLineEndingStyle p_to_style,
2736-
MCStringRef& r_output,
2737-
MCStringLineEndingStyle* r_original_style);
2733+
// Converts LF, CR, CRLF line endings in p_input to p_to_style line endings and
2734+
// places the result into r_output. If p_normalize_ps_ls is true, then it also converts
2735+
// PS to p_to_style, and LS to VTAB.
2736+
MC_DLLEXPORT bool
2737+
MCStringNormalizeLineEndings(MCStringRef p_input,
2738+
MCStringLineEndingStyle p_to_style,
2739+
bool p_normalize_ps_ls,
2740+
MCStringRef& r_output,
2741+
MCStringLineEndingStyle* r_original_style);
27382742

27392743
////////////////////////////////////////////////////////////////////////////////
27402744
//

0 commit comments

Comments
 (0)