Execute CopyPasta Language: Difference between revisions
Content added Content deleted
(Added Wren) |
m (→{{header|Phix}}: added syntax colouring the hard way) |
||
Line 778: | Line 778: | ||
If run without command-line parameters it fakes four runs.<br> |
If run without command-line parameters it fakes four runs.<br> |
||
Assumes if clipboard is "hello ", Duplicate 2 should leave it as "hello hello hello ". |
Assumes if clipboard is "hello ", Duplicate 2 should leave it as "hello hello hello ". |
||
<lang Phix> |
<!--<lang Phix>(phixonline)--> |
||
<span style="color: #008080;">constant</span> <span style="color: #000000;">prog1_cp</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""" |
|||
Copy |
|||
Copy |
|||
Rosetta Code |
|||
Rosetta Code |
|||
Duplicate |
|||
Duplicate |
|||
2 |
|||
2 |
|||
Pasta! |
|||
Pasta! |
|||
La Vista |
|||
La Vista |
|||
""", |
|||
"""</span><span style="color: #0000FF;">,</span> |
|||
prog2_cp = """ |
|||
<span style="color: #000000;">prog2_cp</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""" |
|||
CopyFile |
|||
CopyFile |
|||
pasta.txt |
|||
pasta.txt |
|||
Duplicate |
|||
Duplicate |
|||
1 |
|||
1 |
|||
Pasta! |
|||
Pasta! |
|||
""", |
|||
"""</span><span style="color: #0000FF;">,</span> |
|||
prog3_cp = """ |
|||
<span style="color: #000000;">prog3_cp</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""" |
|||
Copy |
|||
Copy |
|||
Invalid |
|||
Invalid |
|||
Duplicate |
|||
Duplicate |
|||
1 |
|||
1 |
|||
Goto |
|||
Goto |
|||
3 |
|||
3 |
|||
Pasta! |
|||
Pasta! |
|||
""", |
|||
"""</span><span style="color: #0000FF;">,</span> |
|||
pasta_txt = """ |
|||
<span style="color: #000000;">pasta_txt</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""" |
|||
I'm the pasta.txt file. |
|||
I'm the pasta.txt file. |
|||
""", |
|||
"""</span><span style="color: #0000FF;">,</span> |
|||
fake_files = {"prog1.cp","prog2.cp","prog3.cp","pasta.txt"}, |
|||
<span style="color: #000000;">fake_files</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"prog1.cp"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"prog2.cp"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"prog3.cp"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"pasta.txt"</span><span style="color: #0000FF;">},</span> |
|||
fake_texts = { prog1_cp , prog2_cp , prog3_cp , pasta_txt } |
|||
<span style="color: #000000;">fake_texts</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span> <span style="color: #000000;">prog1_cp</span> <span style="color: #0000FF;">,</span> <span style="color: #000000;">prog2_cp</span> <span style="color: #0000FF;">,</span> <span style="color: #000000;">prog3_cp</span> <span style="color: #0000FF;">,</span> <span style="color: #000000;">pasta_txt</span> <span style="color: #0000FF;">}</span> |
|||
function get_file_lines(string filename) |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">get_file_lines</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">filename</span><span style="color: #0000FF;">)</span> |
|||
sequence lines |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">lines</span> |
|||
integer k = find(filename,fake_files) |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">,</span><span style="color: #000000;">fake_files</span><span style="color: #0000FF;">)</span> |
|||
if k then |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">k</span> <span style="color: #008080;">then</span> |
|||
lines = split(fake_texts[k],"\n") |
|||
<span style="color: #000000;">lines</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">split</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fake_texts</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">],</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)</span> |
|||
elsif get_file_type(filename)!=FILETYPE_FILE then |
|||
<span style="color: #008080;">elsif</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()=</span><span style="color: #004600;">JS</span> |
|||
crash("file not found:%s",{filename}) |
|||
<span style="color: #008080;">or</span> <span style="color: #7060A8;">get_file_type</span><span style="color: #0000FF;">(</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">)!=</span><span style="color: #004600;">FILETYPE_FILE</span> <span style="color: #008080;">then</span> |
|||
else |
|||
<span style="color: #7060A8;">crash</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"file not found:%s"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">})</span> |
|||
lines = get_text(filename,GT_LF_STRIPPED) |
|||
<span style="color: #008080;">else</span> |
|||
end if |
|||
<span style="color: #000000;">lines</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">get_text</span><span style="color: #0000FF;">(</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">,</span><span style="color: #004600;">GT_LF_STRIPPED</span><span style="color: #0000FF;">)</span> |
|||
return lines |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end function |
|||
<span style="color: #008080;">return</span> <span style="color: #000000;">lines</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
procedure interpret(string filename) |
|||
printf(1,"\ninterpret(%s):\n",{filename}) |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">interpret</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">filename</span><span style="color: #0000FF;">)</span> |
|||
sequence pgm = get_file_lines(filename)&{""} |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\ninterpret(%s):\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">})</span> |
|||
string clipboard = "" |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">pgm</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">get_file_lines</span><span style="color: #0000FF;">(</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">)&{</span><span style="color: #008000;">""</span><span style="color: #0000FF;">}</span> |
|||
integer pc = 1 |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">clipboard</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span> |
|||
while true do |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">pc</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span> |
|||
if pc>=length(pgm) then crash("No Pasta! Sucha mistaka to maka") end if |
|||
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span> |
|||
string cmd = trim(pgm[pc]), arg = pgm[pc+1] |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">pc</span><span style="color: #0000FF;">>=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pgm</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #7060A8;">crash</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"No Pasta! Sucha mistaka to maka"</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
switch cmd do |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">cmd</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">trim</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pgm</span><span style="color: #0000FF;">[</span><span style="color: #000000;">pc</span><span style="color: #0000FF;">]),</span> <span style="color: #000000;">arg</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">pgm</span><span style="color: #0000FF;">[</span><span style="color: #000000;">pc</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> |
|||
case "Copy": clipboard &= arg&"\n" |
|||
<span style="color: #008080;">switch</span> <span style="color: #000000;">cmd</span> <span style="color: #008080;">do</span> |
|||
case "CopyFile": clipboard &= join(iff(arg="TheF*ckingCode"?pgm:get_file_lines(arg)),"\n") |
|||
<span style="color: #008080;">case</span> <span style="color: #008000;">"Copy"</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">clipboard</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">arg</span><span style="color: #0000FF;">&</span><span style="color: #008000;">"\n"</span> |
|||
case "Duplicate": clipboard &= join(repeat(clipboard,to_integer(arg)),"") |
|||
<span style="color: #008080;">case</span> <span style="color: #008000;">"CopyFile"</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">clipboard</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">arg</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"TheF*ckingCode"</span><span style="color: #0000FF;">?</span><span style="color: #000000;">pgm</span><span style="color: #0000FF;">:</span><span style="color: #000000;">get_file_lines</span><span style="color: #0000FF;">(</span><span style="color: #000000;">arg</span><span style="color: #0000FF;">)),</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span> |
|||
case "Pasta!": puts(1,clipboard); return |
|||
<span style="color: #008080;">case</span> <span style="color: #008000;">"Duplicate"</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">clipboard</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">clipboard</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">to_integer</span><span style="color: #0000FF;">(</span><span style="color: #000000;">arg</span><span style="color: #0000FF;">)),</span><span style="color: #008000;">""</span><span style="color: #0000FF;">)</span> |
|||
case "": pc -= 1; break -- (skip blank lines [w/o arg]) |
|||
<span style="color: #008080;">case</span> <span style="color: #008000;">"Pasta!"</span><span style="color: #0000FF;">:</span> <span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">clipboard</span><span style="color: #0000FF;">);</span> <span style="color: #008080;">return</span> |
|||
else crash("unknown command: %s on line %d",{cmd,pc}) |
|||
<span style="color: #008080;">case</span> <span style="color: #008000;">""</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">pc</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">;</span> <span style="color: #008080;">break</span> <span style="color: #000080;font-style:italic;">-- (skip blank lines [w/o arg])</span> |
|||
end switch |
|||
<span style="color: #008080;">else</span> <span style="color: #7060A8;">crash</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"unknown command: %s on line %d"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">cmd</span><span style="color: #0000FF;">,</span><span style="color: #000000;">pc</span><span style="color: #0000FF;">})</span> |
|||
pc += 2 |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">switch</span> |
|||
end while |
|||
<span style="color: #000000;">pc</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">2</span> |
|||
end procedure |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
procedure main() |
|||
sequence cl = command_line() |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">main</span><span style="color: #0000FF;">()</span> |
|||
if length(cl)=2 then |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">cl</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()=</span><span style="color: #004600;">JS</span><span style="color: #0000FF;">?{</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">}:</span><span style="color: #7060A8;">command_line</span><span style="color: #0000FF;">())</span> |
|||
for i=1 to 4 do |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cl</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">2</span> <span style="color: #008080;">then</span> |
|||
try |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">4</span> <span style="color: #008080;">do</span> |
|||
interpret(sprintf("prog%d.cp",i)) |
|||
<span style="color: #008080;">try</span> |
|||
<span style="color: #000000;">interpret</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"prog%d.cp"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">))</span> |
|||
?e[E_USER] |
|||
<span style="color: #008080;">catch</span> <span style="color: #000000;">e</span> |
|||
end try |
|||
<span style="color: #0000FF;">?</span><span style="color: #000000;">e</span><span style="color: #0000FF;">[</span><span style="color: #004600;">E_USER</span><span style="color: #0000FF;">]</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">try</span> |
|||
elsif length(cl)=3 then |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
interpret(cl[3]) |
|||
<span style="color: #008080;">elsif</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cl</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">3</span> <span style="color: #008080;">then</span> |
|||
else |
|||
<span style="color: #000000;">interpret</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cl</span><span style="color: #0000FF;">[</span><span style="color: #000000;">3</span><span style="color: #0000FF;">])</span> |
|||
crash("usage: CopyPasta filename") |
|||
<span style="color: #008080;">else</span> |
|||
end if |
|||
<span style="color: #7060A8;">crash</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"usage: CopyPasta filename"</span><span style="color: #0000FF;">)</span> |
|||
end procedure |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
main()</lang> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
<span style="color: #000000;">main</span><span style="color: #0000FF;">()</span> |
|||
<!--</lang>--> |
|||
{{out}} |
{{out}} |
||
<pre> |
<pre> |