Skip to content

Commit

Permalink
Let escript recognize an encoding comment on the second line
Browse files Browse the repository at this point in the history
The manual says that an Emacs directive can be placed on the second
line. With this patch that directive is also recognized when selecting
encoding of the script.
  • Loading branch information
uabboli committed Mar 19, 2013
1 parent 395e587 commit f247d24
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 4 deletions.
11 changes: 9 additions & 2 deletions erts/doc/src/escript.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<comref>
<header>
<copyright>
<year>2007</year><year>2011</year>
<year>2007</year><year>2013</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
Expand Down Expand Up @@ -85,6 +85,11 @@ $ <input>escript factorial 5</input> </pre>
enter the major mode for editing Erlang source files. If the
directive is present it must be located on the second
line.</p>

<p>If there is a comment selecting the <seealso
marker="stdlib:epp#encoding">encoding</seealso> it can be
located on the second line.</p>

<p>On the third line (or second line depending on the presence
of the Emacs directive), it is possible to give arguments to
the emulator, such as </p>
Expand Down Expand Up @@ -133,7 +138,9 @@ halt(1).</pre>
<pre>
-include_lib("kernel/include/file.hrl").</pre>
<p>to include the record definitions for the records used by the
<c>file:read_link_info/1</c> function.</p>
<c>file:read_link_info/1</c> function. You can also select
encoding here, but if there is a valid encoding comment on
the second line it takes precedence.</p>

<p>The script will be checked for syntactic and semantic
correctness before being run. If there are warnings (such as
Expand Down
8 changes: 7 additions & 1 deletion lib/stdlib/src/escript.erl
Original file line number Diff line number Diff line change
Expand Up @@ -602,9 +602,15 @@ parse_beam(S, File, HeaderSz, CheckOnly) ->
parse_source(S, File, Fd, StartLine, HeaderSz, CheckOnly) ->
{PreDefMacros, Module} = pre_def_macros(File),
IncludePath = [],
{ok, _} = file:position(Fd, {bof, HeaderSz}),
%% Read the encoding on the second line, if there is any:
{ok, _} = file:position(Fd, 0),
_ = io:get_line(Fd, ''),
Encoding = epp:set_encoding(Fd),
{ok, _} = file:position(Fd, HeaderSz),
case epp:open(File, Fd, StartLine, IncludePath, PreDefMacros) of
{ok, Epp} ->
_ = [io:setopts(Fd, [{encoding,Encoding}]) ||
Encoding =/= none],
{ok, FileForm} = epp:parse_erl_form(Epp),
OptModRes = epp:parse_erl_form(Epp),
S2 = S#state{source = text, module = Module},
Expand Down
3 changes: 3 additions & 0 deletions lib/stdlib/test/escript_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -919,6 +919,9 @@ unicode(Config) when is_list(Config) ->
" an arithmetic expression\n in operator '/'/2\n "
"called as <<\"\xaa\">> / <<\"\xaa\">>\nExitCode:127">>]),
run(Dir, "unicode3", [<<"ExitCode:0">>]),
run(Dir, "unicode4", [<<"ExitCode:0">>]),
run(Dir, "unicode5", [<<"ExitCode:0">>]),
run(Dir, "unicode6", [<<"ExitCode:0">>]),
ok.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Expand Down
2 changes: 1 addition & 1 deletion lib/stdlib/test/escript_SUITE_data/unicode3
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env escript
%% -*- erlang; coding: utf-8 -*-
%% -*- erlang; coding: latin-1 -*-

-export([main/1]).

Expand Down
12 changes: 12 additions & 0 deletions lib/stdlib/test/escript_SUITE_data/unicode4
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/usr/bin/env escript
%% -*- erlang; encoding:utf-8 -*-

-export([main/1]).

main(_) ->
ok = io:setopts([{encoding,unicode}]),
Bin1 = <<"örn_Ѐ שלום-שלום+של 日本語">>,
L = [246,114,110,95,1024,32,1513,1500,1493,1501,45,1513,1500,1493,
1501,43,1513,1500,32,26085,26412,35486],
L = unicode:characters_to_list(Bin1, utf8),
ok.
12 changes: 12 additions & 0 deletions lib/stdlib/test/escript_SUITE_data/unicode5
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/usr/bin/env escript
%% -*- erlang -*-
-export([main/1]).
%% -*- encoding:latin-1 -*-

main(_) ->
ok = io:setopts([{encoding,unicode}]),
Bin1 = <<"örn_Ѐ שלום-שלום+של 日本語">>,
L = [246,114,110,95,1024,32,1513,1500,1493,1501,45,1513,1500,1493,
1501,43,1513,1500,32,26085,26412,35486],
L = unicode:characters_to_list(Bin1, utf8),
ok.
13 changes: 13 additions & 0 deletions lib/stdlib/test/escript_SUITE_data/unicode6
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#!/usr/bin/env escript
%% -*- erlang -*-
%%! +pc unicode
-export([main/1]).
%% -*- encoding:utf-8 -*-

main(_) ->
ok = io:setopts([{encoding,unicode}]),
Bin1 = <<"örn_Ѐ שלום-שלום+של 日本語">>,
L = [246,114,110,95,1024,32,1513,1500,1493,1501,45,1513,1500,1493,
1501,43,1513,1500,32,26085,26412,35486],
L = unicode:characters_to_list(Bin1, utf8),
ok.

0 comments on commit f247d24

Please sign in to comment.