crun 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +3 -0
- data/LICENSE +20 -0
- data/README.rdoc +183 -0
- data/bin/crun +225 -0
- data/doc/Array.html +202 -0
- data/doc/Crun.html +186 -0
- data/doc/CrunMod.html +186 -0
- data/doc/_index.html +115 -0
- data/doc/class_list.html +58 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +57 -0
- data/doc/css/style.css +339 -0
- data/doc/file.CHANGELOG.html +79 -0
- data/doc/file.README.html +260 -0
- data/doc/file_list.html +63 -0
- data/doc/frames.html +26 -0
- data/doc/index.html +260 -0
- data/doc/js/app.js +219 -0
- data/doc/js/full_list.js +181 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +75 -0
- data/doc/top-level-namespace.html +282 -0
- data/examples/crun_conf.rb +2 -0
- data/examples/greeting.c +47 -0
- data/examples/hello.c +6 -0
- data/examples/sizeof.c +9 -0
- data/lib/version.rb +6 -0
- metadata +102 -0
data/CHANGELOG.rdoc
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2016 tero.isannainen@gmail.com
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
= Crun
|
2
|
+
|
3
|
+
* Introduction
|
4
|
+
* Example runs
|
5
|
+
* Options
|
6
|
+
* Issues
|
7
|
+
|
8
|
+
|
9
|
+
= Introduction
|
10
|
+
|
11
|
+
Crun is an utility for compiling and running C-programs straight from
|
12
|
+
C source files. Crun supports compile-run and compile-debug flows.
|
13
|
+
|
14
|
+
You can embed custom compile options into the main c-file, if you
|
15
|
+
need, for example, an external library for the program. You can also
|
16
|
+
control the command line parameters passed to the program through
|
17
|
+
Crun.
|
18
|
+
|
19
|
+
Crun is usually used with one c-file, i.e. the main file. However
|
20
|
+
program can be split into multiple files, but main has to be first in
|
21
|
+
the list of files. Crun is targeted for small C-programs, so it is not
|
22
|
+
typical to have multiple files.
|
23
|
+
|
24
|
+
User of Crun is most probably trying out some basic C-features or maybe
|
25
|
+
prototyping with some algorithm.
|
26
|
+
|
27
|
+
|
28
|
+
= Example runs
|
29
|
+
|
30
|
+
In order to run "Hello World" example with Crun, you need to have the
|
31
|
+
C source file with "Hello World" program in it. This is available in
|
32
|
+
the "examples" directory for you.
|
33
|
+
|
34
|
+
"hello.c" content:
|
35
|
+
|
36
|
+
#include <stdio.h>
|
37
|
+
int main( int argc, char** argv )
|
38
|
+
{
|
39
|
+
printf( "Hello World!\n" );
|
40
|
+
return 0;
|
41
|
+
}
|
42
|
+
|
43
|
+
You can execute compile-run flow by:
|
44
|
+
|
45
|
+
shell> crun -f examples/hello.c
|
46
|
+
|
47
|
+
The output from program is:
|
48
|
+
|
49
|
+
Hello World!
|
50
|
+
|
51
|
+
You can execute compile-debug flow by:
|
52
|
+
|
53
|
+
shell> crun -f examples/hello.c -d
|
54
|
+
|
55
|
+
Program is compiled and gdb is started so that the program stops at
|
56
|
+
"main" (i.e. default behavior).
|
57
|
+
|
58
|
+
Check available command line interface, CLI, options for Crun:
|
59
|
+
|
60
|
+
shell> crun -h
|
61
|
+
|
62
|
+
|
63
|
+
= Options
|
64
|
+
|
65
|
+
You can specify options for Crun in multiple ways. Typically CLI is
|
66
|
+
used to control Crun, but if the program uses static compilation
|
67
|
+
options, those live most naturally in the source file itself.
|
68
|
+
|
69
|
+
Options are stored to a hash called "@crun". Each option name is a key
|
70
|
+
in the hash, and the option values are Arrays.
|
71
|
+
|
72
|
+
For example the entry:
|
73
|
+
|
74
|
+
@crun['progopts']
|
75
|
+
|
76
|
+
specify the command line parameters given to the program compiled and
|
77
|
+
run by Crun.
|
78
|
+
|
79
|
+
Here is the complete list of options that control Crun:
|
80
|
+
|
81
|
+
[ compopts ]
|
82
|
+
|
83
|
+
Array of user's compilation options. E.g. "-l lm" to include the
|
84
|
+
math lib. Default is: [].
|
85
|
+
|
86
|
+
[ progopts ]
|
87
|
+
|
88
|
+
Array of command line parameters for the program run. E.g. ["-c
|
89
|
+
12"]. Default is: [].
|
90
|
+
|
91
|
+
[ stopopts ]
|
92
|
+
|
93
|
+
Array of breakpoints for the debugger. E.g. ["add"] defines that the
|
94
|
+
debugger stops at "add" function. Default is: ["main"].
|
95
|
+
|
96
|
+
[ compprog ]
|
97
|
+
|
98
|
+
Array including the compiler name and base options. This options
|
99
|
+
array should only have one entry, but in theory you could have
|
100
|
+
multiple entries. The entries are concatenated with SPACE. The
|
101
|
+
compiler command has to have same command line parameters as
|
102
|
+
"gcc". Default is: ["gcc", "-Wall", "-std=c11"].
|
103
|
+
|
104
|
+
[ dbugprog ]
|
105
|
+
|
106
|
+
Array including the debugger name and base options. This options
|
107
|
+
array should only have one entry, but in theory you could have
|
108
|
+
multiple entries. The entries are concatenated with SPACE. The
|
109
|
+
debugger command has to have same command line parameters as
|
110
|
+
"gdb". Default is: ["gdb", "--nx"].
|
111
|
+
|
112
|
+
[ crunopts ]
|
113
|
+
|
114
|
+
Array of compiler options managed by Crun. User don't have to
|
115
|
+
control this option. Default is: [].
|
116
|
+
|
117
|
+
Crun sets Options to default values and then applies the user
|
118
|
+
overrides from various sources, given below.
|
119
|
+
|
120
|
+
User can embed the options to the C source file. This is the
|
121
|
+
recommended way because this way the settings will follow the code.
|
122
|
+
Additional compilation options and CLI options for the compiled
|
123
|
+
program would be given as:
|
124
|
+
|
125
|
+
/*
|
126
|
+
* Options for crun:
|
127
|
+
* -crun-compopts:=-O2
|
128
|
+
* crun-compopts:+-lm
|
129
|
+
* crun-progopts:=-c 12
|
130
|
+
*/
|
131
|
+
|
132
|
+
The syntax is "crun-<option>". If there is no space before "crun", the
|
133
|
+
setting is not used, i.e. first "compopts" is neglected above.
|
134
|
+
|
135
|
+
User can specify static overrides in "$HOME/.crun" file and/or in
|
136
|
+
"./.crun". In addition to these predefined files, user can use the
|
137
|
+
"-c" Crun CLI option to read in option overrides.
|
138
|
+
|
139
|
+
For example if the program is always run with "-c 10" command line
|
140
|
+
options, you use this in ".crun":
|
141
|
+
|
142
|
+
@crun['progopts'] = [ "-c 10" ]
|
143
|
+
|
144
|
+
An alternative way to achieve the same thing is to use Crun CLI and
|
145
|
+
use the -o option:
|
146
|
+
|
147
|
+
shell> crun -o "progopts:=-c 10" ...
|
148
|
+
|
149
|
+
This sets the list of program options to "-c 10". ":=" syntax means
|
150
|
+
setting the Array of options. If you need to add to existing list of
|
151
|
+
options, you should do:
|
152
|
+
|
153
|
+
shell> crun -o "progopts:+-c 10" ...
|
154
|
+
|
155
|
+
Thus ":+" is the syntax for appending more options to existing list.
|
156
|
+
|
157
|
+
The simplest way to pass 'progopts' to target program is using the
|
158
|
+
"-p" CLI option. However user must be aware of the shell option
|
159
|
+
parsing, since it is very easy to miss the target program and actually
|
160
|
+
pass the option to Crun.
|
161
|
+
|
162
|
+
If you want to pass '-' based option to target program:
|
163
|
+
|
164
|
+
shell> crun -p "\-c 10" ...
|
165
|
+
|
166
|
+
The backslash before "-c" will ensure that "-c" does not become an
|
167
|
+
option for Crun.
|
168
|
+
|
169
|
+
Summary of option setting from first to last:
|
170
|
+
|
171
|
+
* Defaults (from crun program).
|
172
|
+
* ".crun" from home directory.
|
173
|
+
* ".crun" from current directory.
|
174
|
+
* "-c" options from files.
|
175
|
+
* "-o" options from Crun CLI.
|
176
|
+
* "-p" options for program (only).
|
177
|
+
* Options embedded to C source file (main file).
|
178
|
+
|
179
|
+
|
180
|
+
= Issues
|
181
|
+
|
182
|
+
If you take C source input from STDIN, you can't use the debug
|
183
|
+
option. Only compile-run flow is possible.
|
data/bin/crun
ADDED
@@ -0,0 +1,225 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# crun compiles the given c-file and executes it using RAM FS. It can
|
4
|
+
# be considered as c-scripting. crun can dig out compilation options
|
5
|
+
# from the c-file if special linking or such is required.
|
6
|
+
#
|
7
|
+
# See README.rdoc for full documentation.
|
8
|
+
|
9
|
+
|
10
|
+
require 'como'
|
11
|
+
include Como
|
12
|
+
require 'tempfile'
|
13
|
+
require_relative '../lib/version'
|
14
|
+
|
15
|
+
Spec.command( 'crun', 'Tero Isannainen', '2016',
|
16
|
+
[
|
17
|
+
[ :opt_multi, 'file', '-f', "C-file(s) for program." ],
|
18
|
+
[ :opt_single, 'prog', '-p', "Add program options (i.e. progopts)." ],
|
19
|
+
[ :switch, 'debug', '-d', "Debug program." ],
|
20
|
+
[ :opt_multi, 'opts', '-o', "Set/add crun option." ],
|
21
|
+
[ :opt_multi, 'conf', '-c', "Crun option file(s)." ],
|
22
|
+
[ :switch, 'input', '-i', "Read stdin for C-code." ],
|
23
|
+
[ :exclusive, 'template','-t', "Output a template file for program." ],
|
24
|
+
[ :switch, 'verbose', '-v', "Verbose (to stderr)." ],
|
25
|
+
] )
|
26
|
+
|
27
|
+
|
28
|
+
# Execute shell command with optional verbosity.
|
29
|
+
def crun_exe( cmd )
|
30
|
+
if Opt['verbose'].given
|
31
|
+
STDERR.puts "crun execution: \"#{cmd}\" ..."
|
32
|
+
end
|
33
|
+
system( cmd )
|
34
|
+
end
|
35
|
+
|
36
|
+
# Parse and apply option setting.
|
37
|
+
def apply_opt( opt )
|
38
|
+
if opt.split(':=').length == 2
|
39
|
+
parts = opt.split(':=')
|
40
|
+
@crun[parts[0]] = [ parts[1] ]
|
41
|
+
elsif opt.split(':+').length == 2
|
42
|
+
parts = opt.split(':+')
|
43
|
+
@crun[parts[0]].push parts[1]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
if Opt['template'].given
|
48
|
+
puts "\
|
49
|
+
/*
|
50
|
+
* crun-compopts:+-O2
|
51
|
+
*/
|
52
|
+
|
53
|
+
#include <stdio.h>
|
54
|
+
|
55
|
+
int main( int argc, char** argv )
|
56
|
+
{
|
57
|
+
|
58
|
+
return 0;
|
59
|
+
}
|
60
|
+
"
|
61
|
+
exit( false )
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
if Opt['file'].given
|
66
|
+
cfiles = Opt['file'].value
|
67
|
+
elsif Opt['input'].given
|
68
|
+
# Create a temp c-file for input.
|
69
|
+
input = STDIN.read
|
70
|
+
cfile = "#{Tempfile.new( "crun-source", '/dev/shm' ).path}.c"
|
71
|
+
File.write( cfile, input )
|
72
|
+
cfiles = [ cfile ]
|
73
|
+
else
|
74
|
+
Spec.usage
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
# ------------------------------------------------------------
|
79
|
+
# Configurations:
|
80
|
+
|
81
|
+
# Default crun configuration.
|
82
|
+
@crun = {
|
83
|
+
|
84
|
+
# Users compiler options.
|
85
|
+
'compopts' => [],
|
86
|
+
|
87
|
+
# Program's command line options.
|
88
|
+
'progopts' => [],
|
89
|
+
|
90
|
+
# Debugger breakpoints.
|
91
|
+
'stopopts' => %w{main},
|
92
|
+
|
93
|
+
# Used compiler.
|
94
|
+
'compprog' => %w{gcc -Wall -std=c11},
|
95
|
+
|
96
|
+
# Used compiler.
|
97
|
+
'dbugprog' => %w{gdb --nx},
|
98
|
+
|
99
|
+
# Compiler options managed by crun.
|
100
|
+
'crunopts' => [],
|
101
|
+
}
|
102
|
+
|
103
|
+
|
104
|
+
# Read user conf.
|
105
|
+
userconf = "#{ENV['HOME']}/.crun"
|
106
|
+
load userconf if File.exist? userconf
|
107
|
+
|
108
|
+
# Read local user conf.
|
109
|
+
userconf = "./.crun"
|
110
|
+
load userconf if File.exist? userconf
|
111
|
+
|
112
|
+
|
113
|
+
# Compile with '-g' in debug mode.
|
114
|
+
if Opt['debug'].given
|
115
|
+
@crun['crunopts'].push '-g'
|
116
|
+
end
|
117
|
+
|
118
|
+
# Read in selected user confs.
|
119
|
+
if Opt['conf'].given
|
120
|
+
Opt['conf'].value.each do |userconf|
|
121
|
+
load userconf if File.exist? userconf
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
# ------------------------------------------------------------
|
127
|
+
# Collect compilation options from c-file.
|
128
|
+
compopts = @crun['compopts']
|
129
|
+
crun_re = /[\s]+crun-([a-z]+)/
|
130
|
+
|
131
|
+
File.readlines( cfiles[0] ).each do |line|
|
132
|
+
m = line.match( crun_re )
|
133
|
+
if m
|
134
|
+
option = m[1]
|
135
|
+
setting = line.chomp.split( 'crun-' )[1]
|
136
|
+
apply_opt( setting )
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
# ------------------------------------------------------------
|
142
|
+
# Collect compilation options from CLI.
|
143
|
+
|
144
|
+
# Get options from CLI.
|
145
|
+
if Opt['opts'].given
|
146
|
+
Opt['opts'].value.each do |opt|
|
147
|
+
apply_opt( opt )
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
# Get program execution options.
|
152
|
+
if Opt['prog'].given
|
153
|
+
@crun['progopts'].push Opt['prog'].value
|
154
|
+
end
|
155
|
+
|
156
|
+
|
157
|
+
# ------------------------------------------------------------
|
158
|
+
# Create tempfile for executable.
|
159
|
+
exefile = File.basename( cfiles[0], '.c' )
|
160
|
+
exepath = Tempfile.new( "crun-#{exefile}", '/dev/shm' ).path
|
161
|
+
|
162
|
+
|
163
|
+
# ------------------------------------------------------------
|
164
|
+
# Create list of commands to run:
|
165
|
+
cmds = []
|
166
|
+
|
167
|
+
class Array
|
168
|
+
# Join array elements with space.
|
169
|
+
def crun
|
170
|
+
self.join(' ')
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
cmds.push "#{@crun['compprog'].crun} #{@crun['crunopts'].crun} #{@crun['compopts'].crun} #{cfiles.crun} -o #{exepath}"
|
175
|
+
|
176
|
+
# In order to avoid the "text file busy" issue, copy back and forth the exefile.
|
177
|
+
cmds.push "cp #{exepath} #{exepath}-tmp"
|
178
|
+
cmds.push "rm -f #{exepath}"
|
179
|
+
cmds.push "mv #{exepath}-tmp #{exepath}"
|
180
|
+
|
181
|
+
if Opt['debug'].given
|
182
|
+
|
183
|
+
# compile-debug flow:
|
184
|
+
cmd = @crun['dbugprog'].crun
|
185
|
+
if @crun['progopts'].any?
|
186
|
+
cmd += " -ex \"set args #{@crun['progopts'].crun}\""
|
187
|
+
end
|
188
|
+
breaks = ""
|
189
|
+
if @crun['stopopts'].any?
|
190
|
+
breaks = @crun['stopopts'].map{|i| " -ex \"break #{i}\""}.crun
|
191
|
+
end
|
192
|
+
cmd += breaks
|
193
|
+
cmd += " -ex run"
|
194
|
+
cmd += " #{exepath}"
|
195
|
+
cmds.push cmd
|
196
|
+
|
197
|
+
else
|
198
|
+
|
199
|
+
# compile-run flow:
|
200
|
+
if @crun['progopts'].any?
|
201
|
+
cmds.push "#{exepath} #{@crun['progopts'].crun}"
|
202
|
+
else
|
203
|
+
cmds.push exepath
|
204
|
+
end
|
205
|
+
|
206
|
+
end
|
207
|
+
|
208
|
+
|
209
|
+
# ------------------------------------------------------------
|
210
|
+
# Execute collected commands:
|
211
|
+
ret = nil
|
212
|
+
cmds.each do |cmd|
|
213
|
+
ret = crun_exe( cmd )
|
214
|
+
if ret == false
|
215
|
+
break
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
# ------------------------------------------------------------
|
220
|
+
# Always cleanup, but not necessary if using "/dev/shm".
|
221
|
+
if Opt['input'].given
|
222
|
+
system( "rm -f #{cfiles[0]}" )
|
223
|
+
end
|
224
|
+
|
225
|
+
FileUtils.rm_f exepath
|
data/doc/Array.html
ADDED
@@ -0,0 +1,202 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
4
|
+
<head>
|
5
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
6
|
+
<title>
|
7
|
+
Class: Array
|
8
|
+
|
9
|
+
— Documentation by YARD 0.8.7.6
|
10
|
+
|
11
|
+
</title>
|
12
|
+
|
13
|
+
<link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
|
14
|
+
|
15
|
+
<link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
|
16
|
+
|
17
|
+
<script type="text/javascript" charset="utf-8">
|
18
|
+
hasFrames = window.top.frames.main ? true : false;
|
19
|
+
relpath = '';
|
20
|
+
framesUrl = "frames.html#!Array.html";
|
21
|
+
</script>
|
22
|
+
|
23
|
+
|
24
|
+
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
25
|
+
|
26
|
+
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
27
|
+
|
28
|
+
|
29
|
+
</head>
|
30
|
+
<body>
|
31
|
+
<div id="header">
|
32
|
+
<div id="menu">
|
33
|
+
|
34
|
+
<a href="_index.html">Index (A)</a> »
|
35
|
+
|
36
|
+
|
37
|
+
<span class="title">Array</span>
|
38
|
+
|
39
|
+
|
40
|
+
<div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
|
41
|
+
</div>
|
42
|
+
|
43
|
+
<div id="search">
|
44
|
+
|
45
|
+
<a class="full_list_link" id="class_list_link"
|
46
|
+
href="class_list.html">
|
47
|
+
Class List
|
48
|
+
</a>
|
49
|
+
|
50
|
+
<a class="full_list_link" id="method_list_link"
|
51
|
+
href="method_list.html">
|
52
|
+
Method List
|
53
|
+
</a>
|
54
|
+
|
55
|
+
<a class="full_list_link" id="file_list_link"
|
56
|
+
href="file_list.html">
|
57
|
+
File List
|
58
|
+
</a>
|
59
|
+
|
60
|
+
</div>
|
61
|
+
<div class="clear"></div>
|
62
|
+
</div>
|
63
|
+
|
64
|
+
<iframe id="search_frame"></iframe>
|
65
|
+
|
66
|
+
<div id="content"><h1>Class: Array
|
67
|
+
|
68
|
+
|
69
|
+
|
70
|
+
</h1>
|
71
|
+
|
72
|
+
<dl class="box">
|
73
|
+
|
74
|
+
<dt class="r1">Inherits:</dt>
|
75
|
+
<dd class="r1">
|
76
|
+
<span class="inheritName">Object</span>
|
77
|
+
|
78
|
+
<ul class="fullTree">
|
79
|
+
<li>Object</li>
|
80
|
+
|
81
|
+
<li class="next">Array</li>
|
82
|
+
|
83
|
+
</ul>
|
84
|
+
<a href="#" class="inheritanceTree">show all</a>
|
85
|
+
|
86
|
+
</dd>
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
<dt class="r2 last">Defined in:</dt>
|
97
|
+
<dd class="r2 last">bin/crun</dd>
|
98
|
+
|
99
|
+
</dl>
|
100
|
+
<div class="clear"></div>
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
<h2>
|
111
|
+
Instance Method Summary
|
112
|
+
<small>(<a href="#" class="summary_toggle">collapse</a>)</small>
|
113
|
+
</h2>
|
114
|
+
|
115
|
+
<ul class="summary">
|
116
|
+
|
117
|
+
<li class="public ">
|
118
|
+
<span class="summary_signature">
|
119
|
+
|
120
|
+
<a href="#crun-instance_method" title="#crun (instance method)">- (Object) <strong>crun</strong> </a>
|
121
|
+
|
122
|
+
|
123
|
+
|
124
|
+
</span>
|
125
|
+
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
|
134
|
+
<span class="summary_desc"><div class='inline'>
|
135
|
+
<p>Join array elements with space.</p>
|
136
|
+
</div></span>
|
137
|
+
|
138
|
+
</li>
|
139
|
+
|
140
|
+
|
141
|
+
</ul>
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
|
146
|
+
<div id="instance_method_details" class="method_details_list">
|
147
|
+
<h2>Instance Method Details</h2>
|
148
|
+
|
149
|
+
|
150
|
+
<div class="method_details first">
|
151
|
+
<h3 class="signature first" id="crun-instance_method">
|
152
|
+
|
153
|
+
- (<tt>Object</tt>) <strong>crun</strong>
|
154
|
+
|
155
|
+
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
</h3><div class="docstring">
|
160
|
+
<div class="discussion">
|
161
|
+
|
162
|
+
<p>Join array elements with space.</p>
|
163
|
+
|
164
|
+
|
165
|
+
</div>
|
166
|
+
</div>
|
167
|
+
<div class="tags">
|
168
|
+
|
169
|
+
|
170
|
+
</div><table class="source_code">
|
171
|
+
<tr>
|
172
|
+
<td>
|
173
|
+
<pre class="lines">
|
174
|
+
|
175
|
+
|
176
|
+
169
|
177
|
+
170
|
178
|
+
171</pre>
|
179
|
+
</td>
|
180
|
+
<td>
|
181
|
+
<pre class="code"><span class="info file"># File 'bin/crun', line 169</span>
|
182
|
+
|
183
|
+
<span class='kw'>def</span> <span class='id identifier rubyid_crun'>crun</span>
|
184
|
+
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'> </span><span class='tstring_end'>'</span></span><span class='rparen'>)</span>
|
185
|
+
<span class='kw'>end</span></pre>
|
186
|
+
</td>
|
187
|
+
</tr>
|
188
|
+
</table>
|
189
|
+
</div>
|
190
|
+
|
191
|
+
</div>
|
192
|
+
|
193
|
+
</div>
|
194
|
+
|
195
|
+
<div id="footer">
|
196
|
+
Generated on Sun Dec 25 20:31:45 2016 by
|
197
|
+
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
198
|
+
0.8.7.6 (ruby-2.3.1).
|
199
|
+
</div>
|
200
|
+
|
201
|
+
</body>
|
202
|
+
</html>
|