Skip to content

Commit 091cc16

Browse files
committed
Added MCStringLineEndingOptions enum and updated functions to use new values. Moved native line ending handling to enum definition in the header file.
1 parent cfcf787 commit 091cc16

7 files changed

Lines changed: 66 additions & 55 deletions

File tree

engine/src/clipboard.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1478,7 +1478,8 @@ bool MCClipboard::CopyAsEncodedText(const MCRawClipboardItem* p_item, MCRawClipb
14781478

14791479
return MCStringNormalizeLineEndings(*t_string,
14801480
kMCStringLineEndingStyleLF,
1481-
true,
1481+
kMCStringLineEndingOptionNormalizePSToLineEnding |
1482+
kMCStringLineEndingOptionNormalizeLSToVT,
14821483
r_text,
14831484
nullptr);
14841485
}

engine/src/dispatch.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,8 @@ static MCStack* script_only_stack_from_bytes(uint8_t *p_bytes,
679679
&t_raw_script_string) ||
680680
!MCStringNormalizeLineEndings(*t_raw_script_string,
681681
kMCStringLineEndingStyleLF,
682-
true,
682+
kMCStringLineEndingOptionNormalizePSToLineEnding |
683+
kMCStringLineEndingOptionNormalizeLSToVT,
683684
&t_lc_script_string,
684685
&t_line_encoding_style))
685686
{

engine/src/exec-files.cpp

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1955,12 +1955,13 @@ static void MCFilesReadComplete(MCExecContext& ctxt, MCValueRef p_output, IO_sta
19551955
MCAutoStringRef t_output;
19561956
if (!MCStringNormalizeLineEndings((MCStringRef)p_output,
19571957
kMCStringLineEndingStyleLF,
1958-
true,
1958+
kMCStringLineEndingOptionNormalizePSToLineEnding |
1959+
kMCStringLineEndingOptionNormalizeLSToVT,
19591960
&t_output,
19601961
nullptr))
19611962
{
1962-
// handle error condition?
1963-
// ctxt . SetTheResultToStaticCString("error normalizing line endings");
1963+
ctxt . SetItToEmpty();
1964+
ctxt . SetTheResultToStaticCString("error normalizing line endings");
19641965
}
19651966
else
19661967
{
@@ -2461,11 +2462,7 @@ void MCFilesExecWriteToFileOrDriver(MCExecContext& ctxt, MCNameRef p_file, MCStr
24612462
{
24622463
MCAutoStringRef t_text_data;
24632464
if (!MCStringNormalizeLineEndings(p_data,
2464-
#ifdef __CRLF__
2465-
kMCStringLineEndingStyleCRLF,
2466-
#else
2467-
kMCStringLineEndingStyleLF,
2468-
#endif
2465+
kMCStringLineEndingStyleLegacyNative,
24692466
false,
24702467
&t_text_data,
24712468
nullptr))
@@ -2533,11 +2530,7 @@ void MCFilesExecWriteToProcess(MCExecContext& ctxt, MCNameRef p_process, MCStrin
25332530
{
25342531
MCStringRef t_text_data;
25352532
if (!MCStringNormalizeLineEndings(p_data,
2536-
#ifdef __CRLF__
2537-
kMCStringLineEndingStyleCRLF,
2538-
#else
2539-
kMCStringLineEndingStyleLF,
2540-
#endif
2533+
kMCStringLineEndingStyleLegacyNative,
25412534
false,
25422535
t_text_data,
25432536
nullptr))

engine/src/stack.h

Lines changed: 1 addition & 1 deletion
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 : 2;
305+
MCStringLineEndingStyle m_line_encoding_style : 3;
306306

307307
bool m_is_ide_stack : 1;
308308

engine/src/sysspec.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1464,7 +1464,8 @@ bool MCS_loadtextfile(MCStringRef p_filename, MCStringRef& r_text)
14641464
if (t_success)
14651465
t_success = MCStringNormalizeLineEndings(*t_text,
14661466
kMCStringLineEndingStyleLF,
1467-
true,
1467+
kMCStringLineEndingOptionNormalizePSToLineEnding |
1468+
kMCStringLineEndingOptionNormalizeLSToVT,
14681469
r_text,
14691470
nullptr);
14701471

@@ -1569,11 +1570,7 @@ bool MCS_savetextfile(MCStringRef p_filename, MCStringRef p_string)
15691570
MCAutoStringRef t_converted;
15701571
if (t_success)
15711572
t_success = MCStringNormalizeLineEndings(p_string,
1572-
#ifdef __CRLF__
1573-
kMCStringLineEndingStyleCRLF,
1574-
#else
1575-
kMCStringLineEndingStyleLF,
1576-
#endif
1573+
kMCStringLineEndingStyleLegacyNative,
15771574
false,
15781575
&t_converted,
15791576
nullptr);
@@ -1803,7 +1800,8 @@ IO_stat MCS_runcmd(MCStringRef p_command, MCStringRef& r_output)
18031800
#if defined(_SERVER) || defined(_WINDOWS)
18041801
if (!MCStringNormalizeLineEndings(*t_data_string,
18051802
kMCStringLineEndingStyleLF,
1806-
true,
1803+
kMCStringLineEndingOptionNormalizePSToLineEnding |
1804+
kMCStringLineEndingOptionNormalizeLSToVT,
18071805
r_output,
18081806
nullptr))
18091807
{

libfoundation/include/foundation.h

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2727,16 +2727,35 @@ enum MCStringLineEndingStyle
27272727
{
27282728
kMCStringLineEndingStyleLF,
27292729
kMCStringLineEndingStyleCR,
2730-
kMCStringLineEndingStyleCRLF
2730+
kMCStringLineEndingStyleCRLF,
2731+
#if defined(__CRLF__)
2732+
kMCStringLineEndingStyleLegacyNative = kMCStringLineEndingStyleCRLF,
2733+
#elif defined(__CR__)
2734+
kMCStringLineEndingStyleLegacyNative = kMCStringLineEndingStyleCR,
2735+
#elif defined(__LF__)
2736+
kMCStringLineEndingStyleLegacyNative = kMCStringLineEndingStyleLF,
2737+
#else
2738+
#error Unknown default line ending style (no __CRLF__, __CR__, __LF__ definition)
2739+
#endif
2740+
};
2741+
2742+
typedef uint32_t MCStringLineEndingOptions;
2743+
enum
2744+
{
2745+
/* Normalize any occurrence of PS (paragraph separator) to the specified line-ending style */
2746+
kMCStringLineEndingOptionNormalizePSToLineEnding = 1 << 0,
2747+
/* Normalize any occurrence of LS (line separator) to VT (vertical tab) */
2748+
kMCStringLineEndingOptionNormalizeLSToVT = 1 << 1,
27312749
};
27322750

27332751
// 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.
2752+
// places the result into r_output. PS to p_to_style and LS to VTAB conversions
2753+
// are performed if the appropriate flags are set in p_options. Detected line
2754+
// endings of p_input are returned in r_original_style.
27362755
MC_DLLEXPORT bool
27372756
MCStringNormalizeLineEndings(MCStringRef p_input,
27382757
MCStringLineEndingStyle p_to_style,
2739-
bool p_normalize_ps_ls,
2758+
MCStringLineEndingOptions p_options,
27402759
MCStringRef& r_output,
27412760
MCStringLineEndingStyle* r_original_style);
27422761

libfoundation/src/foundation-string.cpp

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6966,7 +6966,7 @@ bool MCStringGetNumericValue(MCStringRef self, double &r_value)
69666966
MC_DLLEXPORT bool
69676967
MCStringNormalizeLineEndings(MCStringRef p_input,
69686968
MCStringLineEndingStyle p_to_style,
6969-
bool p_normalize_ps_ls,
6969+
MCStringLineEndingOptions p_options,
69706970
MCStringRef& r_output,
69716971
MCStringLineEndingStyle* r_original_style)
69726972
{
@@ -7015,40 +7015,39 @@ MCStringNormalizeLineEndings(MCStringRef p_input,
70157015
}
70167016

70177017
// AL-2014-07-21: [[ Bug 12162 ]] Convert PS to LF, and LS to VT on text import.
7018-
if (p_normalize_ps_ls)
7018+
if (((p_options & kMCStringLineEndingOptionNormalizeLSToVT) != 0) &&
7019+
!MCStringFindAndReplaceChar(*t_mutable_input,
7020+
(const codepoint_t)0x2028,
7021+
(const codepoint_t)0x0B,
7022+
kMCStringOptionCompareExact))
70197023
{
7020-
if (!MCStringFindAndReplaceChar(*t_mutable_input,
7021-
(const codepoint_t)0x2028,
7022-
(const codepoint_t)0x0B,
7023-
kMCStringOptionCompareExact))
7024-
{
7025-
return false;
7026-
}
7027-
if (!MCStringFindAndReplaceChar(*t_mutable_input,
7028-
(const codepoint_t)0x2029,
7029-
(const codepoint_t)0x0A,
7030-
kMCStringOptionCompareExact))
7031-
{
7032-
return false;
7033-
}
7024+
return false;
7025+
}
7026+
if (((p_options & kMCStringLineEndingOptionNormalizePSToLineEnding) != 0) &&
7027+
!MCStringFindAndReplaceChar(*t_mutable_input,
7028+
(const codepoint_t)0x2029,
7029+
(const codepoint_t)0x0A,
7030+
kMCStringOptionCompareExact))
7031+
{
7032+
return false;
70347033
}
70357034

70367035
// now convert the line endings to the proper version
7037-
if (p_to_style == kMCStringLineEndingStyleCR)
7036+
if ((p_to_style == kMCStringLineEndingStyleCR) &&
7037+
!MCStringFindAndReplace(*t_mutable_input,
7038+
MCSTR("\n"),
7039+
MCSTR("\r"),
7040+
kMCStringOptionCompareExact))
70387041
{
7039-
if (!MCStringFindAndReplace(*t_mutable_input, MCSTR("\n"),
7040-
MCSTR("\r"), kMCStringOptionCompareExact))
7041-
{
7042-
return false;
7043-
}
7042+
return false;
70447043
}
7045-
else if (p_to_style == kMCStringLineEndingStyleCRLF)
7044+
else if ((p_to_style == kMCStringLineEndingStyleCRLF) &&
7045+
!MCStringFindAndReplace(*t_mutable_input,
7046+
MCSTR("\n"),
7047+
MCSTR("\r\n"),
7048+
kMCStringOptionCompareExact))
70467049
{
7047-
if (!MCStringFindAndReplace(*t_mutable_input, MCSTR("\n"),
7048-
MCSTR("\r\n"), kMCStringOptionCompareExact))
7049-
{
7050-
return false;
7051-
}
7050+
return false;
70527051
}
70537052

70547053
if (!t_mutable_input.MakeImmutable())

0 commit comments

Comments
 (0)